diff --git a/.cz.toml b/.cz.toml index cdd7a59..6ffe4ea 100644 --- a/.cz.toml +++ b/.cz.toml @@ -2,5 +2,5 @@ name = "cz_conventional_commits" tag_format = "v$version" version_scheme = "semver" -version = "2.0.0-rc.8" +version = "3.0.0-rc.1" update_changelog_on_bump = true diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..cacb1e1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,27 @@ +* text=auto +*.java text eol=lf +*.gradle text eol=lf +*.md text eol=lf +*.json text eol=lf +*.toml text eol=lf +*.yaml text eol=lf +*.yml text eol=lf +*.jar binary +*.zip binary + +# Keep release source archives self-contained and free of local artifacts. +*.zip export-ignore +build/** export-ignore +**/build/** export-ignore +.gradle/** export-ignore +**/.gradle/** export-ignore +__MACOSX/** export-ignore +**/__MACOSX/** export-ignore +._* export-ignore +**/._* export-ignore +.DS_Store export-ignore +**/.DS_Store export-ignore +*.jfr export-ignore +*.hprof export-ignore +hs_err_pid*.log export-ignore +replay_pid*.log export-ignore diff --git a/.github/scripts/prepare-rc-release.js b/.github/scripts/prepare-rc-release.js index 8bef1e2..38101ba 100644 --- a/.github/scripts/prepare-rc-release.js +++ b/.github/scripts/prepare-rc-release.js @@ -4,6 +4,7 @@ const { execFileSync } = require('node:child_process'); const fs = require('node:fs'); const CZ_TOML = '.cz.toml'; +const CANONICAL_EVIDENCE = 'docs/releases/3.0.0-rc.1-evidence.json'; const MAIN_REF = process.env.RC_BASE_REF || 'origin/main'; const VALID_BUMPS = new Set(['major', 'minor', 'patch']); @@ -20,7 +21,7 @@ function readVersion(content) { } function parseVersion(version) { - const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-rc\.\d+)?$/); + const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:-rc\.(\d+))?$/); if (!match) { throw new Error(`Unsupported version format: ${version}`); } @@ -28,6 +29,7 @@ function parseVersion(version) { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]), + rc: match[4] == null ? null : Number(match[4]), }; } @@ -98,24 +100,78 @@ function versionFromRef(ref) { return parseVersion(readVersion(content)); } -const currentContent = fs.readFileSync(CZ_TOML, 'utf8'); -const baseVersion = versionFromRef(MAIN_REF); -const messages = commitMessagesSince(MAIN_REF); -const bump = bumpFromMessages(messages); -const targetBase = formatVersion(increment(baseVersion, bump)); -const nextVersion = `${targetBase}-rc.${latestRc(targetBase) + 1}`; - -const nextContent = currentContent.replace( - /^version\s*=\s*"[^"]+"/m, - `version = "${nextVersion}"`, -); -fs.writeFileSync(CZ_TOML, nextContent); - -console.log(`Base ref: ${MAIN_REF}`); -console.log(`Base version: ${formatVersion(baseVersion)}`); -console.log(`Aggregate bump: ${bump}`); -console.log(`Next RC version: ${nextVersion}`); - -if (process.env.GITHUB_OUTPUT) { - fs.appendFileSync(process.env.GITHUB_OUTPUT, `version=${nextVersion}\n`); +function nextVersionForCurrentRc(currentVersion, latestTaggedRc) { + const parsed = parseVersion(currentVersion); + if (parsed.rc == null) { + throw new Error(`Version is not an RC: ${currentVersion}`); + } + const nextRc = Math.max(parsed.rc, latestTaggedRc + 1); + return `${formatVersion(parsed)}-rc.${nextRc}`; +} + +function evidenceRelease(content) { + const evidence = JSON.parse(content); + if (typeof evidence.release !== 'string' || evidence.release.length === 0) { + throw new Error(`Canonical evidence is missing a release: ${CANONICAL_EVIDENCE}`); + } + return evidence.release; +} + +function assertEvidenceRelease(preparedVersion, content) { + const canonicalRelease = evidenceRelease(content); + if (canonicalRelease !== preparedVersion) { + throw new Error( + `Prepared RC ${preparedVersion} does not match canonical evidence release ${canonicalRelease}`, + ); + } +} + +function prepareRcRelease() { + const currentContent = fs.readFileSync(CZ_TOML, 'utf8'); + const currentVersion = readVersion(currentContent); + const current = parseVersion(currentVersion); + let nextVersion; + + if (current.rc != null) { + const targetBase = formatVersion(current); + nextVersion = nextVersionForCurrentRc(currentVersion, latestRc(targetBase)); + console.log(`Current RC series: ${targetBase}`); + } else { + const baseVersion = versionFromRef(MAIN_REF); + const messages = commitMessagesSince(MAIN_REF); + const bump = bumpFromMessages(messages); + const targetBase = formatVersion(increment(baseVersion, bump)); + nextVersion = `${targetBase}-rc.${latestRc(targetBase) + 1}`; + console.log(`Base ref: ${MAIN_REF}`); + console.log(`Base version: ${formatVersion(baseVersion)}`); + console.log(`Aggregate bump: ${bump}`); + } + + assertEvidenceRelease( + nextVersion, + fs.readFileSync(CANONICAL_EVIDENCE, 'utf8'), + ); + + const nextContent = currentContent.replace( + /^version\s*=\s*"[^"]+"/m, + `version = "${nextVersion}"`, + ); + fs.writeFileSync(CZ_TOML, nextContent); + + console.log(`Next RC version: ${nextVersion}`); + + if (process.env.GITHUB_OUTPUT) { + fs.appendFileSync(process.env.GITHUB_OUTPUT, `version=${nextVersion}\n`); + } +} + +if (require.main === module) { + prepareRcRelease(); } + +module.exports = { + assertEvidenceRelease, + evidenceRelease, + nextVersionForCurrentRc, + parseVersion, +}; diff --git a/.github/scripts/prepare-rc-release.test.js b/.github/scripts/prepare-rc-release.test.js new file mode 100644 index 0000000..ffb372e --- /dev/null +++ b/.github/scripts/prepare-rc-release.test.js @@ -0,0 +1,55 @@ +const assert = require('node:assert/strict'); +const test = require('node:test'); + +const { + assertEvidenceRelease, + evidenceRelease, + nextVersionForCurrentRc, + parseVersion, +} = require('./prepare-rc-release.js'); + +test('parses stable and RC versions', () => { + assert.deepEqual(parseVersion('3.0.0'), { + major: 3, + minor: 0, + patch: 0, + rc: null, + }); + assert.deepEqual(parseVersion('3.0.0-rc.12'), { + major: 3, + minor: 0, + patch: 0, + rc: 12, + }); +}); + +test('keeps an intentional RC when its tag does not exist yet', () => { + assert.equal(nextVersionForCurrentRc('3.0.0-rc.1', 0), '3.0.0-rc.1'); +}); + +test('advances an RC after the current tag exists', () => { + assert.equal(nextVersionForCurrentRc('3.0.0-rc.1', 1), '3.0.0-rc.2'); + assert.equal(nextVersionForCurrentRc('3.0.0-rc.1', 8), '3.0.0-rc.9'); +}); + +test('reads the release bound by canonical evidence', () => { + assert.equal(evidenceRelease('{"release":"3.0.0-rc.1"}'), '3.0.0-rc.1'); + assert.throws( + () => evidenceRelease('{}'), + /Canonical evidence is missing a release/, + ); +}); + +test('rejects a prepared RC that differs from canonical evidence', () => { + assert.doesNotThrow(() => assertEvidenceRelease( + '3.0.0-rc.1', + '{"release":"3.0.0-rc.1"}', + )); + assert.throws( + () => assertEvidenceRelease( + '2.0.0-rc.9', + '{"release":"3.0.0-rc.1"}', + ), + /Prepared RC 2\.0\.0-rc\.9 does not match canonical evidence release 3\.0\.0-rc\.1/, + ); +}); diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 543f745..c4f46f2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,85 +4,80 @@ on: push: branches: - main - - 'cursor/*' - - 'feature/*' - - 'fix/*' - - 'hotfix/*' - - 'release/*' + - next + - 'feature/**' + - 'fix/**' + - 'hotfix/**' + - 'release/**' + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: coordination-build-${{ github.ref }} + cancel-in-progress: true jobs: - CoreJava8: + verify: + name: Java ${{ matrix.test-java }} runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + test-java: ['17', '21'] env: CI: true + defaults: + run: + working-directory: blue-coordination-java steps: - - uses: actions/checkout@v4 - - - name: Check out blue-quickjs + - name: Check out Coordination uses: actions/checkout@v4 with: - repository: bluecontract/blue-quickjs - path: blue-quickjs - submodules: recursive + path: blue-coordination-java + fetch-depth: 0 - - name: Set up Java 8 test runtime - uses: actions/setup-java@v3 - with: - java-version: '8' - distribution: 'corretto' - - - name: Set up JDK 25 - uses: actions/setup-java@v3 - with: - java-version: '25' - distribution: 'corretto' + - name: Configure Gradle user home + run: echo "GRADLE_USER_HOME=$RUNNER_TEMP/coordination-gradle-${{ matrix.test-java }}" >> "$GITHUB_ENV" - - name: Set up pnpm - uses: pnpm/action-setup@v4 + - name: Set up test JDK + uses: actions/setup-java@v4 with: - version: 9.8.0 - run_install: false + distribution: temurin + java-version: ${{ matrix.test-java }} - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version-file: 'blue-quickjs/.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'blue-quickjs/pnpm-lock.yaml' + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v4 - - name: Cache emsdk - uses: actions/cache@v4 + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 with: - path: blue-quickjs/tools/emsdk - key: emsdk-${{ runner.os }}-${{ hashFiles('blue-quickjs/tools/scripts/emsdk-version.txt') }} - - - name: Install blue-quickjs dependencies - run: pnpm install --frozen-lockfile - working-directory: blue-quickjs - - - name: Install emsdk - run: bash tools/scripts/setup-emsdk.sh - working-directory: blue-quickjs + cache-read-only: ${{ github.ref != 'refs/heads/main' }} - - name: Build blue-quickjs runtime - run: pnpm exec nx build quickjs-runtime - working-directory: blue-quickjs + - name: Verify release-version selection + run: node --test .github/scripts/prepare-rc-release.test.js - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Verify published dependency availability + run: >- + ./gradlew --no-daemon dependencyPreflight + -PblueDependencyMode=published-artifact - - name: Execute Java 8 core build - run: ./gradlew :clean :build -Dblue.quickjs.root="$GITHUB_WORKSPACE/blue-quickjs" + - name: Run clean RC verification + run: >- + ./gradlew --no-daemon clean releaseCheck + -PblueDependencyMode=published-artifact + -PtestJavaVersion=${{ matrix.test-java }} - - name: Archive test results + - name: Archive verification evidence uses: actions/upload-artifact@v4 if: always() with: - name: core-java8-test-results - path: build/reports - - - name: Archive libs - uses: actions/upload-artifact@v4 - with: - name: core-java8-libs - path: build/libs + name: coordination-java-${{ matrix.test-java }}-evidence + path: | + blue-coordination-java/build/libs/** + blue-coordination-java/build/publications/** + blue-coordination-java/build/reports/** + blue-coordination-java/build/test-results/** + blue-coordination-java/build/staging-deploy/** diff --git a/.github/workflows/release-rc.yml b/.github/workflows/release-rc.yml index ce24edb..d193afc 100644 --- a/.github/workflows/release-rc.yml +++ b/.github/workflows/release-rc.yml @@ -2,26 +2,22 @@ name: Release RC on: push: - branches: - - next - paths: - - '.cz.toml' - - 'build.gradle' - - 'settings.gradle' - - 'gradle.properties' - - 'gradle/wrapper/**' - - 'gradlew' - - 'gradlew.bat' - - 'src/**' - -env: - CI: true - GITHUB_TOKEN: ${{ secrets.WORKFLOW_PAT }} + branches: [next] + workflow_dispatch: + +permissions: + contents: write + +concurrency: + group: coordination-release-rc + cancel-in-progress: false jobs: - ReleaseRC: - if: "${{ startsWith(github.event.head_commit.message, 'chore: release ') == false }}" + release: + if: "${{ !startsWith(github.event.head_commit.message || '', 'chore: release ') }}" runs-on: ubuntu-latest + env: + CI: true steps: - name: Check out uses: actions/checkout@v4 @@ -29,66 +25,53 @@ jobs: fetch-depth: 0 token: ${{ secrets.WORKFLOW_PAT }} - - name: Fetch main and tags - run: git fetch origin main:refs/remotes/origin/main --tags + - name: Configure Gradle user home + run: echo "GRADLE_USER_HOME=$RUNNER_TEMP/coordination-release-gradle" >> "$GITHUB_ENV" - - name: Check out blue-quickjs - uses: actions/checkout@v4 - with: - repository: bluecontract/blue-quickjs - path: blue-quickjs - submodules: recursive - - - name: Set up Java 8 test runtime - uses: actions/setup-java@v3 - with: - java-version: '8' - distribution: 'corretto' - - - name: Set up JDK 25 - uses: actions/setup-java@v3 - with: - java-version: '25' - distribution: 'corretto' + - name: Fetch base and tags + run: git fetch origin main:refs/remotes/origin/main --tags - - name: Set up pnpm - uses: pnpm/action-setup@v4 + - name: Set up Java 17 + uses: actions/setup-java@v4 with: - version: 9.8.0 - run_install: false + distribution: temurin + java-version: '17' - - name: Set up Node + - name: Set up Node 22 uses: actions/setup-node@v4 with: - node-version-file: 'blue-quickjs/.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'blue-quickjs/pnpm-lock.yaml' - - - name: Cache emsdk - uses: actions/cache@v4 - with: - path: blue-quickjs/tools/emsdk - key: emsdk-${{ runner.os }}-${{ hashFiles('blue-quickjs/tools/scripts/emsdk-version.txt') }} - - - name: Install blue-quickjs dependencies - run: pnpm install --frozen-lockfile - working-directory: blue-quickjs - - - name: Install emsdk - run: bash tools/scripts/setup-emsdk.sh - working-directory: blue-quickjs + node-version: '22' - - name: Build blue-quickjs runtime - run: pnpm exec nx build quickjs-runtime - working-directory: blue-quickjs + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v4 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 - - name: Configure Git + - name: Require release credentials + shell: bash + env: + WORKFLOW_PAT: ${{ secrets.WORKFLOW_PAT }} + MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} + MAVENCENTRAL_PASSWORD: ${{ secrets.MAVENCENTRAL_PASSWORD }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} + GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} + run: | + set -euo pipefail + for name in WORKFLOW_PAT MAVENCENTRAL_USERNAME \ + MAVENCENTRAL_PASSWORD GPG_PASSPHRASE \ + GPG_PUBLIC_KEY GPG_SECRET_KEY; do + if [[ -z "${!name}" ]]; then + echo "::error::Required release secret ${name} is missing" + exit 1 + fi + done + + - name: Configure release identity run: | - git config --global user.email "github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git config user.name "github-actions[bot]" - name: Prepare RC version id: version @@ -96,17 +79,32 @@ jobs: - name: Commit and tag RC version run: | - git add .cz.toml - git commit -m "chore: release ${{ steps.version.outputs.version }}" + if ! git diff --quiet -- .cz.toml; then + git add .cz.toml + git commit -m "chore: release ${{ steps.version.outputs.version }}" + fi git tag -a "v${{ steps.version.outputs.version }}" -m "Release ${{ steps.version.outputs.version }}" - - name: Execute Gradle build - run: ./gradlew clean build -Dblue.quickjs.root="$GITHUB_WORKSPACE/blue-quickjs" + - name: Verify release ref permissions + run: >- + git push --dry-run origin HEAD:next + "v${{ steps.version.outputs.version }}" - - name: Execute Gradle publish - run: ./gradlew publish -Dblue.quickjs.root="$GITHUB_WORKSPACE/blue-quickjs" - - - name: Execute Gradle release + - name: Verify published dependency availability + run: | + set -euo pipefail + ./gradlew --no-daemon dependencyPreflight \ + -PblueDependencyMode=published-artifact + + - name: Build and stage from published dependencies + # RC-only policy: Gradle rejects this exception unless the declared + # canonical 3.0.0-rc.1 Round 13 evidence satisfies its exact guard. + run: >- + ./gradlew --no-daemon clean stageRelease + -PblueDependencyMode=published-artifact + -PallowRound13LatencyException=true + + - name: Publish to Maven Central env: JRELEASER_GITHUB_TOKEN: ${{ secrets.WORKFLOW_PAT }} JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} @@ -114,17 +112,25 @@ jobs: JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} - run: ./gradlew jreleaserFullRelease + JRELEASER_REPRODUCIBLE: true + run: >- + ./gradlew --no-daemon jreleaserDeploy + -PblueDependencyMode=published-artifact + -PallowRound13LatencyException=true - name: Push release commit and tag run: git push origin HEAD:next --follow-tags - - name: Archive artifacts + - name: Archive release evidence uses: actions/upload-artifact@v4 if: always() with: - name: rc-artifacts + name: coordination-rc-release path: | - build/libs - build/publications - build/jreleaser + build/libs/** + build/distributions/** + build/publications/** + build/reports/** + build/test-results/** + build/staging-deploy/** + build/jreleaser/** diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6fa2f78..90bc638 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,10 +1,17 @@ -name: Release +name: Release stable on: workflow_dispatch: +permissions: + contents: read + +concurrency: + group: coordination-release-stable + cancel-in-progress: false + jobs: - Release: + release: runs-on: ubuntu-latest env: CI: true @@ -13,75 +20,41 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 - token: ${{ secrets.WORKFLOW_PAT }} - - - name: Check if branch is main - run: | - if [[ "${GITHUB_REF##*/}" != "main" ]]; then - echo "This workflow can only be triggered for the main branch." - exit 1 - fi - - - name: Check out blue-quickjs - uses: actions/checkout@v4 - with: - repository: bluecontract/blue-quickjs - path: blue-quickjs - submodules: recursive - - - name: Set up Java 8 test runtime - uses: actions/setup-java@v3 - with: - java-version: '8' - distribution: 'corretto' - - - name: Set up JDK 25 - uses: actions/setup-java@v3 - with: - java-version: '25' - distribution: 'corretto' - - name: Set up pnpm - uses: pnpm/action-setup@v4 - with: - version: 9.8.0 - run_install: false + - name: Configure Gradle user home + run: echo "GRADLE_USER_HOME=$RUNNER_TEMP/coordination-release-gradle" >> "$GITHUB_ENV" - - name: Set up Node - uses: actions/setup-node@v4 - with: - node-version-file: 'blue-quickjs/.nvmrc' - cache: 'pnpm' - cache-dependency-path: 'blue-quickjs/pnpm-lock.yaml' + - name: Require main and a stable version + shell: bash + run: | + set -euo pipefail + test "$GITHUB_REF" = "refs/heads/main" + version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' .cz.toml)" + [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] - - name: Cache emsdk - uses: actions/cache@v4 + - name: Set up Java 17 + uses: actions/setup-java@v4 with: - path: blue-quickjs/tools/emsdk - key: emsdk-${{ runner.os }}-${{ hashFiles('blue-quickjs/tools/scripts/emsdk-version.txt') }} - - - name: Install blue-quickjs dependencies - run: pnpm install --frozen-lockfile - working-directory: blue-quickjs - - - name: Install emsdk - run: bash tools/scripts/setup-emsdk.sh - working-directory: blue-quickjs + distribution: temurin + java-version: '17' - - name: Build blue-quickjs runtime - run: pnpm exec nx build quickjs-runtime - working-directory: blue-quickjs + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v4 - - name: Setup Gradle - uses: gradle/gradle-build-action@v2 + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v4 - - name: Execute Gradle build - run: ./gradlew clean build -Dblue.quickjs.root="$GITHUB_WORKSPACE/blue-quickjs" + - name: Verify published dependency availability + run: >- + ./gradlew --no-daemon dependencyPreflight + -PblueDependencyMode=published-artifact - - name: Execute Gradle publish - run: ./gradlew publish -Dblue.quickjs.root="$GITHUB_WORKSPACE/blue-quickjs" + - name: Build and stage from published dependencies + run: >- + ./gradlew --no-daemon clean stageRelease + -PblueDependencyMode=published-artifact - - name: Execute Gradle release + - name: Publish to Maven Central env: JRELEASER_GITHUB_TOKEN: ${{ secrets.WORKFLOW_PAT }} JRELEASER_MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }} @@ -89,14 +62,21 @@ jobs: JRELEASER_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SECRET_KEY }} - run: ./gradlew jreleaserFullRelease + JRELEASER_REPRODUCIBLE: true + run: >- + ./gradlew --no-daemon jreleaserDeploy + -PblueDependencyMode=published-artifact - - name: Archive artifacts + - name: Archive release evidence uses: actions/upload-artifact@v4 if: always() with: - name: artifacts + name: coordination-stable-release path: | - build/libs - build/publications - build/jreleaser + build/libs/** + build/distributions/** + build/publications/** + build/reports/** + build/test-results/** + build/staging-deploy/** + build/jreleaser/** diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..53ca09f --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,66 @@ +# Changelog + +This project follows Semantic Versioning. Release candidates may still refine +the new 3.x API before the first stable 3.0.0 release. + +## 3.0.0-rc.1 - unreleased + +### Added + +- A compact Java 17 in-memory Coordination engine with a small immutable + application API. +- Exact whole-request and whole-Timeline-Entry admission. +- Environment-selected append/drain processing, immutable document snapshots + and revision history. +- Managed `Process Embedded.paths` and `collectionPaths`, historical catch-up, + shared-child convergence and nested synchronized barriers. +- Immutable bindings with separate occurrence cursors, exact processor-owned + child-epoch inputs, document-local commits, commit companions and idempotent + retry behavior. +- Explicit `FULL_HISTORY`, `FROM_FRONTIER`, and `FROM_NOW` top-level admission. +- Occurrence-specific embedded admission evidence with exact child epoch, + completeness proof, attachment identity, atomic consumption, and retry. +- READY-only application reads, explicit intermediate audit reads, and + deterministic paused/resumable PROCESS-work budgets. +- Phase timers and work counters separating Coordination host work from frozen + Language/Contracts/BEX execution. +- Library-owned unit, compact-engine integration, built-JAR consumer and + realistic scenario suites enforced by `releaseCheck`. +- Standalone `blue-basic` historical performance and metrics evidence, + explicitly isolated from release correctness. +- Causally exact initialization revisions whose ordered lifecycle events are + retained once and applied to every current or later containing document. +- Dynamic `Process Embedded.paths` and `collectionPaths` activation with + code-point-canonical occurrence order, nested settlement, and retry proofs. +- A reproducible extracted-source archive smoke that runs focused tests using + its own executable Gradle wrapper and authoritative `.cz.toml`. + +### Changed + +- Java 17 is now the minimum runtime and compilation baseline. +- The compact engine replaces the 2.x general planning/fragmentation engine. +- Only managed Process Embedded documents are cut; initial documents, requests, + Timeline Entries and ordinary nested values remain whole. +- The exact 3.0.0-rc.1 release policy permits explicit workflow publication as + `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION`. All non-performance gates remain + mandatory, and the exception is ineligible for stable release. + +### Known limitations + +- The retained Round 13 campaign failed append p95 (18.680667 ms versus the + 1.000000 ms hard limit) and Coordination-host p95 (872.356126 ms versus the + 250.000000 ms hard limit). The receipts remain unchanged and no latency pass + is claimed; performance remediation is required before stable. + +### Removed + +- The legacy engine, fast-path hierarchy, generic fragmentation APIs, + `basicTest` and `myOsDemoTest` source sets. +- Compatibility shims for the pre-3.x experimental API. + +### Release prerequisites + +The RC resolves `blue.repo:blue-repo-java:3.0.0-rc.21`, +`blue.bex:blue-bex-core:1.1.0-rc.3`, and +`blue.bex:blue-bex-contracts:1.1.0-rc.3` from Maven Central. Release automation +verifies the complete conflict-checked graph before building. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..72bf269 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,51 @@ +# Contributing + +Blue Coordination deliberately has one compact architecture. Changes should +strengthen that architecture instead of introducing another engine, planner, +fragmentation layer, scheduler or cache hierarchy. + +## Development baseline + +- Java 17 or newer; production bytecode is compiled with `--release 17`. +- Use the checked-in Gradle wrapper. +- Keep all dependency versions exact and commit lock-file changes. +- Do not edit the Language, Repository or BEX sibling projects as part of a + Coordination change. + +Run the focused gate while developing: + +```bash +./gradlew releaseCheck +``` + +The gate runs unit, integration, built-JAR consumer and end-to-end scenario +tests. It must remain independent of `../blue-basic`; that sibling exists only +for historical timing and percentile comparisons. When a change intentionally +affects performance, capture those optional metrics after publishing locally: + +```bash +./gradlew publishToMavenLocal +../blue-basic/gradlew -p ../blue-basic performanceTest runtimeCampaign +``` + +Before opening a pull request, follow +[build and test](docs/development/build-and-test.md), update relevant docs and +the changelog, and run `git diff --check`. + +## Design rules + +- Keep `blue.coordination.api` immutable and small. +- Never expose `blue.coordination.internal` in a public signature. +- Append never routes or processes; the sequential drain coordinator owns + canonical entry selection. +- One document transition is the atomic commit boundary. Do not add a + whole-engine rollback snapshot. +- Keep Process Embedded binding topology immutable and cursor progress separate. +- Unsupported semantics fail with a `CoordinationException` and stable error + code; never silently approximate them. +- Every semantic guarantee or fixed regression needs an executable test. +- Performance work must report frozen semantic and Coordination host time + separately. + +Commit messages should use Conventional Commits. Breaking changes must be +called out explicitly. diff --git a/README.md b/README.md index 2b8ad85..16a406f 100644 --- a/README.md +++ b/README.md @@ -1,322 +1,112 @@ # Blue Coordination Java -Java processors for executable Blue Coordination repository contracts. - -This library lets a Java application process Blue documents that declare -Coordination contracts in their `contracts` map: operations, sequential -workflows, update steps, compute steps, triggered events, composite channels, -embedded scopes, and checkpoints. - -The processor is deterministic. Given the same initialized document and the -same ordered input events, it produces the same canonical output document, -triggered events, gas accounting, and output BlueId. +Blue Coordination is a deterministic Java 17 runtime for managed Blue +documents. It keeps ordinary values whole, cuts only effective `Process +Embedded` document boundaries, stores each exact Timeline Entry once, and lets +the environment select canonical processing order across the resulting +document graph. ## Install -Gradle: - ```groovy -repositories { - mavenCentral() -} - dependencies { - implementation "blue.coordination:blue-coordination-java:2.0.0-rc.4" + implementation 'blue.coordination:blue-coordination-java:3.0.0-rc.1' } ``` -The project targets Java 8-compatible bytecode, builds with JDK 25, runs tests -on Java 8, and depends on: +The artifact is compiled with `--release 17`. Version 3 is a breaking API reset; +the removed 2.x planning, fragmentation, session-store, and fast-path APIs are +not shimmed. -```groovy -api "blue.language:blue-language-java:3.1.0-rc.18" -api "blue.repo:blue-repo-java:3.0.0-rc.10" -api "blue.bex:blue-bex-java:1.1.0-rc.2" -``` - -## Register Processors - -Most applications should register the Coordination processor set on a -repository-configured `Blue` instance: +## Counter quickstart ```java -import blue.coordination.processor.CoordinationProcessors; -import blue.language.Blue; -import blue.repo.BlueRepository; - -BlueRepository repository = BlueRepository.latest(); -Blue blue = repository.configure(new Blue()); - -CoordinationProcessors.registerWith(blue); -``` - -For direct `DocumentProcessor` construction: - -```java -import blue.coordination.processor.CoordinationProcessors; -import blue.language.processor.DocumentProcessor; - -DocumentProcessor processor = - CoordinationProcessors.configure(DocumentProcessor.builder()) - .build(); -``` - -`CoordinationProcessors` registers Timeline, Composite Timeline, and All -Timelines channel processors. Timeline providers remain responsible for feeding -authenticated, ordered Timeline Entries; the processors enforce the channel's -timeline and actor identity and strict timestamp-based checkpoint semantics. - -## Counter Document - -This is a complete executable Blue document. The contracts are the program: - -```yaml -name: Counter -counter: 0 -contracts: - ownerChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - timelineId: counter-demo - actor: - type: MyOS/MyOS Principal Actor - accountId: counter-demo - - increment: - type: Coordination/Sequential Workflow Operation - channel: ownerChannel - request: - type: Integer - steps: - - name: IncrementAndEmit - type: Coordination/Compute - do: - - $let: - name: nextCounter - expr: - $add: - - $document: /counter - - $binding: - name: event - path: /message/request - - $appendChange: - op: replace - path: /counter - val: - $var: nextCounter - - $appendEvent: - type: Coordination/Chat Message - message: - $concat: - - Counter is now - - " " - - $text: - $var: nextCounter - - $return: - changeset: - $changeset: true - events: - $events: true -``` - -An input event for that channel looks like this: - -```yaml -type: Coordination/Timeline Entry -timeline: - type: Coordination/Timeline - timelineId: counter-demo -timestamp: 1 -actor: - type: MyOS/MyOS Principal Actor - accountId: counter-demo -message: - type: Coordination/Operation Request - operation: increment - channel: ownerChannel - request: 5 -``` - -After processing, `/counter` is `5`, the workflow emits a chat message, and the -channel checkpoint records the delivered timeline entry so duplicates do not -run twice. - -The request's required `channel` is its effective same-scope handler channel. -The Timeline Channel that accepts the entry still owns source eligibility and -checkpointing; routing preserves the full Timeline Entry and does not evaluate -the target channel as another external source. This V2 repository behavior is -outside the current Blue Contracts 1.0 conformance surface. - -## Processing Model - -Input: - -1. one Blue document; -2. a delivered event, usually a timeline entry or a lifecycle/triggered event. - -Output: - -1. one canonical Blue document; -2. zero or more triggered events; -3. total gas usage; -4. processing metadata, including the output BlueId. - -Processors operate on canonical snapshots instead of process-local mutable -state. You can serialize a processed document, load it again, and continue -processing from the same resolved state. - -## Supported Contracts - -This library provides executable behavior for: - -- `Coordination/All Timelines Channel`; -- `Coordination/Composite Timeline Channel`; -- `Coordination/Chat Workflow Operation`; -- `Coordination/Sequential Workflow`; -- `Coordination/Sequential Workflow Operation`; -- `Coordination/Compute`; -- `Coordination/Update Document`; -- `Coordination/Trigger Event`. - -It also registers `Coordination/Operation` as a non-executable declaration -type for operation-shaped contracts. - -The underlying `blue-language-java` runtime provides base behavior used by -Coordination documents: - -- `Document Update Channel`; -- `Embedded Node Channel`; -- `Process Embedded`; -- `Channel Event Checkpoint`; -- `Lifecycle Event Channel`; -- `Triggered Event Channel`; -- initialized and terminated markers; -- scope boundaries, patch application, snapshots, gas, and checkpointing. - -## BEX In Workflows - -`Coordination/Compute` is the BEX execution surface. A Compute step applies a -returned `changeset` directly and emits returned `events` directly, so dynamic -patches and events do not need follow-up Update Document or Trigger Event -steps. - -Common workflow bindings: - -- `$binding` for `event`, the current `document`, and named step results; -- `$document` for the current document view; -- `$currentContract` for the active workflow contract; -- `$appendChange` and `$changeset` for accumulated patch operations; -- `$appendEvent` and `$events` for accumulated emitted events. - -`Coordination/Update Document` accepts literal patch lists only. -`Coordination/Trigger Event` accepts literal event payloads only. - -## Build And Test - -Gradle runs on JDK 25 and uses a Java 8 toolchain for tests. If Java 8 is not -installed locally, Gradle can provision it through the configured Foojay -toolchain resolver. - -Run tests: - -```bash -./gradlew test -``` - -Run the focused correctness and bounded-memory suites: - -```bash -./gradlew workflowPlanDifferentialTest -./gradlew complexFixtureIntegrationTest -./gradlew memoryIntegrationTest -``` - -Each focused task uses one worker capped at 2 GiB. Passing `-PtestJfr` -runs that focused task on the current modern Gradle JVM and records under -`build/reports/jfr/`; the normal `test` task continues to run on Java 8. - -Blue Language is pinned to the released -`blue.language:blue-language-java:3.1.0-rc.18` artifact from Maven Central. - -Build jars: - -```bash -./gradlew build -``` - -Publish locally: - -```bash -./gradlew publishToMavenLocal -``` - -Stage the artifact without writing outside this repository: - -```bash -./gradlew stageLocalMaven -``` - -The staged Maven repository is `build/staging-deploy`. - -Run JMH and generate JSON, CSV, Markdown, and environment metadata: - -```bash -./gradlew jmh -./gradlew jmh -PtestJfr +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.DocumentId; +import blue.coordination.api.Operation; + +try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + var alice = engine.registerTimeline("counter/alice", "alice"); + var bob = engine.registerTimeline("counter/bob", "bob"); + var counter = DocumentId.of("counter"); + + engine.startDocument(counter, counterYaml); + engine.append( + alice, Operation.yaml("increment", "aliceChannel", "amount: 3")); + engine.append( + bob, Operation.yaml("decrement", "bobChannel", "amount: 1")); + + var receipt = engine.drain(); + assert receipt.quiescent(); + + long value = ((java.math.BigInteger) engine.document(counter) + .valueAt("/counter").copyNode().getValue()).longValueExact(); + assert value == 2L; +} ``` -Reports are written to `build/reports/jmh`. Generic JMH gates are deliberately -reported as `NOT_CONFIGURED`; operation-level acceptance is exercised by the -focused integration and differential suites in this repository. +`Operation.exact(...)` and `CoordinationEngine.referenceRequest(...)` expose the +optimized whole-object request path without YAML reserialization. For a +provider-supplied exact Timeline Entry, use `appendTimelineEntry(Node)`; append +never names document recipients and never invokes PROCESS. `drain()` derives +targets from the active Channel index and processes canonical work to +quiescence. Latency-sensitive hosts can call `drain(new DrainBudget(...))` and +resume a paused receipt at deterministic PROCESS boundaries; this bounds work, +not the duration of one non-preemptible frozen call. `document(id)` is READY-only +by design, while `auditDocument(id)` explicitly exposes intermediate committed +state to operational tooling. -Create the reproducible source archive and SHA-256 sidecar: +## Build and verification ```bash -./gradlew sourceArchive -``` - -Artifacts are written to `build/distributions`. The verified performance and -correctness evidence is recorded in -[`docs/performance/complex-operations-coordination.md`](docs/performance/complex-operations-coordination.md). - -## Test Coverage - -Current test areas: - -- processor registration; -- must-understand failures; -- test timeline provider behavior; -- composite timeline routing; -- operation request matching; -- sequential workflow execution; -- compute and BEX execution; -- update document batch application; -- trigger-event execution; -- runtime channels; -- repository-style Counter documents; -- snapshot round-trip stress processing. - -## Project Layout - -```text -src/main/java/blue/coordination/processor - CoordinationProcessors.java - CoordinationProcessorOptions.java - CoordinationBexIntrinsics.java - AllTimelinesChannelProcessor.java - CompositeTimelineChannelProcessor.java - ChatWorkflowOperationProcessor.java - OperationProcessor.java - SequentialWorkflowProcessor.java - SequentialWorkflowOperationProcessor.java - TimelineProviderSupport.java - bex/ - merge/ - workflow/ +./gradlew clean test +./gradlew releaseCheck +./gradlew stageRelease ``` -## References - -- [Blue Language Specification](https://github.com/bluecontract/blue-spec) -- [blue-js open-source processor](https://github.com/bluecontract/blue-js) +Published Maven Central artifacts are the default dependency source. Local +composite substitution is available only as an explicit cross-repository +diagnostic mode; it is not used by the normal build or release path. + +`releaseCheck` owns the library's complete verification surface: unit tests, +compact-engine integration tests, tests compiled against the built JAR, and +realistic convergence scenarios. It does not read or execute `../blue-basic`. +That sibling is retained only as a historical performance/metrics laboratory. + +Start with [START-HERE.md](START-HERE.md), then see the compact architecture, +managed `Process Embedded` semantics, catch-up rules, performance +interpretation, and limitations under `docs/`. + +## Release-candidate status + +The source targets `3.0.0-rc.1` with the Round 10.1 Process Embedded temporal +profile, the Round 11 readiness closure, and Round 12 initialization lifecycle +and dynamic-activation proofs. Release status is split +into temporal architecture, in-memory engine, provider, Mandate, latency, and +public-RC evidence. The generic Timeline Entry's missing universal literal +`documentId` is an optional profile capability; exact provider-backed Mandate +eligibility remains outside this in-memory profile. The exact 3.0.0-rc.1 release +policy permits workflow publication with +`PASS_WITH_KNOWN_PERFORMANCE_LIMITATION`: the retained Round 13 campaign failed +append and Coordination-host hard p95 gates, and no latency pass is claimed. +The exception requires explicit workflow opt-in, cannot apply to a stable +release, and preserves every Java, correctness, structural, consumer, artifact, +source-archive, published-dependency, metadata, checksum, and signature gate. +See the [canonical RC report](docs/releases/3.0.0-rc.1-test-report.md), +[RC readiness note](docs/releases/3.0.0-rc.1.md), and +[release procedure](docs/development/releasing.md). + +Developer references: + +- [Build and test](docs/development/build-and-test.md) +- [Test strategy](docs/development/test-strategy.md) +- [Initialization causality](docs/semantics/initialization-causality.md) +- [Shared NBA Game lifecycle](docs/examples/nba-shared-game-lifecycle.md) +- [Five-occurrence Playground API example](docs/examples/playground-five-occurrence.md) +- [Canonical RC evidence report](docs/releases/3.0.0-rc.1-test-report.md) +- [Public API](docs/reference/public-api.md) +- [Metrics](docs/reference/metrics.md) +- [Failure and retry model](docs/operations/failure-model.md) +- [Contributing](CONTRIBUTING.md) +- [Security policy](SECURITY.md) +- [Changelog](CHANGELOG.md) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..6993015 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,25 @@ +# Security policy + +## Supported versions + +Security fixes are currently prepared for the latest 3.x release candidate. +The removed 2.x experimental engine is not supported. + +## Reporting a vulnerability + +Do not open a public issue for a suspected vulnerability. Email +`devsupport@timeline.blue` with the affected version, impact, reproduction and +any suggested mitigation. Expect acknowledgement within three business days. + +## Security boundary + +This release is an in-memory, single-process coordination library. It does not +authenticate actors, persist timelines, encrypt application data, provide +distributed consensus or create a durable audit log. The host application is +responsible for authenticated Timeline admission, authorization, persistence, +transport security, secret handling and resource isolation. + +Exact BlueId validation protects semantic identity; it is not an authorization +mechanism. Apply input-size and execution limits before accepting untrusted +documents. Treat failure details and metrics as operational data that may reveal +document topology. diff --git a/START-HERE.md b/START-HERE.md new file mode 100644 index 0000000..942ab76 --- /dev/null +++ b/START-HERE.md @@ -0,0 +1,48 @@ +# Start here + +1. Use Java 17 or newer. +2. Depend on `blue.coordination:blue-coordination-java:3.0.0-rc.1`. +3. Create an in-memory `CoordinationEngine` in a try-with-resources block. +4. Register each Timeline with its exact Timeline and actor identities. +5. Admit each managed document with a stable `DocumentId`, authored initial + YAML, and—when historical data exists—an explicit top-level admission policy. +6. Append exact Timeline Entries without recipients, then call `drain()` or + `drainThrough(cutoff)`. The environment, not the caller, selects canonical + processing order and direct targets. +7. Use `drain(DrainBudget)` when a host must pause after a deterministic amount + of PROCESS work; resume with another drain call. +8. Read coherent application state with READY-only `document(id)`. Reserve + `auditDocument(id)` for explicit recovery/diagnostic inspection, and never + retain mutable internal nodes. + +The runtime is deliberately single-process and sequential. Each document +transition atomically commits its exact state, epoch, events, graph and +subscription deltas, progress cursor, receipt, and commit companion. A child +commit can therefore survive a later parent failure; retry resumes the missing +parent application instead of reprocessing the child. The bundled host is +in-memory, so process-restart durability and provider-backed completeness remain +explicit release gates rather than implied guarantees. + +The work budget does not preempt one frozen PROCESS invocation or epoch-zero +INITIALIZE, so it is not a wall-clock timeout. Public phase metrics and the +standalone performance campaign separate Coordination scheduling from frozen +Language/Contracts/BEX time. + +Read next: + +- [Compact engine](docs/architecture/compact-engine.md) +- [Process Embedded documents](docs/semantics/process-embedded-documents.md) +- [Historical catch-up](docs/semantics/historical-catch-up.md) +- [Identity and revisions](docs/semantics/identity-and-revisions.md) +- [Initialization causality](docs/semantics/initialization-causality.md) +- [Shared NBA Game lifecycle](docs/examples/nba-shared-game-lifecycle.md) +- [Host vs frozen time](docs/performance/host-vs-frozen-time.md) +- [Known limitations](docs/limitations.md) +- [Migration from 2.x](docs/migration-from-2.x.md) +- [Public API reference](docs/reference/public-api.md) +- [Metrics reference](docs/reference/metrics.md) +- [Failure and retry model](docs/operations/failure-model.md) +- [Build and test](docs/development/build-and-test.md) +- [Test strategy](docs/development/test-strategy.md) +- [Release process](docs/development/releasing.md) +- [3.0.0-rc.1 readiness](docs/releases/3.0.0-rc.1.md) diff --git a/build.gradle b/build.gradle index ccad22f..936dde6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,745 +1,424 @@ -buildscript { - dependencies { - classpath 'org.apache.groovy:groovy-toml:4.0.22' - } -} - plugins { id 'java-library' + id 'java-test-fixtures' id 'maven-publish' id 'signing' - id 'org.jreleaser' version '1.24.0' - id 'me.champeau.jmh' version '0.7.3' + id 'org.jreleaser' version '1.25.0' } group = 'blue.coordination' -version = determineProjectVersion() +def versionMatches = file('.cz.toml').getText('UTF-8') =~ + /(?m)^version = "([^"]+)"$/ +if (!versionMatches.find()) { + throw new GradleException('Missing version in .cz.toml') +} +version = versionMatches.group(1) -def blueLanguageVersion = '3.1.0-rc.18' -def binaryCompatibilityBaselineVersion = providers.gradleProperty( - 'binaryCompatibilityBaselineVersion').getOrElse('2.0.0-rc.4') +def dependencyMode = providers.gradleProperty('blueDependencyMode') + .getOrElse('published-artifact') + .trim() +def localDependencies = dependencyMode == 'local-composite' +def publishedRepository = providers.gradleProperty( + 'bluePublishedRepository').orNull base { archivesName = 'blue-coordination-java' } repositories { - mavenCentral() - exclusiveContent { - forRepository { - ivy { - name = 'releasedCoordinationBaseline' - url = uri('https://repo1.maven.org/maven2') - patternLayout { - artifact 'blue/coordination/blue-coordination-java/[revision]/blue-coordination-java-[revision].[ext]' - } - metadataSources { - artifact() + if (!localDependencies && publishedRepository != null) { + exclusiveContent { + forRepository { + maven { + name = 'publishedBlueRepository' + url = uri(publishedRepository) + metadataSources { artifact() } } } - } - filter { - includeModule 'blue.coordination.baseline', 'blue-coordination-java' + filter { + includeModule 'blue.repo', 'blue-repo-java' + includeModule 'blue.bex', 'blue-bex-core' + includeModule 'blue.bex', 'blue-bex-contracts' + } } } + mavenCentral() } java { + toolchain { languageVersion = JavaLanguageVersion.of(17) } withSourcesJar() withJavadocJar() - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 +} + +sourceSets { + integrationTest + scenarioTest { + resources.setSrcDirs(['src/integrationTest/resources']) + } + consumerTest { + resources.setSrcDirs(['src/integrationTest/resources']) + } +} + +configurations { + integrationTestImplementation.extendsFrom testImplementation + integrationTestRuntimeOnly.extendsFrom testRuntimeOnly + scenarioTestImplementation.extendsFrom testImplementation + scenarioTestRuntimeOnly.extendsFrom testRuntimeOnly +} + +dependencyLocking { + lockAllConfigurations() + if (!localDependencies) { + lockFile = layout.projectDirectory.file( + 'gradle/published-artifact.lockfile') + } } tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' - options.release = 8 + options.release = 17 + options.compilerArgs.addAll([ + '-Xlint:all', + '-Xlint:-serial', + '-Xlint:-processing', + '-Werror' + ]) } -configurations { - binaryCompatibilityBaseline { - canBeConsumed = false - canBeResolved = true - transitive = false +tasks.withType(Javadoc).configureEach { + source = fileTree('src/main/java') { + include 'blue/coordination/api/**/*.java' + include 'blue/coordination/processor/**/*.java' } + options.encoding = 'UTF-8' + options.charSet = 'UTF-8' + options.docEncoding = 'UTF-8' + options.addBooleanOption('notimestamp', true) + options.addBooleanOption('Xdoclint:all,-missing', true) } -dependencies { - api "blue.language:blue-language-java:${blueLanguageVersion}" - api 'blue.repo:blue-repo-java:3.0.0-rc.10' - api 'blue.bex:blue-bex-java:1.1.0-rc.2' +tasks.withType(AbstractArchiveTask).configureEach { + preserveFileTimestamps = false + reproducibleFileOrder = true +} + +tasks.withType(Jar).configureEach { + includeEmptyDirs = false + from('LICENSE') { into 'META-INF' } +} - implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2' +dependencies { + api 'blue.language:blue-contracts-core:3.1.0-rc.20' + implementation 'blue.repo:blue-repo-java:3.0.0-rc.21' + api 'blue.bex:blue-bex-core:1.1.0-rc.3' + api 'blue.bex:blue-bex-contracts:1.1.0-rc.3' implementation 'org.bouncycastle:bcprov-jdk18on:1.78.1' - testImplementation platform('org.junit:junit-bom:5.10.2') + testImplementation platform('org.junit:junit-bom:5.14.1') testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - // Alias the released artifact so Gradle never substitutes the current root project. - binaryCompatibilityBaseline "blue.coordination.baseline:blue-coordination-java:${binaryCompatibilityBaselineVersion}" -} + integrationTestImplementation sourceSets.main.output + integrationTestImplementation sourceSets.testFixtures.output -compileTestJava { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} + scenarioTestImplementation sourceSets.main.output + scenarioTestImplementation sourceSets.testFixtures.output + scenarioTestImplementation sourceSets.integrationTest.output -test { - javaLauncher = javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(8) - } - useJUnitPlatform() - reports { - junitXml.required = false - html.required = true - } - testLogging { - events 'PASSED', 'FAILED', 'SKIPPED' - showStandardStreams = true - } + consumerTestImplementation files(tasks.named('jar')) + consumerTestImplementation 'blue.language:blue-contracts-core:3.1.0-rc.20' + consumerTestImplementation platform('org.junit:junit-bom:5.14.1') + consumerTestImplementation 'org.junit.jupiter:junit-jupiter' + consumerTestRuntimeOnly files(configurations.runtimeClasspath) + consumerTestRuntimeOnly 'org.junit.platform:junit-platform-launcher' } -def testJfrEnabled = providers.gradleProperty('testJfr') - .map { !'false'.equalsIgnoreCase(it == null ? '' : it.trim()) } - .getOrElse(false) +components.java.withVariantsFromConfiguration( + configurations.testFixturesApiElements) { skip() } +components.java.withVariantsFromConfiguration( + configurations.testFixturesRuntimeElements) { skip() } -def configureFocusedTest = { Test focusedTest, List includedTests -> - focusedTest.group = 'verification' - focusedTest.testClassesDirs = sourceSets.test.output.classesDirs - focusedTest.classpath = sourceSets.test.runtimeClasspath - focusedTest.dependsOn tasks.named('testClasses') - focusedTest.useJUnitPlatform() - focusedTest.maxHeapSize = '2g' - focusedTest.maxParallelForks = 1 - focusedTest.forkEvery = 0L - focusedTest.filter { - includedTests.each { includeTestsMatching(it) } +tasks.withType(Test).configureEach { + useJUnitPlatform() + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of( + providers.gradleProperty('testJavaVersion') + .getOrElse('17') as int) } - focusedTest.reports { + maxParallelForks = 1 + maxHeapSize = '2g' + reports { junitXml.required = true html.required = true } - focusedTest.testLogging { - events 'PASSED', 'FAILED', 'SKIPPED' - showStandardStreams = true - } - if (testJfrEnabled) { - def recording = layout.buildDirectory.file("reports/jfr/${focusedTest.name}.jfr").get().asFile - focusedTest.doFirst { - recording.parentFile.mkdirs() - if (recording.exists() && !recording.delete()) { - throw new GradleException("Could not replace JFR recording: ${recording}") - } - } - focusedTest.jvmArgs "-XX:StartFlightRecording=filename=${recording.absolutePath},settings=profile,dumponexit=true" - } else { - focusedTest.javaLauncher = javaToolchains.launcherFor { - languageVersion = JavaLanguageVersion.of(8) - } - } -} - -tasks.register('workflowPlanDifferentialTest', Test) { focusedTest -> - description = 'Runs sequential-workflow planning, execution-state, static-update, and semantic differential tests.' - configureFocusedTest(focusedTest, [ - 'blue.coordination.processor.CoordinationProcessorsTest', - 'blue.coordination.processor.SequentialWorkflowExecutionTest', - 'blue.coordination.processor.bex.BexProcessingMetricsTest', - 'blue.coordination.processor.compute.ComputeFrozenPatchHandoffIntegrationTest', - 'blue.coordination.processor.compute.ComputeProgramPlanIntegrationTest', - 'blue.coordination.processor.compute.ComputeWorkflowExecutionTest', - 'blue.coordination.processor.compute.UpdateDocumentBatchApplyIntegrationTest', - 'blue.coordination.processor.workflow.*DifferentialTest', - 'blue.coordination.processor.workflow.ComputeEffectPlanTest', - 'blue.coordination.processor.workflow.SequentialWorkflowRunnerLifecycleTest', - 'blue.coordination.processor.workflow.StaticUpdatePlanTest', - 'blue.coordination.processor.workflow.WorkflowExecutionStateTest', - 'blue.coordination.processor.workflow.WorkflowPatchEntryTest' - ]) } -tasks.register('complexFixtureIntegrationTest', Test) { focusedTest -> - description = 'Runs PayNote, embedded-document, mandate, and termination workflow fixtures.' - configureFocusedTest(focusedTest, [ - 'blue.coordination.processor.EmbeddedTerminationWorkflowTest', - 'blue.coordination.processor.compute.*Paynote*', - 'blue.coordination.processor.compute.*Embedded*', - 'blue.coordination.processor.compute.*Mandate*', - 'blue.coordination.processor.compute.*Termination*', - 'blue.coordination.processor.compute.TerminateProcessingWorkflowTest' - ]) +def registerVerificationSuite = { + String taskName, SourceSet suite, String taskDescription -> + tasks.register(taskName, Test) { + group = 'verification' + description = taskDescription + testClassesDirs = suite.output.classesDirs + classpath = suite.runtimeClasspath + dependsOn tasks.named(suite.classesTaskName) + shouldRunAfter tasks.named('test') + } } -tasks.register('memoryIntegrationTest', Test) { focusedTest -> - description = 'Runs bounded-cache, round-trip, stress, and memory-oriented workflow tests in one 2 GiB worker.' - configureFocusedTest(focusedTest, [ - 'blue.coordination.processor.*Stress*', - 'blue.coordination.processor.*Memory*', - 'blue.coordination.processor.compute.*RoundTrip*', - 'blue.coordination.processor.compute.*Memory*', - 'blue.coordination.processor.compute.RepresentativeWorkflowLifecycleSmokeTest', - 'blue.coordination.processor.workflow.*CacheTest' - ]) +def integrationTest = registerVerificationSuite( + 'integrationTest', sourceSets.integrationTest, + 'Runs the complete compact-engine correctness and atomicity suite.') +def consumerTest = registerVerificationSuite( + 'consumerTest', sourceSets.consumerTest, + 'Runs public-API scenarios compiled against the built JAR only.') +def scenarioTest = registerVerificationSuite( + 'scenarioTest', sourceSets.scenarioTest, + 'Runs realistic NBA and large-host/PayNote convergence scenarios.') +scenarioTest.configure { + shouldRunAfter integrationTest, consumerTest } -tasks.register('languageAdoptionMetricsArtifactTest', Test) { focusedTest -> - description = 'Runs four representative Language-adoption scenarios and writes deterministic JSON/CSV metrics evidence.' - configureFocusedTest(focusedTest, [ - 'blue.coordination.processor.compute.LanguageAdoptionMetricsArtifactTest' - ]) - outputs.files( - layout.buildDirectory.file('reports/language-adoption/scenario-metrics.json'), - layout.buildDirectory.file('reports/language-adoption/scenario-metrics.csv')) -} - -// Minimal class-file reader used by the verification tasks below. Keeping this -// in the build avoids adding a release plugin solely for two deterministic -// checks, and compares JVM descriptors rather than source formatting. -def parseBinaryApiClass = { byte[] bytecode -> - def input = new DataInputStream(new ByteArrayInputStream(bytecode)) - if (input.readInt() != (0xCAFEBABE as int)) { - throw new GradleException('Invalid class-file magic') - } - int minorVersion = input.readUnsignedShort() - int majorVersion = input.readUnsignedShort() - int constantPoolCount = input.readUnsignedShort() - Object[] constantPool = new Object[constantPoolCount] - for (int index = 1; index < constantPoolCount; index++) { - int tag = input.readUnsignedByte() - if (tag == 1) { - constantPool[index] = input.readUTF() - } else if (tag == 3 || tag == 4) { - input.readInt() - } else if (tag == 5 || tag == 6) { - input.readLong() - index++ - } else if (tag == 7) { - constantPool[index] = Integer.valueOf(input.readUnsignedShort()) - } else if (tag == 8 || tag == 16 || tag == 19 || tag == 20) { - input.readUnsignedShort() - } else if (tag == 9 || tag == 10 || tag == 11 || tag == 12 - || tag == 17 || tag == 18) { - input.readUnsignedShort() - input.readUnsignedShort() - } else if (tag == 15) { - input.readUnsignedByte() - input.readUnsignedShort() - } else { - throw new GradleException("Unsupported constant-pool tag ${tag}") - } +def playgroundSmokeTest = tasks.register('playgroundSmokeTest', Test) { + group = 'verification' + description = 'Runs the fast Counter, whole-request, embedded, and five-occurrence Playground smoke lane.' + testClassesDirs = files( + sourceSets.integrationTest.output.classesDirs, + sourceSets.scenarioTest.output.classesDirs) + classpath = sourceSets.scenarioTest.runtimeClasspath + dependsOn tasks.named(sourceSets.integrationTest.classesTaskName), + tasks.named(sourceSets.scenarioTest.classesTaskName) + filter { + includeTestsMatching( + 'blue.coordination.integration.CoreBehaviorIntegrationTest.counterRoutesAliceAndBobExactlyOnceWithoutGenericSplitting') + includeTestsMatching( + 'blue.coordination.integration.CoreBehaviorIntegrationTest.ordinaryPayNoteIsOneWholeInlineValue') + includeTestsMatching( + 'blue.coordination.integration.ProcessEmbeddedCollectionPathsIntegrationTest.discoversAddsAndRemovesCanonicalMapMembersWithoutOrdinarySplitting') + includeTestsMatching( + 'blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest.fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents') } +} - def utf8 = { int index -> - Object value = constantPool[index] - if (!(value instanceof String)) { - throw new GradleException("Invalid UTF-8 constant-pool index ${index}") - } - (String) value - } - def className = { int index -> - if (index == 0) { - return null - } - Object nameIndex = constantPool[index] - if (!(nameIndex instanceof Integer)) { - throw new GradleException("Invalid class constant-pool index ${index}") - } - utf8(((Integer) nameIndex).intValue()).replace('/', '.') +def round13SourceArchiveUnitTest = tasks.register( + 'round13SourceArchiveUnitTest', Test) { + group = 'verification' + description = 'Runs the four focused Round 13 source-archive unit proofs.' + testClassesDirs = sourceSets.test.output.classesDirs + classpath = sourceSets.test.runtimeClasspath + dependsOn tasks.named(sourceSets.test.classesTaskName) + filter { + includeTestsMatching( + 'blue.coordination.api.DocumentRevisionInitializationCausalityTest') + includeTestsMatching( + 'blue.coordination.internal.DocumentAdmissionCauseTest') + includeTestsMatching( + 'blue.coordination.internal.EmbeddedEpochInputInitializationCausalityTest') + includeTestsMatching( + 'blue.coordination.internal.EmbeddingBindingCanonicalOrderTest') } - def skipAttributes = { DataInputStream stream -> - int attributeCount = stream.readUnsignedShort() - for (int attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++) { - stream.readUnsignedShort() - long remaining = ((long) stream.readInt()) & 0xffffffffL - while (remaining > 0L) { - long skipped = stream.skip(remaining) - if (skipped <= 0L) { - if (stream.read() < 0) { - throw new EOFException('Truncated class-file attribute') - } - skipped = 1L - } - remaining -= skipped - } - } - } - def readMembers = { DataInputStream stream -> - def members = new TreeMap() - int memberCount = stream.readUnsignedShort() - for (int memberIndex = 0; memberIndex < memberCount; memberIndex++) { - int access = stream.readUnsignedShort() - String name = utf8(stream.readUnsignedShort()) - String descriptor = utf8(stream.readUnsignedShort()) - skipAttributes(stream) - if ((access & (0x0001 | 0x0004)) != 0 && name != '') { - members.put(name + descriptor, Integer.valueOf(access)) - } - } - members - } - - int access = input.readUnsignedShort() - String name = className(input.readUnsignedShort()) - String superName = className(input.readUnsignedShort()) - int interfaceCount = input.readUnsignedShort() - def interfaces = new TreeSet() - for (int interfaceIndex = 0; interfaceIndex < interfaceCount; interfaceIndex++) { - interfaces.add(className(input.readUnsignedShort())) - } - Map fields = readMembers(input) - Map methods = readMembers(input) - skipAttributes(input) - [ - name : name, - access : access, - superName : superName, - interfaces : interfaces, - fields : fields, - methods : methods, - minorVersion: minorVersion, - majorVersion: majorVersion - ] } -def readBinaryApi = { File archive -> - def classes = new TreeMap>() - def zip = new java.util.zip.ZipFile(archive) - try { - def entries = Collections.list(zip.entries()) - .findAll { entry -> - !entry.directory - && entry.name.endsWith('.class') - && !entry.name.startsWith('META-INF/versions/') - && !entry.name.endsWith('/module-info.class') - && entry.name != 'module-info.class' - } - .sort { left, right -> left.name <=> right.name } - entries.each { entry -> - Map parsed = zip.getInputStream(entry).withCloseable { stream -> - parseBinaryApiClass(stream.bytes) - } - if ((((Integer) parsed.access).intValue() & (0x0001 | 0x0004)) != 0) { - classes.put((String) parsed.name, parsed) - } - } - } finally { - zip.close() +def round13SourceArchiveIntegrationTest = tasks.register( + 'round13SourceArchiveIntegrationTest', Test) { + group = 'verification' + description = 'Runs the focused Round 13 recovery, retry, and five-occurrence correctness proofs.' + testClassesDirs = sourceSets.integrationTest.output.classesDirs + classpath = sourceSets.integrationTest.runtimeClasspath + dependsOn tasks.named(sourceSets.integrationTest.classesTaskName) + filter { + includeTestsMatching( + 'blue.coordination.internal.EmbeddedReceiptRetryIdentityIntegrationTest') + includeTestsMatching( + 'blue.coordination.integration.PlaygroundFiveOccurrenceCorrectnessIntegrationTest') + includeTestsMatching( + 'blue.coordination.integration.PlaygroundFiveOccurrenceRetryTest.retryCompletesFiveOccurrenceFanoutWithoutReinitializingChildren') } - classes } -def visibilityCompatible = { int oldAccess, int newAccess -> - boolean oldPublic = (oldAccess & 0x0001) != 0 - boolean newPublic = (newAccess & 0x0001) != 0 - boolean newProtected = (newAccess & 0x0004) != 0 - oldPublic ? newPublic : (newPublic || newProtected) +def round13SourceArchiveScenarioTest = tasks.register( + 'round13SourceArchiveScenarioTest', Test) { + group = 'verification' + description = 'Runs the focused Round 13 five-occurrence scenario proof.' + testClassesDirs = sourceSets.scenarioTest.output.classesDirs + classpath = sourceSets.scenarioTest.runtimeClasspath + dependsOn tasks.named(sourceSets.scenarioTest.classesTaskName) + filter { + includeTestsMatching( + 'blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest.fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents') + } } -def incompatibleModifierChanges = { int oldAccess, int newAccess, boolean method -> - def changes = new ArrayList() - if (((oldAccess ^ newAccess) & 0x0008) != 0) { - changes.add('static modifier changed') - } - if ((oldAccess & 0x0010) == 0 && (newAccess & 0x0010) != 0) { - changes.add('became final') - } - if (method && (oldAccess & 0x0400) == 0 && (newAccess & 0x0400) != 0) { - changes.add('became abstract') +def round13SourceArchiveConsumerTest = tasks.register( + 'round13SourceArchiveConsumerTest', Test) { + group = 'verification' + description = 'Runs the public-JAR five-occurrence consumer proof.' + testClassesDirs = sourceSets.consumerTest.output.classesDirs + classpath = sourceSets.consumerTest.runtimeClasspath + dependsOn tasks.named(sourceSets.consumerTest.classesTaskName), + tasks.named('jar') + filter { + includeTestsMatching( + 'blue.coordination.consumer.PublishedArtifactConsumerTest.fiveEmbeddedOccurrencesReuseThreeManagedDocuments') } - changes } -def binaryCompatibilityReport = layout.buildDirectory.file( - 'reports/binary-compatibility/blue-coordination-java.txt') -def binaryCompatibilityCheck = tasks.register('binaryCompatibilityCheck') { +tasks.register('round13SourceArchiveSmoke') { group = 'verification' - description = 'Checks public/protected JVM API compatibility with the previous Coordination candidate.' - dependsOn tasks.named('jar') - inputs.files(configurations.binaryCompatibilityBaseline) - inputs.file(tasks.named('jar').flatMap { it.archiveFile }) - inputs.property('baselineVersion', binaryCompatibilityBaselineVersion) - outputs.file(binaryCompatibilityReport) - doLast { - Set resolvedBaseline = configurations.binaryCompatibilityBaseline.resolve() - if (resolvedBaseline.size() != 1) { - throw new GradleException( - "Expected one binary compatibility baseline JAR, found ${resolvedBaseline}") - } - File baselineJar = resolvedBaseline.iterator().next() - File currentJar = tasks.named('jar').get().archiveFile.get().asFile - Map> baselineApi = readBinaryApi(baselineJar) - Map> currentApi = readBinaryApi(currentJar) - def problems = new ArrayList() - - baselineApi.each { String className, Map oldClass -> - Map newClass = currentApi.get(className) - if (newClass == null) { - problems.add("${className}: public/protected class was removed") - return - } - int oldAccess = ((Integer) oldClass.access).intValue() - int newAccess = ((Integer) newClass.access).intValue() - if (!visibilityCompatible(oldAccess, newAccess)) { - problems.add("${className}: class visibility was reduced") - } - if (((oldAccess ^ newAccess) & (0x0200 | 0x2000 | 0x4000)) != 0) { - problems.add("${className}: class/interface/annotation/enum kind changed") - } - if ((oldAccess & 0x0010) == 0 && (newAccess & 0x0010) != 0) { - problems.add("${className}: class became final") - } - if ((oldAccess & 0x0400) == 0 && (newAccess & 0x0400) != 0) { - problems.add("${className}: class became abstract") - } - if (oldClass.superName != newClass.superName) { - problems.add("${className}: superclass changed from ${oldClass.superName} to ${newClass.superName}") - } - ((Set) oldClass.interfaces).each { String interfaceName -> - if (!((Set) newClass.interfaces).contains(interfaceName)) { - problems.add("${className}: directly implemented interface ${interfaceName} was removed") - } - } - - ['field', 'method'].each { String memberKind -> - Map oldMembers = memberKind == 'field' - ? (Map) oldClass.fields - : (Map) oldClass.methods - Map newMembers = memberKind == 'field' - ? (Map) newClass.fields - : (Map) newClass.methods - oldMembers.each { String signature, Integer oldMemberAccess -> - Integer newMemberAccess = newMembers.get(signature) - if (newMemberAccess == null) { - problems.add("${className}: ${memberKind} ${signature} was removed or changed descriptor") - return - } - if (!visibilityCompatible(oldMemberAccess.intValue(), - newMemberAccess.intValue())) { - problems.add("${className}: ${memberKind} ${signature} visibility was reduced") - } - incompatibleModifierChanges(oldMemberAccess.intValue(), - newMemberAccess.intValue(), memberKind == 'method').each { change -> - problems.add("${className}: ${memberKind} ${signature} ${change}") - } - } - } - } + description = 'Runs all focused Round 13 proofs required after archive extraction.' + dependsOn round13SourceArchiveUnitTest, + round13SourceArchiveIntegrationTest, + round13SourceArchiveScenarioTest, + round13SourceArchiveConsumerTest +} - def digest = java.security.MessageDigest.getInstance('SHA-256') - baselineJar.withInputStream { stream -> - byte[] buffer = new byte[8192] - int read - while ((read = stream.read(buffer)) >= 0) { - if (read > 0) { - digest.update(buffer, 0, read) - } - } - } - String baselineSha256 = digest.digest() - .collect { String.format('%02x', it & 0xff) }.join() - File report = binaryCompatibilityReport.get().asFile - report.parentFile.mkdirs() - report.withWriter('UTF-8') { writer -> - writer.writeLine("baseline=blue.coordination:blue-coordination-java:${binaryCompatibilityBaselineVersion}") - writer.writeLine("baselineJar=${baselineJar.name}") - writer.writeLine("baselineSha256=${baselineSha256}") - writer.writeLine("currentJar=${currentJar.name}") - writer.writeLine("baselineApiClasses=${baselineApi.size()}") - writer.writeLine("currentApiClasses=${currentApi.size()}") - writer.writeLine("compatible=${problems.isEmpty()}") - problems.sort().each { writer.writeLine("problem=${it}") } - } - if (!problems.isEmpty()) { - throw new GradleException( - "Binary compatibility check failed with ${problems.size()} problem(s); see ${report}") - } +def configureRound13EvidenceRuntime = { JavaExec task -> + task.group = 'verification' + task.classpath = sourceSets.scenarioTest.runtimeClasspath + task.mainClass = + 'blue.coordination.integration.PlaygroundFiveOccurrenceEvidence' + task.dependsOn tasks.named(sourceSets.scenarioTest.classesTaskName) + task.javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of( + providers.gradleProperty('testJavaVersion') + .getOrElse('17') as int) } + task.jvmArgs '-Xmx2g' + task.outputs.upToDateWhen { false } } -def java8BytecodeReport = layout.buildDirectory.file( - 'reports/bytecode/java8-bytecode.txt') -def verifyJava8Bytecode = tasks.register('verifyJava8Bytecode') { - group = 'verification' - description = 'Verifies that every class in the published Coordination JAR targets Java 8 or earlier.' - dependsOn tasks.named('jar') - inputs.file(tasks.named('jar').flatMap { it.archiveFile }) - outputs.file(java8BytecodeReport) - doLast { - File currentJar = tasks.named('jar').get().archiveFile.get().asFile - def versions = new TreeMap() - def zip = new java.util.zip.ZipFile(currentJar) - try { - Collections.list(zip.entries()) - .findAll { entry -> !entry.directory && entry.name.endsWith('.class') } - .sort { left, right -> left.name <=> right.name } - .each { entry -> - Map parsed = zip.getInputStream(entry).withCloseable { stream -> - parseBinaryApiClass(stream.bytes) - } - versions.put(entry.name, (Integer) parsed.majorVersion) - } - } finally { - zip.close() - } - def incompatible = versions.findAll { String name, Integer major -> major > 52 } - File report = java8BytecodeReport.get().asFile - report.parentFile.mkdirs() - report.withWriter('UTF-8') { writer -> - writer.writeLine("jar=${currentJar.name}") - writer.writeLine("classCount=${versions.size()}") - writer.writeLine("maximumAllowedMajorVersion=52") - writer.writeLine("maximumObservedMajorVersion=${versions.values().max() ?: 0}") - writer.writeLine("compatible=${incompatible.isEmpty()}") - incompatible.each { name, major -> - writer.writeLine("problem=${name}: major version ${major}") - } - } - if (!incompatible.isEmpty()) { +tasks.register('round13PlaygroundSample', JavaExec) { + configureRound13EvidenceRuntime(delegate) + description = 'Writes one warmed five-occurrence JSON sample to -Dblue.coordination.round13.sample.' + args 'sample' + doFirst { + def output = providers.systemProperty( + 'blue.coordination.round13.sample').orNull + if (output == null || output.isBlank()) { throw new GradleException( - "Java 8 bytecode verification failed for ${incompatible.size()} class(es); see ${report}") + 'round13PlaygroundSample requires ' + + '-Dblue.coordination.round13.sample=/path/sample.json') } + systemProperty 'blue.coordination.round13.sample', output + systemProperty 'blue.coordination.round13.warmups', + providers.systemProperty( + 'blue.coordination.round13.warmups') + .getOrElse('3') } } -tasks.named('check') { - dependsOn binaryCompatibilityCheck, verifyJava8Bytecode -} - -jmh { - jmhVersion = '1.37' - warmupIterations = 3 - warmup = '1s' - iterations = 5 - timeOnIteration = '1s' - fork = 2 - profilers = testJfrEnabled - ? ['gc', "jfr:dir=${file("$buildDir/reports/jfr/jmh").absolutePath}"] - : ['gc'] - jvmArgs = ['-Xms512m', '-Xmx2g'] - resultFormat = 'JSON' - resultsFile = file("$buildDir/reports/jmh/jmh-results.json") -} - -tasks.named('jmh') { - def jsonReport = file("$buildDir/reports/jmh/jmh-results.json") - def csvReport = file("$buildDir/reports/jmh/jmh-results.csv") - def markdownReport = file("$buildDir/reports/jmh/jmh-results.md") - def environmentReport = file("$buildDir/reports/jmh/environment.properties") - outputs.files(csvReport, markdownReport, environmentReport) - doLast { - if (!jsonReport.isFile()) { - throw new GradleException("JMH JSON report was not created: ${jsonReport}") - } - def results = new groovy.json.JsonSlurper().parse(jsonReport) - def csvCell = { Object value -> - '"' + String.valueOf(value == null ? '' : value).replace('"', '""') + '"' - } - def markdownCell = { Object value -> - String.valueOf(value == null ? '' : value).replace('|', '\\|').replace('\n', ' ') - } - - csvReport.parentFile.mkdirs() - csvReport.withWriter('UTF-8') { writer -> - writer.writeLine('benchmark,mode,threads,forks,score,scoreError,scoreUnit,gate') - results.each { result -> - def metric = result.primaryMetric ?: [:] - writer.writeLine([ - result.benchmark, - result.mode, - result.threads, - result.forks, - metric.score, - metric.scoreError, - metric.scoreUnit, - 'NOT_CONFIGURED' - ].collect(csvCell).join(',')) - } - } - - def environment = new TreeMap() - environment.put('blueCoordinationVersion', project.version.toString()) - environment.put('blueLanguageVersion', blueLanguageVersion) - environment.put('gradleVersion', gradle.gradleVersion) - environment.put('gradleJvmMaxHeapBytes', String.valueOf(Runtime.runtime.maxMemory())) - environment.put('javaVendor', System.getProperty('java.vendor', 'unknown')) - environment.put('javaVersion', System.getProperty('java.version', 'unknown')) - environment.put('jmhForkJvmArgs', '-Xms512m,-Xmx2g') - environment.put('osArch', System.getProperty('os.arch', 'unknown')) - environment.put('osName', System.getProperty('os.name', 'unknown')) - environment.put('osVersion', System.getProperty('os.version', 'unknown')) - environment.put('processors', String.valueOf(Runtime.runtime.availableProcessors())) - environmentReport.withWriter('UTF-8') { writer -> - environment.each { key, value -> writer.writeLine("${key}=${value}") } - } - - markdownReport.withWriter('UTF-8') { writer -> - writer.writeLine('# Coordination JMH results') - writer.writeLine('') - writer.writeLine('Environment metadata is recorded in `environment.properties`. Generic JMH hard gates are not configured; each row is marked `NOT_CONFIGURED`.') - writer.writeLine('') - writer.writeLine('| Benchmark | Mode | Threads | Forks | Score | Error | Unit | Gate |') - writer.writeLine('|---|---:|---:|---:|---:|---:|---|---|') - results.each { result -> - def metric = result.primaryMetric ?: [:] - writer.writeLine('| ' + [ - result.benchmark, - result.mode, - result.threads, - result.forks, - metric.score, - metric.scoreError, - metric.scoreUnit, - 'NOT_CONFIGURED' - ].collect(markdownCell).join(' | ') + ' |') - } - } - } -} - -ext.genResourcesDir = file("$buildDir/generated-resources") -def buildPropertiesVersion = project.version.toString() -task generateBuildProperties { - ext.buildPropertiesFile = file("$genResourcesDir/blue/coordination/build.properties") - inputs.property('buildVersion', buildPropertiesVersion) - outputs.file(buildPropertiesFile) - doLast { - buildPropertiesFile.text = ("blue-coordination-java.build.version=" + buildPropertiesVersion + "\n" - + "blue-coordination-java.build.timestamp=" + new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")) +tasks.register('playgroundRuntimeCampaign', JavaExec) { + configureRound13EvidenceRuntime(delegate) + description = 'Runs the opt-in 30-sample five-occurrence candidate campaign.' + args 'campaign' + doFirst { + systemProperty 'blue.coordination.round13.campaign', + providers.systemProperty( + 'blue.coordination.round13.campaign') + .getOrElse(layout.buildDirectory.dir( + 'reports/round13/playground-runtime') + .get().asFile.absolutePath) + systemProperty 'blue.coordination.round13.warmups', + providers.systemProperty( + 'blue.coordination.round13.warmups') + .getOrElse('3') + systemProperty 'blue.coordination.round13.samples', + providers.systemProperty( + 'blue.coordination.round13.samples') + .getOrElse('30') } } -sourceSets.main.output.dir genResourcesDir, builtBy: generateBuildProperties - -tasks.withType(GenerateModuleMetadata).configureEach { - enabled = false -} publishing { publications { - maven(MavenPublication) { - groupId = 'blue.coordination' - artifactId = 'blue-coordination-java' + mavenJava(MavenPublication) { from components.java - + artifact tasks.named('testFixturesJar') pom { - name = 'Blue Coordination Java Processor' - description = 'Java processors for executable Blue repository contracts.' - url = 'https://language.blue' + name = 'Blue Coordination Java' + description = 'Deterministic whole-object document coordination runtime.' + url = 'https://github.com/bluecontract/blue-coordination-java' licenses { license { - name = 'MIT license' - url = 'https://github.com/bluecontract/blue-coordination-java/blob/main/LICENSE' + name = 'MIT License' + url = 'https://opensource.org/license/mit' } } developers { developer { name = 'Blue' email = 'devsupport@timeline.blue' + organization = 'Blue Company' } } scm { - url = 'https://github.com/bluecontract/blue-coordination-java.git' - connection = 'scm:git:git@github.com:bluecontract/blue-coordination-java.git' - developerConnection = 'scm:git:git@github.com:bluecontract/blue-coordination-java.git' + url = 'https://github.com/bluecontract/blue-coordination-java' + connection = 'scm:git:https://github.com/bluecontract/blue-coordination-java.git' + developerConnection = 'scm:git:ssh://git@github.com/bluecontract/blue-coordination-java.git' + } + issueManagement { + system = 'GitHub Issues' + url = 'https://github.com/bluecontract/blue-coordination-java/issues' } } } } - repositories { maven { + name = 'staging' url = layout.buildDirectory.dir('staging-deploy') } - if (!System.getenv('CI')) { - maven { - name = 'local' - url = uri('file:///' + new File(System.getProperty("user.home"), ".m2/repository").absolutePath) - } - } } } -tasks.register('sourceArchive', Zip) { - group = 'distribution' - description = 'Creates a reproducible source-only archive and SHA-256 checksum.' - def sourceArchiveName = "${rootProject.name}-${project.version}-source.zip" - def checksumFile = layout.buildDirectory.file("distributions/${sourceArchiveName}.sha256") - archiveFileName = sourceArchiveName - destinationDirectory = layout.buildDirectory.dir('distributions') - outputs.file(checksumFile) - preserveFileTimestamps = false - reproducibleFileOrder = true - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from(projectDir) { - into("${rootProject.name}-${project.version}") - include '.cz.toml' - include '.github/**' - include '.gitignore' - include 'LICENSE' - include 'README.md' - include 'build.gradle' - include 'settings.gradle' - include 'gradle.properties' - include 'gradle/**' - include 'gradlew' - include 'gradlew.bat' - include 'docs/**' - include 'src/**' - exclude '**/.DS_Store' - exclude '**/*.db' - exclude '**/*.hprof' - exclude '**/*.jfr' - exclude '**/*.log' - exclude '**/*.zip' - exclude '**/build/**' - exclude '**/dumps/**' - exclude '**/logs/**' - exclude '**/node_modules/**' - exclude '**/recordings/**' - } - doLast { - def archive = archiveFile.get().asFile - def digest = java.security.MessageDigest.getInstance('SHA-256') - archive.withInputStream { input -> - byte[] buffer = new byte[8192] - int read - while ((read = input.read(buffer)) >= 0) { - if (read > 0) { - digest.update(buffer, 0, read) - } - } - } - def checksum = digest.digest().collect { String.format('%02x', it & 0xff) }.join() - checksumFile.get().asFile.setText( - "${checksum} ${archive.name}\n", 'UTF-8') +tasks.named('jar') { + manifest { + attributes( + 'Automatic-Module-Name': 'blue.coordination', + 'Implementation-Title': 'Blue Coordination Java', + 'Implementation-Version': project.version, + 'Implementation-Vendor': 'Blue Company') } } -def stageLocalMaven = tasks.register('stageLocalMaven') { - group = 'publishing' - description = 'Publishes the current Coordination artifact into build/staging-deploy.' - dependsOn tasks.named('publishMavenPublicationToMavenRepository') +signing { + def signingKey = providers.gradleProperty('signingKey').orNull + def signingPassword = providers.gradleProperty( + 'signingPassword').orNull + required = { signingKey != null } + if (signingKey != null) { + useInMemoryPgpKeys(signingKey, signingPassword) + } + sign publishing.publications.mavenJava } -if (System.getenv('CI')) { +if (System.getenv('CI') != null) { jreleaser { + strict = true signing { - active = 'ALWAYS' - armored = true + pgp { + active = 'ALWAYS' + armored = true + } } project { - description = 'Java processors for executable Blue repository contracts.' + description = 'Deterministic whole-object document coordination runtime.' copyright = 'Copyright 2026 Blue Company. Licensed under the MIT License' + languages { + java { + version = '17' + } + } } - deploy { maven { mavenCentral { sonatype { - active = 'ALWAYS' + active = 'RELEASE' url = 'https://central.sonatype.com/api/v1/publisher' applyMavenCentralRules = true - snapshotSupported = true + snapshotSupported = false stagingRepository('build/staging-deploy') } } @@ -748,11 +427,2472 @@ if (System.getenv('CI')) { } } -def determineProjectVersion() { - def tomlFile = file('.cz.toml') - if (tomlFile.exists()) { - def toml = new groovy.toml.TomlSlurper().parse(tomlFile) - return toml.tool.commitizen.version + (!System.getenv('CI') ? '-SNAPSHOT' : '') +def productionSources = fileTree('src/main/java') { include '**/*.java' } +def forbiddenArchitectureTokens = [ + 'AutonomousLink', 'TemporalWave', 'ConsistencyMode', + 'ObservingLink', 'CoherentLink', 'SccScheduler', + 'SCCScheduler', 'WeakComponentPlanner' +] + +tasks.register('validateProductionShape') { + group = 'verification' + description = 'Enforces the production class, line, API, and architecture budgets.' + inputs.files(productionSources) + doLast { + def sources = productionSources.files.sort() + int classes = sources.size() + long lines = sources.sum { it.readLines('UTF-8').size() } ?: 0L + def apiSources = fileTree('src/main/java/blue/coordination/api') { + include '**/*.java' + }.files + def failures = [] + if (classes > 115) failures << "production classes ${classes} > 115" + // Round 13 transparently retains a bounded 252-line revision for the + // occurrence-path audit receipt, closed retry-counter vocabulary and + // retry-monitor producers, timestamp-consumption and attachment- + // timestamp guards, committed-input recovery evidence, deterministic + // invalid-entry preflight and terminalization, and injective binding + // identities. Do not minify or hide this deliberate semantic work. + if (lines > 25_952L) failures << "production lines ${lines} > 25952" + if (apiSources.size() > 16) { + failures << "public API types ${apiSources.size()} > 16" + } + ['engine', 'fastpath'].each { legacy -> + if (file("src/main/java/blue/coordination/${legacy}").exists()) { + failures << "legacy package remains: ${legacy}" + } + } + sources.each { source -> + String relative = projectDir.toPath().relativize( + source.toPath()).toString().replace('\\', '/') + String body = source.getText('UTF-8') + if (relative.contains('/basic/') || relative.contains('/test/')) { + failures << "test-named production package: ${relative}" + } + if (source.name.contains('Basic') || source.name.contains('Test')) { + failures << "test-named production type: ${relative}" + } + if (body.contains('org.junit') + || body.contains('CoordinationDocumentSplitter')) { + failures << "test or splitter dependency in ${relative}" + } + forbiddenArchitectureTokens.each { token -> + if (body.contains(token)) { + failures << "forbidden architecture token ${token} in ${relative}" + } + } + } + fileTree('src/main/resources').files.each { resource -> + String body = resource.getText('UTF-8') + forbiddenArchitectureTokens.each { token -> + if (body.contains(token)) { + failures << "forbidden architecture token ${token} in ${resource}" + } + } + } + if (!failures.empty) throw new GradleException(failures.join('; ')) + logger.lifecycle( + "Production shape: ${classes} classes, ${lines} lines, " + + "${apiSources.size()} public API types") + } +} + +tasks.register('verifyPublicApiBoundary') { + group = 'verification' + description = 'Rejects public signatures that expose implementation packages.' + dependsOn tasks.named('compileJava') + doLast { + def violations = [] + fileTree('src/main/java/blue/coordination/api') { + include '**/*.java' + }.each { source -> + source.eachLine('UTF-8') { line, number -> + if (!line.stripLeading().startsWith('import ') + && line.contains('blue.coordination.internal')) { + violations << "${source}:${number}" + } + } + } + fileTree('src/main/java/blue/coordination/internal') { + include '**/*.java' + exclude 'DefaultCoordinationEngine.java' + }.each { source -> + String body = source.getText('UTF-8') + if (body =~ /(?m)^public\s+(?:final\s+|abstract\s+)?(?:class|interface|record|enum)\s+/) { + violations << "public implementation type ${source}" + } + } + if (!violations.empty) { + throw new GradleException( + "Internal API leakage: ${violations.join(', ')}") + } + } +} + +tasks.register('dependencyPreflight') { + group = 'verification' + description = 'Resolves every release dependency from published repositories.' + doLast { + if (dependencyMode != 'published-artifact') { + throw new GradleException( + 'dependencyPreflight requires ' + + '-PblueDependencyMode=published-artifact') + } + def releaseDependencies = configurations.detachedConfiguration( + dependencies.create( + 'blue.language:blue-contracts-core:3.1.0-rc.20'), + dependencies.create('blue.repo:blue-repo-java:3.0.0-rc.21'), + dependencies.create('blue.bex:blue-bex-core:1.1.0-rc.3'), + dependencies.create( + 'blue.bex:blue-bex-contracts:1.1.0-rc.3'), + dependencies.create('org.bouncycastle:bcprov-jdk18on:1.78.1')) + releaseDependencies.transitive = true + releaseDependencies.resolutionStrategy.failOnVersionConflict() + releaseDependencies.resolve() + logger.lifecycle('All published release dependencies resolved.') + } +} + +tasks.register('verifyArtifactContents') { + group = 'verification' + description = 'Rejects legacy, test, and fixture classes in the production JAR.' + dependsOn tasks.named('jar') + doLast { + def forbidden = [ + 'blue/coordination/basic/', + 'blue/coordination/test/', + 'blue/coordination/engine/', + 'blue/coordination/fastpath/', + 'myosDemoTest', + 'CoordinationTestControl' + ] + forbiddenArchitectureTokens + def violations = [] + zipTree(tasks.named('jar').get().archiveFile).visit { details -> + if (!details.directory && forbidden.any { + details.path.contains(it) + }) { + violations << details.path + } + } + if (!violations.empty) { + throw new GradleException( + "Unsupported production JAR entries: ${violations}") + } + } +} + +tasks.register('verifyPublicationPom') { + group = 'verification' + dependsOn 'generatePomFileForMavenJavaPublication' + doLast { + String pom = layout.buildDirectory.file( + 'publications/mavenJava/pom-default.xml') + .get().asFile.getText('UTF-8') + def scopes = [:] + pom.split('').each { block -> + def groups = (block =~ /([^<]+)<\/groupId>/) + .collect { it[1] } + def artifacts = (block =~ /([^<]+)<\/artifactId>/) + .collect { it[1] } + def scope = (block =~ /([^<]+)<\/scope>/) + if (!groups.empty && !artifacts.empty) { + scopes[groups.last() + ':' + artifacts.last()] = + scope.find() ? scope.group(1) : 'compile' + } + } + ['blue.language:blue-contracts-core', 'blue.bex:blue-bex-core', + 'blue.bex:blue-bex-contracts'] + .each { coordinate -> + if (scopes[coordinate] != 'compile') { + throw new GradleException( + "${coordinate} must be compile scoped because public APIs expose its types") + } + } + ['blue.repo:blue-repo-java', 'org.bouncycastle:bcprov-jdk18on'] + .each { coordinate -> + if (scopes[coordinate] != 'runtime') { + throw new GradleException( + "${coordinate} must be runtime scoped") + } + } + def expectedVersions = [ + 'blue.language:blue-contracts-core': '3.1.0-rc.20', + 'blue.repo:blue-repo-java': '3.0.0-rc.21', + 'blue.bex:blue-bex-core': '1.1.0-rc.3', + 'blue.bex:blue-bex-contracts': '1.1.0-rc.3', + 'org.bouncycastle:bcprov-jdk18on': '1.78.1' + ] + expectedVersions.each { coordinate, expectedVersion -> + String artifact = coordinate.substring( + coordinate.indexOf(':') + 1) + def dependency = pom.split('').find { block -> + block.contains("${artifact}") + } + if (dependency == null + || !dependency.contains( + "${expectedVersion}")) { + throw new GradleException( + "${coordinate} must use ${expectedVersion}") + } + } + ['MIT License', '', '', ''] + .each { marker -> + if (!pom.contains(marker)) { + throw new GradleException( + "Publication POM is missing ${marker}") + } + } + [ + 'https://github.com/bluecontract/blue-coordination-java', + 'scm:git:https://github.com/bluecontract/blue-coordination-java.git', + 'scm:git:ssh://git@github.com/bluecontract/blue-coordination-java.git', + 'https://github.com/bluecontract/blue-coordination-java/issues' + ].each { marker -> + if (!pom.contains(marker)) { + throw new GradleException( + "Publication POM is missing canonical repository metadata ${marker}") + } + } + if (pom.contains('github.com/bluecontract/blue-contract-java')) { + throw new GradleException( + 'Publication POM contains the obsolete repository URL') + } + if (pom.contains('SNAPSHOT') || pom.contains('junit')) { + throw new GradleException( + 'Release POM contains a snapshot or test dependency') + } + } +} + +tasks.register('verifyReleaseMetadata') { + group = 'verification' + description = 'Validates version, legal metadata, docs, and release artifacts.' + dependsOn 'jar', 'sourcesJar', 'javadocJar', + 'generatePomFileForMavenJavaPublication' + String configuredReleaseVersion = version.toString() + doLast { + String releaseVersion = configuredReleaseVersion + if (!(releaseVersion ==~ /\d+\.\d+\.\d+(?:-rc\.\d+)?/)) { + throw new GradleException( + "Version is not a release or RC: ${releaseVersion}") + } + if (!file('LICENSE').getText('UTF-8').startsWith('MIT License')) { + throw new GradleException('LICENSE must contain the MIT License') + } + [ + 'README.md', + 'START-HERE.md', + 'CHANGELOG.md', + 'CONTRIBUTING.md', + 'SECURITY.md', + 'docs/development/build-and-test.md', + 'docs/development/test-strategy.md', + 'docs/development/releasing.md', + 'docs/releases/3.0.0-rc.1-test-report.md', + 'docs/releases/3.0.0-rc.1-evidence.json', + 'docs/releases/round11-verification.schema.json', + 'docs/releases/round12-verification.schema.json', + 'docs/releases/round13-verification.schema.json', + 'scripts/round13-ab-evidence.mjs', + 'scripts/round13-published-dependencies.gradle', + 'scripts/run-round13-same-machine-ab.sh', + 'docs/reference/public-api.md', + 'docs/reference/metrics.md', + 'docs/operations/failure-model.md' + ].each { required -> + if (!file(required).isFile()) { + throw new GradleException( + "Required RC document is missing: ${required}") + } + } + def mainEntries = zipTree(tasks.named('jar').get().archiveFile) + if (!mainEntries.matching { + include 'META-INF/LICENSE' + }.singleFile.isFile()) { + throw new GradleException('Main JAR is missing META-INF/LICENSE') + } + def javadocEntries = zipTree( + tasks.named('javadocJar').get().archiveFile) + if (javadocEntries.matching { + include 'blue/coordination/api/CoordinationEngine.html' + }.isEmpty() || javadocEntries.matching { + include 'blue/coordination/processor/CoordinationProcessors.html' + }.isEmpty()) { + throw new GradleException( + 'Javadoc JAR must cover API and processor surfaces') + } } - return '0.0.0' + (!System.getenv('CI') ? '-SNAPSHOT' : '') +} + +tasks.register('verifyDocumentation') { + group = 'verification' + description = 'Validates maintained docs and canonical release evidence.' + inputs.files(fileTree('docs') { include '**/*.md' }, + 'README.md', 'START-HERE.md', 'CHANGELOG.md', + 'CONTRIBUTING.md', 'SECURITY.md', + 'docs/releases/3.0.0-rc.1-evidence.json', + 'docs/releases/round11-verification.schema.json', + 'docs/releases/round12-verification.schema.json', + 'docs/releases/round13-verification.schema.json', + 'scripts/round13-ab-evidence.mjs', + 'scripts/round13-published-dependencies.gradle', + 'scripts/run-round13-same-machine-ab.sh', + productionSources) + doLast { + def failures = [] + inputs.files.files.findAll { it.name.endsWith('.md') }.each { source -> + String markdown = source.getText('UTF-8') + def links = markdown =~ /\[[^\]]*\]\(([^)]+)\)/ + links.each { match -> + String raw = match[1].trim() + if (raw.startsWith('http://') || raw.startsWith('https://') + || raw.startsWith('mailto:') || raw.startsWith('#')) { + return + } + String path = raw.split('#', 2)[0] + File target = new File(source.parentFile, path) + if (!target.exists()) { + failures << "${source}: broken link ${raw}" + } + } + } + if (!failures.empty) { + throw new GradleException(failures.join('\n')) + } + def evidenceFile = file( + 'docs/releases/3.0.0-rc.1-evidence.json') + def evidence = new groovy.json.JsonSlurper().parse(evidenceFile) + if (evidence.schemaVersion == '4.1.0' + && evidence.profile + == 'ROUND13_PLAYGROUND_FIVE_OCCURRENCE') { + def schemaFile = file( + 'docs/releases/round13-verification.schema.json') + def schema = new groovy.json.JsonSlurper().parse(schemaFile) + if (evidence.'$schema' != 'round13-verification.schema.json' + || !['INTERIM', 'FINAL'].contains( + evidence.evidenceState) + || schema.'$id' != 'round13-verification.schema.json' + || schema.properties.profile.const + != 'ROUND13_PLAYGROUND_FIVE_OCCURRENCE' + || schema.properties.status.properties + .providerBackedReady.const != 'OUT_OF_SCOPE' + || schema.properties.status.properties + .mandateAgentReady.const != 'OUT_OF_SCOPE') { + failures << 'Canonical evidence has an invalid Round 13 profile or schema' + } + + def expectedStatuses = [ + 'temporalArchitectureReady', + 'inMemoryEngineWorkingReady', + 'playgroundCoreReady', + 'playgroundLatencyReady', + 'providerBackedReady', + 'mandateAgentReady', + 'publicRcReady' + ] as Set + def allowedReadiness = [ + 'PASS', 'PASS_HARD_GATE', 'PENDING_VERIFICATION', + 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION', + 'BLOCKED', 'FAIL', 'OUT_OF_SCOPE' + ] as Set + def allowedExecution = [ + 'PASS', 'PENDING_VERIFICATION', 'FAIL' + ] as Set + if ((evidence.status.keySet() as Set) != expectedStatuses) { + failures << 'Round 13 evidence must contain exactly seven readiness statuses' + } else { + evidence.status.each { key, value -> + if (!allowedReadiness.contains(value)) { + failures << "Invalid Round 13 readiness ${key}=${value}" + } + } + if (evidence.status.providerBackedReady != 'OUT_OF_SCOPE' + || evidence.status.mandateAgentReady + != 'OUT_OF_SCOPE') { + failures << 'Round 13 provider and Mandate readiness must be OUT_OF_SCOPE' + } + } + if (!allowedReadiness.contains(evidence.verdict)) { + failures << "Invalid Round 13 verdict ${evidence.verdict}" + } + def expectedLimitedRcPolicy = [ + mode: 'RC_WITH_KNOWN_PERFORMANCE_LIMITATION', + exactRelease: '3.0.0-rc.1', + decision: 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION', + performanceReleaseBlocking: false, + stableReleaseEligible: false, + nonPerformanceGatesRequired: true, + explicitWorkflowOptInRequired: true + ] + boolean limitedRcPolicy = version.toString() == '3.0.0-rc.1' + && evidence.release == version.toString() + && evidence.releasePolicy == expectedLimitedRcPolicy + if (!limitedRcPolicy) { + failures << 'Round 13 RC limitation policy is missing or invalid' + } + + Closure sha256 = { byte[] bytes -> + java.security.MessageDigest.getInstance('SHA-256') + .digest(bytes).encodeHex().toString() + } + Closure relativePath = { File source -> + rootDir.toPath().relativize(source.toPath()).toString() + .replace(File.separator, '/') + } + List manifestSources = productionSources.files.sort { + source -> relativePath(source) + } + String manifest = manifestSources.collect { source -> + "${relativePath(source)} ${sha256(source.bytes)}" + }.join('\n') + String actualManifestSha256 = sha256( + manifest.getBytes(java.nio.charset.StandardCharsets.UTF_8)) + if (evidence.source.mainSourceManifestSha256 + != actualManifestSha256 + || evidence.executionBinding.mainSourceManifestSha256 + != actualManifestSha256) { + failures << 'Round 13 main-source manifest is stale or execution binding differs' + } + + def actualShape = [ + productionClasses: productionSources.files.size(), + productionLines: productionSources.files.sum { + it.readLines('UTF-8').size() + } ?: 0L, + publicApiSourceTypes: fileTree( + 'src/main/java/blue/coordination/api') { + include '**/*.java' + }.files.size() + ] + def expectedLimits = [ + productionClasses: 115, + productionLines: 25_952, + publicApiSourceTypes: 16 + ] + if (evidence.shape.status != 'PASS' + || evidence.shape.basis != 'STATIC_WORKTREE_SNAPSHOT' + || evidence.shape.limits != expectedLimits) { + failures << 'Round 13 static shape or declared limits are invalid' + } + actualShape.each { key, actual -> + if (evidence.shape[key] != actual) { + failures << "Round 13 shape ${key} is ${evidence.shape[key]}; actual is ${actual}" + } + if (actual > evidence.shape.limits[key]) { + failures << "Round 13 shape ${key} exceeds its declared limit" + } + } + String limitReason = evidence.shape.limitRevisionReason ?: '' + ['25,700', '25,952', 'occurrence-path', 'retry-counter', + 'retry-monitor', 'timestamp-consumption', + 'attachment-timestamp', 'committed-input recovery', + 'invalid-entry preflight', 'terminalization', + 'injective binding identities'].each { marker -> + if (!limitReason.contains(marker)) { + failures << "Round 13 line-limit reason lacks ${marker}" + } + } + + def suiteRoots = [ + 'test': 'src/test/java', + 'integrationTest': 'src/integrationTest/java', + 'consumerTest': 'src/consumerTest/java', + 'scenarioTest': 'src/scenarioTest/java' + ] + def actualSuites = suiteRoots.collectEntries { name, path -> + def annotated = fileTree(path) { include '**/*.java' }.files + .collect { source -> + [file: source, tests: (source.getText('UTF-8') + =~ /(?m)^\s*@Test\b/).count] + }.findAll { it.tests > 0 } + [(name): [ + tests: annotated.sum { it.tests } ?: 0, + classes: annotated.size() + ]] + } + if (evidence.tests.inventoryBasis != 'STATIC_SOURCE_INVENTORY' + || evidence.tests.finalTreeRequired != true + || !allowedExecution.contains( + evidence.tests.executionStatus) + || (evidence.tests.suites.collect { it.name } as Set) + != (suiteRoots.keySet() as Set)) { + failures << 'Round 13 test inventory has an invalid shape' + } + actualSuites.each { name, actual -> + def recorded = evidence.tests.suites.find { + it.name == name.toString() + } + if (recorded == null + || recorded.tests != actual.tests + || recorded.classes != actual.classes + || !allowedExecution.contains(recorded.status)) { + failures << "Round 13 ${name} source inventory is stale" + } + } + long actualTests = actualSuites.values().sum { it.tests } ?: 0L + long actualClasses = actualSuites.values().sum { + it.classes + } ?: 0L + if (evidence.tests.tests != actualTests + || evidence.tests.classes != actualClasses) { + failures << 'Round 13 aggregate source inventory is stale' + } + def outcomeFields = ['failures', 'errors', 'skipped'] + if (evidence.tests.executionStatus == 'PENDING_VERIFICATION') { + if (outcomeFields.any { evidence.tests[it] != null } + || evidence.tests.suites.any { suite -> + outcomeFields.any { suite[it] != null } + || suite.status != 'PENDING_VERIFICATION' + }) { + failures << 'Pending Round 13 tests must not contain outcome claims' + } + } else { + outcomeFields.each { field -> + if (!(evidence.tests[field] instanceof Number) + || evidence.tests.suites.any { + !(it[field] instanceof Number) + } + || evidence.tests.suites.sum { + (it[field] as Number).longValue() + } != (evidence.tests[field] + as Number).longValue()) { + failures << "Round 13 ${field} outcomes are incomplete or inconsistent" + } + } + } + + if ((evidence.runtimes.collect { it.java } as Set) + != (['17', '21'] as Set)) { + failures << 'Round 13 requires exactly Java 17 and Java 21 lanes' + } + evidence.runtimes.each { runtime -> + ['test', 'integrationTest', 'consumerTest', 'scenarioTest', + 'releaseCheck', '--rerun-tasks', + "-PtestJavaVersion=${runtime.java}"].each { marker -> + if (!runtime.gate.contains(marker)) { + failures << "Java ${runtime.java} gate lacks ${marker}" + } + } + if (!allowedExecution.contains(runtime.status) + || (runtime.status == 'PENDING_VERIFICATION' + && runtime.durationSeconds != null) + || (runtime.status == 'PASS' + && !(runtime.durationSeconds instanceof Number))) { + failures << "Java ${runtime.java} execution record is inconsistent" + } + } + + def expectedProofs = [ + 'five-occurrence-three-session-reuse': [ + 'scenarioTest', + 'blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest', + 'fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents', + 'scenarioTest'], + 'five-occurrence-five-parent-events': [ + 'scenarioTest', + 'blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest', + 'fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents', + 'scenarioTest'], + 'five-occurrence-canonical-path-order': [ + 'scenarioTest', + 'blue.coordination.integration.PlaygroundFiveOccurrenceDeterminismScenarioTest', + 'reverseRequestInsertionOrderPreservesBlueIdsHistoriesAndEvents', + 'scenarioTest'], + 'five-occurrence-retry-exactly-once': [ + 'integrationTest', + 'blue.coordination.integration.PlaygroundFiveOccurrenceRetryTest', + 'retryCompletesFiveOccurrenceFanoutWithoutReinitializingChildren', + 'integrationTest'], + 'five-occurrence-public-JAR-consumer': [ + 'consumerTest', + 'blue.coordination.consumer.PublishedArtifactConsumerTest', + 'fiveEmbeddedOccurrencesReuseThreeManagedDocuments', + 'consumerTest'], + 'five-occurrence-no-generic-fragmentation': [ + 'scenarioTest', + 'blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest', + 'fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents', + 'scenarioTest'], + 'five-occurrence-host-versus-frozen-time': [ + 'performance', null, null, + 'round13PlaygroundSample'] + ] + if ((evidence.proofs.collect { it.id } as Set) + != (expectedProofs.keySet() as Set)) { + failures << 'Round 13 proof set must contain the exact seven rows' + } + String buildText = file('build.gradle').getText('UTF-8') + evidence.proofs.each { proof -> + def expected = expectedProofs[proof.id] + if (expected != null + && [proof.sourceSet, proof.testClass, + proof.testMethod, proof.task] != expected) { + failures << "Round 13 proof binding differs: ${proof.id}" + } + if (proof.sourceSet == 'performance') { + if (!buildText.contains( + "tasks.register('round13PlaygroundSample'") + || !file('src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java') + .isFile()) { + failures << 'Round 13 performance proof target is missing' + } + } else { + String proofRoot = suiteRoots[proof.sourceSet] + File proofSource = proofRoot == null ? null : file( + proofRoot + '/' + + proof.testClass.replace('.', '/') + + '.java') + if (proofSource == null || !proofSource.isFile() + || !proofSource.getText('UTF-8').contains( + proof.testMethod + '(')) { + failures << "Round 13 proof target is missing: ${proof.id}" + } + } + if (!allowedExecution.contains(proof.status)) { + failures << "Round 13 proof has invalid status: ${proof.id}" + } + } + + def campaign = evidence.performance.round13Campaign + def campaignStatuses = [ + 'PASS', 'PASS_HARD_GATE', + 'PENDING_VERIFICATION', 'FAIL' + ] as Set + String expectedBaselineHash = + '2f303afd9435937145ce7fe09eb655ff1a05ee6ed7484faea62d93544a3ccf3e' + if (!campaignStatuses.contains(campaign.status) + || campaign.comparison != 'SAME_MACHINE_INTERLEAVED_AB' + || campaign.baselineArchive != 'Archive.zip' + || campaign.baselineSha256 != expectedBaselineHash + || campaign.candidateTask != 'round13PlaygroundSample' + || campaign.warmups != 3 + || campaign.requiredSamples < 30 + || campaign.measuredSamples < 0) { + failures << 'Round 13 performance campaign has invalid metadata' + } + def campaignOutputs = [campaign.runtimeMarkdown, + campaign.runtimeJson, + campaign.runtimeProvenanceJson] + if (campaign.status == 'PENDING_VERIFICATION') { + if (campaign.measuredSamples != 0 + || campaignOutputs.any { it != null } + || campaign.pendingReason == null) { + failures << 'Pending Round 13 campaign must not contain final outputs' + } + } else { + def expectedCampaignOutputs = [ + 'docs/releases/evidence/round13/five-occurrence-runtime.md', + 'docs/releases/evidence/round13/five-occurrence-runtime.json', + 'docs/releases/evidence/round13/runtime-provenance.json' + ] + if (campaign.measuredSamples != 30 + || campaignOutputs != expectedCampaignOutputs + || campaignOutputs.any { !file(it).isFile() } + || campaign.pendingReason != null) { + failures << 'Measured Round 13 campaign is incomplete' + } else { + List command = [ + 'node', + file('scripts/round13-ab-evidence.mjs') + .absolutePath, + '--verify', + '--candidate', rootDir.absolutePath, + '--runtime', file(campaign.runtimeJson) + .absolutePath, + '--provenance', + file(campaign.runtimeProvenanceJson) + .absolutePath, + '--markdown', file(campaign.runtimeMarkdown) + .absolutePath + ] + Process process = new ProcessBuilder(command) + .directory(rootDir) + .redirectErrorStream(true).start() + String verification = process.inputStream + .getText('UTF-8') + if (process.waitFor() != 0 + || !verification.contains( + "ROUND13_AB_VERIFIED=${campaign.status}")) { + failures << ('Round 13 runtime receipt failed recomputation: ' + + verification.trim()) + } + } + } + def historical = evidence.performance.historicalRound12 + if (historical.classification != 'HISTORICAL_ONLY' + || historical.decisionBasis != false + || !(historical.summary instanceof String) + || historical.summary.isBlank()) { + failures << 'Round 12 measurements must remain historical only' + } + + def expectedCounters = [ + 'REQUEST_FRAGMENTS', + 'TIMELINE_ENTRY_FRAGMENTS', + 'ORDINARY_NODE_FRAGMENTS', + 'FULL_ENVIRONMENT_SCANS', + 'SOURCE_REPLAYS_PER_PARENT', + 'POST_PROCESS_FULL_PROJECTIONS', + 'PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY', + 'CHILD_PROCESS_RERUNS_ON_PARENT_RETRY' + ] as Set + def counters = evidence.structuralEvidence.requiredZeroCounters + if ((counters.keySet() as Set) != expectedCounters + || evidence.structuralEvidence.finalTreeRequired != true + || !allowedExecution.contains( + evidence.structuralEvidence.status)) { + failures << 'Round 13 structural evidence must contain the exact eight counters' + } else if (evidence.structuralEvidence.status + == 'PENDING_VERIFICATION') { + if (counters.any { key, value -> value != null }) { + failures << 'Pending Round 13 counters must remain unset' + } + } else if (evidence.structuralEvidence.status == 'PASS' + && counters.any { key, value -> value != 0 }) { + failures << 'Passing Round 13 structural counters must all equal zero' + } + + def artifactHashes = [ + 'mainJarSha256', 'sourcesJarSha256', + 'javadocJarSha256', 'testFixturesJarSha256' + ] + String sha256Pattern = /^[0-9a-f]{64}$/ + if (!allowedExecution.contains(evidence.artifacts.status) + || evidence.artifacts.finalTreeRequired != true) { + failures << 'Round 13 artifact evidence has an invalid status' + } else if (evidence.artifacts.status + == 'PENDING_VERIFICATION' + && artifactHashes.any { + evidence.artifacts[it] != null + }) { + failures << 'Pending Round 13 artifacts must not retain hashes' + } else if (evidence.artifacts.status == 'PASS' + && artifactHashes.any { + !(evidence.artifacts[it] ==~ sha256Pattern) + }) { + failures << 'Passing Round 13 artifacts require four hashes' + } + + def archive = evidence.sourceArchive + def expectedArchiveFields = [ + configuration: 'CONFIGURED', + finalTreeRequired: true, + authoritativeVersionFile: '.cz.toml', + authoritativeVersionFileIncluded: true, + reproducibleFileOrder: true, + preserveFileTimestamps: false, + duplicatesStrategy: 'FAIL' + ] + expectedArchiveFields.each { key, value -> + if (archive[key] != value) { + failures << "Round 13 source archive ${key} must be ${value}" + } + } + def expectedArchiveReceipt = [ + schemaId: 'blue-coordination-round13-source-archive-verification-v1', + path: 'build/reports/round13/source-archive-verification.json' + ] + def expectedArchiveChecksum = [ + mode: 'DETACHED_SHA256_SIDECAR', + path: 'build/distributions/blue-coordination-java-3.0.0-rc.1-source.zip.sha256', + digest: null + ] + if (archive.verificationReceipt != expectedArchiveReceipt + || archive.checksum != expectedArchiveChecksum) { + failures << 'Round 13 source archive must use external receipt and detached checksum authority' + } + def archiveExecutionFields = [ + 'extractedConfiguration', 'focusedTestsStatus', + 'publishedArtifactSmokeBuild' + ] + if (archiveExecutionFields.any { + !['PASS', 'PENDING_VERIFICATION', 'FAIL', + 'BLOCKED_UPSTREAM'].contains(archive[it]) + }) { + failures << 'Round 13 source archive has an invalid execution status' + } + if (archiveExecutionFields.any { + archive[it] == 'PENDING_VERIFICATION' + }) { + if (archive.pendingReason == null) { + failures << 'Pending Round 13 archive must explain why' + } + } else if (archive.pendingReason != null) { + failures << 'Completed Round 13 archive must have no pending reason' + } + if (!['PASS', 'PENDING_VERIFICATION', 'FAIL', + 'BLOCKED_UPSTREAM'].contains( + evidence.publicationEvidence.status)) { + failures << 'Round 13 publication evidence has an invalid status' + } + + String report = file( + 'docs/releases/3.0.0-rc.1-test-report.md') + .getText('UTF-8') + evidence.status.each { key, value -> + if (!report.contains("| `${key}` | `${value}` |")) { + failures << "Canonical report differs from status ${key}" + } + } + expectedProofs.keySet().each { proofId -> + if (!report.contains("`${proofId}`")) { + failures << "Canonical report lacks proof row ${proofId}" + } + } + if (!report.contains(actualManifestSha256) + || !report.contains("**${actualClasses}**") + || !report.contains("**${actualTests}**")) { + failures << 'Canonical report lacks current manifest or aggregate inventory' + } + + if (evidence.evidenceState == 'INTERIM') { + def baseInterimStatuses = [ + temporalArchitectureReady: 'PENDING_VERIFICATION', + inMemoryEngineWorkingReady: 'PENDING_VERIFICATION', + playgroundCoreReady: 'PENDING_VERIFICATION', + providerBackedReady: 'OUT_OF_SCOPE', + mandateAgentReady: 'OUT_OF_SCOPE', + publicRcReady: 'BLOCKED' + ] + boolean baseStatusesMatch = baseInterimStatuses.every { + key, value -> evidence.status[key] == value + } + String expectedLatency = campaign.status + == 'PENDING_VERIFICATION' + ? 'PENDING_VERIFICATION' : campaign.status + if (!baseStatusesMatch + || evidence.status.playgroundLatencyReady + != expectedLatency + || evidence.verdict != 'PENDING_VERIFICATION' + || evidence.source.candidateCommit != null + || evidence.source.binding + != 'BASE_COMMIT_PLUS_DIRTY_WORKTREE_MANIFEST' + || evidence.source.worktree != 'DIRTY' + || evidence.source.dirtyReason == null + || evidence.executionBinding.candidateCommit != null + || evidence.executionBinding.reason == null + || !report.contains( + 'ROUND13_INTERIM_VERIFICATION: PENDING_VERIFICATION') + || report.contains('ROUND13_FINAL_VERIFICATION:')) { + failures << 'Round 13 INTERIM evidence overclaims or lacks its marker' + } + if (evidence.executionBinding.kind == 'PENDING') { + if (evidence.tests.executionStatus + != 'PENDING_VERIFICATION' + || evidence.runtimes.any { + it.status != 'PENDING_VERIFICATION' + } + || evidence.proofs.any { + it.status != 'PENDING_VERIFICATION' + } + || evidence.structuralEvidence.status + != 'PENDING_VERIFICATION') { + failures << 'Pending Round 13 binding cannot carry execution outcomes' + } + } else if (evidence.executionBinding.kind + == 'WORKTREE_EXECUTION') { + if (evidence.tests.executionStatus + == 'PENDING_VERIFICATION' + || evidence.runtimes.any { + it.status == 'PENDING_VERIFICATION' + || !(it.durationSeconds + instanceof Number) + } + || evidence.proofs.any { + it.status == 'PENDING_VERIFICATION' + } + || evidence.structuralEvidence.status + == 'PENDING_VERIFICATION') { + failures << 'Round 13 WORKTREE_EXECUTION must contain complete lane outcomes' + } + } else { + failures << 'Round 13 INTERIM execution binding must be PENDING or WORKTREE_EXECUTION' + } + } else { + def publishableLatency = [ + 'PASS', 'PASS_HARD_GATE' + ] as Set + boolean normalLatencyDecision = evidence.verdict == 'PASS' + && publishableLatency.contains( + evidence.status.playgroundLatencyReady) + && evidence.status.publicRcReady == 'PASS' + && publishableLatency.contains(campaign.status) + && evidence.proofs.every { it.status == 'PASS' } + && report.contains( + 'ROUND13_FINAL_VERIFICATION: PASS') + boolean limitedLatencyDecision = limitedRcPolicy + && evidence.verdict + == 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION' + && evidence.status.playgroundLatencyReady + == 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION' + && evidence.status.publicRcReady + == 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION' + && campaign.status == 'PENDING_VERIFICATION' + && campaign.measuredSamples == 0 + && campaign.runtimeMarkdown == null + && campaign.runtimeJson == null + && campaign.runtimeProvenanceJson == null + && campaign.pendingReason instanceof String + && !campaign.pendingReason.isBlank() + && evidence.proofs.every { + it.status == 'PASS' + || (it.id + == 'five-occurrence-host-versus-frozen-time' + && it.status == 'PENDING_VERIFICATION') + } + && report.contains( + 'ROUND13_FINAL_VERIFICATION: ' + + 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION') + if (!(normalLatencyDecision || limitedLatencyDecision) + || evidence.source.candidateCommit == null + || evidence.source.binding != 'CANDIDATE_COMMIT' + || evidence.source.worktree != 'CLEAN' + || evidence.source.dirtyReason != null + || evidence.executionBinding.kind + != 'CANDIDATE_COMMIT_EXECUTION' + || evidence.executionBinding.candidateCommit + != evidence.source.candidateCommit + || evidence.status.temporalArchitectureReady != 'PASS' + || evidence.status.inMemoryEngineWorkingReady != 'PASS' + || evidence.status.playgroundCoreReady != 'PASS' + || evidence.status.providerBackedReady != 'OUT_OF_SCOPE' + || evidence.status.mandateAgentReady != 'OUT_OF_SCOPE' + || evidence.tests.executionStatus != 'PASS' + || evidence.tests.failures != 0 + || evidence.tests.errors != 0 + || evidence.tests.skipped != 0 + || evidence.tests.suites.any { + it.status != 'PASS' || it.failures != 0 + || it.errors != 0 || it.skipped != 0 + } + || evidence.runtimes.any { it.status != 'PASS' } + || evidence.structuralEvidence.status != 'PASS' + || evidence.artifacts.status != 'PASS' + || archiveExecutionFields.any { + archive[it] != 'PASS' + } + || evidence.publicationEvidence.status != 'PASS' + || report.contains('ROUND13_INTERIM_VERIFICATION:')) { + failures << 'Round 13 FINAL evidence is incomplete' + } + } + [ + 'docs/releases/3.0.0-rc.1-round13-test-report.md', + 'docs/releases/3.0.0-rc.1-round13-evidence.json' + ].each { duplicate -> + if (file(duplicate).exists()) { + failures << "Duplicate Round 13 evidence surface remains: ${duplicate}" + } + } + if (!failures.empty) { + throw new GradleException(failures.join('\n')) + } + return + } + if (evidence.schemaVersion == '3.0.0' + && evidence.profile == 'ROUND12_INITIALIZATION_LIFECYCLE') { + if (evidence.'$schema' != 'round12-verification.schema.json' + || !['INTERIM', 'FINAL'].contains( + evidence.evidenceState)) { + failures << 'Canonical evidence has an invalid Round 12 profile' + } + def expectedStatuses = [ + 'temporalArchitectureReady', + 'inMemoryEngineWorkingReady', + 'providerBackedReady', + 'mandateAgentReady', + 'playgroundLatencyReady', + 'publicRcReady' + ] as Set + def allowedStatuses = [ + 'PASS', 'PASS_HARD_GATE', 'PENDING_VERIFICATION', + 'BLOCKED', 'BLOCKED_SCOPE', 'BLOCKED_UPSTREAM', 'FAIL' + ] as Set + def allowedExecutionStatuses = [ + 'PASS', 'PENDING_VERIFICATION', 'FAIL' + ] as Set + if ((evidence.status.keySet() as Set) != expectedStatuses) { + failures << 'Round 12 evidence must contain six readiness statuses' + } else { + evidence.status.each { key, value -> + if (!allowedStatuses.contains(value)) { + failures << "Invalid readiness status ${key}=${value}" + } + } + } + if (!allowedStatuses.contains(evidence.verdict)) { + failures << "Invalid Round 12 verdict ${evidence.verdict}" + } + + Closure sha256 = { byte[] bytes -> + java.security.MessageDigest.getInstance('SHA-256') + .digest(bytes).encodeHex().toString() + } + Closure relativePath = { File source -> + rootDir.toPath().relativize(source.toPath()).toString() + .replace(File.separator, '/') + } + List manifestSources = productionSources.files.sort { + source -> relativePath(source) + } + String manifest = manifestSources.collect { source -> + "${relativePath(source)} ${sha256(source.bytes)}" + }.join('\n') + String actualManifestSha256 = sha256( + manifest.getBytes(java.nio.charset.StandardCharsets.UTF_8)) + if (evidence.source.mainSourceManifestSha256 + != actualManifestSha256) { + failures << 'Round 12 main-source manifest is stale' + } + + def actualShape = [ + productionClasses: productionSources.files.size(), + productionLines: productionSources.files.sum { + it.readLines('UTF-8').size() + } ?: 0L, + publicApiSourceTypes: fileTree( + 'src/main/java/blue/coordination/api') { + include '**/*.java' + }.files.size() + ] + if (evidence.shape.status != 'PASS' + || evidence.shape.basis != 'STATIC_WORKTREE_SNAPSHOT') { + failures << 'Round 12 static worktree shape must PASS' + } + actualShape.each { key, actual -> + if (evidence.shape[key] != actual) { + failures << "Production shape ${key} is " + + "${evidence.shape[key]}; actual is ${actual}" + } + if (actual > evidence.shape.limits[key]) { + failures << "Production shape ${key} exceeds its limit" + } + } + + def suiteRoots = [ + test: 'src/test/java', + integrationTest: 'src/integrationTest/java', + consumerTest: 'src/consumerTest/java', + scenarioTest: 'src/scenarioTest/java' + ] + def actualSuites = suiteRoots.collectEntries { name, path -> + def annotated = fileTree(path) { include '**/*.java' }.files + .collect { source -> + [file: source, tests: (source.getText('UTF-8') + =~ /(?m)^\s*@Test\b/).count] + }.findAll { it.tests > 0 } + [(name): [ + tests: annotated.sum { it.tests } ?: 0, + classes: annotated.size() + ]] + } + if (evidence.tests.inventoryBasis != 'STATIC_SOURCE_INVENTORY' + || evidence.tests.finalTreeRequired != true + || !allowedExecutionStatuses.contains( + evidence.tests.executionStatus) + || (evidence.tests.suites.collect { it.name } as Set) + != (suiteRoots.keySet() as Set)) { + failures << 'Round 12 test inventory has an invalid shape' + } + actualSuites.each { name, actual -> + def recorded = evidence.tests.suites.find { + it.name == name.toString() + } + if (recorded == null + || recorded.tests != actual.tests + || recorded.classes != actual.classes) { + failures << "Round 12 ${name} inventory is stale" + } + } + long actualTests = actualSuites.values().sum { it.tests } ?: 0L + long actualClasses = actualSuites.values().sum { it.classes } ?: 0L + if (evidence.tests.tests != actualTests + || evidence.tests.classes != actualClasses) { + failures << 'Round 12 aggregate test inventory is stale' + } + def testOutcomeFields = ['failures', 'errors', 'skipped'] + if (evidence.tests.executionStatus != 'PENDING_VERIFICATION') { + testOutcomeFields.each { field -> + if (evidence.tests[field] instanceof Number + && evidence.tests.suites.every { + it[field] instanceof Number + }) { + long total = evidence.tests.suites.sum { + (it[field] as Number).longValue() + } + if (total != (evidence.tests[field] + as Number).longValue()) { + failures << "Round 12 ${field} total is inconsistent" + } + } + } + } + + if ((evidence.runtimes.collect { it.java } as Set) + != (['17', '21'] as Set)) { + failures << 'Round 12 requires Java 17 and Java 21 lanes' + } + evidence.runtimes.each { runtime -> + if (!allowedExecutionStatuses.contains(runtime.status)) { + failures << "Java ${runtime.java} has invalid status" + } else if (!runtime.gate.contains( + "-PtestJavaVersion=${runtime.java}")) { + failures << "Java ${runtime.java} gate lacks its toolchain" + } + } + + def expectedProofs = [ + 'shared-game-single-initialization': [ + 'scenarioTest', + 'blue.coordination.integration.NbaSharedGameLifecycleAcrossHostsTest', + 'laterAndPostFinalHostsReuseGameAndReceiveRetainedLifecycleEvents'], + 'later-host-receives-initialization-event': [ + 'scenarioTest', + 'blue.coordination.integration.NbaSharedGameLifecycleAcrossHostsTest', + 'laterAndPostFinalHostsReuseGameAndReceiveRetainedLifecycleEvents'], + 'dynamic-path-activation': [ + 'integrationTest', + 'blue.coordination.integration.DynamicProcessEmbeddedPathActivationTest', + 'addingProcessEmbeddedPathInitializesExistingInlineDocument'], + 'dynamic-collection-activation': [ + 'scenarioTest', + 'blue.coordination.integration.DynamicProcessEmbeddedCollectionActivationTest', + 'collectionMembersInitializeByCanonicalPathNotInsertionOrBlueIdOrder'], + 'canonical-code-point-order': [ + 'test', + 'blue.coordination.internal.EmbeddingBindingCanonicalOrderTest', + 'supplementaryCodePointUsesCanonicalTextOrderRatherThanUtf16Order'], + 'initialization-retry-idempotency': [ + 'integrationTest', + 'blue.coordination.integration.InitializationRetryIdempotencyTest', + 'retryPublishesOneChildInitializationWithoutRepeatingParentOperation'] + ] + if ((evidence.proofs.collect { it.id } as Set) + != (expectedProofs.keySet() as Set)) { + failures << 'Round 12 proof set must contain the exact six rows' + } + evidence.proofs.each { proof -> + def expected = expectedProofs[proof.id] + if (expected != null + && [proof.sourceSet, proof.testClass, + proof.testMethod] != expected) { + failures << "Round 12 proof binding differs: ${proof.id}" + } + String proofRoot = suiteRoots[proof.sourceSet] + File proofSource = proofRoot == null ? null : file( + proofRoot + '/' + proof.testClass.replace('.', '/') + + '.java') + if (proofSource == null || !proofSource.isFile() + || !proofSource.getText('UTF-8').contains( + proof.testMethod + '(')) { + failures << "Round 12 proof target is missing: ${proof.id}" + } + if (!allowedExecutionStatuses.contains(proof.status)) { + failures << "Round 12 proof has invalid status: ${proof.id}" + } + } + + def historical = evidence.performance.historicalRound11Baseline + def campaign = evidence.performance.round12Campaign + def nbaEvidence = campaign.nbaLifecycleEvidence + def sameScenarioP95 = campaign.sameScenarioP95 + def performanceStatuses = [ + 'PASS', 'PASS_HARD_GATE', 'PENDING_VERIFICATION', 'FAIL' + ] as Set + if (!performanceStatuses.contains(campaign.status) + || !allowedExecutionStatuses.contains(nbaEvidence.status) + || !performanceStatuses.contains(sameScenarioP95.status) + || campaign.preferredHostP95RegressionPercent + > campaign.hardHostP95RegressionPercent) { + failures << 'Round 12 performance has invalid status' + } + def publishablePerformance = ['PASS', 'PASS_HARD_GATE'] as Set + String expectedCampaignStatus + if (nbaEvidence.status == 'FAIL' + || sameScenarioP95.status == 'FAIL') { + expectedCampaignStatus = 'FAIL' + } else if (nbaEvidence.status == 'PASS' + && publishablePerformance.contains( + sameScenarioP95.status)) { + expectedCampaignStatus = sameScenarioP95.status + } else { + expectedCampaignStatus = 'PENDING_VERIFICATION' + } + if (campaign.status != expectedCampaignStatus) { + failures << 'Round 12 aggregate performance status is inconsistent' + } + if (historical.classification != 'HISTORICAL_BASELINE_ONLY' + || historical.profile != 'ROUND11_READINESS_CLOSURE' + || historical.sameSourceAsRound12 != false) { + failures << 'Round 11 performance must remain historical baseline only' + } + def retainedHostBaselines = [ + warmOrdinary: 15.571d, + warmPayNotePlusParent: 46.645d, + threeLayerRestaurantProduct: 54.696d + ] + def round11ObservedHosts = [ + warmOrdinary: 19.537833d, + warmPayNotePlusParent: 53.719583d, + threeLayerRestaurantProduct: 61.540792d + ] + retainedHostBaselines.each { key, baseline -> + if (Math.abs((historical + .promptRetainedBaselineSingleRunMs[key].host as double) + - baseline) > 0.000001d + || Math.abs((historical + .round11ObservedSingleRunMs[key].host as double) + - round11ObservedHosts[key]) > 0.000001d) { + failures << "Historical host baseline differs: ${key}" + } + } + if (sameScenarioP95.repeatedP95Rows != null) { + if ((sameScenarioP95.repeatedP95Rows.keySet() as Set) + != (retainedHostBaselines.keySet() as Set)) { + failures << 'Round 12 p95 requires the exact three scenarios' + } + boolean preferredPass = true + boolean hardPass = true + retainedHostBaselines.each { key, baseline -> + def row = sameScenarioP95.repeatedP95Rows[key] + if (row == null || !(row.round12P95Ms instanceof Number) + || !(row.baselineHostMs instanceof Number) + || Math.abs((row.baselineHostMs as double) + - baseline) > 0.000001d) { + failures << "Round 12 p95 row is incomplete: ${key}" + preferredPass = false + hardPass = false + } else { + double regression = ((row.round12P95Ms as double) + / baseline - 1.0d) * 100.0d + String preferred = regression + <= campaign.preferredHostP95RegressionPercent + ? 'PASS' : 'MISS' + String hard = regression + <= campaign.hardHostP95RegressionPercent + ? 'PASS' : 'FAIL' + if (!(row.regressionPercent instanceof Number) + || Math.abs(regression + - (row.regressionPercent as double)) > 0.0001d + || row.preferredGate != preferred + || row.hardGate != hard) { + failures << "Round 12 p95 gate differs: ${key}" + } + preferredPass &= preferred == 'PASS' + hardPass &= hard == 'PASS' + } + } + String measuredStatus = !hardPass ? 'FAIL' + : preferredPass ? 'PASS' : 'PASS_HARD_GATE' + if (sameScenarioP95.status != measuredStatus) { + failures << 'Round 12 p95 aggregate status differs' + } + } + historical.evidenceFiles.each { key, reference -> + File retained = new File(evidenceFile.parentFile, + reference.path.toString()) + if (!retained.isFile() + || sha256(retained.bytes) + != reference.sha256) { + failures << "Historical Round 11 evidence differs: " + + reference.path + } + } + Closure> verifyEvidenceFiles = { + references, String label -> + references.collect { reference -> + File measured = new File(evidenceFile.parentFile, + reference.path.toString()) + if (!measured.isFile() + || sha256(measured.bytes) + != reference.sha256) { + failures << "${label} evidence differs: " + + reference.path + } + measured + } + } + List nbaFiles = verifyEvidenceFiles( + nbaEvidence.evidenceFiles, 'Round 12 NBA') + verifyEvidenceFiles(sameScenarioP95.evidenceFiles, + 'Round 12 p95') + if (nbaEvidence.status != 'PENDING_VERIFICATION') { + nbaFiles.findAll { it.isFile() }.each { measured -> + def nba = new groovy.json.JsonSlurper().parse(measured) + if (nba.schemaVersion != 'round12-nba-evidence-v1' + || nba.status != 'MEASURED_SINGLE_SCENARIO' + || nba.sourceState.mainSourceManifestSha256 + != evidence.source.mainSourceManifestSha256 + || (nbaEvidence.status == 'PASS' + && nba.forbiddenCounters.any { + key, value -> value != 0 + })) { + failures << 'Round 12 NBA evidence is inconsistent: ' + + measured + } + } + } + + def expectedZeroCounters = [ + 'REQUEST_FRAGMENTS', 'TIMELINE_ENTRY_FRAGMENTS', + 'ORDINARY_NODE_FRAGMENTS', 'FULL_ENVIRONMENT_SCANS', + 'SOURCE_REPLAYS_PER_PARENT', + 'POST_PROCESS_FULL_PROJECTIONS', + 'PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY', + 'CHILD_PROCESS_RERUNS_ON_PARENT_RETRY' + ] as Set + if ((evidence.structuralEvidence.requiredZeroCounters.keySet() + as Set) != expectedZeroCounters) { + failures << 'Round 12 structural evidence needs eight counters' + } + if (!allowedExecutionStatuses.contains( + evidence.structuralEvidence.status) + || !allowedExecutionStatuses.contains( + evidence.artifacts.status)) { + failures << 'Round 12 structural/artifact status is invalid' + } + def artifactHashes = [ + 'mainJarSha256', 'sourcesJarSha256', + 'javadocJarSha256', 'testFixturesJarSha256' + ] + def sha256Pattern = ~/[0-9a-f]{64}/ + def expectedArchiveTests = [ + 'blue.coordination.api.DocumentRevisionInitializationCausalityTest', + 'blue.coordination.internal.DocumentAdmissionCauseTest', + 'blue.coordination.internal.EmbeddedEpochInputInitializationCausalityTest', + 'blue.coordination.internal.EmbeddingBindingCanonicalOrderTest' + ] as Set + if (evidence.sourceArchive.configuration != 'CONFIGURED' + || evidence.sourceArchive.authoritativeVersionFile + != '.cz.toml' + || evidence.sourceArchive.authoritativeVersionFileIncluded + != true + || evidence.sourceArchive.reproducibleFileOrder != true + || evidence.sourceArchive.preserveFileTimestamps != false + || evidence.sourceArchive.duplicatesStrategy != 'FAIL' + || (evidence.sourceArchive.focusedTests as Set) + != expectedArchiveTests + || evidence.sourceArchive.detachedHashEvidence.mode + != 'DETACHED_POST_BUILD_SIDECAR' + || evidence.sourceArchive.detachedHashEvidence + .embeddedInSourceArchive != false + || evidence.sourceArchive.detachedHashEvidence.sidecarPath + != "build/distributions/blue-coordination-java-${version}" + + '-source.zip.sha256') { + failures << 'Round 12 source-archive configuration is incomplete' + } + + def timelineCapability = evidence.capabilities.find { + it.id == 'generic-timeline-entry-document-target' + } + if (timelineCapability == null + || timelineCapability.blocker != false + || evidence.blockers.any { + it.id == 'generic-timeline-entry-document-target' + }) { + failures << 'Generic Timeline targeting must remain optional' + } + if (!evidence.blockers.any { + it.id == 'provider-mandate-resolver' + }) { + failures << 'Provider-backed Mandate resolver must remain a blocker' + } + + String report = file( + 'docs/releases/3.0.0-rc.1-test-report.md') + .getText('UTF-8') + expectedStatuses.each { key -> + if (!report.contains( + "| `${key}` | `${evidence.status[key]}` |")) { + failures << "Canonical report/evidence status differs for ${key}" + } + } + expectedProofs.keySet().each { proof -> + if (!report.contains("`${proof}`")) { + failures << "Canonical report omits proof ${proof}" + } + } + List reportLines = report.readLines() + evidence.proofs.each { proof -> + String row = reportLines.find { + it.contains("| `${proof.id}` |") + } + if (row == null + || !row.endsWith("| `${proof.status}` |")) { + failures << "Canonical proof status differs: ${proof.id}" + } + } + evidence.runtimes.each { runtime -> + String row = reportLines.find { + it.startsWith("| Java ${runtime.java} |") + } + if (row == null || !row.contains("| `${runtime.status}` |")) { + failures << "Canonical runtime status differs: Java " + + runtime.java + } + } + evidence.tests.suites.each { suite -> + String row = reportLines.find { + it.contains("(`${suite.name}`)") + } + if (row == null + || !row.contains("| ${suite.classes} | ${suite.tests} |") + || !row.endsWith("| `${suite.status}` |")) { + failures << "Canonical test inventory differs: ${suite.name}" + } + } + String totalRow = reportLines.find { it.startsWith('| **Total** |') } + if (totalRow == null + || !totalRow.contains("**${evidence.tests.classes}**") + || !totalRow.contains("**${evidence.tests.tests}**") + || !totalRow.contains( + "**`${evidence.tests.executionStatus}`**")) { + failures << 'Canonical aggregate test inventory differs' + } + if (!report.contains(evidence.source.mainSourceManifestSha256)) { + failures << 'Canonical report omits the main-source manifest' + } + + boolean interim = evidence.evidenceState == 'INTERIM' + if (interim) { + def requiredInterimStatuses = [ + temporalArchitectureReady: 'PENDING_VERIFICATION', + inMemoryEngineWorkingReady: 'PENDING_VERIFICATION', + providerBackedReady: 'BLOCKED_SCOPE', + mandateAgentReady: 'BLOCKED_UPSTREAM', + playgroundLatencyReady: 'PENDING_VERIFICATION', + publicRcReady: 'BLOCKED' + ] + if (evidence.verdict != 'PENDING_VERIFICATION' + || evidence.status != requiredInterimStatuses) { + failures << 'Round 12 INTERIM verdict/status set is inconsistent' + } + if (evidence.source.candidateCommit != null + || evidence.source.binding + != 'BASE_COMMIT_PLUS_DIRTY_WORKTREE_MANIFEST' + || evidence.source.worktree != 'DIRTY' + || !evidence.source.dirtyReason) { + failures << 'Round 12 INTERIM source binding is inconsistent' + } + def executionStatuses = [ + evidence.tests.executionStatus, + evidence.performance.round12Campaign.status, + evidence.performance.round12Campaign + .nbaLifecycleEvidence.status, + evidence.performance.round12Campaign + .sameScenarioP95.status, + evidence.structuralEvidence.status, + evidence.artifacts.status, + evidence.sourceArchive.extractedConfiguration, + evidence.sourceArchive.focusedTestsStatus, + evidence.sourceArchive.publishedArtifactSmokeBuild, + evidence.sourceArchive.detachedHashEvidence.status, + evidence.publicationEvidence.status + ] + evidence.runtimes.collect { it.status } + executionStatuses.addAll(evidence.proofs.collect { it.status }) + boolean hasWorktreeResults = executionStatuses.any { + it != 'PENDING_VERIFICATION' + } + if (evidence.executionBinding.kind == 'PENDING') { + if (hasWorktreeResults + || evidence.executionBinding + .mainSourceManifestSha256 != null + || evidence.executionBinding.candidateCommit != null) { + failures << 'Pending execution binding contains results' + } + } else if (evidence.executionBinding.kind + == 'WORKTREE_EXECUTION') { + if (evidence.executionBinding.mainSourceManifestSha256 + != evidence.source.mainSourceManifestSha256 + || evidence.executionBinding.candidateCommit != null) { + failures << 'Worktree results are not manifest-bound' + } + } else { + failures << 'INTERIM evidence has an invalid execution binding' + } + def resultFields = ['failures', 'errors', 'skipped'] + if (evidence.tests.executionStatus + == 'PENDING_VERIFICATION') { + if (resultFields.any { evidence.tests[it] != null } + || evidence.tests.suites.any { + it.status != 'PENDING_VERIFICATION' + || resultFields.any { field -> + it[field] != null + } + }) { + failures << 'Pending test results contain measurements' + } + } else if (resultFields.any { + !(evidence.tests[it] instanceof Number) + } || evidence.tests.suites.any { suite -> + suite.status == 'PENDING_VERIFICATION' + || resultFields.any { + !(suite[it] instanceof Number) + } + }) { + failures << 'Measured worktree test results are incomplete' + } else if (evidence.tests.executionStatus == 'PASS' + && (resultFields.any { evidence.tests[it] != 0 } + || evidence.tests.suites.any { suite -> + suite.status != 'PASS' + || resultFields.any { suite[it] != 0 } + })) { + failures << 'Passing worktree test results are inconsistent' + } + if (evidence.runtimes.any { runtime -> + runtime.status == 'PENDING_VERIFICATION' + ? runtime.durationSeconds != null + : !(runtime.durationSeconds instanceof Number) + || runtime.durationSeconds <= 0 + }) { + failures << 'Worktree runtime duration/status is inconsistent' + } + if (nbaEvidence.status == 'PENDING_VERIFICATION' + ? !nbaEvidence.evidenceFiles.empty + : nbaEvidence.evidenceFiles.empty) { + failures << 'Round 12 NBA evidence status is inconsistent' + } + if (sameScenarioP95.status == 'PENDING_VERIFICATION') { + if (sameScenarioP95.singleRunMs != null + || sameScenarioP95.repeatedP95Rows != null + || !sameScenarioP95.evidenceFiles.empty) { + failures << 'Pending Round 12 p95 evidence is not empty' + } + } else if (sameScenarioP95.singleRunMs == null + || sameScenarioP95.repeatedP95Rows == null + || sameScenarioP95.evidenceFiles.empty) { + failures << 'Measured Round 12 p95 evidence is incomplete' + } + if (evidence.structuralEvidence.status + == 'PENDING_VERIFICATION') { + if (evidence.structuralEvidence.requiredZeroCounters.any { + key, value -> value != null + }) { + failures << 'Pending structural counters are not null' + } + } else if (evidence.structuralEvidence + .requiredZeroCounters.any { + key, value -> !(value instanceof Number) + }) { + failures << 'Measured structural counters are incomplete' + } else if (evidence.structuralEvidence.status == 'PASS' + && evidence.structuralEvidence.requiredZeroCounters.any { + key, value -> value != 0 + }) { + failures << 'Passing structural counters are not zero' + } + if (evidence.artifacts.status == 'PENDING_VERIFICATION') { + if (artifactHashes.any { + evidence.artifacts[it] != null + }) { + failures << 'Pending artifact hashes are not null' + } + } else if (artifactHashes.any { + !(evidence.artifacts[it] ==~ sha256Pattern) + }) { + failures << 'Measured artifact hashes are incomplete' + } + def archiveStatuses = [ + evidence.sourceArchive.extractedConfiguration, + evidence.sourceArchive.focusedTestsStatus, + evidence.sourceArchive.publishedArtifactSmokeBuild, + evidence.sourceArchive.detachedHashEvidence.status + ] + if (archiveStatuses.any { it == 'PENDING_VERIFICATION' } + ? !evidence.sourceArchive.pendingReason + : evidence.sourceArchive.pendingReason != null) { + failures << 'Worktree source-archive state is inconsistent' + } + if (evidence.publicationEvidence.status + == 'PENDING_VERIFICATION' + ? evidence.publicationEvidence.durationSeconds != null + : !(evidence.publicationEvidence.durationSeconds + instanceof Number)) { + failures << 'Worktree publication result is inconsistent' + } + if (!report.contains( + 'ROUND12_INTERIM_VERIFICATION: PENDING_VERIFICATION') + || report.contains('ROUND12_FINAL_VERIFICATION:')) { + failures << 'Canonical report lacks the INTERIM marker' + } + } else { + def sha1Pattern = ~/[0-9a-f]{40}/ + if (!(evidence.source.candidateCommit ==~ sha1Pattern) + || evidence.source.binding != 'CANDIDATE_COMMIT' + || evidence.source.worktree != 'CLEAN' + || evidence.source.dirtyReason != null + || evidence.executionBinding.kind + != 'CANDIDATE_COMMIT_EXECUTION' + || evidence.executionBinding.candidateCommit + != evidence.source.candidateCommit + || evidence.executionBinding.mainSourceManifestSha256 + != evidence.source.mainSourceManifestSha256) { + failures << 'Round 12 FINAL source binding is inconsistent' + } + def resultFields = ['failures', 'errors', 'skipped'] + if (evidence.tests.executionStatus + == 'PENDING_VERIFICATION' + || resultFields.any { + !(evidence.tests[it] instanceof Number) + } || evidence.tests.suites.any { suite -> + suite.status == 'PENDING_VERIFICATION' + || resultFields.any { + !(suite[it] instanceof Number) + } + }) { + failures << 'Round 12 FINAL test results are incomplete' + } + if (evidence.runtimes.any { + it.status == 'PENDING_VERIFICATION' + || !(it.durationSeconds instanceof Number) + || it.durationSeconds <= 0 + } || evidence.proofs.any { + it.status == 'PENDING_VERIFICATION' + }) { + failures << 'Round 12 FINAL lanes/proofs are incomplete' + } + if (campaign.status == 'PENDING_VERIFICATION' + || nbaEvidence.status == 'PENDING_VERIFICATION' + || nbaEvidence.evidenceFiles.empty + || sameScenarioP95.status == 'PENDING_VERIFICATION' + || sameScenarioP95.singleRunMs == null + || sameScenarioP95.repeatedP95Rows == null + || sameScenarioP95.evidenceFiles.empty) { + failures << 'Round 12 FINAL performance is incomplete' + } + if (evidence.structuralEvidence.status + == 'PENDING_VERIFICATION' + || evidence.structuralEvidence.requiredZeroCounters.any { + key, value -> !(value instanceof Number) + }) { + failures << 'Round 12 FINAL counters are incomplete' + } + if (evidence.artifacts.status == 'PENDING_VERIFICATION' + || artifactHashes.any { + !(evidence.artifacts[it] ==~ sha256Pattern) + }) { + failures << 'Round 12 FINAL artifact hashes are incomplete' + } + if ([evidence.sourceArchive.extractedConfiguration, + evidence.sourceArchive.focusedTestsStatus, + evidence.sourceArchive.publishedArtifactSmokeBuild, + evidence.sourceArchive.detachedHashEvidence.status] + .any { it == 'PENDING_VERIFICATION' } + || evidence.sourceArchive.pendingReason != null) { + failures << 'Round 12 FINAL source archive is incomplete' + } + if (evidence.publicationEvidence.status + == 'PENDING_VERIFICATION' + || !(evidence.publicationEvidence.durationSeconds + instanceof Number)) { + failures << 'Round 12 FINAL publication is incomplete' + } + if (!report.contains( + "ROUND12_FINAL_VERIFICATION: ${evidence.verdict}") + || report.contains('ROUND12_INTERIM_VERIFICATION:')) { + failures << 'Canonical report lacks the FINAL marker' + } + } + [ + 'docs/releases/3.0.0-rc.1-round11-test-report.md', + 'docs/releases/3.0.0-rc.1-round11-evidence.json', + 'docs/releases/3.0.0-rc.1-round12-test-report.md', + 'docs/releases/3.0.0-rc.1-round12-evidence.json' + ].each { duplicate -> + if (file(duplicate).exists()) { + failures << "Duplicate release evidence surface remains: ${duplicate}" + } + } + if (!failures.empty) { + throw new GradleException(failures.join('\n')) + } + return + } + failures << 'Canonical evidence must use the Round 12 profile' + if (!failures.empty) { + throw new GradleException(failures.join('\n')) + } + } +} + +tasks.register('verifySourceArchiveHygiene') { + group = 'verification' + description = 'Protects the self-contained source-release boundary.' + inputs.files('.cz.toml', '.gitattributes', 'build.gradle') + String configuredArchiveVersion = version.toString() + doLast { + String versionSource = file('.cz.toml').getText('UTF-8') + def declaredVersions = versionSource =~ + /(?m)^version = "([^"]+)"$/ + if (!declaredVersions.find() + || declaredVersions.group(1) != configuredArchiveVersion + || declaredVersions.find()) { + throw new GradleException( + '.cz.toml must contain one authoritative project version') + } + String attributes = file('.gitattributes').getText('UTF-8') + [ + '*.zip export-ignore', + 'build/** export-ignore', + '.gradle/** export-ignore', + '__MACOSX/** export-ignore', + '._* export-ignore', + '*.jfr export-ignore', + '*.hprof export-ignore' + ].each { rule -> + if (!attributes.contains(rule)) { + throw new GradleException( + "Source archive rule is missing: ${rule}") + } + } + } +} + +def sourceArchiveIncludes = [ + '.cz.toml', '.gitattributes', '.github/**', '.gitignore', + 'CHANGELOG.md', 'CONTRIBUTING.md', 'LICENSE', 'README.md', + 'SECURITY.md', 'START-HERE.md', 'build.gradle', 'docs/**', + 'gradle/**', 'gradle.lockfile', 'gradle.properties', 'gradlew', + 'gradlew.bat', 'scripts/**', 'settings.gradle', 'src/**' +] +def sourceArchiveExcludes = [ + '**/.git/**', '**/.gradle/**', '**/.idea/**', '**/build/**', + '**/out/**', '**/*.zip', '**/__MACOSX/**', '**/._*', + '**/.DS_Store', '**/*.class', '**/*.jfr', '**/*.hprof', + '**/hs_err_pid*.log', '**/replay_pid*.log' +] + +def coordinationSourceArchive = tasks.register( + 'coordinationSourceArchive', Zip) { + group = 'distribution' + description = 'Creates the self-contained Coordination source archive.' + archiveFileName = "blue-coordination-java-${version}-source.zip" + destinationDirectory = layout.buildDirectory.dir('distributions') + includeEmptyDirs = false + preserveFileTimestamps = false + reproducibleFileOrder = true + duplicatesStrategy = org.gradle.api.file.DuplicatesStrategy.FAIL + into("blue-coordination-java-${version}") { + from(rootDir) { + include sourceArchiveIncludes + exclude sourceArchiveExcludes + filesMatching('gradlew') { permissions { unix(0755) } } + } + } +} + +def sourceArchiveChecksum = tasks.register( + 'coordinationSourceArchiveChecksum') { + group = 'distribution' + description = 'Writes the source archive SHA-256 sidecar.' + dependsOn coordinationSourceArchive + def archive = coordinationSourceArchive.flatMap { it.archiveFile } + def sidecar = archive.map { it.asFile.toPath().resolveSibling( + it.asFile.name + '.sha256').toFile() } + inputs.file(archive) + outputs.file(sidecar) + doLast { + File sourceArchive = archive.get().asFile + String hash = java.security.MessageDigest.getInstance('SHA-256') + .digest(sourceArchive.bytes).encodeHex().toString() + sidecar.get().setText("${hash} ${sourceArchive.name}\n", 'UTF-8') + } +} + +def extractedSourceArchive = tasks.register('verifyExtractedSourceArchive') { + group = 'verification' + description = 'Extracts, configures, and runs the focused Round 13 archive proofs.' + dependsOn sourceArchiveChecksum + inputs.file(coordinationSourceArchive.flatMap { it.archiveFile }) + inputs.property('dependencyMode', dependencyMode) + inputs.property('testJavaVersion', providers.gradleProperty( + 'testJavaVersion').getOrElse('17')) + outputs.dir(layout.buildDirectory.dir('source-archive-smoke')) + def verificationReceipt = layout.buildDirectory.file( + 'reports/round13/source-archive-verification.json') + outputs.file(verificationReceipt) + doLast { + File sourceArchive = coordinationSourceArchive.get() + .archiveFile.get().asFile + def zip = new java.util.zip.ZipFile(sourceArchive) + try { + java.util.Collections.list(zip.entries()).each { entry -> + String path = entry.name.replace('\\', '/') + List segments = path.split('/').findAll() + String leaf = segments.empty ? '' : segments.last() + String lower = path.toLowerCase(java.util.Locale.ROOT) + if (lower.endsWith('.zip') + || lower.endsWith('.class') + || segments.any { segment -> + ['build', 'out', '.gradle', '__macosx'].contains( + segment.toLowerCase( + java.util.Locale.ROOT)) + } + || leaf.startsWith('._') + || leaf.equalsIgnoreCase('.DS_Store')) { + throw new GradleException( + "Forbidden source-archive entry: ${path}") + } + } + } finally { + zip.close() + } + File smokeRoot = layout.buildDirectory.dir( + 'source-archive-smoke').get().asFile + delete smokeRoot + copy { + from zipTree(coordinationSourceArchive.get() + .archiveFile.get().asFile) + into smokeRoot + } + File extracted = new File( + smokeRoot, "blue-coordination-java-${version}") + if (!new File(extracted, '.cz.toml').isFile()) { + throw new GradleException( + 'Extracted source archive is missing .cz.toml') + } + def forbidden = fileTree(extracted) { + include '**/*.zip', '**/__MACOSX/**', '**/._*', + '**/.DS_Store', '**/build/**' + }.files + if (!forbidden.empty) { + throw new GradleException( + "Forbidden source-archive entries: ${forbidden}") + } + boolean windows = System.getProperty('os.name').toLowerCase( + java.util.Locale.ROOT).contains('windows') + File wrapper = new File(extracted, windows ? 'gradlew.bat' : 'gradlew') + if (!windows && !wrapper.canExecute()) { + throw new GradleException( + 'Extracted source archive gradlew is not executable') + } + List command = windows + ? ['cmd', '/d', '/c', wrapper.absolutePath] + : [wrapper.absolutePath] + command.addAll([ + '--no-daemon', '--max-workers=1', + 'help', 'round13SourceArchiveSmoke', + '-PtestJavaVersion=' + providers.gradleProperty( + 'testJavaVersion').getOrElse('17') + ]) + if (localDependencies) { + command.addAll([ + '-PblueDependencyMode=local-composite', + '-PblueBexCompositePath=' + file(providers.gradleProperty( + 'blueBexCompositePath').getOrElse( + '../blue-bex-java')).canonicalPath, + '-PblueRepositoryCompositePath=' + file( + providers.gradleProperty( + 'blueRepositoryCompositePath').getOrElse( + '../blue-repository-java')).canonicalPath + ]) + } else { + command.add('-PblueDependencyMode=published-artifact') + if (publishedRepository != null) { + command.add('-PbluePublishedRepository=' + + uri(publishedRepository).toString()) + } + } + Process process = new ProcessBuilder(command) + .directory(extracted).redirectErrorStream(true).start() + process.inputStream.eachLine { logger.lifecycle(it) } + if (process.waitFor() != 0) { + throw new GradleException( + 'Extracted source archive smoke build failed') + } + File sidecar = new File( + sourceArchive.parentFile, sourceArchive.name + '.sha256') + String archiveHash = java.security.MessageDigest + .getInstance('SHA-256').digest(sourceArchive.bytes) + .encodeHex().toString() + if (!sidecar.isFile() || !sidecar.getText('UTF-8') + .startsWith(archiveHash + ' ' + sourceArchive.name)) { + throw new GradleException( + 'Extracted source archive detached checksum differs') + } + File receipt = verificationReceipt.get().asFile + receipt.parentFile.mkdirs() + def receiptValue = [ + schemaId: 'blue-coordination-round13-source-archive-verification-v1', + archiveName: sourceArchive.name, + archiveSha256: archiveHash, + checksumMode: 'DETACHED_SHA256_SIDECAR', + checksumPath: rootDir.toPath().relativize( + sidecar.toPath()).toString().replace('\\', '/'), + dependencyMode: dependencyMode, + java: providers.gradleProperty( + 'testJavaVersion').getOrElse('17'), + extractedConfiguration: 'PASS', + focusedTestsStatus: 'PASS', + publishedArtifactSmokeBuild: localDependencies + ? 'PENDING_VERIFICATION' : 'PASS', + focusedTasks: [ + 'round13SourceArchiveUnitTest', + 'round13SourceArchiveIntegrationTest', + 'round13SourceArchiveScenarioTest', + 'round13SourceArchiveConsumerTest' + ] + ] + receipt.setText(groovy.json.JsonOutput.prettyPrint( + groovy.json.JsonOutput.toJson(receiptValue)) + '\n', + 'UTF-8') + } +} + +tasks.register('verifyPublishedModeIsolation') { + group = 'verification' + description = 'Proves published mode is the default and has no Git or sibling checks.' + inputs.files('settings.gradle', 'build.gradle') + doLast { + String settings = file('settings.gradle').getText('UTF-8') + String buildScript = file('build.gradle').getText('UTF-8') + if (settings.contains('ProcessBuilder') || settings.contains("'git'")) { + throw new GradleException( + 'Ordinary settings must not execute Git') + } + if (!settings.contains(".getOrElse('published-artifact')") + || !buildScript.contains( + ".getOrElse('published-artifact')")) { + throw new GradleException( + 'Published artifacts must remain the default dependency mode') + } + if (!settings.contains("dependencyMode == 'local-composite'")) { + throw new GradleException( + 'Local composite inclusion is not mode-gated') + } + } +} + +tasks.register('verifyTestArchitecture') { + group = 'verification' + description = 'Protects release-owned test depth and JAR-only consumer isolation.' + def suites = [ + unit: fileTree('src/test/java') { include '**/*Test.java' }, + integration: fileTree('src/integrationTest/java') { + include '**/*Test.java' + }, + consumer: fileTree('src/consumerTest/java') { + include '**/*Test.java' + }, + scenario: fileTree('src/scenarioTest/java') { + include '**/*Test.java' + } + ] + inputs.files(suites.values()) + inputs.file('build.gradle') + dependsOn tasks.named('jar') + doLast { + def minimumTests = [unit: 175, integration: 24, + consumer: 5, scenario: 2] + def failures = [] + suites.each { name, sources -> + int methods = sources.files.sum { source -> + (source.getText('UTF-8') =~ /(?m)^\s*@Test\b/).count + } ?: 0 + if (methods < minimumTests[name]) { + failures << "${name} has ${methods} @Test methods; " + + "minimum is ${minimumTests[name]}" + } + logger.lifecycle( + "${name} tests: ${sources.files.size()} classes, " + + "${methods} methods") + } + + String integrationSources = fileTree('src/integrationTest/java') { + include '**/*.java' + }.files.collect { it.getText('UTF-8') }.join('\n') + ['BasicTestMetrics', 'RuntimeComparisonWriter', 'LatencySeries'] + .each { historical -> + if (integrationSources.contains(historical)) { + failures << "release tests depend on historical metric " + + "support ${historical}" + } + } + if (integrationSources.contains('blue.coordination.basic')) { + failures << 'release tests retain the historical basic package' + } + + fileTree('src/consumerTest/java') { include '**/*.java' } + .each { source -> + String body = source.getText('UTF-8') + ['blue.coordination.internal', + 'blue.coordination.processor', + 'blue.coordination.integration'] + .each { forbidden -> + if (body.contains(forbidden)) { + failures << "consumer imports ${forbidden}: " + + source + } + } + } + Set mainOutputs = sourceSets.main.output.files.collect { + it.canonicalFile + } as Set + Set consumerClasspath = sourceSets.consumerTest + .compileClasspath.files.collect { it.canonicalFile } as Set + if (!mainOutputs.intersect(consumerClasspath).empty) { + failures << 'consumer compile classpath contains main source outputs' + } + File mainJar = tasks.named('jar').get().archiveFile.get().asFile + .canonicalFile + if (!consumerClasspath.contains(mainJar)) { + failures << 'consumer compile classpath does not contain the built JAR' + } + String historicalProject = '../blue-' + 'basic' + if (file('build.gradle').getText('UTF-8').contains( + historicalProject)) { + failures << "release build depends on ${historicalProject}" + } + if (!failures.empty) { + throw new GradleException(failures.join('; ')) + } + } +} + +tasks.register('productionizationCheck') { + group = 'verification' + dependsOn 'build', 'validateProductionShape', + 'verifyPublicApiBoundary', 'verifyArtifactContents', + 'verifyPublicationPom', 'verifyPublishedModeIsolation', + 'verifyReleaseMetadata', 'verifyDocumentation', + 'verifySourceArchiveHygiene', 'scenarioTest', + 'verifyTestArchitecture', extractedSourceArchive +} + +tasks.register('releaseCheck') { + group = 'verification' + description = 'Runs the production, API, artifact, and publication gates.' + dependsOn 'build', 'validateProductionShape', 'verifyPublicApiBoundary', + 'verifyArtifactContents', 'verifyPublicationPom', + 'verifyPublishedModeIsolation', 'verifyReleaseMetadata', + 'verifyDocumentation', 'verifySourceArchiveHygiene', 'test', + 'integrationTest', 'consumerTest', 'scenarioTest', + 'verifyTestArchitecture', extractedSourceArchive +} + +def round13Readiness = tasks.register('verifyRound13Readiness') { + group = 'verification' + description = 'Requires FINAL, complete Round 13 Playground evidence before staging.' + inputs.files('docs/releases/3.0.0-rc.1-test-report.md', + 'docs/releases/3.0.0-rc.1-evidence.json', + 'docs/releases/round13-verification.schema.json') + dependsOn sourceArchiveChecksum, extractedSourceArchive, + 'verifyDocumentation', + 'jar', 'sourcesJar', 'javadocJar', 'testFixturesJar' + doLast { + String report = file( + 'docs/releases/3.0.0-rc.1-test-report.md') + .getText('UTF-8') + def evidence = new groovy.json.JsonSlurper().parse( + file('docs/releases/3.0.0-rc.1-evidence.json')) + File sourceArchive = coordinationSourceArchive.get() + .archiveFile.get().asFile + File sourceArchiveSidecar = new File( + sourceArchive.parentFile, sourceArchive.name + '.sha256') + String sourceArchiveHash = java.security.MessageDigest + .getInstance('SHA-256').digest(sourceArchive.bytes) + .encodeHex().toString() + boolean detachedHashMatches = sourceArchiveSidecar.isFile() + && sourceArchiveSidecar.getText('UTF-8') + .startsWith(sourceArchiveHash + ' ' + sourceArchive.name) + def publishableLatency = ['PASS', 'PASS_HARD_GATE'] as Set + Closure containsUnfinalized + containsUnfinalized = { value, String field = null -> + if (field != 'duplicatesStrategy' + && ['PENDING_VERIFICATION', 'FAIL', 'BLOCKED', + 'BLOCKED_UPSTREAM'].contains(value)) { + return true + } + if (value instanceof Map) { + return value.any { key, nested -> + containsUnfinalized(nested, key as String) + } + } + if (value instanceof List) { + return value.any { containsUnfinalized(it, field) } + } + return false + } + + Closure gitOutput = { String... arguments -> + def command = ['git'] + command.addAll(arguments as List) + Process process = new ProcessBuilder(command) + .directory(rootDir).start() + String stdout = process.inputStream.getText('UTF-8') + String stderr = process.errorStream.getText('UTF-8') + if (process.waitFor() != 0) { + throw new GradleException("Git failed: ${stderr}") + } + stdout.trim() + } + String actualHead = gitOutput('rev-parse', 'HEAD') + String actualStatus = gitOutput( + 'status', '--porcelain', '--untracked-files=normal') + Process ancestorProcess = new ProcessBuilder( + 'git', 'merge-base', '--is-ancestor', + evidence.source.candidateCommit ?: 'INVALID', actualHead) + .directory(rootDir).start() + boolean testedCommitIsAncestor = ancestorProcess.waitFor() == 0 + Closure sha256 = { byte[] bytes -> + java.security.MessageDigest.getInstance('SHA-256') + .digest(bytes).encodeHex().toString() + } + Closure relativeSourcePath = { File source -> + rootDir.toPath().relativize(source.toPath()).toString() + .replace(File.separator, '/') + } + String currentSourceManifest = productionSources.files.sort { + source -> relativeSourcePath(source) + }.collect { source -> + "${relativeSourcePath(source)} ${sha256(source.bytes)}" + }.join('\n') + boolean testedSourceStillExact = sha256(currentSourceManifest.getBytes( + java.nio.charset.StandardCharsets.UTF_8)) + == evidence.source.mainSourceManifestSha256 + String sha256Pattern = /^[0-9a-f]{64}$/ + String sha1Pattern = /^[0-9a-f]{40}$/ + def artifactTasks = [ + mainJarSha256: 'jar', + sourcesJarSha256: 'sourcesJar', + javadocJarSha256: 'javadocJar', + testFixturesJarSha256: 'testFixturesJar' + ] + boolean artifactHashesMatch = artifactTasks.every { + evidenceKey, taskName -> + File artifact = tasks.named(taskName).get() + .archiveFile.get().asFile + String actualHash = java.security.MessageDigest + .getInstance('SHA-256').digest(artifact.bytes) + .encodeHex().toString() + (evidence.artifacts[evidenceKey] ==~ sha256Pattern) + && evidence.artifacts[evidenceKey] == actualHash + } + def campaign = evidence.performance.round13Campaign + def campaignProvenance = campaign.runtimeProvenanceJson + && file(campaign.runtimeProvenanceJson).isFile() + ? new groovy.json.JsonSlurper().parse( + file(campaign.runtimeProvenanceJson)) : [:] + def expectedLimitedRcPolicy = [ + mode: 'RC_WITH_KNOWN_PERFORMANCE_LIMITATION', + exactRelease: '3.0.0-rc.1', + decision: 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION', + performanceReleaseBlocking: false, + stableReleaseEligible: false, + nonPerformanceGatesRequired: true, + explicitWorkflowOptInRequired: true + ] + boolean limitedRcPolicy = version.toString() == '3.0.0-rc.1' + && evidence.release == version.toString() + && evidence.releasePolicy == expectedLimitedRcPolicy + boolean latencyExceptionOptIn = providers.gradleProperty( + 'allowRound13LatencyException').orNull == 'true' + boolean normalLatencyDecision = evidence.verdict == 'PASS' + && publishableLatency.contains( + evidence.status.playgroundLatencyReady) + && evidence.status.publicRcReady == 'PASS' + && publishableLatency.contains(campaign.status) + && campaignProvenance.candidate?.implementationHead + == evidence.source.candidateCommit + && campaignProvenance.candidate?.worktreeStatusSha256 + == java.security.MessageDigest.getInstance('SHA-256') + .digest(new byte[0]).encodeHex().toString() + && campaign.comparison == 'SAME_MACHINE_INTERLEAVED_AB' + && campaign.requiredSamples >= 30 + && campaign.measuredSamples >= campaign.requiredSamples + && [campaign.runtimeMarkdown, campaign.runtimeJson, + campaign.runtimeProvenanceJson].every { + it instanceof String && file(it).isFile() + } + && campaign.pendingReason == null + && evidence.proofs.every { it.status == 'PASS' } + boolean limitedLatencyDecision = latencyExceptionOptIn + && limitedRcPolicy + && evidence.verdict + == 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION' + && evidence.status.playgroundLatencyReady + == 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION' + && evidence.status.publicRcReady + == 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION' + && campaign.status == 'PENDING_VERIFICATION' + && campaign.comparison == 'SAME_MACHINE_INTERLEAVED_AB' + && campaign.requiredSamples >= 30 + && campaign.measuredSamples == 0 + && campaign.runtimeMarkdown == null + && campaign.runtimeJson == null + && campaign.runtimeProvenanceJson == null + && campaign.pendingReason instanceof String + && !campaign.pendingReason.isBlank() + && evidence.proofs.every { + it.status == 'PASS' + || (it.id + == 'five-occurrence-host-versus-frozen-time' + && it.status == 'PENDING_VERIFICATION') + } + def finalizedEvidenceScope = evidence + if (limitedLatencyDecision) { + finalizedEvidenceScope = new LinkedHashMap(evidence) + finalizedEvidenceScope.status = evidence.status.findAll { + key, ignored -> key != 'playgroundLatencyReady' + } + finalizedEvidenceScope.performance = new LinkedHashMap( + evidence.performance) + finalizedEvidenceScope.performance.remove('round13Campaign') + finalizedEvidenceScope.proofs = evidence.proofs.findAll { + it.id != 'five-occurrence-host-versus-frozen-time' + } + } + File archiveReceiptFile = file( + 'build/reports/round13/source-archive-verification.json') + def archiveReceipt = archiveReceiptFile.isFile() + ? new groovy.json.JsonSlurper().parse(archiveReceiptFile) + : [:] + boolean archiveReceiptMatches = archiveReceipt.schemaId + == 'blue-coordination-round13-source-archive-verification-v1' + && archiveReceipt.archiveName == sourceArchive.name + && archiveReceipt.archiveSha256 == sourceArchiveHash + && archiveReceipt.dependencyMode == 'published-artifact' + && archiveReceipt.extractedConfiguration == 'PASS' + && archiveReceipt.focusedTestsStatus == 'PASS' + && archiveReceipt.publishedArtifactSmokeBuild == 'PASS' + if (evidence.schemaVersion != '4.1.0' + || evidence.profile + != 'ROUND13_PLAYGROUND_FIVE_OCCURRENCE' + || evidence.evidenceState != 'FINAL' + || !(normalLatencyDecision || limitedLatencyDecision) + || !(evidence.source.candidateCommit ==~ sha1Pattern) + || !(testedCommitIsAncestor || testedSourceStillExact) + || evidence.source.binding != 'CANDIDATE_COMMIT' + || evidence.source.worktree != 'CLEAN' + || evidence.source.dirtyReason != null + || !actualStatus.isEmpty() + || evidence.executionBinding.kind + != 'CANDIDATE_COMMIT_EXECUTION' + || evidence.executionBinding.candidateCommit + != evidence.source.candidateCommit + || evidence.executionBinding.mainSourceManifestSha256 + != evidence.source.mainSourceManifestSha256 + || evidence.executionBinding.reason != null + || evidence.status.temporalArchitectureReady != 'PASS' + || evidence.status.inMemoryEngineWorkingReady != 'PASS' + || evidence.status.playgroundCoreReady != 'PASS' + || evidence.status.providerBackedReady != 'OUT_OF_SCOPE' + || evidence.status.mandateAgentReady != 'OUT_OF_SCOPE' + || evidence.tests.executionStatus != 'PASS' + || evidence.tests.failures != 0 + || evidence.tests.errors != 0 + || evidence.tests.skipped != 0 + || evidence.tests.suites.any { + it.status != 'PASS' || it.failures != 0 + || it.errors != 0 || it.skipped != 0 + } + || evidence.shape.status != 'PASS' + || evidence.artifacts.status != 'PASS' + || !artifactHashesMatch + || evidence.runtimes.any { it.status != 'PASS' } + || evidence.structuralEvidence.status != 'PASS' + || evidence.structuralEvidence.requiredZeroCounters.any { + key, value -> value != 0 + } + || evidence.sourceArchive.extractedConfiguration != 'PASS' + || evidence.sourceArchive.focusedTestsStatus != 'PASS' + || evidence.sourceArchive.publishedArtifactSmokeBuild != 'PASS' + || evidence.sourceArchive.verificationReceipt.path + != 'build/reports/round13/source-archive-verification.json' + || evidence.sourceArchive.checksum.mode + != 'DETACHED_SHA256_SIDECAR' + || evidence.sourceArchive.checksum.path + != 'build/distributions/' + sourceArchive.name + '.sha256' + || evidence.sourceArchive.checksum.digest != null + || evidence.sourceArchive.pendingReason != null + || !archiveReceiptMatches + || !detachedHashMatches + || evidence.publicationEvidence.status != 'PASS' + || !(evidence.publicationEvidence.durationSeconds + instanceof Number) + || !evidence.blockers.empty + || containsUnfinalized(finalizedEvidenceScope) + || (normalLatencyDecision + && report.contains('PENDING_VERIFICATION')) + || report.contains('ROUND13_INTERIM_VERIFICATION:') + || (normalLatencyDecision && !report.contains( + 'ROUND13_FINAL_VERIFICATION: PASS')) + || (limitedLatencyDecision && !report.contains( + 'ROUND13_FINAL_VERIFICATION: ' + + 'PASS_WITH_KNOWN_PERFORMANCE_LIMITATION'))) { + throw new GradleException( + 'Canonical Round 13 evidence does not permit staging') + } + } +} + +tasks.register('stageRelease') { + group = 'publishing' + description = 'Builds the verified Maven Central staging repository.' + dependsOn 'releaseCheck', round13Readiness, + 'publishMavenJavaPublicationToStagingRepository' +} + +tasks.named('publishMavenJavaPublicationToStagingRepository') { + dependsOn round13Readiness +} + +if (localDependencies) { + File localBexCheckout = file(providers.gradleProperty( + 'blueBexCompositePath').getOrElse('../blue-bex-java')) + File localRepositoryCheckout = file(providers.gradleProperty( + 'blueRepositoryCompositePath') + .getOrElse('../blue-repository-java')) + def localSourceInputs = tasks.register('verifyLocalSourceInputs') { + group = 'verification' + description = 'Verifies the exact local Repository, BEX, and Language inputs.' + inputs.files('gradle/bex-source.lock', + 'gradle/repository-source.lock') + doLast { + def readLock = { File lock -> + lock.readLines('UTF-8') + .findAll { !it.startsWith('#') && it.contains('=') } + .collectEntries { line -> + int separator = line.indexOf('=') + [(line.substring(0, separator)): + line.substring(separator + 1)] + } + } + def gitBytes = { File root, String... arguments -> + def command = ['git', '-C', root.absolutePath] + command.addAll(arguments as List) + Process process = new ProcessBuilder(command).start() + byte[] stdout = process.inputStream.bytes + String stderr = process.errorStream.getText('UTF-8') + if (process.waitFor() != 0) { + throw new GradleException( + "Git failed in ${root}: ${stderr}") + } + stdout + } + def sha256 = { byte[] bytes -> + java.security.MessageDigest.getInstance('SHA-256') + .digest(bytes).encodeHex().toString() + } + def bexLock = readLock(file('gradle/bex-source.lock')) + def repositoryLock = readLock( + file('gradle/repository-source.lock')) + File bex = localBexCheckout + File repository = localRepositoryCheckout + File language = new File(repository, '../blue-language-java') + .canonicalFile + String bexHead = new String( + gitBytes(bex, 'rev-parse', 'HEAD'), 'UTF-8').trim() + String repositoryHead = new String( + gitBytes(repository, 'rev-parse', 'HEAD'), 'UTF-8').trim() + String languageHead = new String( + gitBytes(language, 'rev-parse', 'HEAD'), 'UTF-8').trim() + if (bexHead != bexLock.commit + || repositoryHead != repositoryLock.baseCommit + || languageHead != repositoryLock.languageCommit) { + throw new GradleException('Local dependency commit drift') + } + if (new String(gitBytes(bex, 'status', '--porcelain'), + 'UTF-8').trim() + || new String(gitBytes(language, 'status', '--porcelain'), + 'UTF-8').trim()) { + throw new GradleException( + 'Pinned BEX and Language inputs must be clean') + } + byte[] repositoryDiff = gitBytes(repository, 'diff', '--binary', + 'HEAD', '--', 'build.gradle', 'settings.gradle', + '.cz.toml', 'src/main/java', 'src/main/resources') + if (sha256(repositoryDiff) + != repositoryLock.workspaceDiffSha256) { + throw new GradleException( + 'Local Repository production diff fingerprint drift') + } + logger.lifecycle('Local source inputs match pinned fingerprints.') + } + } + tasks.named('releaseCheck') { + dependsOn localSourceInputs + } + + def localPrerequisites = tasks.register( + 'stageLocalPrerequisiteArtifacts') { + group = 'publishing' + description = 'Stages source-built prerequisites for local artifact verification.' + dependsOn gradle.includedBuild('blue-repository-java').task(':jar') + dependsOn gradle.includedBuild('blue-bex-java') + .task(':blue-bex-core:jar') + dependsOn gradle.includedBuild('blue-bex-java') + .task(':blue-bex-contracts:jar') + inputs.files( + fileTree(new File(localRepositoryCheckout, 'build/libs')) { + include 'blue-repo-java-*-SNAPSHOT.jar' + exclude '*-sources.jar', '*-javadoc.jar' + }, + fileTree(new File(localBexCheckout, + 'blue-bex-core/build/libs')) { + include 'blue-bex-core-*-SNAPSHOT.jar' + exclude '*-sources.jar', '*-javadoc.jar' + }, + fileTree(new File(localBexCheckout, + 'blue-bex-contracts/build/libs')) { + include 'blue-bex-contracts-*-SNAPSHOT.jar' + exclude '*-sources.jar', '*-javadoc.jar' + }) + outputs.dir(layout.buildDirectory.dir('local-prerequisites')) + doLast { + def targetRoot = layout.buildDirectory + .dir('local-prerequisites').get().asFile + if (targetRoot.exists() && !targetRoot.deleteDir()) { + throw new GradleException( + "Cannot refresh generated artifacts at ${targetRoot}") + } + copy { + from fileTree(new File( + localRepositoryCheckout, 'build/libs')) { + include 'blue-repo-java-*-SNAPSHOT.jar' + exclude '*-sources.jar', '*-javadoc.jar' + }.singleFile + into new File(targetRoot, + 'blue/repo/blue-repo-java/3.0.0-rc.21') + rename { 'blue-repo-java-3.0.0-rc.21.jar' } + } + copy { + from fileTree(new File(localBexCheckout, + 'blue-bex-core/build/libs')) { + include 'blue-bex-core-*-SNAPSHOT.jar' + exclude '*-sources.jar', '*-javadoc.jar' + }.singleFile + into new File(targetRoot, + 'blue/bex/blue-bex-core/1.1.0-rc.3') + rename { 'blue-bex-core-1.1.0-rc.3.jar' } + } + copy { + from fileTree( + new File(localBexCheckout, + 'blue-bex-contracts/build/libs')) { + include 'blue-bex-contracts-*-SNAPSHOT.jar' + exclude '*-sources.jar', '*-javadoc.jar' + }.singleFile + into new File(targetRoot, + 'blue/bex/blue-bex-contracts/1.1.0-rc.3') + rename { 'blue-bex-contracts-1.1.0-rc.3.jar' } + } + } + } + tasks.named('publishToMavenLocal') { + dependsOn localPrerequisites + } +} + +tasks.matching { + it.name in ['jreleaserDeploy', + 'jreleaserUpload', 'jreleaserRelease'] +}.configureEach { + dependsOn tasks.named('stageRelease') +} + +tasks.named('check') { + dependsOn 'validateProductionShape', 'verifyPublicApiBoundary', + 'verifyArtifactContents', 'integrationTest', 'consumerTest', + 'verifyTestArchitecture' } diff --git a/docs/architecture/compact-engine.md b/docs/architecture/compact-engine.md new file mode 100644 index 0000000..d32b2b1 --- /dev/null +++ b/docs/architecture/compact-engine.md @@ -0,0 +1,43 @@ +# Compact engine architecture + +The supported runtime has three layers: + +1. `blue.coordination.api` is the small immutable application boundary. +2. `blue.coordination.internal` owns one exact journal, whole-object store, + document store, Channel route index, Process Embedded graph, sequential + coordinator, processor, and document-local commit boundary. +3. `blue.coordination.processor` retains the semantic Contracts/BEX workflow + closure used by the compact runtime and advanced processor registration. + +Append validates the Timeline/provider/actor envelope, establishes one exact +Timeline Entry BlueId, stores the entry once, and publishes its journal +coordinates only after success. It records no recipients and invokes no +document processor. + +The sequential drain coordinator owns processing order. It obtains source +completeness evidence, selects the next canonical eligible entry, freezes its +pre-entry direct targets from the active Channel index, and processes one +dependency-aware entry frame. Descendants finish their complete entry-caused +epoch segment before an ancestor applies it, and ancestor direct handling runs +only after those applications. No caller-selected entry may jump the queue. + +The only dependency topology is derived from effective `Process Embedded.paths` +and `Process Embedded.collectionPaths`. `EmbeddingBinding` is immutable +topology and activation identity. Parent progress is a separate +`EmbeddedEpochCursor`; changing a cursor does not mutate an earlier graph +snapshot or its generation. One attachment transition owns one extendable +catch-up barrier, including nested prerequisites. + +Initialization, external handling, and parent synchronization all cross the +frozen processor boundary. Parent synchronization uses an exact private +`EmbeddedEpochInput` carrying old/new child identity and indexed event +occurrences; it is never appended as a synthetic Timeline Entry. One document +transition atomically publishes state, epoch, events, graph/subscription deltas, +delivery or cursor progress, idempotency receipt, and commit companion. A child +and its parents are separate commits, so retry can resume a missing parent +application without rerunning the child. + +Ordinary nodes and requests are never sent through a generic splitter. The +layout compiler retains one whole root shell and one whole object for each +effective managed Process Embedded document. The semantic root remains exact +and can be reconstructed from those content-addressed whole objects. diff --git a/docs/coordination-v2-layered-delivery-plan.md b/docs/coordination-v2-layered-delivery-plan.md deleted file mode 100644 index cdbc4c6..0000000 --- a/docs/coordination-v2-layered-delivery-plan.md +++ /dev/null @@ -1,1397 +0,0 @@ -# Coordination V2 Layered Delivery Plan - -Status: proposed architecture and ordered implementation specification - -Audience: maintainers of `blue-repository`, `blue-repository-java`, -`blue-language-java`, `blue-coordination-java`, and the Blue Contracts and -Coordination specifications - -## Objective - -Coordination V2 is a layered contract and runtime change. It is not one feature -and must not be delivered as one pull request. The implementation order is: - -```text -repository type contract - -> generated repository Java artifacts - -> generic Blue Contracts runtime capabilities - -> Coordination channel and workflow capabilities - -> end-to-end proof - -> normative specification consolidation -``` - -Lower layers must be complete and published before an upper layer consumes -them. Independent changes in the same repository remain separate tasks. In -particular, preserving the Processing Event and supporting routed channel -delivery are two different `blue-language-java` changes, and exposing a BEX -binding and executing Terminate Processing are two different -`blue-coordination-java` changes. - -This document defines Tasks 0 through 8. Each task is one independently -reviewable deliverable with its own design, implementation plan, test plan, -review hints, and strict Definition of Done. - -## Ordered Task Map - -| Task | Owning repository/layer | Deliverable | Entry gate | -| --- | --- | --- | --- | -| 0 | `blue-repository`, `blue-repository-java` | Freeze Coordination V2 types and publish generated Java RC | None | -| 1 | `blue-language-java` | Preserve the immutable Processing Event for one PROCESS run | Task 0 delivery order gate | -| 2 | `blue-language-java` | Add generic routed external-channel delivery | Task 1 delivery order gate | -| 3 | `blue-coordination-java` | Implement Timeline V2 matching and checkpoint semantics | Tasks 0 and 2 published artifacts | -| 4 | `blue-coordination-java` | Route Operation Requests to their effective handler channel | Tasks 2 and 3 | -| 5 | `blue-coordination-java` | Expose `$binding:processingEvent` to Coordination BEX | Tasks 1 and 4 delivery order gate | -| 6 | `blue-coordination-java` | Execute `Coordination/Terminate Processing` | Task 5; Task 4 for full Mandate acceptance | -| 7 | `blue-spec` plus conformance runners | Specify routed delivery in Blue Contracts | Tasks 2 through 6 proven end to end | -| 8 | `blue-spec` Coordination package | Publish Coordination 2.0 specification and fixtures | Task 7 and V2 end-to-end proof | - -Tasks 1 and 2 are technically independent core capabilities, but the delivery -sequence remains fixed so one released language baseline is consumed by the -Coordination phase. Tasks 3 and 5 are also not direct code dependencies; they -remain separate and ordered because the plan completes channel/routing -foundations before workflow-host behavior. - -```mermaid -flowchart TD - T0["Task 0: Types and repository Java RC"] - T1["Task 1: Core Processing Event context"] - T2["Task 2: Core routed delivery"] - T3["Task 3: Timeline V2 runtime"] - T4["Task 4: Operation Request routing"] - T5["Task 5: BEX processingEvent binding"] - T6["Task 6: Terminate Processing step"] - T7["Task 7: Blue Contracts specification"] - T8["Task 8: Coordination 2.0 specification"] - - T0 --> T1 --> T2 --> T3 --> T4 --> T5 --> T6 --> T7 --> T8 - T1 -. direct dependency .-> T5 - T2 -. direct dependency .-> T4 -``` - -## Delivery Rules - -1. One task means one focused delivery unit. It normally maps to one pull - request. A task that necessarily spans repositories, such as Task 0, uses - linked pull requests with explicit artifact handoff and is complete only - when every linked change passes. Independent capabilities are never merged - merely to reduce the pull-request count. -2. A task does not absorb an independent change merely because the same file is - nearby. -3. Final verification uses published dependency coordinates. Composite builds - and Maven Local are development aids, not release evidence. -4. Every behavior change has readable fixtures, focused unit tests, integration - tests at the owning boundary, negative cases, and regression coverage. -5. Changed control flow targets 100% line and branch coverage. Overall project - coverage must not decrease. -6. Timing tests do not prove laziness or ordering. Use counters, allocation - instrumentation, deterministic fixtures, or explicit test seams. -7. No task may silently redefine gas, checkpoint, event, or termination - semantics owned by a lower layer. -8. A task that discovers a required lower-layer change stops and raises a new - task or blocker. It does not hide that change in an upper-layer pull request. - -## Release Gates - -- **Contract gate:** Task 0 ends only when RC 4 resolves from the release - repository and matches the tested aggregate. -- **Language gate:** Tasks 1 and 2 use separate pull requests. After both pass, - publish one language artifact containing exactly those core capabilities. -- **Coordination gate:** Tasks 3 through 6 use separate pull requests and consume - only published lower-layer artifacts. Publish the Coordination runtime after - all four pass together. -- **Specification gate:** Tasks 7 and 8 begin from proven released behavior and - complete before any stable Coordination V2 claim. - -## Shared Vocabulary - -| Term | Meaning | -| --- | --- | -| Processing Event | Original generic Blue node supplied to `PROCESS(document, event)`. | -| Current event | Channelized payload currently delivered to a handler; exposed by `event()`, `$event`, and `$binding:event`. | -| Accepting channel | External channel candidate that accepted the Processing Event. | -| Checkpoint channel | Channel key whose checkpoint gates and records one accepted delivery; normally the accepting channel. | -| Effective handler channel | Channel key used for handler discovery after an accepted routed delivery. | -| Logical delivery | One handler-set invocation that may have been accepted through more than one source channel. | - -`processingEvent` is the Blue Contracts term and the BEX binding name. Core -Java uses `processEventSource`, `hasProcessEvent()`, and -`frozenProcessEvent()`. No `triggeringEntry` or `triggeringEvent` alias is -introduced. `$event` remains the current channelized payload. - -## Work Outside This Plan - -The following changes are required for production rollout but belong to -separate plans and repositories: - -- MyOS Operation Request production currently writes `allowNewerVersion` and - assumes the operation's target channel is also the caller's append channel. - Request production and source-channel selection are separate MyOS tasks. -- `requireExactDocumentVersion` is feeder eligibility against the current - target document state. It is not a Coordination matcher. MyOS feeder support - requires its own task and tests. -- Feeder/provider compilation and execution of Mandate validation BEX is a - separate security-sensitive design. -- PayNote and Payment migration to required `Response.inResponseTo` remains a - separate consumer project. -- Generic Message/Response consumer migration outside V2 fixtures is not - hidden in these runtime tasks. -- Runtime enforcement of `Coordination/Actor Policy` is not added here. Task 0 - restores source attribution and Task 3 preserves it; policy execution needs - its own design if it is to become a supported runtime capability. - -These are named blockers, not implicit responsibilities of Tasks 0 through 8. -A production claim that includes exact-version or cross-principal Mandate -authorization cannot be made until the corresponding external work is done. - ---- - -# Task 0: Freeze Types and Publish Repository Java RC - -## Goal - -Establish one coherent Coordination V2 type contract in `blue-repository`, -regenerate `BlueRepository.blue` without treating the previous aggregate as a -compatibility baseline, generate Java models in `blue-repository-java`, and -publish `blue.repo:blue-repo-java:3.0.0-rc.4`. - -Task 0 is the only task allowed to change repository type definitions in this -plan. Later tasks consume the published contract and do not carry local model -copies. - -## Design - -The release must contain these contract decisions: - -- `Timeline Entry` has required `timeline`, `sequence`, `timestamp`, `actor`, - and `message`. -- `sequence` is strictly increasing and authoritative within one timeline. -- timestamps may repeat; they support cross-timeline ordering and completeness - windows but do not establish a unique total intra-timeline order. -- optional `source` records provider-authenticated submission provenance. -- optional `onBehalfOf` carries Mandate-backed authority for feeder validation. -- `Timeline Channel` has required `timeline` and `actor` bindings. -- Composite and All Timelines channels have no actor or timeline of their own; - they are union channels over Timeline Channel children. -- `Operation Request.channel` is the required effective target channel. -- `requireExactDocumentVersion` is described as feeder eligibility. -- `Operation.channel` is the effective handler channel, not necessarily the - accepting source channel. -- `Message.inResponseTo` remains temporarily untyped with a precise TODO that - the expected type is `Coordination/Message` and the blocker is generator - cyclic-dependency support. -- `Response.inResponseTo` is a required `Coordination/Request`. -- Mandate BEX reads `$binding:processingEvent`, uses - `processingEventTimestamp`, and contains no triggering alias or hardcoded - Timeline Entry BlueId. -- Mandate includes the generated `Coordination/Terminate Processing` step. -- no local `Blue/BEX Program` type is defined; BEX program shape is described - by convention and consumed as a known runtime value. -- removed Permission types and their invalid/error variants do not reappear. - -Breaking stable definitions require deleting the old generated -`BlueRepository.blue` before regeneration. The source `.blue` files are the -contract; the aggregate is generated output. - -`blue-repository-java` must generate from that exact aggregate. Generated -models, constants, manifest, resources, type aliases, and historical metadata -must all describe the same repository version. No hand-authored generated Java -patch is allowed. - -## Implementation Plan - -1. Audit every changed V2 source type against the approved architecture and - check descriptions for ownership, optionality, equality, and runtime-layer - claims. -2. Delete the old `BlueRepository.blue` and run the repository generator in - write mode. -3. Run generator check mode from the new aggregate and confirm the RepoBlueId - is stable across a second generation. -4. Point `blue-repository-java` generation at the exact local aggregate using - `-PblueRepositorySource`. -5. Run `generateRepositorySources`, review all generated model/API changes, and - run `verifyGeneratedSources`. -6. Add or update generated-model contract tests for every field used by Tasks 3 - through 6. -7. Run the full repository-Java build and a clean external consumer smoke test. -8. Publish `3.0.0-rc.4`, resolve it from the release repository, and compare the - published resource/manifest with the locally verified artifact. - -## Test Plan - -### Repository Generator Cases - -1. `regeneratesFromMissingAggregate` - - A deleted aggregate is recreated successfully from source definitions. - -2. `secondGenerationIsByteStable` - - A second check/write cycle produces no diff and the same RepoBlueId. - -3. `allQualifiedReferencesResolve` - - Every non-primitive reference resolves, including Mandate and Coordination - cycles supported by the generator. - -4. `messageCycleWorkaroundIsExplicit` - - `Message.inResponseTo` is untyped and its TODO names the expected type and - exact generator limitation. - -5. `repositoryContainsNoLocalBexProgramType` - - Neither `BEX Program` nor `Blue/BEX Program` is declared locally. - -6. `removedPermissionTypesStayRemoved` - - Source and aggregate searches contain none of the deleted type names. - -7. `mandateProgramUsesProcessingEventOnly` - - Embedded source contains `processingEvent` and - `processingEventTimestamp`; no triggering aliases exist. - -### Generated Java Cases - -1. `timelineEntryHasV2Fields` - - Generated accessors have exact types and optionality for timeline, - sequence, timestamp, actor, source, onBehalfOf, and message. - -2. `timelineChannelHasTimelineAndActor` - - No legacy `timelineId` accessor is generated for the V2 type. - -3. `operationRequestHasRequiredEffectiveChannel` - - Generated model exposes channel, document, exact-version flag, and request. - -4. `terminateProcessingModelResolves` - - Qualified name, BlueId annotation, optional reason, and subtype relation - are correct. - -5. `repositoryResourcesMatchManifest` - - Every generated type BlueId and resource path agrees with the manifest. - -6. `releasedArtifactWorksInCleanConsumer` - - A temporary Gradle project resolves RC 4 remotely, loads the repository, - resolves the critical types, and deserializes representative YAML. - -### Quality Gates - -- `git diff --check` passes in both repositories. -- Repository generator check mode passes after generation. -- `./gradlew verifyGeneratedSources` and `./gradlew clean build` pass. -- Generated output is reviewed by qualified type and behavior, not accepted as - an opaque bulk diff. - -## Code Review Hints - -Reviewers should verify: - -- descriptions do not assign feeder work to the processor or processor work to - the provider; -- required versus optional fields match the architecture; -- sequence and timestamp semantics are not conflated; -- union channels do not gain their own actor; -- source attribution is passive provenance, not authority; -- effective target channel and accepting source channel remain distinct; -- the aggregate was rebuilt from a missing baseline; -- generated Java sources were not manually edited; -- the published artifact is exactly the tested artifact; -- unrelated PayNote/Payment migrations are absent. - -## Strict Definition of Done - -- [ ] All approved V2 source definitions and descriptions are internally - consistent. -- [ ] `BlueRepository.blue` regenerates deterministically from a missing file. -- [ ] Generator check mode reports the aggregate up to date. -- [ ] All critical V2 types resolve by qualified name and BlueId. -- [ ] Generated Java classes expose the exact V2 field surface. -- [ ] Embedded Mandate BEX uses `processingEvent` only. -- [ ] `TerminateProcessing` is present in generated Java and resources. -- [ ] No local BEX Program or removed Permission type exists. -- [ ] Repository-Java generation verification and full build pass. -- [ ] A clean consumer resolves and exercises published `3.0.0-rc.4`. -- [ ] The pull request contains no language or Coordination runtime changes. - ---- - -# Task 1: Preserve Processing Event Context in Core - -## Goal - -Add one generic, immutable, execution-scoped view of the original Processing -Event to `blue-language-java`, without changing current-event, channel, -checkpoint, queue, or gas behavior. - -This task provides only the core context API. It does not add a BEX binding. - -## Design - -Blue Contracts already names the input to `PROCESS(document, event)` the -Processing Event and requires it to be read-only. `ProcessorEngine.Execution` -must retain that original input for the lifetime of the PROCESS run. - -Normative Java names: - -```java -private final Node processEventSource; - -public boolean hasProcessEvent(); -public FrozenNode frozenProcessEvent(); -``` - -`processEventSource` is nullable for explicit INITIALIZE. Both PROCESS entry -points retain the original preprocessed event reference. Implicit -initialization inside PROCESS uses the same `Execution` and therefore the same -Processing Event. - -The immutable snapshot is lazy and memoized: - -```text -unused: retain one O(1) read-only Node reference -first access: freeze O(size of Processing Event) -later access in same run: return the same FrozenNode instance -``` - -Use an explicit state that distinguishes uninitialized, absent, ready, and -failed snapshot outcomes. A failed snapshot is not retried repeatedly. -`hasProcessEvent()` must never trigger freezing. - -`ProcessorExecutionContext` exposes narrow delegates only. It does not expose -the mutable source reference. Existing `event()` remains the current -channelized payload and continues to use existing cloning/protection behavior. - -The lazy design relies on the existing synchronous PROCESS contract: callers -must not mutate the input event while processing is active. Supporting -concurrent caller mutation would require an eager copy and is not part of this -task. - -## Implementation Plan - -1. Add the nullable source and memoized snapshot state to - `ProcessorEngine.Execution`. -2. Pass the Processing Event into both PROCESS construction paths and null into - explicit INITIALIZE paths. -3. Implement one clearly synchronized snapshot slow path. -4. Add `hasProcessEvent()` and `frozenProcessEvent()` to - `ProcessorExecutionContext` with Javadoc distinguishing them from `event()`. -5. Add a narrow package-private test seam that counts snapshot construction - without exposing production mutability. -6. Add focused execution-context tests and broad processor regressions. -7. Run allocation/performance checks for unused and used access. -8. Publish a language artifact after Task 2 is also complete; do not expose a - sibling-source dependency as final evidence. - -## Test Plan - -1. `explicitInitializeHasNoProcessEvent` - - Presence is false and frozen value is null. - -2. `processRetainsOriginalEvent` - - Presence is true and the snapshot equals the original preprocessed input. - -3. `implicitInitializationSharesProcessEvent` - - Initialization lifecycle handlers in PROCESS see the root input. - -4. `directAndTriggeredHandlersShareOneSnapshot` - - Current events differ; `frozenProcessEvent()` is the same instance. - -5. `multiHopTriggeredHandlersKeepRootContext` - - Two or more emitted-event hops retain the original event. - -6. `embeddedScopesKeepRootContext` - - Root and child scopes share Processing Event context for one run. - -7. `bridgedHandlersKeepRootContext` - - Bridge payload behavior is unchanged while the root input survives. - -8. `channelAdaptationDoesNotReplaceProcessEvent` - - A projected channel payload becomes `event()` but not the root context. - -9. `handlerEventMutationCannotMutateProcessEvent` - - Mutating a handler-local event copy has no effect on the frozen root. - -10. `separateProcessRunsDoNotLeakContext` - - Reusing a processor cannot expose an earlier invocation's input. - -11. `hasProcessEventDoesNotFreeze` - - Repeated presence checks leave the freezer invocation count at zero. - -12. `unusedContextHasConstantAllocation` - - Small and large events produce event-size-independent retained overhead. - -13. `firstAccessFreezesOnce` - - Many contexts and calls invoke the freezer once. - -14. `snapshotFailureIsStable` - - Failure category/message is stable and traversal is not retried. - -15. `currentProcessorBehaviorIsUnchanged` - - Initialization, external channels, checkpoints, triggers, bridges, - embedded scopes, gas, and termination suites remain green. - -## Code Review Hints - -Reviewers should verify: - -- state belongs to `Execution`, not a scope, queue, handler, or static holder; -- no Coordination type or BlueId appears in core; -- no mutable source accessor exists; -- `hasProcessEvent()` is genuinely O(1); -- snapshot creation is lazy, memoized, and failure-safe; -- explicit and implicit initialization differ correctly; -- `event()` and all channelized payload behavior are untouched; -- tests prove laziness using counters or allocation evidence, not elapsed time; -- no BEX dependency or binding is introduced. - -## Strict Definition of Done - -- [ ] Core exposes exactly `hasProcessEvent()` and `frozenProcessEvent()`. -- [ ] The retained field is generic and named `processEventSource`. -- [ ] Explicit INITIALIZE has no Processing Event. -- [ ] Every handler in one PROCESS run can reach the same immutable snapshot. -- [ ] Unused context performs no event-sized traversal or allocation. -- [ ] Used context freezes at most once. -- [ ] Direct, triggered, multi-hop, bridge, embedded, mutation, and cross-run - tests pass. -- [ ] Existing current-event, channel, checkpoint, gas, and termination behavior - remains unchanged. -- [ ] Changed code has 100% line and branch coverage and the project clean build - passes. -- [ ] No routed-delivery or Coordination BEX code is included. - ---- - -# Task 2: Add Routed External-Channel Delivery to Core - -## Goal - -Allow a trusted external Channel processor to accept a Processing Event through -one channel while dispatching handlers bound to a different same-scope channel, -without transferring checkpoint ownership or executing the same logical route -more than once. - -This is a generic Blue Contracts capability. It contains no Operation Request, -Timeline, actor, or Mandate knowledge. - -## Design - -Current `ChannelRunner` uses one channel key for acceptance, checkpointing, and -handler discovery. `ChannelDelivery` already separates a possible -`checkpointKey`; it must additionally support: - -```text -handlerChannelKey optional same-scope effective handler channel -logicalDeliveryKey optional deterministic deduplication key -``` - -Existing factories and deliveries remain source-compatible. If -`handlerChannelKey` is absent, handlers are discovered under the accepting -channel exactly as today. If `logicalDeliveryKey` is absent, no new -cross-candidate deduplication is implied. - -For a routed delivery: - -1. the accepting Channel processor validates and accepts the original event; -2. checkpoint newness and duplicate checks run against the accepting or - explicitly supplied checkpoint key; -3. core validates that the handler channel exists as a supported channel in the - same `ContractBundle` and scope; -4. core discovers handlers under the handler channel without re-evaluating that - channel as an external source candidate; -5. `HandlerMatchContext.channelKey()` is the handler channel; -6. handler `$event` remains the delivery payload selected by the accepting - channel; -7. a successful logical route is recorded for this `Execution` only; -8. later eligible source candidates with the same logical route skip handler - execution but may persist their own checkpoints after the shared delivery - succeeded. - -The deduplication identity is: - -```text -(scopePath, Processing Event identity, handlerChannelKey, logicalDeliveryKey) -``` - -The Processing Event identity is computed by core using the existing -checkpoint identity machinery. A Channel processor supplies only a stable -domain route key. It must not duplicate the full event hash algorithm. - -Logical delivery state is marked successful only after handlers and buffered -effects complete and the scope remains active. Fatal or graceful termination -does not mark success and does not advance later source checkpoints. A stale -source candidate neither invokes handlers nor advances its checkpoint, even if -another source delivered the same logical route. - -Gas remains deterministic: - -- each external candidate match and checkpoint evaluation is charged as today; -- one successful logical route pays handler discovery/execution/effect gas once; -- deduplicated source candidates do not pay a second handler overhead; -- no new BEX charge is introduced. - -## Implementation Plan - -1. Extend immutable `ChannelDelivery` API with routed-delivery metadata while - preserving current factories. -2. Preserve new fields through `ChannelEvaluation` and internal copy paths. -3. Add same-scope handler-channel validation to `ChannelRunner`. -4. Separate checkpoint key from handler-discovery key throughout delivery - execution. -5. Add execution-scoped successful logical-delivery tracking. -6. Define the exact point at which a route becomes successful. -7. Preserve current termination and checkpoint-persist ordering. -8. Add metrics for routed and deduplicated deliveries without unbounded labels. -9. Add conformance-style fixtures and focused unit/integration tests. -10. Run exact gas regression tests, mutation checks, and full build. -11. Publish a language release containing Tasks 1 and 2. - -## Test Plan - -### Compatibility Cases - -1. `ordinaryDeliveryUsesAcceptingChannelForHandlers` - - Every existing API path behaves byte-for-byte as before. - -2. `ordinaryDeliveryKeepsExistingCheckpointKey` - - No routed metadata changes checkpoint state or gas. - -3. `deliveryCopiesPreserveRoutingMetadata` - - Public accessors and internal copy paths retain exact values. - -### Routed Cases - -1. `routesToSameScopeHandlerChannel` - - Source channel accepts; only target-channel handlers run. - -2. `handlerContextReportsEffectiveChannel` - - Matchers observe the handler channel and original delivery payload. - -3. `sourceChannelOwnsCheckpoint` - - Target channel checkpoint is untouched. - -4. `explicitCheckpointKeyStillWins` - - Composite/custom channel checkpoint semantics remain supported. - -5. `unknownHandlerChannelTerminatesDeterministically` - - No handler or checkpoint runs/persists. - -6. `nonChannelTargetTerminatesDeterministically` - - A contract key that is not a supported Channel is rejected. - -7. `targetCannotEscapeCurrentScope` - - Embedded/root keys cannot route across scope boundaries. - -8. `targetChannelIsNotReevaluatedAsSource` - - Its external matcher and source checkpoint are not invoked. - -### Deduplication and Failure Cases - -1. `multipleSourcesInvokeLogicalRouteOnce` - - Two eligible candidates with the same route key execute one handler set. - -2. `successfulDuplicateSourcesAdvanceOwnCheckpoints` - - Both eligible source checkpoints record successful consumption. - -3. `staleDuplicateSourceDoesNotAdvance` - - A stale source remains unchanged even after another source succeeds. - -4. `differentLogicalKeysDoNotDeduplicate` - - Same event and target with distinct route keys invoke separately. - -5. `missingLogicalKeyPreservesLegacyMultipleDelivery` - - Core does not guess domain identity. - -6. `differentScopesDoNotDeduplicate` - - Identical keys in root and child are isolated. - -7. `handlerFailureMarksNoLogicalSuccess` - - No involved source checkpoint is persisted after fatal execution. - -8. `gracefulTerminationMarksNoLogicalSuccess` - - Existing no-checkpoint-on-termination behavior remains intact. - -9. `laterCandidateAfterSuccessfulRouteDoesNotChargeHandlerAgain` - - Exact gas and metrics prove one handler dispatch. - -10. `replayAfterCommittedCheckpointsRunsNothing` - - A later PROCESS invocation rejects the consumed event through source - checkpoints; execution-scoped dedup state does not leak. - -### Quality Gates - -- Exact gas totals are asserted for ordinary, routed, duplicate, stale, fatal, - and graceful cases. -- Deliberately remove route deduplication; the multiple-source test must fail. -- Deliberately use handler channel as checkpoint key; checkpoint ownership tests - must fail. -- Existing Blue Contracts conformance suite remains green. - -## Code Review Hints - -Reviewers should verify: - -- the core API is domain-neutral; -- accepting, checkpoint, and handler keys are never conflated; -- target validation is same-scope and must-understand; -- target external matching is not bypassed accidentally because it is not run - at all; route authority comes from the trusted accepting Channel processor; -- logical success is recorded only after handler effects succeed; -- duplicate source checkpoints advance only when their own newness gate passes; -- execution-scoped dedup state cannot leak between PROCESS calls; -- current factories and non-routed gas remain source/behavior compatible; -- no Coordination classes, type names, or BlueIds appear in core. - -## Strict Definition of Done - -- [ ] `ChannelDelivery` represents handler and logical-delivery routing without - breaking existing callers. -- [ ] Same-scope target validation is deterministic and tested. -- [ ] Checkpoint ownership remains with the source/checkpoint channel. -- [ ] Handler discovery and match context use the effective handler channel. -- [ ] Multiple eligible source channels execute one declared logical route. -- [ ] Failure, graceful termination, staleness, replay, and nested scopes have - explicit coverage. -- [ ] Ordinary delivery behavior and exact gas are unchanged. -- [ ] Routed gas and metrics are deterministic and bounded. -- [ ] Changed control flow has 100% line/branch coverage. -- [ ] Full build and existing conformance suites pass. -- [ ] A released language artifact containing Tasks 1 and 2 is available before - Task 3 begins. -- [ ] No Timeline or Operation Request implementation is included. - ---- - -# Task 3: Implement Timeline V2 Runtime Semantics - -## Goal - -Migrate `blue-coordination-java` Timeline channels from V1 `timelineId` and -timestamp recency to V2 timeline/actor identity and sequence-based checkpoint -semantics, including correct Composite and All Timelines union behavior. - -This task does not implement Operation Request routing or BEX host bindings. - -## Design - -`Timeline Channel` accepts a Timeline Entry only when: - -- the event is a conforming Timeline Entry; -- required timeline, actor, sequence, timestamp, and message are present and - correctly typed; -- channel timeline equals entry timeline under semantic Blue identity; -- channel actor equals entry actor under semantic Blue identity. - -Semantic identity must treat a pure BlueId reference and its equivalent -materialized value as equal. Pattern/subtype matching is not equality and must -not be substituted. - -Same-timeline newness is: - -```text -same full event identity -> duplicate -current.sequence > previous.sequence -> newer -current.sequence <= previous.sequence -> stale or equivocation -timestamp -> not used for same-timeline recency -``` - -Parse sequence as `BigInteger`; do not truncate to `long`. Timestamp remains -available for feeder cross-timeline ordering/completeness and domain lifecycle -timestamps. - -Composite and All Timelines channels are union candidates: - -- they have no actor or timeline of their own; -- child Timeline Channels provide eligibility predicates; -- several matching children produce one union delivery in deterministic - `(order, key)` order; -- the union owns its own checkpoint under the union key; -- child checkpoints used by direct subscriptions are independent and must not - gate the union; -- direct child and union handlers are different subscriptions and may both run. - -Optional source is preserved in the event payload. This task does not invent -Actor Policy execution. - -## Implementation Plan - -1. Update generated-model dependencies to RC 4 and the released language - artifact from Task 2. -2. Replace legacy timelineId extraction/matching in - `TimelineProviderSupport`, `TimelineChannelProcessor`, and event helpers. -3. Add one reusable semantic-identity helper using established Blue APIs. -4. Parse and compare sequence as `BigInteger`. -5. Keep full event identity duplicate checks in core checkpoints. -6. Remove timestamp-based same-timeline recency. -7. Refactor Composite and All Timelines evaluation to use children only for - eligibility and the union key for checkpointing. -8. Remove child-checkpoint coupling and define deterministic matching-child - metadata. -9. Migrate test builders, YAML fixtures, examples, and generated-model tests. -10. Run targeted suites, mutation checks, and full build. - -## Test Plan - -1. `matchingTimelineAndActorAccept` -2. `sameTimelineDifferentActorRejectsWithoutCheckpoint` -3. `sameActorDifferentTimelineRejectsWithoutCheckpoint` -4. `pureReferenceEqualsEquivalentMaterializedBinding` -5. `sameTypeDifferentContentDoesNotEqual` -6. `equalTimestampHigherSequenceAccepts` -7. `higherTimestampLowerSequenceRejects` -8. `lowerTimestampHigherSequenceUsesSequence` -9. `exactEventReplayIsDuplicate` -10. `differentContentAtCheckpointedSequenceRejectsAsEquivocation` -11. `sequenceBeyondLongRangeRemainsExact` -12. `missingTimelineRejectsWithoutCheckpoint` -13. `missingActorRejectsWithoutCheckpoint` -14. `missingOrInvalidSequenceRejectsWithoutCheckpoint` -15. `missingOrInvalidTimestampRejectsWithoutCheckpoint` -16. `missingMessageRejectsWithoutCheckpoint` -17. `optionalSourceSurvivesDeliveryUnchanged` -18. `compositeWithSeveralMatchingChildrenDeliversOnce` -19. `allTimelinesWithSeveralMatchingChildrenDeliversOnce` -20. `unionCheckpointIsIndependentFromChildCheckpoint` -21. `childCheckpointIsIndependentFromUnionCheckpoint` -22. `directChildAndUnionHandlersMayBothRun` -23. `matchingChildSelectionIsDeterministic` -24. `newUnionWithNoCheckpointCanBackfillIndependently` - -Use fixture names that state timeline, actor, timestamp, and sequence explicitly -so failures are readable. Deliberately restore timestamp recency; equal-time -higher-sequence tests must fail. Deliberately consult child checkpoints from a -union; independence tests must fail. - -## Code Review Hints - -Reviewers should verify: - -- equality uses Blue value identity, not type matching or Java object identity; -- no required field fails open; -- `BigInteger` survives every parsing/comparison path; -- timestamp is not consulted for same-timeline newness; -- full event identity still handles exact replay; -- unions have no actor and own their checkpoints; -- child checkpoint state cannot suppress a union delivery; -- source is preserved but not treated as authority; -- feeder ordering/completeness behavior is not moved into Coordination. - -## Strict Definition of Done - -- [ ] All V2 required Timeline fields are parsed and validated. -- [ ] Timeline and actor semantic equality is proven for reference/materialized - forms and negative cases. -- [ ] Same-timeline recency uses exact sequence only. -- [ ] Duplicate, stale, equivocation, and huge sequence cases pass. -- [ ] Composite/All unions deliver once and own independent checkpoints. -- [ ] Existing direct and embedded Timeline workflows are migrated and green. -- [ ] Changed code has 100% line/branch coverage; overall coverage does not - decrease. -- [ ] Full build passes against published RC 4 and language artifacts. -- [ ] No Operation Request routing, BEX binding, or termination step is included. - ---- - -# Task 4: Route Operation Requests to Effective Channels - -## Goal - -Use Task 2's generic routed-delivery primitive so a V2 Operation Request can be -accepted through an eligible source Timeline Channel and invoke handlers bound -to its required effective target channel exactly once. - -## Design - -For a Timeline Entry carrying `Coordination/Operation Request`: - -```text -accepting/checkpoint channel = Timeline channel whose timeline + actor match -effective handler channel = message.channel -handler payload = full Timeline Entry -logical delivery key = deterministic Operation Request route identity -``` - -The target channel is not re-evaluated as an external source. It is a same-scope -handler binding validated by core. Source eligibility was established by the -accepting Timeline Channel. Feeder validation remains responsible for Mandate -authority and exact document-version eligibility. - -The Coordination logical route key must be deterministic from immutable request -semantics, for example operation key and target channel, while core combines it -with Processing Event identity and scope. It must not include accepting channel -identity, or duplicate source bindings would fail to deduplicate. - -Non-Operation messages retain normal Timeline delivery. A direct request whose -source and target keys are equal uses the same routed path and semantics; do not -maintain two subtly different matchers. - -`OperationRequestMatcher` must: - -- require the operation name to equal the operation contract key; -- require request channel to equal the current effective handler channel; -- validate request payload against the declared request pattern; -- retain any explicit event pattern behavior; -- remove `allowNewerVersion` parsing and initialization-marker comparison; -- not implement `requireExactDocumentVersion`. - -Composite/All source candidates propagate the child's accepted route metadata -while retaining the union's checkpoint key. If a direct child and a union both -route the same request to the same target, core logical-delivery deduplication -executes the target handler set once while each eligible source subscription -keeps its own checkpoint semantics. - -## Implementation Plan - -1. Add V2 Operation Request extraction for bare requests and Timeline Entry - messages. -2. Have Timeline Channel evaluation create routed `ChannelDelivery` metadata - only after normal timeline/actor acceptance. -3. Propagate routes through Composite and All Timelines union evaluation. -4. Derive one stable logical route key independent of source binding. -5. Update `OperationRequestMatcher` for required request channel and effective - handler context. -6. Delete `allowNewerVersion`, initialization-marker, and stale imports/tests. -7. Keep `requireExactDocumentVersion` data passive inside the processor. -8. Update diagnostics and bounded metrics. -9. Add direct, cross-channel, union, failure, and replay fixtures. -10. Run targeted and full builds against published lower-layer artifacts. - -## Test Plan - -1. `directRequestRoutesToDeclaredChannel` -2. `crossChannelRequestRunsTargetOperation` -3. `sourceTimelineMismatchRejectsBeforeRouting` -4. `sourceActorMismatchRejectsBeforeRouting` -5. `requestChannelMustExistInSameScope` -6. `requestChannelMustEqualOperationHandlerChannel` -7. `missingRequestChannelRejectsWithoutCheckpoint` -8. `blankRequestChannelRejectsWithoutCheckpoint` -9. `unknownOperationDoesNotRunHandler` -10. `requestPayloadMustMatchOperationShape` -11. `bareOperationRequestUsesSameEffectiveChannelRules` -12. `ordinaryTimelineMessageKeepsNormalDelivery` -13. `directChildAndCompositeRouteInvokeTargetOnce` -14. `severalMatchingSourceChannelsInvokeTargetOnce` -15. `eligibleDuplicateSourcesPersistOwnCheckpoints` -16. `staleSourceDoesNotPiggybackOnSuccessfulRoute` -17. `targetHandlerFailurePersistsNoSourceCheckpoint` -18. `targetGracefulTerminationPersistsNoSourceCheckpoint` -19. `targetExternalMatcherIsNotInvoked` -20. `targetHandlerSeesFullTimelineEntryAndEffectiveChannel` -21. `allowNewerVersionHasNoProductionReference` -22. `exactVersionFlagDoesNotConsultInitializationMarker` -23. `replayAfterCommittedSourceCheckpointsRunsNothing` - -Include one fixture where Alice's entry is accepted by `aliceChannel`, names -`bobChannel` as target, and invokes a handler bound to `bobChannel`. A fail-open -implementation that simply ignores actor matching must fail the negative source -tests. - -## Code Review Hints - -Reviewers should verify: - -- source Timeline eligibility always runs before route creation; -- handler target is taken from required request channel, not recipientChannel or - accepting channel; -- the route key is source-independent and deterministic; -- target channel is never used as checkpoint owner; -- Composite/All propagation preserves union checkpoint ownership; -- direct and cross-channel requests share one implementation path; -- no initialization marker is used as current-document state; -- no feeder/Mandate authority logic is invented in Coordination; -- tests prove one logical execution under multiple matching sources. - -## Strict Definition of Done - -- [ ] Required Operation Request channel controls effective handler discovery. -- [ ] Cross-channel requests preserve source acceptance and checkpoint ownership. -- [ ] Direct, Composite, and All Timelines sources route correctly. -- [ ] Multiple sources execute one logical target delivery. -- [ ] Missing/unknown/mismatched channels fail deterministically. -- [ ] Request payload and operation-key matching remain exact. -- [ ] `allowNewerVersion` and initialization-marker version logic are removed. -- [ ] `requireExactDocumentVersion` remains a documented feeder boundary. -- [ ] Failure, termination, stale, replay, and gas behavior is tested. -- [ ] Changed code has 100% line/branch coverage and full build passes. -- [ ] No BEX binding or Terminate Processing executor is included. - ---- - -# Task 5: Expose the Processing Event to Coordination BEX - -## Goal - -Expose Task 1's immutable core context as -`$binding:processingEvent` in every Coordination Compute execution during one -PROCESS run, while preserving O(1) overhead when the binding is unused. - -## Design - -`BexWorkflowContextFactory` currently binds current event, current contract, and -steps. It adds one host binding: - -```java -BexValue processingEvent = processorContext.hasProcessEvent() - ? DeferredBexValue.memoized(() -> - BexValues.frozen(processorContext.frozenProcessEvent())) - : BexValues.undefined(); -``` - -`$event` and `$binding:event` remain the current channelized payload. -`$binding:processingEvent` remains the root input across direct, initialization, -triggered, multi-hop, bridge, and embedded-scope handlers. Explicit INITIALIZE -exposes undefined. - -The host binding is generic. It contains the complete Processing Event and does -not hardcode or validate a Timeline Entry BlueId. Mandate BEX may check that the -value is an object and `/timestamp` is an integer before interpreting it. - -A package-private `DeferredBexValue` in `blue-coordination-java` may implement -the lazy bridge. It must delegate the complete `BexValue` interface, evaluate -once on first semantic access, memoize undefined and failure outcomes, and -return the materialized delegate for an empty path. - -If a reusable lazy value is proposed for `blue-bex-java`, that is a separate -BEX-library task and must not be smuggled into this pull request. The local -adapter is preferred until broader reuse is demonstrated. - -Gas is unchanged. Binding reads pay existing `varRead`; output operations pay -existing value-size charges. Host snapshot construction receives no invented -gas charge. Eager and deferred values must produce identical BEX results and gas -boundaries. - -## Implementation Plan - -1. Add and unit-test the host-local deferred BEX adapter. -2. Bind `processingEvent` in `BexWorkflowContextFactory` without materializing - it during context construction. -3. Keep explicit INITIALIZE binding undefined. -4. Add fixtures where current event and Processing Event contain deliberately - different values. -5. Add real RC 4 Mandate lifecycle fixtures using timestamp `7000001`. -6. Add allocation and gas-equivalence tests. -7. Run all Compute/BEX regressions and full build. - -## Test Plan - -1. `directComputeReadsCompleteProcessingEvent` -2. `triggeredComputeDistinguishesEventFromProcessingEvent` -3. `multiHopComputeKeepsOriginalProcessingEvent` -4. `implicitInitializationCanReadProcessingEvent` -5. `explicitInitializationReadsUndefined` -6. `embeddedScopeReadsRootProcessingEvent` -7. `bridgeHandlerReadsRootProcessingEvent` -8. `nonTimelineScalarListAndObjectEventsAreSupported` -9. `missingTimestampRemainsUndefined` -10. `invalidTimestampKindFailsMandateGuard` -11. `unusedBindingDoesNotInvokeSupplier` -12. `manyReadsInvokeSupplierOnce` -13. `deferredUndefinedMatchesEagerUndefined` -14. `deferredScalarListObjectAndNodeDelegationIsComplete` -15. `deferredFailureIsMemoized` -16. `deferredAndEagerProgramsUseExactSameGas` -17. `largeUnusedEventHasConstantContextCreationCost` -18. `largeUsedEventFreezesOncePerProcessRun` -19. `mandateLifecycleRecordsTimestamp7000001` -20. `noTriggeringAliasExistsInCodeFixturesOrResources` - -Deliberately substitute `$event` for the binding; the triggered and multi-hop -tests must fail. Deliberately materialize during context creation; the unused -supplier/allocation tests must fail. - -## Code Review Hints - -Reviewers should verify: - -- the binding delegates to Task 1 and does not retain a second root event; -- no Timeline class or BlueId is used by the host factory; -- context creation does not freeze the event; -- the deferred wrapper covers every BEX value method and stable failure; -- `$event` is untouched; -- explicit/implicit initialization semantics differ correctly; -- no gas schedule, operator, or BEX specification is changed; -- the real generated Mandate program is used in acceptance tests. - -## Strict Definition of Done - -- [ ] `$binding:processingEvent` is available in all PROCESS Compute contexts. -- [ ] Explicit INITIALIZE exposes undefined. -- [ ] `$event` and `$binding:event` remain unchanged. -- [ ] Unused binding causes no event-sized work. -- [ ] First use freezes once through Task 1's API. -- [ ] Deferred/eager value behavior and gas are identical. -- [ ] Direct, triggered, multi-hop, initialization, bridge, and embedded cases - pass. -- [ ] Generated Mandate lifecycle records the root timestamp. -- [ ] No hardcoded type identity or triggering alias exists. -- [ ] Changed code has 100% line/branch coverage and full build passes. -- [ ] No termination executor or core-language change is included. - ---- - -# Task 6: Execute `Coordination/Terminate Processing` - -## Goal - -Add a Coordination Sequential Workflow executor that requests core graceful -termination, stops later steps in the same workflow, and preserves existing -buffered effect and scope semantics. - -## Design - -Core already provides `ProcessorExecutionContext.terminateGracefully(reason)`. -`ContractEffectBuffer` applies gas, patches, and emitted events before the -termination request. `TerminationService` owns markers, lifecycle events, scope -finalization, and root-run exit. Coordination must remain a thin adapter. - -Add `TerminateProcessingStepExecutor` implementing -`WorkflowStepExecutor`. It calls only: - -```java -context.processorContext().terminateGracefully(step.getReason()); -``` - -It then returns a generic terminal workflow result. Extend -`WorkflowStepResult` with: - -```java -public static WorkflowStepResult stopWorkflow(); -public boolean stopsWorkflow(); -``` - -Existing `none()` and `value(...)` results remain non-terminal. The runner -records any result value first, then stops iteration. Do not use null, magic -values, exceptions, class checks in the runner loop, direct marker writes, or -Coordination-created lifecycle events. - -Pass reason text unchanged. Core omits reason fields for null/empty values and -preserves non-empty text. - -Register the executor exactly once in all default runner factories. Custom -runner lists remain explicit replacements and fail clearly if support is -missing. Add bounded count and timing metrics only. - -## Implementation Plan - -1. Add generic terminal control to `WorkflowStepResult` and runner iteration. -2. Add `TerminateProcessingStepExecutor` as a narrow adapter. -3. Register it in every default runner factory. -4. Improve unsupported-step diagnostics with the qualified type name. -5. Add bounded metrics and snapshot/getter plumbing. -6. Add focused runner/executor tests. -7. Add root and embedded-scope integration fixtures. -8. Add the generated Mandate termination acceptance story using Task 5's - Processing Event timestamp. -9. Update supported-contract documentation. -10. Run mutation checks, coverage, and full build. - -## Test Plan - -### Unit and Runner Cases - -1. `supportsTerminateProcessingOnly` -2. `requestsGracefulTerminationWithExactReason` -3. `missingReasonUsesCoreOmissionSemantics` -4. `emptyReasonUsesCoreOmissionSemantics` -5. `terminalResultStopsFollowingSteps` -6. `noneAndValueResultsRemainNonTerminal` -7. `terminalValueIsRecordedBeforeStop` -8. `allDefaultFactoriesRegisterExactlyOnce` -9. `customRunnerWithoutExecutorFailsClearly` -10. `metricsCountOnlyExecutedTerminateSteps` -11. `invalidReasonTypeFailsBeforeExecution` -12. `firstTerminateStepStopsSecondTerminateStep` - -### Integration Cases - -1. `precedingPatchAppliesBeforeTermination` -2. `precedingEmissionIsRecordedBeforeTerminationLifecycle` -3. `stepAfterTerminationDoesNotExecute` -4. `gracefulMarkerHasExactCauseAndReason` -5. `terminationLifecycleMatchesMarker` -6. `rootGracefulTerminationReturnsSuccess` -7. `laterHandlersDoNotRunAfterRootTermination` -8. `embeddedTerminationAffectsCurrentScopeOnly` -9. `terminatedDocumentDoesNotReexecuteWorkflow` -10. `queuedConsumerCannotMutateAfterScopeShutdown` -11. `precedingGasAndEffectsAreNotDiscarded` -12. `checkpointDoesNotAdvanceWhenChannelTerminates` - -### Mandate Acceptance Cases - -1. `terminateMandateUsesProcessingEventTimestampAndStopsProcessing` - - Timeline Entry timestamp is `7000001`. - - Mandate status becomes Terminated. - - `terminatedAt` is `7000001`. - - Termination Requested precedes Mandate Terminated. - - Processing marker is graceful with reason `Mandate terminated`. - -2. `missingIntegerTimestampDoesNotTerminateMandate` -3. `alreadyTerminatedMandateKeepsOriginalEvidence` -4. `failedMandateDoesNotReachTerminateStep` -5. `reasonAndInResponseToSurviveFullFlow` -6. `routedTerminationRequestExecutesOnce` - -Deliberately remove the runner stop; the sentinel step test must fail. -Deliberately replace graceful termination with no-op/fatal; marker, status, and -scope tests must fail. - -## Code Review Hints - -Reviewers should verify: - -- the executor contains no core termination logic; -- no reserved marker path is written by Coordination; -- termination remains buffered until handler return; -- preceding effects survive and later steps cannot add effects; -- terminal workflow control is generic and source-compatible; -- every default factory registers once and custom lists receive no fallback; -- reason text is unchanged; -- root, nested, checkpoint, and status semantics are tested through public - processing results; -- metrics are bounded; -- actual generated RC 4 Mandate and Terminate models are used. - -## Strict Definition of Done - -- [ ] Executor delegates only to `terminateGracefully`. -- [ ] Terminate Processing is terminal inside its workflow. -- [ ] Existing WorkflowStepResult behavior remains compatible. -- [ ] Registration and missing-support diagnostics are complete. -- [ ] Patches/emissions before termination follow existing core ordering. -- [ ] Root and embedded-scope semantics are proven. -- [ ] Null, empty, non-empty, and invalid reason cases pass. -- [ ] Duplicate terminate steps execute once. -- [ ] Metrics and snapshots are fully wired and tested. -- [ ] Generated Mandate acceptance records Processing Event timestamp and - gracefully terminates. -- [ ] Changed code has 100% line/branch coverage and full build passes. -- [ ] No core termination behavior or unrelated consumer migration is changed. - ---- - -# Task 7: Specify Routed Delivery in Blue Contracts - -## Goal - -After Tasks 2 through 6 work end to end, capture the generic routed-delivery -contract normatively in the Blue Contracts specification and conformance -fixtures without adding Coordination concepts to the core specification. - -## Design - -The specification must define: - -- accepting, checkpoint, and effective handler channels as distinct concepts; -- routed `ChannelDelivery` as a trusted external-channel result; -- same-scope target validation and must-understand failures; -- handler payload and `channelKey` semantics; -- logical-delivery identity and cross-candidate deduplication; -- source checkpoint behavior for success, stale input, fatal, and graceful - termination; -- deterministic ordering when several sources route the same event; -- exact gas accounting for candidate, checkpoint, handler, and dedup paths; -- replay and execution-scope isolation; -- unchanged behavior for non-routed channels. - -Processing Event terminology already exists in Blue Contracts 1.0. The spec may -clarify that hosts can retain it as read-only execution context, but it must not -standardize the Coordination-specific BEX binding. - -## Implementation Plan - -1. Write normative routed-delivery sections and pseudocode from the proven Java - behavior. -2. Extend fixture schema with routed delivery metadata. -3. Add conformance fixtures for every success/failure/checkpoint/gas branch. -4. Implement fixtures in Java and JS conformance runners or declare an explicit - capability gate until both support them. -5. Cross-check prose, pseudocode, fixture outcomes, and Java behavior. -6. Run all existing and new conformance suites. - -## Test Plan - -Required fixtures: - -1. ordinary delivery compatibility; -2. successful same-scope route; -3. unknown/non-channel target; -4. target external matcher not invoked; -5. source checkpoint ownership; -6. two sources, one logical handler execution; -7. two eligible source checkpoints after shared success; -8. stale second source; -9. distinct logical route keys; -10. handler fatal; -11. graceful termination; -12. nested-scope isolation; -13. replay after checkpoint; -14. exact gas for ordinary/routed/deduplicated paths. - -## Code Review Hints - -Reviewers should verify that the spec is domain-neutral, matches implemented -behavior exactly, defines gas and failure points unambiguously, and does not -retroactively rewrite unrelated Blue Contracts semantics. - -## Strict Definition of Done - -- [ ] Normative prose and pseudocode define every routed-delivery state change. -- [ ] Fixture schema represents source, checkpoint, handler, and logical keys. -- [ ] Success, failure, termination, replay, scope, and gas fixtures exist. -- [ ] Java reference behavior passes all fixtures. -- [ ] JS passes or reports one explicit temporary capability gap with a tracked - delivery plan; no fixture is silently skipped. -- [ ] Existing Blue Contracts conformance remains green. -- [ ] No Coordination-specific type or binding appears in the core spec. - ---- - -# Task 8: Publish Coordination 2.0 Specification - -## Goal - -Consolidate the proven V2 repository and runtime behavior into a versioned -Coordination 2.0 specification and conformance fixture set. Coordination 1.0 -remains historical and is not rewritten to look like V2. - -## Design - -Coordination 2.0 must specify: - -- Timeline, Timeline Entry, source attribution, sequence, timestamp, - completeness, and provider responsibilities; -- Timeline Channel timeline/actor equality; -- Composite and All Timelines union and independent checkpoint semantics; -- Operation Request required effective channel; -- source acceptance versus effective handler dispatch; -- feeder ownership of `requireExactDocumentVersion` and Mandate authority; -- `$event` versus `$binding:processingEvent` host convention; -- Processing Event timestamp guards used by Mandate; -- Sequential Workflow terminal control and Terminate Processing behavior; -- Message, Request, Response, recipientChannel, and inResponseTo semantics; -- implementation/failure/gas rules inherited from Blue Contracts Task 7; -- explicit external dependencies and unsupported capabilities. - -The spec is written after implementation and end-to-end proof so it records a -working contract. Stable release remains blocked until this consolidation is -complete. - -## Implementation Plan - -1. Create `packages/coordination/2.0` rather than editing 1.0 in place. -2. Build normative sections from Task 0 definitions and Tasks 3 through 6 - behavior. -3. Reference Blue Contracts routed-delivery rules from Task 7. -4. Add complete example documents/events for direct, union, routed, BEX, and - termination flows. -5. Add machine-readable conformance fixtures and capability declarations. -6. Validate examples against RC 4 types and the released Java runtime. -7. Run spec link/schema/fixture checks and implementation conformance. - -## Test Plan - -Required Coordination fixtures: - -1. timeline+actor accepts; -2. timeline or actor mismatch rejects; -3. equal timestamp/higher sequence accepts; -4. stale/equivocating sequence rejects; -5. Composite/All delivers once with independent checkpoint; -6. direct Operation Request; -7. cross-channel Operation Request; -8. several source channels route once; -9. exact-version flag is declared feeder-owned; -10. direct and triggered BEX distinguish event/processingEvent; -11. missing/invalid Processing Event timestamp guard; -12. Terminate Processing ordering and workflow stop; -13. root and embedded termination; -14. required Response correlation; -15. malformed required V2 fields fail deterministically. - -## Code Review Hints - -Reviewers should verify that V1 is untouched, every normative claim has a -fixture or explicit external boundary, examples use published qualified types, -and the spec does not claim feeder/Mandate validation or consumer migrations -that are not implemented. - -## Strict Definition of Done - -- [ ] Coordination 2.0 exists as a separate versioned package. -- [ ] It covers all Task 0, 3, 4, 5, and 6 behavior. -- [ ] It references Task 7 core rules instead of duplicating them inconsistently. -- [ ] Every critical normative branch has a fixture and working Java evidence. -- [ ] Examples resolve against published RC 4/released artifacts. -- [ ] Feeder, authority, Actor Policy, and consumer boundaries are explicit. -- [ ] Coordination 1.0 remains unchanged. -- [ ] Spec validation and conformance suites pass. -- [ ] Stable Coordination V2 release is not cut before this task completes. - ---- - -## Cross-Layer Acceptance Gate - -Before declaring the runtime plan complete, verify the released artifact chain: - -```text -blue-repo-java:3.0.0-rc.4 - -> released blue-language-java with Tasks 1 and 2 - -> released blue-coordination-java with Tasks 3 through 6 - -> Blue Contracts conformance from Task 7 - -> Coordination 2.0 conformance from Task 8 -``` - -The final Java acceptance story must prove: - -1. a provider-authenticated Timeline Entry with equal timestamp and higher - sequence is accepted; -2. timeline and actor source bindings are enforced; -3. a cross-channel Operation Request reaches its effective operation exactly - once even when more than one source subscription matches; -4. source/union checkpoints remain independent and deterministic; -5. a direct workflow sees the Timeline Entry as both current event and - Processing Event; -6. a triggered Mandate workflow sees its Message as current event and the - original Timeline Entry as Processing Event; -7. `terminatedAt` is read from timestamp `7000001`; -8. `Coordination/Terminate Processing` applies earlier effects, stops later - steps, and gracefully terminates the correct scope; -9. exact gas, event order, marker state, and replay behavior match fixtures. - -This gate does not waive the external rollout blockers listed above. In -particular, a production cross-principal Mandate claim still requires feeder -authority validation and MyOS source-channel request production. - -## Suggested Verification Commands - -```bash -# Task 0: source aggregate -node ../blue-js/libs/repository-generator/dist/bin/blue-repo-generator.mjs \ - --repo-root ../blue-repository \ - --blue-repository ../blue-repository/BlueRepository.blue \ - --mode check --verbose - -# Task 0: generated Java artifact -../blue-repository-java/gradlew -p ../blue-repository-java \ - verifyGeneratedSources clean build - -# Tasks 1-2: released Blue Language dependency -./gradlew dependencyInsight \ - --dependency blue-language-java \ - --configuration runtimeClasspath - -# Task 3: Timeline V2 -./gradlew test --tests '*Timeline*ChannelProcessorTest' - -# Task 4: Operation Request routing -./gradlew test --tests '*OperationRequestRoutingTest' - -# Task 5: Processing Event BEX binding -./gradlew test --tests '*ProcessingEventBindingTest' - -# Task 6: Terminate Processing -./gradlew test --tests '*TerminateProcessingStepExecutorTest' -./gradlew test --tests '*MandateTerminationWorkflowTest' - -# Final gate in every changed Java repository -./gradlew clean build -``` - -Exact test class names may change only if the final names remain equally narrow -and readable. A targeted suite never replaces the full clean build or published -artifact resolution gate. diff --git a/docs/development/build-and-test.md b/docs/development/build-and-test.md new file mode 100644 index 0000000..da68503 --- /dev/null +++ b/docs/development/build-and-test.md @@ -0,0 +1,88 @@ +# Build and test + +## Prerequisites + +Use Java 17+ and the checked-in Gradle wrapper. Production compiles with Java 17, +`-Xlint:all` and `-Werror`. Tests can run on a newer LTS with +`-PtestJavaVersion=21`. + +Published Maven Central artifacts are the default and are used by ordinary +development, consumer, CI, and release builds. This mode runs no Git commands +and never reads sibling checkouts. + +`local-composite` remains an explicit diagnostic mode for coordinated changes +that have not been published. It substitutes `../blue-bex-java` and +`../blue-repository-java`, or paths supplied with `-PblueBexCompositePath` and +`-PblueRepositoryCompositePath`; it must not be used as release evidence. + +## Coordination gates + +```bash +./gradlew test +./gradlew integrationTest consumerTest scenarioTest +./gradlew releaseCheck +./gradlew stageRelease +``` + +The release-owned suites have distinct responsibilities: + +- `test` exercises public value contracts, internal atomic primitives and + retained workflow/BEX processor semantics. +- `integrationTest` exercises exact append, engine-selected drain, entry-frame + ordering, document-local atomic retry, embedded-only storage, `paths` and + `collectionPaths`, synchronized catch-up, reattachment and ownership. +- `consumerTest` compiles against the built production JAR, never main source + output or test fixtures, and verifies the supported public API as a real + consumer sees it. +- `scenarioTest` runs NBA admission-order/multi-game convergence and the + complete large-host/PayNote lifecycle. + +`releaseCheck` runs all four suites. It also enforces minimum suite depth, +validates the production class/line budget and small application API boundary, +scans the production JAR, validates POM scopes and versions, and checks legal, +documentation, source and Javadoc artifacts. The current verified status is +recorded in the RC report; commands listed here are gates to run, not claims +that a changed source snapshot has passed them. +`stageRelease` creates a Maven Central-shaped repository at +`build/staging-deploy`. + +To prove external dependency availability: + +```bash +./gradlew dependencyPreflight +``` + +That command fails closed unless every pinned prerequisite is published. + +## Historical performance evidence + +`../blue-basic` is deliberately outside the library's correctness and release +gate. It retains historical step timings, percentile campaigns and comparative +metrics so performance investigations remain reproducible without coupling the +published library to a sibling checkout. Run it only when collecting or +comparing performance evidence: + +```bash +./gradlew publishToMavenLocal +../blue-basic/gradlew -p ../blue-basic performanceTest runtimeCampaign +``` + +The runtime campaign is deliberately slower: it collects repeated samples so +percentile comparisons are not based on one noisy run. A missing or failing +`../blue-basic` checkout cannot make `releaseCheck` pass or fail. + +See [test strategy](test-strategy.md) for the behavior-to-suite map and the +rules that prevent release verification from drifting back into a demo module. + +## Lock files + +Regenerate the appropriate dependency lock only after an intentional version +change: + +```bash +./gradlew dependencies --write-locks +``` + +Review the entire lock diff. Never hand-wave an unexpected transitive version. +Only regenerate the local-composite lock during an explicit cross-repository +diagnostic by adding `-PblueDependencyMode=local-composite`. diff --git a/docs/development/internals.md b/docs/development/internals.md new file mode 100644 index 0000000..0e1bc9a --- /dev/null +++ b/docs/development/internals.md @@ -0,0 +1,45 @@ +# Internal design guide + +The engine has one mutation owner: `DefaultCoordinationEngine`. Calls are +synchronized because the supported boundary is deterministic, single-process +coordination rather than parallel publication. + +The append path validates and retains one exact request and Timeline Entry, +then commits its journal coordinates and logical clock. It does not scan +documents, encode a target document, or invoke PROCESS. + +The drain path uses an ordered journal cursor and `OperationRouteIndex` to +select the canonical next entry and its direct document targets. A frozen graph +snapshot supplies the ancestor closure. `SequentialDrainCoordinator` closes one +child-first entry frame before selecting another external entry; append order +and caller choice are not semantic order. + +Route publication is exact-key incremental: a staged document surface is +diffed against its published `RouteKey` rows, unchanged rows retain identity, +and only changed keys are removed or inserted. Graph publication compares +already-cached direct occurrences; unchanged topology opens no reconciliation +or publication savepoint. A topology change replaces only the affected parent +bucket, changed child reverse buckets, and changed binding records, while all +unchanged bucket lists and binding objects remain structurally shared. + +`EmbeddedOnlyLayoutBuilder` cuts only active `Process Embedded` fields. Ordinary +content remains inline; managed children are stored as whole exact objects. +Both explicit `paths` and direct stable-key members under `collectionPaths` +produce bindings. Binding topology is immutable; per-occurrence epoch cursors +are persisted separately. + +Historical catch-up is an iterative feeder, not a precomputed list. After every +committed historical step it refreshes subscriptions, graph bindings, nested +barriers, and completeness evidence before selecting the next candidate. Parent +synchronization uses exact processor-owned `EmbeddedEpochInput`; the host never +pre-replaces the child field and never fabricates an internal Timeline Entry. + +Atomicity is document-local. A successful child epoch remains committed if a +later parent application fails. Receipts and cursors publish with the document +transition they describe, and commit companions reconcile an uncertain return. +Do not reintroduce a whole-engine snapshot/restore transaction. + +Types in `blue.coordination.internal` are package-private except the concrete +engine factory target. Applications must depend on `blue.coordination.api`. +Test-only inspection and failure injection live in the test-fixtures artifact, +never the main JAR. diff --git a/docs/development/releasing.md b/docs/development/releasing.md new file mode 100644 index 0000000..3b6719a --- /dev/null +++ b/docs/development/releasing.md @@ -0,0 +1,97 @@ +# Releasing + +## Candidate prerequisites + +An RC is releasable only when all exact coordinates in `build.gradle` resolve +from Maven Central. In particular, 3.0.0-rc.1 requires Repository rc.21 and BEX +rc.3. Local composite success is semantic evidence, but it is not proof that an +external consumer can resolve the release. + +Repository rc.21 is the first pinned release containing the Repository surface +required by this Coordination candidate. + +## RC workflow + +1. Merge the candidate to `next`. +2. The RC workflow derives the next version, updates `.cz.toml`, creates a + release commit and annotated tag locally. +3. `dependencyPreflight` resolves all prerequisites in published-artifact mode. +4. `clean stageRelease` reruns the full release gate and builds the staging + repository. +5. JReleaser's deploy task verifies, signs, checksums and uploads the staged + artifacts to Maven Central. +6. Only after successful publication does the workflow push the release commit + and tag. + +The workflow uses GitHub Actions concurrency to serialize releases. Required +secrets are `WORKFLOW_PAT`, Maven Central username/password and the JReleaser GPG +public key, secret key and passphrase. + +## Stable workflow + +Stable release is manual, restricted to `main`, and requires an exact +`MAJOR.MINOR.PATCH` version in `.cz.toml`. It follows the same dependency +preflight, staging, signing and publication path as an RC. + +## Verification checklist + +- `releaseCheck` passes all library-owned unit, integration, built-JAR consumer + and end-to-end scenario suites without `../blue-basic`. +- The one canonical Round 13 report and JSON evidence use the Round 13 + Playground schema. For 3.0.0-rc.1 only, `verifyRound13Readiness` accepts + `FINAL` evidence with policy mode + `RC_WITH_KNOWN_PERFORMANCE_LIMITATION` when the release workflow explicitly + opts in. The verdict, public-RC status, and latency status must be + `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION`; the current campaign and performance + proof remain `PENDING_VERIFICATION`. This exception never waives the clean- + commit binding, Java 17/21 lanes, six non-performance proof rows, eight + measured zero counters, final artifact hashes, detached source-archive + verification, published-mode evidence, POM metadata, checksums, or signatures. + The tested implementation commit may precede the clean evidence commit, but + it must be an ancestor and the current main-source manifest must still match + exactly. +- Java 17 and Java 21 CI jobs pass. +- POM dependencies and scopes match `docs/reference/public-api.md`. +- Main, sources and Javadoc JAR hashes reproduce across two clean builds. +- Staged POM, checksum and signature inventory is complete. +- Changelog, migration notes, limitations and RC notes are current. +- The external Maven consumer resolves without adjacent sibling repositories. +- The exported source archive contains the authoritative `.cz.toml`, configures + from its own contents, and excludes nested ZIPs, build output, macOS metadata, + profiler recordings, and heap dumps. + +Historical `blue-basic` metrics may be captured for performance comparison, +but they are not an RC correctness prerequisite and are never substituted for +the library-owned suites. + +Never bypass dependency preflight or publish from local composite resolution. + +## 3.0.0-rc.1 known-performance-limitation policy + +The 3.0.0-rc.1 workflow has one narrow exception so the release candidate can +be published for external evaluation: + +- `mode`: `RC_WITH_KNOWN_PERFORMANCE_LIMITATION` +- `exactRelease`: `3.0.0-rc.1` +- `decision`: `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION` +- `performanceReleaseBlocking`: `false` +- `stableReleaseEligible`: `false` +- `nonPerformanceGatesRequired`: `true` +- `explicitWorkflowOptInRequired`: `true` + +The workflow must opt in explicitly; a normal local staging call, another RC, +or a stable release cannot inherit the exception. Every non-performance gate +listed above remains fail-closed. + +The retained historical campaign remains `FAIL`: append p95 was 18.680667 ms +against a 1.000000 ms hard limit, and Coordination-host p95 was 872.356126 ms +against 250.000000 ms. Route and total passed their hard limits, but all four +preferred targets were missed. The old Markdown, JSON, and provenance receipts +remain unchanged as audit evidence. Their temporary `Archive.zip` input is not +a release artifact, is not needed to build or publish 3.0.0-rc.1, and must not be +reintroduced as a staging prerequisite. The current published-artifact campaign +and performance proof remain `PENDING_VERIFICATION`; no latency pass is claimed. + +Performance remediation and a passing campaign are required before any stable +release. The tracked source-archive evidence intentionally leaves its digest +`null`; the generated detached `.sha256` sidecar remains the checksum authority. diff --git a/docs/development/test-strategy.md b/docs/development/test-strategy.md new file mode 100644 index 0000000..7e5df60 --- /dev/null +++ b/docs/development/test-strategy.md @@ -0,0 +1,62 @@ +# Test strategy + +Blue Coordination keeps release correctness inside this repository. The +library does not depend on a demo project, a metrics campaign or an adjacent +consumer checkout to prove that it works. + +## Verification layers + +| Suite | Boundary | Primary guarantees | +| --- | --- | --- | +| `test` | Types and compact internals | Immutable values, closed inputs, graph/cursor immutability, exact event occurrences, ordered journal cursors, plan caches, workflow state and BEX accounting | +| `integrationTest` | In-memory engine with public operations | Append/process separation, engine-selected drain, entry-frame ordering, admission, collection paths, catch-up barriers, identity, ownership, atomic retry and removal/re-addition | +| `consumerTest` | Built production JAR only | Published append/drain API, runtime dependency completeness and representative managed-document behavior | +| `scenarioTest` | Complete business lifecycles | Multi-order NBA convergence and the large host/PayNote lifecycle | + +The suites intentionally overlap at important boundaries. Atomicity has focused +integration coverage and is exercised again by realistic scenarios. The +consumer suite repeats representative behavior because compilation and +execution against the JAR catch packaging and dependency mistakes that +source-based tests cannot. + +## Round 10.1 semantic gates + +No test may choose processing order with a named entry. Tests append all facts, +call `drain()` or `drainThrough(cutoff)`, and assert the environment-selected +order from immutable receipts and document histories. + +Release-owned coverage must prove: + +- one exact Timeline Entry stored once with no append-time PROCESS or recipient; +- global canonical selection with source completeness, pre-entry document + targeting, and target-specific Mandate eligibility; +- three-level same-entry child-before-parent entry-frame ordering; +- separate Root/child epoch-zero initialization before historical work and + attachment-exclusive replay; +- iterative dynamic history, including ordinary owned nested-scope Channel + changes, and extendable multi-child/nested barriers; +- immutable bindings, separate occurrence cursors and activation generations; +- exact processor-owned parent inputs with indexed event identity; +- document-local failure/retry, commit-companion reconciliation and coordinator + reconstruction through the same-live-engine retained-state seam; +- known current/older states, divergent-state rejection and independent equal + BlueIds under different DocumentIds; +- both `paths` and direct stable-key `collectionPaths` discovery; +- top-level `FULL_HISTORY`, `FROM_FRONTIER`, and `FROM_NOW` admission; +- shared-child/multi-parent reuse, removal/re-addition, cycles, NBA and + Wadowice-shaped convergence; +- zero generic fragmentation, unrelated reads, full scans, per-parent source + replay, and whole post-PROCESS projections. + +The exact same-source results, counts, skips, runtime evidence and structural +counters belong in the [RC test report](../releases/3.0.0-rc.1-test-report.md). +A test-count floor is only a regression tripwire; it is not proof that the +requirements above pass. + +## Historical metrics + +`../blue-basic` is a performance laboratory retained for historical comparison. +It owns step timings, repeated percentile campaigns and before/after reports. +It is neither compiled nor executed by `releaseCheck`. Every correctness +regression must receive a release-owned test even when a matching metrics +scenario exists there. diff --git a/docs/examples/counter.md b/docs/examples/counter.md new file mode 100644 index 0000000..344d64d --- /dev/null +++ b/docs/examples/counter.md @@ -0,0 +1,14 @@ +# Counter example + +The Counter acceptance document defines Alice's increment channel and Bob's +decrement channel. Register both Timelines, start the document, append +`increment amount: 3` and `decrement amount: 1`, then call `drain()`. The +environment selects both entries in canonical order; neither append identifies a +recipient or calls PROCESS. Read `/counter` from the immutable snapshot. The +result is `2`, the document epoch is `2`, and structural counters show exactly +two external PROCESS invocations and zero generic fragments. + +The executable release-owned coverage is +`CoreBehaviorIntegrationTest.counterRoutesAliceAndBobExactlyOnceWithoutGenericSplitting`; +see the quickstart in the repository README for application code. Historical per-step +timings remain in `../blue-basic`. diff --git a/docs/examples/large-host-paynote.md b/docs/examples/large-host-paynote.md new file mode 100644 index 0000000..fac18fc --- /dev/null +++ b/docs/examples/large-host-paynote.md @@ -0,0 +1,14 @@ +# Large host and PayNote + +The Wadowice scenario starts a roughly 60 KB host with 43 workflows, retains a +real PayNote as one exact request value, and attaches it through one `Process +Embedded` field. The host becomes one physical root shell plus one whole managed +PayNote document; the PayNote itself is not generically fragmented. + +The scenario appends host and PayNote entries once, then lets the environment +drain them in canonical order. It executes host work, two Alice authorizations, +a restaurant provider confirmation, processor-owned parent epoch application, +and a warm host operation. +Its report separates append, frozen Contracts, the derived non-frozen drain +residual, the unattributed portion within that residual, and test-fixture-only nested +delivery-plan/platform-commit diagnostics. diff --git a/docs/examples/nba-catch-up.md b/docs/examples/nba-catch-up.md new file mode 100644 index 0000000..ca5a295 --- /dev/null +++ b/docs/examples/nba-catch-up.md @@ -0,0 +1,16 @@ +# NBA historical catch-up + +The NBA scenario replays start, scoring plays, and game end on commissioner +Timelines. A statistics Root discovers Games from direct stable-key members of +`Process Embedded.collectionPaths`. Each Game processes each source entry once; +League, Team, and Player documents consume its immutable epochs through their +own occurrence cursors. + +Histories from several Games are merged by canonical source order under one +parent barrier. Initialization precedes replay, the attachment entry is +exclusive, and the next statistics entry waits until every nested prerequisite +and cursor is complete. Host-first, completed-game-first, partial-history, and +reused-history admission orders must converge to the same exact final BlueIds +and aggregates. Verified Round 10.1 scenario status is tracked in the +[RC test report](../releases/3.0.0-rc.1-test-report.md); `../blue-basic` retains +only historical timing variants. diff --git a/docs/examples/nba-shared-game-lifecycle.md b/docs/examples/nba-shared-game-lifecycle.md new file mode 100644 index 0000000..b2fb37b --- /dev/null +++ b/docs/examples/nba-shared-game-lifecycle.md @@ -0,0 +1,65 @@ +# One NBA Game shared by several containing documents + +The scenario uses only the graph derived from `Process Embedded`. + +```text +Host 1 ----\ + >---- Game document history +Host 2 -----| +Host 3 ----/ +``` + +The Game has one stable `DocumentId` and one epoch stream: + +```text +epoch 0 initialization, emits NBA/Game Initialized +epoch 1 Game Started +epoch 2 home scoring play +epoch 3 away scoring play +epoch 4 Game Ended, emits NBA/Game Ended +``` + +Host 1 starts before the Game exists in the environment. Its attachment +transition creates the Game session. The Game initializes once, and Host 1 +applies the initialization epoch and its event. + +After the Game progresses, Host 2 starts and embeds the same original Game +state with the same `DocumentId`. The environment resolves that state to the +existing Game history, creates no new Game session, performs no second +initialization, and applies the already committed epochs to Host 2 in order. + +Later Game transitions are executed once. Each host independently applies the +resulting child epoch. Both hosts observe the final `NBA/Game Ended` event. + +After the Game is Final, Host 3 embeds the same original state and stable +`DocumentId`. It consumes all five retained epochs—including initialization +and ending events—without advancing, reinitializing, or replaying the Game. + +Required structural evidence: + +```text +Game sessions created 1 +Game sessions reused 1 +Game initialization revisions 1 +Game source PROCESS per source entry 1 +Initialization epoch applications 2 +Initialization event occurrences 2 +Parent epoch applications 10 +Request/entry/ordinary fragments 0 +Source replay per parent 0 +``` + +The post-Final extension adds one reuse, five parent applications, one retained +initialization-event application, and one retained ending-event application; +the Game still has one session, one initialization, and five revisions. + +The same mechanism applies to dynamic activation. A child may be ordinary +inline content at admission and become managed when a later transition adds a +`Process Embedded` `paths` or `collectionPaths` contract. The activating entry +is processed by the parent first; it never reaches the newly activated child. +The new children then initialize and their epochs are applied before the parent +becomes ready for another entry. + +For several collection members, initialization order is canonical absolute +Runtime Pointer order using Unicode code points. It is not insertion order, +Java UTF-16 `String` order, or BlueId order. diff --git a/docs/examples/playground-five-occurrence.md b/docs/examples/playground-five-occurrence.md new file mode 100644 index 0000000..89c7226 --- /dev/null +++ b/docs/examples/playground-five-occurrence.md @@ -0,0 +1,70 @@ +# Public API example + +The built-JAR consumer test in the Round 13A patch is the authoritative +executable example. + +Conceptually: + +```java +try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline owner = engine.registerTimeline( + "examples/playground/five-occurrence/host", + "playground-owner"); + + engine.registerTimeline( + "examples/playground/five-occurrence/alpha", + "playground-feed-alpha"); + engine.registerTimeline( + "examples/playground/five-occurrence/beta", + "playground-feed-beta"); + engine.registerTimeline( + "examples/playground/five-occurrence/gamma", + "playground-feed-gamma"); + + DocumentId host = DocumentId.of( + "playground-five-occurrence-host"); + engine.startDocument(host, hostYaml); + + ExactValue alpha = engine.exactValue(alphaInitialGameYaml); + ExactValue beta = engine.exactValue(betaInitialGameYaml); + ExactValue gamma = engine.exactValue(gammaInitialGameYaml); + + ExactValue request = engine.exactValue(""" + documents: + betaSecond: + blueId: %s + alphaSecond: + blueId: %s + gamma: + blueId: %s + betaFirst: + blueId: %s + alphaFirst: + blueId: %s + """.formatted( + beta.blueId(), + alpha.blueId(), + gamma.blueId(), + beta.blueId(), + alpha.blueId())); + + TimelineEntry entry = engine.append( + owner, + Operation.exact( + "attachFiveDocuments", + "ownerChannel", + request)); + + engine.drainThrough(entry.sourceOrderKey()); + + DocumentSnapshot ready = engine.document(host); + assert ready.embeddedChildren().size() == 5; + assert engine.metrics().documentCount() == 4; +} +``` + +The request contains five collection occurrences but only three stable child +`DocumentId` values and three retained exact child bodies. Representation must +not alter semantics: an equivalent inline request should produce the same final +state, histories, event order, and gas. The reference form is preferred for the +Playground because it avoids parsing and retaining duplicate large bodies. diff --git a/docs/limitations.md b/docs/limitations.md new file mode 100644 index 0000000..0bd7a89 --- /dev/null +++ b/docs/limitations.md @@ -0,0 +1,54 @@ +# Known limitations + +- Managed embedded-document epochs and historical synchronization are a + next-version Coordination temporal profile. They are not claimed as frozen + Contracts 1.0 semantics. +- The frozen Contracts API has no managed-child ownership-mask input. + Coordination therefore uses an explicit ownership projection before frozen + processing; exact semantic-parent fidelity across every child-owned + subscription surface remains a frozen-API gap. +- Journal completeness is proven only for the current in-memory journal. There + is no durable or distributed transaction protocol. +- The pinned generic Timeline Entry has no universal literal `documentId` + field. This is an optional generalized targeting-profile gap, not a blocker + for append-once/environment-derived routing: concrete Channel/message types + may define exact target derivation, and Repository-native + `OperationRequest.document` version targeting is supported. A universal + Timeline-Entry target profile requires an upstream field or runtime hook. +- General provider-backed Mandate eligibility requires an exact Mandate-state + resolver at the entry's source order. The in-memory engine does not invent + that evidence; authority-bearing entries fail closed until a host adapter can + supply it. +- `Process Embedded.collectionPaths` covers direct stable-key members. General + list-position identity and arbitrary collection reshaping are not implied. +- Coordinator reconstruction inside the same live engine is supported while + its typed in-memory document, journal, and scheduler state survives. A fresh + engine instance is not reconstructible from a serialized store. External + frontier import and cross-process recovery still fail closed unless exact + cursor, epoch, entry-frame, commit-companion, and provider-completeness + evidence is durably available. +- Drain is intentionally sequential. Parallel document processing, leasing, + distributed scheduling, SCC planning, and caller-selected target sets are out + of scope. +- `DrainBudget` bounds selected entries and committed PROCESS transitions. It + cannot preempt one frozen processor call, does not count epoch-zero + INITIALIZE inside an atomic attachment, and is not a hard latency deadline. +- In large documents, steady drain latency is currently dominated by frozen + Language/Contracts/BEX delivery-plan derivation and platform commit. The + Coordination scheduler is measured separately and remains small; removing + independent frozen verification or caching revision-bound delivery evidence + would be an unacceptable semantic shortcut. +- The retained Round 13 campaign failed append p95 (18.680667 ms against a + 1.000000 ms hard limit) and Coordination-host p95 (872.356126 ms against a + 250.000000 ms hard limit); route and total passed hard, while all four metrics + missed their preferred targets. The exact 3.0.0-rc.1 workflow policy permits + publication only as `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION`. It does not + claim a latency pass, cannot apply to a stable release, and does not waive any + non-performance release gate. +- Immutable graph generations structurally share unchanged forward/reverse + buckets and binding records, but a topology-changing publication still makes + shallow copies of the three top-level in-memory directory maps. This RC does + not claim persistent-map O(affected-key) allocation for those directories. +- Deterministic failed retries stabilize whole-object cache size for the same + failure. Distinct failed results can leave unreachable immutable cache values; + retention is an in-memory host policy. diff --git a/docs/migration-from-2.x.md b/docs/migration-from-2.x.md new file mode 100644 index 0000000..097a017 --- /dev/null +++ b/docs/migration-from-2.x.md @@ -0,0 +1,21 @@ +# Migration from 2.x + +Version 3 removes the generic engine/planner/fragment-store surface, +subscription-delivery planning, fast paths, myOS demo source set, and the +`basicTest`-hosted runtime. There are no compatibility wrappers. + +Replace 2.x session/store/process APIs with `CoordinationEngine`. Register +Timelines explicitly, use `DocumentId` for continuing managed identity, and +represent requests with `Operation.yaml` or `Operation.exact`. Append entries +without document recipients, then call `drain()` or `drainThrough(cutoff)`; do +not reproduce the old caller-selected dispatch order. Read immutable +`DocumentSnapshot` and `DocumentRevision` values. + +Choose `FULL_HISTORY`, `FROM_FRONTIER`, or `FROM_NOW` explicitly when admitting +a top-level document with existing source history. Model document dependencies +only with effective `Process Embedded.paths` and `collectionPaths`; do not +migrate application links into a second Coordination relationship graph. + +Production now requires Java 17. Maven coordinates remain under +`blue.coordination`, with the new major version establishing the future binary +compatibility baseline. diff --git a/docs/operations/failure-model.md b/docs/operations/failure-model.md new file mode 100644 index 0000000..b07967d --- /dev/null +++ b/docs/operations/failure-model.md @@ -0,0 +1,65 @@ +# Failure and retry model + +Append and each document transition have separate atomic boundaries. Admission +prepares one document before publication. A document transition atomically +commits its exact new state and epoch, emitted events/outbox, subscription and +`Process Embedded` deltas, external delivery progress or parent cursor, +idempotency receipt, and commit companion. The engine does not copy and roll +back the entire environment as one transaction. + +Timeline append advances sequence numbers and the logical clock only after the +exact Timeline Entry is valid and journaled. Retrying a rejected append +therefore produces the same coordinates and BlueId as an equivalent fresh +engine. + +Every committed delivery has a receipt written with the state transition. If +state CAS succeeds but the caller loses the response, retry reconciles the +commit companion and does not invoke frozen PROCESS or publish another +revision. Duplicate exact journal admission is similarly idempotent. + +Child and parent synchronization are intentionally separate commits. If a +child epoch commits and parent application fails, the child remains committed, +the parent cursor remains behind, and the parent stays `CATCHING_UP` or +`BLOCKED`. Retry applies the existing child epoch only; it does not reprocess +the source Timeline Entry. Required unfinished synchronization prevents later +dependent entries from overtaking it. + +An attachment-specific admission plan is staged outside document state and is +consumed only inside the graph-publication savepoint. Failure before publication +restores it; failure after a durable document transition retains the committed +state and reconciles only the missing publication/cursor work. + +A document transition that may change its managed `Process Embedded` graph is +committed as `CATCHING_UP`, not `READY`. The session records separate committed, +ready, and graph-published epochs. Graph and route publication may then succeed, +pause, or fail without making the new state application-readable. `document()` +requires all of the following: `READY`, ready epoch equal to committed epoch, +graph-published epoch equal to committed epoch, no open barrier, no pending +admission, exact graph/state agreement, and every child cursor at the child +current epoch. `auditDocument()` remains the explicit way to inspect a committed +but not-yet-ready state. + +`drain(DrainBudget)` uses the same retained state as failure recovery. Reaching +a selected-entry or committed-PROCESS limit is a normal paused receipt, not a +failure. The receipt owns only outcomes committed during that call, and a later +drain resumes the open frame. INITIALIZE and an individual frozen PROCESS call +remain atomic and cannot be interrupted to meet a wall-clock deadline. + +Failures use `CoordinationException` and a machine-readable error code. Treat +the message as diagnostic text; branch on the code. Preserve attached details +in logs while applying normal data-redaction policy. + +The bundled host supports control-plane reconstruction inside the same live +engine while its document, journal, and scheduler state remain in memory. +Reconstruction discards transient outcomes and publication savepoints, rebuilds +route rows from exact document state, validates retained graph/cursor/barrier +state, and resumes a retained entry frame. Tests cover both +child-committed/parent-pending and parent-committed/cursor-pending recovery +without repeating initialization or source PROCESS. This test-only seam does +not construct a fresh engine instance or reload serialized state. + +A process crash still loses those in-memory stores. This is therefore not a +cross-process durability or exactly-once claim. A durable adapter must persist +the same typed document, journal, graph, barrier, cursor, entry-frame, receipt, +and commit-companion records and pass the restart/store gate before a host can +treat the engine as a system of record. diff --git a/docs/performance/complex-operations-coordination.md b/docs/performance/complex-operations-coordination.md deleted file mode 100644 index b88837a..0000000 --- a/docs/performance/complex-operations-coordination.md +++ /dev/null @@ -1,129 +0,0 @@ -# Complex operations: Coordination verification - -Evidence refreshed on 2026-07-21. - -## Dependency baseline - -Coordination uses released artifacts from Maven Central: - -```text -blue.language:blue-language-java:3.1.0-rc.16 -blue.repo:blue-repo-java:3.0.0-rc.10 -blue.bex:blue-bex-java:1.1.0-rc.2 -``` - -The build pins the Blue Language version. It does not provide a source-composite, -custom-repository, or version override for that dependency. The staged -Coordination POM must contain the same rc16 coordinate. - -## Implemented processing path - -The optimized path preserves observable ordering and identity: - -```text -eligible Timeline Entry - -> channel and handler matching - -> cached SequentialWorkflowPlan - -> one workflow-owned WorkingDocument - -> ordered Compute / Update Document / Trigger Event steps - -> frozen patch preview and handoff - -> Language validation, gas, routing, handlers, and termination - -> strict published snapshot, events, gas, markers, and final BlueId -``` - -The implementation includes: - -- bounded access-order workflow and Compute plan caches; -- revisioned, read-only workflow result views instead of whole-prefix copies; -- immutable static Update Document templates; -- frozen Compute and Update Document patch handoff; -- failure-safe plan publication and explicit ownership/close paths; -- generic bounded Language metrics with immutable snapshots; -- deterministic differential, fixture, memory, artifact, and bytecode checks. - -## Required invariants - -The release-oriented checks require: - -- exact final BlueIds, status, gas, and event counts for representative static, - multi-patch Compute, PayNote, and Mandate scenarios; -- no mutable patch values frozen by built-in Coordination paths; -- no frozen patch-value materialization after handoff; -- frozen values accepted by Language equal frozen values handed off by - Coordination for the measured scenario delta; -- no singleton Language transactions, stale preview fallbacks, suffix rebases, - dropped metric names, or materialized workflow document views; -- Java 8 class-file compatibility and public binary compatibility; -- deterministic metrics artifacts and a reproducible source archive. - -## Verification commands - -```bash -./gradlew clean build \ - workflowPlanDifferentialTest \ - complexFixtureIntegrationTest \ - memoryIntegrationTest \ - languageAdoptionMetricsArtifactTest \ - sourceArchive \ - jmhClasses \ - stageLocalMaven \ - --rerun-tasks --no-daemon --no-parallel - -./gradlew dependencyInsight \ - --dependency blue-language-java \ - --configuration runtimeClasspath \ - --no-daemon - -git diff --check -``` - -## Evidence locations - -```text -build/reports/tests/ -build/reports/language-adoption/scenario-metrics.json -build/reports/language-adoption/scenario-metrics.csv -build/reports/binary-compatibility/blue-coordination-java.txt -build/reports/bytecode/java8-bytecode.txt -build/staging-deploy/ -build/distributions/ -``` - -Generated build output, caches, recordings, databases, logs, dumps, and ZIP -inputs are excluded from the source archive. - -## Current result - -The 2026-07-21 clean JDK 25 validation resolved -`blue.language:blue-language-java:3.1.0-rc.16` as an external Maven module and -completed with no test failures: - -| Suite | Tests | Failures | -| --- | ---: | ---: | -| Main test suite | 368 | 0 | -| Workflow-plan differential suite | 124 | 0 | -| Complex-fixture integration suite | 55 | 0 | -| Memory integration suite | 17 | 0 | -| Language-adoption metrics artifact | 1 | 0 | - -The four representative artifact scenarios produced these deterministic -semantic results: - -| Scenario | Status | Gas | Events | Final BlueId | -| --- | --- | ---: | ---: | --- | -| Mandate authority confirmation | SUCCESS | 9001 | 1 | `3HBTSrB2AZk9RjR4auvjkn9cdz8r6kH6SduBP4atq1co` | -| Multi-patch Compute | SUCCESS | 234 | 0 | `4LbNZzaixg8mw3g5U7rKknkAvmLkM8zZR7LP7XKEEJxi` | -| PayNote resale fixture | SUCCESS | 2268 | 3 | `HF2mzumBAMQSCfnSvdcziwkmu2jX1gf8KVMoBZrcxC8N` | -| Static Update Document | SUCCESS | 174 | 0 | `BEh1MRkKWKg2sG3c7JXDzX1LyMkiS2LEryfVjBrevYqG` | - -Every measured scenario had frozen workflow views, zero view misses, zero -singleton Language transactions, zero suffix rebases, zero stale-preview -fallbacks, zero Language patch-value materializations, zero dropped metric -names, and equal frozen patch values accepted and handed to Language. The -published rc16 strict-canonical counter was present for every scenario. - -Binary compatibility passed with 26 baseline and 26 current public API -classes. All 84 class files remained Java 8 compatible (maximum class-file -major version 52). The staged POM records rc16 with compile scope. Two -consecutive metrics-artifact and source-archive generations matched -byte-for-byte. diff --git a/docs/performance/host-vs-frozen-time.md b/docs/performance/host-vs-frozen-time.md new file mode 100644 index 0000000..90daf01 --- /dev/null +++ b/docs/performance/host-vs-frozen-time.md @@ -0,0 +1,136 @@ +# Host time versus frozen semantic time + +User-visible drain time contains two materially different costs: + +- frozen semantic time: Contracts resolution, workflow execution, and BEX; +- Coordination host time: ordered source selection, exact routing, immutable + object retention, layout updates, revision publication, cursors, barriers, + receipts, and catch-up orchestration. + +Metrics report these phases separately. A multi-second PayNote entry frame may be +dominated by frozen semantics while measured Coordination host phases remain tens +of milliseconds. Performance gates therefore evaluate append, route lookup, +direct external frozen PROCESS, embedded parent frozen PROCESS, the non-frozen +drain residual, the unattributed portion within that residual, and total time. +The harness subtracts the aggregate `process.frozen` timer; subtracting only +`process.frozenContractsOnce` would incorrectly label embedded frozen execution +as host work. Test-fixture-only delivery-plan derivation and platform commit are +nested frozen diagnostics; embedded-input and companion-delta diagnostics are +nested in host phases. Public layout timers are reported separately and may +also cover admission work outside those host phases. Nested timers are never +added to their parent timers. + +The standalone `blue-basic` project retains historical Counter, whole-request, +1-vs-61 workflow, Wadowice PayNote and NBA timing campaigns. Its percentile +campaign uses 200 samples for append/routing micro-paths and 30 for +processing/catch-up paths. These metrics are diagnostic evidence only. The +library's own integration and scenario suites assert the corresponding semantic +invariants, including zero generic fragments and embedded-only cuts, and are +the suites enforced by `releaseCheck`. + +## 2026-08-10 artifact-bound diagnostic + +One run bound by the companion provenance record to the exact Coordination JARs, +test-source manifest, dependency lock, and producer runtime produced the following +wall-clock decomposition. These are single-run diagnostics, not portable latency +promises. + +| Operation | Append ms | Drain ms | Frozen ms | Non-frozen residual ms | Of which unattributed ms | +| --- | ---: | ---: | ---: | ---: | ---: | +| Attach PayNote and initialize its two managed products | 27.799 | 19,698.022 | 18,501.099 | 1,196.924 | 967.805 | +| Warm host operation | 31.396 | 3,327.171 | 3,307.633 | 19.538 | 3.798 | +| Warm PayNote plus parent propagation | 31.929 | 5,318.566 | 5,264.847 | 53.720 | 6.790 | +| Restaurant child through PayNote and host | 33.078 | 6,314.884 | 6,253.343 | 61.541 | 6.936 | + +Values are rounded independently from nanosecond measurements; displayed +rounded operands may therefore differ by 0.001 ms. + +For the warm PayNote frame, the frozen lanes were 1,027.128 ms for the PayNote +and 4,237.718 ms for the parent. Nested frozen diagnostics attributed 2,483.260 +ms to delivery-plan derivation and 2,781.245 ms to platform commit; the wrapper +remainder was 0.341 ms. Cached canonical embedded-input shape reuse kept warm +input preparation to 0.287 ms. The one-time attach now admits the PayNote plus +two real managed product documents; its residual includes their initialization, +barrier, and scheduler work outside the steady PROCESS phase model. + +The steady-state distinction is decisive: frozen work was 99.41% of the warm +host drain and 98.99% of the warm PayNote-plus-parent drain. Coordination's +non-frozen residual was respectively 0.59% and 1.01%. The scheduler therefore +passes its host-work budget, but the complete operation does **not** meet an +interactive-latency objective. This release evidence must not be summarized as +"fast" merely because the host lane is fast. + +## Round 11 hot-path audit + +The occurrence-admission, exact-epoch, READY-read, and bounded-drain corrections +do not add a history scan or graph scan to a steady unchanged-topology PROCESS: + +- occurrence-specific admission plans are consulted only when a topology delta + introduces an embedded occurrence; +- exact state-to-epoch provenance is updated by one constant-time map operation + per committed revision and queried only during admission; +- READY-only versus audit reads change the read boundary, not processing; +- an unlimited drain uses a null budget sentinel, so it does not populate the + bounded-drain selected-entry set and performs only predictable early-return + checks at scheduling boundaries. + +A bounded drain limits committed PROCESS transitions and selected entries at +deterministic continuation points. It is a work bound, not a wall-clock timeout: +one already-started frozen PROCESS remains atomic and can still take seconds. +Epoch-zero initialization is also atomic. Bounded continuation improves +fairness and recoverability; it does not hide or cure frozen semantic latency. + +The library-owned `CoreBehaviorIntegrationTest` independently asserts that +aggregate frozen time equals its external and embedded lanes, and that the +delivery-plan plus platform-commit diagnostics are positive and bounded by the +frozen parent. Those assertions passed for both direct and child-to-parent +PROCESS. The standalone numbers above are the regenerated artifact-bound +release record for the corrected three-document PayNote graph. + +## Where the seconds are + +`process.deliveryPlanDerivation` currently includes complete active-surface +validation, one authoritative selection evaluation, and an independent +determinism replay. `process.platformCommit` then revalidates the supplied, +Root/event/revision/order-bound plan through the core verifier before semantic +execution. Those checks deliberately reject forged, stale, incomplete, or +non-deterministic execution evidence. Coordination must not bypass them. + +The warm PayNote frame placed 5,264.505 ms of its 5,264.847 ms frozen lane in +those two upstream boundaries. That is 99.99% of frozen time and leaves only +0.341 ms in the surrounding wrapper. A safe improvement therefore needs an +upstream Language/Contracts/BEX change with the following acceptance contract: + +1. retain identical resulting state, ordered events, portable gas, and commit + companion evidence; +2. retain independent rejection tests for forged, stale, incomplete, and + non-deterministic delivery plans; +3. add subphase timers for authoritative selection, determinism replay, commit + verification, exact-resource establishment, and BEX execution; +4. key any reuse by the complete immutable Root, event, revision, order, + active-interval, runtime-generation, and contribution identities; +5. preserve cold/warm semantic parity and bounded cache ownership. + +Caching a plan only by document type, DocumentId, or workflow is invalid: every +committed transition changes at least the revision-bound evidence, and commonly +the exact Root identity. Reusing compiled BEX by exact body identity and reusing +verified immutable resolution products inside the upstream invocation are more +promising than a Coordination-side plan cache. + +A one-shot local experiment supplied the ownership Root as a pure BlueId +reference instead of the retained exact representation. The large-host scenario +runtime moved from 31.881 s to 32.319 s, so the provider merely rematerialized +the same Root later and no latency was removed. That experiment was reverted; +the figures are engineering diagnostics, not a benchmark comparison or release +claim. + +The final repeated runtime campaign observed p95 values of 99.234 ms for +existing-child catch-up, 157.939 ms for late-child admission, 79.914 ms for +nested catch-up, and 87.689 ms for NBA catch-up. Existing-child catch-up passes +its hard 150 ms gate but remains above the preferred 80 ms target. All nine +enforced rows pass; three diagnostic-only rows remain `OBSERVE` because no +release threshold is assigned. No authoritative historical baseline is claimed. +The companion `blue-basic` `runtime-provenance.json` binds those results to the +exact test-source and dependency-lock manifests, artifact and JSON/Markdown +report hashes, benchmark JVM, separate Gradle producer runtime, and configured +sample counts. diff --git a/docs/reference/metrics.md b/docs/reference/metrics.md new file mode 100644 index 0000000..1927466 --- /dev/null +++ b/docs/reference/metrics.md @@ -0,0 +1,75 @@ +# Metrics reference + +`CoordinationEngine.metrics()` returns one cumulative immutable snapshot. +Capture a baseline and subtract later values when measuring one append, drain, +entry frame, or catch-up barrier. Timers are nanoseconds; `millis(name)` is a +convenience conversion. + +## Public phase timers + +- `append.total`: exact-node admission times its complete validation, + journal-commit, and rejected-attempt rollback boundary. Convenience builders + time the journal append after request construction; surrounding builder and + frontier-validation work is outside that narrower measurement. +- `temporal.drain`: environment-selected processing to the requested safe + frontier. +- `process.routeLookup`: every real indexed Channel target derivation, including + live drain, historical selection, and diagnostic lookup. +- `process.hostBeforeFrozen`: host preparation before Contracts. +- `process.frozenContractsOnce`: direct external-entry frozen execution. +- `process.embeddedFrozen`: processor-owned child-epoch frozen application. +- `process.frozen`: the aggregate of both; subtract this phase—not only the + external phase—when calculating the non-frozen drain residual. +- `process.hostAfterFrozen`: host delta validation and commit preparation. +- `layout.compileFrozenCatalog`: Process Embedded catalog compilation. +- `layout.retainEmbeddedOnly`: whole-object layout retention. + +The non-frozen residual for one drain is temporal drain wall time minus aggregate +frozen semantic time; it is derived, not an independently timed host phase. +Report append, source selection, frozen external +PROCESS, frozen embedded PROCESS, explicit host phases, unattributed residual, +and total wall time separately. These are diagnostics, not distributed traces. + +## Closed counter vocabulary + +The public map contains every `CoordinationMetrics.Counter` name, including +valid untouched counters at zero, and contains no implementation diagnostics. +Unknown constructor keys and string lookups fail instead of reading as zero. + +- `ENTRIES_STORED_WHOLE`, `ROUTE_INDEX_LOOKUPS`, and + `DOCUMENT_INITIALIZATIONS` account for journal admission, indexed routing, + and managed document initialization. +- `GRAPH_SNAPSHOTS_REUSED` and `GRAPH_RECONCILIATIONS` account for incremental + Process Embedded topology work. +- `EXTERNAL_PROCESS_CALLS`, `EMBEDDED_EPOCH_PROCESS_CALLS`, + `CHILD_EPOCHS_COMMITTED`, and `PARENT_EPOCH_APPLICATIONS` account for exact + document processor work and committed epoch propagation. Successful external + and parent-application counts are recorded at durable document commit, so a + lost response and receipt reconciliation neither loses nor duplicates them. +- `HISTORICAL_WINDOWS_OPENED`, `HISTORICAL_ENTRIES_REPLAYED`, + `CATCH_UP_BARRIERS_CREATED`, and `CATCH_UP_BARRIERS_COMPLETED` account for + attachment-exclusive history and synchronized catch-up. +- `UNRELATED_DOCUMENT_READS`, `REQUEST_FRAGMENTS`, + `TIMELINE_ENTRY_FRAGMENTS`, `ORDINARY_NODE_FRAGMENTS`, + `FULL_ENVIRONMENT_SCANS`, `SOURCE_REPLAYS_PER_PARENT`, and + `POST_PROCESS_FULL_PROJECTIONS`, `PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY`, and + `CHILD_PROCESS_RERUNS_ON_PARENT_RETRY` are structural release gates and + remain zero only while those forbidden work classes remain absent. + +Detailed implementation counters and phase timers used for integration-test +deltas are exposed only by the test-fixture `CoordinationTestControl`; they are +not part of `CoordinationEngine.metrics()`. In particular, +`process.deliveryPlanDerivation` and `process.platformCommit` are nested inside +`process.frozen`, `process.embeddedInputPreparation` is nested inside +`process.hostBeforeFrozen`, and `process.applyCommitCompanionDelta` is nested +inside `process.hostAfterFrozen`. Parent and nested timers are non-additive. + +Structural release gates require zero request fragments, Timeline Entry +fragments, ordinary-node fragments, full environment scans, per-parent source +replay, unrelated-document reads, and whole post-PROCESS projections. A metric +named in an acceptance gate must have a production producer; tests must not +silently turn an unknown measurement into a passing zero. + +Gauges report managed documents, route rows, journal entries, retained whole +objects and the logical clock. Metrics are release and operational evidence, +not a billing or durable audit contract. diff --git a/docs/reference/public-api.md b/docs/reference/public-api.md new file mode 100644 index 0000000..ee99ac9 --- /dev/null +++ b/docs/reference/public-api.md @@ -0,0 +1,116 @@ +# Public API reference + +The supported application boundary is the small set of types in +`blue.coordination.api`. Full signatures and contracts are in the generated +Javadocs. + +## Lifecycle and commands + +- `CoordinationEngine` creates the in-memory environment and owns resources. +- `Timeline` identifies one authenticated append-only stream. +- `Operation` describes an operation/channel and either YAML or an `ExactValue` + request. +- `DocumentId` identifies one continuing managed document history; a state + BlueId identifies one exact immutable state within that history. +- `ActivationMode` names supported embedded-document temporal behavior. +- `startDocument(..., AdmissionPolicy, verifiedFrontier)` selects top-level + `FULL_HISTORY`, `FROM_FRONTIER`, or `FROM_NOW` behavior. +- `appendTimelineEntry(Node)` validates and stores one externally supplied exact + entry without routing or PROCESS. `append` and `appendAt` are convenience + builders with the same append/process separation. +- `drain()` selects canonical work to quiescence; `drainThrough(cutoff)` stops at + an inclusive upper bound without skipping earlier eligible work. +- `drain(new DrainBudget(processCommits, selectedEntries))` pauses only at a + deterministic safe boundary. Its receipt reports `paused()` and the exact + frozen PROCESS transitions committed by that call; a later drain resumes the + retained entry frame without repeating them. +- `document(id)` returns only a coherent `READY` snapshot. Operational audit and + recovery tooling can use `auditDocument(id)` to inspect committed + `CATCHING_UP` or `BLOCKED` state deliberately. + +The caller never supplies document recipients and cannot select an exact entry +to process ahead of earlier eligible work. `routeTargetCount` is diagnostic; it +uses canonical journal evidence, reports only targets expressible by the pinned +provider model, and does not process the entry. + +## Embedded admission evidence + +The three-argument `configureEmbeddedAdmission(childId, mode, frontier)` is a +convenience default for future occurrences of that child. When attachment +identity matters, append the attachment entry first, then register the +occurrence-specific overload before draining it. That plan binds the parent +DocumentId, canonical absolute occurrence path, child DocumentId, supplied +state BlueId, optional exact child epoch, activation mode, verified frontier, +completeness-proof identity, and expected attachment-entry BlueId. + +Occurrence plans take precedence over the child default and are consumed only +with successful graph publication. A failed publication restores the plan for +an exact retry. If the same exact child-state BlueId occurs at more than one +committed epoch, omitting `admittedEpoch` fails closed; content identity alone +cannot choose temporal position. + +`DrainBudget` limits selected canonical entries and committed frozen PROCESS +transitions, not elapsed time. One frozen PROCESS invocation is atomic and +non-preemptible, and epoch-zero INITIALIZE work performed by an attachment is +outside the PROCESS-commit count. Use `elapsedNanos()` for observed duration, +not as evidence of a deadline guarantee. + +## Target derivation and upstream boundary + +The environment derives recipients from exact active subscription intervals. +Scalar Timeline Channels, Composite Timeline Channels, and the frozen +same-scope All Timelines family are supported. The caller never supplies a +recipient set. + +Repository-native `OperationRequest.document` targeting is supported as a +separate feature. With `requireExactDocumentVersion: true`, only a candidate at +that exact current state is eligible. With a false or absent flag, any retained +known epoch of that candidate is eligible. An absent document leaves routing +unrestricted. + +The pinned generic Timeline Entry model has no universal literal `documentId` +target. That is an optional generalized-profile capability, not a blocker for +environment-derived routing; concrete Channel/message profiles may define exact +target derivation and must continue to fail closed when their evidence is +missing. + +The pinned provider boundary separately has no general Mandate-state resolver +for per-target eligibility. This RC does not infer or simulate authority; +authority-bearing `onBehalfOf` entries fail closed. Exact provider-backed +Mandate resolution remains an upstream blocker. + +## Immutable results + +- `TimelineEntry` is the exact journaled event. +- `TimelineAppendReceipt` proves exact journal admission. +- `ProcessingDrainReceipt` reports environment-selected entry order and groups + `DocumentDispatchOutcome` values by entry. For a bounded call, it contains + only work committed by that call, even when it pauses or resumes an older + entry frame. `quiescent()`, `paused()`, and `blocked()` distinguish completion, + a caller-selected work boundary, and unavailable prerequisite evidence. +- `DocumentSnapshot` is current state plus readiness/frontier evidence. +- `DocumentRevision` is one immutable state transition with provenance. +- `ExactValue` retains verified content identity and frozen form. +- `CoordinationMetrics` exposes cumulative phase timers, work counters and + gauges. + +## Failures + +`CoordinationException` carries a stable `CoordinationErrorCode` plus immutable +details. Invalid identities, missing/not-ready documents, unavailable or +invalid history evidence, route misses, frozen processing failures, atomic +commit failures and ownership violations are explicit. + +## Dependency surface + +The POM exposes `blue-contracts-core`, `blue-bex-core` and +`blue-bex-contracts` at compile scope because public API values and processor +signatures expose their types. Repository and Bouncy Castle remain +runtime-scoped implementation dependencies. All coordinates are exact and +dependency locked. + +`blue.coordination.processor` is an advanced semantic integration surface used +to assemble the retained Contracts/BEX processors. It is documented in the +Javadoc JAR, but ordinary applications should start at `CoordinationEngine`. +`blue.coordination.internal` is never an application API and may change between +release candidates. diff --git a/docs/releases/3.0.0-rc.1-evidence.json b/docs/releases/3.0.0-rc.1-evidence.json new file mode 100644 index 0000000..5e8687f --- /dev/null +++ b/docs/releases/3.0.0-rc.1-evidence.json @@ -0,0 +1,301 @@ +{ + "$schema": "round13-verification.schema.json", + "schemaVersion": "4.1.0", + "release": "3.0.0-rc.1", + "profile": "ROUND13_PLAYGROUND_FIVE_OCCURRENCE", + "evidenceState": "FINAL", + "evidenceDate": "2026-08-13", + "releasePolicy": { + "mode": "RC_WITH_KNOWN_PERFORMANCE_LIMITATION", + "exactRelease": "3.0.0-rc.1", + "decision": "PASS_WITH_KNOWN_PERFORMANCE_LIMITATION", + "performanceReleaseBlocking": false, + "stableReleaseEligible": false, + "nonPerformanceGatesRequired": true, + "explicitWorkflowOptInRequired": true + }, + "status": { + "temporalArchitectureReady": "PASS", + "inMemoryEngineWorkingReady": "PASS", + "playgroundCoreReady": "PASS", + "playgroundLatencyReady": "PASS_WITH_KNOWN_PERFORMANCE_LIMITATION", + "providerBackedReady": "OUT_OF_SCOPE", + "mandateAgentReady": "OUT_OF_SCOPE", + "publicRcReady": "PASS_WITH_KNOWN_PERFORMANCE_LIMITATION" + }, + "verdict": "PASS_WITH_KNOWN_PERFORMANCE_LIMITATION", + "source": { + "baseCommit": "699f019cb9fa1d484a070a5d46a2335fd1cd2dce", + "candidateCommit": "de55822240af4e263bb95dbb98c0579522cdc330", + "binding": "CANDIDATE_COMMIT", + "worktree": "CLEAN", + "dirtyReason": null, + "mainSourceManifestAlgorithm": "SHA-256 over LF-joined rows of repository-relative src/main/java path, one ASCII space, and file SHA-256, sorted by path, with no trailing LF", + "mainSourceManifestSha256": "d0dad91fe3c2d5627c3b1900543b2a82cc9ea323afbb85ad06256da4e2cf3124" + }, + "executionBinding": { + "kind": "CANDIDATE_COMMIT_EXECUTION", + "mainSourceManifestSha256": "d0dad91fe3c2d5627c3b1900543b2a82cc9ea323afbb85ad06256da4e2cf3124", + "candidateCommit": "de55822240af4e263bb95dbb98c0579522cdc330", + "reason": null + }, + "shape": { + "status": "PASS", + "basis": "STATIC_WORKTREE_SNAPSHOT", + "productionClasses": 109, + "productionLines": 25952, + "publicApiSourceTypes": 16, + "limits": { + "productionClasses": 115, + "productionLines": 25952, + "publicApiSourceTypes": 16 + }, + "limitRevisionReason": "The bounded revision from 25,700 to 25,952 transparently covers the occurrence-path audit receipt, closed retry-counter vocabulary and canonical mappings, real retry-monitor producers, the bounded-drain timestamp-consumption fix, the attachment-timestamp robustness guard, retained committed-input recovery evidence, deterministic invalid-entry preflight and terminalization, and injective binding identities; it adds one bounded production evidence type but no public API type or architecture subsystem." + }, + "tests": { + "inventoryBasis": "STATIC_SOURCE_INVENTORY", + "executionStatus": "PASS", + "finalTreeRequired": true, + "tests": 342, + "classes": 85, + "failures": 0, + "errors": 0, + "skipped": 0, + "suites": [ + { + "name": "test", + "status": "PASS", + "tests": 231, + "classes": 33, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + { + "name": "integrationTest", + "status": "PASS", + "tests": 91, + "classes": 41, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + { + "name": "consumerTest", + "status": "PASS", + "tests": 6, + "classes": 1, + "failures": 0, + "errors": 0, + "skipped": 0 + }, + { + "name": "scenarioTest", + "status": "PASS", + "tests": 14, + "classes": 10, + "failures": 0, + "errors": 0, + "skipped": 0 + } + ] + }, + "runtimes": [ + { + "java": "17", + "gate": "clean build -PtestJavaVersion=17; scenarioTest --rerun-tasks -PtestJavaVersion=17; releaseCheck -PtestJavaVersion=17 (build covers test integrationTest consumerTest)", + "status": "PASS", + "durationSeconds": 882 + }, + { + "java": "21", + "gate": "test integrationTest consumerTest scenarioTest --rerun-tasks -PtestJavaVersion=21; releaseCheck -PtestJavaVersion=21", + "status": "PASS", + "durationSeconds": 870 + } + ], + "proofs": [ + { + "id": "five-occurrence-three-session-reuse", + "sourceSet": "scenarioTest", + "testClass": "blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest", + "testMethod": "fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents", + "task": "scenarioTest", + "status": "PASS" + }, + { + "id": "five-occurrence-five-parent-events", + "sourceSet": "scenarioTest", + "testClass": "blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest", + "testMethod": "fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents", + "task": "scenarioTest", + "status": "PASS" + }, + { + "id": "five-occurrence-canonical-path-order", + "sourceSet": "scenarioTest", + "testClass": "blue.coordination.integration.PlaygroundFiveOccurrenceDeterminismScenarioTest", + "testMethod": "reverseRequestInsertionOrderPreservesBlueIdsHistoriesAndEvents", + "task": "scenarioTest", + "status": "PASS" + }, + { + "id": "five-occurrence-retry-exactly-once", + "sourceSet": "integrationTest", + "testClass": "blue.coordination.integration.PlaygroundFiveOccurrenceRetryTest", + "testMethod": "retryCompletesFiveOccurrenceFanoutWithoutReinitializingChildren", + "task": "integrationTest", + "status": "PASS" + }, + { + "id": "five-occurrence-public-JAR-consumer", + "sourceSet": "consumerTest", + "testClass": "blue.coordination.consumer.PublishedArtifactConsumerTest", + "testMethod": "fiveEmbeddedOccurrencesReuseThreeManagedDocuments", + "task": "consumerTest", + "status": "PASS" + }, + { + "id": "five-occurrence-no-generic-fragmentation", + "sourceSet": "scenarioTest", + "testClass": "blue.coordination.integration.PlaygroundFiveOccurrenceInitializationTest", + "testMethod": "fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents", + "task": "scenarioTest", + "status": "PASS" + }, + { + "id": "five-occurrence-host-versus-frozen-time", + "sourceSet": "performance", + "testClass": null, + "testMethod": null, + "task": "round13PlaygroundSample", + "status": "PENDING_VERIFICATION" + } + ], + "performance": { + "round13Campaign": { + "status": "PENDING_VERIFICATION", + "comparison": "SAME_MACHINE_INTERLEAVED_AB", + "baselineArchive": "Archive.zip", + "baselineSha256": "2f303afd9435937145ce7fe09eb655ff1a05ee6ed7484faea62d93544a3ccf3e", + "candidateTask": "round13PlaygroundSample", + "warmups": 3, + "requiredSamples": 30, + "measuredSamples": 0, + "runtimeMarkdown": null, + "runtimeJson": null, + "runtimeProvenanceJson": null, + "pendingReason": "The retained local-composite campaign failed its absolute hard gates and became stale when dependency and tooling bindings switched to published artifacts. The exact 3.0.0-rc.1 workflow policy accepts this as a disclosed known limitation without claiming a current campaign or latency pass." + }, + "historicalRound12": { + "classification": "HISTORICAL_ONLY", + "decisionBasis": false, + "summary": "The retained Round 12 measurements describe a different source profile and are comparison context only; they do not decide Round 13 latency readiness." + } + }, + "structuralEvidence": { + "status": "PASS", + "finalTreeRequired": true, + "requiredZeroCounters": { + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + }, + "artifacts": { + "status": "PASS", + "finalTreeRequired": true, + "mainJarSha256": "af211bbd2a8ca50424f7a9b0ac0056705f5a3d6bafe0a8cd3a8d02e8b164f0ff", + "sourcesJarSha256": "76451fc105dace25d01dc76dfc0813b2ddb06b255eaea374b5186bde7c56bf96", + "javadocJarSha256": "b6cc39927e4aabf945054100ab33c7fcf45589e78feed739e9b3a1351f37a6f3", + "testFixturesJarSha256": "d4393f58502f81583792af01b50f5350d5f8cafa3a9ba4d9752f039661f9cccb" + }, + "sourceArchive": { + "configuration": "CONFIGURED", + "finalTreeRequired": true, + "authoritativeVersionFile": ".cz.toml", + "authoritativeVersionFileIncluded": true, + "reproducibleFileOrder": true, + "preserveFileTimestamps": false, + "duplicatesStrategy": "FAIL", + "exportIgnored": [ + "*.zip", + "build/**", + ".gradle/**", + "__MACOSX/**", + "._*", + "*.jfr", + "*.hprof" + ], + "extractedConfiguration": "PASS", + "focusedTestsStatus": "PASS", + "publishedArtifactSmokeBuild": "PASS", + "verificationReceipt": { + "schemaId": "blue-coordination-round13-source-archive-verification-v1", + "path": "build/reports/round13/source-archive-verification.json" + }, + "checksum": { + "mode": "DETACHED_SHA256_SIDECAR", + "path": "build/distributions/blue-coordination-java-3.0.0-rc.1-source.zip.sha256", + "digest": null + }, + "pendingReason": null + }, + "publicationEvidence": { + "status": "PASS", + "gate": "dependencyPreflight", + "durationSeconds": 30, + "notes": "Fresh dependencyPreflight resolved blue.repo:blue-repo-java:3.0.0-rc.21, blue.bex:blue-bex-core:1.1.0-rc.3, blue.bex:blue-bex-contracts:1.1.0-rc.3, and their complete transitive graph from published repositories with failOnVersionConflict enabled." + }, + "capabilities": [ + { + "id": "single-process-playground", + "category": "capability", + "summary": "Round 13 targets one warmed runtime, one in-memory Coordination engine, a closed local Timeline journal, synchronous drain, and public Java 17 API use." + }, + { + "id": "five-occurrence-shared-document-shape", + "category": "capability", + "summary": "The target profile reuses three unique managed child sessions across five Process Embedded occurrences and exposes five parent initialization-event occurrences." + }, + { + "id": "provider-backed", + "category": "scope", + "summary": "External provider adapters and provider-backed fresh-process durability are explicitly outside this Playground profile." + }, + { + "id": "mandate-agent", + "category": "scope", + "summary": "Mandate-backed delegated operations are explicitly outside Round 13 and unsupported Mandate-backed entries must still be rejected." + } + ], + "blockers": [], + "finalizationRequirements": [ + "At staging time, rerun the complete published-artifact release gate and verify the clean candidate ancestry and unchanged production-source manifest.", + "Require passing Java 17 and Java 21 lanes, all four test suites, all six non-performance Round 13 proof rows, and all eight exact-zero structural counters.", + "Rebuild and verify all four JARs, the reproducible source archive, extracted-source focused tests, and published-artifact smoke.", + "Require complete POM metadata, staged checksums, signatures, and published-dependency resolution before upload.", + "Apply the known-performance-limitation policy only to 3.0.0-rc.1; remediate and pass performance gates before any stable release." + ], + "limitations": [ + "The exact 3.0.0-rc.1 release policy accepts one disclosed Round 13 performance failure for RC evaluation only; it does not classify the latency campaign as passing and cannot authorize a stable release.", + "The engine remains sequential, single-process, synchronous, and in-memory.", + "The retained Round 13 campaign failed append p95 (18.680667 ms > 1.000000 ms hard) and coordination-host p95 (872.356126 ms > 250.000000 ms hard); route p95 (0.097583 ms) and total p95 (3,998.664166 ms) passed hard, while all four preferred targets were missed. The exact receipts remain historical measurement evidence and are not relabeled.", + "Round13B was not applied: candidate embedded-input preparation p95 was 36.940292 ms versus 872.356126 ms coordination-host p95 (about 4.2%), so the optional cache would not address the measured hard misses.", + "NO_POSTFLIGHT_TOOLING_CHANGES binds one frozen importer and receipt generator, the current Round12NbaEvidence, runner, execution and harness surfaces, fixtures, locks, wrapper, composites, baseline, Java runtime, and physical host exactly from preflight through independent verification; no substitution was permitted." + ], + "notClaimed": [ + "provider-backed fresh-process durability", + "database-backed or distributed processing", + "cross-process exactly-once behavior", + "Mandate-backed delegated authority", + "a passing Round 13 latency campaign", + "compliance with the Round 13 append or coordination-host hard p95 limits", + "compliance with all four Round 13 preferred p95 targets" + ] +} diff --git a/docs/releases/3.0.0-rc.1-test-report.md b/docs/releases/3.0.0-rc.1-test-report.md new file mode 100644 index 0000000..64da1fd --- /dev/null +++ b/docs/releases/3.0.0-rc.1-test-report.md @@ -0,0 +1,287 @@ +# 3.0.0-rc.1 Round 13 final verification report + +Evidence date: 2026-08-13. + +## Evidence state + +```text +ROUND13_FINAL_VERIFICATION: PASS_WITH_KNOWN_PERFORMANCE_LIMITATION +``` + +This is the `FINAL` record for the +`ROUND13_PLAYGROUND_FIVE_OCCURRENCE` profile. The exact 3.0.0-rc.1 policy permits +publication for external RC evaluation with one explicitly disclosed known +performance limitation. It does not relabel the retained failed latency +receipt: that historical campaign result remains `FAIL`, the current published- +artifact campaign remains `PENDING_VERIFICATION`, and the exception is forbidden +for a stable release. Complete Java 17 and Java 21 published-artifact lanes +passed, as did all six non-performance proof rows, all eight measured zero counters, all four +artifact builds, and extracted-source configuration, focused tests, and +published-artifact smoke. + +The top-level execution binding is `CANDIDATE_COMMIT_EXECUTION` for candidate +`de55822240af4e263bb95dbb98c0579522cdc330` and production-source manifest +`d0dad91fe3c2d5627c3b1900543b2a82cc9ea323afbb85ad06256da4e2cf3124`. +Documentation and release-policy commits may follow that tested implementation +commit only while it remains an ancestor and the production-source manifest is +unchanged. `stageRelease` independently reruns and verifies every non-performance +gate before staging. + +| Status | Result | Meaning | +| --- | --- | --- | +| `temporalArchitectureReady` | `PASS` | Semantic, initialization, retry, and determinism proofs passed. | +| `inMemoryEngineWorkingReady` | `PASS` | Complete Java 17 and Java 21 published-artifact lanes passed. | +| `playgroundCoreReady` | `PASS` | All six non-performance proofs and eight required zero counters passed. | +| `playgroundLatencyReady` | `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION` | The current campaign is pending and the retained campaign failed; the exact RC-only policy accepts the disclosed limitation without claiming latency compliance. | +| `providerBackedReady` | `OUT_OF_SCOPE` | Provider adapters and provider-backed durability are outside this Playground profile. | +| `mandateAgentReady` | `OUT_OF_SCOPE` | Mandate-backed delegation is outside Round 13; unsupported Mandate entries must still fail closed. | +| `publicRcReady` | `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION` | Publication is allowed only for 3.0.0-rc.1 and only when every non-performance staging gate passes. | + +## Candidate binding and static shape + +The snapshot starts from base commit +`699f019cb9fa1d484a070a5d46a2335fd1cd2dce`. Its production source is bound to +manifest +`d0dad91fe3c2d5627c3b1900543b2a82cc9ea323afbb85ad06256da4e2cf3124`. +The machine evidence records the exact sorted path-and-file-digest algorithm. +The tested candidate is +`de55822240af4e263bb95dbb98c0579522cdc330`. Java lanes, proof and structural +results, artifact hashes, and extracted/focused archive checks are recorded as +`CANDIDATE_COMMIT_EXECUTION` for the unchanged manifest. The retained failed +campaign is separately and exactly identified by the RC-only exception policy. + +| Static worktree shape | Actual | Limit | Result | +| --- | ---: | ---: | --- | +| Java production source files | 109 | 115 | `PASS` | +| Production source lines | 25,952 | 25,952 | `PASS` | +| Public API source types | 16 | 16 | `PASS` | + +The production-line limit is deliberately and transparently revised from +25,700 to 25,952. The bounded delta covers the occurrence-path audit receipt, +closed retry-counter vocabulary and canonical mappings, real retry-monitor +producers, the bounded-drain timestamp-consumption fix, the attachment- +timestamp robustness guard, retained committed-input recovery evidence, +deterministic invalid-entry preflight and terminalization, and injective +binding identities. It adds one bounded production evidence type but no public +API type, architecture subsystem, or shape failure. + +## Source-derived test inventory and candidate execution + +The inventory below is derived from current source annotations. Both complete +fresh published-artifact lanes executed every listed test with zero failures, +errors, or skips. + +| Suite | Classes | Test methods | Failures | Errors | Skipped | Execution | +| --- | ---: | ---: | ---: | ---: | ---: | --- | +| Unit (`test`) | 33 | 231 | 0 | 0 | 0 | `PASS` | +| Integration (`integrationTest`) | 41 | 91 | 0 | 0 | 0 | `PASS` | +| Built-JAR consumer (`consumerTest`) | 1 | 6 | 0 | 0 | 0 | `PASS` | +| Scenarios (`scenarioTest`) | 10 | 14 | 0 | 0 | 0 | `PASS` | +| **Total** | **85** | **342** | **0** | **0** | **0** | **`PASS`** | + +The candidate lanes executed all four source sets with reruns using the +published-artifact default. Staging reruns the release gate from the merged tree. + +| Runtime | Required gate | Status | Duration | +| --- | --- | --- | ---: | +| Java 17 | `clean build`; isolated `scenarioTest --rerun-tasks`; then `releaseCheck`, all with `-PtestJavaVersion=17` | `PASS` | 882 s (14m42s) | +| Java 21 | `test integrationTest consumerTest scenarioTest --rerun-tasks`; then `releaseCheck`, all with `-PtestJavaVersion=21` | `PASS` | 870 s (14m30s) | + +These results are bound to the tested candidate and unchanged production-source +manifest. The stage task verifies candidate ancestry and reruns its full gate. + +## Exact Round 13 proof rows + +These are the seven mandatory proof bindings. The six JUnit/built-JAR proofs +passed against the current manifest in the candidate lanes. The performance +proof remains pending under the exact exception and does not turn the retained +failed campaign into a pass. + +| Proof | Source | Binding | Status | +| --- | --- | --- | --- | +| `five-occurrence-three-session-reuse` | `scenarioTest` | `PlaygroundFiveOccurrenceInitializationTest.fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents` | `PASS` | +| `five-occurrence-five-parent-events` | `scenarioTest` | `PlaygroundFiveOccurrenceInitializationTest.fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents` | `PASS` | +| `five-occurrence-canonical-path-order` | `scenarioTest` | `PlaygroundFiveOccurrenceDeterminismScenarioTest.reverseRequestInsertionOrderPreservesBlueIdsHistoriesAndEvents` | `PASS` | +| `five-occurrence-retry-exactly-once` | `integrationTest` | `PlaygroundFiveOccurrenceRetryTest.retryCompletesFiveOccurrenceFanoutWithoutReinitializingChildren` | `PASS` | +| `five-occurrence-public-JAR-consumer` | `consumerTest` | `PublishedArtifactConsumerTest.fiveEmbeddedOccurrencesReuseThreeManagedDocuments` | `PASS` | +| `five-occurrence-no-generic-fragmentation` | `scenarioTest` | `PlaygroundFiveOccurrenceInitializationTest.fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents` | `PASS` | +| `five-occurrence-host-versus-frozen-time` | `performance` | `round13PlaygroundSample` and the interleaved campaign harness | `PENDING_VERIFICATION` | + +The required final result is five embedding occurrences, three unique managed +child sessions, three initialization calls, five parent PROCESS applications, +five parent-visible initialization-event occurrences, canonical path order, +and no generic fragmentation. The six non-performance JUnit and built-JAR proofs +passed in both Java lanes. The retained campaign records the required counts and +exact host/frozen decomposition; its latency result remains `FAIL`, while the +current performance proof remains pending under the RC-only exception. + +## Structural evidence + +The canonical metric vocabulary contains eight required counters. The fresh +candidate lanes passed the canonical structural assertions, and the +published-artifact sample emitted all eight at zero. The retained historical +campaign also produced every counter at measured zero in all 30 candidate rows, +and its frozen importer rejects an absent counter rather than treating it as +zero. + +| Required zero counter | Value | Status | +| --- | ---: | --- | +| `REQUEST_FRAGMENTS` | 0 | `PASS` | +| `TIMELINE_ENTRY_FRAGMENTS` | 0 | `PASS` | +| `ORDINARY_NODE_FRAGMENTS` | 0 | `PASS` | +| `FULL_ENVIRONMENT_SCANS` | 0 | `PASS` | +| `SOURCE_REPLAYS_PER_PARENT` | 0 | `PASS` | +| `POST_PROCESS_FULL_PROJECTIONS` | 0 | `PASS` | +| `PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY` | 0 | `PASS` | +| `CHILD_PROCESS_RERUNS_ON_PARENT_RETRY` | 0 | `PASS` | + +## Accepted known performance limitation + +The exact 3.0.0-rc.1 release policy accepts the retained campaign as disclosure +evidence for a known RC limitation, not as a latency pass. It is +`SAME_MACHINE_INTERLEAVED_AB`: exact historical +baseline `Archive.zip` (SHA-256 +`2f303afd9435937145ce7fe09eb655ff1a05ee6ed7484faea62d93544a3ccf3e`) +versus the manifest-bound candidate worktree, three warmups, and exactly 30 +measured rows per side in odd A/B, even B/A order. Every row used the same Java +17 runtime identity and entry Blue ID. Campaign ID is +`85fd124f-3235-4874-9143-fc379b37b924`. The retained raw bytes, observed +completion ledger, pre/post bindings, fixtures, locks, wrapper, composite +dependency manifests, baseline archive, and then-current source/harness manifests +are independently revalidated by the importer. The opt-in campaign remains +outside `releaseCheck` and the default build loop. + +The exact archive predates the two retry-counter producers, so its rows mark +those counters unavailable rather than inventing zeros. Every candidate row +produced both retry counters at zero. Every row also proves total is at least +frozen time and `coordinationHostNanos` equals total minus frozen time, with six +frozen process calls. The frozen importer validates that retained evidence; the +fresh `round13PlaygroundSample` lane separately exercises the same invariant. + +Canonical outputs are +[`five-occurrence-runtime.md`](evidence/round13/five-occurrence-runtime.md), +[`five-occurrence-runtime.json`](evidence/round13/five-occurrence-runtime.json), +and [`runtime-provenance.json`](evidence/round13/runtime-provenance.json). + +### All measured distributions + +Values are milliseconds. Each distribution is recomputed from the 30 retained +raw rows for that variant. + +| Variant | Span | p50 ms | p95 ms | max ms | +| --- | --- | ---: | ---: | ---: | +| baseline | requestPreparationNanos | 96.757125 | 109.855584 | 122.837208 | +| baseline | appendNanos | 16.782541 | 19.348042 | 20.221625 | +| baseline | routeNanos | 0.062375 | 0.075208 | 0.076375 | +| baseline | embeddedInputPreparationNanos | 34.646542 | 37.111500 | 37.795750 | +| baseline | hostBeforeFrozenNanos | 39.582125 | 41.871376 | 44.445083 | +| baseline | processFrozenNanos | 2795.280292 | 2897.255416 | 2971.856500 | +| baseline | initializationFrozenNanos | 282.107709 | 307.495041 | 332.215668 | +| baseline | frozenNanos | 3079.054084 | 3187.656792 | 3252.091709 | +| baseline | hostAfterFrozenNanos | 405.517207 | 425.483790 | 425.643793 | +| baseline | initializationHostBeforeFrozenNanos | 107.375959 | 117.220625 | 121.929334 | +| baseline | initializationHostAfterFrozenNanos | 104.437751 | 116.218292 | 116.446376 | +| baseline | graphPublicationNanos | 554.138959 | 609.396334 | 632.298751 | +| baseline | coordinationHostNanos | 841.987252 | 893.884918 | 901.694875 | +| baseline | totalNanos | 3922.524333 | 4073.318000 | 4093.335417 | +| candidate | requestPreparationNanos | 96.784375 | 100.347792 | 101.985625 | +| candidate | appendNanos | 16.881958 | 18.680667 | 32.729000 | +| candidate | routeNanos | 0.061625 | 0.097583 | 0.137333 | +| candidate | embeddedInputPreparationNanos | 34.757083 | 36.940292 | 37.382377 | +| candidate | hostBeforeFrozenNanos | 39.558458 | 42.090460 | 45.703667 | +| candidate | processFrozenNanos | 2783.524999 | 2833.506916 | 2906.517667 | +| candidate | initializationFrozenNanos | 281.715751 | 303.047416 | 304.281708 | +| candidate | frozenNanos | 3065.391458 | 3132.828916 | 3210.799375 | +| candidate | hostAfterFrozenNanos | 402.915208 | 413.814374 | 423.630876 | +| candidate | initializationHostBeforeFrozenNanos | 108.290333 | 112.242209 | 119.242000 | +| candidate | initializationHostAfterFrozenNanos | 104.654584 | 109.720083 | 110.207584 | +| candidate | graphPublicationNanos | 552.389793 | 583.484999 | 622.061500 | +| candidate | coordinationHostNanos | 843.715582 | 872.356126 | 898.613917 | +| candidate | totalNanos | 3907.544583 | 3998.664166 | 4109.413292 | + +### Candidate gate decision + +| Gate | Candidate p95 ms | Preferred max ms | Preferred | Hard max ms | Hard | +| --- | ---: | ---: | --- | ---: | --- | +| Append | 18.680667 | 0.250000 | `MISS` | 1.000000 | `FAIL` | +| Route | 0.097583 | 0.050000 | `MISS` | 0.200000 | `PASS` | +| Coordination host | 872.356126 | 120.000000 | `MISS` | 250.000000 | `FAIL` | +| Total | 3998.664166 | 2500.000000 | `MISS` | 4000.000000 | `PASS` | + +The campaign decision is **`FAIL`**. Append and coordination-host +miss their hard limits; route and total pass hard, while all four metrics miss +preferred. The machine-readable policy records those exact failures and grants +`PASS_WITH_KNOWN_PERFORMANCE_LIMITATION` only to 3.0.0-rc.1. The campaign itself +is not relabeled, and performance remediation remains mandatory before stable. + +Round13B was deliberately not applied. Candidate embedded-input preparation +p95 is 36.940292 ms versus 872.356126 ms coordination-host p95—about 4.2%. +The optional cache targets too little of the measured host span to address the +append or coordination-host hard misses. + +> **NO_POSTFLIGHT_TOOLING_CHANGES:** the tracked importer and receipt generator +> are the same frozen file, and the runner, current `Round12NbaEvidence`, +> candidate execution and harness surfaces, fixtures, locks, wrapper, +> composites, baseline archive and project, Java runtime, and physical host +> must match their exact preflight bindings through postflight, receipt +> generation, and independent verification. No substitution was permitted. +> The importer and generator SHA-256 is +> `e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50`; +> the runner SHA-256 is +> `996210570704b32caf3a3886044f8f1b34c69824c7ba4a0f4518fea2352c7b5d`. + +The Round 12 performance record remains `HISTORICAL_ONLY` and is not part of the +3.0.0-rc.1 exception. + +## Artifacts, source archive, and publication + +Both fresh Java lanes produced byte-identical current-manifest artifacts: + +| Artifact | SHA-256 | Status | +| --- | --- | --- | +| Main JAR | `af211bbd2a8ca50424f7a9b0ac0056705f5a3d6bafe0a8cd3a8d02e8b164f0ff` | `PASS` | +| Sources JAR | `76451fc105dace25d01dc76dfc0813b2ddb06b255eaea374b5186bde7c56bf96` | `PASS` | +| Javadoc JAR | `b6cc39927e4aabf945054100ab33c7fcf45589e78feed739e9b3a1351f37a6f3` | `PASS` | +| Test-fixtures JAR | `d4393f58502f81583792af01b50f5350d5f8cafa3a9ba4d9752f039661f9cccb` | `PASS` | + +The source archive is configured to include authoritative `.cz.toml`, use +reproducible order, strip timestamps, reject duplicates, and exclude nested +ZIPs, build output, Gradle state, macOS metadata, JFR recordings, and heap +dumps. Extracted configuration, expanded focused tests, detached-sidecar +verification, and published-artifact smoke all passed. The source archive +contains this report, so its digest deliberately remains external and `null` in +tracked evidence rather than creating a self-referential hash. The generated +`.sha256` sidecar is authoritative. Staging rebuilds the archive and must verify +that detached sidecar before publication. + +Fresh `dependencyPreflight` passed in 30 seconds: Repository rc.21, BEX core +rc.3, BEX contracts rc.3, and their complete transitive graph resolved from +published repositories with version-conflict checking enabled. This removes +the former upstream artifact blocker. It does not change the failed performance +measurements or waive any staging gate. + +## Finalization boundary + +The exact policy result is +`PASS_WITH_KNOWN_PERFORMANCE_LIMITATION`. It permits 3.0.0-rc.1 staging only when +the tested implementation commit is an ancestor of the clean staging HEAD, the +production-source manifest is identical, Java 17 and Java 21 pass, all six non- +performance proofs and all zero-counter requirements pass, artifact hashes +reproduce, the source archive +and published-artifact smoke pass, dependencies resolve from published +repositories, and POM metadata, checksums, and signatures are complete. The +retained latency campaign remains `FAIL` and the current campaign/proof remain +`PENDING_VERIFICATION`; no performance threshold is represented as passing. +This exception is release-specific and `stableReleaseEligible` is `false`. + +Round 13 claims only a sequential, synchronous, single-process, in-memory +Playground engine with a closed local Timeline journal. It does not claim +provider-backed durability, database or distributed processing, cross-process +exactly-once behavior, Mandate-backed authority, a passing latency campaign, or +compliance with the failed append and coordination-host hard limits. + +Machine-readable evidence is in +[`3.0.0-rc.1-evidence.json`](3.0.0-rc.1-evidence.json), described by +[`round13-verification.schema.json`](round13-verification.schema.json). The +[`round12-verification.schema.json`](round12-verification.schema.json) remains +historical and does not describe the canonical Round 13 evidence. diff --git a/docs/releases/3.0.0-rc.1.md b/docs/releases/3.0.0-rc.1.md new file mode 100644 index 0000000..264d4ab --- /dev/null +++ b/docs/releases/3.0.0-rc.1.md @@ -0,0 +1,133 @@ +# 3.0.0-rc.1 Round 13 Playground five-occurrence profile + +This candidate profile narrows release readiness to the single-process, +single-writer, synchronous, in-memory Playground engine. Its flagship scenario +attaches five Process Embedded occurrences that reuse three unique managed +documents, initialize each child once, and forward five parent-visible +initialization-event occurrences in canonical path order. + +## Current status + +The canonical [verification report](3.0.0-rc.1-test-report.md) and +[machine-readable evidence](3.0.0-rc.1-evidence.json) are a `FINAL` record for +`ROUND13_PLAYGROUND_FIVE_OCCURRENCE`. The exact policy mode is +`RC_WITH_KNOWN_PERFORMANCE_LIMITATION`, applies only to `3.0.0-rc.1`, requires +explicit release-workflow opt-in, and yields +`PASS_WITH_KNOWN_PERFORMANCE_LIMITATION`. It is not eligible for stable release. +Java 17 and Java 21 published-artifact lanes passed, as did all six non- +performance proof rows, all eight zero counters, all four artifact builds, and +extracted-source configuration, focused tests, and published-artifact smoke. +All non-performance release gates remain mandatory. + +| Status | Current result | +| --- | --- | +| Temporal architecture | `PASS` | +| In-memory working engine | `PASS` | +| Playground core | `PASS` | +| Playground latency | `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION` | +| Provider-backed engine | `OUT_OF_SCOPE` | +| Mandate-backed agent authority | `OUT_OF_SCOPE` | +| Public RC | `PASS_WITH_KNOWN_PERFORMANCE_LIMITATION` | + +The current source-derived inventory is 342 tests in 85 classes: 231/33 unit, +91/41 integration, 6/1 built-JAR consumer, and 14/10 scenario tests. Both fresh +lanes passed all 342 tests with zero failures, errors, or skips: Java 17 in +882 seconds (14m42s) across the clean build, isolated scenario rerun, and +release check; Java 21 in 870 seconds (14m30s) across the four-suite rerun and +release check. Both used the published-artifact default. Staging independently +reruns the non-performance gate and requires explicit workflow opt-in to this +exact exception. +The static production shape is 109 Java files, 25,952 lines, and 16 public API +types. + +The line budget is transparently revised from 25,700 to 25,952 for the bounded +occurrence-path audit receipt, closed retry-counter vocabulary and real retry +monitors, bounded-drain timestamp consumption, the attachment-timestamp guard, +retained committed-input recovery evidence, deterministic invalid-entry +preflight and terminalization, and injective binding identities. This adds one +bounded production evidence type but no public API type or new architecture +subsystem. + +## Required Round 13 proof + +Core evidence must pass the exact five-occurrence scenario, retry proof, +canonical insertion-order determinism proof, public-JAR consumer proof, +no-fragmentation proof, and host-versus-frozen-time proof. It must report five +embedding bindings, three child sessions, three child initializations, five +parent PROCESS applications, five forwarded initialization occurrences, +canonical application paths, and all eight required forbidden-work counters at +measured zero. The superseded local-composite campaign confirms its historical +row-level counts, host-versus-frozen decomposition, and all eight candidate +counters across 30 rows. All six non-performance proof rows and the structural +evidence passed in the candidate execution. The current published-artifact +performance proof and campaign remain `PENDING_VERIFICATION`; the RC-only policy +does not represent either as passing. + +The retained historical performance decision used a same-machine interleaved A/B +comparison of the exact `Archive.zip` baseline and then-current local-composite +candidate worktree, with three warmups and 30 raw rows per side. The retained +[runtime Markdown](evidence/round13/five-occurrence-runtime.md), +[runtime JSON](evidence/round13/five-occurrence-runtime.json), and +[provenance JSON](evidence/round13/runtime-provenance.json) independently +recompute every distribution and gate. Campaign +`85fd124f-3235-4874-9143-fc379b37b924` is **`FAIL`**: append p95 is +18.680667 ms against a 1.000000 ms hard limit and coordination-host p95 is +872.356126 ms against 250.000000 ms. Route p95 is 0.097583 ms and total p95 is +3998.664166 ms; both pass hard, while all four metrics miss preferred. + +The historical receipts stay byte-for-byte unchanged. The temporary +`Archive.zip` used to produce them is not a release input and is not required to +stage or publish this RC. + +Round13B was not applied: embedded-input preparation p95 is 36.940292 ms versus +872.356126 ms coordination-host p95 (about 4.2%), so the optional cache would +not address the measured hard misses. Round 12 data remains historical only. + +> **NO_POSTFLIGHT_TOOLING_CHANGES:** one frozen importer and receipt generator, +> runner, current `Round12NbaEvidence`, candidate execution and harness +> surfaces, fixtures, locks, wrapper, composites, baseline, Java runtime, and +> physical host were bound exactly from preflight through independent +> verification. No postflight substitution was permitted. Importer/generator +> SHA-256: +> `e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50`; +> runner SHA-256: +> `996210570704b32caf3a3886044f8f1b34c69824c7ba4a0f4518fea2352c7b5d`. + +## Release boundary + +Both fresh lanes produced byte-identical current-manifest artifacts: + +| Artifact | SHA-256 | Status | +| --- | --- | --- | +| Main JAR | `af211bbd2a8ca50424f7a9b0ac0056705f5a3d6bafe0a8cd3a8d02e8b164f0ff` | `PASS` | +| Sources JAR | `76451fc105dace25d01dc76dfc0813b2ddb06b255eaea374b5186bde7c56bf96` | `PASS` | +| Javadoc JAR | `b6cc39927e4aabf945054100ab33c7fcf45589e78feed739e9b3a1351f37a6f3` | `PASS` | +| Test-fixtures JAR | `d4393f58502f81583792af01b50f5350d5f8cafa3a9ba4d9752f039661f9cccb` | `PASS` | + +Extracted configuration, the expanded focused tests, detached-sidecar +verification, and published-artifact archive smoke passed. Because the source +archive contains this release note, the archive digest stays external and +`null` in tracked evidence instead of becoming self-referential. The generated +`.sha256` sidecar is authoritative; staging rebuilds the archive and verifies +the generated sidecar before publication. + +RC staging requires a tested implementation commit, Java 17 and Java 21 gates, +rebuilt and hashed JARs, a reproducible source archive whose detached checksum +sidecar validates and which passes the focused Round 13 tests after clean +extraction, and published-artifact smoke evidence. The tested implementation +commit may be an ancestor of the clean evidence HEAD when the current production- +source manifest still matches. Fresh +`dependencyPreflight` passed in 30 seconds with Repository rc.21, BEX core rc.3, +BEX contracts rc.3, and the complete conflict-checked transitive graph resolved +from published repositories. Fresh extracted-archive configuration, focused +tests, and published-artifact smoke also passed; local-composite execution was +not substituted for this evidence. + +`stageRelease` accepts this policy only when the workflow supplies the explicit +3.0.0-rc.1 opt-in and every non-performance gate passes. Direct local staging, +other RC versions, and stable releases remain fail-closed. Performance +remediation and a passing campaign are mandatory before stable. +Provider-backed durability, databases, distributed processing, cross-process +exactly-once behavior, and Mandate-backed delegated authority remain explicit +non-claims for this Playground profile. Unsupported Mandate-backed entries must +still be rejected rather than emulated. diff --git a/docs/releases/evidence/round11/baseline-large-host-timings.json b/docs/releases/evidence/round11/baseline-large-host-timings.json new file mode 100644 index 0000000..cabdd3e --- /dev/null +++ b/docs/releases/evidence/round11/baseline-large-host-timings.json @@ -0,0 +1,669 @@ +{ + "schema" : "blue.coordination/basic-test-timings/2.0", + "scenario" : "large-host-embedded-paynote", + "title" : "Large host with autonomous Wadowice PayNote", + "unit" : "nanoseconds", + "steps" : [ { + "step" : "01 start environment", + "nanos" : 356851333 + }, { + "step" : "02 add Alice timeline", + "nanos" : 27792 + }, { + "step" : "03 add Bob timeline", + "nanos" : 3292 + }, { + "step" : "04 add guarantor timeline", + "nanos" : 2708 + }, { + "step" : "05 add restaurant provider timeline", + "nanos" : 2583 + }, { + "step" : "06 start 60 KB host with 43 workflows", + "nanos" : 1404742500 + }, { + "step" : "07 retain real PayNote as one whole request value", + "nanos" : 168106458 + }, { + "step" : "08 attach and initialize autonomous PayNote", + "nanos" : 19566033417 + }, { + "step" : "09 host operation with embedded PayNote present", + "nanos" : 3328891166 + }, { + "step" : "10 PayNote authorize #1 plus parent propagation", + "nanos" : 5540910458 + }, { + "step" : "11 PayNote authorize #2 plus parent propagation", + "nanos" : 5291420875 + }, { + "step" : "12 PayNote restaurant confirmation plus parent propagation", + "nanos" : 6293621750 + }, { + "step" : "13 warm host operation after PayNote changes", + "nanos" : 3390029208 + }, { + "step" : "14 verify exact state and work shape", + "nanos" : 6256875 + }, { + "step" : "15 publish exact phase comparison", + "nanos" : 1894084 + }, { + "step" : "16 close environment", + "nanos" : 119500 + } ], + "totalNanos" : 45352117750, + "details" : [ { + "id" : "attach-paynote", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19566033417, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 27175625 + }, { + "phase" : "indexed route selection", + "nanos" : 568917 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 83016958 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 18358914958 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 144080459 + }, { + "phase" : "unattributed drain residual", + "nanos" : 951409708 + } ], + "attributedNanos" : 19565166625, + "unattributedNanos" : 866792, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 6 + }, { + "counter" : "frozen PROCESS calls", + "value" : 6 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 3 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 6 + }, { + "counter" : "reference-only event inputs", + "value" : 6 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 6 + }, { + "counter" : "subscription intervals reused", + "value" : 24 + } ] + }, { + "id" : "attach-paynote-frozen-lanes", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19566033417, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 3701687375 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 14657227583 + } ], + "attributedNanos" : 18358914958, + "unattributedNanos" : 1207118459, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "attach-paynote-frozen-internals", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19566033417, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 9029921959 + }, { + "phase" : "platform commit", + "nanos" : 9327310999 + } ], + "attributedNanos" : 18357232958, + "unattributedNanos" : 1208800459, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "attach-paynote-host-internals", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19566033417, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 17746083 + }, { + "phase" : "commit companion delta application", + "nanos" : 1201833 + }, { + "phase" : "embedded input preparation", + "nanos" : 70964124 + } ], + "attributedNanos" : 89912040, + "unattributedNanos" : 19476121377, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-cold", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3328891166, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 30974500 + }, { + "phase" : "indexed route selection", + "nanos" : 84166 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 2000 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 3281977250 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 15480750 + }, { + "phase" : "unattributed drain residual", + "nanos" : 102292 + } ], + "attributedNanos" : 3328620958, + "unattributedNanos" : 270208, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 1 + }, { + "counter" : "frozen PROCESS calls", + "value" : 1 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 1 + }, { + "counter" : "reference-only event inputs", + "value" : 1 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 1 + }, { + "counter" : "subscription intervals reused", + "value" : 3 + } ] + }, { + "id" : "host-cold-frozen-lanes", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3328891166, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 3281977250 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 0 + } ], + "attributedNanos" : 3281977250, + "unattributedNanos" : 46913916, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-cold-frozen-internals", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3328891166, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2090447584 + }, { + "phase" : "platform commit", + "nanos" : 1191355292 + } ], + "attributedNanos" : 3281802876, + "unattributedNanos" : 47088290, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-cold-host-internals", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3328891166, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 3852125 + }, { + "phase" : "commit companion delta application", + "nanos" : 61625 + }, { + "phase" : "embedded input preparation", + "nanos" : 0 + } ], + "attributedNanos" : 3913750, + "unattributedNanos" : 3324977416, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-first", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5540910458, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 30550833 + }, { + "phase" : "indexed route selection", + "nanos" : 57417 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 4921583 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 5462001334 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 42688584 + }, { + "phase" : "unattributed drain residual", + "nanos" : 357749 + } ], + "attributedNanos" : 5540577500, + "unattributedNanos" : 332958, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 2 + }, { + "counter" : "frozen PROCESS calls", + "value" : 2 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 2 + }, { + "counter" : "reference-only event inputs", + "value" : 2 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 2 + }, { + "counter" : "subscription intervals reused", + "value" : 9 + } ] + }, { + "id" : "paynote-auth-first-frozen-lanes", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5540910458, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 984539917 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 4477461417 + } ], + "attributedNanos" : 5462001334, + "unattributedNanos" : 78909124, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-first-frozen-internals", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5540910458, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2457499375 + }, { + "phase" : "platform commit", + "nanos" : 3004176417 + } ], + "attributedNanos" : 5461675792, + "unattributedNanos" : 79234666, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-first-host-internals", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5540910458, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 4993124 + }, { + "phase" : "commit companion delta application", + "nanos" : 194250 + }, { + "phase" : "embedded input preparation", + "nanos" : 361500 + } ], + "attributedNanos" : 5548874, + "unattributedNanos" : 5535361584, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-warm", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5291420875, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 32600417 + }, { + "phase" : "indexed route selection", + "nanos" : 62000 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 4045917 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 5212001917 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 42358709 + }, { + "phase" : "unattributed drain residual", + "nanos" : 178582 + } ], + "attributedNanos" : 5291247542, + "unattributedNanos" : 173333, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 2 + }, { + "counter" : "frozen PROCESS calls", + "value" : 2 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 2 + }, { + "counter" : "reference-only event inputs", + "value" : 2 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 2 + }, { + "counter" : "subscription intervals reused", + "value" : 9 + } ] + }, { + "id" : "paynote-auth-warm-frozen-lanes", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5291420875, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 1027285542 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 4184716375 + } ], + "attributedNanos" : 5212001917, + "unattributedNanos" : 79418958, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-warm-frozen-internals", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5291420875, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2476561209 + }, { + "phase" : "platform commit", + "nanos" : 2735112625 + } ], + "attributedNanos" : 5211673834, + "unattributedNanos" : 79747041, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-warm-host-internals", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5291420875, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 4954458 + }, { + "phase" : "commit companion delta application", + "nanos" : 150749 + }, { + "phase" : "embedded input preparation", + "nanos" : 276167 + } ], + "attributedNanos" : 5381374, + "unattributedNanos" : 5286039501, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-restaurant-confirmation", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6293621750, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 31342792 + }, { + "phase" : "indexed route selection", + "nanos" : 56458 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 5442625 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 6207400833 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 48950958 + }, { + "phase" : "unattributed drain residual", + "nanos" : 246376 + } ], + "attributedNanos" : 6293440042, + "unattributedNanos" : 181708, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 3 + }, { + "counter" : "frozen PROCESS calls", + "value" : 3 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 3 + }, { + "counter" : "reference-only event inputs", + "value" : 3 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 3 + }, { + "counter" : "subscription intervals reused", + "value" : 11 + } ] + }, { + "id" : "paynote-restaurant-confirmation-frozen-lanes", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6293621750, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 295176875 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 5912223958 + } ], + "attributedNanos" : 6207400833, + "unattributedNanos" : 86220917, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-restaurant-confirmation-frozen-internals", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6293621750, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2595649583 + }, { + "phase" : "platform commit", + "nanos" : 3611448418 + } ], + "attributedNanos" : 6207098001, + "unattributedNanos" : 86523749, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-restaurant-confirmation-host-internals", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6293621750, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 5222041 + }, { + "phase" : "commit companion delta application", + "nanos" : 229292 + }, { + "phase" : "embedded input preparation", + "nanos" : 388625 + } ], + "attributedNanos" : 5839958, + "unattributedNanos" : 6287781792, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-warm", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3390029208, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 31519834 + }, { + "phase" : "indexed route selection", + "nanos" : 52541 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 2292 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 3342792125 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 15398833 + }, { + "phase" : "unattributed drain residual", + "nanos" : 117251 + } ], + "attributedNanos" : 3389882876, + "unattributedNanos" : 146332, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 1 + }, { + "counter" : "frozen PROCESS calls", + "value" : 1 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 1 + }, { + "counter" : "reference-only event inputs", + "value" : 1 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 1 + }, { + "counter" : "subscription intervals reused", + "value" : 3 + } ] + }, { + "id" : "host-warm-frozen-lanes", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3390029208, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 3342792125 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 0 + } ], + "attributedNanos" : 3342792125, + "unattributedNanos" : 47237083, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-warm-frozen-internals", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3390029208, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2082809375 + }, { + "phase" : "platform commit", + "nanos" : 1259756667 + } ], + "attributedNanos" : 3342566042, + "unattributedNanos" : 47463166, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-warm-host-internals", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3390029208, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 3833125 + }, { + "phase" : "commit companion delta application", + "nanos" : 50709 + }, { + "phase" : "embedded input preparation", + "nanos" : 0 + } ], + "attributedNanos" : 3883834, + "unattributedNanos" : 3386145374, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + } ] +} diff --git a/docs/releases/evidence/round11/baseline-runtime-comparison.json b/docs/releases/evidence/round11/baseline-runtime-comparison.json new file mode 100644 index 0000000..b24e9c9 --- /dev/null +++ b/docs/releases/evidence/round11/baseline-runtime-comparison.json @@ -0,0 +1,288 @@ +{ + "schema" : "blue.coordination/basic-runtime-evidence/2.0", + "generatedAt" : "2026-08-10T06:16:56.363522Z", + "benchmarkRuntime" : { + "java" : "17.0.10", + "vendor" : "Oracle Corporation", + "vm" : "Java HotSpot(TM) 64-Bit Server VM", + "os" : "Mac OS X", + "osVersion" : "26.5.2", + "architecture" : "aarch64" + }, + "unit" : "defined per row", + "rows" : [ { + "scenario" : "Append tiny Counter request, no matching Root", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 200, + "valueUnit" : "ms", + "p50" : 0.088708, + "p95" : 0.121583, + "p99" : 0.175417, + "max" : 0.898166, + "allocationBytes" : null, + "target" : "p50 <= 2 ms; p95 <= 5 ms; max <= 15 ms", + "gate" : "PASS", + "counters" : { + "append.exactRequestsReused" : 400, + "append.journalOperations" : 400, + "TIMELINE_ENTRY_FRAGMENTS" : 0, + "append.eventTemplateHits" : 400, + "frozenProcessCalls" : 0, + "REQUEST_FRAGMENTS" : 0, + "requestsStoredWhole" : 400, + "routing.targetsSelected" : 0, + "append.entriesBuilt" : 400 + }, + "note" : "One exact request reuse, one structurally shared entry template, and one journal append per sample; no route target or PROCESS." + }, { + "scenario" : "Append PayNote-sized request, no matching Root", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 200, + "valueUnit" : "ms", + "p50" : 0.088417, + "p95" : 0.119208, + "p99" : 0.160041, + "max" : 0.413167, + "allocationBytes" : null, + "target" : "p50 <= 5 ms; p95 <= 15 ms; max <= 40 ms", + "gate" : "PASS", + "counters" : { + "append.exactRequestsReused" : 400, + "append.journalOperations" : 400, + "TIMELINE_ENTRY_FRAGMENTS" : 0, + "append.eventTemplateHits" : 400, + "frozenProcessCalls" : 0, + "REQUEST_FRAGMENTS" : 0, + "requestsStoredWhole" : 400, + "routing.targetsSelected" : 0, + "append.entriesBuilt" : 400 + }, + "note" : "The original whole PayNote payload follows the identical operation shape; byte hashing is the only permitted size-dependent work." + }, { + "scenario" : "PayNote/tiny append p95 ratio", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 1, + "valueUnit" : "x", + "p50" : 0.9804660190980647, + "p95" : 0.9804660190980647, + "p99" : 0.9804660190980647, + "max" : 0.9804660190980647, + "allocationBytes" : null, + "target" : "preferred <= 3x; hard <= 5x", + "gate" : "PASS", + "counters" : { + "requestsStoredWhole" : 400, + "append.exactRequestsReused" : 400, + "append.eventTemplateHits" : 400, + "append.entriesBuilt" : 400, + "append.journalOperations" : 400, + "routing.targetsSelected" : 0, + "frozenProcessCalls" : 0, + "REQUEST_FRAGMENTS" : 0, + "TIMELINE_ENTRY_FRAGMENTS" : 0 + }, + "note" : "Ratio of the two alternating 200-sample p95 values." + }, { + "scenario" : "Route one matching Root", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 200, + "valueUnit" : "ms", + "p50" : 0.041625, + "p95" : 0.065709, + "p99" : 0.091791, + "max" : 0.097083, + "allocationBytes" : null, + "target" : "p50 <= 0.25 ms; p95 <= 1 ms; max <= 3 ms", + "gate" : "PASS", + "counters" : { + "routing.targetsSelected" : 200, + "routing.lookups" : 200, + "FULL_ENVIRONMENT_SCANS" : 0 + }, + "note" : "One precompiled exact-key lookup and one target; semantic execution is deliberately outside this span." + }, { + "scenario" : "Counter frozen PROCESS", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 231.807292, + "p95" : 238.82275, + "p99" : 248.172875, + "max" : 248.172875, + "allocationBytes" : null, + "target" : "report frozen floor; exactly one call", + "gate" : "PASS", + "counters" : { + "languageCacheEntries" : 185, + "POST_PROCESS_FULL_PROJECTIONS" : 0, + "deliveryReceiptsCommitted" : 30, + "frozenProcessCalls" : 30, + "languageCacheOversizedRejections" : 0, + "languageCachePinnedRegions" : 2, + "process.referenceOnlyEventInputs" : 30, + "rootOwnershipEscapes" : 0, + "languageCacheRegions" : 7, + "languageCacheHighWaterBytes" : 1261856, + "process.subscriptionIntervalsReused" : 60, + "languageCacheHits" : 0, + "languageCacheEvictions" : 0, + "languageCacheWeightBytes" : 1053542, + "process.commitCompanionDeltasApplied" : 30, + "languageCacheMisses" : 70, + "process.concreteOwnershipRootInputs" : 30, + "processedOccurrencePaths" : 0, + "commitCompanionDeltaNanos" : 1279124, + "layoutNanos" : 1003793 + }, + "note" : "Frozen Language/Contracts/BEX time only, measured from the real production work site." + }, { + "scenario" : "Host overhead around one PROCESS", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 0.598999, + "p95" : 0.636791, + "p99" : 0.710293, + "max" : 0.710293, + "allocationBytes" : null, + "target" : "preferred p95 <= 10 ms; hard p95 <= 25 ms", + "gate" : "PASS", + "counters" : { + "languageCacheEntries" : 185, + "POST_PROCESS_FULL_PROJECTIONS" : 0, + "deliveryReceiptsCommitted" : 30, + "frozenProcessCalls" : 30, + "languageCacheOversizedRejections" : 0, + "languageCachePinnedRegions" : 2, + "process.referenceOnlyEventInputs" : 30, + "rootOwnershipEscapes" : 0, + "languageCacheRegions" : 7, + "languageCacheHighWaterBytes" : 1261856, + "process.subscriptionIntervalsReused" : 60, + "languageCacheHits" : 0, + "languageCacheEvictions" : 0, + "languageCacheWeightBytes" : 1053542, + "process.commitCompanionDeltasApplied" : 30, + "languageCacheMisses" : 70, + "process.concreteOwnershipRootInputs" : 30, + "processedOccurrencePaths" : 0, + "commitCompanionDeltaNanos" : 1279124, + "layoutNanos" : 1003793 + }, + "note" : "Complete dispatch minus route lookup and the single frozen PROCESS; includes exact-state publication and commit-companion delta handling." + }, { + "scenario" : "One workflow versus 61 inherited workflows: host p95 delta", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 1, + "valueUnit" : "ms", + "p50" : 3.310126, + "p95" : 3.310126, + "p99" : 3.310126, + "max" : 3.310126, + "allocationBytes" : null, + "target" : "preferred p95 delta <= 30 ms; hard <= 60 ms", + "gate" : "PASS", + "counters" : { + "oneWorkflowFrozenCalls" : 12, + "sixtyOneWorkflowFrozenCalls" : 12, + "postProcessFullProjections" : 0 + }, + "note" : "Both route tables are compiled at admission; frozen time is excluded from this delta." + }, { + "scenario" : "Existing child catch-up, 20 stored revisions", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 94.65479, + "p95" : 98.776873, + "p99" : 107.359539, + "max" : 107.359539, + "allocationBytes" : null, + "target" : "preferred p95 <= 80 ms; hard <= 150 ms", + "gate" : "PASS", + "counters" : { + "childRevisionApplications" : 630, + "revisionApplicationReceiptsCommitted" : 630, + "frozenProcessCalls" : 660, + "embedding.childSessionsReused" : 30, + "childHistoricalProcessCalls" : 0 + }, + "note" : "The hard 150 ms gate is release-enforced; the preferred 80 ms target remains independently visible. Host time excludes the single parent attachment PROCESS; child source replay remains zero and every historical child revision is published to the parent in exact order." + }, { + "scenario" : "Late child admission, 20 source entries", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 153.850702, + "p95" : 156.082704, + "p99" : 157.339833, + "max" : 157.339833, + "allocationBytes" : null, + "target" : "diagnostic only; no release gate", + "gate" : "OBSERVE", + "counters" : { + "childRevisionApplications" : 630, + "frozenProcessCalls" : 1260, + "temporal.historicalEntriesReplayed" : 600, + "childHistoricalProcessCalls" : 600, + "sessionsCreated" : 30 + }, + "note" : "Twenty bounded Timeline entries are read directly and each unseen child source entry crosses frozen PROCESS exactly once." + }, { + "scenario" : "Nested Root -> Emb1 -> Emb2 catch-up", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 76.752748, + "p95" : 78.819585, + "p99" : 79.134834, + "max" : 79.134834, + "allocationBytes" : null, + "target" : "diagnostic only; no release gate", + "gate" : "OBSERVE", + "counters" : { + "embedding.childSessionsReused" : 30, + "childRevisionApplications" : 120, + "childHistoricalProcessCalls" : 0, + "frozenProcessCalls" : 150 + }, + "note" : "Existing middle/leaf sessions are reused through numeric revision cursors; frozen envelope calls are excluded." + }, { + "scenario" : "NBA historical game catch-up, 5 revisions", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 85.039627, + "p95" : 87.099917, + "p99" : 87.727623, + "max" : 87.727623, + "allocationBytes" : null, + "target" : "preferred p95 <= 120 ms; hard <= 200 ms", + "gate" : "PASS", + "counters" : { + "embedding.childSessionsReused" : 30, + "childRevisionApplications" : 150, + "childHistoricalProcessCalls" : 0, + "frozenProcessCalls" : 180 + }, + "note" : "The existing Game is never replayed; Statistics consumes five ordered revision envelopes. Frozen envelope processing is excluded." + }, { + "scenario" : "Live child revision propagated to two parents", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 62.637166, + "p95" : 64.6495, + "p99" : 66.172001, + "max" : 66.172001, + "allocationBytes" : null, + "target" : "diagnostic only; no release gate", + "gate" : "OBSERVE", + "counters" : { + "childRevisionApplications" : 60, + "revisionApplicationReceiptsCommitted" : 60, + "frozenProcessCalls" : 90 + }, + "note" : "One child PROCESS produces one revision and two state-only parent applications through the inverse parent index." + } ] +} diff --git a/docs/releases/evidence/round11/baseline-runtime-provenance.json b/docs/releases/evidence/round11/baseline-runtime-provenance.json new file mode 100644 index 0000000..7cccafa --- /dev/null +++ b/docs/releases/evidence/round11/baseline-runtime-provenance.json @@ -0,0 +1,54 @@ +{ + "schema": "blue.coordination/basic-runtime-provenance/2.0", + "generatedAt": "2026-08-10T06:21:01.996649Z", + "sourceManifestSha256": "011e48b9c17681afee813e6eefe5dac5c79dedc2258b68a20636ef87e22fccde", + "configurationManifestSha256": "420e5a5e022635a9184e6ed3a1236907424a9af2a88b5c91eca4e4560239eb6f", + "dependencyLockSha256": "2fd586ab9a6b636fd37a82c58db5b985836ea5a93576314ac4e2bec57d3b010e", + "benchmarkRuntime": { + "java": "17.0.10", + "vendor": "Oracle Corporation", + "vm": "Java HotSpot(TM) 64-Bit Server VM", + "os": "Mac OS X", + "osVersion": "26.5.2", + "architecture": "aarch64" + }, + "provenanceProducer": { + "gradle": "9.6.0", + "java": "26.0.1", + "javaVendor": "Oracle Corporation", + "os": "Mac OS X", + "osVersion": "26.5.2", + "architecture": "aarch64" + }, + "samples": { + "microWarmups": 50, + "microSamples": 200, + "processWarmups": 5, + "processSamples": 30, + "documentSamples": 30 + }, + "reports": [ + { + "file": "runtime-comparison.json", + "sha256": "5cd3ba34437f92de9a5efd4e12954aca3b94c82710164aaf507c2257fbcee213" + }, + { + "file": "runtime-comparison.md", + "sha256": "be5756532749b099379fbf9a328d8f3bcb1f8964eb8d20869737e237989bfb22" + }, + { + "file": "large-host-embedded-paynote-timings.json", + "sha256": "f230aee7f6db4e3d29c8831d1c7654236af6b8e4af3cbb6253daa2e545c23ca2" + } + ], + "artifacts": [ + { + "file": "blue-coordination-java-3.0.0-rc.1-test-fixtures.jar", + "sha256": "1b971870300027340058894f0baede49d0c338a4b7b36e163811e1aa8a432e8f" + }, + { + "file": "blue-coordination-java-3.0.0-rc.1.jar", + "sha256": "6f3d71ac4c1ad15667ad2cdf5d83fb62f73bf872b695397fa08e14358dab1c1f" + } + ] +} diff --git a/docs/releases/evidence/round11/final-large-host-timings.json b/docs/releases/evidence/round11/final-large-host-timings.json new file mode 100644 index 0000000..1b55507 --- /dev/null +++ b/docs/releases/evidence/round11/final-large-host-timings.json @@ -0,0 +1,669 @@ +{ + "schema" : "blue.coordination/basic-test-timings/2.0", + "scenario" : "large-host-embedded-paynote", + "title" : "Large host with autonomous Wadowice PayNote", + "unit" : "nanoseconds", + "steps" : [ { + "step" : "01 start environment", + "nanos" : 352760291 + }, { + "step" : "02 add Alice timeline", + "nanos" : 27625 + }, { + "step" : "03 add Bob timeline", + "nanos" : 3250 + }, { + "step" : "04 add guarantor timeline", + "nanos" : 2500 + }, { + "step" : "05 add restaurant provider timeline", + "nanos" : 2417 + }, { + "step" : "06 start 60 KB host with 43 workflows", + "nanos" : 1399850041 + }, { + "step" : "07 retain real PayNote as one whole request value", + "nanos" : 162334500 + }, { + "step" : "08 attach and initialize autonomous PayNote", + "nanos" : 19726741125 + }, { + "step" : "09 host operation with embedded PayNote present", + "nanos" : 3418861166 + }, { + "step" : "10 PayNote authorize #1 plus parent propagation", + "nanos" : 5669663625 + }, { + "step" : "11 PayNote authorize #2 plus parent propagation", + "nanos" : 5350693334 + }, { + "step" : "12 PayNote restaurant confirmation plus parent propagation", + "nanos" : 6348130958 + }, { + "step" : "13 warm host operation after PayNote changes", + "nanos" : 3358734583 + }, { + "step" : "14 verify exact state and work shape", + "nanos" : 5955291 + }, { + "step" : "15 publish exact phase comparison", + "nanos" : 1801458 + }, { + "step" : "16 close environment", + "nanos" : 138750 + } ], + "totalNanos" : 45798860375, + "details" : [ { + "id" : "attach-paynote", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19726741125, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 27798625 + }, { + "phase" : "indexed route selection", + "nanos" : 477500 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 82980251 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 18501098956 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 145660457 + }, { + "phase" : "unattributed drain residual", + "nanos" : 967805294 + } ], + "attributedNanos" : 19725821083, + "unattributedNanos" : 920042, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 6 + }, { + "counter" : "frozen PROCESS calls", + "value" : 6 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 3 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 6 + }, { + "counter" : "reference-only event inputs", + "value" : 6 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 6 + }, { + "counter" : "subscription intervals reused", + "value" : 24 + } ] + }, { + "id" : "attach-paynote-frozen-lanes", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19726741125, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 3721004958 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 14780093998 + } ], + "attributedNanos" : 18501098956, + "unattributedNanos" : 1225642169, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "attach-paynote-frozen-internals", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19726741125, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 9031332791 + }, { + "phase" : "platform commit", + "nanos" : 9468089458 + } ], + "attributedNanos" : 18499422249, + "unattributedNanos" : 1227318876, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "attach-paynote-host-internals", + "parentStep" : "08 attach and initialize autonomous PayNote", + "parentNanos" : 19726741125, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 18144667 + }, { + "phase" : "commit companion delta application", + "nanos" : 1316000 + }, { + "phase" : "embedded input preparation", + "nanos" : 70768166 + } ], + "attributedNanos" : 90228833, + "unattributedNanos" : 19636512292, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-cold", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3418861166, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 32707917 + }, { + "phase" : "indexed route selection", + "nanos" : 76542 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 2209 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 3366187416 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 15707625 + }, { + "phase" : "unattributed drain residual", + "nanos" : 3908833 + } ], + "attributedNanos" : 3418590542, + "unattributedNanos" : 270624, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 1 + }, { + "counter" : "frozen PROCESS calls", + "value" : 1 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 1 + }, { + "counter" : "reference-only event inputs", + "value" : 1 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 1 + }, { + "counter" : "subscription intervals reused", + "value" : 3 + } ] + }, { + "id" : "host-cold-frozen-lanes", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3418861166, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 3366187416 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 0 + } ], + "attributedNanos" : 3366187416, + "unattributedNanos" : 52673750, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-cold-frozen-internals", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3418861166, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2084136583 + }, { + "phase" : "platform commit", + "nanos" : 1281820125 + } ], + "attributedNanos" : 3365956708, + "unattributedNanos" : 52904458, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-cold-host-internals", + "parentStep" : "09 host operation with embedded PayNote present", + "parentNanos" : 3418861166, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 3890917 + }, { + "phase" : "commit companion delta application", + "nanos" : 64542 + }, { + "phase" : "embedded input preparation", + "nanos" : 0 + } ], + "attributedNanos" : 3955459, + "unattributedNanos" : 3414905707, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-first", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5669663625, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 30510958 + }, { + "phase" : "indexed route selection", + "nanos" : 67500 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 4024042 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 5582175791 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 45565834 + }, { + "phase" : "unattributed drain residual", + "nanos" : 6968291 + } ], + "attributedNanos" : 5669312416, + "unattributedNanos" : 351209, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 2 + }, { + "counter" : "frozen PROCESS calls", + "value" : 2 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 2 + }, { + "counter" : "reference-only event inputs", + "value" : 2 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 2 + }, { + "counter" : "subscription intervals reused", + "value" : 9 + } ] + }, { + "id" : "paynote-auth-first-frozen-lanes", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5669663625, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 1013750750 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 4568425041 + } ], + "attributedNanos" : 5582175791, + "unattributedNanos" : 87487834, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-first-frozen-internals", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5669663625, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2483003916 + }, { + "phase" : "platform commit", + "nanos" : 3098826251 + } ], + "attributedNanos" : 5581830167, + "unattributedNanos" : 87833458, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-first-host-internals", + "parentStep" : "10 PayNote authorize #1 plus parent propagation", + "parentNanos" : 5669663625, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 4832333 + }, { + "phase" : "commit companion delta application", + "nanos" : 204708 + }, { + "phase" : "embedded input preparation", + "nanos" : 372209 + } ], + "attributedNanos" : 5409250, + "unattributedNanos" : 5664254375, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-warm", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5350693334, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 31929333 + }, { + "phase" : "indexed route selection", + "nanos" : 54667 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 4068417 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 5264846500 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 42806041 + }, { + "phase" : "unattributed drain residual", + "nanos" : 6790458 + } ], + "attributedNanos" : 5350495416, + "unattributedNanos" : 197918, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 2 + }, { + "counter" : "frozen PROCESS calls", + "value" : 2 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 2 + }, { + "counter" : "reference-only event inputs", + "value" : 2 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 2 + }, { + "counter" : "subscription intervals reused", + "value" : 9 + } ] + }, { + "id" : "paynote-auth-warm-frozen-lanes", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5350693334, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 1027128375 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 4237718125 + } ], + "attributedNanos" : 5264846500, + "unattributedNanos" : 85846834, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-warm-frozen-internals", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5350693334, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2483260334 + }, { + "phase" : "platform commit", + "nanos" : 2781245125 + } ], + "attributedNanos" : 5264505459, + "unattributedNanos" : 86187875, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-auth-warm-host-internals", + "parentStep" : "11 PayNote authorize #2 plus parent propagation", + "parentNanos" : 5350693334, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 4987833 + }, { + "phase" : "commit companion delta application", + "nanos" : 246833 + }, { + "phase" : "embedded input preparation", + "nanos" : 286583 + } ], + "attributedNanos" : 5521249, + "unattributedNanos" : 5345172085, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-restaurant-confirmation", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6348130958, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 33077750 + }, { + "phase" : "indexed route selection", + "nanos" : 55834 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 5896835 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 6253343416 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 48651916 + }, { + "phase" : "unattributed drain residual", + "nanos" : 6936207 + } ], + "attributedNanos" : 6347961958, + "unattributedNanos" : 169000, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 3 + }, { + "counter" : "frozen PROCESS calls", + "value" : 3 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 3 + }, { + "counter" : "reference-only event inputs", + "value" : 3 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 3 + }, { + "counter" : "subscription intervals reused", + "value" : 11 + } ] + }, { + "id" : "paynote-restaurant-confirmation-frozen-lanes", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6348130958, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 304913291 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 5948430125 + } ], + "attributedNanos" : 6253343416, + "unattributedNanos" : 94787542, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-restaurant-confirmation-frozen-internals", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6348130958, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2617440875 + }, { + "phase" : "platform commit", + "nanos" : 3635565959 + } ], + "attributedNanos" : 6253006834, + "unattributedNanos" : 95124124, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "paynote-restaurant-confirmation-host-internals", + "parentStep" : "12 PayNote restaurant confirmation plus parent propagation", + "parentNanos" : 6348130958, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 5280417 + }, { + "phase" : "commit companion delta application", + "nanos" : 224917 + }, { + "phase" : "embedded input preparation", + "nanos" : 431292 + } ], + "attributedNanos" : 5936626, + "unattributedNanos" : 6342194332, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-warm", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3358734583, + "phases" : [ { + "phase" : "append exact whole entry", + "nanos" : 31395667 + }, { + "phase" : "indexed route selection", + "nanos" : 54083 + }, { + "phase" : "Coordination before frozen PROCESS", + "nanos" : 2125 + }, { + "phase" : "all frozen Contracts PROCESS", + "nanos" : 3307632958 + }, { + "phase" : "Coordination after frozen PROCESS", + "nanos" : 15683292 + }, { + "phase" : "unattributed drain residual", + "nanos" : 3798333 + } ], + "attributedNanos" : 3358566458, + "unattributedNanos" : 168125, + "remainderLabel" : "unattributed outer-call overhead", + "counters" : [ { + "counter" : "committed document transitions", + "value" : 1 + }, { + "counter" : "frozen PROCESS calls", + "value" : 1 + }, { + "counter" : "generic fragments", + "value" : 0 + }, { + "counter" : "catalog compilations", + "value" : 0 + }, { + "counter" : "concrete ownership Root inputs", + "value" : 1 + }, { + "counter" : "reference-only event inputs", + "value" : 1 + }, { + "counter" : "post-PROCESS full projections", + "value" : 0 + }, { + "counter" : "commit companion deltas applied", + "value" : 1 + }, { + "counter" : "subscription intervals reused", + "value" : 3 + } ] + }, { + "id" : "host-warm-frozen-lanes", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3358734583, + "phases" : [ { + "phase" : "external frozen Contracts PROCESS", + "nanos" : 3307632958 + }, { + "phase" : "embedded parent frozen PROCESS", + "nanos" : 0 + } ], + "attributedNanos" : 3307632958, + "unattributedNanos" : 51101625, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-warm-frozen-internals", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3358734583, + "phases" : [ { + "phase" : "delivery-plan derivation", + "nanos" : 2093292541 + }, { + "phase" : "platform commit", + "nanos" : 1213856833 + } ], + "attributedNanos" : 3307149374, + "unattributedNanos" : 51585209, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + }, { + "id" : "host-warm-host-internals", + "parentStep" : "13 warm host operation after PayNote changes", + "parentNanos" : 3358734583, + "phases" : [ { + "phase" : "embedded-only structural-sharing layout", + "nanos" : 3880541 + }, { + "phase" : "commit companion delta application", + "nanos" : 53750 + }, { + "phase" : "embedded input preparation", + "nanos" : 0 + } ], + "attributedNanos" : 3934291, + "unattributedNanos" : 3354800292, + "remainderLabel" : "other work in parent step", + "counters" : [ ] + } ] +} diff --git a/docs/releases/evidence/round11/final-runtime-comparison.json b/docs/releases/evidence/round11/final-runtime-comparison.json new file mode 100644 index 0000000..8f5c5ad --- /dev/null +++ b/docs/releases/evidence/round11/final-runtime-comparison.json @@ -0,0 +1,288 @@ +{ + "schema" : "blue.coordination/basic-runtime-evidence/2.0", + "generatedAt" : "2026-08-10T21:35:25.635270Z", + "benchmarkRuntime" : { + "java" : "17.0.10", + "vendor" : "Oracle Corporation", + "vm" : "Java HotSpot(TM) 64-Bit Server VM", + "os" : "Mac OS X", + "osVersion" : "26.5.2", + "architecture" : "aarch64" + }, + "unit" : "defined per row", + "rows" : [ { + "scenario" : "Append tiny Counter request, no matching Root", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 200, + "valueUnit" : "ms", + "p50" : 0.058167, + "p95" : 0.10925, + "p99" : 0.2465, + "max" : 0.494458, + "allocationBytes" : null, + "target" : "p50 <= 2 ms; p95 <= 5 ms; max <= 15 ms", + "gate" : "PASS", + "counters" : { + "routing.targetsSelected" : 0, + "append.entriesBuilt" : 400, + "append.exactRequestsReused" : 400, + "append.journalOperations" : 400, + "TIMELINE_ENTRY_FRAGMENTS" : 0, + "append.eventTemplateHits" : 400, + "frozenProcessCalls" : 0, + "REQUEST_FRAGMENTS" : 0, + "requestsStoredWhole" : 400 + }, + "note" : "One exact request reuse, one structurally shared entry template, and one journal append per sample; no route target or PROCESS." + }, { + "scenario" : "Append PayNote-sized request, no matching Root", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 200, + "valueUnit" : "ms", + "p50" : 0.057083, + "p95" : 0.089708, + "p99" : 0.108959, + "max" : 0.624625, + "allocationBytes" : null, + "target" : "p50 <= 5 ms; p95 <= 15 ms; max <= 40 ms", + "gate" : "PASS", + "counters" : { + "routing.targetsSelected" : 0, + "append.entriesBuilt" : 400, + "append.exactRequestsReused" : 400, + "append.journalOperations" : 400, + "TIMELINE_ENTRY_FRAGMENTS" : 0, + "append.eventTemplateHits" : 400, + "frozenProcessCalls" : 0, + "REQUEST_FRAGMENTS" : 0, + "requestsStoredWhole" : 400 + }, + "note" : "The original whole PayNote payload follows the identical operation shape; byte hashing is the only permitted size-dependent work." + }, { + "scenario" : "PayNote/tiny append p95 ratio", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 1, + "valueUnit" : "x", + "p50" : 0.8211258581235698, + "p95" : 0.8211258581235698, + "p99" : 0.8211258581235698, + "max" : 0.8211258581235698, + "allocationBytes" : null, + "target" : "preferred <= 3x; hard <= 5x", + "gate" : "PASS", + "counters" : { + "requestsStoredWhole" : 400, + "append.exactRequestsReused" : 400, + "append.eventTemplateHits" : 400, + "append.entriesBuilt" : 400, + "append.journalOperations" : 400, + "routing.targetsSelected" : 0, + "frozenProcessCalls" : 0, + "REQUEST_FRAGMENTS" : 0, + "TIMELINE_ENTRY_FRAGMENTS" : 0 + }, + "note" : "Ratio of the two alternating 200-sample p95 values." + }, { + "scenario" : "Route one matching Root", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 200, + "valueUnit" : "ms", + "p50" : 0.044041, + "p95" : 0.076, + "p99" : 0.092167, + "max" : 0.102083, + "allocationBytes" : null, + "target" : "p50 <= 0.25 ms; p95 <= 1 ms; max <= 3 ms", + "gate" : "PASS", + "counters" : { + "FULL_ENVIRONMENT_SCANS" : 0, + "routing.targetsSelected" : 200, + "routing.lookups" : 200 + }, + "note" : "One precompiled exact-key lookup and one target; semantic execution is deliberately outside this span." + }, { + "scenario" : "Counter frozen PROCESS", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 229.683084, + "p95" : 242.746417, + "p99" : 246.825417, + "max" : 246.825417, + "allocationBytes" : null, + "target" : "report frozen floor; exactly one call", + "gate" : "PASS", + "counters" : { + "process.commitCompanionDeltasApplied" : 30, + "languageCacheMisses" : 70, + "process.concreteOwnershipRootInputs" : 30, + "processedOccurrencePaths" : 0, + "commitCompanionDeltaNanos" : 1416253, + "layoutNanos" : 1063206, + "languageCacheEntries" : 185, + "POST_PROCESS_FULL_PROJECTIONS" : 0, + "deliveryReceiptsCommitted" : 30, + "frozenProcessCalls" : 30, + "languageCacheOversizedRejections" : 0, + "languageCachePinnedRegions" : 2, + "process.referenceOnlyEventInputs" : 30, + "rootOwnershipEscapes" : 0, + "languageCacheRegions" : 7, + "languageCacheHighWaterBytes" : 1261856, + "process.subscriptionIntervalsReused" : 60, + "languageCacheHits" : 0, + "languageCacheEvictions" : 0, + "languageCacheWeightBytes" : 1053542 + }, + "note" : "Frozen Language/Contracts/BEX time only, measured from the real production work site." + }, { + "scenario" : "Host overhead around one PROCESS", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 0.62175, + "p95" : 0.725749, + "p99" : 0.768583, + "max" : 0.768583, + "allocationBytes" : null, + "target" : "preferred p95 <= 10 ms; hard p95 <= 25 ms", + "gate" : "PASS", + "counters" : { + "process.commitCompanionDeltasApplied" : 30, + "languageCacheMisses" : 70, + "process.concreteOwnershipRootInputs" : 30, + "processedOccurrencePaths" : 0, + "commitCompanionDeltaNanos" : 1416253, + "layoutNanos" : 1063206, + "languageCacheEntries" : 185, + "POST_PROCESS_FULL_PROJECTIONS" : 0, + "deliveryReceiptsCommitted" : 30, + "frozenProcessCalls" : 30, + "languageCacheOversizedRejections" : 0, + "languageCachePinnedRegions" : 2, + "process.referenceOnlyEventInputs" : 30, + "rootOwnershipEscapes" : 0, + "languageCacheRegions" : 7, + "languageCacheHighWaterBytes" : 1261856, + "process.subscriptionIntervalsReused" : 60, + "languageCacheHits" : 0, + "languageCacheEvictions" : 0, + "languageCacheWeightBytes" : 1053542 + }, + "note" : "Complete dispatch minus route lookup and the single frozen PROCESS; includes exact-state publication and commit-companion delta handling." + }, { + "scenario" : "One workflow versus 61 inherited workflows: host p95 delta", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 1, + "valueUnit" : "ms", + "p50" : 3.200417, + "p95" : 3.200417, + "p99" : 3.200417, + "max" : 3.200417, + "allocationBytes" : null, + "target" : "preferred p95 delta <= 30 ms; hard <= 60 ms", + "gate" : "PASS", + "counters" : { + "oneWorkflowFrozenCalls" : 12, + "sixtyOneWorkflowFrozenCalls" : 12, + "postProcessFullProjections" : 0 + }, + "note" : "Both route tables are compiled at admission; frozen time is excluded from this delta." + }, { + "scenario" : "Existing child catch-up, 20 stored revisions", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 97.077416, + "p95" : 99.233627, + "p99" : 111.100125, + "max" : 111.100125, + "allocationBytes" : null, + "target" : "preferred p95 <= 80 ms; hard <= 150 ms", + "gate" : "PASS", + "counters" : { + "childRevisionApplications" : 630, + "revisionApplicationReceiptsCommitted" : 630, + "frozenProcessCalls" : 660, + "embedding.childSessionsReused" : 30, + "childHistoricalProcessCalls" : 0 + }, + "note" : "The hard 150 ms gate is release-enforced; the preferred 80 ms target remains independently visible. Host time excludes the single parent attachment PROCESS; child source replay remains zero and every historical child revision is published to the parent in exact order." + }, { + "scenario" : "Late child admission, 20 source entries", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 155.231375, + "p95" : 157.939167, + "p99" : 158.653085, + "max" : 158.653085, + "allocationBytes" : null, + "target" : "diagnostic only; no release gate", + "gate" : "OBSERVE", + "counters" : { + "sessionsCreated" : 30, + "childRevisionApplications" : 630, + "frozenProcessCalls" : 1260, + "temporal.historicalEntriesReplayed" : 600, + "childHistoricalProcessCalls" : 600 + }, + "note" : "Twenty bounded Timeline entries are read directly and each unseen child source entry crosses frozen PROCESS exactly once." + }, { + "scenario" : "Nested Root -> Emb1 -> Emb2 catch-up", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 78.380624, + "p95" : 79.914083, + "p99" : 80.205793, + "max" : 80.205793, + "allocationBytes" : null, + "target" : "diagnostic only; no release gate", + "gate" : "OBSERVE", + "counters" : { + "embedding.childSessionsReused" : 30, + "childRevisionApplications" : 120, + "childHistoricalProcessCalls" : 0, + "frozenProcessCalls" : 150 + }, + "note" : "Existing middle/leaf sessions are reused through numeric revision cursors; frozen envelope calls are excluded." + }, { + "scenario" : "NBA historical game catch-up, 5 revisions", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 86.34821, + "p95" : 87.689082, + "p99" : 88.024248, + "max" : 88.024248, + "allocationBytes" : null, + "target" : "preferred p95 <= 120 ms; hard <= 200 ms", + "gate" : "PASS", + "counters" : { + "embedding.childSessionsReused" : 30, + "childRevisionApplications" : 150, + "childHistoricalProcessCalls" : 0, + "frozenProcessCalls" : 180 + }, + "note" : "The existing Game is never replayed; Statistics consumes five ordered revision envelopes. Frozen envelope processing is excluded." + }, { + "scenario" : "Live child revision propagated to two parents", + "baseline" : "unavailable (no authoritative archive result)", + "sampleCount" : 30, + "valueUnit" : "ms", + "p50" : 63.807083, + "p95" : 66.057625, + "p99" : 66.361501, + "max" : 66.361501, + "allocationBytes" : null, + "target" : "diagnostic only; no release gate", + "gate" : "OBSERVE", + "counters" : { + "frozenProcessCalls" : 90, + "childRevisionApplications" : 60, + "revisionApplicationReceiptsCommitted" : 60 + }, + "note" : "One child PROCESS produces one revision and two state-only parent applications through the inverse parent index." + } ] +} diff --git a/docs/releases/evidence/round11/final-runtime-provenance.json b/docs/releases/evidence/round11/final-runtime-provenance.json new file mode 100644 index 0000000..9251195 --- /dev/null +++ b/docs/releases/evidence/round11/final-runtime-provenance.json @@ -0,0 +1,54 @@ +{ + "schema": "blue.coordination/basic-runtime-provenance/2.0", + "generatedAt": "2026-08-10T21:35:25.706945Z", + "sourceManifestSha256": "011e48b9c17681afee813e6eefe5dac5c79dedc2258b68a20636ef87e22fccde", + "configurationManifestSha256": "420e5a5e022635a9184e6ed3a1236907424a9af2a88b5c91eca4e4560239eb6f", + "dependencyLockSha256": "2fd586ab9a6b636fd37a82c58db5b985836ea5a93576314ac4e2bec57d3b010e", + "benchmarkRuntime": { + "java": "17.0.10", + "vendor": "Oracle Corporation", + "vm": "Java HotSpot(TM) 64-Bit Server VM", + "os": "Mac OS X", + "osVersion": "26.5.2", + "architecture": "aarch64" + }, + "provenanceProducer": { + "gradle": "9.6.0", + "java": "26.0.1", + "javaVendor": "Oracle Corporation", + "os": "Mac OS X", + "osVersion": "26.5.2", + "architecture": "aarch64" + }, + "samples": { + "microWarmups": 50, + "microSamples": 200, + "processWarmups": 5, + "processSamples": 30, + "documentSamples": 30 + }, + "reports": [ + { + "file": "runtime-comparison.json", + "sha256": "905f40b44c690fa3a964c5a01c47005659f1c2acf590a4243ad5ac363d24bc64" + }, + { + "file": "runtime-comparison.md", + "sha256": "a3011777ce2349573397825994b7a13e18fad5bcbf818922c140c07222c20bab" + }, + { + "file": "large-host-embedded-paynote-timings.json", + "sha256": "9cc8eec2f2c51b43ad776d6c4b65ee86114c66f6116bcf6880cd0ddda2f8be94" + } + ], + "artifacts": [ + { + "file": "blue-coordination-java-3.0.0-rc.1-test-fixtures.jar", + "sha256": "d5cd13543675f365674eb22bb059fa5f43424cf3ef36c2ea41e87206a0d046c6" + }, + { + "file": "blue-coordination-java-3.0.0-rc.1.jar", + "sha256": "c68fbd36aa35827eddb0066560d10bdfb6b3b302eb7cf6da70d386a72c72a22e" + } + ] +} diff --git a/docs/releases/evidence/round12/nba-shared-game-lifecycle.json b/docs/releases/evidence/round12/nba-shared-game-lifecycle.json new file mode 100644 index 0000000..fb3fc95 --- /dev/null +++ b/docs/releases/evidence/round12/nba-shared-game-lifecycle.json @@ -0,0 +1,288 @@ +{ + "schemaVersion": "round12-nba-evidence-v1", + "status": "MEASURED_SINGLE_SCENARIO", + "spanSemantics": "Logical operation spans are inclusive; nested initialization and parent-application spans are reported independently and must not be summed.", + "sourceState": { + "mainSourceManifestAlgorithm": "SHA-256 of LF-joined sorted repository path, ASCII space, file SHA-256; no trailing LF", + "mainSourceManifestSha256": "b3a78f551809d377db3a7c50002cc942470dade26b5b4bd14e361085862e92ac", + "mainSourceFiles": 108, + "mainSourceLines": 25700, + "campaignSourcesSha256": "2535b2f31f0c275ac23b0cbe512251534073e804af70865d4f499925a8abf111", + "campaignSourceFiles": 12 + }, + "runtime": { + "javaVersion": "21.0.2", + "javaVendor": "Oracle Corporation", + "osName": "Mac OS X", + "osArch": "aarch64" + }, + "spans": [ + { + "name": "Host 1 admission", + "documentId": "round12-host-one", + "epoch": 0, + "transitionKind": "INITIALIZATION", + "sourceEntryBlueId": null, + "causalEntryBlueId": "EBYAFsmQKRwHeXSvC93mw7jVRU1toZM9y7tGCrDXU2DM", + "nanos": { + "append": 0, + "routeLookup": 0, + "hostBeforeFrozen": 29429833, + "frozenProcess": 76591541, + "hostAfterFrozen": 29401625, + "graphPublication": 541, + "embeddedInputPreparation": 0, + "commitReadinessPublication": 9416, + "total": 164292083 + } + }, + { + "name": "Host 1 attachment", + "documentId": "round12-host-one", + "epoch": 1, + "transitionKind": "TIMELINE_ENTRY", + "sourceEntryBlueId": "7MuWK9MZVWAFCD9ZF33gsF6sVVgBufYnmVPdramA56hJ", + "causalEntryBlueId": "7MuWK9MZVWAFCD9ZF33gsF6sVVgBufYnmVPdramA56hJ", + "nanos": { + "append": 16737292, + "routeLookup": 73416, + "hostBeforeFrozen": 16656208, + "frozenProcess": 817551709, + "hostAfterFrozen": 4794791, + "graphPublication": 193399666, + "embeddedInputPreparation": 16405333, + "commitReadinessPublication": 431333, + "total": 1050308041 + } + }, + { + "name": "Game initialization", + "documentId": "round12-shared-game", + "epoch": 0, + "transitionKind": "INITIALIZATION", + "sourceEntryBlueId": null, + "causalEntryBlueId": "7MuWK9MZVWAFCD9ZF33gsF6sVVgBufYnmVPdramA56hJ", + "nanos": { + "append": 0, + "routeLookup": 0, + "hostBeforeFrozen": 33248875, + "frozenProcess": 108726792, + "hostAfterFrozen": 31367375, + "graphPublication": 500, + "embeddedInputPreparation": 0, + "commitReadinessPublication": 62042, + "total": 192920334 + } + }, + { + "name": "Host 1 initialization application", + "documentId": "round12-host-one", + "epoch": 2, + "transitionKind": "EMBEDDED_REVISION_APPLICATION", + "sourceEntryBlueId": null, + "causalEntryBlueId": "7MuWK9MZVWAFCD9ZF33gsF6sVVgBufYnmVPdramA56hJ", + "nanos": { + "append": 0, + "routeLookup": 0, + "hostBeforeFrozen": 16653833, + "frozenProcess": 522297542, + "hostAfterFrozen": 2792750, + "graphPublication": 1125, + "embeddedInputPreparation": 16405333, + "commitReadinessPublication": 12291, + "total": 541794875 + } + }, + { + "name": "Game start", + "documentId": "round12-shared-game", + "epoch": 1, + "transitionKind": "TIMELINE_ENTRY", + "sourceEntryBlueId": "HzArzmnASxsibUvvKsEwrastueNUFMcLrXxzJ2vLcpRU", + "causalEntryBlueId": "HzArzmnASxsibUvvKsEwrastueNUFMcLrXxzJ2vLcpRU", + "nanos": { + "append": 30649958, + "routeLookup": 68000, + "hostBeforeFrozen": 17896042, + "frozenProcess": 715417542, + "hostAfterFrozen": 3940501, + "graphPublication": 2792, + "embeddedInputPreparation": 17429250, + "commitReadinessPublication": 405292, + "total": 768704750 + } + }, + { + "name": "Game first scoring operation", + "documentId": "round12-shared-game", + "epoch": 2, + "transitionKind": "TIMELINE_ENTRY", + "sourceEntryBlueId": "JCrHF9TkYdJrqoVQ7Bu2j1jKdn5Ve42d7DaE5AkjPkn", + "causalEntryBlueId": "JCrHF9TkYdJrqoVQ7Bu2j1jKdn5Ve42d7DaE5AkjPkn", + "nanos": { + "append": 32087458, + "routeLookup": 81417, + "hostBeforeFrozen": 584958, + "frozenProcess": 738926500, + "hostAfterFrozen": 4057125, + "graphPublication": 2125, + "embeddedInputPreparation": 204792, + "commitReadinessPublication": 422293, + "total": 776469459 + } + }, + { + "name": "Host 2 admission", + "documentId": "round12-host-two", + "epoch": 0, + "transitionKind": "INITIALIZATION", + "sourceEntryBlueId": null, + "causalEntryBlueId": "Hw2rsy1Jx1pxmG41j42RKQ28J64J2QfneDZ5Z2jQADNR", + "nanos": { + "append": 0, + "routeLookup": 0, + "hostBeforeFrozen": 28800000, + "frozenProcess": 74040583, + "hostAfterFrozen": 27709917, + "graphPublication": 583, + "embeddedInputPreparation": 0, + "commitReadinessPublication": 5042, + "total": 158528375 + } + }, + { + "name": "Host 2 attachment/catch-up", + "documentId": "round12-host-two", + "epoch": 1, + "transitionKind": "TIMELINE_ENTRY", + "sourceEntryBlueId": "3JPBWa7wAcBUfckDwKCuNTYvuZ9vFU899JWto6uLhBsT", + "causalEntryBlueId": "3JPBWa7wAcBUfckDwKCuNTYvuZ9vFU899JWto6uLhBsT", + "nanos": { + "append": 17831750, + "routeLookup": 162875, + "hostBeforeFrozen": 34879082, + "frozenProcess": 1732094709, + "hostAfterFrozen": 11114208, + "graphPublication": 60373, + "embeddedInputPreparation": 33713541, + "commitReadinessPublication": 418915, + "total": 1797973500 + } + }, + { + "name": "Game second scoring operation", + "documentId": "round12-shared-game", + "epoch": 3, + "transitionKind": "TIMELINE_ENTRY", + "sourceEntryBlueId": "DesqdwiyAWGbZRMuHux8GmJE8qwRv6yYMWP6k91ifR1K", + "causalEntryBlueId": "DesqdwiyAWGbZRMuHux8GmJE8qwRv6yYMWP6k91ifR1K", + "nanos": { + "append": 31771750, + "routeLookup": 67625, + "hostBeforeFrozen": 1401751, + "frozenProcess": 1183422791, + "hostAfterFrozen": 7022666, + "graphPublication": 3625, + "embeddedInputPreparation": 475208, + "commitReadinessPublication": 815042, + "total": 1224973792 + } + }, + { + "name": "Game end", + "documentId": "round12-shared-game", + "epoch": 4, + "transitionKind": "TIMELINE_ENTRY", + "sourceEntryBlueId": "EBQvdJ3tQgT5C3oWzRhr8AdMAkmokkZD7RT1wrHydhN5", + "causalEntryBlueId": "EBQvdJ3tQgT5C3oWzRhr8AdMAkmokkZD7RT1wrHydhN5", + "nanos": { + "append": 29776083, + "routeLookup": 51750, + "hostBeforeFrozen": 1326209, + "frozenProcess": 1317993916, + "hostAfterFrozen": 7407042, + "graphPublication": 7459, + "embeddedInputPreparation": 471417, + "commitReadinessPublication": 789792, + "total": 1357757708 + } + }, + { + "name": "Host 1 end application", + "documentId": "round12-host-one", + "epoch": 6, + "transitionKind": "EMBEDDED_REVISION_APPLICATION", + "sourceEntryBlueId": null, + "causalEntryBlueId": "EBQvdJ3tQgT5C3oWzRhr8AdMAkmokkZD7RT1wrHydhN5", + "nanos": { + "append": 0, + "routeLookup": 0, + "hostBeforeFrozen": 620208, + "frozenProcess": 519248041, + "hostAfterFrozen": 3175250, + "graphPublication": 1167, + "embeddedInputPreparation": 208958, + "commitReadinessPublication": 393625, + "total": 523484000 + } + }, + { + "name": "Host 2 end application", + "documentId": "round12-host-two", + "epoch": 6, + "transitionKind": "EMBEDDED_REVISION_APPLICATION", + "sourceEntryBlueId": null, + "causalEntryBlueId": "EBQvdJ3tQgT5C3oWzRhr8AdMAkmokkZD7RT1wrHydhN5", + "nanos": { + "append": 0, + "routeLookup": 0, + "hostBeforeFrozen": 704168, + "frozenProcess": 533066500, + "hostAfterFrozen": 3407250, + "graphPublication": 5333, + "embeddedInputPreparation": 262459, + "commitReadinessPublication": 381958, + "total": 537606125 + } + } + ], + "hardEvidence": { + "gameSessionsCreated": 1, + "gameSessionsReused": 1, + "gameInitializationRevisions": 1, + "gameInitializationCount": 1, + "host1InitializationEventCount": 1, + "host2InitializationEventCount": 1, + "host1EndingEventCount": 1, + "host2EndingEventCount": 1, + "gameSourceProcessCalls": { + "start": 1, + "firstScore": 1, + "secondScore": 1, + "end": 1 + }, + "initializationEpochApplications": 2, + "initializationEventOccurrencesForwarded": 2, + "parentEpochApplications": 10, + "gameRevisions": 5 + }, + "forbiddenCounters": { + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + }, + "repeatedThreeScenarioP95": { + "status": "PENDING_VERIFICATION", + "historicalBaselineHostMs": { + "warmOrdinary": 15.571, + "warmPayNotePlusParent": 46.645, + "threeLayerRestaurantProduct": 54.696 + }, + "round12CandidateP95Ms": null, + "regressionPercent": null, + "reason": "This artifact is one NBA lifecycle run, not the required repeated same-source three-scenario host p95 campaign." + } +} diff --git a/docs/releases/evidence/round12/three-scenario-p95-provenance.json b/docs/releases/evidence/round12/three-scenario-p95-provenance.json new file mode 100644 index 0000000..d4adba6 --- /dev/null +++ b/docs/releases/evidence/round12/three-scenario-p95-provenance.json @@ -0,0 +1,912 @@ +{ + "schemaVersion": "round12-three-scenario-p95-provenance-v1", + "status": "MEASURED_HARD_GATE_FAILURE", + "generatedAt": "2026-08-11T02:37:59+01:00", + "sourceBinding": { + "mainSourceManifestAlgorithm": "SHA-256 of LF-joined sorted repository path, ASCII space, file SHA-256; no trailing LF", + "mainSourceManifestSha256": "b3a78f551809d377db3a7c50002cc942470dade26b5b4bd14e361085862e92ac", + "mainSourceFiles": 108, + "mainSourceLines": 25700, + "consumedMavenLocalArtifacts": [ + { + "file": "blue-coordination-java-3.0.0-rc.1.jar", + "sha256": "495aded16ce33bf6631800d9f6173c70d9081b378621c87a591afb0ae7cb340c" + }, + { + "file": "blue-coordination-java-3.0.0-rc.1-test-fixtures.jar", + "sha256": "18ce86ff3d1207ca0af133a984a8f93b117170e960a88276bede2c32549c65cb" + } + ], + "blueBasicSourceManifestAlgorithm": "SHA-256 of LF-joined sorted blue-basic src Java/YAML path, ASCII space, file SHA-256; no trailing LF", + "blueBasicSourceManifestSha256": "011e48b9c17681afee813e6eefe5dac5c79dedc2258b68a20636ef87e22fccde", + "blueBasicSourceFiles": 52, + "blueBasicDependencyLockSha256": "2fd586ab9a6b636fd37a82c58db5b985836ea5a93576314ac4e2bec57d3b010e", + "harnessSha256": "3566460a537f5a048a59b2660a19d8a5bf59edbdcf703ed25004b539a5af8349" + }, + "environment": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaVm": "Java HotSpot(TM) 64-Bit Server VM", + "gradleVersion": "9.6.0", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "kernel": "Darwin 25.5.0", + "architecture": "aarch64" + }, + "campaign": { + "scenario": "large-host-embedded-paynote", + "reportSchema": "blue.coordination/basic-test-timings/2.0", + "startedAt": "2026-08-11T02:15:08+01:00", + "completedAt": "2026-08-11T02:37:59+01:00", + "samples": 30, + "successfulSamples": 30, + "isolation": "30 independent Gradle Test tasks, one fork per sample, maxParallelForks=1, --max-workers=1", + "strictPerformanceAssertions": true + }, + "measurementAlgorithm": { + "units": "milliseconds", + "nanosecondsPerMillisecond": 1000000, + "scenarioDetails": { + "warmOrdinary": "host-warm", + "warmPayNotePlusParent": "paynote-auth-warm", + "threeLayerRestaurantProduct": "paynote-restaurant-confirmation" + }, + "append": "append exact whole entry; reported separately and excluded from total", + "host": "indexed route selection + Coordination before frozen PROCESS + Coordination after frozen PROCESS + unattributed drain residual", + "frozen": "all frozen Contracts PROCESS", + "total": "host + frozen", + "percentile": "nearest-rank p95 over 30 samples: ceil(0.95 * 30) = rank 29, sorted zero-based index 28", + "p95Components": "Each append, host, frozen, and total p95 is calculated independently from its own 30-value distribution." + }, + "gates": { + "preferredMaximumRegressionPercent": 10, + "hardMaximumRegressionPercent": 20, + "comparisonMetric": "hostP95Ms" + }, + "samples": [ + { + "sample": 1, + "report": { + "path": "/tmp/blue-round12-p95/sample-01/large-host-embedded-paynote-timings.json", + "sha256": "87c9d8c2fb76d55f12cfcfe71f75fbe0ce3cb417d0a70e7c40d9076041e8b7ed" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 29.739166, + "hostMs": 20.199792, + "frozenMs": 3377.944, + "totalMs": 3398.143792 + }, + "warmPayNotePlusParent": { + "appendMs": 31.023458, + "hostMs": 57.601042, + "frozenMs": 5451.952458, + "totalMs": 5509.5535 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.99875, + "hostMs": 62.275292, + "frozenMs": 6457.020833, + "totalMs": 6519.296125 + } + } + }, + { + "sample": 2, + "report": { + "path": "/tmp/blue-round12-p95/sample-02/large-host-embedded-paynote-timings.json", + "sha256": "56d1b111194ee223a4e5ab5b5f69debe3867c370dc4235f4c4303e606e6ab79d" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.333625, + "hostMs": 20.660417, + "frozenMs": 3380.52875, + "totalMs": 3401.189167 + }, + "warmPayNotePlusParent": { + "appendMs": 32.266583, + "hostMs": 55.293001, + "frozenMs": 5389.353708, + "totalMs": 5444.646709 + }, + "threeLayerRestaurantProduct": { + "appendMs": 34.774583, + "hostMs": 61.880792, + "frozenMs": 6407.110083, + "totalMs": 6468.990875 + } + } + }, + { + "sample": 3, + "report": { + "path": "/tmp/blue-round12-p95/sample-03/large-host-embedded-paynote-timings.json", + "sha256": "11ae5859181a3709ab0f8549a2db166db1cdee3b752ffc2c0b3023247cda0fe3" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 29.405709, + "hostMs": 20.738125, + "frozenMs": 3366.340292, + "totalMs": 3387.078417 + }, + "warmPayNotePlusParent": { + "appendMs": 33.832042, + "hostMs": 56.742293, + "frozenMs": 5456.172666, + "totalMs": 5512.914959 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.823583, + "hostMs": 62.995624, + "frozenMs": 6525.422542, + "totalMs": 6588.418166 + } + } + }, + { + "sample": 4, + "report": { + "path": "/tmp/blue-round12-p95/sample-04/large-host-embedded-paynote-timings.json", + "sha256": "a1cf46d1e7166af986cb312bd083f089d07e84e0a9b38bf2202f04e10535d1dd" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 30.284208, + "hostMs": 20.259625, + "frozenMs": 3370.196208, + "totalMs": 3390.455833 + }, + "warmPayNotePlusParent": { + "appendMs": 33.696083, + "hostMs": 55.553917, + "frozenMs": 5353.408999, + "totalMs": 5408.962916 + }, + "threeLayerRestaurantProduct": { + "appendMs": 33.272, + "hostMs": 64.153541, + "frozenMs": 6411.849167, + "totalMs": 6476.002708 + } + } + }, + { + "sample": 5, + "report": { + "path": "/tmp/blue-round12-p95/sample-05/large-host-embedded-paynote-timings.json", + "sha256": "0e0540753bb9b86f518bfca82df69da6df40322ef5f882a17098347f61714330" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 30.276375, + "hostMs": 20.765958, + "frozenMs": 3369.539959, + "totalMs": 3390.305917 + }, + "warmPayNotePlusParent": { + "appendMs": 31.066375, + "hostMs": 58.508709, + "frozenMs": 5425.807583, + "totalMs": 5484.316292 + }, + "threeLayerRestaurantProduct": { + "appendMs": 29.967834, + "hostMs": 62.482625, + "frozenMs": 6364.113125, + "totalMs": 6426.59575 + } + } + }, + { + "sample": 6, + "report": { + "path": "/tmp/blue-round12-p95/sample-06/large-host-embedded-paynote-timings.json", + "sha256": "d3b95217304cc53ec7644c35142bc8cfcb1e4232d883573a5dab2f51db60cb28" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.138375, + "hostMs": 20.051625, + "frozenMs": 3396.2695, + "totalMs": 3416.321125 + }, + "warmPayNotePlusParent": { + "appendMs": 29.114458, + "hostMs": 58.768375, + "frozenMs": 5432.230625, + "totalMs": 5490.999 + }, + "threeLayerRestaurantProduct": { + "appendMs": 33.091167, + "hostMs": 61.618126, + "frozenMs": 6428.602291, + "totalMs": 6490.220417 + } + } + }, + { + "sample": 7, + "report": { + "path": "/tmp/blue-round12-p95/sample-07/large-host-embedded-paynote-timings.json", + "sha256": "49e0282fdf6e95762e8e4535b6bbc51700e2a73f42f9c990f77860279f3e95c8" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 34.777417, + "hostMs": 20.901999, + "frozenMs": 3417.466709, + "totalMs": 3438.368708 + }, + "warmPayNotePlusParent": { + "appendMs": 32.057125, + "hostMs": 57.747041, + "frozenMs": 5408.577875, + "totalMs": 5466.324916 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.495917, + "hostMs": 63.501792, + "frozenMs": 6317.980958, + "totalMs": 6381.48275 + } + } + }, + { + "sample": 8, + "report": { + "path": "/tmp/blue-round12-p95/sample-08/large-host-embedded-paynote-timings.json", + "sha256": "924e1fc5f86ec2a413fe3e6d6ad6df5857300c6edb288604187e2d02f0d6e3de" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 32.543209, + "hostMs": 20.480541, + "frozenMs": 3347.143292, + "totalMs": 3367.623833 + }, + "warmPayNotePlusParent": { + "appendMs": 32.954417, + "hostMs": 58.445958, + "frozenMs": 5297.809333, + "totalMs": 5356.255291 + }, + "threeLayerRestaurantProduct": { + "appendMs": 31.619334, + "hostMs": 65.541792, + "frozenMs": 6346.317917, + "totalMs": 6411.859709 + } + } + }, + { + "sample": 9, + "report": { + "path": "/tmp/blue-round12-p95/sample-09/large-host-embedded-paynote-timings.json", + "sha256": "651e1b004de6fdd9a47d99dad22effdcfafff2f746f5a8a8a7864d4053dd5b68" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.354041, + "hostMs": 21.102875, + "frozenMs": 3445.635542, + "totalMs": 3466.738417 + }, + "warmPayNotePlusParent": { + "appendMs": 34.861583, + "hostMs": 57.040291, + "frozenMs": 5471.673417, + "totalMs": 5528.713708 + }, + "threeLayerRestaurantProduct": { + "appendMs": 35.987458, + "hostMs": 63.985624, + "frozenMs": 6577.393626, + "totalMs": 6641.37925 + } + } + }, + { + "sample": 10, + "report": { + "path": "/tmp/blue-round12-p95/sample-10/large-host-embedded-paynote-timings.json", + "sha256": "c9b05ffbb6d8907e815e34cae2d1f519e920b24e117f8a4faec7239c065a553c" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 31.693292, + "hostMs": 20.368083, + "frozenMs": 3438.223958, + "totalMs": 3458.592041 + }, + "warmPayNotePlusParent": { + "appendMs": 33.829125, + "hostMs": 58.722125, + "frozenMs": 5445.174458, + "totalMs": 5503.896583 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.83325, + "hostMs": 65.97775, + "frozenMs": 6506.583208, + "totalMs": 6572.560958 + } + } + }, + { + "sample": 11, + "report": { + "path": "/tmp/blue-round12-p95/sample-11/large-host-embedded-paynote-timings.json", + "sha256": "32989a0f0c43ea909fccfcec1ef2547f1d4a4cdf447c931ede516f30b5b2cf78" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 30.632125, + "hostMs": 20.929833, + "frozenMs": 3356.444375, + "totalMs": 3377.374208 + }, + "warmPayNotePlusParent": { + "appendMs": 32.739916, + "hostMs": 55.945917, + "frozenMs": 5297.190625, + "totalMs": 5353.136542 + }, + "threeLayerRestaurantProduct": { + "appendMs": 33.576333, + "hostMs": 63.61104, + "frozenMs": 6332.591626, + "totalMs": 6396.202666 + } + } + }, + { + "sample": 12, + "report": { + "path": "/tmp/blue-round12-p95/sample-12/large-host-embedded-paynote-timings.json", + "sha256": "0ad48cdca6481e2432073d81fe7a5e14ab4a31b866a4e49df4d0e37121627b6d" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 28.88225, + "hostMs": 20.223208, + "frozenMs": 3324.283042, + "totalMs": 3344.50625 + }, + "warmPayNotePlusParent": { + "appendMs": 32.640542, + "hostMs": 58.202334, + "frozenMs": 5353.009208, + "totalMs": 5411.211542 + }, + "threeLayerRestaurantProduct": { + "appendMs": 30.35525, + "hostMs": 62.1175, + "frozenMs": 6387.858833, + "totalMs": 6449.976333 + } + } + }, + { + "sample": 13, + "report": { + "path": "/tmp/blue-round12-p95/sample-13/large-host-embedded-paynote-timings.json", + "sha256": "555096c568acfb8ccf8064b8c86334bd443841f911dc502ac2484d8bae2da524" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 30.14375, + "hostMs": 20.550833, + "frozenMs": 3423.54625, + "totalMs": 3444.097083 + }, + "warmPayNotePlusParent": { + "appendMs": 32.475333, + "hostMs": 55.58975, + "frozenMs": 5419.207333, + "totalMs": 5474.797083 + }, + "threeLayerRestaurantProduct": { + "appendMs": 34.384791, + "hostMs": 65.396584, + "frozenMs": 6424.270208, + "totalMs": 6489.666792 + } + } + }, + { + "sample": 14, + "report": { + "path": "/tmp/blue-round12-p95/sample-14/large-host-embedded-paynote-timings.json", + "sha256": "ed5623613e950f6eb5e302c6daef35286c3a74365879559e47d224d5d165298c" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.76925, + "hostMs": 20.810708, + "frozenMs": 3344.13625, + "totalMs": 3364.946958 + }, + "warmPayNotePlusParent": { + "appendMs": 32.349125, + "hostMs": 54.684125, + "frozenMs": 5353.751583, + "totalMs": 5408.435708 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.416375, + "hostMs": 62.142749, + "frozenMs": 6360.761084, + "totalMs": 6422.903833 + } + } + }, + { + "sample": 15, + "report": { + "path": "/tmp/blue-round12-p95/sample-15/large-host-embedded-paynote-timings.json", + "sha256": "3bdb6ab3ea71facc8bd970671511d318a4a74865d6e320107e2e51ca487f0565" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 32.272167, + "hostMs": 21.212084, + "frozenMs": 3356.32675, + "totalMs": 3377.538834 + }, + "warmPayNotePlusParent": { + "appendMs": 34.795417, + "hostMs": 56.621291, + "frozenMs": 5431.872459, + "totalMs": 5488.49375 + }, + "threeLayerRestaurantProduct": { + "appendMs": 33.185375, + "hostMs": 65.074167, + "frozenMs": 6479.756208, + "totalMs": 6544.830375 + } + } + }, + { + "sample": 16, + "report": { + "path": "/tmp/blue-round12-p95/sample-16/large-host-embedded-paynote-timings.json", + "sha256": "7adfcf9ced0a93bf8b7c9d01a92ef0ffda281c8c768f49500a864b0f132831ff" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 31.161917, + "hostMs": 19.964499, + "frozenMs": 3388.130792, + "totalMs": 3408.095291 + }, + "warmPayNotePlusParent": { + "appendMs": 31.881708, + "hostMs": 54.500958, + "frozenMs": 5306.475083, + "totalMs": 5360.976041 + }, + "threeLayerRestaurantProduct": { + "appendMs": 33.812, + "hostMs": 62.324915, + "frozenMs": 6317.298251, + "totalMs": 6379.623166 + } + } + }, + { + "sample": 17, + "report": { + "path": "/tmp/blue-round12-p95/sample-17/large-host-embedded-paynote-timings.json", + "sha256": "77ee55ca6ec37b29c6fe318925ceb42d7be1197a3cf8b35c924da75619bc148b" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 31.603084, + "hostMs": 20.195458, + "frozenMs": 3336.737417, + "totalMs": 3356.932875 + }, + "warmPayNotePlusParent": { + "appendMs": 33.825834, + "hostMs": 55.454916, + "frozenMs": 5286.913459, + "totalMs": 5342.368375 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.84825, + "hostMs": 61.23725, + "frozenMs": 6292.062375, + "totalMs": 6353.299625 + } + } + }, + { + "sample": 18, + "report": { + "path": "/tmp/blue-round12-p95/sample-18/large-host-embedded-paynote-timings.json", + "sha256": "e95a20561ef19cb81aa70eb721b733a72ca92dc5796ef2899e3ee243578b106a" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 30.76925, + "hostMs": 20.105084, + "frozenMs": 3319.570875, + "totalMs": 3339.675959 + }, + "warmPayNotePlusParent": { + "appendMs": 34.453959, + "hostMs": 54.923333, + "frozenMs": 5302.645125, + "totalMs": 5357.568458 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.388542, + "hostMs": 62.772875, + "frozenMs": 6316.145833, + "totalMs": 6378.918708 + } + } + }, + { + "sample": 19, + "report": { + "path": "/tmp/blue-round12-p95/sample-19/large-host-embedded-paynote-timings.json", + "sha256": "70246de5ea415003573978289b5f92b25db0ee65bcdac44036173b805acb44fe" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 32.467542, + "hostMs": 20.563376, + "frozenMs": 3410.253458, + "totalMs": 3430.816834 + }, + "warmPayNotePlusParent": { + "appendMs": 32.477042, + "hostMs": 55.886291, + "frozenMs": 5491.474584, + "totalMs": 5547.360875 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.182958, + "hostMs": 63.699292, + "frozenMs": 6501.608917, + "totalMs": 6565.308209 + } + } + }, + { + "sample": 20, + "report": { + "path": "/tmp/blue-round12-p95/sample-20/large-host-embedded-paynote-timings.json", + "sha256": "65af289750dedc4a7df7d07aa877114e8ac9375a13c6b1fa3d3abe67d10d6c2d" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.012041, + "hostMs": 21.649084, + "frozenMs": 3497.891708, + "totalMs": 3519.540792 + }, + "warmPayNotePlusParent": { + "appendMs": 36.949458, + "hostMs": 60.756292, + "frozenMs": 5526.919625, + "totalMs": 5587.675917 + }, + "threeLayerRestaurantProduct": { + "appendMs": 33.95725, + "hostMs": 65.651375, + "frozenMs": 6688.500958, + "totalMs": 6754.152333 + } + } + }, + { + "sample": 21, + "report": { + "path": "/tmp/blue-round12-p95/sample-21/large-host-embedded-paynote-timings.json", + "sha256": "55115496a00ce7f8bfeb1d1f773913713b64e1ae5aabda240d3cdea72db8ad7d" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 31.042792, + "hostMs": 20.515958, + "frozenMs": 3352.75975, + "totalMs": 3373.275708 + }, + "warmPayNotePlusParent": { + "appendMs": 31.25125, + "hostMs": 56.922959, + "frozenMs": 5418.151833, + "totalMs": 5475.074792 + }, + "threeLayerRestaurantProduct": { + "appendMs": 30.3045, + "hostMs": 62.872833, + "frozenMs": 6476.231083, + "totalMs": 6539.103916 + } + } + }, + { + "sample": 22, + "report": { + "path": "/tmp/blue-round12-p95/sample-22/large-host-embedded-paynote-timings.json", + "sha256": "a366d898759a8ae5873c76979403dfcdc173713d47637b612d3c4f8d88e83883" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.586375, + "hostMs": 20.206958, + "frozenMs": 3370.110167, + "totalMs": 3390.317125 + }, + "warmPayNotePlusParent": { + "appendMs": 30.952334, + "hostMs": 55.060042, + "frozenMs": 5354.820667, + "totalMs": 5409.880709 + }, + "threeLayerRestaurantProduct": { + "appendMs": 29.071875, + "hostMs": 63.734626, + "frozenMs": 6409.206249, + "totalMs": 6472.940875 + } + } + }, + { + "sample": 23, + "report": { + "path": "/tmp/blue-round12-p95/sample-23/large-host-embedded-paynote-timings.json", + "sha256": "55f3c4bd4bf1bd7c97743511ad844a1699f2b707c3269fe67083eafa9746c5a7" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 29.427417, + "hostMs": 20.965834, + "frozenMs": 3376.86425, + "totalMs": 3397.830084 + }, + "warmPayNotePlusParent": { + "appendMs": 29.364292, + "hostMs": 56.776583, + "frozenMs": 5344.271333, + "totalMs": 5401.047916 + }, + "threeLayerRestaurantProduct": { + "appendMs": 28.385333, + "hostMs": 63.431375, + "frozenMs": 6332.865125, + "totalMs": 6396.2965 + } + } + }, + { + "sample": 24, + "report": { + "path": "/tmp/blue-round12-p95/sample-24/large-host-embedded-paynote-timings.json", + "sha256": "b625440c2f536944d2513a5455a01255b15e225d6d0621f011036538dacb0c99" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 33.404416, + "hostMs": 20.938917, + "frozenMs": 3348.865458, + "totalMs": 3369.804375 + }, + "warmPayNotePlusParent": { + "appendMs": 35.346625, + "hostMs": 58.712, + "frozenMs": 5354.21575, + "totalMs": 5412.92775 + }, + "threeLayerRestaurantProduct": { + "appendMs": 30.417917, + "hostMs": 63.354167, + "frozenMs": 6402.55875, + "totalMs": 6465.912917 + } + } + }, + { + "sample": 25, + "report": { + "path": "/tmp/blue-round12-p95/sample-25/large-host-embedded-paynote-timings.json", + "sha256": "6f45023325bbbdf7b097856054b12232892658bc84360210778aca53a03bcaeb" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 34.235667, + "hostMs": 20.285125, + "frozenMs": 3388.7895, + "totalMs": 3409.074625 + }, + "warmPayNotePlusParent": { + "appendMs": 31.10075, + "hostMs": 56.482415, + "frozenMs": 5450.440251, + "totalMs": 5506.922666 + }, + "threeLayerRestaurantProduct": { + "appendMs": 29.939375, + "hostMs": 62.176458, + "frozenMs": 6461.451834, + "totalMs": 6523.628292 + } + } + }, + { + "sample": 26, + "report": { + "path": "/tmp/blue-round12-p95/sample-26/large-host-embedded-paynote-timings.json", + "sha256": "678b7d1536eb9e637ddae85320d2d77131670ca78b593cc83872ae5c88f2bf3b" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 32.619625, + "hostMs": 20.475959, + "frozenMs": 3351.853458, + "totalMs": 3372.329417 + }, + "warmPayNotePlusParent": { + "appendMs": 32.263833, + "hostMs": 56.358125, + "frozenMs": 5404.480208, + "totalMs": 5460.838333 + }, + "threeLayerRestaurantProduct": { + "appendMs": 30.10825, + "hostMs": 61.892875, + "frozenMs": 6440.315333, + "totalMs": 6502.208208 + } + } + }, + { + "sample": 27, + "report": { + "path": "/tmp/blue-round12-p95/sample-27/large-host-embedded-paynote-timings.json", + "sha256": "0c06f89b0f7fa054a5180f53be470cc12048ed76b3192afe30765bbf636bc84c" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 29.072375, + "hostMs": 20.185958, + "frozenMs": 3372.32075, + "totalMs": 3392.506708 + }, + "warmPayNotePlusParent": { + "appendMs": 34.097875, + "hostMs": 55.393583, + "frozenMs": 5431.400084, + "totalMs": 5486.793667 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.777, + "hostMs": 61.747209, + "frozenMs": 6357.189958, + "totalMs": 6418.937167 + } + } + }, + { + "sample": 28, + "report": { + "path": "/tmp/blue-round12-p95/sample-28/large-host-embedded-paynote-timings.json", + "sha256": "f73951283a1bc90fac9aba0f7e4f21db42bb8b1b7bf79b78cc7842d0c86acd4b" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 32.194042, + "hostMs": 19.883416, + "frozenMs": 3406.832959, + "totalMs": 3426.716375 + }, + "warmPayNotePlusParent": { + "appendMs": 35.513791, + "hostMs": 54.901542, + "frozenMs": 5381.810208, + "totalMs": 5436.71175 + }, + "threeLayerRestaurantProduct": { + "appendMs": 32.426292, + "hostMs": 61.897544, + "frozenMs": 6418.51879, + "totalMs": 6480.416334 + } + } + }, + { + "sample": 29, + "report": { + "path": "/tmp/blue-round12-p95/sample-29/large-host-embedded-paynote-timings.json", + "sha256": "ffca302156dd2f0fa6c922af693e7555bf8776536c2689293e264bd534f601a8" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 32.291958, + "hostMs": 19.964457, + "frozenMs": 3367.729334, + "totalMs": 3387.693791 + }, + "warmPayNotePlusParent": { + "appendMs": 32.953, + "hostMs": 55.742665, + "frozenMs": 5382.842751, + "totalMs": 5438.585416 + }, + "threeLayerRestaurantProduct": { + "appendMs": 28.702709, + "hostMs": 62.570459, + "frozenMs": 6358.265833, + "totalMs": 6420.836292 + } + } + }, + { + "sample": 30, + "report": { + "path": "/tmp/blue-round12-p95/sample-30/large-host-embedded-paynote-timings.json", + "sha256": "6129e8327caf47c0f36984c43499481dd61d6a4c3b2b25af92838c788511f2ba" + }, + "scenarios": { + "warmOrdinary": { + "appendMs": 30.173541, + "hostMs": 20.500792, + "frozenMs": 3414.020625, + "totalMs": 3434.521417 + }, + "warmPayNotePlusParent": { + "appendMs": 32.5965, + "hostMs": 58.733625, + "frozenMs": 5490.24825, + "totalMs": 5548.981875 + }, + "threeLayerRestaurantProduct": { + "appendMs": 31.740542, + "hostMs": 63.071542, + "frozenMs": 6642.383958, + "totalMs": 6705.4555 + } + } + } + ], + "results": { + "warmOrdinary": { + "baselineHostMs": 15.571, + "appendP95Ms": 34.235667, + "hostP95Ms": 21.212084, + "frozenP95Ms": 3445.635542, + "totalP95Ms": 3466.738417, + "regressionPercent": 36.228142, + "preferredGate": "MISS", + "hardGate": "FAIL" + }, + "warmPayNotePlusParent": { + "baselineHostMs": 46.645, + "appendP95Ms": 35.513791, + "hostP95Ms": 58.768375, + "frozenP95Ms": 5491.474584, + "totalP95Ms": 5548.981875, + "regressionPercent": 25.990728, + "preferredGate": "MISS", + "hardGate": "FAIL" + }, + "threeLayerRestaurantProduct": { + "baselineHostMs": 54.696, + "appendP95Ms": 34.774583, + "hostP95Ms": 65.651375, + "frozenP95Ms": 6642.383958, + "totalP95Ms": 6705.4555, + "regressionPercent": 20.029573, + "preferredGate": "MISS", + "hardGate": "FAIL" + } + }, + "overallPreferredGate": "MISS", + "overallHardGate": "FAIL" +} diff --git a/docs/releases/evidence/round13/five-occurrence-runtime.json b/docs/releases/evidence/round13/five-occurrence-runtime.json new file mode 100644 index 0000000..c9273e0 --- /dev/null +++ b/docs/releases/evidence/round13/five-occurrence-runtime.json @@ -0,0 +1,5216 @@ +{ + "schemaId": "blue-coordination-round13-five-occurrence-runtime-v2", + "generatedAt": "2026-08-11T12:24:56.958Z", + "campaignId": "85fd124f-3235-4874-9143-fc379b37b924", + "comparison": "SAME_MACHINE_INTERLEAVED_AB", + "warmups": 3, + "samplesPerVariant": 30, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "runtimeIdentity": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "toolingDisclosure": { + "marker": "NO_POSTFLIGHT_TOOLING_CHANGES", + "reason": "The tracked importer and receipt generator are the same frozen file, and the runner, current Round12NbaEvidence, candidate execution and harness surfaces, fixtures, locks, wrapper, composites, baseline archive and project, Java runtime, and physical host must match their exact preflight bindings through postflight, receipt generation, and independent verification. No postflight tooling or test-lane substitution is permitted.", + "postflightToolingChanges": false, + "importerSha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50", + "receiptGeneratorPath": "/Users/piotr/data/blue-contract-java/scripts/round13-ab-evidence.mjs", + "receiptGeneratorSha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50", + "round12NbaEvidence": { + "path": "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java", + "type": "file", + "size": 24321, + "sha256": "98887e7b42b7f1c15f550dff7178ed241bd53e44c85b4702a2abe2106f45c07c", + "mode": 420 + } + }, + "variants": { + "baseline": { + "rawSamples": [ + { + "pair": 1, + "ordinal": 1, + "startedAt": "2026-08-11T12:02:06.340Z", + "endedAt": "2026-08-11T12:02:30.862Z", + "rawSha256": "cbed8808a51f9989605433da59daab5fe1484da162bfcdf49927b69823d7876e", + "canonicalSha256": "4a1e1f0f27023ae19670ce71bff1cc80f0527723cdde2e5bdea548739c9e5e77", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTQ2MjE3MDksCiAgImFwcGVuZE5hbm9zIjogMTY2MTIxMjUsCiAgInRvdGFsTmFub3MiOiA0MDM0OTk0MzMzLAogICJyb3V0ZU5hbm9zIjogNTQ3MDgsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQzMjk3MDksCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5MDA4MDg1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODk3MjU1NDE2LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyODUzNDU3LAogICJmcm96ZW5OYW5vcyI6IDMxODAxMDg4NzMsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDEyNzc5NTg0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMjM0MDQ1OCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjM0NTcwOCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTYwODExMjUxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTQ4ODU0NjAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 94621709, + "appendNanos": 16612125, + "totalNanos": 4034994333, + "routeNanos": 54708, + "embeddedInputPreparationNanos": 34329709, + "hostBeforeFrozenNanos": 39008085, + "processFrozenNanos": 2897255416, + "initializationFrozenNanos": 282853457, + "frozenNanos": 3180108873, + "hostAfterFrozenNanos": 412779584, + "initializationHostBeforeFrozenNanos": 112340458, + "initializationHostAfterFrozenNanos": 106345708, + "graphPublicationNanos": 560811251, + "coordinationHostNanos": 854885460, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 2, + "ordinal": 4, + "startedAt": "2026-08-11T12:03:15.960Z", + "endedAt": "2026-08-11T12:03:38.374Z", + "rawSha256": "2d710e19cdc66b6bfa611286c486500a7fffd12c93c613b65bdd6984e2d109ed", + "canonicalSha256": "f8890959f06322dd8ff07522fc80b9eae7dac3ef81700ca69e9592479ee9c2f9", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcwNDI2NjcsCiAgImFwcGVuZE5hbm9zIjogMTYxMDYzNzUsCiAgInRvdGFsTmFub3MiOiAzODg4NzkxMjkyLAogICJyb3V0ZU5hbm9zIjogNTQ2NjcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQwODA2MjYsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4Njk0ODc1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzY5Nzk2NTg0LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyODMzNDU4LAogICJmcm96ZW5OYW5vcyI6IDMwNTI2MzAwNDIsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk5MjczMTI2LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODI3OTcwOCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDkwNDY2NSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU0ODMzNzUwLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzYxNjEyNTAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97042667, + "appendNanos": 16106375, + "totalNanos": 3888791292, + "routeNanos": 54667, + "embeddedInputPreparationNanos": 34080626, + "hostBeforeFrozenNanos": 38694875, + "processFrozenNanos": 2769796584, + "initializationFrozenNanos": 282833458, + "frozenNanos": 3052630042, + "hostAfterFrozenNanos": 399273126, + "initializationHostBeforeFrozenNanos": 108279708, + "initializationHostAfterFrozenNanos": 104904665, + "graphPublicationNanos": 554833750, + "coordinationHostNanos": 836161250, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 3, + "ordinal": 5, + "startedAt": "2026-08-11T12:03:38.443Z", + "endedAt": "2026-08-11T12:04:00.668Z", + "rawSha256": "aabb2fc954f6709d6ec38291d5e86db3c9801600592f93359e2059c73c43a93a", + "canonicalSha256": "adba7ccb53c7b55a28146a8ff71329575254c36118747d3e0dce85d5bbc2e481", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY0MTcyOTIsCiAgImFwcGVuZE5hbm9zIjogMTYwNjU3MDgsCiAgInRvdGFsTmFub3MiOiAzODI4NTI5MjUwLAogICJyb3V0ZU5hbm9zIjogNjEwMDAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzMwNzc1MDEsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM3Njg4MDQzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzIxODQwOTU3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc5Nzg0NDU4LAogICJmcm96ZW5OYW5vcyI6IDMwMDE2MjU0MTUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk1MjI2ODMyLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjEwMzI5MywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzMzNTQ1OCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ3NjYwMjkxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MjY5MDM4MzUsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96417292, + "appendNanos": 16065708, + "totalNanos": 3828529250, + "routeNanos": 61000, + "embeddedInputPreparationNanos": 33077501, + "hostBeforeFrozenNanos": 37688043, + "processFrozenNanos": 2721840957, + "initializationFrozenNanos": 279784458, + "frozenNanos": 3001625415, + "hostAfterFrozenNanos": 395226832, + "initializationHostBeforeFrozenNanos": 106103293, + "initializationHostAfterFrozenNanos": 103335458, + "graphPublicationNanos": 547660291, + "coordinationHostNanos": 826903835, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 4, + "ordinal": 8, + "startedAt": "2026-08-11T12:04:46.081Z", + "endedAt": "2026-08-11T12:05:08.531Z", + "rawSha256": "cf9a368013b359a16695244411d39df237c89a2a13ed9724e6b95ce3f96e78e3", + "canonicalSha256": "73473fea2440828bc2b422005497565702a8d10267b12805731be0bd75cf800c", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTYxNjEwNDIsCiAgImFwcGVuZE5hbm9zIjogMTgxNzY2NjcsCiAgInRvdGFsTmFub3MiOiA0MDkzMzM1NDE3LAogICJyb3V0ZU5hbm9zIjogNjIzNzUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM0MDY0MTUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MjA5NzkwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyOTcxODU2NTAwLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgwMjM1MjA5LAogICJmcm96ZW5OYW5vcyI6IDMyNTIwOTE3MDksCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1NjE4NzUwLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzA4NTI5MiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMjQ3MjA0MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ4OTMwMDQyLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDEyNDM3MDgsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96161042, + "appendNanos": 18176667, + "totalNanos": 4093335417, + "routeNanos": 62375, + "embeddedInputPreparationNanos": 33406415, + "hostBeforeFrozenNanos": 38209790, + "processFrozenNanos": 2971856500, + "initializationFrozenNanos": 280235209, + "frozenNanos": 3252091709, + "hostAfterFrozenNanos": 405618750, + "initializationHostBeforeFrozenNanos": 107085292, + "initializationHostAfterFrozenNanos": 102472042, + "graphPublicationNanos": 548930042, + "coordinationHostNanos": 841243708, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 5, + "ordinal": 9, + "startedAt": "2026-08-11T12:05:08.603Z", + "endedAt": "2026-08-11T12:05:31.260Z", + "rawSha256": "16e701d0086bcbb0468fe16bd5dcad8e8b8c6df7fdbd2f7e60b39f9daef38167", + "canonicalSha256": "f12ef930e26d551eed832dc23300321b8ba2224ae14510053126627ff3e27b55", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTkzNTQyNTAsCiAgImFwcGVuZE5hbm9zIjogMTc0OTY0NTgsCiAgInRvdGFsTmFub3MiOiAzOTEzNTgwMzMzLAogICJyb3V0ZU5hbm9zIjogNjQ5MTYsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQzNTQwMDEsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4OTYyMDQzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzg4ODM3NjY4LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0MzYzMDAxLAogICJmcm96ZW5OYW5vcyI6IDMwNzMyMDA2NjksCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk4OTc3NDE1LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTIyNjEyNSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzc1MjA0MCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU2MjQ0NjY0LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDAzNzk2NjQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 99354250, + "appendNanos": 17496458, + "totalNanos": 3913580333, + "routeNanos": 64916, + "embeddedInputPreparationNanos": 34354001, + "hostBeforeFrozenNanos": 38962043, + "processFrozenNanos": 2788837668, + "initializationFrozenNanos": 284363001, + "frozenNanos": 3073200669, + "hostAfterFrozenNanos": 398977415, + "initializationHostBeforeFrozenNanos": 109226125, + "initializationHostAfterFrozenNanos": 103752040, + "graphPublicationNanos": 556244664, + "coordinationHostNanos": 840379664, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 6, + "ordinal": 12, + "startedAt": "2026-08-11T12:06:17.444Z", + "endedAt": "2026-08-11T12:06:40.348Z", + "rawSha256": "8e3f14b13833d9719096fd84ef4ee8c2bc6f7d0d5015bb188fb55cc304aa7ac4", + "canonicalSha256": "081410ab41be728d98eee2f3248037de74eced1773e9a1194bc1b07abccd9445", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTg1NzU2MjUsCiAgImFwcGVuZE5hbm9zIjogMTcwNTkxNjcsCiAgInRvdGFsTmFub3MiOiAzODk2ODc0MDQyLAogICJyb3V0ZU5hbm9zIjogNTk5MTcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ3OTU2MjUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5NTk2MTI2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzcxOTE4MjA3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0NzE2MDAwLAogICJmcm96ZW5OYW5vcyI6IDMwNTY2MzQyMDcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxODMwODc2LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzM1MzY2NywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzQ5NTcwOCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU0MTYyMDAxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDAyMzk4MzUsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 98575625, + "appendNanos": 17059167, + "totalNanos": 3896874042, + "routeNanos": 59917, + "embeddedInputPreparationNanos": 34795625, + "hostBeforeFrozenNanos": 39596126, + "processFrozenNanos": 2771918207, + "initializationFrozenNanos": 284716000, + "frozenNanos": 3056634207, + "hostAfterFrozenNanos": 401830876, + "initializationHostBeforeFrozenNanos": 107353667, + "initializationHostAfterFrozenNanos": 103495708, + "graphPublicationNanos": 554162001, + "coordinationHostNanos": 840239835, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 7, + "ordinal": 13, + "startedAt": "2026-08-11T12:06:40.415Z", + "endedAt": "2026-08-11T12:07:03.065Z", + "rawSha256": "25a897bfedf113681689884b37cc59a8bc9f4ab2c38d02d9d4a12818b532a460", + "canonicalSha256": "13d1d10c7a7682da6b0d4d7416c8416c4e2737a9fe54a53912c668fbb6aa2cb1", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTU5ODY0NTksCiAgImFwcGVuZE5hbm9zIjogMTYwMTA3MDgsCiAgInRvdGFsTmFub3MiOiAzODQzNTMxOTU4LAogICJyb3V0ZU5hbm9zIjogNjQ5NTksCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzYxNjU5NTksCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwNzg2MTI2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzM3MjIyNjY2LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc4NTk0MjkzLAogICJmcm96ZW5OYW5vcyI6IDMwMTU4MTY5NTksCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk0MTgyNjY3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjM1MDQ1OCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMTgxMDg3NSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ1ODk1MTY4LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4Mjc3MTQ5OTksCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95986459, + "appendNanos": 16010708, + "totalNanos": 3843531958, + "routeNanos": 64959, + "embeddedInputPreparationNanos": 36165959, + "hostBeforeFrozenNanos": 40786126, + "processFrozenNanos": 2737222666, + "initializationFrozenNanos": 278594293, + "frozenNanos": 3015816959, + "hostAfterFrozenNanos": 394182667, + "initializationHostBeforeFrozenNanos": 106350458, + "initializationHostAfterFrozenNanos": 101810875, + "graphPublicationNanos": 545895168, + "coordinationHostNanos": 827714999, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 8, + "ordinal": 16, + "startedAt": "2026-08-11T12:07:48.837Z", + "endedAt": "2026-08-11T12:08:11.094Z", + "rawSha256": "97ee49687bff1a27c48f9eb49ae0ef9a5008ca3724bde30c537e004785ad6ab7", + "canonicalSha256": "5d208c7254ff97993ad9cca41f99ad462bb04a8c128f1643fbc207497d3706c0", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY2OTE5NTgsCiAgImFwcGVuZE5hbm9zIjogMTY0NjMxMjUsCiAgInRvdGFsTmFub3MiOiAzODc1NTg5NDU4LAogICJyb3V0ZU5hbm9zIjogNjI2NjcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzcxMTE1MDAsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxNzU2NzUwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzU1OTE2MTY3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0OTc4NDE3LAogICJmcm96ZW5OYW5vcyI6IDMwNDA4OTQ1ODQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk2MTY5MDAyLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjYxMDM3NSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzA4Nzg3NSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU0ODI5NzA4LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzQ2OTQ4NzQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96691958, + "appendNanos": 16463125, + "totalNanos": 3875589458, + "routeNanos": 62667, + "embeddedInputPreparationNanos": 37111500, + "hostBeforeFrozenNanos": 41756750, + "processFrozenNanos": 2755916167, + "initializationFrozenNanos": 284978417, + "frozenNanos": 3040894584, + "hostAfterFrozenNanos": 396169002, + "initializationHostBeforeFrozenNanos": 106610375, + "initializationHostAfterFrozenNanos": 103087875, + "graphPublicationNanos": 554829708, + "coordinationHostNanos": 834694874, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 9, + "ordinal": 17, + "startedAt": "2026-08-11T12:08:11.162Z", + "endedAt": "2026-08-11T12:08:33.670Z", + "rawSha256": "bfd75b69e20acfef674d927b3160e70df216d75b6101b846c24aab43df17f2d0", + "canonicalSha256": "2d3d7dab9db6108d7076fb98f2353217f78ecabc048b7fa8bc132aa93e3e2294", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY0NjgxNjcsCiAgImFwcGVuZE5hbm9zIjogMTYzOTQ5NTgsCiAgInRvdGFsTmFub3MiOiAzOTM1NjY2MzMzLAogICJyb3V0ZU5hbm9zIjogNjQ0MTcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzUzMzczNzUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwMDA0MDg0LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk2NzAyMTI1LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg1MDQ0NTgzLAogICJmcm96ZW5OYW5vcyI6IDMwODE3NDY3MDgsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1Njk2NDE3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMTMxODI1MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwODExODI5MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTY0NzA5MDQyLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTM5MTk2MjUsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96468167, + "appendNanos": 16394958, + "totalNanos": 3935666333, + "routeNanos": 64417, + "embeddedInputPreparationNanos": 35337375, + "hostBeforeFrozenNanos": 40004084, + "processFrozenNanos": 2796702125, + "initializationFrozenNanos": 285044583, + "frozenNanos": 3081746708, + "hostAfterFrozenNanos": 405696417, + "initializationHostBeforeFrozenNanos": 111318251, + "initializationHostAfterFrozenNanos": 108118292, + "graphPublicationNanos": 564709042, + "coordinationHostNanos": 853919625, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 10, + "ordinal": 20, + "startedAt": "2026-08-11T12:09:18.905Z", + "endedAt": "2026-08-11T12:09:40.987Z", + "rawSha256": "7e6023f80d3feebdff05e8c53f96c511e865c919ea46b9ce180f4df1b2392f04", + "canonicalSha256": "269912a685c8816b3166ff444b937f30779dd24097a47afb8247d1777d10b83f", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcyNTMyMDksCiAgImFwcGVuZE5hbm9zIjogMTU5NzM2MjUsCiAgInRvdGFsTmFub3MiOiAzODU4NDczNjY3LAogICJyb3V0ZU5hbm9zIjogNTU5MTcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzI4MzA5MTgsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM3NDM0NzUzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzQ1Mzk3MTY3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc1Mzk1NTAwLAogICJmcm96ZW5OYW5vcyI6IDMwMjA3OTI2NjcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxNjM0MDg0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzE0MTM3NSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDg1NDI5MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ2ODU0MDAwLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4Mzc2ODEwMDAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97253209, + "appendNanos": 15973625, + "totalNanos": 3858473667, + "routeNanos": 55917, + "embeddedInputPreparationNanos": 32830918, + "hostBeforeFrozenNanos": 37434753, + "processFrozenNanos": 2745397167, + "initializationFrozenNanos": 275395500, + "frozenNanos": 3020792667, + "hostAfterFrozenNanos": 401634084, + "initializationHostBeforeFrozenNanos": 107141375, + "initializationHostAfterFrozenNanos": 104854292, + "graphPublicationNanos": 546854000, + "coordinationHostNanos": 837681000, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 11, + "ordinal": 21, + "startedAt": "2026-08-11T12:09:41.057Z", + "endedAt": "2026-08-11T12:10:03.943Z", + "rawSha256": "e120852b6603dd4750a4cc35614ce0614524501adc5fffe623447790f64a10e8", + "canonicalSha256": "67551eedb100b0865741c6740dcb26967a8dca331dd8bf53ffc0ee0e74ed5dde", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTg0NTIyNTAsCiAgImFwcGVuZE5hbm9zIjogMTcwMDQ0NTgsCiAgInRvdGFsTmFub3MiOiAzOTM1MDAxNjI1LAogICJyb3V0ZU5hbm9zIjogNzI4NzUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ2NTg0NTgsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5ODU1NDE2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk1MjgwMjkyLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgzNzczNzkyLAogICJmcm96ZW5OYW5vcyI6IDMwNzkwNTQwODQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA5MTAwNzA4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMTA3MjA0MiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjUxNjk5OSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTYxNDE2NzkxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTU5NDc1NDEsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 98452250, + "appendNanos": 17004458, + "totalNanos": 3935001625, + "routeNanos": 72875, + "embeddedInputPreparationNanos": 34658458, + "hostBeforeFrozenNanos": 39855416, + "processFrozenNanos": 2795280292, + "initializationFrozenNanos": 283773792, + "frozenNanos": 3079054084, + "hostAfterFrozenNanos": 409100708, + "initializationHostBeforeFrozenNanos": 111072042, + "initializationHostAfterFrozenNanos": 106516999, + "graphPublicationNanos": 561416791, + "coordinationHostNanos": 855947541, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 12, + "ordinal": 24, + "startedAt": "2026-08-11T12:10:49.538Z", + "endedAt": "2026-08-11T12:11:11.918Z", + "rawSha256": "30fc388d6d0eed9ffd8ba6b5addc62ea2005fe527f03124b6596bbf5dcdf1f1e", + "canonicalSha256": "8b886295aaebe0a37068f26e11f1010fc32f97dd1ff6a6f9bab26526b16dea2e", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY1MzAzNzUsCiAgImFwcGVuZE5hbm9zIjogMTcwODc1ODMsCiAgInRvdGFsTmFub3MiOiAzOTYwMDAwMTY2LAogICJyb3V0ZU5hbm9zIjogNjMyNTAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzU5MjQ5OTksCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwOTY0OTU5LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODE5NTM1MDg0LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgzMTAwNTQxLAogICJmcm96ZW5OYW5vcyI6IDMxMDI2MzU2MjUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDExNDExNDE3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMDg5NTU0MiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTMzMDYyNSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTYwMTk2MTY2LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTczNjQ1NDEsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96530375, + "appendNanos": 17087583, + "totalNanos": 3960000166, + "routeNanos": 63250, + "embeddedInputPreparationNanos": 35924999, + "hostBeforeFrozenNanos": 40964959, + "processFrozenNanos": 2819535084, + "initializationFrozenNanos": 283100541, + "frozenNanos": 3102635625, + "hostAfterFrozenNanos": 411411417, + "initializationHostBeforeFrozenNanos": 110895542, + "initializationHostAfterFrozenNanos": 105330625, + "graphPublicationNanos": 560196166, + "coordinationHostNanos": 857364541, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 13, + "ordinal": 25, + "startedAt": "2026-08-11T12:11:11.986Z", + "endedAt": "2026-08-11T12:11:34.659Z", + "rawSha256": "d11f23c85d519721df5b7564055355fc3ba355651853163fee148f3078a5fd96", + "canonicalSha256": "03bc99a51e75d3b919228436d8ff42d18e1fdf78550bb4b0575969f49981149a", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcyNDEyMDksCiAgImFwcGVuZE5hbm9zIjogMTY2MzI3MDgsCiAgInRvdGFsTmFub3MiOiA0MDAxMjI1MTI1LAogICJyb3V0ZU5hbm9zIjogNzQwODQsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzc3OTU3NTAsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQ0NDQ1MDgzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODQ4NDEwNzUwLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg2NTQwMTI1LAogICJmcm96ZW5OYW5vcyI6IDMxMzQ5NTA4NzUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA5NDY2MDAyLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTI2Mzk1OSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDExNjIxODI5MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTcwODM1NDk5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NjYyNzQyNTAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97241209, + "appendNanos": 16632708, + "totalNanos": 4001225125, + "routeNanos": 74084, + "embeddedInputPreparationNanos": 37795750, + "hostBeforeFrozenNanos": 44445083, + "processFrozenNanos": 2848410750, + "initializationFrozenNanos": 286540125, + "frozenNanos": 3134950875, + "hostAfterFrozenNanos": 409466002, + "initializationHostBeforeFrozenNanos": 109263959, + "initializationHostAfterFrozenNanos": 116218292, + "graphPublicationNanos": 570835499, + "coordinationHostNanos": 866274250, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 14, + "ordinal": 28, + "startedAt": "2026-08-11T12:12:20.750Z", + "endedAt": "2026-08-11T12:12:42.689Z", + "rawSha256": "9845759c25f66a77a94738e426a5942034380ca5952e53ddb48a1f1033b3ff9e", + "canonicalSha256": "ae391b48d9f405e3e167495d5288e50d5e23268da05c965e2cdcf2d5c4c1bb3f", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTQ2ODQyOTIsCiAgImFwcGVuZE5hbm9zIjogMTgxNTYwODQsCiAgInRvdGFsTmFub3MiOiAzODA2MjEwOTU5LAogICJyb3V0ZU5hbm9zIjogNjQ3MDgsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM3Mzc4MzQsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MzU0NjI2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzE1MTE2NDE3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjcyODM4MjA5LAogICJmcm96ZW5OYW5vcyI6IDI5ODc5NTQ2MjYsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzkyMzIzOTU4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwMzU4MTc5MiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMDA0NDA4NCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTMzOTE3NTgzLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MTgyNTYzMzMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 94684292, + "appendNanos": 18156084, + "totalNanos": 3806210959, + "routeNanos": 64708, + "embeddedInputPreparationNanos": 33737834, + "hostBeforeFrozenNanos": 38354626, + "processFrozenNanos": 2715116417, + "initializationFrozenNanos": 272838209, + "frozenNanos": 2987954626, + "hostAfterFrozenNanos": 392323958, + "initializationHostBeforeFrozenNanos": 103581792, + "initializationHostAfterFrozenNanos": 100044084, + "graphPublicationNanos": 533917583, + "coordinationHostNanos": 818256333, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 15, + "ordinal": 29, + "startedAt": "2026-08-11T12:12:42.754Z", + "endedAt": "2026-08-11T12:13:04.744Z", + "rawSha256": "02a7d082046514bb2823eafbb67194525604093437c7d492099f9113efe0b822", + "canonicalSha256": "514322bcdefceb702b86d48546dddc34530f1d2bf2e524d903d8a96bafbd6321", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTU5NTQ3MDksCiAgImFwcGVuZE5hbm9zIjogMTY5MTIyNTAsCiAgInRvdGFsTmFub3MiOiAzODgyMzA3MDg0LAogICJyb3V0ZU5hbm9zIjogNzUyMDgsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzUzMTU1MDAsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwMTk0Mzc3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzYyMTM4Mjg5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxNTM4NzA4LAogICJmcm96ZW5OYW5vcyI6IDMwNDM2NzY5OTcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk5NTc1MTI2LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzE4Njc5MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTEwMDMzMywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU0MDUzOTU4LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4Mzg2MzAwODcsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95954709, + "appendNanos": 16912250, + "totalNanos": 3882307084, + "routeNanos": 75208, + "embeddedInputPreparationNanos": 35315500, + "hostBeforeFrozenNanos": 40194377, + "processFrozenNanos": 2762138289, + "initializationFrozenNanos": 281538708, + "frozenNanos": 3043676997, + "hostAfterFrozenNanos": 399575126, + "initializationHostBeforeFrozenNanos": 107186791, + "initializationHostAfterFrozenNanos": 105100333, + "graphPublicationNanos": 554053958, + "coordinationHostNanos": 838630087, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 16, + "ordinal": 32, + "startedAt": "2026-08-11T12:13:49.960Z", + "endedAt": "2026-08-11T12:14:12.521Z", + "rawSha256": "b0455992222da1adc34667db93dc56af48e4f15f5f027c707d2d6a47988a8d0f", + "canonicalSha256": "dfddcb08264da4a0a0a99bd9e4d5101a456125c7543b6a03888705d42eb6d4c7", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogMTA5ODU1NTg0LAogICJhcHBlbmROYW5vcyI6IDIwMjIxNjI1LAogICJ0b3RhbE5hbm9zIjogNDAyMzU0ODQ1OCwKICAicm91dGVOYW5vcyI6IDYyMTI1LAogICJlbWJlZGRlZElucHV0UHJlcGFyYXRpb25OYW5vcyI6IDM1NjE2NTQyLAogICJob3N0QmVmb3JlRnJvemVuTmFub3MiOiA0MDU0NTcwOSwKICAicHJvY2Vzc0Zyb3plbk5hbm9zIjogMjg4MTM4MjI1MSwKICAiaW5pdGlhbGl6YXRpb25Gcm96ZW5OYW5vcyI6IDI4MDgwNzY2NiwKICAiZnJvemVuTmFub3MiOiAzMTYyMTg5OTE3LAogICJob3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDQwMzk2Mzc5MiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QmVmb3JlRnJvemVuTmFub3MiOiAxMDgxMjMzMzQsCiAgImluaXRpYWxpemF0aW9uSG9zdEFmdGVyRnJvemVuTmFub3MiOiAxMDU0MzUzMzMsCiAgImdyYXBoUHVibGljYXRpb25OYW5vcyI6IDU1MjUxODI1MCwKICAiY29vcmRpbmF0aW9uSG9zdE5hbm9zIjogODYxMzU4NTQxLAogICJ3aG9sZU9iamVjdHNBZGRlZCI6IDQsCiAgIndob2xlT2JqZWN0SW5zZXJ0aW9ucyI6IDQyLAogICJ3aG9sZU9iamVjdER1cGxpY2F0ZXMiOiAzMSwKICAiam91cm5hbEVudHJpZXMiOiAxLAogICJkb2N1bWVudENvdW50IjogNCwKICAicm91dGVSb3dzIjogMTMsCiAgImVtYmVkZGluZ0JpbmRpbmdzIjogNSwKICAiY2hpbGRTZXNzaW9uc0NyZWF0ZWQiOiAzLAogICJjaGlsZFNlc3Npb25zUmV1c2VkIjogMiwKICAiY2hpbGRJbml0aWFsaXphdGlvbkNhbGxzIjogMywKICAiY2hpbGRJbml0aWFsaXphdGlvblJldmlzaW9ucyI6IDMsCiAgImV4dGVybmFsUHJvY2Vzc0NhbGxzIjogMSwKICAiZW1iZWRkZWRFcG9jaFByb2Nlc3NDYWxscyI6IDUsCiAgImluaXRpYWxpemF0aW9uQXBwbGljYXRpb25zIjogNSwKICAiaW5pdGlhbGl6YXRpb25FdmVudHNGb3J3YXJkZWQiOiA1LAogICJwYXJlbnRBcHBsaWNhdGlvbnMiOiA1LAogICJmcm96ZW5Qcm9jZXNzQ2FsbHMiOiA2LAogICJob3N0SW5pdGlhbGl6YXRpb25FdmVudHMiOiA1LAogICJhbHBoYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiYmV0YUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiZ2FtbWFJbml0aWFsaXphdGlvbkV2ZW50cyI6IDEsCiAgImhvc3RSZXZpc2lvbkFwcGxpY2F0aW9ucyI6IDUsCiAgImZvcmJpZGRlbkNvdW50ZXJzIjogeyJVTlJFTEFURURfRE9DVU1FTlRfUkVBRFMiOiAwLCAiUkVRVUVTVF9GUkFHTUVOVFMiOiAwLCAiVElNRUxJTkVfRU5UUllfRlJBR01FTlRTIjogMCwgIk9SRElOQVJZX05PREVfRlJBR01FTlRTIjogMCwgIkZVTExfRU5WSVJPTk1FTlRfU0NBTlMiOiAwLCAiU09VUkNFX1JFUExBWVNfUEVSX1BBUkVOVCI6IDAsICJQT1NUX1BST0NFU1NfRlVMTF9QUk9KRUNUSU9OUyI6IDB9Cn0K", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 109855584, + "appendNanos": 20221625, + "totalNanos": 4023548458, + "routeNanos": 62125, + "embeddedInputPreparationNanos": 35616542, + "hostBeforeFrozenNanos": 40545709, + "processFrozenNanos": 2881382251, + "initializationFrozenNanos": 280807666, + "frozenNanos": 3162189917, + "hostAfterFrozenNanos": 403963792, + "initializationHostBeforeFrozenNanos": 108123334, + "initializationHostAfterFrozenNanos": 105435333, + "graphPublicationNanos": 552518250, + "coordinationHostNanos": 861358541, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 17, + "ordinal": 33, + "startedAt": "2026-08-11T12:14:12.595Z", + "endedAt": "2026-08-11T12:14:35.099Z", + "rawSha256": "a502abf91b4b8b325cdf7b9615b1d48882e162d7fccf5d5fd16fd4ffd44ef2df", + "canonicalSha256": "dcef102a0097aed90649047d8fd0e914d9e2ec7e055d93d257444fa884da6ca2", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTgwMDM3NTAsCiAgImFwcGVuZE5hbm9zIjogMTcyMzQ2MjUsCiAgInRvdGFsTmFub3MiOiAzOTAzNDQ4MDgzLAogICJyb3V0ZU5hbm9zIjogNzYzNzUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzYwMzMwNDEsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwODAxMjA3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzgwOTIwMjUwLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxMDc4NzUwLAogICJmcm96ZW5OYW5vcyI6IDMwNjE5OTkwMDAsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxMTU0NTAwLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzA1NTYyNSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMjQwNTMzMywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUwNzkwODMzLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDE0NDkwODMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 98003750, + "appendNanos": 17234625, + "totalNanos": 3903448083, + "routeNanos": 76375, + "embeddedInputPreparationNanos": 36033041, + "hostBeforeFrozenNanos": 40801207, + "processFrozenNanos": 2780920250, + "initializationFrozenNanos": 281078750, + "frozenNanos": 3061999000, + "hostAfterFrozenNanos": 401154500, + "initializationHostBeforeFrozenNanos": 107055625, + "initializationHostAfterFrozenNanos": 102405333, + "graphPublicationNanos": 550790833, + "coordinationHostNanos": 841449083, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 18, + "ordinal": 36, + "startedAt": "2026-08-11T12:15:20.361Z", + "endedAt": "2026-08-11T12:15:42.804Z", + "rawSha256": "9ca428ec48cc6ebde121caacabf25cb3aedaaa852a8d35534c6a8cee512b11a8", + "canonicalSha256": "23a8369e82c182262b31db432d1b0441eb8edd82718a491d479a0ed84acd64e9", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogMTIyODM3MjA4LAogICJhcHBlbmROYW5vcyI6IDE2NzgyNTQxLAogICJ0b3RhbE5hbm9zIjogNDAzOTUwMDk1OCwKICAicm91dGVOYW5vcyI6IDU5NjI1LAogICJlbWJlZGRlZElucHV0UHJlcGFyYXRpb25OYW5vcyI6IDM0MjI0MjA3LAogICJob3N0QmVmb3JlRnJvemVuTmFub3MiOiAzOTEwOTUwMCwKICAicHJvY2Vzc0Zyb3plbk5hbm9zIjogMjg2MDY4MTgzMywKICAiaW5pdGlhbGl6YXRpb25Gcm96ZW5OYW5vcyI6IDI3NzEyNDI1MCwKICAiZnJvemVuTmFub3MiOiAzMTM3ODA2MDgzLAogICJob3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDQyNTQ4Mzc5MCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QmVmb3JlRnJvemVuTmFub3MiOiAxMTY3NzI0MTUsCiAgImluaXRpYWxpemF0aW9uSG9zdEFmdGVyRnJvemVuTmFub3MiOiAxMDYxODU1ODMsCiAgImdyYXBoUHVibGljYXRpb25OYW5vcyI6IDU1ODc4OTkxNiwKICAiY29vcmRpbmF0aW9uSG9zdE5hbm9zIjogOTAxNjk0ODc1LAogICJ3aG9sZU9iamVjdHNBZGRlZCI6IDQsCiAgIndob2xlT2JqZWN0SW5zZXJ0aW9ucyI6IDQyLAogICJ3aG9sZU9iamVjdER1cGxpY2F0ZXMiOiAzMSwKICAiam91cm5hbEVudHJpZXMiOiAxLAogICJkb2N1bWVudENvdW50IjogNCwKICAicm91dGVSb3dzIjogMTMsCiAgImVtYmVkZGluZ0JpbmRpbmdzIjogNSwKICAiY2hpbGRTZXNzaW9uc0NyZWF0ZWQiOiAzLAogICJjaGlsZFNlc3Npb25zUmV1c2VkIjogMiwKICAiY2hpbGRJbml0aWFsaXphdGlvbkNhbGxzIjogMywKICAiY2hpbGRJbml0aWFsaXphdGlvblJldmlzaW9ucyI6IDMsCiAgImV4dGVybmFsUHJvY2Vzc0NhbGxzIjogMSwKICAiZW1iZWRkZWRFcG9jaFByb2Nlc3NDYWxscyI6IDUsCiAgImluaXRpYWxpemF0aW9uQXBwbGljYXRpb25zIjogNSwKICAiaW5pdGlhbGl6YXRpb25FdmVudHNGb3J3YXJkZWQiOiA1LAogICJwYXJlbnRBcHBsaWNhdGlvbnMiOiA1LAogICJmcm96ZW5Qcm9jZXNzQ2FsbHMiOiA2LAogICJob3N0SW5pdGlhbGl6YXRpb25FdmVudHMiOiA1LAogICJhbHBoYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiYmV0YUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiZ2FtbWFJbml0aWFsaXphdGlvbkV2ZW50cyI6IDEsCiAgImhvc3RSZXZpc2lvbkFwcGxpY2F0aW9ucyI6IDUsCiAgImZvcmJpZGRlbkNvdW50ZXJzIjogeyJVTlJFTEFURURfRE9DVU1FTlRfUkVBRFMiOiAwLCAiUkVRVUVTVF9GUkFHTUVOVFMiOiAwLCAiVElNRUxJTkVfRU5UUllfRlJBR01FTlRTIjogMCwgIk9SRElOQVJZX05PREVfRlJBR01FTlRTIjogMCwgIkZVTExfRU5WSVJPTk1FTlRfU0NBTlMiOiAwLCAiU09VUkNFX1JFUExBWVNfUEVSX1BBUkVOVCI6IDAsICJQT1NUX1BST0NFU1NfRlVMTF9QUk9KRUNUSU9OUyI6IDB9Cn0K", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 122837208, + "appendNanos": 16782541, + "totalNanos": 4039500958, + "routeNanos": 59625, + "embeddedInputPreparationNanos": 34224207, + "hostBeforeFrozenNanos": 39109500, + "processFrozenNanos": 2860681833, + "initializationFrozenNanos": 277124250, + "frozenNanos": 3137806083, + "hostAfterFrozenNanos": 425483790, + "initializationHostBeforeFrozenNanos": 116772415, + "initializationHostAfterFrozenNanos": 106185583, + "graphPublicationNanos": 558789916, + "coordinationHostNanos": 901694875, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 19, + "ordinal": 37, + "startedAt": "2026-08-11T12:15:42.874Z", + "endedAt": "2026-08-11T12:16:05.559Z", + "rawSha256": "2f60eafe45a0190ca95ae22314ef37e617bcc0a95b0b0018b46efbf76d51982d", + "canonicalSha256": "c4f3b50ea7f39b9653f72264c8bbb2ec5077f7fe788d9d446ec596de93f5e478", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTYwMjc1MDAsCiAgImFwcGVuZE5hbm9zIjogMTcwNzIyMDgsCiAgInRvdGFsTmFub3MiOiAzOTIyNTI0MzMzLAogICJyb3V0ZU5hbm9zIjogNzE3NTAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQxODc3OTMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4ODQwNDE3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk3NzAyNjY3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgzMDc4NzkyLAogICJmcm96ZW5OYW5vcyI6IDMwODA3ODE0NTksCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA2MzA2NDU5LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzY0ODYyNSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzU3MTM3NCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUyNzk5Mzc1LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDE3NDI4NzQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96027500, + "appendNanos": 17072208, + "totalNanos": 3922524333, + "routeNanos": 71750, + "embeddedInputPreparationNanos": 34187793, + "hostBeforeFrozenNanos": 38840417, + "processFrozenNanos": 2797702667, + "initializationFrozenNanos": 283078792, + "frozenNanos": 3080781459, + "hostAfterFrozenNanos": 406306459, + "initializationHostBeforeFrozenNanos": 107648625, + "initializationHostAfterFrozenNanos": 103571374, + "graphPublicationNanos": 552799375, + "coordinationHostNanos": 841742874, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 20, + "ordinal": 40, + "startedAt": "2026-08-11T12:16:51.550Z", + "endedAt": "2026-08-11T12:17:13.984Z", + "rawSha256": "fc11ae0198494b8cdbd7defad14be2267aca2093e619dfd147938164cb4a7242", + "canonicalSha256": "04c476ccac1371ba6b65de7de4761c3034cae304ad6691ed90a1237de3ab7e2d", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTU1OTE5MTcsCiAgImFwcGVuZE5hbm9zIjogMTgyMTQ0NTksCiAgInRvdGFsTmFub3MiOiAzOTExMzE3ODM0LAogICJyb3V0ZU5hbm9zIjogNjY3OTIsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ2NDY1NDIsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5NTgyMTI1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzg5OTMzNzUxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxMjA5NzUwLAogICJmcm96ZW5OYW5vcyI6IDMwNzExNDM1MDEsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1NTE3MjA3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNTc2MTM3NSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMjY4ODA4MywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ5MDI5NDE5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDAxNzQzMzMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95591917, + "appendNanos": 18214459, + "totalNanos": 3911317834, + "routeNanos": 66792, + "embeddedInputPreparationNanos": 34646542, + "hostBeforeFrozenNanos": 39582125, + "processFrozenNanos": 2789933751, + "initializationFrozenNanos": 281209750, + "frozenNanos": 3071143501, + "hostAfterFrozenNanos": 405517207, + "initializationHostBeforeFrozenNanos": 105761375, + "initializationHostAfterFrozenNanos": 102688083, + "graphPublicationNanos": 549029419, + "coordinationHostNanos": 840174333, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 21, + "ordinal": 41, + "startedAt": "2026-08-11T12:17:14.055Z", + "endedAt": "2026-08-11T12:17:36.697Z", + "rawSha256": "80268ece8eb55393d0b4b6603a1c222ebc6fcfb328d7ddc185e078481436343c", + "canonicalSha256": "ba1a6c444c20fee39f31cc1295681b18fc5c108db89ace94b4579d13d60a78a2", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTYwNzAxNjcsCiAgImFwcGVuZE5hbm9zIjogMTgwODMzNzUsCiAgInRvdGFsTmFub3MiOiAzOTI3NDgwODMzLAogICJyb3V0ZU5hbm9zIjogNjIxMjUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ0NTUyOTEsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5MjQyNzkxLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk5NjU5MzMyLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyMTA3NzA5LAogICJmcm96ZW5OYW5vcyI6IDMwODE3NjcwNDEsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA2OTY1MTI0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzM3NTk1OSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDE4Mjc5MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUzNTkyOTU5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDU3MTM3OTIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96070167, + "appendNanos": 18083375, + "totalNanos": 3927480833, + "routeNanos": 62125, + "embeddedInputPreparationNanos": 34455291, + "hostBeforeFrozenNanos": 39242791, + "processFrozenNanos": 2799659332, + "initializationFrozenNanos": 282107709, + "frozenNanos": 3081767041, + "hostAfterFrozenNanos": 406965124, + "initializationHostBeforeFrozenNanos": 107375959, + "initializationHostAfterFrozenNanos": 104182792, + "graphPublicationNanos": 553592959, + "coordinationHostNanos": 845713792, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 22, + "ordinal": 44, + "startedAt": "2026-08-11T12:18:22.263Z", + "endedAt": "2026-08-11T12:18:44.967Z", + "rawSha256": "4e119e1c150b08fcf005d58b1cedc70ecaafafc53a4c6fe5d24e39dee1a4a841", + "canonicalSha256": "d3eb494a23c6367ce126db65a8fca6d8f95f54fda28e4e33e109c63263e37ebd", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY5NjYyNTAsCiAgImFwcGVuZE5hbm9zIjogMTYyNjQzMzQsCiAgInRvdGFsTmFub3MiOiAzOTA0NzE1MjA5LAogICJyb3V0ZU5hbm9zIjogNTgxNjYsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY1NzMwODQsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMzIwNDU5LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzgwNjEyMjA4LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxODMzNTgzLAogICJmcm96ZW5OYW5vcyI6IDMwNjI0NDU3OTEsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxODg3OTE4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzMyNzQxNiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDA2NzU0MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUyOTE2OTE2LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDIyNjk0MTgsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96966250, + "appendNanos": 16264334, + "totalNanos": 3904715209, + "routeNanos": 58166, + "embeddedInputPreparationNanos": 36573084, + "hostBeforeFrozenNanos": 41320459, + "processFrozenNanos": 2780612208, + "initializationFrozenNanos": 281833583, + "frozenNanos": 3062445791, + "hostAfterFrozenNanos": 401887918, + "initializationHostBeforeFrozenNanos": 107327416, + "initializationHostAfterFrozenNanos": 104067542, + "graphPublicationNanos": 552916916, + "coordinationHostNanos": 842269418, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 23, + "ordinal": 45, + "startedAt": "2026-08-11T12:18:45.038Z", + "endedAt": "2026-08-11T12:19:07.654Z", + "rawSha256": "0bd7dfcf307dc023f3661b65d88afa9ec3bf1ecf28f74172191bf9ae6c6fcc20", + "canonicalSha256": "03a2a1545cc47780b712a1178eeb772522c75efc53c0f91a36687270b139ebf3", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcwMTg5NTgsCiAgImFwcGVuZE5hbm9zIjogMTYxNTcwMDAsCiAgInRvdGFsTmFub3MiOiAzOTM3MTU3MjUwLAogICJyb3V0ZU5hbm9zIjogNTgyNTAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzcwMzE2NjUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxNzc2MjQ3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk4MzY3NDU5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg1NTg2OTE3LAogICJmcm96ZW5OYW5vcyI6IDMwODM5NTQzNzYsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA3NDAxODc0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMDA4NDAwMSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNzUzMDAwMCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTYyNDIyMjA4LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTMyMDI4NzQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97018958, + "appendNanos": 16157000, + "totalNanos": 3937157250, + "routeNanos": 58250, + "embeddedInputPreparationNanos": 37031665, + "hostBeforeFrozenNanos": 41776247, + "processFrozenNanos": 2798367459, + "initializationFrozenNanos": 285586917, + "frozenNanos": 3083954376, + "hostAfterFrozenNanos": 407401874, + "initializationHostBeforeFrozenNanos": 110084001, + "initializationHostAfterFrozenNanos": 107530000, + "graphPublicationNanos": 562422208, + "coordinationHostNanos": 853202874, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 24, + "ordinal": 48, + "startedAt": "2026-08-11T12:19:53.179Z", + "endedAt": "2026-08-11T12:20:15.733Z", + "rawSha256": "9b7fcac5bf31e6031f300e26dcdef77860f43144937a92e6612b17b555670de1", + "canonicalSha256": "c5783d79fb3285d61f22d950156cbe5a1286db8c0cf630debe908847362b4086", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY3NTc4NzUsCiAgImFwcGVuZE5hbm9zIjogMTY2NTA1MDAsCiAgInRvdGFsTmFub3MiOiAzOTA1MjM2NTgzLAogICJyb3V0ZU5hbm9zIjogNjI2MjUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQyMDA3OTEsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5MDg5ODMzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzgxOTI3ODc1LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgwNzMwMDQyLAogICJmcm96ZW5OYW5vcyI6IDMwNjI2NTc5MTcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1NDg5NjY3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjk0MzMzNCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDQzNzc1MSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUxMDQ2MDg0LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDI1Nzg2NjYsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96757875, + "appendNanos": 16650500, + "totalNanos": 3905236583, + "routeNanos": 62625, + "embeddedInputPreparationNanos": 34200791, + "hostBeforeFrozenNanos": 39089833, + "processFrozenNanos": 2781927875, + "initializationFrozenNanos": 280730042, + "frozenNanos": 3062657917, + "hostAfterFrozenNanos": 405489667, + "initializationHostBeforeFrozenNanos": 106943334, + "initializationHostAfterFrozenNanos": 104437751, + "graphPublicationNanos": 551046084, + "coordinationHostNanos": 842578666, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 25, + "ordinal": 49, + "startedAt": "2026-08-11T12:20:15.803Z", + "endedAt": "2026-08-11T12:20:38.394Z", + "rawSha256": "69d7abffcf7acb401c4b0dee0d2c80f5185f3b6e6c52275d2e71408abdb5b5b3", + "canonicalSha256": "9bc12140e282a8501dd3f5018323551c0e8699685558f205a1c3503a61717c1f", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY3NTcxMjUsCiAgImFwcGVuZE5hbm9zIjogMTYyMTEzMzMsCiAgInRvdGFsTmFub3MiOiAzODk4MjI5MjA5LAogICJyb3V0ZU5hbm9zIjogNTg3MDgsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY5ODA5NTksCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxODcxMzc2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzc1NjQwNjI1LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyNTc2NzkyLAogICJmcm96ZW5OYW5vcyI6IDMwNTgyMTc0MTcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxMjQxMjUwLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjcxMzM3NSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDA1MjA0MywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUyNzY4NjY3LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDAwMTE3OTIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96757125, + "appendNanos": 16211333, + "totalNanos": 3898229209, + "routeNanos": 58708, + "embeddedInputPreparationNanos": 36980959, + "hostBeforeFrozenNanos": 41871376, + "processFrozenNanos": 2775640625, + "initializationFrozenNanos": 282576792, + "frozenNanos": 3058217417, + "hostAfterFrozenNanos": 401241250, + "initializationHostBeforeFrozenNanos": 106713375, + "initializationHostAfterFrozenNanos": 104052043, + "graphPublicationNanos": 552768667, + "coordinationHostNanos": 840011792, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 26, + "ordinal": 52, + "startedAt": "2026-08-11T12:21:23.864Z", + "endedAt": "2026-08-11T12:21:46.417Z", + "rawSha256": "d06ef8cac37d22da76041c603e7c311138cd65852269151e2a476bbcbd8d8ab9", + "canonicalSha256": "1583e999ea507f918714831910dd94cb4a130b85d3784a9dbf560d901134af3f", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTkyMjQ4NzUsCiAgImFwcGVuZE5hbm9zIjogMTY3NDM3OTEsCiAgInRvdGFsTmFub3MiOiAzOTQyNzM1NzUwLAogICJyb3V0ZU5hbm9zIjogNjA1NDEsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzU1NDg4MzMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwNjA0NTgzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODAzMjE5MjkzLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxMTE2ODM0LAogICJmcm96ZW5OYW5vcyI6IDMwODQzMzYxMjcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA5NTgwMTY4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTc1ODI1MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNzk1NDU0MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU4OTE0NDE5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTgzOTk2MjMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 99224875, + "appendNanos": 16743791, + "totalNanos": 3942735750, + "routeNanos": 60541, + "embeddedInputPreparationNanos": 35548833, + "hostBeforeFrozenNanos": 40604583, + "processFrozenNanos": 2803219293, + "initializationFrozenNanos": 281116834, + "frozenNanos": 3084336127, + "hostAfterFrozenNanos": 409580168, + "initializationHostBeforeFrozenNanos": 109758251, + "initializationHostAfterFrozenNanos": 107954542, + "graphPublicationNanos": 558914419, + "coordinationHostNanos": 858399623, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 27, + "ordinal": 53, + "startedAt": "2026-08-11T12:21:46.485Z", + "endedAt": "2026-08-11T12:22:09.067Z", + "rawSha256": "7efc1ece96f0403a4378f15328f96dd5a3447653fc77add0a23e05c3903cb9a9", + "canonicalSha256": "595643698bf2df7dcdf869660ef082af8b8efd25f9f695bf28cb334d65724941", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTUxODU3MDgsCiAgImFwcGVuZE5hbm9zIjogMTg1NDIxNjcsCiAgInRvdGFsTmFub3MiOiAzOTk4NTM1MjUwLAogICJyb3V0ZU5hbm9zIjogNTk3OTEsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM1OTQ2NjgsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MTE3MjUwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk3MTU1MjkxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMzA3NDk1MDQxLAogICJmcm96ZW5OYW5vcyI6IDMxMDQ2NTAzMzIsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDI1NjQzNzkzLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEyMTkyOTMzNCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNzk5NjA0MSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNjA5Mzk2MzM0LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4OTM4ODQ5MTgsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95185708, + "appendNanos": 18542167, + "totalNanos": 3998535250, + "routeNanos": 59791, + "embeddedInputPreparationNanos": 33594668, + "hostBeforeFrozenNanos": 38117250, + "processFrozenNanos": 2797155291, + "initializationFrozenNanos": 307495041, + "frozenNanos": 3104650332, + "hostAfterFrozenNanos": 425643793, + "initializationHostBeforeFrozenNanos": 121929334, + "initializationHostAfterFrozenNanos": 107996041, + "graphPublicationNanos": 609396334, + "coordinationHostNanos": 893884918, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 28, + "ordinal": 56, + "startedAt": "2026-08-11T12:22:54.139Z", + "endedAt": "2026-08-11T12:23:16.634Z", + "rawSha256": "f7ba7e448029fd674fb8fd1384452df0084d0e61cbbe9a2f9dc20ccc7fe3a68b", + "canonicalSha256": "c055998243070e6811d00303468b110c5085e8dfef562b245309704b9fce6e26", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY0MzQ0MTcsCiAgImFwcGVuZE5hbm9zIjogMTY3NzEwODMsCiAgInRvdGFsTmFub3MiOiAzOTI2NTg2MTY3LAogICJyb3V0ZU5hbm9zIjogNjk2MjUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM2NDk1ODMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MzE2NDE3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODAwNDEwMDQwLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0MTg4ODc1LAogICJmcm96ZW5OYW5vcyI6IDMwODQ1OTg5MTUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1NjA1NjI1LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjY2OTIwOCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzY5NTMzMiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU1MDAzNTAyLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDE5ODcyNTIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96434417, + "appendNanos": 16771083, + "totalNanos": 3926586167, + "routeNanos": 69625, + "embeddedInputPreparationNanos": 33649583, + "hostBeforeFrozenNanos": 38316417, + "processFrozenNanos": 2800410040, + "initializationFrozenNanos": 284188875, + "frozenNanos": 3084598915, + "hostAfterFrozenNanos": 405605625, + "initializationHostBeforeFrozenNanos": 106669208, + "initializationHostAfterFrozenNanos": 103695332, + "graphPublicationNanos": 555003502, + "coordinationHostNanos": 841987252, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 29, + "ordinal": 57, + "startedAt": "2026-08-11T12:23:16.706Z", + "endedAt": "2026-08-11T12:23:39.278Z", + "rawSha256": "fbf4ec1bfa2532b0c0de5068036b7801ef687353f8a2c118d599d06d55a51c75", + "canonicalSha256": "71fd6e41e8fd00beebf73f7dc7b8817ba8d3d63926bba6c0aae4aa43fddf112d", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogMTAyMzg0ODM0LAogICJhcHBlbmROYW5vcyI6IDE5MzQ4MDQyLAogICJ0b3RhbE5hbm9zIjogNDA3MzMxODAwMCwKICAicm91dGVOYW5vcyI6IDcwNDE3LAogICJlbWJlZGRlZElucHV0UHJlcGFyYXRpb25OYW5vcyI6IDM1MDM1Mjk0LAogICJob3N0QmVmb3JlRnJvemVuTmFub3MiOiAzOTY3Njc1NCwKICAicHJvY2Vzc0Zyb3plbk5hbm9zIjogMjg1NTQ0MTEyNCwKICAiaW5pdGlhbGl6YXRpb25Gcm96ZW5OYW5vcyI6IDMzMjIxNTY2OCwKICAiZnJvemVuTmFub3MiOiAzMTg3NjU2NzkyLAogICJob3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDQxMDU0ODU4NSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QmVmb3JlRnJvemVuTmFub3MiOiAxMTcyMjA2MjUsCiAgImluaXRpYWxpemF0aW9uSG9zdEFmdGVyRnJvemVuTmFub3MiOiAxMTY0NDYzNzYsCiAgImdyYXBoUHVibGljYXRpb25OYW5vcyI6IDYzMjI5ODc1MSwKICAiY29vcmRpbmF0aW9uSG9zdE5hbm9zIjogODg1NjYxMjA4LAogICJ3aG9sZU9iamVjdHNBZGRlZCI6IDQsCiAgIndob2xlT2JqZWN0SW5zZXJ0aW9ucyI6IDQyLAogICJ3aG9sZU9iamVjdER1cGxpY2F0ZXMiOiAzMSwKICAiam91cm5hbEVudHJpZXMiOiAxLAogICJkb2N1bWVudENvdW50IjogNCwKICAicm91dGVSb3dzIjogMTMsCiAgImVtYmVkZGluZ0JpbmRpbmdzIjogNSwKICAiY2hpbGRTZXNzaW9uc0NyZWF0ZWQiOiAzLAogICJjaGlsZFNlc3Npb25zUmV1c2VkIjogMiwKICAiY2hpbGRJbml0aWFsaXphdGlvbkNhbGxzIjogMywKICAiY2hpbGRJbml0aWFsaXphdGlvblJldmlzaW9ucyI6IDMsCiAgImV4dGVybmFsUHJvY2Vzc0NhbGxzIjogMSwKICAiZW1iZWRkZWRFcG9jaFByb2Nlc3NDYWxscyI6IDUsCiAgImluaXRpYWxpemF0aW9uQXBwbGljYXRpb25zIjogNSwKICAiaW5pdGlhbGl6YXRpb25FdmVudHNGb3J3YXJkZWQiOiA1LAogICJwYXJlbnRBcHBsaWNhdGlvbnMiOiA1LAogICJmcm96ZW5Qcm9jZXNzQ2FsbHMiOiA2LAogICJob3N0SW5pdGlhbGl6YXRpb25FdmVudHMiOiA1LAogICJhbHBoYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiYmV0YUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiZ2FtbWFJbml0aWFsaXphdGlvbkV2ZW50cyI6IDEsCiAgImhvc3RSZXZpc2lvbkFwcGxpY2F0aW9ucyI6IDUsCiAgImZvcmJpZGRlbkNvdW50ZXJzIjogeyJVTlJFTEFURURfRE9DVU1FTlRfUkVBRFMiOiAwLCAiUkVRVUVTVF9GUkFHTUVOVFMiOiAwLCAiVElNRUxJTkVfRU5UUllfRlJBR01FTlRTIjogMCwgIk9SRElOQVJZX05PREVfRlJBR01FTlRTIjogMCwgIkZVTExfRU5WSVJPTk1FTlRfU0NBTlMiOiAwLCAiU09VUkNFX1JFUExBWVNfUEVSX1BBUkVOVCI6IDAsICJQT1NUX1BST0NFU1NfRlVMTF9QUk9KRUNUSU9OUyI6IDB9Cn0K", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 102384834, + "appendNanos": 19348042, + "totalNanos": 4073318000, + "routeNanos": 70417, + "embeddedInputPreparationNanos": 35035294, + "hostBeforeFrozenNanos": 39676754, + "processFrozenNanos": 2855441124, + "initializationFrozenNanos": 332215668, + "frozenNanos": 3187656792, + "hostAfterFrozenNanos": 410548585, + "initializationHostBeforeFrozenNanos": 117220625, + "initializationHostAfterFrozenNanos": 116446376, + "graphPublicationNanos": 632298751, + "coordinationHostNanos": 885661208, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + }, + { + "pair": 30, + "ordinal": 60, + "startedAt": "2026-08-11T12:24:25.378Z", + "endedAt": "2026-08-11T12:24:48.205Z", + "rawSha256": "c4ab46083777f72af5b38fc74fc60f62dff7570d37c28ea61f6eb8b6911e5207", + "canonicalSha256": "136a22da7ff319926d2c23a493b0730c41343a92e0f5234a59edd052f3720a53", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTc1Nzc5MTcsCiAgImFwcGVuZE5hbm9zIjogMTcxNTI2MjUsCiAgInRvdGFsTmFub3MiOiAzOTMyMDk1NzkyLAogICJyb3V0ZU5hbm9zIjogNjA3OTEsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ0ODU3OTMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5MTM0NzExLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODA0MDg3NDE1LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgwMzc2Mzc0LAogICJmcm96ZW5OYW5vcyI6IDMwODQ0NjM3ODksCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1Nzc0MjUxLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTM1NzMzMywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjAwOTM3NSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU0MTM4OTU5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDc2MzIwMDMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97577917, + "appendNanos": 17152625, + "totalNanos": 3932095792, + "routeNanos": 60791, + "embeddedInputPreparationNanos": 34485793, + "hostBeforeFrozenNanos": 39134711, + "processFrozenNanos": 2804087415, + "initializationFrozenNanos": 280376374, + "frozenNanos": 3084463789, + "hostAfterFrozenNanos": 405774251, + "initializationHostBeforeFrozenNanos": 109357333, + "initializationHostAfterFrozenNanos": 106009375, + "graphPublicationNanos": 554138959, + "coordinationHostNanos": 847632003, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0 + } + } + } + ], + "distributions": { + "requestPreparationNanos": { + "p50Nanos": 96757125, + "p95Nanos": 109855584, + "maximumNanos": 122837208 + }, + "appendNanos": { + "p50Nanos": 16782541, + "p95Nanos": 19348042, + "maximumNanos": 20221625 + }, + "routeNanos": { + "p50Nanos": 62375, + "p95Nanos": 75208, + "maximumNanos": 76375 + }, + "embeddedInputPreparationNanos": { + "p50Nanos": 34646542, + "p95Nanos": 37111500, + "maximumNanos": 37795750 + }, + "hostBeforeFrozenNanos": { + "p50Nanos": 39582125, + "p95Nanos": 41871376, + "maximumNanos": 44445083 + }, + "processFrozenNanos": { + "p50Nanos": 2795280292, + "p95Nanos": 2897255416, + "maximumNanos": 2971856500 + }, + "initializationFrozenNanos": { + "p50Nanos": 282107709, + "p95Nanos": 307495041, + "maximumNanos": 332215668 + }, + "frozenNanos": { + "p50Nanos": 3079054084, + "p95Nanos": 3187656792, + "maximumNanos": 3252091709 + }, + "hostAfterFrozenNanos": { + "p50Nanos": 405517207, + "p95Nanos": 425483790, + "maximumNanos": 425643793 + }, + "initializationHostBeforeFrozenNanos": { + "p50Nanos": 107375959, + "p95Nanos": 117220625, + "maximumNanos": 121929334 + }, + "initializationHostAfterFrozenNanos": { + "p50Nanos": 104437751, + "p95Nanos": 116218292, + "maximumNanos": 116446376 + }, + "graphPublicationNanos": { + "p50Nanos": 554138959, + "p95Nanos": 609396334, + "maximumNanos": 632298751 + }, + "coordinationHostNanos": { + "p50Nanos": 841987252, + "p95Nanos": 893884918, + "maximumNanos": 901694875 + }, + "totalNanos": { + "p50Nanos": 3922524333, + "p95Nanos": 4073318000, + "maximumNanos": 4093335417 + } + } + }, + "candidate": { + "rawSamples": [ + { + "pair": 1, + "ordinal": 2, + "startedAt": "2026-08-11T12:02:30.930Z", + "endedAt": "2026-08-11T12:02:53.463Z", + "rawSha256": "a8f35d42485764a400f853329f81f345ccc012071cae27a9e0d14aad5d3eef73", + "canonicalSha256": "cc251e82bec53ca7a1c4f2a76c2d2a42a1749e4d6f53bc803b3b10fa8472d420", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTYxODgyOTEsCiAgImFwcGVuZE5hbm9zIjogMTY0NTM0NTgsCiAgInRvdGFsTmFub3MiOiAzODQ5MjIyNzkxLAogICJyb3V0ZU5hbm9zIjogNTg2NjYsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQyMzQ1MDAsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5MTg2Mzc2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzM1OTQ0OTE3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc4Njk1MTI2LAogICJmcm96ZW5OYW5vcyI6IDMwMTQ2NDAwNDMsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk4OTI4MDgyLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODczMDAwMCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTA4ODUwMCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ5NDM2NjY1LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzQ1ODI3NDgsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96188291, + "appendNanos": 16453458, + "totalNanos": 3849222791, + "routeNanos": 58666, + "embeddedInputPreparationNanos": 34234500, + "hostBeforeFrozenNanos": 39186376, + "processFrozenNanos": 2735944917, + "initializationFrozenNanos": 278695126, + "frozenNanos": 3014640043, + "hostAfterFrozenNanos": 398928082, + "initializationHostBeforeFrozenNanos": 108730000, + "initializationHostAfterFrozenNanos": 105088500, + "graphPublicationNanos": 549436665, + "coordinationHostNanos": 834582748, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 2, + "ordinal": 3, + "startedAt": "2026-08-11T12:02:53.528Z", + "endedAt": "2026-08-11T12:03:15.893Z", + "rawSha256": "6a20b025b6e657e2371980208b81baf3f3dbacc3a9119c695dcb1e70cb8f9b96", + "canonicalSha256": "41a126bdc978ba035983112916eb55b87a8766df7a24f24ec17df6e7d6bc37bd", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTYyODM4NzUsCiAgImFwcGVuZE5hbm9zIjogMTY3MzI1NDEsCiAgInRvdGFsTmFub3MiOiAzODUzOTk0NzUwLAogICJyb3V0ZU5hbm9zIjogNTc4NzUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzMxMzE1ODUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM3NjYwMjUzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzM1NTcxMDgzLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc5NTk2MjkxLAogICJmcm96ZW5OYW5vcyI6IDMwMTUxNjczNzQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxODQyODMyLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTI3NjU0MywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTY5NzYyNSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUyMzg5NzkzLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4Mzg4MjczNzYsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96283875, + "appendNanos": 16732541, + "totalNanos": 3853994750, + "routeNanos": 57875, + "embeddedInputPreparationNanos": 33131585, + "hostBeforeFrozenNanos": 37660253, + "processFrozenNanos": 2735571083, + "initializationFrozenNanos": 279596291, + "frozenNanos": 3015167374, + "hostAfterFrozenNanos": 401842832, + "initializationHostBeforeFrozenNanos": 109276543, + "initializationHostAfterFrozenNanos": 105697625, + "graphPublicationNanos": 552389793, + "coordinationHostNanos": 838827376, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 3, + "ordinal": 6, + "startedAt": "2026-08-11T12:04:00.732Z", + "endedAt": "2026-08-11T12:04:23.426Z", + "rawSha256": "e0f445d9ce57ff164dc42118e430efede6361df1446f7be5b51c615b8b9d7af3", + "canonicalSha256": "1b0de99420444933f50790133866dc4e41b4cf74b6b91402a9a90c3376b58a95", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTc4MDgxMjUsCiAgImFwcGVuZE5hbm9zIjogMTgyNDc1ODMsCiAgInRvdGFsTmFub3MiOiAzOTA3MjY4MTY2LAogICJyb3V0ZU5hbm9zIjogNzgzMzMsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzMzOTUzMzMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MTQyNzkyLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzY1MzUxNTAxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg3MDczODc1LAogICJmcm96ZW5OYW5vcyI6IDMwNTI0MjUzNzYsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDExODczOTU3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTQyNzE2NywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjI2NzM3NSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTYyNDEwOTU5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTQ4NDI3OTAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97808125, + "appendNanos": 18247583, + "totalNanos": 3907268166, + "routeNanos": 78333, + "embeddedInputPreparationNanos": 33395333, + "hostBeforeFrozenNanos": 38142792, + "processFrozenNanos": 2765351501, + "initializationFrozenNanos": 287073875, + "frozenNanos": 3052425376, + "hostAfterFrozenNanos": 411873957, + "initializationHostBeforeFrozenNanos": 109427167, + "initializationHostAfterFrozenNanos": 106267375, + "graphPublicationNanos": 562410959, + "coordinationHostNanos": 854842790, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 4, + "ordinal": 7, + "startedAt": "2026-08-11T12:04:23.493Z", + "endedAt": "2026-08-11T12:04:46.015Z", + "rawSha256": "3af5ed98add6757ddc0cb1efeaf14e16d6a33dafcbfb83e5881c59982ae40806", + "canonicalSha256": "3406369bb0d90defa657be95e96e1ba091417051c424a8ca19f03136d8659be5", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTUxODQzNzUsCiAgImFwcGVuZE5hbm9zIjogMTY2ODA2NjYsCiAgInRvdGFsTmFub3MiOiAzODE3NjY2NjY3LAogICJyb3V0ZU5hbm9zIjogNjg2NjcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM1ODY3MDgsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MjUwNDk4LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzE5MDIyNDU5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc1MDAxOTE3LAogICJmcm96ZW5OYW5vcyI6IDI5OTQwMjQzNzYsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk0MzYzMDQyLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNTQ1NjcwOCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzAwOTYyNiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQwNDM5ODMzLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MjM2NDIyOTEsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95184375, + "appendNanos": 16680666, + "totalNanos": 3817666667, + "routeNanos": 68667, + "embeddedInputPreparationNanos": 33586708, + "hostBeforeFrozenNanos": 38250498, + "processFrozenNanos": 2719022459, + "initializationFrozenNanos": 275001917, + "frozenNanos": 2994024376, + "hostAfterFrozenNanos": 394363042, + "initializationHostBeforeFrozenNanos": 105456708, + "initializationHostAfterFrozenNanos": 103009626, + "graphPublicationNanos": 540439833, + "coordinationHostNanos": 823642291, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 5, + "ordinal": 10, + "startedAt": "2026-08-11T12:05:31.328Z", + "endedAt": "2026-08-11T12:05:54.438Z", + "rawSha256": "9a40d21e5697262a6d08f98e3a01e319fef3577af3321ed08630d77c4ffca766", + "canonicalSha256": "95b874a85963858e38e7f7eed4ea5ce934bdc160d86f123b431cb6ccc3fed481", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTM4NTAwODMsCiAgImFwcGVuZE5hbm9zIjogMTg0OTQyOTEsCiAgInRvdGFsTmFub3MiOiAzODcwOTUwOTU4LAogICJyb3V0ZU5hbm9zIjogNTg0MTYsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM3Nzc5MTYsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4NDQxNDE2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzYwNzYzNTQxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc4ODAzNjI2LAogICJmcm96ZW5OYW5vcyI6IDMwMzk1NjcxNjcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAxNDIyMjEwLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNDEwNTEyNiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMjIxNTgzMywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ0NTI5OTYwLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzEzODM3OTEsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 93850083, + "appendNanos": 18494291, + "totalNanos": 3870950958, + "routeNanos": 58416, + "embeddedInputPreparationNanos": 33777916, + "hostBeforeFrozenNanos": 38441416, + "processFrozenNanos": 2760763541, + "initializationFrozenNanos": 278803626, + "frozenNanos": 3039567167, + "hostAfterFrozenNanos": 401422210, + "initializationHostBeforeFrozenNanos": 104105126, + "initializationHostAfterFrozenNanos": 102215833, + "graphPublicationNanos": 544529960, + "coordinationHostNanos": 831383791, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 6, + "ordinal": 11, + "startedAt": "2026-08-11T12:05:54.505Z", + "endedAt": "2026-08-11T12:06:17.373Z", + "rawSha256": "d04ce026dbffe0409921dcfa09e7c2ec0537b2cac8c500aa815c6fa0a45da20f", + "canonicalSha256": "cbc3602b05f04edabdd286536a0bfd9fcdffabe0e6677af527110faa735e6090", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTg3NTUxMjUsCiAgImFwcGVuZE5hbm9zIjogMTYxNDEyOTIsCiAgInRvdGFsTmFub3MiOiAzOTMxODAwOTU4LAogICJyb3V0ZU5hbm9zIjogNTY1MDAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzUwNDM1ODQsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5NTU4NDU4LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk1NDMwMjA5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgzMTcyNDU4LAogICJmcm96ZW5OYW5vcyI6IDMwNzg2MDI2NjcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA3NTkzNzA3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMDc0MTA4NCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjcyMjgzNCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTYwOTI3NzkyLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTMxOTgyOTEsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 98755125, + "appendNanos": 16141292, + "totalNanos": 3931800958, + "routeNanos": 56500, + "embeddedInputPreparationNanos": 35043584, + "hostBeforeFrozenNanos": 39558458, + "processFrozenNanos": 2795430209, + "initializationFrozenNanos": 283172458, + "frozenNanos": 3078602667, + "hostAfterFrozenNanos": 407593707, + "initializationHostBeforeFrozenNanos": 110741084, + "initializationHostAfterFrozenNanos": 106722834, + "graphPublicationNanos": 560927792, + "coordinationHostNanos": 853198291, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 7, + "ordinal": 14, + "startedAt": "2026-08-11T12:07:03.130Z", + "endedAt": "2026-08-11T12:07:26.208Z", + "rawSha256": "0995bbc771ba049f25da8f2e30fbdc53d0aece92d331d2ff2d08a2fc3fd9b009", + "canonicalSha256": "b46edbe4f91541e00749dd1091fc8a8bffcf3094662098cb3a94b6977f9a7b7d", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY5ODA5MTcsCiAgImFwcGVuZE5hbm9zIjogMTcyMjY5MTcsCiAgInRvdGFsTmFub3MiOiAzOTEyOTk0MjUwLAogICJyb3V0ZU5hbm9zIjogNzU1NDEsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzYxOTgwODMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMDg5MTY2LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzkzNjk0NDE3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyNTk1OTE2LAogICJmcm96ZW5OYW5vcyI6IDMwNzYyOTAzMzMsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk5NDUyMDg0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzMzNjA0MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzMyOTIwOSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUxMDczNTQxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzY3MDM5MTcsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96980917, + "appendNanos": 17226917, + "totalNanos": 3912994250, + "routeNanos": 75541, + "embeddedInputPreparationNanos": 36198083, + "hostBeforeFrozenNanos": 41089166, + "processFrozenNanos": 2793694417, + "initializationFrozenNanos": 282595916, + "frozenNanos": 3076290333, + "hostAfterFrozenNanos": 399452084, + "initializationHostBeforeFrozenNanos": 107336041, + "initializationHostAfterFrozenNanos": 103329209, + "graphPublicationNanos": 551073541, + "coordinationHostNanos": 836703917, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 8, + "ordinal": 15, + "startedAt": "2026-08-11T12:07:26.274Z", + "endedAt": "2026-08-11T12:07:48.763Z", + "rawSha256": "94854fb1d21d651f84d874b3264ef793f975bca4fac3be485ff6eadc43b689d5", + "canonicalSha256": "772f05ebe6ad1f111f620fa438b273f1aae4992bb287123a2a1f41af3f7fcb9a", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTQ3NzA3NTAsCiAgImFwcGVuZE5hbm9zIjogMTY5NTc4NzUsCiAgInRvdGFsTmFub3MiOiAzOTA0NDA2NzUwLAogICJyb3V0ZU5hbm9zIjogNjI5MTcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzczODIzNzcsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQyMDkwNDYwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzgzMDkwNjY3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyMzAwNzkxLAogICJmcm96ZW5OYW5vcyI6IDMwNjUzOTE0NTgsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA0MDUwNjY3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNTY3NTU0MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMTk2NzkxNywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ4NzU2MDgyLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzkwMTUyOTIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 94770750, + "appendNanos": 16957875, + "totalNanos": 3904406750, + "routeNanos": 62917, + "embeddedInputPreparationNanos": 37382377, + "hostBeforeFrozenNanos": 42090460, + "processFrozenNanos": 2783090667, + "initializationFrozenNanos": 282300791, + "frozenNanos": 3065391458, + "hostAfterFrozenNanos": 404050667, + "initializationHostBeforeFrozenNanos": 105675541, + "initializationHostAfterFrozenNanos": 101967917, + "graphPublicationNanos": 548756082, + "coordinationHostNanos": 839015292, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 9, + "ordinal": 18, + "startedAt": "2026-08-11T12:08:33.736Z", + "endedAt": "2026-08-11T12:08:56.231Z", + "rawSha256": "11311b08586989bea0a7b4fe3d698834483daac6d2fdc0d4d54712181d775a18", + "canonicalSha256": "5acd5bea56b99700dd3964ea238ce0dd45d5eabfc7ce32f995b62fa69c18fb6c", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTc5Mjc5NTgsCiAgImFwcGVuZE5hbm9zIjogMTcwODM0MTYsCiAgInRvdGFsTmFub3MiOiAzODY5OTAzMDAwLAogICJyb3V0ZU5hbm9zIjogNjE2NjcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ3NTcwODMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5NTUxNzUwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzUxODM4ODM1LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc3Nzg2MDgzLAogICJmcm96ZW5OYW5vcyI6IDMwMjk2MjQ5MTgsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk5NjA4ODMzLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODI5MDMzMywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjA1MTU0MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUwMzI4MTY3LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDAyNzgwODIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97927958, + "appendNanos": 17083416, + "totalNanos": 3869903000, + "routeNanos": 61667, + "embeddedInputPreparationNanos": 34757083, + "hostBeforeFrozenNanos": 39551750, + "processFrozenNanos": 2751838835, + "initializationFrozenNanos": 277786083, + "frozenNanos": 3029624918, + "hostAfterFrozenNanos": 399608833, + "initializationHostBeforeFrozenNanos": 108290333, + "initializationHostAfterFrozenNanos": 106051542, + "graphPublicationNanos": 550328167, + "coordinationHostNanos": 840278082, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 10, + "ordinal": 19, + "startedAt": "2026-08-11T12:08:56.296Z", + "endedAt": "2026-08-11T12:09:18.839Z", + "rawSha256": "5617f98f6eedeafd07efbd4cc408ba9c9f26b6e7f2e7a8cbd127edf92db6bb80", + "canonicalSha256": "400fbc9b155443f3661b46ee3ed1206e42b00ddfec985dc11d793ec017458a84", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcxODY1ODQsCiAgImFwcGVuZE5hbm9zIjogMTcyMjA2NjcsCiAgInRvdGFsTmFub3MiOiAzODY0Mjg3NzUwLAogICJyb3V0ZU5hbm9zIjogNzE5NTgsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY1MTA4NzUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMzA1NDE3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzMyODY0NTgzLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg3MTM3NjY3LAogICJmcm96ZW5OYW5vcyI6IDMwMjAwMDIyNTAsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzkzNTg0NzA5LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExOTI0MjAwMCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzA1ODYyNSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTY4NDE5MTI3LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDQyODU1MDAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97186584, + "appendNanos": 17220667, + "totalNanos": 3864287750, + "routeNanos": 71958, + "embeddedInputPreparationNanos": 36510875, + "hostBeforeFrozenNanos": 41305417, + "processFrozenNanos": 2732864583, + "initializationFrozenNanos": 287137667, + "frozenNanos": 3020002250, + "hostAfterFrozenNanos": 393584709, + "initializationHostBeforeFrozenNanos": 119242000, + "initializationHostAfterFrozenNanos": 103058625, + "graphPublicationNanos": 568419127, + "coordinationHostNanos": 844285500, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 11, + "ordinal": 22, + "startedAt": "2026-08-11T12:10:04.010Z", + "endedAt": "2026-08-11T12:10:26.838Z", + "rawSha256": "18eb629ee2d0191909609b9b6014bd85f7802dadb8faf52ccec03bbc7f9b3d2e", + "canonicalSha256": "aaff05fa3c46a70bc003f253e5f4888e49592035b08ac75c03a624e78d87d426", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTU4ODQzMzMsCiAgImFwcGVuZE5hbm9zIjogMTYxMzEwNDEsCiAgInRvdGFsTmFub3MiOiAzODI2NjQyMzMzLAogICJyb3V0ZU5hbm9zIjogNTQyOTIsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM3ODk4MzQsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4NDM3NTQzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzIwOTU0NjI0LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc2OTU5ODc1LAogICJmcm96ZW5OYW5vcyI6IDI5OTc5MTQ0OTksCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzkzOTUxNjI2LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjU0MjIwOCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDY1NDU4NCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ3OTIxMDg0LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4Mjg3Mjc4MzQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95884333, + "appendNanos": 16131041, + "totalNanos": 3826642333, + "routeNanos": 54292, + "embeddedInputPreparationNanos": 33789834, + "hostBeforeFrozenNanos": 38437543, + "processFrozenNanos": 2720954624, + "initializationFrozenNanos": 276959875, + "frozenNanos": 2997914499, + "hostAfterFrozenNanos": 393951626, + "initializationHostBeforeFrozenNanos": 106542208, + "initializationHostAfterFrozenNanos": 104654584, + "graphPublicationNanos": 547921084, + "coordinationHostNanos": 828727834, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 12, + "ordinal": 23, + "startedAt": "2026-08-11T12:10:26.903Z", + "endedAt": "2026-08-11T12:10:49.471Z", + "rawSha256": "9a5170f983b930a30ede46bac5693fdca5933488508182eea058e9fd26738aec", + "canonicalSha256": "23f010decc8c9d29f8a864c7efa37f46138dbcfc2a8fb406db298caae5eaa98e", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTMzNDIwNDIsCiAgImFwcGVuZE5hbm9zIjogMTYzMDM5NTgsCiAgInRvdGFsTmFub3MiOiAzODcxODgyNTQxLAogICJyb3V0ZU5hbm9zIjogNTQ3NTAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzYwNzkzNzUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQyMDU3MzczLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzQwNDgyNzA5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc2NTgxOTE2LAogICJmcm96ZW5OYW5vcyI6IDMwMTcwNjQ2MjUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDIzNjMwODc2LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwMzczOTEyNiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMjM3NTQ1OSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQxNTI0NDE3LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTQ4MTc5MTYsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 93342042, + "appendNanos": 16303958, + "totalNanos": 3871882541, + "routeNanos": 54750, + "embeddedInputPreparationNanos": 36079375, + "hostBeforeFrozenNanos": 42057373, + "processFrozenNanos": 2740482709, + "initializationFrozenNanos": 276581916, + "frozenNanos": 3017064625, + "hostAfterFrozenNanos": 423630876, + "initializationHostBeforeFrozenNanos": 103739126, + "initializationHostAfterFrozenNanos": 102375459, + "graphPublicationNanos": 541524417, + "coordinationHostNanos": 854817916, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 13, + "ordinal": 26, + "startedAt": "2026-08-11T12:11:34.730Z", + "endedAt": "2026-08-11T12:11:58.145Z", + "rawSha256": "b00273901a9f230c9bcc9fc2dff6fde2ca7d5627ea556928e6195010daa84298", + "canonicalSha256": "f9bd80562a4d4f8397fc5500375b0271586342573b3cdd4ee9bc4e78340c4e96", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY4NzAzNzUsCiAgImFwcGVuZE5hbm9zIjogMTY0MTUyNTAsCiAgInRvdGFsTmFub3MiOiAzOTk4NjY0MTY2LAogICJyb3V0ZU5hbm9zIjogNTY5NTksCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzU4NTQ1NDIsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwNDMwMzMzLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODMzNTA2OTE2LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjk5MzIyMDAwLAogICJmcm96ZW5OYW5vcyI6IDMxMzI4Mjg5MTYsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDEyNzI1MTI0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMjI0MjIwOSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDExMDIwNzU4NCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTgzNDg0OTk5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NjU4MzUyNTAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96870375, + "appendNanos": 16415250, + "totalNanos": 3998664166, + "routeNanos": 56959, + "embeddedInputPreparationNanos": 35854542, + "hostBeforeFrozenNanos": 40430333, + "processFrozenNanos": 2833506916, + "initializationFrozenNanos": 299322000, + "frozenNanos": 3132828916, + "hostAfterFrozenNanos": 412725124, + "initializationHostBeforeFrozenNanos": 112242209, + "initializationHostAfterFrozenNanos": 110207584, + "graphPublicationNanos": 583484999, + "coordinationHostNanos": 865835250, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 14, + "ordinal": 27, + "startedAt": "2026-08-11T12:11:58.211Z", + "endedAt": "2026-08-11T12:12:20.686Z", + "rawSha256": "c62cbb684b0eafeb7ca97c37f49ecbdda5f18682cb7df8beb0a631fce73bc051", + "canonicalSha256": "a4b113dadde911f2aa1498044f820ff82a2829cc4802c91c709fe07550d2d4a8", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTQxMTM4MzMsCiAgImFwcGVuZE5hbm9zIjogMTY2MTkxMjUsCiAgInRvdGFsTmFub3MiOiAzODMwODg3OTE3LAogICJyb3V0ZU5hbm9zIjogODI3NTAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM1OTk4MzMsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MzI5MzM1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzIwMzIxNTgxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc3NzgwMjkyLAogICJmcm96ZW5OYW5vcyI6IDI5OTgxMDE4NzMsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk2NTYyODc1LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTM0NTE2NywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTc3NTE2NywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUwNDAwNzkyLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzI3ODYwNDQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 94113833, + "appendNanos": 16619125, + "totalNanos": 3830887917, + "routeNanos": 82750, + "embeddedInputPreparationNanos": 33599833, + "hostBeforeFrozenNanos": 38329335, + "processFrozenNanos": 2720321581, + "initializationFrozenNanos": 277780292, + "frozenNanos": 2998101873, + "hostAfterFrozenNanos": 396562875, + "initializationHostBeforeFrozenNanos": 109345167, + "initializationHostAfterFrozenNanos": 105775167, + "graphPublicationNanos": 550400792, + "coordinationHostNanos": 832786044, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 15, + "ordinal": 30, + "startedAt": "2026-08-11T12:13:04.810Z", + "endedAt": "2026-08-11T12:13:27.229Z", + "rawSha256": "6fb2afec85636d155af7fe134877ec94319e2881fe65a1bf27367d6adf4ecd7f", + "canonicalSha256": "52324732e03da1714e87f79291b5a9ebb2a67a6b306491dafff965d8e93d7300", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTc5OTQ3OTIsCiAgImFwcGVuZE5hbm9zIjogMTU5NzM4NzUsCiAgInRvdGFsTmFub3MiOiAzOTA3NTQ0NTgzLAogICJyb3V0ZU5hbm9zIjogNTg1ODMsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY2OTEzNzUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxNDcxMzc1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzg0NTAwNzUxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc5MzI4MjUwLAogICJmcm96ZW5OYW5vcyI6IDMwNjM4MjkwMDEsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAzMDA4NzQ4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODAyMjMzMywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNDY1MTk1OCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUwNTYyMzc1LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDM3MTU1ODIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97994792, + "appendNanos": 15973875, + "totalNanos": 3907544583, + "routeNanos": 58583, + "embeddedInputPreparationNanos": 36691375, + "hostBeforeFrozenNanos": 41471375, + "processFrozenNanos": 2784500751, + "initializationFrozenNanos": 279328250, + "frozenNanos": 3063829001, + "hostAfterFrozenNanos": 403008748, + "initializationHostBeforeFrozenNanos": 108022333, + "initializationHostAfterFrozenNanos": 104651958, + "graphPublicationNanos": 550562375, + "coordinationHostNanos": 843715582, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 16, + "ordinal": 31, + "startedAt": "2026-08-11T12:13:27.296Z", + "endedAt": "2026-08-11T12:13:49.892Z", + "rawSha256": "52bb63eb12f1010581b00c1b8fc7941c87dcbff616b97cb6bb6a924f713fef97", + "canonicalSha256": "9357c2b67eb82eab18ac8525fb7e2ef40863342d2f7fa3e3083a13f7681d0f18", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcxODI4MzMsCiAgImFwcGVuZE5hbm9zIjogMTc1MDM5MTcsCiAgInRvdGFsTmFub3MiOiAzOTA1NTA0NDU5LAogICJyb3V0ZU5hbm9zIjogNjE1MDAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzYzMjk5NTgsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMTM1MTI1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzc3MDExODMzLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0MTE4MjkyLAogICJmcm96ZW5OYW5vcyI6IDMwNjExMzAxMjUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAzMzEyOTk5LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzk5Njc5MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzM5MDIwOSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU1NzMzNTgzLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDQzNzQzMzQsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97182833, + "appendNanos": 17503917, + "totalNanos": 3905504459, + "routeNanos": 61500, + "embeddedInputPreparationNanos": 36329958, + "hostBeforeFrozenNanos": 41135125, + "processFrozenNanos": 2777011833, + "initializationFrozenNanos": 284118292, + "frozenNanos": 3061130125, + "hostAfterFrozenNanos": 403312999, + "initializationHostBeforeFrozenNanos": 107996791, + "initializationHostAfterFrozenNanos": 103390209, + "graphPublicationNanos": 555733583, + "coordinationHostNanos": 844374334, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 17, + "ordinal": 34, + "startedAt": "2026-08-11T12:14:35.166Z", + "endedAt": "2026-08-11T12:14:57.624Z", + "rawSha256": "3279e1c3425013d7c4e50adae02fcb68631fc24a4081c006a9aca0d878b91090", + "canonicalSha256": "5f66d955c532f6135a172f10423ff107c929a8957167b08866eb892974d4b2fe", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogMTAxOTg1NjI1LAogICJhcHBlbmROYW5vcyI6IDMyNzI5MDAwLAogICJ0b3RhbE5hbm9zIjogMzk1NzkxNTU0MiwKICAicm91dGVOYW5vcyI6IDEzNzMzMywKICAiZW1iZWRkZWRJbnB1dFByZXBhcmF0aW9uTmFub3MiOiAzMzg0MzAwMCwKICAiaG9zdEJlZm9yZUZyb3plbk5hbm9zIjogMzg1MjA3OTEsCiAgInByb2Nlc3NGcm96ZW5OYW5vcyI6IDI4MDQ4MzEyMDgsCiAgImluaXRpYWxpemF0aW9uRnJvemVuTmFub3MiOiAyODA3MjgyMDgsCiAgImZyb3plbk5hbm9zIjogMzA4NTU1OTQxNiwKICAiaG9zdEFmdGVyRnJvemVuTmFub3MiOiA0MTM4MTQzNzQsCiAgImluaXRpYWxpemF0aW9uSG9zdEJlZm9yZUZyb3plbk5hbm9zIjogMTA3Njc0NDU4LAogICJpbml0aWFsaXphdGlvbkhvc3RBZnRlckZyb3plbk5hbm9zIjogMTAyOTI2MTI1LAogICJncmFwaFB1YmxpY2F0aW9uTmFub3MiOiA1NTIwNzk3NDksCiAgImNvb3JkaW5hdGlvbkhvc3ROYW5vcyI6IDg3MjM1NjEyNiwKICAid2hvbGVPYmplY3RzQWRkZWQiOiA0LAogICJ3aG9sZU9iamVjdEluc2VydGlvbnMiOiA0MiwKICAid2hvbGVPYmplY3REdXBsaWNhdGVzIjogMzEsCiAgImpvdXJuYWxFbnRyaWVzIjogMSwKICAiZG9jdW1lbnRDb3VudCI6IDQsCiAgInJvdXRlUm93cyI6IDEzLAogICJlbWJlZGRpbmdCaW5kaW5ncyI6IDUsCiAgImNoaWxkU2Vzc2lvbnNDcmVhdGVkIjogMywKICAiY2hpbGRTZXNzaW9uc1JldXNlZCI6IDIsCiAgImNoaWxkSW5pdGlhbGl6YXRpb25DYWxscyI6IDMsCiAgImNoaWxkSW5pdGlhbGl6YXRpb25SZXZpc2lvbnMiOiAzLAogICJleHRlcm5hbFByb2Nlc3NDYWxscyI6IDEsCiAgImVtYmVkZGVkRXBvY2hQcm9jZXNzQ2FsbHMiOiA1LAogICJpbml0aWFsaXphdGlvbkFwcGxpY2F0aW9ucyI6IDUsCiAgImluaXRpYWxpemF0aW9uRXZlbnRzRm9yd2FyZGVkIjogNSwKICAicGFyZW50QXBwbGljYXRpb25zIjogNSwKICAiZnJvemVuUHJvY2Vzc0NhbGxzIjogNiwKICAiaG9zdEluaXRpYWxpemF0aW9uRXZlbnRzIjogNSwKICAiYWxwaGFJbml0aWFsaXphdGlvbkV2ZW50cyI6IDIsCiAgImJldGFJbml0aWFsaXphdGlvbkV2ZW50cyI6IDIsCiAgImdhbW1hSW5pdGlhbGl6YXRpb25FdmVudHMiOiAxLAogICJob3N0UmV2aXNpb25BcHBsaWNhdGlvbnMiOiA1LAogICJmb3JiaWRkZW5Db3VudGVycyI6IHsiVU5SRUxBVEVEX0RPQ1VNRU5UX1JFQURTIjogMCwgIlJFUVVFU1RfRlJBR01FTlRTIjogMCwgIlRJTUVMSU5FX0VOVFJZX0ZSQUdNRU5UUyI6IDAsICJPUkRJTkFSWV9OT0RFX0ZSQUdNRU5UUyI6IDAsICJGVUxMX0VOVklST05NRU5UX1NDQU5TIjogMCwgIlNPVVJDRV9SRVBMQVlTX1BFUl9QQVJFTlQiOiAwLCAiUE9TVF9QUk9DRVNTX0ZVTExfUFJPSkVDVElPTlMiOiAwLCAiUEFSRU5UX1BST0NFU1NfUkVSVU5TX09OX0dSQVBIX1JFVFJZIjogMCwgIkNISUxEX1BST0NFU1NfUkVSVU5TX09OX1BBUkVOVF9SRVRSWSI6IDB9Cn0K", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 101985625, + "appendNanos": 32729000, + "totalNanos": 3957915542, + "routeNanos": 137333, + "embeddedInputPreparationNanos": 33843000, + "hostBeforeFrozenNanos": 38520791, + "processFrozenNanos": 2804831208, + "initializationFrozenNanos": 280728208, + "frozenNanos": 3085559416, + "hostAfterFrozenNanos": 413814374, + "initializationHostBeforeFrozenNanos": 107674458, + "initializationHostAfterFrozenNanos": 102926125, + "graphPublicationNanos": 552079749, + "coordinationHostNanos": 872356126, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 18, + "ordinal": 35, + "startedAt": "2026-08-11T12:14:57.693Z", + "endedAt": "2026-08-11T12:15:20.294Z", + "rawSha256": "eb4b349fc85905773fb82fbd9df6597e2a852d23e304f93e258d1c1abb13eafd", + "canonicalSha256": "e7dca835071683b24d50928babb68a5cc61f1b45212494c042f90e0ef7d54a31", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY3ODQzNzUsCiAgImFwcGVuZE5hbm9zIjogMTg2ODA2NjcsCiAgInRvdGFsTmFub3MiOiAzOTExNzE1NDE3LAogICJyb3V0ZU5hbm9zIjogNjcwMDAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzU1MDE2NjcsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQwMDI3NTg0LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzgzNTI0OTk5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgzOTkzNTg1LAogICJmcm96ZW5OYW5vcyI6IDMwNjc1MTg1ODQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA1MjE2NDE3LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjgwNTA0MCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzEyOTc5MCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUzNzE5ODMzLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDQxOTY4MzMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96784375, + "appendNanos": 18680667, + "totalNanos": 3911715417, + "routeNanos": 67000, + "embeddedInputPreparationNanos": 35501667, + "hostBeforeFrozenNanos": 40027584, + "processFrozenNanos": 2783524999, + "initializationFrozenNanos": 283993585, + "frozenNanos": 3067518584, + "hostAfterFrozenNanos": 405216417, + "initializationHostBeforeFrozenNanos": 106805040, + "initializationHostAfterFrozenNanos": 103129790, + "graphPublicationNanos": 553719833, + "coordinationHostNanos": 844196833, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 19, + "ordinal": 38, + "startedAt": "2026-08-11T12:16:05.627Z", + "endedAt": "2026-08-11T12:16:28.668Z", + "rawSha256": "729aa43ae376286d422eae43ed60f29d906c5d83ddd67efd0d9ffa1e0f12753b", + "canonicalSha256": "110abdf9cb47fc3cc92ea58624c3b90e35e411f3e53f8104d8df8dc371ac66e3", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTYzODQ3NTAsCiAgImFwcGVuZE5hbm9zIjogMTY1NjAzNzUsCiAgInRvdGFsTmFub3MiOiAzOTY0ODcyNjY3LAogICJyb3V0ZU5hbm9zIjogNjAxNjcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQ1ODE2NjcsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5MjM5MTI1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODE4NzU2ODMyLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMzAzMDQ3NDE2LAogICJmcm96ZW5OYW5vcyI6IDMxMjE4MDQyNDgsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAzODIwNTg0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzYwOTI1MCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTM1OTc1MCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTc1NzM4NjI2LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDMwNjg0MTksCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96384750, + "appendNanos": 16560375, + "totalNanos": 3964872667, + "routeNanos": 60167, + "embeddedInputPreparationNanos": 34581667, + "hostBeforeFrozenNanos": 39239125, + "processFrozenNanos": 2818756832, + "initializationFrozenNanos": 303047416, + "frozenNanos": 3121804248, + "hostAfterFrozenNanos": 403820584, + "initializationHostBeforeFrozenNanos": 107609250, + "initializationHostAfterFrozenNanos": 105359750, + "graphPublicationNanos": 575738626, + "coordinationHostNanos": 843068419, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 20, + "ordinal": 39, + "startedAt": "2026-08-11T12:16:28.736Z", + "endedAt": "2026-08-11T12:16:51.483Z", + "rawSha256": "6d097fe62d7e4006829c2f8924b20229b30535898cf297750493015238df6faa", + "canonicalSha256": "ac123e102a11dbe7f1a524bb7f322c0151f158f56fe180a925250accd4a1b063", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTgwMzU1MDAsCiAgImFwcGVuZE5hbm9zIjogMTY4NDg2MjUsCiAgInRvdGFsTmFub3MiOiAzOTIyMjU3NDU5LAogICJyb3V0ZU5hbm9zIjogNTA2MjUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzUxNjY5MTcsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMTY2NzA3LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk0OTMzMjA5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0NjYxMzc1LAogICJmcm96ZW5OYW5vcyI6IDMwNzk1OTQ1ODQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAwODkyNDk5LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODQ5ODE2NiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzgwMjQxNywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU2MTI3Nzg5LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDI2NjI4NzUsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 98035500, + "appendNanos": 16848625, + "totalNanos": 3922257459, + "routeNanos": 50625, + "embeddedInputPreparationNanos": 35166917, + "hostBeforeFrozenNanos": 41166707, + "processFrozenNanos": 2794933209, + "initializationFrozenNanos": 284661375, + "frozenNanos": 3079594584, + "hostAfterFrozenNanos": 400892499, + "initializationHostBeforeFrozenNanos": 108498166, + "initializationHostAfterFrozenNanos": 103802417, + "graphPublicationNanos": 556127789, + "coordinationHostNanos": 842662875, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 21, + "ordinal": 42, + "startedAt": "2026-08-11T12:17:36.764Z", + "endedAt": "2026-08-11T12:17:59.535Z", + "rawSha256": "398513591c30e8708c13f1bb66c7785fb91db7bb61d25b82e78bf3c7baca005c", + "canonicalSha256": "106fa216c4eb5342deea7d530ebc8bffebe10479ec9f6356da74a3add80ef4ec", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTcwMDY4MzMsCiAgImFwcGVuZE5hbm9zIjogMTc4NDA0MTcsCiAgInRvdGFsTmFub3MiOiAzOTIyNTI0NDE3LAogICJyb3V0ZU5hbm9zIjogNjE2MjUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY0NTUyOTIsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxNDk2MjEwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzkzMTE0ODc0LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxNzE1NzUxLAogICJmcm96ZW5OYW5vcyI6IDMwNzQ4MzA2MjUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA0ODM3NTQ0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODY2MDgzNCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTYyMzgzMywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU0MjA1NzkxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDc2OTM3OTIsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97006833, + "appendNanos": 17840417, + "totalNanos": 3922524417, + "routeNanos": 61625, + "embeddedInputPreparationNanos": 36455292, + "hostBeforeFrozenNanos": 41496210, + "processFrozenNanos": 2793114874, + "initializationFrozenNanos": 281715751, + "frozenNanos": 3074830625, + "hostAfterFrozenNanos": 404837544, + "initializationHostBeforeFrozenNanos": 108660834, + "initializationHostAfterFrozenNanos": 105623833, + "graphPublicationNanos": 554205791, + "coordinationHostNanos": 847693792, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 22, + "ordinal": 43, + "startedAt": "2026-08-11T12:17:59.607Z", + "endedAt": "2026-08-11T12:18:22.190Z", + "rawSha256": "5cc192c537b83a6222911381822f7d24838ee2b03ff47b486d8394350aa61bc3", + "canonicalSha256": "e0a921d9cdd297ba113cbcaa7b3093935ab660430e0f48be3fa92fd79574d927", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY5NjIxMjUsCiAgImFwcGVuZE5hbm9zIjogMTcwMzEyOTEsCiAgInRvdGFsTmFub3MiOiAzOTMwMjkwMDgzLAogICJyb3V0ZU5hbm9zIjogOTc1ODMsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzQwNjA2NjUsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4ODYwMDQwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODA2OTUxNDU5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc4MzgzNjI2LAogICJmcm96ZW5OYW5vcyI6IDMwODUzMzUwODUsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAzNTU1NTQxLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTc3MjU4NCwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjI4MTk1OSwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUyMjgzNzUwLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDQ5NTQ5OTgsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96962125, + "appendNanos": 17031291, + "totalNanos": 3930290083, + "routeNanos": 97583, + "embeddedInputPreparationNanos": 34060665, + "hostBeforeFrozenNanos": 38860040, + "processFrozenNanos": 2806951459, + "initializationFrozenNanos": 278383626, + "frozenNanos": 3085335085, + "hostAfterFrozenNanos": 403555541, + "initializationHostBeforeFrozenNanos": 109772584, + "initializationHostAfterFrozenNanos": 106281959, + "graphPublicationNanos": 552283750, + "coordinationHostNanos": 844954998, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 23, + "ordinal": 46, + "startedAt": "2026-08-11T12:19:07.727Z", + "endedAt": "2026-08-11T12:19:30.453Z", + "rawSha256": "88efe4ab80db228c37b653b5b5a266261b68f9841b11f460318c081cd56dceec", + "canonicalSha256": "e8f88a1ede7e58cae02b172360a566d2e933e2305b2671e739d7f54e98322394", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY3NDA0MTcsCiAgImFwcGVuZE5hbm9zIjogMTgyOTQ0NTgsCiAgInRvdGFsTmFub3MiOiAzODg4NzQ5ODMzLAogICJyb3V0ZU5hbm9zIjogNzI2NjcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM1Nzk1ODQsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4MjI1NzQ4LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzY4MTM3NzUxLAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgwNzk0MzMzLAogICJmcm96ZW5OYW5vcyI6IDMwNDg5MzIwODQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAwODM0OTU4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTY0NjY2NiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzkwOTIwOCwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUyNTE1OTU4LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4Mzk4MTc3NDksCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96740417, + "appendNanos": 18294458, + "totalNanos": 3888749833, + "routeNanos": 72667, + "embeddedInputPreparationNanos": 33579584, + "hostBeforeFrozenNanos": 38225748, + "processFrozenNanos": 2768137751, + "initializationFrozenNanos": 280794333, + "frozenNanos": 3048932084, + "hostAfterFrozenNanos": 400834958, + "initializationHostBeforeFrozenNanos": 109646666, + "initializationHostAfterFrozenNanos": 103909208, + "graphPublicationNanos": 552515958, + "coordinationHostNanos": 839817749, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 24, + "ordinal": 47, + "startedAt": "2026-08-11T12:19:30.521Z", + "endedAt": "2026-08-11T12:19:53.112Z", + "rawSha256": "4771f376d4cc4533ac11d454fbb8657dd30d4127a67dc1bebfb0e1ccbb82bfaa", + "canonicalSha256": "4d8484c628c3b357e3d042674c82417223469044018aa680d255a0a531a5c532", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY5MTA2MjUsCiAgImFwcGVuZE5hbm9zIjogMTY4ODE5NTgsCiAgInRvdGFsTmFub3MiOiAzOTI5MDIzOTE3LAogICJyb3V0ZU5hbm9zIjogNjQ0MTYsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzUxNDE1NDIsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM5OTM0NzEwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzk0OTQ2ODM0LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgyMDgxNDE2LAogICJmcm96ZW5OYW5vcyI6IDMwNzcwMjgyNTAsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA4ODk3NzA4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwOTUyNzc5MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNjkzODI1MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU3MTk4ODM0LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTE5OTU2NjcsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96910625, + "appendNanos": 16881958, + "totalNanos": 3929023917, + "routeNanos": 64416, + "embeddedInputPreparationNanos": 35141542, + "hostBeforeFrozenNanos": 39934710, + "processFrozenNanos": 2794946834, + "initializationFrozenNanos": 282081416, + "frozenNanos": 3077028250, + "hostAfterFrozenNanos": 408897708, + "initializationHostBeforeFrozenNanos": 109527791, + "initializationHostAfterFrozenNanos": 106938252, + "graphPublicationNanos": 557198834, + "coordinationHostNanos": 851995667, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 25, + "ordinal": 50, + "startedAt": "2026-08-11T12:20:38.467Z", + "endedAt": "2026-08-11T12:21:01.177Z", + "rawSha256": "39362f5ec2900518d54cc01be3ec52d0d9db1b735eb7157fcfdc9ee05b48dd38", + "canonicalSha256": "c721e6dd3f0b0a46c97dc763576b8169ecfc0d6d8a4c6a334cabff16a3e6b7f9", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY0NDY5NTgsCiAgImFwcGVuZE5hbm9zIjogMTY4NTk3NTAsCiAgInRvdGFsTmFub3MiOiAzOTIxOTg1NzUwLAogICJyb3V0ZU5hbm9zIjogNzA3OTEsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY2ODgyNTAsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMzc2Mzc4LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzkzNjUxNDk5LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgzNDA1NzkxLAogICJmcm96ZW5OYW5vcyI6IDMwNzcwNTcyOTAsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAzMjg1Nzk0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwODY2NjI0OSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTE3MjY2NywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU2MjIwMjkxLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDQ5Mjg0NjAsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96446958, + "appendNanos": 16859750, + "totalNanos": 3921985750, + "routeNanos": 70791, + "embeddedInputPreparationNanos": 36688250, + "hostBeforeFrozenNanos": 41376378, + "processFrozenNanos": 2793651499, + "initializationFrozenNanos": 283405791, + "frozenNanos": 3077057290, + "hostAfterFrozenNanos": 403285794, + "initializationHostBeforeFrozenNanos": 108666249, + "initializationHostAfterFrozenNanos": 105172667, + "graphPublicationNanos": 556220291, + "coordinationHostNanos": 844928460, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 26, + "ordinal": 51, + "startedAt": "2026-08-11T12:21:01.245Z", + "endedAt": "2026-08-11T12:21:23.795Z", + "rawSha256": "fe2cac2c203a3bfd4ae60eee674471d5179c68028ba6d3b0b7c5a17cd5e46c38", + "canonicalSha256": "44b9b0bf792f5e4e2985121a19572b826ecf26dec4cb995b64ec1407439e5795", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTc0MzI5MTYsCiAgImFwcGVuZE5hbm9zIjogMTY5MjE0MTcsCiAgInRvdGFsTmFub3MiOiAzOTIwNDc5MjUwLAogICJyb3V0ZU5hbm9zIjogNTk5MTcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzY5NDAyOTIsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxNTk5NDU4LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzkxMDI3MDg0LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg0NDU2ODMzLAogICJmcm96ZW5OYW5vcyI6IDMwNzU0ODM5MTcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDAyOTE1MjA4LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzM1MzU0MiwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwNTIyNTM3NiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTU2NDE0NzA4LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NDQ5OTUzMzMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 97432916, + "appendNanos": 16921417, + "totalNanos": 3920479250, + "routeNanos": 59917, + "embeddedInputPreparationNanos": 36940292, + "hostBeforeFrozenNanos": 41599458, + "processFrozenNanos": 2791027084, + "initializationFrozenNanos": 284456833, + "frozenNanos": 3075483917, + "hostAfterFrozenNanos": 402915208, + "initializationHostBeforeFrozenNanos": 107353542, + "initializationHostAfterFrozenNanos": 105225376, + "graphPublicationNanos": 556414708, + "coordinationHostNanos": 844995333, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 27, + "ordinal": 54, + "startedAt": "2026-08-11T12:22:09.139Z", + "endedAt": "2026-08-11T12:22:31.489Z", + "rawSha256": "762dca0bc4bfb396e493cc0d815c37c234acfc962b752e1d68a961aab5cb23f5", + "canonicalSha256": "d829793819f673c0be3c0f3c201090b3e908c4cf70aaf83de90f1bce0b3f30c0", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTUzNjAwODMsCiAgImFwcGVuZE5hbm9zIjogMTY1MzU4MzMsCiAgInRvdGFsTmFub3MiOiAzODczNTE1NTgzLAogICJyb3V0ZU5hbm9zIjogNTc2MjUsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzMzNjEyOTEsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM3OTgyNzUwLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyNzY1MTI0OTU3LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjc3NTEyNjY3LAogICJmcm96ZW5OYW5vcyI6IDMwNDI2Mzc2MjQsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk4NzMzOTYwLAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNjc4ODg3NSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzQ1MTU0MiwKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTQ2MjM1MjEwLAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzA4Nzc5NTksCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 95360083, + "appendNanos": 16535833, + "totalNanos": 3873515583, + "routeNanos": 57625, + "embeddedInputPreparationNanos": 33361291, + "hostBeforeFrozenNanos": 37982750, + "processFrozenNanos": 2765124957, + "initializationFrozenNanos": 277512667, + "frozenNanos": 3042637624, + "hostAfterFrozenNanos": 398733960, + "initializationHostBeforeFrozenNanos": 106788875, + "initializationHostAfterFrozenNanos": 103451542, + "graphPublicationNanos": 546235210, + "coordinationHostNanos": 830877959, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 28, + "ordinal": 55, + "startedAt": "2026-08-11T12:22:31.562Z", + "endedAt": "2026-08-11T12:22:54.069Z", + "rawSha256": "47f78770bdea1933839cd82a60d939954f074f66515d6ac54549f36d48970967", + "canonicalSha256": "b0d50628ae73d1f692af51416e6159889d7d53c773d386bdf6397674f7b30eab", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogMTAwMzQ3NzkyLAogICJhcHBlbmROYW5vcyI6IDE3MjYzMDgzLAogICJ0b3RhbE5hbm9zIjogNDEwOTQxMzI5MiwKICAicm91dGVOYW5vcyI6IDc1MjUwLAogICJlbWJlZGRlZElucHV0UHJlcGFyYXRpb25OYW5vcyI6IDMzNTEzNzkyLAogICJob3N0QmVmb3JlRnJvemVuTmFub3MiOiA0NTcwMzY2NywKICAicHJvY2Vzc0Zyb3plbk5hbm9zIjogMjkwNjUxNzY2NywKICAiaW5pdGlhbGl6YXRpb25Gcm96ZW5OYW5vcyI6IDMwNDI4MTcwOCwKICAiZnJvemVuTmFub3MiOiAzMjEwNzk5Mzc1LAogICJob3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDQwMjc1MTI5MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QmVmb3JlRnJvemVuTmFub3MiOiAxMDg3NzE4MzMsCiAgImluaXRpYWxpemF0aW9uSG9zdEFmdGVyRnJvemVuTmFub3MiOiAxMDk3MjAwODMsCiAgImdyYXBoUHVibGljYXRpb25OYW5vcyI6IDYyMjA2MTUwMCwKICAiY29vcmRpbmF0aW9uSG9zdE5hbm9zIjogODk4NjEzOTE3LAogICJ3aG9sZU9iamVjdHNBZGRlZCI6IDQsCiAgIndob2xlT2JqZWN0SW5zZXJ0aW9ucyI6IDQyLAogICJ3aG9sZU9iamVjdER1cGxpY2F0ZXMiOiAzMSwKICAiam91cm5hbEVudHJpZXMiOiAxLAogICJkb2N1bWVudENvdW50IjogNCwKICAicm91dGVSb3dzIjogMTMsCiAgImVtYmVkZGluZ0JpbmRpbmdzIjogNSwKICAiY2hpbGRTZXNzaW9uc0NyZWF0ZWQiOiAzLAogICJjaGlsZFNlc3Npb25zUmV1c2VkIjogMiwKICAiY2hpbGRJbml0aWFsaXphdGlvbkNhbGxzIjogMywKICAiY2hpbGRJbml0aWFsaXphdGlvblJldmlzaW9ucyI6IDMsCiAgImV4dGVybmFsUHJvY2Vzc0NhbGxzIjogMSwKICAiZW1iZWRkZWRFcG9jaFByb2Nlc3NDYWxscyI6IDUsCiAgImluaXRpYWxpemF0aW9uQXBwbGljYXRpb25zIjogNSwKICAiaW5pdGlhbGl6YXRpb25FdmVudHNGb3J3YXJkZWQiOiA1LAogICJwYXJlbnRBcHBsaWNhdGlvbnMiOiA1LAogICJmcm96ZW5Qcm9jZXNzQ2FsbHMiOiA2LAogICJob3N0SW5pdGlhbGl6YXRpb25FdmVudHMiOiA1LAogICJhbHBoYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiYmV0YUluaXRpYWxpemF0aW9uRXZlbnRzIjogMiwKICAiZ2FtbWFJbml0aWFsaXphdGlvbkV2ZW50cyI6IDEsCiAgImhvc3RSZXZpc2lvbkFwcGxpY2F0aW9ucyI6IDUsCiAgImZvcmJpZGRlbkNvdW50ZXJzIjogeyJVTlJFTEFURURfRE9DVU1FTlRfUkVBRFMiOiAwLCAiUkVRVUVTVF9GUkFHTUVOVFMiOiAwLCAiVElNRUxJTkVfRU5UUllfRlJBR01FTlRTIjogMCwgIk9SRElOQVJZX05PREVfRlJBR01FTlRTIjogMCwgIkZVTExfRU5WSVJPTk1FTlRfU0NBTlMiOiAwLCAiU09VUkNFX1JFUExBWVNfUEVSX1BBUkVOVCI6IDAsICJQT1NUX1BST0NFU1NfRlVMTF9QUk9KRUNUSU9OUyI6IDAsICJQQVJFTlRfUFJPQ0VTU19SRVJVTlNfT05fR1JBUEhfUkVUUlkiOiAwLCAiQ0hJTERfUFJPQ0VTU19SRVJVTlNfT05fUEFSRU5UX1JFVFJZIjogMH0KfQo=", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 100347792, + "appendNanos": 17263083, + "totalNanos": 4109413292, + "routeNanos": 75250, + "embeddedInputPreparationNanos": 33513792, + "hostBeforeFrozenNanos": 45703667, + "processFrozenNanos": 2906517667, + "initializationFrozenNanos": 304281708, + "frozenNanos": 3210799375, + "hostAfterFrozenNanos": 402751291, + "initializationHostBeforeFrozenNanos": 108771833, + "initializationHostAfterFrozenNanos": 109720083, + "graphPublicationNanos": 622061500, + "coordinationHostNanos": 898613917, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 29, + "ordinal": 58, + "startedAt": "2026-08-11T12:23:39.345Z", + "endedAt": "2026-08-11T12:24:02.020Z", + "rawSha256": "d4246e49a3e51d5eea178383a54cb53fae34b922b1596b0f81b06e6ad9044bc2", + "canonicalSha256": "005c767cca579489c11b44d13126630f9a4cbf028571e53336fec92373c3a427", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY2OTY1MDAsCiAgImFwcGVuZE5hbm9zIjogMTY4MDIzMzMsCiAgInRvdGFsTmFub3MiOiAzOTYzNjA1NzUwLAogICJyb3V0ZU5hbm9zIjogNTc0MTcsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzYyOTQxNjYsCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDQxMTQyNDE1LAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODE1OTgyMTY4LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjg5MTc1NzQ5LAogICJmcm96ZW5OYW5vcyI6IDMxMDUxNTc5MTcsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogNDA5Nzc0Mzc0LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDExMDQyODI1MSwKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwODkwMTE2NywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTY4MDU4MTI2LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4NTg0NDc4MzMsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96696500, + "appendNanos": 16802333, + "totalNanos": 3963605750, + "routeNanos": 57417, + "embeddedInputPreparationNanos": 36294166, + "hostBeforeFrozenNanos": 41142415, + "processFrozenNanos": 2815982168, + "initializationFrozenNanos": 289175749, + "frozenNanos": 3105157917, + "hostAfterFrozenNanos": 409774374, + "initializationHostBeforeFrozenNanos": 110428251, + "initializationHostAfterFrozenNanos": 108901167, + "graphPublicationNanos": 568058126, + "coordinationHostNanos": 858447833, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + }, + { + "pair": 30, + "ordinal": 59, + "startedAt": "2026-08-11T12:24:02.087Z", + "endedAt": "2026-08-11T12:24:25.309Z", + "rawSha256": "ccc7a449ed8607925afa2d4f90c8c81da77bd2f65548831db02ee5bfdd337232", + "canonicalSha256": "22e20bc62524db97fa254c62e1043c7609b85eb9d5f136fd8ace76101ead2af3", + "rawBase64": "ewogICJzY2hlbWFWZXJzaW9uIjogInJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLAogICJydW50aW1lIjogeyJqYXZhVmVyc2lvbiI6ICIxNy4wLjEwIiwgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLCAib3NOYW1lIjogIk1hYyBPUyBYIiwgIm9zVmVyc2lvbiI6ICIyNi41LjIiLCAib3NBcmNoIjogImFhcmNoNjQiLCAianZtSW5wdXRBcmd1bWVudHMiOiBbIi1EYmx1ZS5jb29yZGluYXRpb24ucm91bmQxMy53YXJtdXBzPTMiLCAiLVhteDJnIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCIsICItRHVzZXIuY291bnRyeT1HQiIsICItRHVzZXIubGFuZ3VhZ2U9ZW4iLCAiLUR1c2VyLnZhcmlhbnQiXSwgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNn0sCiAgImVudHJ5Qmx1ZUlkIjogIkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwKICAiYXBwbGljYXRpb25QYXRocyI6IFsiL2NoaWxkcmVuL2FscGhhRmlyc3QiLCAiL2NoaWxkcmVuL2FscGhhU2Vjb25kIiwgIi9jaGlsZHJlbi9iZXRhRmlyc3QiLCAiL2NoaWxkcmVuL2JldGFTZWNvbmQiLCAiL2NoaWxkcmVuL2dhbW1hIl0sCiAgInJlcXVlc3RQcmVwYXJhdGlvbk5hbm9zIjogOTY0Mjk4MzMsCiAgImFwcGVuZE5hbm9zIjogMTcyODA1MDAsCiAgInRvdGFsTmFub3MiOiAzOTQ4NjIwMjA4LAogICJyb3V0ZU5hbm9zIjogNzU3NTAsCiAgImVtYmVkZGVkSW5wdXRQcmVwYXJhdGlvbk5hbm9zIjogMzM4NTM0NTksCiAgImhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDM4NTEwNTQyLAogICJwcm9jZXNzRnJvemVuTmFub3MiOiAyODMxMzU4NzA4LAogICJpbml0aWFsaXphdGlvbkZyb3plbk5hbm9zIjogMjgxMjU0MzMzLAogICJmcm96ZW5OYW5vcyI6IDMxMTI2MTMwNDEsCiAgImhvc3RBZnRlckZyb3plbk5hbm9zIjogMzk5NzEwNDU2LAogICJpbml0aWFsaXphdGlvbkhvc3RCZWZvcmVGcm96ZW5OYW5vcyI6IDEwNzA2MzQ1NywKICAiaW5pdGlhbGl6YXRpb25Ib3N0QWZ0ZXJGcm96ZW5OYW5vcyI6IDEwMzg4OTU4MywKICAiZ3JhcGhQdWJsaWNhdGlvbk5hbm9zIjogNTUxODk2MTI0LAogICJjb29yZGluYXRpb25Ib3N0TmFub3MiOiA4MzYwMDcxNjcsCiAgIndob2xlT2JqZWN0c0FkZGVkIjogNCwKICAid2hvbGVPYmplY3RJbnNlcnRpb25zIjogNDIsCiAgIndob2xlT2JqZWN0RHVwbGljYXRlcyI6IDMxLAogICJqb3VybmFsRW50cmllcyI6IDEsCiAgImRvY3VtZW50Q291bnQiOiA0LAogICJyb3V0ZVJvd3MiOiAxMywKICAiZW1iZWRkaW5nQmluZGluZ3MiOiA1LAogICJjaGlsZFNlc3Npb25zQ3JlYXRlZCI6IDMsCiAgImNoaWxkU2Vzc2lvbnNSZXVzZWQiOiAyLAogICJjaGlsZEluaXRpYWxpemF0aW9uQ2FsbHMiOiAzLAogICJjaGlsZEluaXRpYWxpemF0aW9uUmV2aXNpb25zIjogMywKICAiZXh0ZXJuYWxQcm9jZXNzQ2FsbHMiOiAxLAogICJlbWJlZGRlZEVwb2NoUHJvY2Vzc0NhbGxzIjogNSwKICAiaW5pdGlhbGl6YXRpb25BcHBsaWNhdGlvbnMiOiA1LAogICJpbml0aWFsaXphdGlvbkV2ZW50c0ZvcndhcmRlZCI6IDUsCiAgInBhcmVudEFwcGxpY2F0aW9ucyI6IDUsCiAgImZyb3plblByb2Nlc3NDYWxscyI6IDYsCiAgImhvc3RJbml0aWFsaXphdGlvbkV2ZW50cyI6IDUsCiAgImFscGhhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJiZXRhSW5pdGlhbGl6YXRpb25FdmVudHMiOiAyLAogICJnYW1tYUluaXRpYWxpemF0aW9uRXZlbnRzIjogMSwKICAiaG9zdFJldmlzaW9uQXBwbGljYXRpb25zIjogNSwKICAiZm9yYmlkZGVuQ291bnRlcnMiOiB7IlVOUkVMQVRFRF9ET0NVTUVOVF9SRUFEUyI6IDAsICJSRVFVRVNUX0ZSQUdNRU5UUyI6IDAsICJUSU1FTElORV9FTlRSWV9GUkFHTUVOVFMiOiAwLCAiT1JESU5BUllfTk9ERV9GUkFHTUVOVFMiOiAwLCAiRlVMTF9FTlZJUk9OTUVOVF9TQ0FOUyI6IDAsICJTT1VSQ0VfUkVQTEFZU19QRVJfUEFSRU5UIjogMCwgIlBPU1RfUFJPQ0VTU19GVUxMX1BST0pFQ1RJT05TIjogMCwgIlBBUkVOVF9QUk9DRVNTX1JFUlVOU19PTl9HUkFQSF9SRVRSWSI6IDAsICJDSElMRF9QUk9DRVNTX1JFUlVOU19PTl9QQVJFTlRfUkVUUlkiOiAwfQp9Cg==", + "sample": { + "schemaVersion": "round13-playground-sample-v3", + "runtime": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "entryBlueId": "ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW", + "applicationPaths": [ + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma" + ], + "requestPreparationNanos": 96429833, + "appendNanos": 17280500, + "totalNanos": 3948620208, + "routeNanos": 75750, + "embeddedInputPreparationNanos": 33853459, + "hostBeforeFrozenNanos": 38510542, + "processFrozenNanos": 2831358708, + "initializationFrozenNanos": 281254333, + "frozenNanos": 3112613041, + "hostAfterFrozenNanos": 399710456, + "initializationHostBeforeFrozenNanos": 107063457, + "initializationHostAfterFrozenNanos": 103889583, + "graphPublicationNanos": 551896124, + "coordinationHostNanos": 836007167, + "wholeObjectsAdded": 4, + "wholeObjectInsertions": 42, + "wholeObjectDuplicates": 31, + "journalEntries": 1, + "documentCount": 4, + "routeRows": 13, + "embeddingBindings": 5, + "childSessionsCreated": 3, + "childSessionsReused": 2, + "childInitializationCalls": 3, + "childInitializationRevisions": 3, + "externalProcessCalls": 1, + "embeddedEpochProcessCalls": 5, + "initializationApplications": 5, + "initializationEventsForwarded": 5, + "parentApplications": 5, + "frozenProcessCalls": 6, + "hostInitializationEvents": 5, + "alphaInitializationEvents": 2, + "betaInitializationEvents": 2, + "gammaInitializationEvents": 1, + "hostRevisionApplications": 5, + "forbiddenCounters": { + "UNRELATED_DOCUMENT_READS": 0, + "REQUEST_FRAGMENTS": 0, + "TIMELINE_ENTRY_FRAGMENTS": 0, + "ORDINARY_NODE_FRAGMENTS": 0, + "FULL_ENVIRONMENT_SCANS": 0, + "SOURCE_REPLAYS_PER_PARENT": 0, + "POST_PROCESS_FULL_PROJECTIONS": 0, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": 0, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": 0 + } + } + } + ], + "distributions": { + "requestPreparationNanos": { + "p50Nanos": 96784375, + "p95Nanos": 100347792, + "maximumNanos": 101985625 + }, + "appendNanos": { + "p50Nanos": 16881958, + "p95Nanos": 18680667, + "maximumNanos": 32729000 + }, + "routeNanos": { + "p50Nanos": 61625, + "p95Nanos": 97583, + "maximumNanos": 137333 + }, + "embeddedInputPreparationNanos": { + "p50Nanos": 34757083, + "p95Nanos": 36940292, + "maximumNanos": 37382377 + }, + "hostBeforeFrozenNanos": { + "p50Nanos": 39558458, + "p95Nanos": 42090460, + "maximumNanos": 45703667 + }, + "processFrozenNanos": { + "p50Nanos": 2783524999, + "p95Nanos": 2833506916, + "maximumNanos": 2906517667 + }, + "initializationFrozenNanos": { + "p50Nanos": 281715751, + "p95Nanos": 303047416, + "maximumNanos": 304281708 + }, + "frozenNanos": { + "p50Nanos": 3065391458, + "p95Nanos": 3132828916, + "maximumNanos": 3210799375 + }, + "hostAfterFrozenNanos": { + "p50Nanos": 402915208, + "p95Nanos": 413814374, + "maximumNanos": 423630876 + }, + "initializationHostBeforeFrozenNanos": { + "p50Nanos": 108290333, + "p95Nanos": 112242209, + "maximumNanos": 119242000 + }, + "initializationHostAfterFrozenNanos": { + "p50Nanos": 104654584, + "p95Nanos": 109720083, + "maximumNanos": 110207584 + }, + "graphPublicationNanos": { + "p50Nanos": 552389793, + "p95Nanos": 583484999, + "maximumNanos": 622061500 + }, + "coordinationHostNanos": { + "p50Nanos": 843715582, + "p95Nanos": 872356126, + "maximumNanos": 898613917 + }, + "totalNanos": { + "p50Nanos": 3907544583, + "p95Nanos": 3998664166, + "maximumNanos": 4109413292 + } + } + } + }, + "candidateDecision": { + "overallStatus": "FAIL", + "gates": { + "appendP95": { + "metric": "appendNanos", + "statistic": "p95Nanos", + "observedCandidateNanos": 18680667, + "preferredMaxNanos": 250000, + "hardMaxNanos": 1000000, + "preferredStatus": "MISS", + "hardStatus": "FAIL" + }, + "routeP95": { + "metric": "routeNanos", + "statistic": "p95Nanos", + "observedCandidateNanos": 97583, + "preferredMaxNanos": 50000, + "hardMaxNanos": 200000, + "preferredStatus": "MISS", + "hardStatus": "PASS" + }, + "coordinationHostP95": { + "metric": "coordinationHostNanos", + "statistic": "p95Nanos", + "observedCandidateNanos": 872356126, + "preferredMaxNanos": 120000000, + "hardMaxNanos": 250000000, + "preferredStatus": "MISS", + "hardStatus": "FAIL" + }, + "totalP95": { + "metric": "totalNanos", + "statistic": "p95Nanos", + "observedCandidateNanos": 3998664166, + "preferredMaxNanos": 2500000000, + "hardMaxNanos": 4000000000, + "preferredStatus": "MISS", + "hardStatus": "PASS" + } + } + } +} diff --git a/docs/releases/evidence/round13/five-occurrence-runtime.md b/docs/releases/evidence/round13/five-occurrence-runtime.md new file mode 100644 index 0000000..3e06309 --- /dev/null +++ b/docs/releases/evidence/round13/five-occurrence-runtime.md @@ -0,0 +1,95 @@ +# Round 13 five-occurrence same-machine A/B + +> **NO_POSTFLIGHT_TOOLING_CHANGES:** The tracked importer and receipt generator are the same frozen file, and the runner, current Round12NbaEvidence, candidate execution and harness surfaces, fixtures, locks, wrapper, composites, baseline archive and project, Java runtime, and physical host must match their exact preflight bindings through postflight, receipt generation, and independent verification. No postflight tooling or test-lane substitution is permitted. +> +> Postflight tooling changes: **no**. The campaign importer and receipt generator are the same frozen file: `e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50`. Current Round12NbaEvidence: `98887e7b42b7f1c15f550dff7178ed241bd53e44c85b4702a2abe2106f45c07c` (24321 bytes, mode 0644). + +Schema: `blue-coordination-round13-five-occurrence-runtime-v2`. + +Campaign: `85fd124f-3235-4874-9143-fc379b37b924`. Entry Blue ID: `ENeZoCCotNoHUvJBTpg6JYu9854HP7rAbDNEGUJubeLW`. + +Warmups: 3. Samples: 30 baseline + 30 candidate. Observed order: odd A/B, even B/A. + +| Variant | Span | p50 ms | p95 ms | max ms | +| --- | --- | ---: | ---: | ---: | +| baseline | requestPreparationNanos | 96.757125 | 109.855584 | 122.837208 | +| baseline | appendNanos | 16.782541 | 19.348042 | 20.221625 | +| baseline | routeNanos | 0.062375 | 0.075208 | 0.076375 | +| baseline | embeddedInputPreparationNanos | 34.646542 | 37.111500 | 37.795750 | +| baseline | hostBeforeFrozenNanos | 39.582125 | 41.871376 | 44.445083 | +| baseline | processFrozenNanos | 2795.280292 | 2897.255416 | 2971.856500 | +| baseline | initializationFrozenNanos | 282.107709 | 307.495041 | 332.215668 | +| baseline | frozenNanos | 3079.054084 | 3187.656792 | 3252.091709 | +| baseline | hostAfterFrozenNanos | 405.517207 | 425.483790 | 425.643793 | +| baseline | initializationHostBeforeFrozenNanos | 107.375959 | 117.220625 | 121.929334 | +| baseline | initializationHostAfterFrozenNanos | 104.437751 | 116.218292 | 116.446376 | +| baseline | graphPublicationNanos | 554.138959 | 609.396334 | 632.298751 | +| baseline | coordinationHostNanos | 841.987252 | 893.884918 | 901.694875 | +| baseline | totalNanos | 3922.524333 | 4073.318000 | 4093.335417 | +| candidate | requestPreparationNanos | 96.784375 | 100.347792 | 101.985625 | +| candidate | appendNanos | 16.881958 | 18.680667 | 32.729000 | +| candidate | routeNanos | 0.061625 | 0.097583 | 0.137333 | +| candidate | embeddedInputPreparationNanos | 34.757083 | 36.940292 | 37.382377 | +| candidate | hostBeforeFrozenNanos | 39.558458 | 42.090460 | 45.703667 | +| candidate | processFrozenNanos | 2783.524999 | 2833.506916 | 2906.517667 | +| candidate | initializationFrozenNanos | 281.715751 | 303.047416 | 304.281708 | +| candidate | frozenNanos | 3065.391458 | 3132.828916 | 3210.799375 | +| candidate | hostAfterFrozenNanos | 402.915208 | 413.814374 | 423.630876 | +| candidate | initializationHostBeforeFrozenNanos | 108.290333 | 112.242209 | 119.242000 | +| candidate | initializationHostAfterFrozenNanos | 104.654584 | 109.720083 | 110.207584 | +| candidate | graphPublicationNanos | 552.389793 | 583.484999 | 622.061500 | +| candidate | coordinationHostNanos | 843.715582 | 872.356126 | 898.613917 | +| candidate | totalNanos | 3907.544583 | 3998.664166 | 4109.413292 | + +## Structural counts + +| Count | Baseline (every row) | Candidate (every row) | +| --- | ---: | ---: | +| wholeObjectsAdded | 4 | 4 | +| wholeObjectInsertions | 42 | 42 | +| wholeObjectDuplicates | 31 | 31 | +| journalEntries | 1 | 1 | +| documentCount | 4 | 4 | +| routeRows | 13 | 13 | +| embeddingBindings | 5 | 5 | +| childSessionsCreated | 3 | 3 | +| childSessionsReused | 2 | 2 | +| childInitializationCalls | 3 | 3 | +| childInitializationRevisions | 3 | 3 | +| externalProcessCalls | 1 | 1 | +| embeddedEpochProcessCalls | 5 | 5 | +| initializationApplications | 5 | 5 | +| initializationEventsForwarded | 5 | 5 | +| parentApplications | 5 | 5 | +| frozenProcessCalls | 6 | 6 | +| hostInitializationEvents | 5 | 5 | +| alphaInitializationEvents | 2 | 2 | +| betaInitializationEvents | 2 | 2 | +| gammaInitializationEvents | 1 | 1 | +| hostRevisionApplications | 5 | 5 | + +## Forbidden-work counters + +| Counter | Baseline (every row) | Candidate (every row) | +| --- | ---: | ---: | +| UNRELATED_DOCUMENT_READS | 0 | 0 | +| REQUEST_FRAGMENTS | 0 | 0 | +| TIMELINE_ENTRY_FRAGMENTS | 0 | 0 | +| ORDINARY_NODE_FRAGMENTS | 0 | 0 | +| FULL_ENVIRONMENT_SCANS | 0 | 0 | +| SOURCE_REPLAYS_PER_PARENT | 0 | 0 | +| POST_PROCESS_FULL_PROJECTIONS | 0 | 0 | +| PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY | unavailable in Archive.zip | 0 | +| CHILD_PROCESS_RERUNS_ON_PARENT_RETRY | unavailable in Archive.zip | 0 | + +## Candidate gates + +| Candidate gate | Observed p95 ms | Preferred | Hard | +| --- | ---: | --- | --- | +| appendP95 | 18.680667 | MISS | FAIL | +| routeP95 | 0.097583 | MISS | PASS | +| coordinationHostP95 | 872.356126 | MISS | FAIL | +| totalP95 | 3998.664166 | MISS | PASS | + +Overall: `FAIL`. + diff --git a/docs/releases/evidence/round13/runtime-provenance.json b/docs/releases/evidence/round13/runtime-provenance.json new file mode 100644 index 0000000..26ebc48 --- /dev/null +++ b/docs/releases/evidence/round13/runtime-provenance.json @@ -0,0 +1,37029 @@ +{ + "schemaId": "blue-coordination-round13-runtime-provenance-v2", + "generatedAt": "2026-08-11T12:24:56.958Z", + "campaignId": "85fd124f-3235-4874-9143-fc379b37b924", + "comparison": "SAME_MACHINE_INTERLEAVED_AB", + "warmups": 3, + "samplesPerVariant": 30, + "baselineUnavailableCounters": [ + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY", + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY" + ], + "toolingDisclosure": { + "marker": "NO_POSTFLIGHT_TOOLING_CHANGES", + "reason": "The tracked importer and receipt generator are the same frozen file, and the runner, current Round12NbaEvidence, candidate execution and harness surfaces, fixtures, locks, wrapper, composites, baseline archive and project, Java runtime, and physical host must match their exact preflight bindings through postflight, receipt generation, and independent verification. No postflight tooling or test-lane substitution is permitted.", + "postflightToolingChanges": false, + "importerAndReceiptGenerator": { + "path": "/Users/piotr/data/blue-contract-java/scripts/round13-ab-evidence.mjs", + "sha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50", + "size": 65897, + "mode": 493, + "nodeVersion": "v22.19.0", + "nodeExecutable": "/Users/piotr/.nvm/versions/node/v22.19.0/bin/node" + }, + "round12NbaEvidence": { + "path": "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java", + "type": "file", + "size": 24321, + "sha256": "98887e7b42b7f1c15f550dff7178ed241bd53e44c85b4702a2abe2106f45c07c", + "mode": 420 + } + }, + "integrity": { + "mode": "FULL_CONTENT_MANIFESTS_AND_OBSERVED_COMPLETION_LEDGER", + "preflightBase64": "ewogICJzY2hlbWFJZCI6ICJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLXByZWZsaWdodC12MiIsCiAgImNhbXBhaWduSWQiOiAiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0IiwKICAiY2FwdHVyZWRBdCI6ICIyMDI2LTA4LTExVDEyOjAyOjA2LjMwM1oiLAogICJiaW5kaW5ncyI6IHsKICAgICJpbnRlZ3JpdHlNb2RlIjogIkZVTExfQ09OVEVOVF9NQU5JRkVTVFNfQU5EX09CU0VSVkVEX0NPTVBMRVRJT05fTEVER0VSIiwKICAgICJyYXdSb290IjogIi9wcml2YXRlL3RtcC9yb3VuZDEzLWFiLWZpbmFsLXY0IiwKICAgICJzYW1wbGVzUGVyVmFyaWFudCI6IDMwLAogICAgIndhcm11cHMiOiAzLAogICAgIm9yZGVyIjogIk9ERF9CQVNFTElORV9DQU5ESURBVEVfRVZFTl9DQU5ESURBVEVfQkFTRUxJTkUiLAogICAgInJ1bm5lciI6IHsKICAgICAgInBhdGgiOiAiL1VzZXJzL3Bpb3RyL2RhdGEvYmx1ZS1jb250cmFjdC1qYXZhL3NjcmlwdHMvcnVuLXJvdW5kMTMtc2FtZS1tYWNoaW5lLWFiLnNoIiwKICAgICAgInNoYTI1NiI6ICI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwKICAgICAgImRlcGVuZGVuY3lNb2RlIjogImxvY2FsLWNvbXBvc2l0ZSIsCiAgICAgICJ0ZXN0SmF2YVZlcnNpb24iOiAxNwogICAgfSwKICAgICJpbXBvcnRlciI6IHsKICAgICAgInBhdGgiOiAiL1VzZXJzL3Bpb3RyL2RhdGEvYmx1ZS1jb250cmFjdC1qYXZhL3NjcmlwdHMvcm91bmQxMy1hYi1ldmlkZW5jZS5tanMiLAogICAgICAic2hhMjU2IjogImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLAogICAgICAic2l6ZSI6IDY1ODk3LAogICAgICAibW9kZSI6IDQ5MywKICAgICAgIm5vZGVWZXJzaW9uIjogInYyMi4xOS4wIiwKICAgICAgIm5vZGVFeGVjdXRhYmxlIjogIi9Vc2Vycy9waW90ci8ubnZtL3ZlcnNpb25zL25vZGUvdjIyLjE5LjAvYmluL25vZGUiCiAgICB9LAogICAgInJ1bnRpbWVQcmVmbGlnaHQiOiB7CiAgICAgICJpZGVudGl0eSI6IHsKICAgICAgICAiamF2YVZlcnNpb24iOiAiMTcuMC4xMCIsCiAgICAgICAgImphdmFWZW5kb3IiOiAiT3JhY2xlIENvcnBvcmF0aW9uIiwKICAgICAgICAiamF2YUhvbWUiOiAiL0xpYnJhcnkvSmF2YS9KYXZhVmlydHVhbE1hY2hpbmVzL2pkay0xNy5qZGsvQ29udGVudHMvSG9tZSIsCiAgICAgICAgIm9zTmFtZSI6ICJNYWMgT1MgWCIsCiAgICAgICAgIm9zVmVyc2lvbiI6ICIyNi41LjIiLAogICAgICAgICJvc0FyY2giOiAiYWFyY2g2NCIsCiAgICAgICAgImF2YWlsYWJsZVByb2Nlc3NvcnMiOiAxNgogICAgICB9LAogICAgICAic2V0dGluZ3NTaGEyNTYiOiAiZjYwMjgxZjI0ZmE2NDMxOWMwMmU2MzMwOWM5YjM1NDFkZTc1ZjRmZDQ1OGFjYzIzNzg3MGI4YTY5Y2JhMmMxMCIKICAgIH0sCiAgICAiaG9zdElkZW50aXR5IjogewogICAgICAiaG9zdG5hbWUiOiAiTWFjQm9vay1Qcm8tNS5sb2NhbCIsCiAgICAgICJwbGF0Zm9ybSI6ICJkYXJ3aW4iLAogICAgICAia2VybmVsUmVsZWFzZSI6ICIyNS41LjAiLAogICAgICAiYXJjaGl0ZWN0dXJlIjogImFybTY0IiwKICAgICAgImNwdU1vZGVsIjogIkFwcGxlIE0zIE1heCIsCiAgICAgICJwaHlzaWNhbENwdUNvdW50IjogMTYsCiAgICAgICJwaHlzaWNhbENwdUNvdW50U291cmNlIjogIkRBUldJTl9TWVNURU1fUFJPRklMRVIiLAogICAgICAibG9naWNhbENwdUNvdW50IjogMTYsCiAgICAgICJ0b3RhbE1lbW9yeUJ5dGVzIjogNjg3MTk0NzY3MzYsCiAgICAgICJzaGEyNTYiOiAiNjBhOTI3ZGEyMTY1NTE4OGQ0NGYxODYzYTZmNzkxOGU5M2JmMmM5NzI4NjU3YzEyYTUzYjNjZjU3MTlkMTc4MyIKICAgIH0sCiAgICAiZ3JhZGxlUHJlZmxpZ2h0IjogewogICAgICAiYmFzZWxpbmUiOiB7CiAgICAgICAgIm91dHB1dCI6ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkdyYWRsZSA5LjYuMFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkJ1aWxkIHRpbWU6ICAgIDIwMjYtMDYtMTggMjM6MTk6MDMgVVRDXG5SZXZpc2lvbjogICAgICAzZjc1MGYwM2Q3N2U0MjMyN2M1ZjlmY2I5OTkyMTEwMDg4MzMwYTMyXG5cbktvdGxpbjogICAgICAgIDIuMy4yMVxuR3Jvb3Z5OiAgICAgICAgNC4wLjMyXG5BbnQ6ICAgICAgICAgICBBcGFjaGUgQW50KFRNKSB2ZXJzaW9uIDEuMTAuMTcgY29tcGlsZWQgb24gQXByaWwgNiAyMDI2XG5MYXVuY2hlciBKVk06ICAxNy4wLjEwIChPcmFjbGUgQ29ycG9yYXRpb24gMTcuMC4xMCsxMS1MVFMtMjQwKVxuRGFlbW9uIEpWTTogICAgL0xpYnJhcnkvSmF2YS9KYXZhVmlydHVhbE1hY2hpbmVzL2pkay0xNy5qZGsvQ29udGVudHMvSG9tZSAobm8gRGFlbW9uIEpWTSBzcGVjaWZpZWQsIHVzaW5nIGN1cnJlbnQgSmF2YSBob21lKVxuT1M6ICAgICAgICAgICAgTWFjIE9TIFggMjYuNS4yIGFhcmNoNjQiLAogICAgICAgICJzaGEyNTYiOiAiNTQ0M2VjY2EyMGI3ZTdmOWI0NjE4M2UwMGNlYzMxYjJmOGMwZGIyZmMwZDBjNWE4YjFhY2Y4OWE3OWU4ZDg1MCIKICAgICAgfSwKICAgICAgImNhbmRpZGF0ZSI6IHsKICAgICAgICAib3V0cHV0IjogIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuR3JhZGxlIDkuNi4wXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuQnVpbGQgdGltZTogICAgMjAyNi0wNi0xOCAyMzoxOTowMyBVVENcblJldmlzaW9uOiAgICAgIDNmNzUwZjAzZDc3ZTQyMzI3YzVmOWZjYjk5OTIxMTAwODgzMzBhMzJcblxuS290bGluOiAgICAgICAgMi4zLjIxXG5Hcm9vdnk6ICAgICAgICA0LjAuMzJcbkFudDogICAgICAgICAgIEFwYWNoZSBBbnQoVE0pIHZlcnNpb24gMS4xMC4xNyBjb21waWxlZCBvbiBBcHJpbCA2IDIwMjZcbkxhdW5jaGVyIEpWTTogIDE3LjAuMTAgKE9yYWNsZSBDb3Jwb3JhdGlvbiAxNy4wLjEwKzExLUxUUy0yNDApXG5EYWVtb24gSlZNOiAgICAvTGlicmFyeS9KYXZhL0phdmFWaXJ0dWFsTWFjaGluZXMvamRrLTE3Lmpkay9Db250ZW50cy9Ib21lIChubyBEYWVtb24gSlZNIHNwZWNpZmllZCwgdXNpbmcgY3VycmVudCBKYXZhIGhvbWUpXG5PUzogICAgICAgICAgICBNYWMgT1MgWCAyNi41LjIgYWFyY2g2NCIsCiAgICAgICAgInNoYTI1NiI6ICI1NDQzZWNjYTIwYjdlN2Y5YjQ2MTgzZTAwY2VjMzFiMmY4YzBkYjJmYzBkMGM1YThiMWFjZjg5YTc5ZThkODUwIgogICAgICB9LAogICAgICAic2FtZVdyYXBwZXIiOiB0cnVlCiAgICB9LAogICAgIndyYXBwZXIiOiB7CiAgICAgICJiYXNlbGluZSI6IFsKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgInNoYTI1NiI6ICJlNzRkNGYxMDdkMmZlYWI5ODliOWEwNDFhMDJlMmQyYjg1NTY3ZmY0ODQxNWM5YzdhZGQ1ZWNjMTlhYmQxOWY5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgImNhbmRpZGF0ZSI6IFsKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgInNoYTI1NiI6ICJlNzRkNGYxMDdkMmZlYWI5ODliOWEwNDFhMDJlMmQyYjg1NTY3ZmY0ODQxNWM5YzdhZGQ1ZWNjMTlhYmQxOWY5IgogICAgICAgIH0KICAgICAgXSwKICAgICAgImJpbmRpbmdTaGEyNTYiOiAiMDE1MzFiNjUxMzY1NTIzZDc2NTIxM2JlNzAxMTViYTcwMjQ1NmUyNTY5ODUyZjU1NmJhMmU5OTdkMWU1MjhhNSIKICAgIH0sCiAgICAibG9ja3MiOiB7CiAgICAgICJiYXNlbGluZSI6IFsKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvYmV4LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICJzaXplIjogMTUzLAogICAgICAgICAgInNoYTI1NiI6ICIwMWM5NmM3ZTc2YzFhNzVkZDZhMGRmZDA5NjU2ZDY0NDk5NTdmYjE0NGRkMzYzZjc4NzU2ZmM1NTY4NWRiNDE0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3JlcG9zaXRvcnktc291cmNlLmxvY2siLAogICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAic2hhMjU2IjogImZkM2IwNTUxMDhlZjY1YTdkNTRlMDljOWQ5YzYxOWMyMDhhM2UxZjc1MThiNmUxZjUxNGI3NWQ0MTYzN2ZmZjgiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcHVibGlzaGVkLWFydGlmYWN0LmxvY2tmaWxlIiwKICAgICAgICAgICJzaXplIjogNzkyOSwKICAgICAgICAgICJzaGEyNTYiOiAiYjRlN2I3OGJjZDdhZTkyOTU5YjYxZjg4MmEwYzc2MmE1NjQ4NGE1N2Q4ZDZhMTM4OGMxZmZhYmI5NjJiYjE1NyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogImdyYWRsZS5sb2NrZmlsZSIsCiAgICAgICAgICAic2l6ZSI6IDYzNjQsCiAgICAgICAgICAic2hhMjU2IjogIjI5YTZlMTk5NmY4OGYwN2FlNTZlNGM3MjA0MDljMDkyNDQwYmM2YWRhMTk3MTI1YTBkZmVmMDE3MjJjM2U5NGMiCiAgICAgICAgfQogICAgICBdLAogICAgICAiY2FuZGlkYXRlIjogWwogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogImdyYWRsZS9iZXgtc291cmNlLmxvY2siLAogICAgICAgICAgInNpemUiOiAxNTMsCiAgICAgICAgICAic2hhMjU2IjogIjAxYzk2YzdlNzZjMWE3NWRkNmEwZGZkMDk2NTZkNjQ0OTk1N2ZiMTQ0ZGQzNjNmNzg3NTZmYzU1Njg1ZGI0MTQiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcmVwb3NpdG9yeS1zb3VyY2UubG9jayIsCiAgICAgICAgICAic2l6ZSI6IDM5OSwKICAgICAgICAgICJzaGEyNTYiOiAiZmQzYjA1NTEwOGVmNjVhN2Q1NGUwOWM5ZDljNjE5YzIwOGEzZTFmNzUxOGI2ZTFmNTE0Yjc1ZDQxNjM3ZmZmOCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogImdyYWRsZS9wdWJsaXNoZWQtYXJ0aWZhY3QubG9ja2ZpbGUiLAogICAgICAgICAgInNpemUiOiA3OTI5LAogICAgICAgICAgInNoYTI1NiI6ICJiNGU3Yjc4YmNkN2FlOTI5NTliNjFmODgyYTBjNzYyYTU2NDg0YTU3ZDhkNmExMzg4YzFmZmFiYjk2MmJiMTU3IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLmxvY2tmaWxlIiwKICAgICAgICAgICJzaXplIjogNjM2NCwKICAgICAgICAgICJzaGEyNTYiOiAiMjlhNmUxOTk2Zjg4ZjA3YWU1NmU0YzcyMDQwOWMwOTI0NDBiYzZhZGExOTcxMjVhMGRmZWYwMTcyMmMzZTk0YyIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJiaW5kaW5nU2hhMjU2IjogIjkwMjNjZmIyMzI4ZmJiZmRkZmVjNWIwZWZmYzdhMGY2OTJlN2Q4M2MxMjI1NWExYjFjZjljMTNlOGQ2ZTFhYmUiCiAgICB9LAogICAgImZpeHR1cmUiOiB7CiAgICAgICJiYXNlbGluZSI6IFsKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAic2l6ZSI6IDU3NzEsCiAgICAgICAgICAic2hhMjU2IjogImYxMmU4OTJjMjEzYmJjZjc0ZDA5ZTJiNzFiYTFmZThmNzMzMjdlZWFkMDdhZDNmZmRhM2QzMTk3YTc0YjUyZjEiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgInNpemUiOiA0Mjg1LAogICAgICAgICAgInNoYTI1NiI6ICIyOTRlMjA5MGI1YjZhMWNmMjY4ZDAwMjNkNzVkZmMxNGQ0ZjZlNTBlZDA1YzFhN2E5MWVmMTYwMTUzNmMyY2MzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcGxheWdyb3VuZC9maXZlLW9jY3VycmVuY2UtaW5pdGlhbGl6YXRpb24taG9zdC55YW1sIiwKICAgICAgICAgICJzaXplIjogNjc5OCwKICAgICAgICAgICJzaGEyNTYiOiAiYjFlOTRjMDM5ZDBmZDBkZjcwYjBjODAzZWJlOTIxYTI5MGQxNTkwYmFjNjlhOTA3M2ZlNDkxMGNhODkzOWI2YiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1nYW1lLnlhbWwiLAogICAgICAgICAgInNpemUiOiAzMzg2LAogICAgICAgICAgInNoYTI1NiI6ICJiZjFiNzk5OGRkOTA2NGYzMmYwNGQyYmEyODViNWFmZDQ0OTY0M2FiZjc3ZjNlMzU2M2I2MGY0NzJlM2U5MTIxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgImNhbmRpZGF0ZSI6IFsKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAic2l6ZSI6IDU3NzEsCiAgICAgICAgICAic2hhMjU2IjogImYxMmU4OTJjMjEzYmJjZjc0ZDA5ZTJiNzFiYTFmZThmNzMzMjdlZWFkMDdhZDNmZmRhM2QzMTk3YTc0YjUyZjEiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgInNpemUiOiA0Mjg1LAogICAgICAgICAgInNoYTI1NiI6ICIyOTRlMjA5MGI1YjZhMWNmMjY4ZDAwMjNkNzVkZmMxNGQ0ZjZlNTBlZDA1YzFhN2E5MWVmMTYwMTUzNmMyY2MzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcGxheWdyb3VuZC9maXZlLW9jY3VycmVuY2UtaW5pdGlhbGl6YXRpb24taG9zdC55YW1sIiwKICAgICAgICAgICJzaXplIjogNjc5OCwKICAgICAgICAgICJzaGEyNTYiOiAiYjFlOTRjMDM5ZDBmZDBkZjcwYjBjODAzZWJlOTIxYTI5MGQxNTkwYmFjNjlhOTA3M2ZlNDkxMGNhODkzOWI2YiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1nYW1lLnlhbWwiLAogICAgICAgICAgInNpemUiOiAzMzg2LAogICAgICAgICAgInNoYTI1NiI6ICJiZjFiNzk5OGRkOTA2NGYzMmYwNGQyYmEyODViNWFmZDQ0OTY0M2FiZjc3ZjNlMzU2M2I2MGY0NzJlM2U5MTIxIgogICAgICAgIH0KICAgICAgXSwKICAgICAgImJpbmRpbmdTaGEyNTYiOiAiYjM0YzBlYTEyMzBkZmYwZGUwNmE1NDE1ZWQ3NjI0MDI1OWEzNzMxODdmYzIzODgxNDI4YWYwNjhlODhkMDVhZCIKICAgIH0sCiAgICAiYmFzZWxpbmUiOiB7CiAgICAgICJwcm9qZWN0UGF0aCI6ICIvcHJpdmF0ZS90bXAvcm91bmQxMy1iYXNlbGluZS1wcm9qZWN0IiwKICAgICAgImFyY2hpdmVQYXRoIjogIi9Vc2Vycy9waW90ci9kYXRhL2JsdWUtY29udHJhY3QtamF2YS9BcmNoaXZlLnppcCIsCiAgICAgICJhcmNoaXZlU2hhMjU2IjogIjJmMzAzYWZkOTQzNTkzNzE0NWNlN2ZlMDllYjY1NWZmMWEwNWVlNmVkNzQ4NGZhZWE2MmQ5MzU0NGEzY2NmM2UiLAogICAgICAibWFpblNvdXJjZU1hbmlmZXN0IjogewogICAgICAgICJmaWxlcyI6IDEwOCwKICAgICAgICAic2hhMjU2IjogImIzYTc4ZjU1MTgwOWQzNzdkYjNhN2M1MDAwMmNjOTQyNDcwZGFkZTI2YjViNGJkMTRlMzYxMDg1ODYyZTkyYWMiCiAgICAgIH0sCiAgICAgICJhcmNoaXZlTWFuaWZlc3QiOiB7CiAgICAgICAgImFsZ29yaXRobSI6ICJTSEEtMjU2IiwKICAgICAgICAiaW5jbHVkZU1vZGUiOiBmYWxzZSwKICAgICAgICAiZmlsZXMiOiAyODksCiAgICAgICAgImVudHJpZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2NTkyLAogICAgICAgICAgICAic2hhMjU2IjogImJlOGRiYWRiZDNhYjhjMzJhZjk2MDljZjk3YjI3N2MzOWU3M2IzZTNiNDE3NjYwNDBhNzZkM2I5NTM4MzdjYTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJDSEFOR0VMT0cubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjY3LAogICAgICAgICAgICAic2hhMjU2IjogImU5ZTM2YjY4ZWY5NGFlNDllNjBiMGM2YjhmYThkNmZlNGYxY2VkMjFiYTk0ZmI4NmQwZDY5ZWYyMTNmZmJkMzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJDT05UUklCVVRJTkcubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDYxLAogICAgICAgICAgICAic2hhMjU2IjogIjIyM2JiYWEzMTY3ZWYyNzlmOGY3N2RlMzVmZTA4NDliZDBhN2M1NzVkN2Q0NWMzMjY4MWYzNzMwMzUzZjViM2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2FyY2hpdGVjdHVyZS9jb21wYWN0LWVuZ2luZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0OTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGJjNmVlNzllMzNkODgwMGY2MWJmZTVmNDM1OTViNTZhMjJhNDU2ZTE5YWE0YWZkZDBiYzIyYTZlNjQ4OTViNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZGV2ZWxvcG1lbnQvYnVpbGQtYW5kLXRlc3QubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTM5LAogICAgICAgICAgICAic2hhMjU2IjogImY4NjQ3N2Q3Y2RjMjE0YjM4ZWRhODAzMjMxMjI0MTdjMTgxNGZiMjExNDk3Mzc0MGVkZDJmYzllN2MzZTZhMjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2RldmVsb3BtZW50L2ludGVybmFscy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2MDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDlhZGJmOGJhNGJjZWFjZWMxZjViNzA3NzRmYTRiYzNmOTQyNTRhYWQ1MjMzZmFlN2JhZGE5MWQxMTQwZGZhNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZGV2ZWxvcG1lbnQvcmVsZWFzaW5nLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjgwOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNjc0OTg5ZjIyNDRkZjU4ZjliNWIyNjk3M2MxOWFlZjUwYTVmYzliYjFiNzgxODFhYjRhMzFjMGYyMzBhMzk1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9kZXZlbG9wbWVudC90ZXN0LXN0cmF0ZWd5Lm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUwNywKICAgICAgICAgICAgInNoYTI1NiI6ICIzNzQ4ZWRlODIxMWQwZTY2OTA3ZGRkMTM3MTFjYWI1NjQ0MGNlN2E2YmRiZWRmOTE4ZjNhZTJkZGM0NTdiYmY1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9leGFtcGxlcy9jb3VudGVyLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkxLAogICAgICAgICAgICAic2hhMjU2IjogIjk0ZmUwZWViNGU2ZDVjZDhjYjU3YzgzYWYxNTg0NjllZmJjZWEwZGQ2MmQ0NmEyMzRiNDY2YzQ0Mzk2NDhhNmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2V4YW1wbGVzL2xhcmdlLWhvc3QtcGF5bm90ZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMWM5YmQwZGNhNzhiM2YxMTk5M2Q4ZmNkZDI5MzRlOThiNWVlMzVkYzVlMmY0ZTRkNTg5NTdmNjU4ODc0ZDk2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9leGFtcGxlcy9uYmEtY2F0Y2gtdXAubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjgwNzFkYjE4ODRhNGNiYmI3NzJhNTFmNzczZmI4NjQ1ZTA0OTRhZDJlZjcxMTgyOTA1NzcwNmQ4NzUxODE5MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZXhhbXBsZXMvbmJhLXNoYXJlZC1nYW1lLWxpZmVjeWNsZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2MTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjUyMjUwODIxMzI4NzQ5YTk2MTY3NWMwODljNGQ2ZjA1ZDIxZmZjNDEyYTAyYjY1YjY3MzYxYzMxOTBhYzJmYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvbGltaXRhdGlvbnMubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTA3LAogICAgICAgICAgICAic2hhMjU2IjogIjA5NzY2NTkwMzY3ZjU2NTJlY2I4MjAzNWM4YTZhMzM1NmYzZTBhNDEzZDhhYmNkMDkyY2VhNmI2ZDJhMmViMDUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL21pZ3JhdGlvbi1mcm9tLTIueC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExMzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmY2YzVkMzY0ODU5YWExZTNiNzQ0ZWZlYmMwZDk2ZDcxNGRmOTkzYjM1MDQzMzNjYmQ2NmRjZTc4NjBlMjAwMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvb3BlcmF0aW9ucy9mYWlsdXJlLW1vZGVsLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzkwNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjMmQ1NTVjYTM2ZWE3OTEyZGEzNjUwN2FiNzQwYTY2MmFlMTU0OWUzOGZmZDI5NjFiZjNlZGQ5ZDY4ODg5OGNlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9wZXJmb3JtYW5jZS9ob3N0LXZzLWZyb3plbi10aW1lLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODA2MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0Yjk5ZTcyYjhjMzc2YjBlNjVmZDAwNmQxODc2ZDEwYmEyYjBkZWYxMjg0MzYwNzE4ODNhOTI1ZTVlYWZkZGY3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWZlcmVuY2UvbWV0cmljcy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWQxZThlN2EwYmY2NjRiNTQ2YTJjZDM5OWJmNjE3NDUzZDRlNzgwMmI2NmMzNmE4YzdmYTg0MzIyMzE1OGEwYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVmZXJlbmNlL3B1YmxpYy1hcGkubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MDQ1LAogICAgICAgICAgICAic2hhMjU2IjogIjdiZjVlNmNiMjhiNGY4YmY0ODljNjJkN2MyYjUyODIyMWUyMmVhODYwNzAzYzYxM2Q2MWZkNDFiNTI4ODBkM2UiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzLzMuMC4wLXJjLjEtZXZpZGVuY2UuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1OTExLAogICAgICAgICAgICAic2hhMjU2IjogIjljZDEwZDZiYWE4OWQ3NjRkMTlmYjcxOTgzNDIxNjM2ZjFmYTA3M2ZhOWViZTBkNjc3MDU0Njg4MjFjZTczMDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzLzMuMC4wLXJjLjEtdGVzdC1yZXBvcnQubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NzA3LAogICAgICAgICAgICAic2hhMjU2IjogIjZlOTRjMGYxMzI0ZWQ3ZjAxNTZjNDU1ZjI1NGM5NmYyZGY3ZThiZTIxMzZhZGMwYjQ4ZmUwOTRlMzI2NDdiZGUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzLzMuMC4wLXJjLjEubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjRkYjA5ODc5YWQ5OGY1ODc5MTRkYzBlYmYxNDdlY2Q3YzUxYTAzYzJjYWQ5ODI0Mzc3MWQ2YmRhMDQ1MGE4MDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvYmFzZWxpbmUtbGFyZ2UtaG9zdC10aW1pbmdzLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTY1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJmMjMwYWVlN2Y2ZGI0ZTNkMjljODgzMWQxYzc2NTQyMzZhZjZiOGU0YWYzY2JiNjI1M2RhYTJlNTQ1YzIzY2EyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2Jhc2VsaW5lLXJ1bnRpbWUtY29tcGFyaXNvbi5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA1OTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWNkM2JhMzQ0MzdmOTJkZTlhNWVmZDRlMTI5NTRhY2EzYjk0YzgyNzEwMTY0YWFmNTA3YzIyNTdmYmNlZTIxMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9iYXNlbGluZS1ydW50aW1lLXByb3ZlbmFuY2UuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDlhODE5YjY5YzRmYTUyOTI5OWY4MGJhMjlmMGRmNjE0NThkMWRjZjE5YzRkYzFmZTZhYjc5NWJlMmFmYWJlZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9maW5hbC1sYXJnZS1ob3N0LXRpbWluZ3MuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5NjU5LAogICAgICAgICAgICAic2hhMjU2IjogIjljYzhlZWMyZjJjNTFiNDNhZDc3NmQ2YzRiNjVlZTg2MTE0YzY2ZjYxMTZiY2Y2ODgwY2QwZGRkYTJmOGJlOTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvZmluYWwtcnVudGltZS1jb21wYXJpc29uLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDU5MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MDVmNDBiNDRjNjkwZmEzYTk2NGM1YTAxYzQ3MDA1NjU5ZjFjMmFjZjU5MGE0MjQzYWQ1YWMzNjNkMjRiYzY0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2ZpbmFsLXJ1bnRpbWUtcHJvdmVuYW5jZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNywKICAgICAgICAgICAgInNoYTI1NiI6ICIyNjcyNTlmNzRjYmU5NDFiMjNhYTgxZGJlODUwYTU2MDA0ZDA3NTIyYmVkMWU1NGY5YTJmMjEzZWQwMTkyNWIyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDEyL25iYS1zaGFyZWQtZ2FtZS1saWZlY3ljbGUuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk1NDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDMzYjY5YTAxMDg2NmNjMDA0ZjkyYzcwMWJkNmYzMzhhNzcwY2YwMWEyZWZhODQ1ZGYyNGU5MDc3NzlkZTM4YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMi90aHJlZS1zY2VuYXJpby1wOTUtcHJvdmVuYW5jZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjc3NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzU0ZmM1MGZiOTI5ODVmMzViMmU1NjNhNDYwNTRkODViMjFmMDgyMzQ5NTM3YTk0MDc5ZDhmOGVlM2NmMDZhMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvcm91bmQxMS12ZXJpZmljYXRpb24uc2NoZW1hLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDg4NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMzlkMGUzZjkxMjhhMDE1NmI5MGYyMzdmNzFjZmUyOGIzMDc0MTIxZjg2ZDQzNjhhMDUxZDc0ZGEwZDlhZTYyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9yb3VuZDEyLXZlcmlmaWNhdGlvbi5zY2hlbWEuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MjgyLAogICAgICAgICAgICAic2hhMjU2IjogIjAwNGQxZGI1MjgxYTc2ZjM4ODA1MWEzZGI3YmMyYjBlMjMyZmM3ODM5ZDVkYmRmMzliMjZkNWZlY2NiOWQxMTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3NlbWFudGljcy9oaXN0b3JpY2FsLWNhdGNoLXVwLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDA2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJkM2E1OWYzNWJjYWM5ZWJiYzMxNmNhMGI3NWRmYjhiN2VjOTRiZDZiMWM3ZGE3YjM5YmQ5YjI5MThlNGU1OGRhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9zZW1hbnRpY3MvaWRlbnRpdHktYW5kLXJldmlzaW9ucy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmNlZGE1ZmY4ODZiZjUyNmRmY2I1MzI0NzcyZmYzZTU1ZmE1YmYwMWRhNDE0NzU1MjkxNjAzYmNmNWRjM2M5NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvc2VtYW50aWNzL2luaXRpYWxpemF0aW9uLWNhdXNhbGl0eS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTcwMjdiYTE4NTI3ZTVlZjY4MmZiMjJiYmRkNDlhNGI1Yzc0YWY1YmJhY2Y0OTQxNDJmNjI2MTJjYzk1N2ExOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvc2VtYW50aWNzL3Byb2Nlc3MtZW1iZWRkZWQtZG9jdW1lbnRzLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NzRiNTI1ZTFhZDc5YTg1MDU1YTE2YjJjZDQzNjNkZjllMzMzYzE1YmJiZGIyMWIxOGVkOWRlNDA3NDRlNDZkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLmxvY2tmaWxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjM2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIyOWE2ZTE5OTZmODhmMDdhZTU2ZTRjNzIwNDA5YzA5MjQ0MGJjNmFkYTE5NzEyNWEwZGZlZjAxNzIyYzNlOTRjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLnByb3BlcnRpZXMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmQ3M2U5MTMxN2E1NzZiZTlmZDcwN2FkMzZjZWYyZWViNWZmNWRkMGNiYTcxMTYzZDhjYzMwOGZhNjU4MjdjMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9iZXgtc291cmNlLmxvY2siLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDFjOTZjN2U3NmMxYTc1ZGQ2YTBkZmQwOTY1NmQ2NDQ5OTU3ZmIxNDRkZDM2M2Y3ODc1NmZjNTU2ODVkYjQxNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9wdWJsaXNoZWQtYXJ0aWZhY3QubG9ja2ZpbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTI5LAogICAgICAgICAgICAic2hhMjU2IjogImI0ZTdiNzhiY2Q3YWU5Mjk1OWI2MWY4ODJhMGM3NjJhNTY0ODRhNTdkOGQ2YTEzODhjMWZmYWJiOTYyYmIxNTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcmVwb3NpdG9yeS1zb3VyY2UubG9jayIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZDNiMDU1MTA4ZWY2NWE3ZDU0ZTA5YzlkOWM2MTljMjA4YTNlMWY3NTE4YjZlMWY1MTRiNzVkNDE2MzdmZmY4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDg0NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXciLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjU2LAogICAgICAgICAgICAic2hhMjU2IjogImE1YTVjMTk5YmEwMjE4OWFlOGM0NmEzMzQyMjMzNzFhMjA1OTlkOWMyOThlZjY1ZTc1NDBlZGU0YTNmNzJkNTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogIkxJQ0VOU0UiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDY5LAogICAgICAgICAgICAic2hhMjU2IjogIjQ4MzEzN2Y3MmQ1ZGQ3YTMxYmQwZThhMGM2OTMxNDQzYjNmMzc4ZjZiMmYxZmYwZDlhZmE3MjFkYTNiYzdjMTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJSRUFETUUubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MzgwLAogICAgICAgICAgICAic2hhMjU2IjogIjlhYTU2NWMzM2JhMWYxZDMwNGZlYzcwZDYxYTg4MmJhNjIwNmRlNmY5YmJjZDA5OTU0MmNjY2NjYTI5ZGFlNTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJTRUNVUklUWS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWI4ZWZlYTlmYjJmZGVmMDcyN2E5MGJiMDZjNzE4MjU5OWM0YTY1ODdhZmRiMzI3ZjEwYzdhZGFlZjdlOWQ1NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNldHRpbmdzLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTdjYTU4NTFmOWY2NjMyMDcxY2UxMmNmMGY2MjA5OGQ5OTVlYzlhYzI0NjJlZTAwM2ExODdjMjNiNjJkZDZjYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9jb25zdW1lclRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9jb25zdW1lci9QdWJsaXNoZWRBcnRpZmFjdENvbnN1bWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI0NDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzg0OTZjOWM2MzlmZjEwNDY3M2JlNmM2YmI3OTBmYTU2NzE4NzAyN2E3ZDA5YjViNDA3NTgzYzQyYzM2NWQ2NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9BcHBlbmRBZG1pc3Npb25BdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDExLAogICAgICAgICAgICAic2hhMjU2IjogImY2ZjE3ZjczZTg1MTg0ODAwYzExNjM0YTdlNjBiMDUyOGM0NTg1Y2Q3YjRjNDQyMjBiNGI3Y2VjZThiZjk0MTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ2FjaGVTZW1hbnRpY1Bhcml0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDk3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YzFlOTY1ZGUzNzc0OWVmN2YzNjYwN2NkYWFlYjQ5NjJjMmMyOWVmMDJmZGQwZjc4ZjVkYWI5YTRkMTI4YjYwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NhdGNoVXBQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzgwYjQzMTI4OTc1MmY2NjY1Y2E1OWZkYTFmMzI1NDI5NzMwYjViYjY4NGZmZjk0NGJhMmRmNzQ1NDNlNGRlZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db25jdXJyZW50RW1iZWRkZWRDaGlsZENyZWF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMGEyNzNhZGJjOTljMGMxOGE0ZmM3ZmYzYTY0MDI2Y2I0M2MzODc5OThiNGFkMTA4OGMzZjIyODY2MzhmMjAxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NvcmVCZWhhdmlvckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmM5NDJkMGE2YmQ4NGQzYTE5ODdlMzUyNjQyZTdiNDQ0Mjc5ODg5OWJmNGI2ZTIwMjdlNmIzOTdiYjQwN2IxYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EZWVwU2FtZUVudHJ5T3JkZXJpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTIzODI2YTk2ZTdiNTk5YmI3ZjlmZWVmOGU4MDcxMjVlMDg0MTdhZGQ4MGI0ODZjZDllY2MyMzYzZDYxOGUyOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljSGlzdG9yaWNhbFNvdXJjZVN1cmZhY2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzEwNDQyOWE3M2MzYTNiMjMyNTFiYzc5NDcyZjIwMzU1MGFhZTI4ZDBlODg0NzE1YjIzYTI5MGFkYTQ2YzkzYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkSGlzdG9yaWNhbFBhdGhBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzI4YjY5ZmM3ODc3MmJmZTA4OGM3NGNiNjUxMmE1NjRhY2Q3NmE3MzUzMDAzMDNiOTQwZWI1NmY1YzAyYTEwYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkUGF0aEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTkzLAogICAgICAgICAgICAic2hhMjU2IjogImUyYmZiMzI4YTIxNTY5MGJkNDZkMmUwYmUwMGFhOGFhNWVlMjUwODMwOWZhM2FlMGU1Mzc2MTFkM2JmOGQyYTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRFcG9jaEV2ZW50T2NjdXJyZW5jZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmODI4NzBlMzc5YmVjZWM4ZDk3YzlhYWJkOGU2NGVkMTYxZDk4OTU1ZjcxYzNjMTM5ZDc5NDc4ZGZmN2UyODFiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkT25seUxheW91dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ0MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMmY1MzlmN2Y3YWJiNjU2ODQ2MzhlZGYyZjI3NDU0YzAzOTQyZDFiZTkyNmJmYjEyNTE2MDlhNWYyYzA1YmUzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkT25seVN0b3JhZ2VQb2xpY3lUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTkyLAogICAgICAgICAgICAic2hhMjU2IjogImUwYWJkYmE0MDg5OGM3YjMyZDZhNmUxNDQ2NzE0NjVkNTBhNGY1NTYxNmZmMDBmYTgwZGJkZTUxMjY2MjA3NTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDUxLAogICAgICAgICAgICAic2hhMjU2IjogImU2ZTI5ZGI4M2M3NjJiYjNlM2Y4ZDMxY2Q4MTM1ODI5MTYyMDkzNDQyNzkwZGUwMDk5ZDk5ZDI5MWJkM2MwZmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lVGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmZiNmQ2NTdkYTQ2ZjFjNDAwMDJkYjg2YTRjOGQ2ZDA4ZjM5MzVjYjc0ZDJiNWQ5NWJlYmIwN2Q0NWI0M2M2YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FeGlzdGluZ0VtYmVkZGVkU3RhdGVPbmx5Q2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmRkOTY2ZWUzNDRiMjQwOGYzOTI4ZTM2YWVhZjQ2OGEwOGQwNGZmY2IxZjNkZWQwODBmNjk1NzQ4OTc1MDg3YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9GYWlsdXJlUmV0cnlBdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjIwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2NzA3MzBhN2MwMWZhMDk1NDU0MjA5NmQ5YTg3MWJiZmUyN2E0MzQ1ZjIwZTNkN2IxZmVlYjAyODIzNDdkMzE4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0hpc3RvcmljYWxTb3VyY2VTdXJmYWNlSW50ZXJ2YWxJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3ODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2NmZjM4NWFiNjcyNWE0NjQyNzViZDA5MWY0NDczYWQxMTI5OTU0NTdlOTZjNWMxNTM4NmRkYmZhMmRhMGU1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Jbml0aWFsaXphdGlvbkxpZmVjeWNsZUV2ZW50T3JkZXJpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc3MTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTdmYmRiYTQzYWVjZDM4YmQ3YmI5NjJlYzcyZTM0MzBkY2I5NDEwNDQ4NGQwMjI0ZjhkZWFkZDQ1NjZiMjYzYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Jbml0aWFsaXphdGlvblJldHJ5SWRlbXBvdGVuY3lUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTk5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4M2E2ZjJiZDE3M2MzNDVhYjAyYTJiZDNkNzUzNDJmYzEzMDk5YWE1OWIyNzkxM2I3OTRlMjFkMmI2MzQ2MDJlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0xhdGVBZG1pc3Npb25FbWJlZGRlZEhpc3RvcnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODkxLAogICAgICAgICAgICAic2hhMjU2IjogIjFlNmZlYzA0ZDVlMTVhMzJjODdlNzNkYzRlZGVhYzM4YWI1NTI3MTgxYjg4OTJjN2YxNGVhZjNlYzllZDc3NTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZENoaWxkQ29sbGVjdGlvbk1lbWJlcnNoaXBNdXRhdGlvbkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzA0NywKICAgICAgICAgICAgInNoYTI1NiI6ICI5ODViZDk1OWRhZGRlMzBiNjc2NDY1ZmU2MzJiYTI3OGIxOTcxNWM5YzQ4MjI2NDQ1YmE4YmRiYmJmOWNhYzY1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWRDaGlsZE93bmVyc2hpcEd1YXJkVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICIwYTk0OGVjZWM0YzZmNjA1NWFhYTkwNGQ2OTFkYzQ2M2FkNTM0ODg1OWU5MDBlZjNjYzNlMTdjZmVjNTdjOTFkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWREb2N1bWVudElzb2xhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTRmZWIxZTI0YTI2YmJmOWUyN2I0N2RlN2VlM2I1NDNlOWUwZjk1NzI1NTMxOWU4NzNiMjcxZWJiMjNlZjE3NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NdWx0aUNoaWxkU3luY2hyb25pemVkQ2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNDg3LAogICAgICAgICAgICAic2hhMjU2IjogImU3N2Q1MTE1MmFmNzdhYzhhYzU5NmVkOWEwNWVkNzE2ODQ3NjM3YTAyNjE2M2IwMjNjMjVkYjA3NWVhNmM5NTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkRW1iZWRkZWRDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc1OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYmRhZTBmNzVlYmJlNmY2MDI1Zjk5Yjk0YWNjN2I4MjlhZDRmNjE4YTBlZGU4MjAwMmMzNDEyNmIyYzI4MjA5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZE93bmVkU2NvcGVQbGFuSW52YWxpZGF0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjcwLAogICAgICAgICAgICAic2hhMjU2IjogIjUwOGUzMTNlZDczMDEyNzFjNzdkMDVmMDMwOWYzN2RiMGQyM2UzMGZiOWZjMGU1NTM4MjBjZTk1ZDRjZDVkMmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkU2libGluZ0dsb2JhbENhdGNoVXBPcmRlcmluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExNjE5LAogICAgICAgICAgICAic2hhMjU2IjogImQxOGRlODBlYzQwZDIxZjM1NmE5MGZjMzVkMzg1M2I3MzczOWRmYjU3NzZhZjNlNjJmMmI1OGMyM2U3YjdmOTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTm9uU2NhbGFyUm91dGluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMWY4M2E0ZDI3ZjViMWYzZjZlNWU4ODM4NzJhMWE4NTZiYTBkNWM4YWQxMTg0NTcxOTFlYmYzM2JlNDhmNDdjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Byb2Nlc3NFbWJlZGRlZENvbGxlY3Rpb25QYXRoc0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTUxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZmFhNjkxMThlZTVjYTBlNzAyZTY1YmY0ZjA4MmMzYzE2NTg4N2VkN2M5N2U3YTgyMGJhYzFiODU5NThjOTdjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1B1YmxpY1RlbXBvcmFsRmVlZGVySW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTQzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI1ODVlMjYxNzc3YTY2ZDU1ZTQ4NDU4OGRlOTNiZGRlNjkzYjUyMGQ5MjI0NmUxNjc5MWYxYmNhNjlkMDA0NjkxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JlbW92YWxDeWNsZUFuZFJlYXR0YWNobWVudFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg0MTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmEzZWQzMTg1ZWE4MzRmMjlkODIxNDZiNjQ3ZmU1NDJlYTcyNDNmMjdkYzA2Nzc3ZDBhZTdmNTMzZTVmZDkwMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEwSW5pdGlhbGl6YXRpb25JZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjM5OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDBlZDY3NjBkMDE1NGMyMzU0NmQ4Y2RkNTZjNTVmYzEwZWJiOWU0YTIzOGRiYmU2NDJhOTVkOGI2ZTUyODQ2NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjk0ZTIwOTBiNWI2YTFjZjI2OGQwMDIzZDc1ZGZjMTRkNGY2ZTUwZWQwNWMxYTdhOTFlZjE2MDE1MzZjMmNjMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TYW1lRG9jdW1lbnRJbml0aWFsSWRlbnRpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NTA4LAogICAgICAgICAgICAic2hhMjU2IjogImZhZjEwNmMyZjAwMWY4YTFjYTM3MThjZWVlYWJiN2IwY2VkMDJkYzg5ZDdhZTVhMjcyOTA3YTQ0ODk2MWRlZWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2hhcmVkTWFuYWdlZENoaWxkVHdvT2NjdXJyZW5jZXNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NDY3LAogICAgICAgICAgICAic2hhMjU2IjogImZhNzBiMDVkMmE0MWQxYzNkNGEyZWM3NWIzZjE0ZjFhNDZmNWFhMjRiZmM0YTllOTIyZGY4ODg2YTU5MzJkNzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2hhcmVkTWFuYWdlZENoaWxkVHdvUGFyZW50c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MDAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ5MTM0OWQwOGIwZGU4NDFjMTNhMzAwNjBlZTc0NDAzNDE5MGIxOTFmYjIxOWM3YWJhNmQxNjlkZWQ3YzczYjUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU291cmNlU3VyZmFjZUlkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2OTM5LAogICAgICAgICAgICAic2hhMjU2IjogImVmY2UzMTVjZjNmYzczZmQ2MWYyMGU2NzgyZGJmMjdkNTMzYmQ3NmUxZTY2OTA5YjIwYzliY2U2MTRmZjM4MTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU3RhcnRBZG1pc3Npb25BdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODk2LAogICAgICAgICAgICAic2hhMjU2IjogIjJiMmNjYjUyZjIwMjJiNDVlYWQ4NzlkNDM4MDBiZTM4ZDU5OTllODRmODkyZjNiNjU5MDQxNmMyNjQyN2Y0NmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVtcG9yYWxBZG1pc3Npb25Qb2xpY3lJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzOTE3LAogICAgICAgICAgICAic2hhMjU2IjogIjFkNTMzNDFlZTRlMTBmYjQyMTIwNzFiMGRmNTBhMWVmM2FlMjg1ZTE3MWU4YTBmZWI2NDQ5OWU0MWRhNDE1NTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVzdEVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTczMjhmNWY3NDRkNWM5OTYxYTlmN2YzMDY4MjAwMzEzY2M1ZGQ3NzRhMThmNjc1YWY4MTIzNGM4ZTRiMjI5YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZXN0UmVzb3VyY2VzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjAwOWUxZjFmMDZlZTc3NTMyZGQwZDRlYzZhMDA2MGQ3ODhlNmNjMjY5MzMyYzU3Yzk3NjRiZDRiMTJjYmRjYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XaG9sZU9iamVjdEZhaWx1cmVIeWdpZW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzgwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNzhjZTE5N2Q5MmU2YzE4OGExZjJlNWNlY2NiNmI5ODlmNWI4YjdlNTY4ZWQ5NTc4NGVlNjA5ZTRjZTU2MzYxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0FwcGxpY2F0aW9uUmVhZGluZXNzUHJvb2ZJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk2NjgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTk4NzcxMTI2YmVmZWRjZjhiZGNlMmJiYzQ4ZGJhNDAxNDkzMzMxYWYwYzJkODMwNWJhMzMyYTYyYWYzNTgzNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2FsbC10aW1lbGluZXMtcm91dGluZy1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE2LAogICAgICAgICAgICAic2hhMjU2IjogIjhlNzQyNDE4ZDY3NzA1MTg2NjZjNzNlNWRmNzNlZTk5N2I2NDU3ZDY1MjRiODk3NDJmZWU4ZDA5YWZjNGRlMTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9jb21wb3NpdGUtcm91dGluZy1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDY3LAogICAgICAgICAgICAic2hhMjU2IjogImU0NTlkYjJjYjg4ZmFjZThmM2QwYjU5Yjk2OGFhYjU1MjFmMzc4NTA2Yjk3YWFkMGJjZWY3ZjhkOWUyZjk4YTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzgxLAogICAgICAgICAgICAic2hhMjU2IjogIjExZmE5ZmM3NTU3NmFlZDQ2NDY5MzI1YjAyNzc4MzNjZDkwNmMzN2VkMmM2NTA2NWMzYThiOTVhNTNlN2JjMmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktYTEueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0NzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjU0Y2NkZTE0MTNjMzljYmY0ZDFmNWIzNDQzZTJlMzU4YmM0NGRlYjljZDg3YzY3YzQzYjI1N2QxNzllMDJkNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1hMTEueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcxMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1M2NhNzRiZWU2NThkMDUxMzNlNGFlYjU4YmZjN2Q5YWJiNGI5MzdiNmMwMzFkMmViYzgxYzQ3YTVkMTVjYWRmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ0NmU1NGI1OWUzZTA2NmU1MWMxMzNlYzM3ZGExMDEyMDFjODA4NDc0NmRhM2Y0MjE2YmRlYmYxY2I3NTVmYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2R1cGxpY2F0ZS1ldmVudC1lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ4ZDZlOGRjZDRlOTMzNmFmMGMyNjY1Y2UwMDdiZjQ5YjMyMTVkZDFjM2JmZjhiYTQwZmVlMWY0OGU1YWFiMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2R5bmFtaWMtc291cmNlLXN1cmZhY2UueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzODcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTZlZTMxZTA1YTAzMTVkNWI3NmMzMzE3ZWViODdmYjIwMDFiYjM1MTI3NGQxMmEyZjEwMGMxOTM2NGQ3OWI5YSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvbGxlY3Rpb24tcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjMyLAogICAgICAgICAgICAic2hhMjU2IjogIjU1YjQwMzlhMDZjNTEyMmFmMjY3M2E4ZGYwZmE0Y2UyNDk5OWEyNzJjYTBjOGQ5N2Q5NzExMzAxN2U1MTM3OTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb3VudGVyLUIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjMjc5MDk0ZGJjNTFlNjgwOGI1N2RmMzI5MDBkMzA5MTI4YzRhMjA4ZWQxY2Y0ZWFkMThkM2U0MjllNTczYjc2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODYxLAogICAgICAgICAgICAic2hhMjU2IjogImIzMTZhZmI2Y2ZiODkxNmQzOWE3ZmQ3MjM4OTQ5ZTRiMGE1OGI0ZDcyYTBiNGI0ODQxNDU5ZWU0MDg5NTAxM2UiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1taWRkbGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjhmZjAyYmE0Yjk2ZWNkMTVlNmEzN2E5N2M4YjBiZDgyM2RkZWI3NTllYTk4MDA5NzUyYzMzZmJiNDUzZGU5ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2YjU5Y2MyZWMwY2FhOTQyNTE5ZDhkZDNhY2M4NTUxZjJjY2QzMDRlMGJkNjI1NDZkMzE2Njk0MTY4NDk0YmYyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtcm9vdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY2NywKICAgICAgICAgICAgInNoYTI1NiI6ICI2ODY3NjYxMzM4YThhYWQ1NzJhMTc1Y2QyYzE3NTgzMjMyNjM4ZDYzMGU4ZjFlZDc3NzgyMjk4NTljODJhN2MwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtc3RhdGUtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAic2hhMjU2IjogIjFmZGIwNDJjYTA3NjM3MGE3MjhmZmY5Zjg1ZDE3ZDQ5NDNlMGEwMmI5ZWY2OWEyZWQ0OWY0YzMwZmQ5ODBmOGIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9pbml0aWFsLWVtYmVkZGVkLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjI5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NWRmMjMwZDZiZjkyZDJiZGJmYTZiMTgzYmM0YzI1MWY2Yjk3MzQwNWZiN2QwZTY2M2Y0YjBmMjlmN2I1YmZmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbGFyZ2Utb3JkZXItaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjEyMzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmVmNDFjNTM0YTdkMTc4NTdlOWQxNmI5NjQzMWNhYWNiOGJmZWJkYTQ4YzlmMGQ0MzE5YmNlYTZlMjdkZTEyZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2xhcmdlLXBheW5vdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2ODIxLAogICAgICAgICAgICAic2hhMjU2IjogIjcxN2JiYjZlYjAzYzBhOTE1MmEwMmJiY2VhMWZjN2Q3YmE4YzhjYWZkYmRmODkxZWYyZDIzYTdhMGUyY2EwYWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtZ2FtZS1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDg4LAogICAgICAgICAgICAic2hhMjU2IjogIjRiNWRkZTUwYzBmNGMyMDdkZjE1NjVhMjFmMjMyMzZjY2E3ZmMyMzViZTBmYmViYWI1MTg2NzZkMTIzYzgyMjMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtZ2FtZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjc0MywKICAgICAgICAgICAgInNoYTI1NiI6ICJiMTQyNzZlOWRjNmE0YjQ2NmY2YzhiNTc2OGFkZWE5MDhkZWJlNWNmMGU4MjQ1MDVmZGQwNDRjM2I2MGQzMzY0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLXJvdW5kMTAtc2xhdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2Q5MDFjNmVhMDFjZDg4ZDA3NmJmNmU4MDU5ZThkOWNhYjA3NzFhZWJmOGE5ZjE3ZTg2OWI0YjNmMTY2NzhmOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1zdGF0aXN0aWNzLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDc1LAogICAgICAgICAgICAic2hhMjU2IjogIjk5NWQ5MGEwOGY4ZTJhYTQ0YTU5MDljOTZlN2YzY2M1NTI1MWY5NmJhOWFkNjU4OTY2ZmYzZDFmZmU4YTBlMmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uZXN0ZWQtb3duZWQtZHluYW1pYy1zdXJmYWNlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTYyLAogICAgICAgICAgICAic2hhMjU2IjogImVjNzQ5OTlkNDc3M2E3YjJiMjk1ZTQyODNmZTQ2YjY3MzZhYWY5ZWRiZjI4NjEwNjkwZTIwODMwMzViM2NkZWMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uZXN0ZWQtc2libGluZy1oaXN0b3J5LXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2ODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjhlZWVjM2E3MzUwODg3ODdmMmQ1MTk3NWZjNTMwMmNlZjIzYjZhY2Q5Mzg4MWFlZTlmODA1MTM0YjYyN2E1ZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL293bmVyc2hpcC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIxMzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODk1NTNkYjY3YjIzYzNmOGNiMWIwYWZiZjg1OGE1MDhjNjdhZTc1NDAwNThmNmNlMmQxYWJmMTE0M2MyZTZkNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3BhY2thZ2UtcGF5bm90ZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzU4MjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmI4YzBlMWJhYTY1NzVjMzliNjBkOTQ3OTY4NDY2MWU2NmE4NDk5YzQwOGQ3NzBkYmVlM2NjYWRmY2I0ZDk2NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3Jvb3QtaXNvbGF0aW9uLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDJjMjBjYTkzODYzMWMyOWU0OWJhMDBlNTBhMzA3ZmY1MDY5OWUxOWYzNTQ5M2IxMDY4NTVmNmJjNTQ1NzU1NSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3Jvb3QtaXNvbGF0aW9uLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyZmY2N2YwZGUzYTIwNjJmMzk0NGExYjlmMDFkYjI1YzkyZWQ3MWVmNzg0OTZlOTg0YTRjZWZlOTkwNTEwYjJlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vc2hhcmVkLWNoaWxkLXR3by1vY2N1cnJlbmNlcy1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2IwYTJiN2RmNGE1YjEyYzNkZGM3OTAzYTFhMzdkNTMwMGRhNDA4NTcwMzI5Nzg3ZDBkNjZmMDRmNDhmYWFjOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3RocmVlLWNoaWxkLWhpc3RvcnktcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODM1LAogICAgICAgICAgICAic2hhMjU2IjogImRlNDBkMDk2NTMzNzhhYWMyNDA0NzgzM2RiMDAyMTk4YTM3MjFhM2Y0NGEyMjAzOGZhMzQ0YmVmMmY3YmIzMDciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi93aG9sZS1yZXF1ZXN0LXNpbmsueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExOTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDk5ODc2MDFkMzlhMjc5N2RjZmQzNDk4YzcwMjViNTM3MzFkOWMyMTgwZTkzMTdiNjQ2NWExNmJlMjAyZDhmMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvZHluYW1pYy1jb2xsZWN0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmIzY2U0MDdhNjAwZThhYmQ0MTU3YjMzYTgyOTU4MDc2YTYwNDI5ZGMyZjliMTRhOTBlNGNhNDI2ZjMxYTlhNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvZHluYW1pYy1wYXRoLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI5MTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWNlZDczNGVjNWFmMWJjMjMyODA3NGFlOTNkMzA0YmY5NTQwMGU3ZGUyNmUyZWZjMWRlODY0YWY2NDBiYTgzNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tZHVwbGljYXRlLWV2ZW50cy1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMDdlOThmZDc0NmJjMjNiNDJlMzk4ZDkwMjZhY2RlYzI5N2E1YTlhZGM4NjEzMTRhNjRmOWU3NzkzZTk2Njk0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1ldmVudC1vYnNlcnZlci1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMzNzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjg3NTZiYzRiYjMzOTE4MjE5ZmJiNzE5NmFlNjQ4MzAxYTQ4MGFmMTlmMWY0MDM1YWIxODE2MTJkMzcyZWRkMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tb3JkZXJlZC1ldmVudHMtY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwMzk0NGNhOTMzMjg3OWNlNjVmOWI0MDdkMDcxMWE2NGQ5NDNlMmY4MTEwMGRkZjA4N2E4NTUyNjBkN2U4YjNjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9tYW5hZ2VkLWNoaWxkLWNvbGxlY3Rpb24tbWVtYmVyc2hpcC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0OTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTc1ZWNhMzgyODg5MjlkNzM0MDE5MGU3MzEwYmI0NWY3MmVjMmVhMmJkNTU1Mzk3NmM0YWVjNzE2NWMzMWRmNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1nYW1lLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMzg2LAogICAgICAgICAgICAic2hhMjU2IjogImJmMWI3OTk4ZGQ5MDY0ZjMyZjA0ZDJiYTI4NWI1YWZkNDQ5NjQzYWJmNzdmM2UzNTYzYjYwZjQ3MmUzZTkxMjEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDMxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMmNlNDU1YzY0MzA5OGMyOGFmNGJhZjkzNTZhNGQxZDY4OTM4MDlhMmY4MzhjN2JiODI3MDQ0ODU2MTQzOTAwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uZXN0ZWQtZHluYW1pYy1jb2xsZWN0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTBmNTI3OWI5MzQxOTdmZGYyNjBiM2UwZDA4YjA2YjZkMjRhYmY4MDA0ZTAyYzNiMDljNmUzODE3YWUxMDQ5YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0FjdGl2YXRpb25Nb2RlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzljZTZmNzY2MmZjNDY3MWE0YWMxYTdhMThkODRkN2NiNzY5NmE2MzY4N2U1Y2VhZWNmZmQ2ZTY4YzhkODg5MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbkVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjQ1MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0NmVjMWRhZmEyZTRjNThlN2E4MzZmNDEyZjkxZGFkY2ZiNDliZTZhNTcyNzQwZjlhZmZiODVhODhhYTc3NTBiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRXJyb3JDb2RlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzcwLAogICAgICAgICAgICAic2hhMjU2IjogImM0NDliOTUxZDhlOTkzZGJmYWZiNTUxNGVkNWUxMzYxMTcyYzVkMDFhMWFhMjcwNmM4NGM5OTU2ZWUxOWMzZTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjc2NjAxMjI3OGY3MjkzODk3NjczOGEwMTU5YjQ0YzI3NjQ0MTMwNTJlODNlOTYxMzE0MTRlNzU3ZWY3YjM2ZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbk1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU5NjgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTMyN2ZmMjIzYWI1MzZmZmU4NDg5MjA4NDFlNDdlZjE2MDBiM2ZkNTY4YmE3ZmZkNTMyZDQ3MWNjNDZkNDQ4YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50RGlzcGF0Y2hPdXRjb21lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTBmZmJmMDkxMDMwNDk2MmY1YjE3M2E2ZTZhOWVjMzQ5Mzk0YjQ4MzAxNzY1ZDM3M2JlNWZjYzdiZjBmZmUyZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50SWQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjBmODU4NWI3NDY4MGNiNzZmNTZkNTUxZjgwNDZjN2FlZTM4Mjk2YjY1MDU4OWQyNjgxMzA4YmM3NWE5NWJkMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50UmV2aXNpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgyMDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDk4ZTY4N2YzNDc5OTRjMWIzOTZiNzZkOTBiNWU0OTdmNTVmMzBmZDc2NWZlNjBmZWZmNTIzNTNlMmRlZTBiZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50U25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZGY2ZGYxNWUyZDg3MzQ4ZWZiNjZmMTBjZjU1MjM5ZTc1YzM5NzYwZjlmYTE2ZTI4MDE4YThkMzUxZmFhNDBkYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0V4YWN0VmFsdWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5NTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDM2MDkxZGVjODVkZjI4OGU4ZDQ3YWE1NTk1NzA2MDczZDYxZjc2NTAwYjQ5OGJlZDUwYTEzY2Y4ZDUyZGFmZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL09wZXJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjcxNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjOGZhNjY4Zjk0ODcxNTk3N2Q5ZDI0YjRiZWVkYzdiODExNDQwNmQ5MmMxNTA1MmE3MmM1NGE4YjBkMzNkMTgwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvUHJvY2Vzc2luZ0RyYWluUmVjZWlwdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDkyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMjkxZjk5OGNhMmU0MDhiODJkYzMzMzkxOGYwMzI2M2E4YjI0ZDhkYmM0YWVjYjU3ZTJlOWQ3M2MwZDAzOWUxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvU2Vzc2lvblN0YXR1cy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc5LAogICAgICAgICAgICAic2hhMjU2IjogIjc1YzA2MWViZWFiMWNlMWQ0ODIwZTcxMTdkMjM5YzRkMDE5ZDkwYTdjYzYyNWVmZDk2NDUxZDg0ZGRlNDk1ZTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9UaW1lbGluZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc3LAogICAgICAgICAgICAic2hhMjU2IjogImY5MjAxMWJlYjI5OTljZTM2ZGI1NzMzZThmNmFmOWM4OThmYWJlNzgyZGE4ZTVkODE2NDBkN2E1NWI2ZmUxNWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9UaW1lbGluZUFwcGVuZFJlY2VpcHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc0MywKICAgICAgICAgICAgInNoYTI1NiI6ICI5YzAwMTE2MjllNTJkNTRhZTg1NzAwZTZiZjk3OTc4YTIxYjJhZDc0YjAxYjQwYjBlY2M2ZmE1NDgxNjY3NDQzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmVFbnRyeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzNTQxYTgzNDBkYzljN2Q1Njg0NjdiNzY4NTNhYmM0YTcwZmVhZGYxYzQzNzg0ZjZjNzZlY2E5NzkyMjBlYzEwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9CbHVlUnVudGltZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTYzNjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDZiYTJhMDQxMjRhMGM5ZjIyZTQ0MjExMGJkZDQ1N2E1NGVjZDdiZDg2MTdkYzdmZGYzNjlhMDk5YTE3ZTljYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ2F0Y2hVcEJhcnJpZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4ODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzI1ODZhZTcwOTVkYTcxMzY0NWZlYmE1YTQ0MTVmYzFmMWUwYjQ4ZjE2MTJiYmMwNWY0YTczM2Y1MDdlMjY5YSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ2hlY2twb2ludERvbWFpbkV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTk2LAogICAgICAgICAgICAic2hhMjU2IjogImFhYjNiMTJjZWVjMThlZjJhMjYzODhiYTZmZmJmZGZlOWE4MjBlMjVlNGE0ZGFjOTY3NGY2ODQxNGU0ZWY0OWYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NvbXBsZXRlbmVzc0V2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTkzLAogICAgICAgICAgICAic2hhMjU2IjogIjBjYThmN2RiYWEzMGFlMjIzYTliYWU2YTE0NzYzOTQxNzA3ZWY4NDFlZjRmMTliOTg4OWY0YmZlYjE0M2U1OWUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RlZmF1bHRDb29yZGluYXRpb25FbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMyMTE3LAogICAgICAgICAgICAic2hhMjU2IjogIjgxNjVjYjhmOGY5ZmJiYmNjMWZmN2JhMGRkMTBmOTYzZGI0YTQyZWZjOThkOTEzMTZiNGIxYmQ2MDQzNThhODEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50SWRlbnRpdHlSZWFkZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWNiZjlkZDQ3YjBiNzYzN2NlZjM3MDcyMWE3NjUzNmEwY2NlODRmYWYwNTUxZDU2Njc1NzcwMTNlZGNiYjg3NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRTZXNzaW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjkwMywKICAgICAgICAgICAgInNoYTI1NiI6ICJkOTY4NmE5NmI1OGNkYTU5ZDFiYjM2MTc4NTYwM2JhNzJlMjdiNGYyZmFmNjEwY2JkMzIxZWMzODMzYjQ5NjU4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFRyYW5zaXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2NTQwLAogICAgICAgICAgICAic2hhMjU2IjogIjk1YTgwZmUxN2RlOWJlZjhkZTVlOTAwYTZhYmFlZGM4MDlkZTBhYWVmN2U4MGUxNGI0ZDEwNjk1NjkxYzBlOWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkQm91bmRhcnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjZiMDM1NzQzNWQxZThlNGYxZjg2NjMzNTU4MWRlODBmZTc0ZGRjMWI3MjQyYmM5NmExMDBlOTdjYWUzOTlhMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRFcG9jaEN1cnNvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTc4LAogICAgICAgICAgICAic2hhMjU2IjogImJiNmQ1NWUzYWYyYTEzNmZiZTM4ZjhkOTc1NzRlYmIxNTM0MzZhOTRiMDQzNjc5NDU1ZGViOTkwNjg2MDEwNDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hJbnB1dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTk1MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YjI5OGM3N2VhMGU3NjJiMTExNzM1ZDQzYThmMDI4YThiZGQ4ZGU3OGM5NTVjM2RjOTlmOWU4YjBmMmJjYzRjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZExheW91dFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc4NjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzVhZTA1NWYwMjczMjJlMjA5M2VjYmJkOGM0ODVkMzkzOGUwNGVkNWQzYzQwNTI0Y2RmZDJiNTE0YWE0OTMzZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRPY2N1cnJlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjU3MTBhZWUwY2U5MjZhZGYwYTFiYTNkYjA3OTAyZTY3YTRjMWY5NDc3ZGIxM2QxMmFjYWYzZDY1YjZlMTZlNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRPbmx5TGF5b3V0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzQ0LAogICAgICAgICAgICAic2hhMjU2IjogImVkMDNlZTZmMWNhYzAxZjQyYzk0OGZmYTIxZWZlZDRjZjQzYjIwZmIwYjhiNTU0OWIyNjk0YmIwYjEyODlhNmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT25seUxheW91dEJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NjY0LAogICAgICAgICAgICAic2hhMjU2IjogImY0ZjZlM2E4ODUwMjkxNjAxMmI3NDg1YzRmMTA1NzM0ZWU0ZmNjYjBjMGJlMGYzMjJlZjVjYTNlYzczMjczN2UiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGluZ0JpbmRpbmcuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5ODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTkxMWY2ZGExZjExNGM3YTIxOWVmNDkyZTg0ZWQ1NjFhNTg2Y2E1OTQ3YzMzMjk5MzcxNGMzOWE2Yzg0YWMyZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW5naW5lTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzg2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNDcxNTQ4NDI2N2FiZmU5N2Y1OGRkMjNiOTI3ZWU1ODZlZWU2YmVkMTAzYWM1MjlkN2NjY2FiZmU0ZTk1Y2Q5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9IaXN0b3JpY2FsQXZhaWxhYmlsaXR5Q29udHJvbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjgzLAogICAgICAgICAgICAic2hhMjU2IjogIjdiYWNmMTBmMDZlZmNjZGZjZDY0ZTRhOTQ5MmUzNTdhMmU2YzM1ZTdhODk4ODE2ODg5YTkyMWM0MzBjM2MzZTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0hpc3RvcmljYWxTdGVwLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDIzLAogICAgICAgICAgICAic2hhMjU2IjogIjg5NDdmMTVhNjEyMTRmOTJmZDZmNDMwNjczOTk2MWE0NmI4NmM5YzA3YTAzOGFlN2RjYzU3ZDliM2RkNTE0N2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0luTWVtb3J5RG9jdW1lbnRTdG9yZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTYzNiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMjI4NjQwYWY3MjkzODM5NTdlNWJmYzVhZjhlMzgzNjVjNTkxMTczODRhMWJmMjM2NzU1Yjg2YzdiZjQ3M2FhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Jbk1lbW9yeVRpbWVsaW5lSm91cm5hbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTUzMTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjE4ODhmMTZkNTM5MzRkNzk1MGExNmMyN2I5NDUyNzA0MGVlZmUyYzdiMzQyZDNjNjQ1MjAxZGY1YzQ1MmZiMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW50ZXJuYWxQcm9jZXNzT3V0Y29tZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODYyLAogICAgICAgICAgICAic2hhMjU2IjogIjU4M2RhNDI4ZGNlZjFlODc5NjM3YTQwYjFkNWNlYjFiM2EwMDBkM2MwNTk1NWExOWFkYjQ0Yzk5ZjYxMzUwN2EiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL09wZXJhdGlvblJvdXRlSW5kZXguamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNDQ2LAogICAgICAgICAgICAic2hhMjU2IjogIjYwYjI0MDM1ZjI2MGI4NzY2MmI0MWQ3NDcyNWQ2ZGU4MzY4OGI1YjkzYTJkNWI5ZTdiODQ5ZmJhY2QzYWUxYmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1Byb2Nlc3NFbWJlZGRlZEdyYXBoU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNTEwLAogICAgICAgICAgICAic2hhMjU2IjogImVhOWQ4OGI5MjUwOThlOWZjZTc2ZTIwY2FlYmI5YjkwYzdjZjI5ZTAzMmIwYjUyNGZmNjhhY2MwZjA0Mjk1ZTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1JvdXRpbmdTdXJmYWNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjc3NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTAwZGRkNjY5MTk2ZWJmMjAzNjI2NDg2MWRmODNkNTJmZjc4MTRmNzdlOGZhYmNmZDQ5NjIyYTA2NzhlMGY0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9TZXF1ZW50aWFsRHJhaW5Db29yZGluYXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTEwMjY0LAogICAgICAgICAgICAic2hhMjU2IjogIjI1NjA4ZWIyNTNkYjY5MmJiOGMzN2VjYWM2ZWFkZGZlMTZmN2VmYWRjZTMzZDBlMWM3OTJhZjI4ZmI3YzU0NTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1NvdXJjZVN1cmZhY2VJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODM4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICIxYTIzYjMwNTQ1NWZiZTIzODFmM2Y5OGVmZjA0OTRlZDRiYTBiMGZlNWFjYzUwM2YxY2I1OWFhZDVhNzRiYWU1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9XaG9sZU9iamVjdFN0b3JlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTVkYWMyZWJhMWZhZmRiYjA3MWVjMTdkNzI5YWUzMjc0MTgwZDdlNDJjMjAxZDRlMGFkYjExMTgwMzM0NDVkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9XaG9sZVJlcXVlc3RFbnRyeUZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExOTUxLAogICAgICAgICAgICAic2hhMjU2IjogIjUwODEyYTYyMzg1NTVmOTYyYjJlNDlkMzA2N2M2MGMwZTE2MWJmYjBhMzgxNGNlZGRhODgzOTlhYzlkYjQzMTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9BbGxUaW1lbGluZXNDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MjU2LAogICAgICAgICAgICAic2hhMjU2IjogIjMwMzY4OGMyZDI1NDI5ZTllYTI2ZTI5ZDA0MmNjY2Y1MWE2MmVhMzQwMmM5MWIzZmUyZWRiMjYzYmVmNjE3M2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9BbGxUaW1lbGluZXNFeHRlcm5hbFN1YnNjcmlwdGlvbkZ1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODU3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5M2RlMjc4ZWI3NmVmYmFkYTMyNjczOWUzMzA2MmYzZGUyZWJkMTdkZTJkYjQ5YjU0ZjhiZDJmMzhhN2IzM2JmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFByb2Nlc3NpbmdNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MzUyOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxN2JjZDczZWRkN2M0ZjcyYzA4OWYzY2IyN2IyYTJhOWRhNWRjYmY5NzY3MDI2NTM3YTIzYTI3ZDg0NWFjNjhjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFdvcmtmbG93Q29udGV4dEZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwMzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODI5MTZiMTg3NDliM2ZkZjMyYTU3OWZmOTdjMDI0N2Y1MjhmNzZhYjg5MGY2ODZmMTZlYTY0ODU5MjJkNzZhYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhXb3JrZmxvd1N0ZXBDb250ZXh0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIzLAogICAgICAgICAgICAic2hhMjU2IjogImQ1M2IwMDdkMTg0YjRlOGNiNWNkYzYxZTMxOGYwNzJlODM1NWI2MDE2YjQxNzg3MWMxOGE0NmJkMTUyOGVhNzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNzQ4NDIzYzRiYWMxODU0OTg1NjA5MzdkN2I5ZmFkYTM5MTNjN2ZhOTRmZTdlNzliMTE5MGRhY2JiMDA1MmZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Njb3BlZFByb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHRCZXhEb2N1bWVudFZpZXcuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MjU2LAogICAgICAgICAgICAic2hhMjU2IjogIjUzZDdmZTcwNTk4YjNjOWIxMjE0ZWM5NWI3MmIwNTlkZWM4NDZiOWMwOWI0NTkzMjQwMTYzOWZkODEyNTY5ZDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9CbHVlU2VtYW50aWNJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTQyMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZjc3Njk1N2U2YTc4YmYxMmVhZjYwZTE2N2JiYTNiZWI3NTE1MWI2ODQ1YjZkOTg5OTJjNTk4YmE2MTk0OTc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ2hhdFdvcmtmbG93T3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzg5LAogICAgICAgICAgICAic2hhMjU2IjogIjFlOGI2MGUxMDVjNDgxMTJmNDUzMzVhMzM3NzRjODcwMzEwMDQxZjMxNzI1MjM2YjJmZjdhNjU5NDM5NjM2OWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db21wb3NpdGVUaW1lbGluZUNoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4MzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGNiNjA4Y2Y2ZjdhN2YxZjc0MjcwYWNjNzA3MzJlYWU4M2Y0MWFhZGU3Y2NmZWU2NjEzZDk4ZTViYzI2MDYwOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0NvbXBvc2l0ZVRpbWVsaW5lRXh0ZXJuYWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgyNzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiM2VjYjBhYjFkM2VmOWU3ZGE4MmZhYzFmNmQ5ZDg3M2UyYTk2YjcyZTBmOTYyMjU0ZTFiZjIyZGFkNDY2ZGIzNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkJleEludHJpbnNpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNDUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmYzMzA0MTQ1MGIyYjRjZTQwYjRmZGIyZGNkMWMxY2Q5YTZmYmFjMmU2MDI1ZmI5OGY4N2FkZWY1MTcyYmM3ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkN1cnJlbnRSZXBvc2l0b3J5SWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjE5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NTI5OGNhMmI5OWM3Y2Q0NThlMGE5NjlmYjRmMmFlMzBiNDNlNDA5NGFkYmNjY2Q5NzhlY2UxOGFlYWI2ZTU5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uRXZlbnROb2Rlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzczMDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWVmZjE1NjdjZWY2ZDExYmFiYTE2ZmRkYzU4ZjBhODBkN2YxMzJiNWVmMjAyMjEzMTRlMjdlYzMzNTAyOGZjNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NIZWFkZXJCcmlkZ2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjk3YmNmYWE3OTZiOTFlODI0MGJjNDAwZTRjMmZjNzg1ODQxMWUwM2M4OThkZmQwNTljNTVlNzlkN2JjYThiZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3Nvck9wdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NDIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2ZmZTI1NTc2NTBhZDk4MTdmMjQ3MTE0YmU4MTBjOTRkNTdhNDhmN2Y5YzBmODA3ZGVkYzk0NjQ5ZWU0ZjNmYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NvcnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0ODIyLAogICAgICAgICAgICAic2hhMjU2IjogImQ1NDc5YmUyOWU5MDk0MjYzMjc0OGY1NjYyMzliOWEwMjY5M2FmNzc4ODdlMTFmMjdkNzZiZDNkYjljZmEzZDIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lR2FzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTY3LAogICAgICAgICAgICAic2hhMjU2IjogImI0N2I4NDk3MjNkMWZkNDY1OWRjMzdlNWE5NmZlYzJhODBhMjlhZTc2MDM3ZWZmNTg0ZjBlZDIyMDJlZGJjNzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lTGltaXRzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjQ5LAogICAgICAgICAgICAic2hhMjU2IjogImM1YjU3YmY2ODYzOTkzODc1OTE1OTE2YzYzODBkZTJiZDBlODA3NTViMzliNDkwMGY1YmUyNGU5MWU4OGYyYWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lUmVnaXN0cmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDRlMzRkODBjM2U5ZGE3M2RkMGIzNGEzYzRiNTRiOTgzYjc4M2QwYzQ5ODVhN2YxMDVjM2VlMTVhOTFkOTdjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uU2VtYW50aWNUeXBlSWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkyNywKICAgICAgICAgICAgInNoYTI1NiI6ICJiNWQ2MmE3ZmZmM2M1NzhjZGUzNjFhNzA3OTA2M2M0YjNjYzlhMjBmNTQ3MDRkNDRhOWQ4NzY1YjA3MmQ2NWQ5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ3VycmVudFJlcG9zaXRvcnlNYXJrZXJQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkwNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZGNhNDU5ZjkxYTliNGM1MTk0ZmRhMzQwNjE3ZDgyZWIyMTI5OTQwNjk4MDEyMmJjNGI3NDVjZGIzNjc5YWQzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvSGFuZGxlckNoYW5uZWxSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjAxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiM2E5ZDgzODIxNjBhZTU0YWIyMTZmZWNlYTI0ZDQ5MzY1ODFiYmU0MmE3OTY4NDU2Mjg3OTNmYjk2NjhiNWNkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjkwLAogICAgICAgICAgICAic2hhMjU2IjogImE3NmEzMWM5Y2E0NDVjOGJhM2ZkN2EyZGZkMzk2YWU4NjcyMzBmMDkxMmZkYTFlZjhjZWFmOGNkMzU5NjMyMDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25SZXF1ZXN0TWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MDYwNWMxYjY3MDBlM2JkZmNkNjA3YzIwNjViOWRiZTIxMWJiNzJiZjNkZTMwNzRlYTQ2MzRhZmQ0YmViYzg3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUmVxdWVzdFJvdXRpbmdGdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDU2M2M2MzZkZTMzOTc5Njk3M2U3NGRkYTZhMTcyNzJmNTM4ZWNlYzEyNWRhMGIzZjdkZjA1ZGYzMjc1NmExMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd0V2ZW50TWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyMzIyYzJmZGQyYmM4MGI4NTliMjY3Y2FlMTEzOWEwM2UwZWRmMmMwYzMyZDI4YjczODRkZjBhOGY4NmZhNjQ2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93T3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzgzLAogICAgICAgICAgICAic2hhMjU2IjogIjUwMWY1ZThiYzdhODRmNDA3MDZjZTQ4OTUyY2NiNmM5NWIwNTdhZWVkOWM4MTYzNDUwNWIyN2NlN2I0YzZmNmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9TZXF1ZW50aWFsV29ya2Zsb3dQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3MDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTFjOTczNzliNzJkNDcwODExZDIwMWVlMTM4Y2ExYjZmNTQxNjU3M2E3ZTgzNmQ2ODcyODNmNTIxZWYzNWEyZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3N1cHBvcnQvQ29vcmRpbmF0aW9uQmV4SW50cmluc2ljc1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1MTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWIyOGE1ZWQ0YThhOTBlNjQyZWJmNjM1YzM4NDkxMmIwNDQ5NjRmNWYzMjhjYTMyMTM2NWM2MjRmMmUxZjAwNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3N1cHBvcnQvQ29vcmRpbmF0aW9uUHJvY2Vzc0hlYWRlclN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc1NjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjU3YWQ3YWFjNjQ5ZDkzMmUxNDkxNmI4MGMwNWU3ZjE3OWFlOGY5YzJjMjcxZWRkYWU4YzQ3YzcxMzBlYjZhMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3N1cHBvcnQvQ29vcmRpbmF0aW9uUnVudGltZUdhc1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3NTM1LAogICAgICAgICAgICAic2hhMjU2IjogIjI3YTI4N2YxZDU5NmMzZWM5MDAyMmQyODRmMzRkMWJmMGJlNTQ0NzI1ODEwMTczMjBkNzE0MWEzZmJkMDcxYzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblJ1bnRpbWVMaW1pdHNTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmQzNzlmOTZjNWQ4MGU5M2ViNThiM2YxNGQ0OTVlMjE0ZGM2MDJjM2ZlZTViMjU3NmUxMjFiMDI4YjBlY2E4ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ2NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4YTE2NjFjZjM1N2FkNTg1ODA0YjMzMWQxYTE5NTRhMWFiNzk5ZDU3NmQ3YjBmODgzNGQzYTk4Y2RiZjY0MmJlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGFubmVsU3VidHlwZVByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYTZkZjU1ZDRkZjNlYTc1MDAzODU0MGQ1ZTRkYTUzMzE3NzQ5YTJmYTQ0YTU5ODA3Nzk3MGU5MzE1MzVmNDU0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVFeHRlcm5hbFN1YnNjcmlwdGlvbkZ1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTY5MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZmYyOTFiMGQ1Mjc5OWU2MDdmNjM4MmEzNGMyZjUxOTliOTg2NWZhMWI1NjJkYmNiNzUwY2UyZWMxNTYxYjBjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVNZW1iZXJTdWJzY3JpcHRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NDE1LAogICAgICAgICAgICAic2hhMjU2IjogImJjM2I0ZWM2MzczNTA1ZGE4YTZiZTMyMDI3NGM4NWJjNzNkYmQ5ODQzZjYwYmM1Y2Q2ZTgwNzgwZGI5NTg0YmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVByb3ZpZGVyU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ4NjAyNThlNDc1NTk3OTczMDNhNDY0YmRjNjRkNGMzYmZkNTQ1M2JhYzhhNDJiZTNlYzRmYjdiMjM4MDFiYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lU3Vic2NyaXB0aW9uUHJvamVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjAyODQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWI4OTM4MmZhMjYyNGRlYWFlYjM4NTE4ZGFiMDM0Yjk1ODQwYmFhOTI0OWJhNTM0NTJjMjgwMzkwMzRjNmRlNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVEZWZpbml0aW9uUmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcwMzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiM2NmNzU3OTFmNDUzOTZjNDg4MTc5YTcxMTVjYTAyNjQ4ZTJkYWIyZTcxZGUxN2FjYThlZmE2YmRkNmRmZGZjOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVFZmZlY3RQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzg2LAogICAgICAgICAgICAic2hhMjU2IjogIjkxYTUzMDQ0NDY0OTQyOGNmNTlkMTAyMTk0YTViYTRmZWQxZWQzN2M2MDkwYTQwODQyMjQ1M2EwODI0NTRjMWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUHJvZ3JhbU5vcm1hbGl6ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyODU1LAogICAgICAgICAgICAic2hhMjU2IjogIjVkMmE0MjY1MmVhOGQwNGJhNGUyOTYwMGI3YWJlYjY4M2RkZWI1ZjA0Zjg1ZGUyZjg5NjVmMDQwYjZhMzg1YTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUHJvZ3JhbVBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk0NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzQxMTk0M2M3MzI1MGE1NWYyZTE4ODcwYmViOWI5Y2I4YWEzOTY2ZjQzYWRhNGQ2MzkxOWI5YjlhNzNiMzlkOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtUGxhbkNhY2hlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDgwLAogICAgICAgICAgICAic2hhMjU2IjogImVjMzRlZjc2YjcxNTY0M2U2MWVjN2M2ZDE4MzliYjA4MTllYTgxOTI2YzY1MDU0Njc5YzNlMDIzMDg4YmY3YWMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUmVzdWx0RW1pdHRlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAzNTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzg2OTY5YThiYjhlOGFkNmRiNjBmNmM1NDIwMGU0ZjgxNTQ1MDc1ODVlOTkzODBlNTkyNjVhNWM4YzUzYzczMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVSZXN1bHRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTBiOWQ5OWNkMGY4ZjIyNzAwMzE2NzdhYjU1ODMxZWU0ZjdiNWFmZjJhNGY1NjNiZjM1MDVjMzhjNzJmZTMxMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NTA4LAogICAgICAgICAgICAic2hhMjU2IjogImUyZGNmNjM5ZWZlZTY1MmUyYmFhZGQ1NDMyNjgwOWE5Mzc3ZTRlYjQ0NjI3NmRlYjlhYzExZmRlOTQ1YWViZjgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Gcm96ZW5Ob2RlVXRpbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzY1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJiMmJiODMzNmI1NTk0NjcwMTAxNGY0M2Q1MGM3NGNmZDE1YjY1MTM4OWY2YTZmYmIyYzI2ODczMzNiN2M3YTc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvTm9kZVV0aWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3MzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDU3ZDE4Y2FjMWViYzk1MzU2MmNiNzJlNjdlNmFjNTkyMjRmMDQ0ZDkxYjAzOTU1NTU4ZjBkNGQ3MjI1ODM1NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1NlcXVlbnRpYWxXb3JrZmxvd1BsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjFmYmE5NmY0YmRlMWZjZGM3MjMyOWE2NTI5ODk1MjcwYzRiMzM2MGVlNGI2NzZkMWI3ZDdhM2VmOWU5MTI4ZGQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dQbGFuQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGZiYjk5ZDJiMjk1MDQ3ZjU1YTU5MWRlZWQ5ZmQ4MjBiODU3OTk0MTZkYzgyMzU5M2Y5MWI2ODAzOTNiNTdiOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1NlcXVlbnRpYWxXb3JrZmxvd1J1bm5lci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAxMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODg4MjA1YzJmYjhkMGZiOWQyOTQ1YzhkODE4NWFiYmVjY2ZiZDU3N2I0YTBkOGUyZGMwMjE4NzY2OWZmYWQxMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1N0YXRpY1VwZGF0ZVBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk4NTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTczOWRkNGU1ZDZlZjQ2NjE3OTQyNDJhZmM2ZTIyOTE3MDhkYzBhNjFjYjE0NjMwYTE2NDI3NTBlNzgyOWFlNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1N0ZXBFeGVjdXRpb25Db250ZXh0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzg0NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwNmRmNDk5ZTA5MGI3YzA3NThkM2E4MDJjODVhZTIxZmFkZTRlZjJhZGQ5ZjkxYjhmMGRmMzRhMzdmMDRjNThkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvVGVybWluYXRlUHJvY2Vzc2luZ1N0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjM4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3YzY1MjVkZGU1NWJjNTgxOGI3NzI1NTU1MzdiODA1ZGQ1ZTNmYTg0NzdiNGFmYWEwMTE1M2ZmMjg0OGUxZjJjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvVHJpZ2dlckV2ZW50U3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MDA5LAogICAgICAgICAgICAic2hhMjU2IjogImM0ZjA3YWIwYzBiYTJmMzllN2E4YzZmNDVlMzg2NjQ2NjcxZGZhODZhYjhlMjQwNWY4MWVkNGZiYzEwNDhiOTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9VcGRhdGVEb2N1bWVudFN0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI3MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTdiNWEyMjRkYjI4ZjIxOGNiMzQ1MzdjMjcxMzYxZDBmYmM3MDE0MjliN2YwNzYxZjE2MzMwZDMwMDRmNjE5NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93QmV4R2FzTGVkZ2VySG9zdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQyMDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWJlZTY0MDVmOGQ5YjZhMDM5NDM2NjBmZmQwNjQ3Njk0ZTI0MmY5MDg2YWNmNGFiM2M4ZDE2YjAzMTkwN2I1YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93RXhlY3V0aW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcxMDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmI3YzMwMzg3ZTJlMTAzNTU5ZDAxMGFkZmFlODA1ODU0MTc4OTlmZjYyNDdmZGM1ZTBmYzZiNGY5MjZhMWFjYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93UGF0Y2hFbnRyeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTIyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0OWZhZTBiMzJkMjIwOTNiYzIzZTUzYWQwYjM3OTFjOTEzMGRiN2YzNzE3NTBiN2E3NzJiZWU4Zjk4ZGFhMTNiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzMywKICAgICAgICAgICAgInNoYTI1NiI6ICIwOTk1ZjU0YTFiODU2OTY5OGNlYzcyNjg0MGIwZmViOTMwNzA0YmU0Njk5ODZjMDY5NzZjMzU4N2UwMjIxM2I5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dTdGVwUmVzdWx0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM3LAogICAgICAgICAgICAic2hhMjU2IjogIjEwZTI5YmRmNmY5MDQ1NWE2Y2VlNWUwYzNkM2E2MmNhMGY1MmRiMjhkNDJlYWEwYjllMzJhMDNhZjM4ZWQ1MGQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1N0ZXBUeXBlUHJvZmlsZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjI4MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZjE3ODU2NjdiMDA4YWQwNDY5OTI1MGU1MGNhODJjNzQ0ZWMzZWFkOWQ0Y2UzMTUyYjI2ZmQzMTFkOWM1NDIwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9jb29yZGluYXRpb24tZ2FzLTEuMC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjM1MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5ZmNkYzIyNTYzMTUyY2RkOGNiMzdmOWVhNzM5NDc3Y2VkNWY3YTllMzA4OGFlY2FmMjQ2ODEyYzNhM2M2YmFiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRDb2xsZWN0aW9uQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU2NzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWFmY2FlYmNjMmE4YTg0YjM4MGM2NWQxYjlhZDNhNGE5ZWNmNzMzYjYxNjQ0MThmMWZiOWU3NTI3MTI3MTRmYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9MYXJnZUhvc3RQYXlOb3RlU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MDI1LAogICAgICAgICAgICAic2hhMjU2IjogImU4ZTBjNjlmNTBkMTYyZGE0NmIxYzk2MTkzZmJjZjBmY2Y4ZDY5MjgyY2Y4M2RjNzgyMjViNzU1MDc1YzRkZjEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmJhSG9zdExpZmVjeWNsZUNvbnZlcmdlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA3MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmM4ZDRmNmNkYjVkZDVjMGQ4M2IwNGIxZDgyYmNhYjM0Nzg2Nzc1YWE0NjQ1OGRmNWUxZGZlYjQyMGMxNzc2ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OYmFTaGFyZWRHYW1lTGlmZWN5Y2xlQWNyb3NzSG9zdHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDU4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMTJhNTEzOWJiOTdiNGNkYTczOGM0ZTRlM2YzOTU5NjE3Mjc2OTQ5ZGRmYmQzYzk2NzMzODkwODFkODQzMmE5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZER5bmFtaWNQcm9jZXNzRW1iZWRkZWRBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTIzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YmUyOTcxNWNkYmMyNmM2MjljM2RkYTMzODM0MDViZTBmY2I0Y2NmYTkwN2Q3ZWQyMzQwOTVlNTAzMGY4NTRjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTAxTmJhRmxhZ3NoaXBTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzY4LAogICAgICAgICAgICAic2hhMjU2IjogIjc3NTNmYWU0MmRkMzgyZDIxNTU2MDU3MTEzYmJhNThiYTc2MmZlNWQyNGNkMzMxMDY0MDQ0YjE1ODliMzk2ODEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzIwMywKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjBjYWE5NDU4MjU0YjFlYjRhZGEyYmU2NWFjYmFkYzBhYjdlYTI3NjJjNjRhMTI4ODgzMjRiN2MyNWNmM2NlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rob3VzYW5kRG9jdW1lbnRMb2NhbGl0eVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjUzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MjUxOWZiNjkxMDhkYTMxOWE4YWRhY2E5MTUyNTdiY2U2NGJjMDVkYjk0YTk3MDQ2ZTNhNDJmNDg5NzAzNDNmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1dhZG93aWNlUGF5Tm90ZUFjY2VwdGFuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTY3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYTZiOGVlNTNjNmMzMjhjNTlkYzAwOTJmMzc2YmE1ZDE2NjYyZGQ4YTQyMDhhOGI5NDE1ZGQ3YTRiZGEyYTI5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRW5naW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTYyMywKICAgICAgICAgICAgInNoYTI1NiI6ICIxNDcxYjQ1MTJlOTkwMWVjNjI0MzAzMTAzMTUyYmY4ZmY5MGMzMGE2ODhjOGYxYjRjNTZhZTM3MjU3ZTNlMmY3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnRSZXZpc2lvbkluaXRpYWxpemF0aW9uQ2F1c2FsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDc1NywKICAgICAgICAgICAgInNoYTI1NiI6ICI4YjkyZDM5ZjIzM2Y2NzVkNGExNDMwMzlhNGVmYjEzYTkzNTNiYmVlOTg4NDUwMjA2ZjIxMDZmYzhjYWYxN2YyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvUHVibGljVmFsdWVDb250cmFjdFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgyNjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWFiY2I4NWJkN2UwNmIyYmE5ZTMzMzk4ODJmYjZiZGIwNDgyYTkwOGQ3NDI1YmVhMzJlODRlMzY3ZTM3MjQwZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ2F0Y2hVcEJhcnJpZXJUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODUzLAogICAgICAgICAgICAic2hhMjU2IjogImU0MTAzMDUxOThkMzk1YTUxZGEwYzQxNmRkOTg4YzBmOGNlN2M3ODEwMDBhYTMwM2Y5Mzk4MTZiZGQxZTRiMmYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50QWRtaXNzaW9uQ2F1c2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzA0LAogICAgICAgICAgICAic2hhMjU2IjogIjQ3ZGIyZDNmY2Y1MDFjODMxZWZiNDkwYjAxZTYxYTNjNzYxMzc1YzYwYmJlNTI4YWQ4ZDhjNzY3MmFjM2Q2ZmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50U2Vzc2lvblN0YXRlRXBvY2hzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODQ3NywKICAgICAgICAgICAgInNoYTI1NiI6ICJiODZjNjk0MGZmYjQ2NjU5YjA2NzgzMjJhZDlmY2UyMTlkNWJlODJlMzk1YTg2ZmU0ZDhmODFhYWNhZThlZjU3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFRyYW5zaXRpb25Qcm9jZXNzb3JTdWJzY3JpcHRpb25EZWx0YVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgxMzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGY4MGZlZGM2ZDFiN2JjZGFjNjg2MThkY2U0NWM5MDA1MWMxZTBmYWViNmRlYzFlMjA0MGVhM2FiYTk2YmU4OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRFcG9jaElucHV0RXZlbnRFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1MjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWUzOTQwYjc5OTZmZDk5ZDFjYjAxM2IyYzA3MGM3YzUwZDZjMzE3NzAwZTVhMTA2YWU5NWQxZDgzOGE2OTIxYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRFcG9jaElucHV0SW5pdGlhbGl6YXRpb25DYXVzYWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMjYxLAogICAgICAgICAgICAic2hhMjU2IjogImM5MGFiZTM2OTg5NDgzMDc5ZDdlOTc0ZDQzMDE3OWM4YjMzYTlhNWQ1OWEyZmYwZTEwMDA2MGY0MzBkYjc0YTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGluZ0JpbmRpbmdDYW5vbmljYWxPcmRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyNDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDgxOWM2Nzg3OTNmZjc4Njk2NmM0OGQ3ODYwY2EyYmIxN2U5ZWExNzFiMzAwMGQ4OWM2YTVlMGFiZjU4NThjOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW5naW5lTWV0cmljc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc2MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDUwMzU2ZGY0NjI5NTBlYTFiZGE5NGJjZGVmOGVkZGZlZDE5MzY4MGYyMzBiZTA4NTIwM2E2MDRiMTRjNDliMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW5NZW1vcnlUaW1lbGluZUpvdXJuYWxIaXN0b3JpY2FsU3RlcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNjQxLAogICAgICAgICAgICAic2hhMjU2IjogIjJmZjkwNjdkZDMzOTljOTkzNmVmNDlkZTliMzIzZGJkNjVkZmIzMmNiMjA4YzY1Y2IyNGQxMTcwNjQ5MDQxYTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL09wZXJhdGlvblJvdXRlSW5kZXhUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDg4MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNDQ0OWIzNWJkMTU1NzFmYjhkNGFjMjViZDQ1OGFmYWEyMzFhNjNhZGQwNDhiN2FhMDQ5Yjk4ODVjNTgyNDRkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Qcm9jZXNzRW1iZWRkZWRHcmFwaFNuYXBzaG90VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjQ1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJhMGFkN2I2Nzg4YzNkMWQ3NDA2ZDk3YzZkZWEwOWFhNmRiMWI1MTJjMDQ2MWVlNDg1NGFiNmU2ZDYzMTJjNzAxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Tb3VyY2VTdXJmYWNlSWRlbnRpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODgwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOGJkYWE1OTI4NWI4MTQxMDQ2NTM3ZGM5ODY5MGQxOTgxYmExNjFlYTgwY2VmYWM2ZDk2MmRhOGM4MzkzYmZhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9XaG9sZU9iamVjdFN0b3JlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTAwNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYjZjYjM1OTlhMjliZmFjZTNjYzdiNjA3ZTA5ZDlhNGU5YTQ4YTEzY2IyMjRiZTBiZWMyZmJmOTQ1NzJjNDQ4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFByb2Nlc3NpbmdNZXRyaWNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgzNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDI0ODA4MjFhZjM5MTMwMzU1NWZhN2ZmNzFkMjViZTBlYWE3N2U1NWNhZjgzY2UyZjNlNzBlY2E1ODg3YjY1MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9Qcm9jZXNzaW5nRXZlbnRJZGVudGl0eUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTU0LAogICAgICAgICAgICAic2hhMjU2IjogIjZmMzFkOGI5MGUzYjY4NGUxMzczZGY1ZDQxMDIwYTYyZDk3NzEyYTVhZWZjNWExMGQ2MDAyYjhiNGY5YjNjMzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5NTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjcyMDZlYmQ3NWI3MjYzYTM1NmYxYmFkMzRiNzNjYmNkZjI3ZTA2MzRiMWQzNWU0NmMwZDc5MDczZWU0NzVkMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9TY29wZWRQcm9jZXNzb3JFeGVjdXRpb25Db250ZXh0QmV4RG9jdW1lbnRWaWV3VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ0ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDdhMTY0NzhhM2U3OTVmODE3Y2ViZmNkOGNmOTVlNTJkOGVkNjEyYWY4MWVkMDU0M2FkYzk5YzQ4MGNhZGFiYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NvcnNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDc2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMDk1NjJhMjFlZjExNzAyMmM4YTU3YzEyYjQ0OGRkOTc2MGFhMmM5YmIwMWYwMjdmNWM2Y2E4ZGIyM2Q0OGY2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZVJlZ2lzdHJhdGlvbnNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNjI3LAogICAgICAgICAgICAic2hhMjU2IjogIjI2MmFkNDk3NTlkNDI1MjM0NDM1YTJlOWYwNzQ3YWNiYTYyNWI1ZGZiNGM3NmZkZDgxMTQxNGM4OWNiNDMxODYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25UZXN0UnVudGltZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc4OTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGJmNGZlN2YxNWJjNjdkYTkzZjY3MTkyMTNiMmY3NGExNmFhMjgxMTQyZDIxMDQzM2UxMDM5M2U5ZjQ1YzBmYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0N1cnJlbnRSZXBvc2l0b3J5RXhhY3ROb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY1NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWY4OTczMjBkOWI1N2M2YjU5OTA5MDcwMmQ3ZTQ2Nzk0NjI2ZjExYTQwZDUxMTI1ZjJkMzcyOGRjYTIyYjllOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlbGVjdGVkV29ya2Zsb3dCb2R5TG9jYWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDEyLAogICAgICAgICAgICAic2hhMjU2IjogImIwYTM0OTc3NGJlNDk2NTAxY2QzZjZhNGVkYmEyNDA1YTRhMWYxMjlhMTFhMzk3ZWFjYjQzYzJlYjAzMzQxYjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZUNoZWNrcG9pbnRTdWJqZWN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTcxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMWI0MjcyMzc3MmZhMTI0NmI3MDNhNWIwOWM4ODIwMzQxMjFkY2I2ZDA4ZjUzMDBlZTQ5MDJkMThlNWM4ZTM2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVQcm92aWRlclN1cHBvcnRGaW5hbFNlbWFudGljc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NDExLAogICAgICAgICAgICAic2hhMjU2IjogIjhlNTA3Yzk2NDQ4MzA4N2Y5NmZhM2NhNDUyMjllZjk0N2ZmYjZhNWMxNmQ5MDgxNDE5MWVlNTRhMWE0MDBmYzgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVN1YnNjcmlwdGlvblByb2plY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzE1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYzU0Njg2MmYzNDY2ZDU3ODQxNzQxMWVlZDM4NmU3YzQ3NGY3MGVmYmRjODE5MDczYjNkYTgzZTY1ZGZiYzFjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZUVmZmVjdFBsYW5UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzk5MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OWNiYWFhMTZjNTBlOGJjZGIyOGZlOWFkNjBhZDA5NmExMGI5NmI1OWY2ZDYzMDBhNDY3NDhjMzI4ZTQxNjI1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1QbGFuQ2FjaGVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODQyMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmIwYTdkM2ZkN2EyNDM3NzdkYmQ3MWExOGIzNTI2YWM4MDI1MGE1NjVmMzllNWJlZmQ4ZTIwODc5NjUzZTc2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvTm9kZVV0aWxUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTU4LAogICAgICAgICAgICAic2hhMjU2IjogImU1M2NhNjU0MTQ5YWJhZjQ2ZjBhYTE5YTliMTBmN2Y2MWVkZTdlZjg4YTUwM2U1MDcxMmFjNTQ5YWNhMDY3M2EiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dQbGFuQ2FjaGVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjUyNCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OGY1MjI0NDhlNDdiZWI1NjkyODJhMDM2MmEwYjEzOTgwODE4ZjRiYTYxMjYxZDEzYWQ4NTk1MzU4MTE1Nzc4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU3RhdGljVXBkYXRlUGxhblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMzAyLAogICAgICAgICAgICAic2hhMjU2IjogImZjODdlMzJiYjFiOGQ0YTdmZWIwZGM5MmY5NjdjOTNlZWZjODIwZTkxNzE3YjFiZGNjNzY5NmU5YmMyZTkzZGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0JleEdhc0xlZGdlckhvc3RUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDEwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNDRiYzVjZjJjMWE3Y2JlZmQxMjcxMjUwODg0MmRjMWE2MjczZjgwYTI4NjkyMDM3ZjJjMmVlYzYzYzgyNGQ2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dFeGVjdXRpb25TdGF0ZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MjgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmRkM2Q2ZDVjYTY3ZTlmOGJlNDQxNTc3YTU3NjcwM2UwNDQxYjdlYzQ4NDU0MzJmOWEyMzQxZjcyZDZmZTRlMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93UGF0Y2hFbnRyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTIxYzdlMjkzNDRiMmEzNmMzOGY3OTFhZjQwMzVkOTZhMzIwNzBkZDU5YmQxZmNlZjZiYjBmNjBlYmQ5NjczNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUnVudGltZVdvcmtTZXNzaW9uVGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZGRlMzMwMjM3NmVlZDBlODcyZDMxZjdmOTIwNDBiNzlmNTNmYWIyOTJkMzA1MGY3NjgxMWRiZDdmZDc0NWYzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3RGaXh0dXJlcy9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0Nvb3JkaW5hdGlvblRlc3RDb250cm9sLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDE4LAogICAgICAgICAgICAic2hhMjU2IjogIjQxMzVkN2U2MzM1MDkxMjQyYWJhNDRlNjI0ZmVmZWIxYmQwN2VhMGZkOTAyMzExMWU2MDJlMzQ5Yjc5MGRiYTgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJTVEFSVC1IRVJFLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICJkNzRkNzI5Y2RiNTJmOTIxODZjNDk2NGQwYWFmYjY4YTM3NmZjZTIxNGQyNTU0YWIyODY5NzFhODJkODZlMDBhIgogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInNoYTI1NiI6ICI0M2E4MTRlMjY3ODBjY2Y4NzBkZWEyNjllYTExODdiMDM3MmNhOGNlMTgzZmQ1ZDA5ZTU3Y2Q2MzljZmNkYmU1IgogICAgICB9LAogICAgICAicHJvamVjdE1hbmlmZXN0IjogewogICAgICAgICJhbGdvcml0aG0iOiAiU0hBLTI1NiIsCiAgICAgICAgImluY2x1ZGVNb2RlIjogZmFsc2UsCiAgICAgICAgImZpbGVzIjogMjkzLAogICAgICAgICJlbnRyaWVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICIuY3oudG9tbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk5LAogICAgICAgICAgICAic2hhMjU2IjogIjJhNGRjNTQ2NDc2MGJhNDI5ZTk5MDEyOTk4YmUyMDY4Mzg0YWVmYmQxZDkyNjU3MWY0NWU5ZjI0YzFkY2E0MTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJDSEFOR0VMT0cubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjY3LAogICAgICAgICAgICAic2hhMjU2IjogImU5ZTM2YjY4ZWY5NGFlNDllNjBiMGM2YjhmYThkNmZlNGYxY2VkMjFiYTk0ZmI4NmQwZDY5ZWYyMTNmZmJkMzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJDT05UUklCVVRJTkcubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDYxLAogICAgICAgICAgICAic2hhMjU2IjogIjIyM2JiYWEzMTY3ZWYyNzlmOGY3N2RlMzVmZTA4NDliZDBhN2M1NzVkN2Q0NWMzMjY4MWYzNzMwMzUzZjViM2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJMSUNFTlNFIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA2OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ODMxMzdmNzJkNWRkN2EzMWJkMGU4YTBjNjkzMTQ0M2IzZjM3OGY2YjJmMWZmMGQ5YWZhNzIxZGEzYmM3YzE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiUkVBRE1FLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDM4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YWE1NjVjMzNiYTFmMWQzMDRmZWM3MGQ2MWE4ODJiYTYyMDZkZTZmOWJiY2QwOTk1NDJjY2NjY2EyOWRhZTUyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiU0VDVVJJVFkubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAic2hhMjU2IjogIjFiOGVmZWE5ZmIyZmRlZjA3MjdhOTBiYjA2YzcxODI1OTljNGE2NTg3YWZkYjMyN2YxMGM3YWRhZWY3ZTlkNTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJTVEFSVC1IRVJFLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICJkNzRkNzI5Y2RiNTJmOTIxODZjNDk2NGQwYWFmYjY4YTM3NmZjZTIxNGQyNTU0YWIyODY5NzFhODJkODZlMDBhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODgwMzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzU1OGYxMjNhMWM4M2NkNTA0NDFmOTRhZjMxNjgyYzY5MzFjMWQ0NDA3NGIyMGU2OTFjOWM3NGMyMWMzMmYxYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvYXJjaGl0ZWN0dXJlL2NvbXBhY3QtZW5naW5lLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwYmM2ZWU3OWUzM2Q4ODAwZjYxYmZlNWY0MzU5NWI1NmEyMmE0NTZlMTlhYTRhZmRkMGJjMjJhNmU2NDg5NWI3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9kZXZlbG9wbWVudC9idWlsZC1hbmQtdGVzdC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1MzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjg2NDc3ZDdjZGMyMTRiMzhlZGE4MDMyMzEyMjQxN2MxODE0ZmIyMTE0OTczNzQwZWRkMmZjOWU3YzNlNmEyMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZGV2ZWxvcG1lbnQvaW50ZXJuYWxzLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjYwNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOWFkYmY4YmE0YmNlYWNlYzFmNWI3MDc3NGZhNGJjM2Y5NDI1NGFhZDUyMzNmYWU3YmFkYTkxZDExNDBkZmE1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9kZXZlbG9wbWVudC9yZWxlYXNpbmcubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODA5LAogICAgICAgICAgICAic2hhMjU2IjogImQ2NzQ5ODlmMjI0NGRmNThmOWI1YjI2OTczYzE5YWVmNTBhNWZjOWJiMWI3ODE4MWFiNGEzMWMwZjIzMGEzOTUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2RldmVsb3BtZW50L3Rlc3Qtc3RyYXRlZ3kubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTA3LAogICAgICAgICAgICAic2hhMjU2IjogIjM3NDhlZGU4MjExZDBlNjY5MDdkZGQxMzcxMWNhYjU2NDQwY2U3YTZiZGJlZGY5MThmM2FlMmRkYzQ1N2JiZjUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2V4YW1wbGVzL2NvdW50ZXIubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTRmZTBlZWI0ZTZkNWNkOGNiNTdjODNhZjE1ODQ2OWVmYmNlYTBkZDYyZDQ2YTIzNGI0NjZjNDQzOTY0OGE2ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZXhhbXBsZXMvbGFyZ2UtaG9zdC1wYXlub3RlLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODAxLAogICAgICAgICAgICAic2hhMjU2IjogIjMxYzliZDBkY2E3OGIzZjExOTkzZDhmY2RkMjkzNGU5OGI1ZWUzNWRjNWUyZjRlNGQ1ODk1N2Y2NTg4NzRkOTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2V4YW1wbGVzL25iYS1jYXRjaC11cC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkzMywKICAgICAgICAgICAgInNoYTI1NiI6ICI2ODA3MWRiMTg4NGE0Y2JiYjc3MmE1MWY3NzNmYjg2NDVlMDQ5NGFkMmVmNzExODI5MDU3NzA2ZDg3NTE4MTkzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9leGFtcGxlcy9uYmEtc2hhcmVkLWdhbWUtbGlmZWN5Y2xlLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjYxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiNTIyNTA4MjEzMjg3NDlhOTYxNjc1YzA4OWM0ZDZmMDVkMjFmZmM0MTJhMDJiNjViNjczNjFjMzE5MGFjMmZiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9saW1pdGF0aW9ucy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMxMDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDk3NjY1OTAzNjdmNTY1MmVjYjgyMDM1YzhhNmEzMzU2ZjNlMGE0MTNkOGFiY2QwOTJjZWE2YjZkMmEyZWIwNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvbWlncmF0aW9uLWZyb20tMi54Lm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTEzNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZjZjNWQzNjQ4NTlhYTFlM2I3NDRlZmViYzBkOTZkNzE0ZGY5OTNiMzUwNDMzM2NiZDY2ZGNlNzg2MGUyMDAzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9vcGVyYXRpb25zL2ZhaWx1cmUtbW9kZWwubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTA0LAogICAgICAgICAgICAic2hhMjU2IjogImMyZDU1NWNhMzZlYTc5MTJkYTM2NTA3YWI3NDBhNjYyYWUxNTQ5ZTM4ZmZkMjk2MWJmM2VkZDlkNjg4ODk4Y2UiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3BlcmZvcm1hbmNlL2hvc3QtdnMtZnJvemVuLXRpbWUubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDYwLAogICAgICAgICAgICAic2hhMjU2IjogIjRiOTllNzJiOGMzNzZiMGU2NWZkMDA2ZDE4NzZkMTBiYTJiMGRlZjEyODQzNjA3MTg4M2E5MjVlNWVhZmRkZjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlZmVyZW5jZS9tZXRyaWNzLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJhZDFlOGU3YTBiZjY2NGI1NDZhMmNkMzk5YmY2MTc0NTNkNGU3ODAyYjY2YzM2YThjN2ZhODQzMjIzMTU4YTBjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWZlcmVuY2UvcHVibGljLWFwaS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYwNDUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2JmNWU2Y2IyOGI0ZjhiZjQ4OWM2MmQ3YzJiNTI4MjIxZTIyZWE4NjA3MDNjNjEzZDYxZmQ0MWI1Mjg4MGQzZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvMy4wLjAtcmMuMS1ldmlkZW5jZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTU5MTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWNkMTBkNmJhYTg5ZDc2NGQxOWZiNzE5ODM0MjE2MzZmMWZhMDczZmE5ZWJlMGQ2NzcwNTQ2ODgyMWNlNzMwOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvMy4wLjAtcmMuMS10ZXN0LXJlcG9ydC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg3MDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmU5NGMwZjEzMjRlZDdmMDE1NmM0NTVmMjU0Yzk2ZjJkZjdlOGJlMjEzNmFkYzBiNDhmZTA5NGUzMjY0N2JkZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvMy4wLjAtcmMuMS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUwNzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGRiMDk4NzlhZDk4ZjU4NzkxNGRjMGViZjE0N2VjZDdjNTFhMDNjMmNhZDk4MjQzNzcxZDZiZGEwNDUwYTgwOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9iYXNlbGluZS1sYXJnZS1ob3N0LXRpbWluZ3MuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5NjUzLAogICAgICAgICAgICAic2hhMjU2IjogImYyMzBhZWU3ZjZkYjRlM2QyOWM4ODMxZDFjNzY1NDIzNmFmNmI4ZTRhZjNjYmI2MjUzZGFhMmU1NDVjMjNjYTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvYmFzZWxpbmUtcnVudGltZS1jb21wYXJpc29uLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDU5NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2QzYmEzNDQzN2Y5MmRlOWE1ZWZkNGUxMjk1NGFjYTNiOTRjODI3MTAxNjRhYWY1MDdjMjI1N2ZiY2VlMjEzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2Jhc2VsaW5lLXJ1bnRpbWUtcHJvdmVuYW5jZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNywKICAgICAgICAgICAgInNoYTI1NiI6ICJkOWE4MTliNjljNGZhNTI5Mjk5ZjgwYmEyOWYwZGY2MTQ1OGQxZGNmMTljNGRjMWZlNmFiNzk1YmUyYWZhYmVmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2ZpbmFsLWxhcmdlLWhvc3QtdGltaW5ncy5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk2NTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWNjOGVlYzJmMmM1MWI0M2FkNzc2ZDZjNGI2NWVlODYxMTRjNjZmNjExNmJjZjY4ODBjZDBkZGRhMmY4YmU5NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9maW5hbC1ydW50aW1lLWNvbXBhcmlzb24uanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNTkwLAogICAgICAgICAgICAic2hhMjU2IjogIjkwNWY0MGI0NGM2OTBmYTNhOTY0YzVhMDFjNDcwMDU2NTlmMWMyYWNmNTkwYTQyNDNhZDVhYzM2M2QyNGJjNjQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvZmluYWwtcnVudGltZS1wcm92ZW5hbmNlLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM3LAogICAgICAgICAgICAic2hhMjU2IjogIjI2NzI1OWY3NGNiZTk0MWIyM2FhODFkYmU4NTBhNTYwMDRkMDc1MjJiZWQxZTU0ZjlhMmYyMTNlZDAxOTI1YjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTIvbmJhLXNoYXJlZC1nYW1lLWxpZmVjeWNsZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTU0NywKICAgICAgICAgICAgInNoYTI1NiI6ICI0MzNiNjlhMDEwODY2Y2MwMDRmOTJjNzAxYmQ2ZjMzOGE3NzBjZjAxYTJlZmE4NDVkZjI0ZTkwNzc3OWRlMzhjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDEyL3RocmVlLXNjZW5hcmlvLXA5NS1wcm92ZW5hbmNlLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzc3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NTRmYzUwZmI5Mjk4NWYzNWIyZTU2M2E0NjA1NGQ4NWIyMWYwODIzNDk1MzdhOTQwNzlkOGY4ZWUzY2YwNmEwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9yb3VuZDExLXZlcmlmaWNhdGlvbi5zY2hlbWEuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwODg0LAogICAgICAgICAgICAic2hhMjU2IjogImUzOWQwZTNmOTEyOGEwMTU2YjkwZjIzN2Y3MWNmZTI4YjMwNzQxMjFmODZkNDM2OGEwNTFkNzRkYTBkOWFlNjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL3JvdW5kMTItdmVyaWZpY2F0aW9uLnNjaGVtYS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkyODIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDA0ZDFkYjUyODFhNzZmMzg4MDUxYTNkYjdiYzJiMGUyMzJmYzc4MzlkNWRiZGYzOWIyNmQ1ZmVjY2I5ZDExNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvc2VtYW50aWNzL2hpc3RvcmljYWwtY2F0Y2gtdXAubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MDY2LAogICAgICAgICAgICAic2hhMjU2IjogImQzYTU5ZjM1YmNhYzllYmJjMzE2Y2EwYjc1ZGZiOGI3ZWM5NGJkNmIxYzdkYTdiMzliZDliMjkxOGU0ZTU4ZGEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3NlbWFudGljcy9pZGVudGl0eS1hbmQtcmV2aXNpb25zLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2VkYTVmZjg4NmJmNTI2ZGZjYjUzMjQ3NzJmZjNlNTVmYTViZjAxZGE0MTQ3NTUyOTE2MDNiY2Y1ZGMzYzk0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9zZW1hbnRpY3MvaW5pdGlhbGl6YXRpb24tY2F1c2FsaXR5Lm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjM4MiwKICAgICAgICAgICAgInNoYTI1NiI6ICIxNzAyN2JhMTg1MjdlNWVmNjgyZmIyMmJiZGQ0OWE0YjVjNzRhZjViYmFjZjQ5NDE0MmY2MjYxMmNjOTU3YTE5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9zZW1hbnRpY3MvcHJvY2Vzcy1lbWJlZGRlZC1kb2N1bWVudHMubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTg2LAogICAgICAgICAgICAic2hhMjU2IjogIjc3NGI1MjVlMWFkNzlhODUwNTVhMTZiMmNkNDM2M2RmOWUzMzNjMTViYmJkYjIxYjE4ZWQ5ZGU0MDc0NGU0NmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUubG9ja2ZpbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MzY0LAogICAgICAgICAgICAic2hhMjU2IjogIjI5YTZlMTk5NmY4OGYwN2FlNTZlNGM3MjA0MDljMDkyNDQwYmM2YWRhMTk3MTI1YTBkZmVmMDE3MjJjM2U5NGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUucHJvcGVydGllcyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZDczZTkxMzE3YTU3NmJlOWZkNzA3YWQzNmNlZjJlZWI1ZmY1ZGQwY2JhNzExNjNkOGNjMzA4ZmE2NTgyN2MzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL2JleC1zb3VyY2UubG9jayIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwMWM5NmM3ZTc2YzFhNzVkZDZhMGRmZDA5NjU2ZDY0NDk5NTdmYjE0NGRkMzYzZjc4NzU2ZmM1NTY4NWRiNDE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3B1Ymxpc2hlZC1hcnRpZmFjdC5sb2NrZmlsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc5MjksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjRlN2I3OGJjZDdhZTkyOTU5YjYxZjg4MmEwYzc2MmE1NjQ4NGE1N2Q4ZDZhMTM4OGMxZmZhYmI5NjJiYjE1NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9yZXBvc2l0b3J5LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgICAic2hhMjU2IjogImZkM2IwNTUxMDhlZjY1YTdkNTRlMDljOWQ5YzYxOWMyMDhhM2UxZjc1MThiNmUxZjUxNGI3NWQ0MTYzN2ZmZjgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0ODQ2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI0OTdjOGMyYTdlNTAzMWY2YWE4NDdmODgxMDRhYTgwYTkzNTMyZWMzMmVlMTdiZGI4ZDFkMmY2N2ExOTRhOWM3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlNzRkNGYxMDdkMmZlYWI5ODliOWEwNDFhMDJlMmQyYjg1NTY3ZmY0ODQxNWM5YzdhZGQ1ZWNjMTlhYmQxOWY5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2NTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTVhNWMxOTliYTAyMTg5YWU4YzQ2YTMzNDIyMzM3MWEyMDU5OWQ5YzI5OGVmNjVlNzU0MGVkZTRhM2Y3MmQ1OSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXcuYmF0IiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg0OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTM5Njc2YzQ4YjU5NmFmZGE2NGM5NjNlYzhmN2VlNTZjN2IzZmU3ZTNiODFkMWRiZTJkMWExZTNkZDllOWY4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic2V0dGluZ3MuZ3JhZGxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICJhN2NhNTg1MWY5ZjY2MzIwNzFjZTEyY2YwZjYyMDk4ZDk5NWVjOWFjMjQ2MmVlMDAzYTE4N2MyM2I2MmRkNmNiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2NvbnN1bWVyVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2NvbnN1bWVyL1B1Ymxpc2hlZEFydGlmYWN0Q29uc3VtZXJUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjQ0MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3ODQ5NmM5YzYzOWZmMTA0NjczYmU2YzZiYjc5MGZhNTY3MTg3MDI3YTdkMDliNWI0MDc1ODNjNDJjMzY1ZDY0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0FwcGVuZEFkbWlzc2lvbkF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjZmMTdmNzNlODUxODQ4MDBjMTE2MzRhN2U2MGIwNTI4YzQ1ODVjZDdiNGM0NDIyMGI0YjdjZWNlOGJmOTQxOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9DYWNoZVNlbWFudGljUGFyaXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTc2LAogICAgICAgICAgICAic2hhMjU2IjogIjljMWU5NjVkZTM3NzQ5ZWY3ZjM2NjA3Y2RhYWViNDk2MmMyYzI5ZWYwMmZkZDBmNzhmNWRhYjlhNGQxMjhiNjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ2F0Y2hVcFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIzODBiNDMxMjg5NzUyZjY2NjVjYTU5ZmRhMWYzMjU0Mjk3MzBiNWJiNjg0ZmZmOTQ0YmEyZGY3NDU0M2U0ZGVkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NvbmN1cnJlbnRFbWJlZGRlZENoaWxkQ3JlYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjgwLAogICAgICAgICAgICAic2hhMjU2IjogImQwYTI3M2FkYmM5OWMwYzE4YTRmYzdmZjNhNjQwMjZjYjQzYzM4Nzk5OGI0YWQxMDg4YzNmMjI4NjYzOGYyMDEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ29yZUJlaGF2aW9ySW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYzk0MmQwYTZiZDg0ZDNhMTk4N2UzNTI2NDJlN2I0NDQyNzk4ODk5YmY0YjZlMjAyN2U2YjM5N2JiNDA3YjFiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0RlZXBTYW1lRW50cnlPcmRlcmluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMjM4MjZhOTZlN2I1OTliYjdmOWZlZWY4ZTgwNzEyNWUwODQxN2FkZDgwYjQ4NmNkOWVjYzIzNjNkNjE4ZTI5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNIaXN0b3JpY2FsU291cmNlU3VyZmFjZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjcwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMTA0NDI5YTczYzNhM2IyMzI1MWJjNzk0NzJmMjAzNTUwYWFlMjhkMGU4ODQ3MTViMjNhMjkwYWRhNDZjOTNiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRIaXN0b3JpY2FsUGF0aEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMjhiNjlmYzc4NzcyYmZlMDg4Yzc0Y2I2NTEyYTU2NGFjZDc2YTczNTMwMDMwM2I5NDBlYjU2ZjVjMDJhMTBhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRQYXRoQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1OTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTJiZmIzMjhhMjE1NjkwYmQ0NmQyZTBiZTAwYWE4YWE1ZWUyNTA4MzA5ZmEzYWUwZTUzNzYxMWQzYmY4ZDJhNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZEVwb2NoRXZlbnRPY2N1cnJlbmNlSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Njc1LAogICAgICAgICAgICAic2hhMjU2IjogImY4Mjg3MGUzNzliZWNlYzhkOTdjOWFhYmQ4ZTY0ZWQxNjFkOTg5NTVmNzFjM2MxMzlkNzk0NzhkZmY3ZTI4MWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRPbmx5TGF5b3V0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDQxLAogICAgICAgICAgICAic2hhMjU2IjogIjEyZjUzOWY3ZjdhYmI2NTY4NDYzOGVkZjJmMjc0NTRjMDM5NDJkMWJlOTI2YmZiMTI1MTYwOWE1ZjJjMDViZTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRPbmx5U3RvcmFnZVBvbGljeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxOTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTBhYmRiYTQwODk4YzdiMzJkNmE2ZTE0NDY3MTQ2NWQ1MGE0ZjU1NjE2ZmYwMGZhODBkYmRlNTEyNjYyMDc1MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbmdpbmVNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTZlMjlkYjgzYzc2MmJiM2UzZjhkMzFjZDgxMzU4MjkxNjIwOTM0NDI3OTBkZTAwOTlkOTlkMjkxYmQzYzBmZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbmdpbmVUZXN0U3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDQzMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZmI2ZDY1N2RhNDZmMWM0MDAwMmRiODZhNGM4ZDZkMDhmMzkzNWNiNzRkMmI1ZDk1YmViYjA3ZDQ1YjQzYzZjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0V4aXN0aW5nRW1iZWRkZWRTdGF0ZU9ubHlDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDM3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZGQ5NjZlZTM0NGIyNDA4ZjM5MjhlMzZhZWFmNDY4YTA4ZDA0ZmZjYjFmM2RlZDA4MGY2OTU3NDg5NzUwODdiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0ZhaWx1cmVSZXRyeUF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyMjAxLAogICAgICAgICAgICAic2hhMjU2IjogIjY3MDczMGE3YzAxZmEwOTU0NTQyMDk2ZDlhODcxYmJmZTI3YTQzNDVmMjBlM2Q3YjFmZWViMDI4MjM0N2QzMTgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSGlzdG9yaWNhbFNvdXJjZVN1cmZhY2VJbnRlcnZhbEludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc4OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjY2ZmMzg1YWI2NzI1YTQ2NDI3NWJkMDkxZjQ0NzNhZDExMjk5NTQ1N2U5NmM1YzE1Mzg2ZGRiZmEyZGEwZTVlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0luaXRpYWxpemF0aW9uTGlmZWN5Y2xlRXZlbnRPcmRlcmluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzcxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICIxN2ZiZGJhNDNhZWNkMzhiZDdiYjk2MmVjNzJlMzQzMGRjYjk0MTA0NDg0ZDAyMjRmOGRlYWRkNDU2NmIyNjNhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0luaXRpYWxpemF0aW9uUmV0cnlJZGVtcG90ZW5jeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5OTk5LAogICAgICAgICAgICAic2hhMjU2IjogIjgzYTZmMmJkMTczYzM0NWFiMDJhMmJkM2Q3NTM0MmZjMTMwOTlhYTU5YjI3OTEzYjc5NGUyMWQyYjYzNDYwMmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTGF0ZUFkbWlzc2lvbkVtYmVkZGVkSGlzdG9yeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4OTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWU2ZmVjMDRkNWUxNWEzMmM4N2U3M2RjNGVkZWFjMzhhYjU1MjcxODFiODg5MmM3ZjE0ZWFmM2VjOWVkNzc1MiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NYW5hZ2VkQ2hpbGRDb2xsZWN0aW9uTWVtYmVyc2hpcE11dGF0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDQ3LAogICAgICAgICAgICAic2hhMjU2IjogIjk4NWJkOTU5ZGFkZGUzMGI2NzY0NjVmZTYzMmJhMjc4YjE5NzE1YzljNDgyMjY0NDViYThiZGJiYmY5Y2FjNjUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZENoaWxkT3duZXJzaGlwR3VhcmRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTMyLAogICAgICAgICAgICAic2hhMjU2IjogIjBhOTQ4ZWNlYzRjNmY2MDU1YWFhOTA0ZDY5MWRjNDYzYWQ1MzQ4ODU5ZTkwMGVmM2NjM2UxN2NmZWM1N2M5MWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZERvY3VtZW50SXNvbGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDQxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJhNGZlYjFlMjRhMjZiYmY5ZTI3YjQ3ZGU3ZWUzYjU0M2U5ZTBmOTU3MjU1MzE5ZTg3M2IyNzFlYmIyM2VmMTc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL011bHRpQ2hpbGRTeW5jaHJvbml6ZWRDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA0ODcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTc3ZDUxMTUyYWY3N2FjOGFjNTk2ZWQ5YTA1ZWQ3MTY4NDc2MzdhMDI2MTYzYjAyM2MyNWRiMDc1ZWE2Yzk1OSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRFbWJlZGRlZENhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzU5LAogICAgICAgICAgICAic2hhMjU2IjogImNiZGFlMGY3NWViYmU2ZjYwMjVmOTliOTRhY2M3YjgyOWFkNGY2MThhMGVkZTgyMDAyYzM0MTI2YjJjMjgyMDkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkT3duZWRTY29wZVBsYW5JbnZhbGlkYXRpb25JbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTA4ZTMxM2VkNzMwMTI3MWM3N2QwNWYwMzA5ZjM3ZGIwZDIzZTMwZmI5ZmMwZTU1MzgyMGNlOTVkNGNkNWQyYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRTaWJsaW5nR2xvYmFsQ2F0Y2hVcE9yZGVyaW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTE2MTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDE4ZGU4MGVjNDBkMjFmMzU2YTkwZmMzNWQzODUzYjczNzM5ZGZiNTc3NmFmM2U2MmYyYjU4YzIzZTdiN2Y5MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Ob25TY2FsYXJSb3V0aW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzk2LAogICAgICAgICAgICAic2hhMjU2IjogIjMxZjgzYTRkMjdmNWIxZjNmNmU1ZTg4Mzg3MmExYTg1NmJhMGQ1YzhhZDExODQ1NzE5MWViZjMzYmU0OGY0N2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjEyZTg5MmMyMTNiYmNmNzRkMDllMmI3MWJhMWZlOGY3MzMyN2VlYWQwN2FkM2ZmZGEzZDMxOTdhNzRiNTJmMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Qcm9jZXNzRW1iZWRkZWRDb2xsZWN0aW9uUGF0aHNJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU1MTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGZhYTY5MTE4ZWU1Y2EwZTcwMmU2NWJmNGYwODJjM2MxNjU4ODdlZDdjOTdlN2E4MjBiYWMxYjg1OTU4Yzk3YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QdWJsaWNUZW1wb3JhbEZlZWRlckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU0MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTg1ZTI2MTc3N2E2NmQ1NWU0ODQ1ODhkZTkzYmRkZTY5M2I1MjBkOTIyNDZlMTY3OTFmMWJjYTY5ZDAwNDY5MSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9SZW1vdmFsQ3ljbGVBbmRSZWF0dGFjaG1lbnRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NDE4LAogICAgICAgICAgICAic2hhMjU2IjogImJhM2VkMzE4NWVhODM0ZjI5ZDgyMTQ2YjY0N2ZlNTQyZWE3MjQzZjI3ZGMwNjc3N2QwYWU3ZjUzM2U1ZmQ5MDIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMEluaXRpYWxpemF0aW9uSWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzOTk2LAogICAgICAgICAgICAic2hhMjU2IjogIjQwZWQ2NzYwZDAxNTRjMjM1NDZkOGNkZDU2YzU1ZmMxMGViYjllNGEyMzhkYmJlNjQyYTk1ZDhiNmU1Mjg0NjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mjg1LAogICAgICAgICAgICAic2hhMjU2IjogIjI5NGUyMDkwYjViNmExY2YyNjhkMDAyM2Q3NWRmYzE0ZDRmNmU1MGVkMDVjMWE3YTkxZWYxNjAxNTM2YzJjYzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2FtZURvY3VtZW50SW5pdGlhbElkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjUwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYWYxMDZjMmYwMDFmOGExY2EzNzE4Y2VlZWFiYjdiMGNlZDAyZGM4OWQ3YWU1YTI3MjkwN2E0NDg5NjFkZWViIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NoYXJlZE1hbmFnZWRDaGlsZFR3b09jY3VycmVuY2VzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTQ2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJmYTcwYjA1ZDJhNDFkMWMzZDRhMmVjNzViM2YxNGYxYTQ2ZjVhYTI0YmZjNGE5ZTkyMmRmODg4NmE1OTMyZDc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NoYXJlZE1hbmFnZWRDaGlsZFR3b1BhcmVudHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDAwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOTEzNDlkMDhiMGRlODQxYzEzYTMwMDYwZWU3NDQwMzQxOTBiMTkxZmIyMTljN2FiYTZkMTY5ZGVkN2M3M2I1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NvdXJjZVN1cmZhY2VJZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjkzOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZmNlMzE1Y2YzZmM3M2ZkNjFmMjBlNjc4MmRiZjI3ZDUzM2JkNzZlMWU2NjkwOWIyMGM5YmNlNjE0ZmYzODEyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1N0YXJ0QWRtaXNzaW9uQXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYjJjY2I1MmYyMDIyYjQ1ZWFkODc5ZDQzODAwYmUzOGQ1OTk5ZTg0Zjg5MmYzYjY1OTA0MTZjMjY0MjdmNDZkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1RlbXBvcmFsQWRtaXNzaW9uUG9saWN5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzkxNywKICAgICAgICAgICAgInNoYTI1NiI6ICIxZDUzMzQxZWU0ZTEwZmI0MjEyMDcxYjBkZjUwYTFlZjNhZTI4NWUxNzFlOGEwZmViNjQ0OTllNDFkYTQxNTUwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMzc1LAogICAgICAgICAgICAic2hhMjU2IjogImJmMjgyZTkyYjBmODYxZDkzNTJlYjJhYzdlMDUxODNjMjUzMzdiYjM0NjJjZDU1MTUxYzFmMDQ1ZWJkOWQ0YzAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVzdFJlc291cmNlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjIzLAogICAgICAgICAgICAic2hhMjU2IjogImYwMDllMWYxZjA2ZWU3NzUzMmRkMGQ0ZWM2YTAwNjBkNzg4ZTZjYzI2OTMzMmM1N2M5NzY0YmQ0YjEyY2JkY2IiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vV2hvbGVPYmplY3RGYWlsdXJlSHlnaWVuZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzc4Y2UxOTdkOTJlNmMxODhhMWYyZTVjZWNjYjZiOTg5ZjViOGI3ZTU2OGVkOTU3ODRlZTYwOWU0Y2U1NjM2MSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9BcHBsaWNhdGlvblJlYWRpbmVzc1Byb29mSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NjY4LAogICAgICAgICAgICAic2hhMjU2IjogImU5ODc3MTEyNmJlZmVkY2Y4YmRjZTJiYmM0OGRiYTQwMTQ5MzMzMWFmMGMyZDgzMDViYTMzMmE2MmFmMzU4MzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9hbGwtdGltZWxpbmVzLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTc0MjQxOGQ2NzcwNTE4NjY2YzczZTVkZjczZWU5OTdiNjQ1N2Q2NTI0Yjg5NzQyZmVlOGQwOWFmYzRkZTE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vY29tcG9zaXRlLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNDU5ZGIyY2I4OGZhY2U4ZjNkMGI1OWI5NjhhYWI1NTIxZjM3ODUwNmI5N2FhZDBiY2VmN2Y4ZDllMmY5OGEwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc4MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMWZhOWZjNzU1NzZhZWQ0NjQ2OTMyNWIwMjc3ODMzY2Q5MDZjMzdlZDJjNjUwNjVjM2E4Yjk1YTUzZTdiYzJiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDczLAogICAgICAgICAgICAic2hhMjU2IjogImI1NGNjZGUxNDEzYzM5Y2JmNGQxZjViMzQ0M2UyZTM1OGJjNDRkZWI5Y2Q4N2M2N2M0M2IyNTdkMTc5ZTAyZDUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktYTExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTNjYTc0YmVlNjU4ZDA1MTMzZTRhZWI1OGJmYzdkOWFiYjRiOTM3YjZjMDMxZDJlYmM4MWM0N2E1ZDE1Y2FkZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODU4LAogICAgICAgICAgICAic2hhMjU2IjogIjBkNDZlNTRiNTllM2UwNjZlNTFjMTMzZWMzN2RhMTAxMjAxYzgwODQ3NDZkYTNmNDIxNmJkZWJmMWNiNzU1ZmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kdXBsaWNhdGUtZXZlbnQtZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODE1LAogICAgICAgICAgICAic2hhMjU2IjogIjBkOGQ2ZThkY2Q0ZTkzMzZhZjBjMjY2NWNlMDA3YmY0OWIzMjE1ZGQxYzNiZmY4YmE0MGZlZTFmNDhlNWFhYjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9keW5hbWljLXNvdXJjZS1zdXJmYWNlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzg3LAogICAgICAgICAgICAic2hhMjU2IjogImE2ZWUzMWUwNWEwMzE1ZDViNzZjMzMxN2VlYjg3ZmIyMDAxYmIzNTEyNzRkMTJhMmYxMDBjMTkzNjRkNzliOWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb2xsZWN0aW9uLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjIzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NWI0MDM5YTA2YzUxMjJhZjI2NzNhOGRmMGZhNGNlMjQ5OTlhMjcyY2EwYzhkOTdkOTcxMTMwMTdlNTEzNzk0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY291bnRlci1CLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzI3OTA5NGRiYzUxZTY4MDhiNTdkZjMyOTAwZDMwOTEyOGM0YTIwOGVkMWNmNGVhZDE4ZDNlNDI5ZTU3M2I3NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMzE2YWZiNmNmYjg5MTZkMzlhN2ZkNzIzODk0OWU0YjBhNThiNGQ3MmEwYjRiNDg0MTQ1OWVlNDA4OTUwMTNlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtbWlkZGxlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2LAogICAgICAgICAgICAic2hhMjU2IjogImY4ZmYwMmJhNGI5NmVjZDE1ZTZhMzdhOTdjOGIwYmQ4MjNkZGViNzU5ZWE5ODAwOTc1MmMzM2ZiYjQ1M2RlOWUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmI1OWNjMmVjMGNhYTk0MjUxOWQ4ZGQzYWNjODU1MWYyY2NkMzA0ZTBiZDYyNTQ2ZDMxNjY5NDE2ODQ5NGJmMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjg2NzY2MTMzOGE4YWFkNTcyYTE3NWNkMmMxNzU4MzIzMjYzOGQ2MzBlOGYxZWQ3Nzc4MjI5ODU5YzgyYTdjMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXN0YXRlLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTcyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxZmRiMDQyY2EwNzYzNzBhNzI4ZmZmOWY4NWQxN2Q0OTQzZTBhMDJiOWVmNjlhMmVkNDlmNGMzMGZkOTgwZjhiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vaW5pdGlhbC1lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyOTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTVkZjIzMGQ2YmY5MmQyYmRiZmE2YjE4M2JjNGMyNTFmNmI5NzM0MDVmYjdkMGU2NjNmNGIwZjI5ZjdiNWJmZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2xhcmdlLW9yZGVyLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYxMjMzLAogICAgICAgICAgICAic2hhMjU2IjogImZlZjQxYzUzNGE3ZDE3ODU3ZTlkMTZiOTY0MzFjYWFjYjhiZmViZGE0OGM5ZjBkNDMxOWJjZWE2ZTI3ZGUxMmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9sYXJnZS1wYXlub3RlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjgyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3MTdiYmI2ZWIwM2MwYTkxNTJhMDJiYmNlYTFmYzdkN2JhOGM4Y2FmZGJkZjg5MWVmMmQyM2E3YTBlMmNhMGFkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0YjVkZGU1MGMwZjRjMjA3ZGYxNTY1YTIxZjIzMjM2Y2NhN2ZjMjM1YmUwZmJlYmFiNTE4Njc2ZDEyM2M4MjIzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjE0Mjc2ZTlkYzZhNGI0NjZmNmM4YjU3NjhhZGVhOTA4ZGViZTVjZjBlODI0NTA1ZmRkMDQ0YzNiNjBkMzM2NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1yb3VuZDEwLXNsYXRlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTQzLAogICAgICAgICAgICAic2hhMjU2IjogImNkOTAxYzZlYTAxY2Q4OGQwNzZiZjZlODA1OWU4ZDljYWIwNzcxYWViZjhhOWYxN2U4NjliNGIzZjE2Njc4ZjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtc3RhdGlzdGljcy55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OTVkOTBhMDhmOGUyYWE0NGE1OTA5Yzk2ZTdmM2NjNTUyNTFmOTZiYTlhZDY1ODk2NmZmM2QxZmZlOGEwZTJiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmVzdGVkLW93bmVkLWR5bmFtaWMtc3VyZmFjZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYzc0OTk5ZDQ3NzNhN2IyYjI5NWU0MjgzZmU0NmI2NzM2YWFmOWVkYmYyODYxMDY5MGUyMDgzMDM1YjNjZGVjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmVzdGVkLXNpYmxpbmctaGlzdG9yeS1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjg4LAogICAgICAgICAgICAic2hhMjU2IjogIjY4ZWVlYzNhNzM1MDg4Nzg3ZjJkNTE5NzVmYzUzMDJjZWYyM2I2YWNkOTM4ODFhZWU5ZjgwNTEzNGI2MjdhNWYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9vd25lcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMTMxLAogICAgICAgICAgICAic2hhMjU2IjogIjg5NTUzZGI2N2IyM2MzZjhjYjFiMGFmYmY4NThhNTA4YzY3YWU3NTQwMDU4ZjZjZTJkMWFiZjExNDNjMmU2ZDQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9wYWNrYWdlLXBheW5vdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1ODIwLAogICAgICAgICAgICAic2hhMjU2IjogImJiOGMwZTFiYWE2NTc1YzM5YjYwZDk0Nzk2ODQ2NjFlNjZhODQ5OWM0MDhkNzcwZGJlZTNjY2FkZmNiNGQ5NjQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjM0LAogICAgICAgICAgICAic2hhMjU2IjogIjQyYzIwY2E5Mzg2MzFjMjllNDliYTAwZTUwYTMwN2ZmNTA2OTllMTlmMzU0OTNiMTA2ODU1ZjZiYzU0NTc1NTUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmZmNjdmMGRlM2EyMDYyZjM5NDRhMWI5ZjAxZGIyNWM5MmVkNzFlZjc4NDk2ZTk4NGE0Y2VmZTk5MDUxMGIyZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3NoYXJlZC1jaGlsZC10d28tb2NjdXJyZW5jZXMtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjYzLAogICAgICAgICAgICAic2hhMjU2IjogIjdiMGEyYjdkZjRhNWIxMmMzZGRjNzkwM2ExYTM3ZDUzMDBkYTQwODU3MDMyOTc4N2QwZDY2ZjA0ZjQ4ZmFhYzkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi90aHJlZS1jaGlsZC1oaXN0b3J5LXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkZTQwZDA5NjUzMzc4YWFjMjQwNDc4MzNkYjAwMjE5OGEzNzIxYTNmNDRhMjIwMzhmYTM0NGJlZjJmN2JiMzA3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vd2hvbGUtcmVxdWVzdC1zaW5rLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1LAogICAgICAgICAgICAic2hhMjU2IjogIjA5OTg3NjAxZDM5YTI3OTdkY2ZkMzQ5OGM3MDI1YjUzNzMxZDljMjE4MGU5MzE3YjY0NjVhMTZiZTIwMmQ4ZjEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9wbGF5Z3JvdW5kL2ZpdmUtb2NjdXJyZW5jZS1pbml0aWFsaXphdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzk4LAogICAgICAgICAgICAic2hhMjU2IjogImIxZTk0YzAzOWQwZmQwZGY3MGIwYzgwM2ViZTkyMWEyOTBkMTU5MGJhYzY5YTkwNzNmZTQ5MTBjYTg5MzliNmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtY29sbGVjdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mjc4LAogICAgICAgICAgICAic2hhMjU2IjogImJiM2NlNDA3YTYwMGU4YWJkNDE1N2IzM2E4Mjk1ODA3NmE2MDQyOWRjMmY5YjE0YTkwZTRjYTQyNmYzMWE5YTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtcGF0aC1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyOTEyLAogICAgICAgICAgICAic2hhMjU2IjogImFjZWQ3MzRlYzVhZjFiYzIzMjgwNzRhZTkzZDMwNGJmOTU0MDBlN2RlMjZlMmVmYzFkZTg2NGFmNjQwYmE4MzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLWR1cGxpY2F0ZS1ldmVudHMtY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTA3ZTk4ZmQ3NDZiYzIzYjQyZTM5OGQ5MDI2YWNkZWMyOTdhNWE5YWRjODYxMzE0YTY0ZjllNzc5M2U5NjY5NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tZXZlbnQtb2JzZXJ2ZXItcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjI4NzU2YmM0YmIzMzkxODIxOWZiYjcxOTZhZTY0ODMwMWE0ODBhZjE5ZjFmNDAzNWFiMTgxNjEyZDM3MmVkZDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLW9yZGVyZWQtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDM5NDRjYTkzMzI4NzljZTY1ZjliNDA3ZDA3MTFhNjRkOTQzZTJmODExMDBkZGYwODdhODU1MjYwZDdlOGIzYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbWFuYWdlZC1jaGlsZC1jb2xsZWN0aW9uLW1lbWJlcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDk4LAogICAgICAgICAgICAic2hhMjU2IjogIjk3NWVjYTM4Mjg4OTI5ZDczNDAxOTBlNzMxMGJiNDVmNzJlYzJlYTJiZDU1NTM5NzZjNGFlYzcxNjVjMzFkZjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtZ2FtZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzM4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZjFiNzk5OGRkOTA2NGYzMmYwNGQyYmEyODViNWFmZDQ0OTY0M2FiZjc3ZjNlMzU2M2I2MGY0NzJlM2U5MTIxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uYmEtbGlmZWN5Y2xlLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJjZTQ1NWM2NDMwOThjMjhhZjRiYWY5MzU2YTRkMWQ2ODkzODA5YTJmODM4YzdiYjgyNzA0NDg1NjE0MzkwMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmVzdGVkLWR5bmFtaWMtY29sbGVjdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTg1LAogICAgICAgICAgICAic2hhMjU2IjogImEwZjUyNzliOTM0MTk3ZmRmMjYwYjNlMGQwOGIwNmI2ZDI0YWJmODAwNGUwMmMzYjA5YzZlMzgxN2FlMTA0OWMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9BY3RpdmF0aW9uTW9kZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjY2LAogICAgICAgICAgICAic2hhMjU2IjogIjc5Y2U2Zjc2NjJmYzQ2NzFhNGFjMWE3YTE4ZDg0ZDdjYjc2OTZhNjM2ODdlNWNlYWVjZmZkNmU2OGM4ZDg4OTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDZlYzFkYWZhMmU0YzU4ZTdhODM2ZjQxMmY5MWRhZGNmYjQ5YmU2YTU3Mjc0MGY5YWZmYjg1YTg4YWE3NzUwYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbkVycm9yQ29kZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNDQ5Yjk1MWQ4ZTk5M2RiZmFmYjU1MTRlZDVlMTM2MTE3MmM1ZDAxYTFhYTI3MDZjODRjOTk1NmVlMTljM2UxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDcwLAogICAgICAgICAgICAic2hhMjU2IjogIjI3NjYwMTIyNzhmNzI5Mzg5NzY3MzhhMDE1OWI0NGMyNzY0NDEzMDUyZTgzZTk2MTMxNDE0ZTc1N2VmN2IzNmYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25NZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1OTY4LAogICAgICAgICAgICAic2hhMjU2IjogImUzMjdmZjIyM2FiNTM2ZmZlODQ4OTIwODQxZTQ3ZWYxNjAwYjNmZDU2OGJhN2ZmZDUzMmQ0NzFjYzQ2ZDQ0OGIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudERpc3BhdGNoT3V0Y29tZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjYzLAogICAgICAgICAgICAic2hhMjU2IjogIjEwZmZiZjA5MTAzMDQ5NjJmNWIxNzNhNmU2YTllYzM0OTM5NGI0ODMwMTc2NWQzNzNiZTVmY2M3YmYwZmZlMmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudElkLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcxLAogICAgICAgICAgICAic2hhMjU2IjogIjYwZjg1ODViNzQ2ODBjYjc2ZjU2ZDU1MWY4MDQ2YzdhZWUzODI5NmI2NTA1ODlkMjY4MTMwOGJjNzVhOTViZDEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudFJldmlzaW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MjAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ5OGU2ODdmMzQ3OTk0YzFiMzk2Yjc2ZDkwYjVlNDk3ZjU1ZjMwZmQ3NjVmZTYwZmVmZjUyMzUzZTJkZWUwYmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudFNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODUwLAogICAgICAgICAgICAic2hhMjU2IjogImRmNmRmMTVlMmQ4NzM0OGVmYjY2ZjEwY2Y1NTIzOWU3NWMzOTc2MGY5ZmExNmUyODAxOGE4ZDM1MWZhYTQwZGEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9FeGFjdFZhbHVlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTU2LAogICAgICAgICAgICAic2hhMjU2IjogImQzNjA5MWRlYzg1ZGYyODhlOGQ0N2FhNTU5NTcwNjA3M2Q2MWY3NjUwMGI0OThiZWQ1MGExM2NmOGQ1MmRhZmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9PcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzhmYTY2OGY5NDg3MTU5NzdkOWQyNGI0YmVlZGM3YjgxMTQ0MDZkOTJjMTUwNTJhNzJjNTRhOGIwZDMzZDE4MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1Byb2Nlc3NpbmdEcmFpblJlY2VpcHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5MjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjI5MWY5OThjYTJlNDA4YjgyZGMzMzM5MThmMDMyNjNhOGIyNGQ4ZGJjNGFlY2I1N2UyZTlkNzNjMGQwMzllMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1Nlc3Npb25TdGF0dXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NWMwNjFlYmVhYjFjZTFkNDgyMGU3MTE3ZDIzOWM0ZDAxOWQ5MGE3Y2M2MjVlZmQ5NjQ1MWQ4NGRkZTQ5NWU0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3NywKICAgICAgICAgICAgInNoYTI1NiI6ICJmOTIwMTFiZWIyOTk5Y2UzNmRiNTczM2U4ZjZhZjljODk4ZmFiZTc4MmRhOGU1ZDgxNjQwZDdhNTViNmZlMTViIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmVBcHBlbmRSZWNlaXB0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWMwMDExNjI5ZTUyZDU0YWU4NTcwMGU2YmY5Nzk3OGEyMWIyYWQ3NGIwMWI0MGIwZWNjNmZhNTQ4MTY2NzQ0MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lRW50cnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzU0MWE4MzQwZGM5YzdkNTY4NDY3Yjc2ODUzYWJjNGE3MGZlYWRmMWM0Mzc4NGY2Yzc2ZWNhOTc5MjIwZWMxMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQmx1ZVJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzY1LAogICAgICAgICAgICAic2hhMjU2IjogIjA2YmEyYTA0MTI0YTBjOWYyMmU0NDIxMTBiZGQ0NTdhNTRlY2Q3YmQ4NjE3ZGM3ZmRmMzY5YTA5OWExN2U5Y2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NhdGNoVXBCYXJyaWVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODg5LAogICAgICAgICAgICAic2hhMjU2IjogIjcyNTg2YWU3MDk1ZGE3MTM2NDVmZWJhNWE0NDE1ZmMxZjFlMGI0OGYxNjEyYmJjMDVmNGE3MzNmNTA3ZTI2OWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NoZWNrcG9pbnREb21haW5FdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhYWIzYjEyY2VlYzE4ZWYyYTI2Mzg4YmE2ZmZiZmRmZTlhODIwZTI1ZTRhNGRhYzk2NzRmNjg0MTRlNGVmNDlmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Db21wbGV0ZW5lc3NFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk5MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwY2E4ZjdkYmFhMzBhZTIyM2E5YmFlNmExNDc2Mzk0MTcwN2VmODQxZWY0ZjE5Yjk4ODlmNGJmZWIxNDNlNTllIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9EZWZhdWx0Q29vcmRpbmF0aW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMjExNywKICAgICAgICAgICAgInNoYTI1NiI6ICI4MTY1Y2I4ZjhmOWZiYmJjYzFmZjdiYTBkZDEwZjk2M2RiNGE0MmVmYzk4ZDkxMzE2YjRiMWJkNjA0MzU4YTgxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudElkZW50aXR5UmVhZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODE3LAogICAgICAgICAgICAic2hhMjU2IjogIjVjYmY5ZGQ0N2IwYjc2MzdjZWYzNzA3MjFhNzY1MzZhMGNjZTg0ZmFmMDU1MWQ1NjY3NTc3MDEzZWRjYmI4NzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50U2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI5MDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDk2ODZhOTZiNThjZGE1OWQxYmIzNjE3ODU2MDNiYTcyZTI3YjRmMmZhZjYxMGNiZDMyMWVjMzgzM2I0OTY1OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRUcmFuc2l0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjU0MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NWE4MGZlMTdkZTliZWY4ZGU1ZTkwMGE2YWJhZWRjODA5ZGUwYWFlZjdlODBlMTRiNGQxMDY5NTY5MWMwZTlkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE0LAogICAgICAgICAgICAic2hhMjU2IjogIjY2YjAzNTc0MzVkMWU4ZTRmMWY4NjYzMzU1ODFkZTgwZmU3NGRkYzFiNzI0MmJjOTZhMTAwZTk3Y2FlMzk5YTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hDdXJzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjZkNTVlM2FmMmExMzZmYmUzOGY4ZDk3NTc0ZWJiMTUzNDM2YTk0YjA0MzY3OTQ1NWRlYjk5MDY4NjAxMDQ4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEVwb2NoSW5wdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk5NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWIyOThjNzdlYTBlNzYyYjExMTczNWQ0M2E4ZjAyOGE4YmRkOGRlNzhjOTU1YzNkYzk5ZjllOGIwZjJiY2M0YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRMYXlvdXRQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3ODY0LAogICAgICAgICAgICAic2hhMjU2IjogIjc1YWUwNTVmMDI3MzIyZTIwOTNlY2JiZDhjNDg1ZDM5MzhlMDRlZDVkM2M0MDUyNGNkZmQyYjUxNGFhNDkzM2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT2NjdXJyZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTE5LAogICAgICAgICAgICAic2hhMjU2IjogIjI1NzEwYWVlMGNlOTI2YWRmMGExYmEzZGIwNzkwMmU2N2E0YzFmOTQ3N2RiMTNkMTJhY2FmM2Q2NWI2ZTE2ZTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT25seUxheW91dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc0NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZDAzZWU2ZjFjYWMwMWY0MmM5NDhmZmEyMWVmZWQ0Y2Y0M2IyMGZiMGI4YjU1NDliMjY5NGJiMGIxMjg5YTZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9ubHlMYXlvdXRCdWlsZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjY2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNGY2ZTNhODg1MDI5MTYwMTJiNzQ4NWM0ZjEwNTczNGVlNGZjY2IwYzBiZTBmMzIyZWY1Y2EzZWM3MzI3MzdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRpbmdCaW5kaW5nLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTg1LAogICAgICAgICAgICAic2hhMjU2IjogImU5MTFmNmRhMWYxMTRjN2EyMTllZjQ5MmU4NGVkNTYxYTU4NmNhNTk0N2MzMzI5OTM3MTRjMzlhNmM4NGFjMmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VuZ2luZU1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc4NjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjQ3MTU0ODQyNjdhYmZlOTdmNThkZDIzYjkyN2VlNTg2ZWVlNmJlZDEwM2FjNTI5ZDdjY2NhYmZlNGU5NWNkOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSGlzdG9yaWNhbEF2YWlsYWJpbGl0eUNvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4MywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YmFjZjEwZjA2ZWZjY2RmY2Q2NGU0YTk0OTJlMzU3YTJlNmMzNWU3YTg5ODgxNjg4OWE5MjFjNDMwYzNjM2UwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9IaXN0b3JpY2FsU3RlcC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQyMywKICAgICAgICAgICAgInNoYTI1NiI6ICI4OTQ3ZjE1YTYxMjE0ZjkyZmQ2ZjQzMDY3Mzk5NjFhNDZiODZjOWMwN2EwMzhhZTdkY2M1N2Q5YjNkZDUxNDdkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Jbk1lbW9yeURvY3VtZW50U3RvcmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjIyODY0MGFmNzI5MzgzOTU3ZTViZmM1YWY4ZTM4MzY1YzU5MTE3Mzg0YTFiZjIzNjc1NWI4NmM3YmY0NzNhYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW5NZW1vcnlUaW1lbGluZUpvdXJuYWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1MzE5LAogICAgICAgICAgICAic2hhMjU2IjogImIxODg4ZjE2ZDUzOTM0ZDc5NTBhMTZjMjdiOTQ1MjcwNDBlZWZlMmM3YjM0MmQzYzY0NTIwMWRmNWM0NTJmYjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0ludGVybmFsUHJvY2Vzc091dGNvbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ODNkYTQyOGRjZWYxZTg3OTYzN2E0MGIxZDVjZWIxYjNhMDAwZDNjMDU5NTVhMTlhZGI0NGM5OWY2MTM1MDdhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9PcGVyYXRpb25Sb3V0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzQ0NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2MGIyNDAzNWYyNjBiODc2NjJiNDFkNzQ3MjVkNmRlODM2ODhiNWI5M2EyZDViOWU3Yjg0OWZiYWNkM2FlMWJjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Qcm9jZXNzRW1iZWRkZWRHcmFwaFNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjUxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYTlkODhiOTI1MDk4ZTlmY2U3NmUyMGNhZWJiOWI5MGM3Y2YyOWUwMzJiMGI1MjRmZjY4YWNjMGYwNDI5NWUxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Sb3V0aW5nU3VyZmFjZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI3NzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGUwMGRkZDY2OTE5NmViZjIwMzYyNjQ4NjFkZjgzZDUyZmY3ODE0Zjc3ZThmYWJjZmQ0OTYyMmEwNjc4ZTBmNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU2VxdWVudGlhbERyYWluQ29vcmRpbmF0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExMDI2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNTYwOGViMjUzZGI2OTJiYjhjMzdlY2FjNmVhZGRmZTE2ZjdlZmFkY2UzM2QwZTFjNzkyYWYyOGZiN2M1NDU5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Tb3VyY2VTdXJmYWNlSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWEyM2IzMDU0NTVmYmUyMzgxZjNmOThlZmYwNDk0ZWQ0YmEwYjBmZTVhY2M1MDNmMWNiNTlhYWQ1YTc0YmFlNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVPYmplY3RTdG9yZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGU1ZGFjMmViYTFmYWZkYmIwNzFlYzE3ZDcyOWFlMzI3NDE4MGQ3ZTQyYzIwMWQ0ZTBhZGIxMTE4MDMzNDQ1ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVSZXF1ZXN0RW50cnlGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDgxMmE2MjM4NTU1Zjk2MmIyZTQ5ZDMwNjdjNjBjMGUxNjFiZmIwYTM4MTRjZWRkYTg4Mzk5YWM5ZGI0MzE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQWxsVGltZWxpbmVzQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTI1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMDM2ODhjMmQyNTQyOWU5ZWEyNmUyOWQwNDJjY2NmNTFhNjJlYTM0MDJjOTFiM2ZlMmVkYjI2M2JlZjYxNzNjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQWxsVGltZWxpbmVzRXh0ZXJuYWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg1NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTNkZTI3OGViNzZlZmJhZGEzMjY3MzllMzMwNjJmM2RlMmViZDE3ZGUyZGI0OWI1NGY4YmQyZjM4YTdiMzNiZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0JsdWVTZW1hbnRpY0lkZW50aXR5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NDIyLAogICAgICAgICAgICAic2hhMjU2IjogImJmNzc2OTU3ZTZhNzhiZjEyZWFmNjBlMTY3YmJhM2JlYjc1MTUxYjY4NDViNmQ5ODk5MmM1OThiYTYxOTQ5NzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9DaGF0V29ya2Zsb3dPcGVyYXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWU4YjYwZTEwNWM0ODExMmY0NTMzNWEzMzc3NGM4NzAzMTAwNDFmMzE3MjUyMzZiMmZmN2E2NTk0Mzk2MzY5ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0NvbXBvc2l0ZVRpbWVsaW5lQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTgzNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwY2I2MDhjZjZmN2E3ZjFmNzQyNzBhY2M3MDczMmVhZTgzZjQxYWFkZTdjY2ZlZTY2MTNkOThlNWJjMjYwNjA4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29tcG9zaXRlVGltZWxpbmVFeHRlcm5hbFN1YnNjcmlwdGlvbkZ1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODI3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZWNiMGFiMWQzZWY5ZTdkYTgyZmFjMWY2ZDlkODczZTJhOTZiNzJlMGY5NjIyNTRlMWJmMjJkYWQ0NjZkYjM2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uQmV4SW50cmluc2ljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM0NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjMzMDQxNDUwYjJiNGNlNDBiNGZkYjJkY2QxYzFjZDlhNmZiYWMyZTYwMjVmYjk4Zjg3YWRlZjUxNzJiYzdkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uQ3VycmVudFJlcG9zaXRvcnlJZGVudGl0aWVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MTk5LAogICAgICAgICAgICAic2hhMjU2IjogIjc1Mjk4Y2EyYjk5YzdjZDQ1OGUwYTk2OWZiNGYyYWUzMGI0M2U0MDk0YWRiY2NjZDk3OGVjZTE4YWVhYjZlNTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25FdmVudE5vZGVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzMwNywKICAgICAgICAgICAgInNoYTI1NiI6ICI1ZWZmMTU2N2NlZjZkMTFiYWJhMTZmZGRjNThmMGE4MGQ3ZjEzMmI1ZWYyMDIyMTMxNGUyN2VjMzM1MDI4ZmM2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUHJvY2Vzc0hlYWRlckJyaWRnZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiOTdiY2ZhYTc5NmI5MWU4MjQwYmM0MDBlNGMyZmM3ODU4NDExZTAzYzg5OGRmZDA1OWM1NWU3OWQ3YmNhOGJmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUHJvY2Vzc29yT3B0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc0MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI3ZmZlMjU1NzY1MGFkOTgxN2YyNDcxMTRiZTgxMGM5NGQ1N2E0OGY3ZjljMGY4MDdkZWRjOTQ2NDllZTRmM2ZhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUHJvY2Vzc29ycy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ4MjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDU0NzliZTI5ZTkwOTQyNjMyNzQ4ZjU2NjIzOWI5YTAyNjkzYWY3Nzg4N2UxMWYyN2Q3NmJkM2RiOWNmYTNkMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVHYXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ3Yjg0OTcyM2QxZmQ0NjU5ZGMzN2U1YTk2ZmVjMmE4MGEyOWFlNzYwMzdlZmY1ODRmMGVkMjIwMmVkYmM3MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVMaW1pdHMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzViNTdiZjY4NjM5OTM4NzU5MTU5MTZjNjM4MGRlMmJkMGU4MDc1NWIzOWI0OTAwZjViZTI0ZTkxZTg4ZjJhYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVSZWdpc3RyYXRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODcwLAogICAgICAgICAgICAic2hhMjU2IjogIjUwNGUzNGQ4MGMzZTlkYTczZGQwYjM0YTNjNGI1NGI5ODNiNzgzZDBjNDk4NWE3ZjEwNWMzZWUxNWE5MWQ5N2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25TZW1hbnRpY1R5cGVJZGVudGl0aWVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTI3LAogICAgICAgICAgICAic2hhMjU2IjogImI1ZDYyYTdmZmYzYzU3OGNkZTM2MWE3MDc5MDYzYzRiM2NjOWEyMGY1NDcwNGQ0NGE5ZDg3NjViMDcyZDY1ZDkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9DdXJyZW50UmVwb3NpdG9yeU1hcmtlclByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTA1LAogICAgICAgICAgICAic2hhMjU2IjogIjNkY2E0NTlmOTFhOWI0YzUxOTRmZGEzNDA2MTdkODJlYjIxMjk5NDA2OTgwMTIyYmM0Yjc0NWNkYjM2NzlhZDMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9IYW5kbGVyQ2hhbm5lbFJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDE0LAogICAgICAgICAgICAic2hhMjU2IjogImIzYTlkODM4MjE2MGFlNTRhYjIxNmZlY2VhMjRkNDkzNjU4MWJiZTQyYTc5Njg0NTYyODc5M2ZiOTY2OGI1Y2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyOTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTc2YTMxYzljYTQ0NWM4YmEzZmQ3YTJkZmQzOTZhZTg2NzIzMGYwOTEyZmRhMWVmOGNlYWY4Y2QzNTk2MzIwMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL09wZXJhdGlvblJlcXVlc3RNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODcwLAogICAgICAgICAgICAic2hhMjU2IjogIjkwNjA1YzFiNjcwMGUzYmRmY2Q2MDdjMjA2NWI5ZGJlMjExYmI3MmJmM2RlMzA3NGVhNDYzNGFmZDRiZWJjODciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25SZXF1ZXN0Um91dGluZ0Z1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTg1MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwNTYzYzYzNmRlMzM5Nzk2OTczZTc0ZGRhNmExNzI3MmY1MzhlY2VjMTI1ZGEwYjNmN2RmMDVkZjMyNzU2YTExIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93RXZlbnRNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODU1LAogICAgICAgICAgICAic2hhMjU2IjogIjIzMjJjMmZkZDJiYzgwYjg1OWIyNjdjYWUxMTM5YTAzZTBlZGYyYzBjMzJkMjhiNzM4NGRmMGE4Zjg2ZmE2NDYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9TZXF1ZW50aWFsV29ya2Zsb3dPcGVyYXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3ODMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTAxZjVlOGJjN2E4NGY0MDcwNmNlNDg5NTJjY2I2Yzk1YjA1N2FlZWQ5YzgxNjM0NTA1YjI3Y2U3YjRjNmY2YSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd1Byb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjcwOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMWM5NzM3OWI3MmQ0NzA4MTFkMjAxZWUxMzhjYTFiNmY1NDE2NTczYTdlODM2ZDY4NzI4M2Y1MjFlZjM1YTJkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDY1LAogICAgICAgICAgICAic2hhMjU2IjogIjhhMTY2MWNmMzU3YWQ1ODU4MDRiMzMxZDFhMTk1NGExYWI3OTlkNTc2ZDdiMGY4ODM0ZDNhOThjZGJmNjQyYmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZUNoYW5uZWxTdWJ0eXBlUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDc2LAogICAgICAgICAgICAic2hhMjU2IjogImNhNmRmNTVkNGRmM2VhNzUwMDM4NTQwZDVlNGRhNTMzMTc3NDlhMmZhNDRhNTk4MDc3OTcwZTkzMTUzNWY0NTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZUV4dGVybmFsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NjkxLAogICAgICAgICAgICAic2hhMjU2IjogImVmZjI5MWIwZDUyNzk5ZTYwN2Y2MzgyYTM0YzJmNTE5OWI5ODY1ZmExYjU2MmRiY2I3NTBjZTJlYzE1NjFiMGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZU1lbWJlclN1YnNjcmlwdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmMzYjRlYzYzNzM1MDVkYThhNmJlMzIwMjc0Yzg1YmM3M2RiZDk4NDNmNjBiYzVjZDZlODA3ODBkYjk1ODRiZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lUHJvdmlkZXJTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDIzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDg2MDI1OGU0NzU1OTc5NzMwM2E0NjRiZGM2NGQ0YzNiZmQ1NDUzYmFjOGE0MmJlM2VjNGZiN2IyMzgwMWJhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVTdWJzY3JpcHRpb25Qcm9qZWN0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDI4NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1Yjg5MzgyZmEyNjI0ZGVhYWViMzg1MThkYWIwMzRiOTU4NDBiYWE5MjQ5YmE1MzQ1MmMyODAzOTAzNGM2ZGU2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFByb2Nlc3NpbmdNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MzUyOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxN2JjZDczZWRkN2M0ZjcyYzA4OWYzY2IyN2IyYTJhOWRhNWRjYmY5NzY3MDI2NTM3YTIzYTI3ZDg0NWFjNjhjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFdvcmtmbG93Q29udGV4dEZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwMzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODI5MTZiMTg3NDliM2ZkZjMyYTU3OWZmOTdjMDI0N2Y1MjhmNzZhYjg5MGY2ODZmMTZlYTY0ODU5MjJkNzZhYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhXb3JrZmxvd1N0ZXBDb250ZXh0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIzLAogICAgICAgICAgICAic2hhMjU2IjogImQ1M2IwMDdkMTg0YjRlOGNiNWNkYzYxZTMxOGYwNzJlODM1NWI2MDE2YjQxNzg3MWMxOGE0NmJkMTUyOGVhNzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNzQ4NDIzYzRiYWMxODU0OTg1NjA5MzdkN2I5ZmFkYTM5MTNjN2ZhOTRmZTdlNzliMTE5MGRhY2JiMDA1MmZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Njb3BlZFByb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHRCZXhEb2N1bWVudFZpZXcuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MjU2LAogICAgICAgICAgICAic2hhMjU2IjogIjUzZDdmZTcwNTk4YjNjOWIxMjE0ZWM5NWI3MmIwNTlkZWM4NDZiOWMwOWI0NTkzMjQwMTYzOWZkODEyNTY5ZDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvbkJleEludHJpbnNpY3NTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTE4LAogICAgICAgICAgICAic2hhMjU2IjogIjViMjhhNWVkNGE4YTkwZTY0MmViZjYzNWMzODQ5MTJiMDQ0OTY0ZjVmMzI4Y2EzMjEzNjVjNjI0ZjJlMWYwMDciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblByb2Nlc3NIZWFkZXJTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NTY2LAogICAgICAgICAgICAic2hhMjU2IjogImY1N2FkN2FhYzY0OWQ5MzJlMTQ5MTZiODBjMDVlN2YxNzlhZThmOWMyYzI3MWVkZGFlOGM0N2M3MTMwZWI2YTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblJ1bnRpbWVHYXNTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzUzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyN2EyODdmMWQ1OTZjM2VjOTAwMjJkMjg0ZjM0ZDFiZjBiZTU0NDcyNTgxMDE3MzIwZDcxNDFhM2ZiZDA3MWM3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25SdW50aW1lTGltaXRzU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjZkMzc5Zjk2YzVkODBlOTNlYjU4YjNmMTRkNDk1ZTIxNGRjNjAyYzNmZWU1YjI1NzZlMTIxYjAyOGIwZWNhOGUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlRGVmaW5pdGlvblJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDM1LAogICAgICAgICAgICAic2hhMjU2IjogIjNjZjc1NzkxZjQ1Mzk2YzQ4ODE3OWE3MTE1Y2EwMjY0OGUyZGFiMmU3MWRlMTdhY2E4ZWZhNmJkZDZkZmRmYzkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlRWZmZWN0UGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MWE1MzA0NDQ2NDk0MjhjZjU5ZDEwMjE5NGE1YmE0ZmVkMWVkMzdjNjA5MGE0MDg0MjI0NTNhMDgyNDU0YzFkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1Ob3JtYWxpemVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ZDJhNDI2NTJlYThkMDRiYTRlMjk2MDBiN2FiZWI2ODNkZGViNWYwNGY4NWRlMmY4OTY1ZjA0MGI2YTM4NWE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1QbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjc0MTE5NDNjNzMyNTBhNTVmMmUxODg3MGJlYjliOWNiOGFhMzk2NmY0M2FkYTRkNjM5MTliOWI5YTczYjM5ZDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUHJvZ3JhbVBsYW5DYWNoZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODA4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYzM0ZWY3NmI3MTU2NDNlNjFlYzdjNmQxODM5YmIwODE5ZWE4MTkyNmM2NTA1NDY3OWMzZTAyMzA4OGJmN2FjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVJlc3VsdEVtaXR0ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMzU1LAogICAgICAgICAgICAic2hhMjU2IjogIjM4Njk2OWE4YmI4ZThhZDZkYjYwZjZjNTQyMDBlNGY4MTU0NTA3NTg1ZTk5MzgwZTU5MjY1YTVjOGM1M2M3MzIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUmVzdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI0LAogICAgICAgICAgICAic2hhMjU2IjogImUwYjlkOTljZDBmOGYyMjcwMDMxNjc3YWI1NTgzMWVlNGY3YjVhZmYyYTRmNTYzYmYzNTA1YzM4YzcyZmUzMTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlU3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDUwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMmRjZjYzOWVmZWU2NTJlMmJhYWRkNTQzMjY4MDlhOTM3N2U0ZWI0NDYyNzZkZWI5YWMxMWZkZTk0NWFlYmY4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvRnJvemVuTm9kZVV0aWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM2NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjJiYjgzMzZiNTU5NDY3MDEwMTRmNDNkNTBjNzRjZmQxNWI2NTEzODlmNmE2ZmJiMmMyNjg3MzMzYjdjN2E3NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L05vZGVVdGlsLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzM4LAogICAgICAgICAgICAic2hhMjU2IjogImQ1N2QxOGNhYzFlYmM5NTM1NjJjYjcyZTY3ZTZhYzU5MjI0ZjA0NGQ5MWIwMzk1NTU1OGYwZDRkNzIyNTgzNTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODQ3NywKICAgICAgICAgICAgInNoYTI1NiI6ICIxZmJhOTZmNGJkZTFmY2RjNzIzMjlhNjUyOTg5NTI3MGM0YjMzNjBlZTRiNjc2ZDFiN2Q3YTNlZjllOTEyOGRkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbkNhY2hlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Mjg4LAogICAgICAgICAgICAic2hhMjU2IjogIjRmYmI5OWQyYjI5NTA0N2Y1NWE1OTFkZWVkOWZkODIwYjg1Nzk5NDE2ZGM4MjM1OTNmOTFiNjgwMzkzYjU3YjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dSdW5uZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMTM3LAogICAgICAgICAgICAic2hhMjU2IjogIjg4ODIwNWMyZmI4ZDBmYjlkMjk0NWM4ZDgxODVhYmJlY2NmYmQ1NzdiNGEwZDhlMmRjMDIxODc2NjlmZmFkMTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TdGF0aWNVcGRhdGVQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5ODU1LAogICAgICAgICAgICAic2hhMjU2IjogIjU3MzlkZDRlNWQ2ZWY0NjYxNzk0MjQyYWZjNmUyMjkxNzA4ZGMwYTYxY2IxNDYzMGExNjQyNzUwZTc4MjlhZTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TdGVwRXhlY3V0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM4NDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDZkZjQ5OWUwOTBiN2MwNzU4ZDNhODAyYzg1YWUyMWZhZGU0ZWYyYWRkOWY5MWI4ZjBkZjM0YTM3ZjA0YzU4ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1Rlcm1pbmF0ZVByb2Nlc3NpbmdTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2M2NTI1ZGRlNTViYzU4MThiNzcyNTU1NTM3YjgwNWRkNWUzZmE4NDc3YjRhZmFhMDExNTNmZjI4NDhlMWYyYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1RyaWdnZXJFdmVudFN0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDAwOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNGYwN2FiMGMwYmEyZjM5ZTdhOGM2ZjQ1ZTM4NjY0NjY3MWRmYTg2YWI4ZTI0MDVmODFlZDRmYmMxMDQ4YjkzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvVXBkYXRlRG9jdW1lbnRTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNzAwLAogICAgICAgICAgICAic2hhMjU2IjogImU3YjVhMjI0ZGIyOGYyMThjYjM0NTM3YzI3MTM2MWQwZmJjNzAxNDI5YjdmMDc2MWYxNjMzMGQzMDA0ZjYxOTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0JleEdhc0xlZGdlckhvc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MjA4LAogICAgICAgICAgICAic2hhMjU2IjogImFiZWU2NDA1ZjhkOWI2YTAzOTQzNjYwZmZkMDY0NzY5NGUyNDJmOTA4NmFjZjRhYjNjOGQxNmIwMzE5MDdiNWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0V4ZWN1dGlvblN0YXRlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MTA3LAogICAgICAgICAgICAic2hhMjU2IjogImJiN2MzMDM4N2UyZTEwMzU1OWQwMTBhZGZhZTgwNTg1NDE3ODk5ZmY2MjQ3ZmRjNWUwZmM2YjRmOTI2YTFhY2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1BhdGNoRW50cnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyMjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDlmYWUwYjMyZDIyMDkzYmMyM2U1M2FkMGIzNzkxYzkxMzBkYjdmMzcxNzUwYjdhNzcyYmVlOGY5OGRhYTEzYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93U3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDk5NWY1NGExYjg1Njk2OThjZWM3MjY4NDBiMGZlYjkzMDcwNGJlNDY5OTg2YzA2OTc2YzM1ODdlMDIyMTNiOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93U3RlcFJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNywKICAgICAgICAgICAgInNoYTI1NiI6ICIxMGUyOWJkZjZmOTA0NTVhNmNlZTVlMGMzZDNhNjJjYTBmNTJkYjI4ZDQyZWFhMGI5ZTMyYTAzYWYzOGVkNTBkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dTdGVwVHlwZVByb2ZpbGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyODIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWYxNzg1NjY3YjAwOGFkMDQ2OTkyNTBlNTBjYTgyYzc0NGVjM2VhZDlkNGNlMzE1MmIyNmZkMzExZDljNTQyMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvY29vcmRpbmF0aW9uLWdhcy0xLjAueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzNTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWZjZGMyMjU2MzE1MmNkZDhjYjM3ZjllYTczOTQ3N2NlZDVmN2E5ZTMwODhhZWNhZjI0NjgxMmMzYTNjNmJhYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkQ29sbGVjdGlvbkFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NjczLAogICAgICAgICAgICAic2hhMjU2IjogIjlhZmNhZWJjYzJhOGE4NGIzODBjNjVkMWI5YWQzYTRhOWVjZjczM2I2MTY0NDE4ZjFmYjllNzUyNzEyNzE0ZmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTGFyZ2VIb3N0UGF5Tm90ZVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTAyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOGUwYzY5ZjUwZDE2MmRhNDZiMWM5NjE5M2ZiY2YwZmNmOGQ2OTI4MmNmODNkYzc4MjI1Yjc1NTA3NWM0ZGYxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05iYUhvc3RMaWZlY3ljbGVDb252ZXJnZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNzA2LAogICAgICAgICAgICAic2hhMjU2IjogIjZjOGQ0ZjZjZGI1ZGQ1YzBkODNiMDRiMWQ4MmJjYWIzNDc4Njc3NWFhNDY0NThkZjVlMWRmZWI0MjBjMTc3NmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmJhU2hhcmVkR2FtZUxpZmVjeWNsZUFjcm9zc0hvc3RzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ1ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjEyYTUxMzliYjk3YjRjZGE3MzhjNGU0ZTNmMzk1OTYxNzI3Njk0OWRkZmJkM2M5NjczMzg5MDgxZDg0MzJhOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWREeW5hbWljUHJvY2Vzc0VtYmVkZGVkQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2JlMjk3MTVjZGJjMjZjNjI5YzNkZGEzMzgzNDA1YmUwZmNiNGNjZmE5MDdkN2VkMjM0MDk1ZTUwMzBmODU0YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzQ4NDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2JiOTM2NDM1ZDEzYzRiZjU2NzhmYzZhZGRlZGJmNjI1ODAxYTRlZGM1MmM0NTNjOGE0NDFjYWExYTJiZjhkMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEwMU5iYUZsYWdzaGlwU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NzUzZmFlNDJkZDM4MmQyMTU1NjA1NzExM2JiYTU4YmE3NjJmZTVkMjRjZDMzMTA2NDA0NGIxNTg5YjM5NjgxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjMyMDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGYwY2FhOTQ1ODI1NGIxZWI0YWRhMmJlNjVhY2JhZGMwYWI3ZWEyNzYyYzY0YTEyODg4MzI0YjdjMjVjZjNjZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UaG91c2FuZERvY3VtZW50TG9jYWxpdHlTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1MzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTI1MTlmYjY5MTA4ZGEzMTlhOGFkYWNhOTE1MjU3YmNlNjRiYzA1ZGI5NGE5NzA0NmUzYTQyZjQ4OTcwMzQzZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XYWRvd2ljZVBheU5vdGVBY2NlcHRhbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE2NzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2YjhlZTUzYzZjMzI4YzU5ZGMwMDkyZjM3NmJhNWQxNjY2MmRkOGE0MjA4YThiOTQxNWRkN2E0YmRhMmEyOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbkVuZ2luZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU2MjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTQ3MWI0NTEyZTk5MDFlYzYyNDMwMzEwMzE1MmJmOGZmOTBjMzBhNjg4YzhmMWI0YzU2YWUzNzI1N2UzZTJmNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50UmV2aXNpb25Jbml0aWFsaXphdGlvbkNhdXNhbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ3NTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGI5MmQzOWYyMzNmNjc1ZDRhMTQzMDM5YTRlZmIxM2E5MzUzYmJlZTk4ODQ1MDIwNmYyMTA2ZmM4Y2FmMTdmMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1B1YmxpY1ZhbHVlQ29udHJhY3RUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MjYxLAogICAgICAgICAgICAic2hhMjU2IjogImFhYmNiODViZDdlMDZiMmJhOWUzMzM5ODgyZmI2YmRiMDQ4MmE5MDhkNzQyNWJlYTMyZTg0ZTM2N2UzNzI0MGYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NhdGNoVXBCYXJyaWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNDEwMzA1MTk4ZDM5NWE1MWRhMGM0MTZkZDk4OGMwZjhjZTdjNzgxMDAwYWEzMDNmOTM5ODE2YmRkMWU0YjJmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudEFkbWlzc2lvbkNhdXNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzcwNCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0N2RiMmQzZmNmNTAxYzgzMWVmYjQ5MGIwMWU2MWEzYzc2MTM3NWM2MGJiZTUyOGFkOGQ4Yzc2NzJhYzNkNmZiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFNlc3Npb25TdGF0ZUVwb2Noc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg0NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjg2YzY5NDBmZmI0NjY1OWIwNjc4MzIyYWQ5ZmNlMjE5ZDViZTgyZTM5NWE4NmZlNGQ4ZjgxYWFjYWU4ZWY1NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRUcmFuc2l0aW9uUHJvY2Vzc29yU3Vic2NyaXB0aW9uRGVsdGFUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MTM5LAogICAgICAgICAgICAic2hhMjU2IjogIjBmODBmZWRjNmQxYjdiY2RhYzY4NjE4ZGNlNDVjOTAwNTFjMWUwZmFlYjZkZWMxZTIwNDBlYTNhYmE5NmJlODgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hJbnB1dEV2ZW50RXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTI1LAogICAgICAgICAgICAic2hhMjU2IjogIjVlMzk0MGI3OTk2ZmQ5OWQxY2IwMTNiMmMwNzBjN2M1MGQ2YzMxNzcwMGU1YTEwNmFlOTVkMWQ4MzhhNjkyMWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hJbnB1dEluaXRpYWxpemF0aW9uQ2F1c2FsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzI2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjOTBhYmUzNjk4OTQ4MzA3OWQ3ZTk3NGQ0MzAxNzljOGIzM2E5YTVkNTlhMmZmMGUxMDAwNjBmNDMwZGI3NGE2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRpbmdCaW5kaW5nQ2Fub25pY2FsT3JkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjQ5LAogICAgICAgICAgICAic2hhMjU2IjogIjA4MTljNjc4NzkzZmY3ODY5NjZjNDhkNzg2MGNhMmJiMTdlOWVhMTcxYjMwMDBkODljNmE1ZTBhYmY1ODU4YzgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VuZ2luZU1ldHJpY3NUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NjA2LAogICAgICAgICAgICAic2hhMjU2IjogIjA1MDM1NmRmNDYyOTUwZWExYmRhOTRiY2RlZjhlZGRmZWQxOTM2ODBmMjMwYmUwODUyMDNhNjA0YjE0YzQ5YjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0luTWVtb3J5VGltZWxpbmVKb3VybmFsSGlzdG9yaWNhbFN0ZXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjY0MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyZmY5MDY3ZGQzMzk5Yzk5MzZlZjQ5ZGU5YjMyM2RiZDY1ZGZiMzJjYjIwOGM2NWNiMjRkMTE3MDY0OTA0MWEzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9PcGVyYXRpb25Sb3V0ZUluZGV4VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA4ODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ0NDliMzViZDE1NTcxZmI4ZDRhYzI1YmQ0NThhZmFhMjMxYTYzYWRkMDQ4YjdhYTA0OWI5ODg1YzU4MjQ0ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0VtYmVkZGVkR3JhcGhTbmFwc2hvdFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTBhZDdiNjc4OGMzZDFkNzQwNmQ5N2M2ZGVhMDlhYTZkYjFiNTEyYzA0NjFlZTQ4NTRhYjZlNmQ2MzEyYzcwMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU291cmNlU3VyZmFjZUlkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg4MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDhiZGFhNTkyODViODE0MTA0NjUzN2RjOTg2OTBkMTk4MWJhMTYxZWE4MGNlZmFjNmQ5NjJkYThjODM5M2JmYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVPYmplY3RTdG9yZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUwMDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmI2Y2IzNTk5YTI5YmZhY2UzY2M3YjYwN2UwOWQ5YTRlOWE0OGExM2NiMjI0YmUwYmVjMmZiZjk0NTcyYzQ0OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NvcnNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDc2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMDk1NjJhMjFlZjExNzAyMmM4YTU3YzEyYjQ0OGRkOTc2MGFhMmM5YmIwMWYwMjdmNWM2Y2E4ZGIyM2Q0OGY2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZVJlZ2lzdHJhdGlvbnNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNjI3LAogICAgICAgICAgICAic2hhMjU2IjogIjI2MmFkNDk3NTlkNDI1MjM0NDM1YTJlOWYwNzQ3YWNiYTYyNWI1ZGZiNGM3NmZkZDgxMTQxNGM4OWNiNDMxODYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25UZXN0UnVudGltZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc4OTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGJmNGZlN2YxNWJjNjdkYTkzZjY3MTkyMTNiMmY3NGExNmFhMjgxMTQyZDIxMDQzM2UxMDM5M2U5ZjQ1YzBmYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0N1cnJlbnRSZXBvc2l0b3J5RXhhY3ROb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY1NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWY4OTczMjBkOWI1N2M2YjU5OTA5MDcwMmQ3ZTQ2Nzk0NjI2ZjExYTQwZDUxMTI1ZjJkMzcyOGRjYTIyYjllOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlbGVjdGVkV29ya2Zsb3dCb2R5TG9jYWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDEyLAogICAgICAgICAgICAic2hhMjU2IjogImIwYTM0OTc3NGJlNDk2NTAxY2QzZjZhNGVkYmEyNDA1YTRhMWYxMjlhMTFhMzk3ZWFjYjQzYzJlYjAzMzQxYjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZUNoZWNrcG9pbnRTdWJqZWN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTcxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMWI0MjcyMzc3MmZhMTI0NmI3MDNhNWIwOWM4ODIwMzQxMjFkY2I2ZDA4ZjUzMDBlZTQ5MDJkMThlNWM4ZTM2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVQcm92aWRlclN1cHBvcnRGaW5hbFNlbWFudGljc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NDExLAogICAgICAgICAgICAic2hhMjU2IjogIjhlNTA3Yzk2NDQ4MzA4N2Y5NmZhM2NhNDUyMjllZjk0N2ZmYjZhNWMxNmQ5MDgxNDE5MWVlNTRhMWE0MDBmYzgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVN1YnNjcmlwdGlvblByb2plY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzE1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYzU0Njg2MmYzNDY2ZDU3ODQxNzQxMWVlZDM4NmU3YzQ3NGY3MGVmYmRjODE5MDczYjNkYTgzZTY1ZGZiYzFjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFByb2Nlc3NpbmdNZXRyaWNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgzNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDI0ODA4MjFhZjM5MTMwMzU1NWZhN2ZmNzFkMjViZTBlYWE3N2U1NWNhZjgzY2UyZjNlNzBlY2E1ODg3YjY1MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9Qcm9jZXNzaW5nRXZlbnRJZGVudGl0eUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTU0LAogICAgICAgICAgICAic2hhMjU2IjogIjZmMzFkOGI5MGUzYjY4NGUxMzczZGY1ZDQxMDIwYTYyZDk3NzEyYTVhZWZjNWExMGQ2MDAyYjhiNGY5YjNjMzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5NTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjcyMDZlYmQ3NWI3MjYzYTM1NmYxYmFkMzRiNzNjYmNkZjI3ZTA2MzRiMWQzNWU0NmMwZDc5MDczZWU0NzVkMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9TY29wZWRQcm9jZXNzb3JFeGVjdXRpb25Db250ZXh0QmV4RG9jdW1lbnRWaWV3VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ0ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDdhMTY0NzhhM2U3OTVmODE3Y2ViZmNkOGNmOTVlNTJkOGVkNjEyYWY4MWVkMDU0M2FkYzk5YzQ4MGNhZGFiYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVFZmZlY3RQbGFuVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc5OTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTljYmFhYTE2YzUwZThiY2RiMjhmZTlhZDYwYWQwOTZhMTBiOTZiNTlmNmQ2MzAwYTQ2NzQ4YzMyOGU0MTYyNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtUGxhbkNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg0MjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGZiMGE3ZDNmZDdhMjQzNzc3ZGJkNzFhMThiMzUyNmFjODAyNTBhNTY1ZjM5ZTViZWZkOGUyMDg3OTY1M2U3NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L05vZGVVdGlsVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU1OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlNTNjYTY1NDE0OWFiYWY0NmYwYWExOWE5YjEwZjdmNjFlZGU3ZWY4OGE1MDNlNTA3MTJhYzU0OWFjYTA2NzNhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbkNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY1MjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOThmNTIyNDQ4ZTQ3YmViNTY5MjgyYTAzNjJhMGIxMzk4MDgxOGY0YmE2MTI2MWQxM2FkODU5NTM1ODExNTc3OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1N0YXRpY1VwZGF0ZVBsYW5UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDMwMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYzg3ZTMyYmIxYjhkNGE3ZmViMGRjOTJmOTY3YzkzZWVmYzgyMGU5MTcxN2IxYmRjYzc2OTZlOWJjMmU5M2RjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dCZXhHYXNMZWRnZXJIb3N0VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ0YmM1Y2YyYzFhN2NiZWZkMTI3MTI1MDg4NDJkYzFhNjI3M2Y4MGEyODY5MjAzN2YyYzJlZWM2M2M4MjRkNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93RXhlY3V0aW9uU3RhdGVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NDI4LAogICAgICAgICAgICAic2hhMjU2IjogImJkZDNkNmQ1Y2E2N2U5ZjhiZTQ0MTU3N2E1NzY3MDNlMDQ0MWI3ZWM0ODQ1NDMyZjlhMjM0MWY3MmQ2ZmU0ZTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1BhdGNoRW50cnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDAwLAogICAgICAgICAgICAic2hhMjU2IjogImEyMWM3ZTI5MzQ0YjJhMzZjMzhmNzkxYWY0MDM1ZDk2YTMyMDcwZGQ1OWJkMWZjZWY2YmIwZjYwZWJkOTY3MzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVXb3JrU2Vzc2lvblRlc3RTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmRkZTMzMDIzNzZlZWQwZTg3MmQzMWY3ZjkyMDQwYjc5ZjUzZmFiMjkyZDMwNTBmNzY4MTFkYmQ3ZmQ3NDVmMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0Rml4dHVyZXMvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Db29yZGluYXRpb25UZXN0Q29udHJvbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzAxOCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MTM1ZDdlNjMzNTA5MTI0MmFiYTQ0ZTYyNGZlZmViMWJkMDdlYTBmZDkwMjMxMTFlNjAyZTM0OWI3OTBkYmE4IgogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInNoYTI1NiI6ICI3MjVhYTBjMzk3NDkzZTU1Yjk1YTE0Y2Q3NDE3OWRhZTM5ZDhhZDQzYjEzMTA4NDFjYTdhYzI1MDU3Zjk5ODA5IgogICAgICB9LAogICAgICAiZGlmZmVyZW5jZXMiOiBbCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiLmN6LnRvbWwiLAogICAgICAgICAgImtpbmQiOiAiQURERUQiLAogICAgICAgICAgImFyY2hpdmVTaGEyNTYiOiBudWxsLAogICAgICAgICAgInByb2plY3RTaGEyNTYiOiAiMmE0ZGM1NDY0NzYwYmE0MjllOTkwMTI5OThiZTIwNjgzODRhZWZiZDFkOTI2NTcxZjQ1ZTlmMjRjMWRjYTQxNyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZSIsCiAgICAgICAgICAia2luZCI6ICJNT0RJRklFRCIsCiAgICAgICAgICAiYXJjaGl2ZVNoYTI1NiI6ICJiZThkYmFkYmQzYWI4YzMyYWY5NjA5Y2Y5N2IyNzdjMzllNzNiM2UzYjQxNzY2MDQwYTc2ZDNiOTUzODM3Y2E3IiwKICAgICAgICAgICJwcm9qZWN0U2hhMjU2IjogIjM1NThmMTIzYTFjODNjZDUwNDQxZjk0YWYzMTY4MmM2OTMxYzFkNDQwNzRiMjBlNjkxYzljNzRjMjFjMzJmMWIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAia2luZCI6ICJBRERFRCIsCiAgICAgICAgICAiYXJjaGl2ZVNoYTI1NiI6IG51bGwsCiAgICAgICAgICAicHJvamVjdFNoYTI1NiI6ICJmMTJlODkyYzIxM2JiY2Y3NGQwOWUyYjcxYmExZmU4ZjczMzI3ZWVhZDA3YWQzZmZkYTNkMzE5N2E3NGI1MmYxIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RFbmdpbmUuamF2YSIsCiAgICAgICAgICAia2luZCI6ICJNT0RJRklFRCIsCiAgICAgICAgICAiYXJjaGl2ZVNoYTI1NiI6ICJlNzMyOGY1Zjc0NGQ1Yzk5NjFhOWY3ZjMwNjgyMDAzMTNjYzVkZDc3NGExOGY2NzVhZjgxMjM0YzhlNGIyMjliIiwKICAgICAgICAgICJwcm9qZWN0U2hhMjU2IjogImJmMjgyZTkyYjBmODYxZDkzNTJlYjJhYzdlMDUxODNjMjUzMzdiYjM0NjJjZDU1MTUxYzFmMDQ1ZWJkOWQ0YzAiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9wbGF5Z3JvdW5kL2ZpdmUtb2NjdXJyZW5jZS1pbml0aWFsaXphdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgImtpbmQiOiAiQURERUQiLAogICAgICAgICAgImFyY2hpdmVTaGEyNTYiOiBudWxsLAogICAgICAgICAgInByb2plY3RTaGEyNTYiOiAiYjFlOTRjMDM5ZDBmZDBkZjcwYjBjODAzZWJlOTIxYTI5MGQxNTkwYmFjNjlhOTA3M2ZlNDkxMGNhODkzOWI2YiIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICJraW5kIjogIkFEREVEIiwKICAgICAgICAgICJhcmNoaXZlU2hhMjU2IjogbnVsbCwKICAgICAgICAgICJwcm9qZWN0U2hhMjU2IjogImNiYjkzNjQzNWQxM2M0YmY1Njc4ZmM2YWRkZWRiZjYyNTgwMWE0ZWRjNTJjNDUzYzhhNDQxY2FhMWEyYmY4ZDMiCiAgICAgICAgfQogICAgICBdCiAgICB9LAogICAgImNhbmRpZGF0ZSI6IHsKICAgICAgInByb2plY3RQYXRoIjogIi9Vc2Vycy9waW90ci9kYXRhL2JsdWUtY29udHJhY3QtamF2YSIsCiAgICAgICJpbXBsZW1lbnRhdGlvbkhlYWQiOiAiNjk5ZjAxOWNiOWZhMWQ0ODRhMDcwYTVkNDZhMjMzNWZkMWNkMmRjZSIsCiAgICAgICJtYWluU291cmNlTWFuaWZlc3QiOiB7CiAgICAgICAgImZpbGVzIjogMTA5LAogICAgICAgICJzaGEyNTYiOiAiZDBkYWQ5MWZlM2MyZDU2MjdjM2IxOTAwNTQzYjJhODJjYzllYTMyM2FmYmI4NWFkMDYyNTZkYTRlMmNmMzEyNCIKICAgICAgfSwKICAgICAgImV4ZWN1dGlvblN1cmZhY2VNYW5pZmVzdCI6IHsKICAgICAgICAiYWxnb3JpdGhtIjogIlNIQS0yNTYiLAogICAgICAgICJpbmNsdWRlTW9kZSI6IHRydWUsCiAgICAgICAgImZpbGVzIjogMjI4LAogICAgICAgICJlbnRyaWVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICIuY3oudG9tbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1NywKICAgICAgICAgICAgInNoYTI1NiI6ICI5YTRkNjhhNjk5ZTc4ZmY2MDRjMmU5MDliZjZkN2VjZDgyYmQyMGI0ZjM2NWVhODVhZDY2NmQ4OGJiMWEwNjEwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzMTM3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZjNlNDk0YjlmM2Q4NTEwZDA0MDBiN2MzODgxMTNhNWI0NGU3YTg0ODY2ZDFmMjU0NWY0ZjBiOGVkNTUxMzRmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5sb2NrZmlsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYzNjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjlhNmUxOTk2Zjg4ZjA3YWU1NmU0YzcyMDQwOWMwOTI0NDBiYzZhZGExOTcxMjVhMGRmZWYwMTcyMmMzZTk0YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUucHJvcGVydGllcyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZDczZTkxMzE3YTU3NmJlOWZkNzA3YWQzNmNlZjJlZWI1ZmY1ZGQwY2JhNzExNjNkOGNjMzA4ZmE2NTgyN2MzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9iZXgtc291cmNlLmxvY2siLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDFjOTZjN2U3NmMxYTc1ZGQ2YTBkZmQwOTY1NmQ2NDQ5OTU3ZmIxNDRkZDM2M2Y3ODc1NmZjNTU2ODVkYjQxNCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcHVibGlzaGVkLWFydGlmYWN0LmxvY2tmaWxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkyOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiNGU3Yjc4YmNkN2FlOTI5NTliNjFmODgyYTBjNzYyYTU2NDg0YTU3ZDhkNmExMzg4YzFmZmFiYjk2MmJiMTU3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9yZXBvc2l0b3J5LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgICAic2hhMjU2IjogImZkM2IwNTUxMDhlZjY1YTdkNTRlMDljOWQ5YzYxOWMyMDhhM2UxZjc1MThiNmUxZjUxNGI3NWQ0MTYzN2ZmZjgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDg0NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAic2hhMjU2IjogImU3NGQ0ZjEwN2QyZmVhYjk4OWI5YTA0MWEwMmUyZDJiODU1NjdmZjQ4NDE1YzljN2FkZDVlY2MxOWFiZDE5ZjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2NTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTVhNWMxOTliYTAyMTg5YWU4YzQ2YTMzNDIyMzM3MWEyMDU5OWQ5YzI5OGVmNjVlNzU0MGVkZTRhM2Y3MmQ1OSIsCiAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzY3JpcHRzL3JvdW5kMTMtYWItZXZpZGVuY2UubWpzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjU4OTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsCiAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzY3JpcHRzL3J1bi1yb3VuZDEzLXNhbWUtbWFjaGluZS1hYi5zaCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMxOTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzZXR0aW5ncy5ncmFkbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDAxLAogICAgICAgICAgICAic2hhMjU2IjogImE3Y2E1ODUxZjlmNjYzMjA3MWNlMTJjZjBmNjIwOThkOTk1ZWM5YWMyNDYyZWUwMDNhMTg3YzIzYjYyZGQ2Y2IiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2NvbnN1bWVyVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2NvbnN1bWVyL1B1Ymxpc2hlZEFydGlmYWN0Q29uc3VtZXJUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjg0NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NGVlNzdlYjQ4YWQzYzQ2OTNhZTU3ZTgwZDFhZDI1ZTI2ZTQ3ZjcxZWM4MmE0OTcwMzQzOGQ2ZGIyZThmNDk4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9BcHBlbmRBZG1pc3Npb25BdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDExLAogICAgICAgICAgICAic2hhMjU2IjogImY2ZjE3ZjczZTg1MTg0ODAwYzExNjM0YTdlNjBiMDUyOGM0NTg1Y2Q3YjRjNDQyMjBiNGI3Y2VjZThiZjk0MTkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NhY2hlU2VtYW50aWNQYXJpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWMxZTk2NWRlMzc3NDllZjdmMzY2MDdjZGFhZWI0OTYyYzJjMjllZjAyZmRkMGY3OGY1ZGFiOWE0ZDEyOGI2MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ2F0Y2hVcFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIzODBiNDMxMjg5NzUyZjY2NjVjYTU5ZmRhMWYzMjU0Mjk3MzBiNWJiNjg0ZmZmOTQ0YmEyZGY3NDU0M2U0ZGVkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db25jdXJyZW50RW1iZWRkZWRDaGlsZENyZWF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMGEyNzNhZGJjOTljMGMxOGE0ZmM3ZmYzYTY0MDI2Y2I0M2MzODc5OThiNGFkMTA4OGMzZjIyODY2MzhmMjAxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db3JlQmVoYXZpb3JJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjIxLAogICAgICAgICAgICAic2hhMjU2IjogIjJjOTQyZDBhNmJkODRkM2ExOTg3ZTM1MjY0MmU3YjQ0NDI3OTg4OTliZjRiNmUyMDI3ZTZiMzk3YmI0MDdiMWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0RlZXBTYW1lRW50cnlPcmRlcmluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMjM4MjZhOTZlN2I1OTliYjdmOWZlZWY4ZTgwNzEyNWUwODQxN2FkZDgwYjQ4NmNkOWVjYzIzNjNkNjE4ZTI5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljSGlzdG9yaWNhbFNvdXJjZVN1cmZhY2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzEwNDQyOWE3M2MzYTNiMjMyNTFiYzc5NDcyZjIwMzU1MGFhZTI4ZDBlODg0NzE1YjIzYTI5MGFkYTQ2YzkzYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZEhpc3RvcmljYWxQYXRoQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjAxLAogICAgICAgICAgICAic2hhMjU2IjogIjMyOGI2OWZjNzg3NzJiZmUwODhjNzRjYjY1MTJhNTY0YWNkNzZhNzM1MzAwMzAzYjk0MGViNTZmNWMwMmExMGEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRQYXRoQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1OTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTJiZmIzMjhhMjE1NjkwYmQ0NmQyZTBiZTAwYWE4YWE1ZWUyNTA4MzA5ZmEzYWUwZTUzNzYxMWQzYmY4ZDJhNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRFcG9jaEV2ZW50T2NjdXJyZW5jZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmODI4NzBlMzc5YmVjZWM4ZDk3YzlhYWJkOGU2NGVkMTYxZDk4OTU1ZjcxYzNjMTM5ZDc5NDc4ZGZmN2UyODFiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZE9ubHlMYXlvdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJmNTM5ZjdmN2FiYjY1Njg0NjM4ZWRmMmYyNzQ1NGMwMzk0MmQxYmU5MjZiZmIxMjUxNjA5YTVmMmMwNWJlMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRPbmx5U3RvcmFnZVBvbGljeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxOTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTBhYmRiYTQwODk4YzdiMzJkNmE2ZTE0NDY3MTQ2NWQ1MGE0ZjU1NjE2ZmYwMGZhODBkYmRlNTEyNjYyMDc1MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDUxLAogICAgICAgICAgICAic2hhMjU2IjogImU2ZTI5ZGI4M2M3NjJiYjNlM2Y4ZDMxY2Q4MTM1ODI5MTYyMDkzNDQyNzkwZGUwMDk5ZDk5ZDI5MWJkM2MwZmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZVRlc3RTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjQwLAogICAgICAgICAgICAic2hhMjU2IjogIjc0N2Y2NDc1YjViZWUzYWM4NTdlNjEwNmJlNGU0OTJiNTg5N2M2NTRmOGYwOThjODkwZTFmNGU3MTEzZGRkYzAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZVRlc3RTdXBwb3J0TWV0cmljVm9jYWJ1bGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGVlOGU2MmJmMWJkYjA3YWI3MjhhNjExNDdkM2IyMzk5YzM4MDVmOWIzOTQwMGU0YzA3YjU1N2FlYjdlNTk4MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRXhpc3RpbmdFbWJlZGRlZFN0YXRlT25seUNhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mzc1LAogICAgICAgICAgICAic2hhMjU2IjogImJkZDk2NmVlMzQ0YjI0MDhmMzkyOGUzNmFlYWY0NjhhMDhkMDRmZmNiMWYzZGVkMDgwZjY5NTc0ODk3NTA4N2IiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0ZhaWx1cmVSZXRyeUF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyMjAxLAogICAgICAgICAgICAic2hhMjU2IjogIjY3MDczMGE3YzAxZmEwOTU0NTQyMDk2ZDlhODcxYmJmZTI3YTQzNDVmMjBlM2Q3YjFmZWViMDI4MjM0N2QzMTgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0hpc3RvcmljYWxTb3VyY2VTdXJmYWNlSW50ZXJ2YWxJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3ODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2NmZjM4NWFiNjcyNWE0NjQyNzViZDA5MWY0NDczYWQxMTI5OTU0NTdlOTZjNWMxNTM4NmRkYmZhMmRhMGU1ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSW5pdGlhbGl6YXRpb25MaWZlY3ljbGVFdmVudE9yZGVyaW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NzEwLAogICAgICAgICAgICAic2hhMjU2IjogIjE3ZmJkYmE0M2FlY2QzOGJkN2JiOTYyZWM3MmUzNDMwZGNiOTQxMDQ0ODRkMDIyNGY4ZGVhZGQ0NTY2YjI2M2EiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0luaXRpYWxpemF0aW9uUmV0cnlJZGVtcG90ZW5jeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5OTk5LAogICAgICAgICAgICAic2hhMjU2IjogIjgzYTZmMmJkMTczYzM0NWFiMDJhMmJkM2Q3NTM0MmZjMTMwOTlhYTU5YjI3OTEzYjc5NGUyMWQyYjYzNDYwMmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0xhdGVBZG1pc3Npb25FbWJlZGRlZEhpc3RvcnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODkxLAogICAgICAgICAgICAic2hhMjU2IjogIjFlNmZlYzA0ZDVlMTVhMzJjODdlNzNkYzRlZGVhYzM4YWI1NTI3MTgxYjg4OTJjN2YxNGVhZjNlYzllZDc3NTIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWRDaGlsZENvbGxlY3Rpb25NZW1iZXJzaGlwTXV0YXRpb25JbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcwNDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTg1YmQ5NTlkYWRkZTMwYjY3NjQ2NWZlNjMyYmEyNzhiMTk3MTVjOWM0ODIyNjQ0NWJhOGJkYmJiZjljYWM2NSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZENoaWxkT3duZXJzaGlwR3VhcmRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTMyLAogICAgICAgICAgICAic2hhMjU2IjogIjBhOTQ4ZWNlYzRjNmY2MDU1YWFhOTA0ZDY5MWRjNDYzYWQ1MzQ4ODU5ZTkwMGVmM2NjM2UxN2NmZWM1N2M5MWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWREb2N1bWVudElzb2xhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTRmZWIxZTI0YTI2YmJmOWUyN2I0N2RlN2VlM2I1NDNlOWUwZjk1NzI1NTMxOWU4NzNiMjcxZWJiMjNlZjE3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTXVsdGlDaGlsZFN5bmNocm9uaXplZENhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDQ4NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNzdkNTExNTJhZjc3YWM4YWM1OTZlZDlhMDVlZDcxNjg0NzYzN2EwMjYxNjNiMDIzYzI1ZGIwNzVlYTZjOTU5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRFbWJlZGRlZENhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzU5LAogICAgICAgICAgICAic2hhMjU2IjogImNiZGFlMGY3NWViYmU2ZjYwMjVmOTliOTRhY2M3YjgyOWFkNGY2MThhMGVkZTgyMDAyYzM0MTI2YjJjMjgyMDkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZE93bmVkU2NvcGVQbGFuSW52YWxpZGF0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjcwLAogICAgICAgICAgICAic2hhMjU2IjogIjUwOGUzMTNlZDczMDEyNzFjNzdkMDVmMDMwOWYzN2RiMGQyM2UzMGZiOWZjMGU1NTM4MjBjZTk1ZDRjZDVkMmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZFNpYmxpbmdHbG9iYWxDYXRjaFVwT3JkZXJpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTYxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMThkZTgwZWM0MGQyMWYzNTZhOTBmYzM1ZDM4NTNiNzM3MzlkZmI1Nzc2YWYzZTYyZjJiNThjMjNlN2I3ZjkwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Ob25TY2FsYXJSb3V0aW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzk2LAogICAgICAgICAgICAic2hhMjU2IjogIjMxZjgzYTRkMjdmNWIxZjNmNmU1ZTg4Mzg3MmExYTg1NmJhMGQ1YzhhZDExODQ1NzE5MWViZjMzYmU0OGY0N2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUNvcnJlY3RuZXNzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDg3OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0NDRlODQ3OTRiNDgzMjI0YTViOWVkMjcyMDU4ZjU5NzA5Zjk0OTJlYWY3NjU4OGEwOTUzZGZkNDdmZTMxY2RmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMTJlODkyYzIxM2JiY2Y3NGQwOWUyYjcxYmExZmU4ZjczMzI3ZWVhZDA3YWQzZmZkYTNkMzE5N2E3NGI1MmYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VSZXRyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYwMTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjcwMGUzZDc0NzNiYjM5NTlkZGI0N2EzZWIyNzE5NWE3NTg3YWVjYzBkMzU0NWNlNzYyMjE3YzA5YTcyMDRiYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUHJvY2Vzc0VtYmVkZGVkQ29sbGVjdGlvblBhdGhzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NTExLAogICAgICAgICAgICAic2hhMjU2IjogIjRmYWE2OTExOGVlNWNhMGU3MDJlNjViZjRmMDgyYzNjMTY1ODg3ZWQ3Yzk3ZTdhODIwYmFjMWI4NTk1OGM5N2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1B1YmxpY1RlbXBvcmFsRmVlZGVySW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTQzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI1ODVlMjYxNzc3YTY2ZDU1ZTQ4NDU4OGRlOTNiZGRlNjkzYjUyMGQ5MjI0NmUxNjc5MWYxYmNhNjlkMDA0NjkxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9SZW1vdmFsQ3ljbGVBbmRSZWF0dGFjaG1lbnRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NDE4LAogICAgICAgICAgICAic2hhMjU2IjogImJhM2VkMzE4NWVhODM0ZjI5ZDgyMTQ2YjY0N2ZlNTQyZWE3MjQzZjI3ZGMwNjc3N2QwYWU3ZjUzM2U1ZmQ5MDIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JldHJ5U3RydWN0dXJhbENvdW50ZXJzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzMzLAogICAgICAgICAgICAic2hhMjU2IjogImJiMjliNjZjNzBiYTllOWRjZGUwNzI3MTJhYjc1ZDczMjRmNjZiNDc5NDU5M2MwYzFkZmFjYjJkNzg5YzQwZTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTBJbml0aWFsaXphdGlvbklkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzk5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MGVkNjc2MGQwMTU0YzIzNTQ2ZDhjZGQ1NmM1NWZjMTBlYmI5ZTRhMjM4ZGJiZTY0MmE5NWQ4YjZlNTI4NDY3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjk0ZTIwOTBiNWI2YTFjZjI2OGQwMDIzZDc1ZGZjMTRkNGY2ZTUwZWQwNWMxYTdhOTFlZjE2MDE1MzZjMmNjMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2FtZURvY3VtZW50SW5pdGlhbElkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjUwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYWYxMDZjMmYwMDFmOGExY2EzNzE4Y2VlZWFiYjdiMGNlZDAyZGM4OWQ3YWU1YTI3MjkwN2E0NDg5NjFkZWViIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TaGFyZWRNYW5hZ2VkQ2hpbGRUd29PY2N1cnJlbmNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU0NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmE3MGIwNWQyYTQxZDFjM2Q0YTJlYzc1YjNmMTRmMWE0NmY1YWEyNGJmYzRhOWU5MjJkZjg4ODZhNTkzMmQ3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2hhcmVkTWFuYWdlZENoaWxkVHdvUGFyZW50c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MDAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ5MTM0OWQwOGIwZGU4NDFjMTNhMzAwNjBlZTc0NDAzNDE5MGIxOTFmYjIxOWM3YWJhNmQxNjlkZWQ3YzczYjUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NvdXJjZVN1cmZhY2VJZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjkzOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZmNlMzE1Y2YzZmM3M2ZkNjFmMjBlNjc4MmRiZjI3ZDUzM2JkNzZlMWU2NjkwOWIyMGM5YmNlNjE0ZmYzODEyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TdGFydEFkbWlzc2lvbkF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmIyY2NiNTJmMjAyMmI0NWVhZDg3OWQ0MzgwMGJlMzhkNTk5OWU4NGY4OTJmM2I2NTkwNDE2YzI2NDI3ZjQ2ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVtcG9yYWxBZG1pc3Npb25Qb2xpY3lJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzOTE3LAogICAgICAgICAgICAic2hhMjU2IjogIjFkNTMzNDFlZTRlMTBmYjQyMTIwNzFiMGRmNTBhMWVmM2FlMjg1ZTE3MWU4YTBmZWI2NDQ5OWU0MWRhNDE1NTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNjU3LAogICAgICAgICAgICAic2hhMjU2IjogImRiODliOGI5MjdmODYyZmM1ZDFhNTBhN2RmMjJiZDNlOTViMzA1NDJiMzZhNTEyNjJhNjkwMGUzN2QwMTllMGEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RSZXNvdXJjZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyMywKICAgICAgICAgICAgInNoYTI1NiI6ICJmMDA5ZTFmMWYwNmVlNzc1MzJkZDBkNGVjNmEwMDYwZDc4OGU2Y2MyNjkzMzJjNTdjOTc2NGJkNGIxMmNiZGNiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XaG9sZU9iamVjdEZhaWx1cmVIeWdpZW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzgwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNzhjZTE5N2Q5MmU2YzE4OGExZjJlNWNlY2NiNmI5ODlmNWI4YjdlNTY4ZWQ5NTc4NGVlNjA5ZTRjZTU2MzYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9BcHBsaWNhdGlvblJlYWRpbmVzc1Byb29mSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NjY4LAogICAgICAgICAgICAic2hhMjU2IjogImU5ODc3MTEyNmJlZmVkY2Y4YmRjZTJiYmM0OGRiYTQwMTQ5MzMzMWFmMGMyZDgzMDViYTMzMmE2MmFmMzU4MzQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkUmVjZWlwdFJldHJ5SWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc5NDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjlkMTM5YjY1YTM2NmEwOTVmNTYxNmNmYzQyNzQzMGViYWM5NzE5MDVjOTg0NTYxZjNkZWVjMWI1OTgyMTY3ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9hbGwtdGltZWxpbmVzLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTc0MjQxOGQ2NzcwNTE4NjY2YzczZTVkZjczZWU5OTdiNjQ1N2Q2NTI0Yjg5NzQyZmVlOGQwOWFmYzRkZTE0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2NvbXBvc2l0ZS1yb3V0aW5nLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTQ1OWRiMmNiODhmYWNlOGYzZDBiNTliOTY4YWFiNTUyMWYzNzg1MDZiOTdhYWQwYmNlZjdmOGQ5ZTJmOThhMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzgxLAogICAgICAgICAgICAic2hhMjU2IjogIjExZmE5ZmM3NTU3NmFlZDQ2NDY5MzI1YjAyNzc4MzNjZDkwNmMzN2VkMmM2NTA2NWMzYThiOTVhNTNlN2JjMmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDczLAogICAgICAgICAgICAic2hhMjU2IjogImI1NGNjZGUxNDEzYzM5Y2JmNGQxZjViMzQ0M2UyZTM1OGJjNDRkZWI5Y2Q4N2M2N2M0M2IyNTdkMTc5ZTAyZDUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExMS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzEyLAogICAgICAgICAgICAic2hhMjU2IjogIjUzY2E3NGJlZTY1OGQwNTEzM2U0YWViNThiZmM3ZDlhYmI0YjkzN2I2YzAzMWQyZWJjODFjNDdhNWQxNWNhZGYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ0NmU1NGI1OWUzZTA2NmU1MWMxMzNlYzM3ZGExMDEyMDFjODA4NDc0NmRhM2Y0MjE2YmRlYmYxY2I3NTVmYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kdXBsaWNhdGUtZXZlbnQtZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODE1LAogICAgICAgICAgICAic2hhMjU2IjogIjBkOGQ2ZThkY2Q0ZTkzMzZhZjBjMjY2NWNlMDA3YmY0OWIzMjE1ZGQxYzNiZmY4YmE0MGZlZTFmNDhlNWFhYjIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZHluYW1pYy1zb3VyY2Utc3VyZmFjZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM4NywKICAgICAgICAgICAgInNoYTI1NiI6ICJhNmVlMzFlMDVhMDMxNWQ1Yjc2YzMzMTdlZWI4N2ZiMjAwMWJiMzUxMjc0ZDEyYTJmMTAwYzE5MzY0ZDc5YjlhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvbGxlY3Rpb24tcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjMyLAogICAgICAgICAgICAic2hhMjU2IjogIjU1YjQwMzlhMDZjNTEyMmFmMjY3M2E4ZGYwZmE0Y2UyNDk5OWEyNzJjYTBjOGQ5N2Q5NzExMzAxN2U1MTM3OTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY291bnRlci1CLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzI3OTA5NGRiYzUxZTY4MDhiNTdkZjMyOTAwZDMwOTEyOGM0YTIwOGVkMWNmNGVhZDE4ZDNlNDI5ZTU3M2I3NiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjMxNmFmYjZjZmI4OTE2ZDM5YTdmZDcyMzg5NDllNGIwYTU4YjRkNzJhMGI0YjQ4NDE0NTllZTQwODk1MDEzZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1taWRkbGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjhmZjAyYmE0Yjk2ZWNkMTVlNmEzN2E5N2M4YjBiZDgyM2RkZWI3NTllYTk4MDA5NzUyYzMzZmJiNDUzZGU5ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmI1OWNjMmVjMGNhYTk0MjUxOWQ4ZGQzYWNjODU1MWYyY2NkMzA0ZTBiZDYyNTQ2ZDMxNjY5NDE2ODQ5NGJmMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjY3LAogICAgICAgICAgICAic2hhMjU2IjogIjY4Njc2NjEzMzhhOGFhZDU3MmExNzVjZDJjMTc1ODMyMzI2MzhkNjMwZThmMWVkNzc3ODIyOTg1OWM4MmE3YzAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtc3RhdGUtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAic2hhMjU2IjogIjFmZGIwNDJjYTA3NjM3MGE3MjhmZmY5Zjg1ZDE3ZDQ5NDNlMGEwMmI5ZWY2OWEyZWQ0OWY0YzMwZmQ5ODBmOGIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vaW5pdGlhbC1lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyOTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTVkZjIzMGQ2YmY5MmQyYmRiZmE2YjE4M2JjNGMyNTFmNmI5NzM0MDVmYjdkMGU2NjNmNGIwZjI5ZjdiNWJmZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9sYXJnZS1vcmRlci1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MTIzMywKICAgICAgICAgICAgInNoYTI1NiI6ICJmZWY0MWM1MzRhN2QxNzg1N2U5ZDE2Yjk2NDMxY2FhY2I4YmZlYmRhNDhjOWYwZDQzMTliY2VhNmUyN2RlMTJkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2xhcmdlLXBheW5vdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2ODIxLAogICAgICAgICAgICAic2hhMjU2IjogIjcxN2JiYjZlYjAzYzBhOTE1MmEwMmJiY2VhMWZjN2Q3YmE4YzhjYWZkYmRmODkxZWYyZDIzYTdhMGUyY2EwYWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0YjVkZGU1MGMwZjRjMjA3ZGYxNTY1YTIxZjIzMjM2Y2NhN2ZjMjM1YmUwZmJlYmFiNTE4Njc2ZDEyM2M4MjIzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1nYW1lLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzQzLAogICAgICAgICAgICAic2hhMjU2IjogImIxNDI3NmU5ZGM2YTRiNDY2ZjZjOGI1NzY4YWRlYTkwOGRlYmU1Y2YwZTgyNDUwNWZkZDA0NGMzYjYwZDMzNjQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLXJvdW5kMTAtc2xhdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2Q5MDFjNmVhMDFjZDg4ZDA3NmJmNmU4MDU5ZThkOWNhYjA3NzFhZWJmOGE5ZjE3ZTg2OWI0YjNmMTY2NzhmOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtc3RhdGlzdGljcy55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OTVkOTBhMDhmOGUyYWE0NGE1OTA5Yzk2ZTdmM2NjNTUyNTFmOTZiYTlhZDY1ODk2NmZmM2QxZmZlOGEwZTJiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25lc3RlZC1vd25lZC1keW5hbWljLXN1cmZhY2UueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWM3NDk5OWQ0NzczYTdiMmIyOTVlNDI4M2ZlNDZiNjczNmFhZjllZGJmMjg2MTA2OTBlMjA4MzAzNWIzY2RlYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uZXN0ZWQtc2libGluZy1oaXN0b3J5LXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2ODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjhlZWVjM2E3MzUwODg3ODdmMmQ1MTk3NWZjNTMwMmNlZjIzYjZhY2Q5Mzg4MWFlZTlmODA1MTM0YjYyN2E1ZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9vd25lcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMTMxLAogICAgICAgICAgICAic2hhMjU2IjogIjg5NTUzZGI2N2IyM2MzZjhjYjFiMGFmYmY4NThhNTA4YzY3YWU3NTQwMDU4ZjZjZTJkMWFiZjExNDNjMmU2ZDQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcGFja2FnZS1wYXlub3RlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTgyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjhjMGUxYmFhNjU3NWMzOWI2MGQ5NDc5Njg0NjYxZTY2YTg0OTljNDA4ZDc3MGRiZWUzY2NhZGZjYjRkOTY0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3Jvb3QtaXNvbGF0aW9uLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDJjMjBjYTkzODYzMWMyOWU0OWJhMDBlNTBhMzA3ZmY1MDY5OWUxOWYzNTQ5M2IxMDY4NTVmNmJjNTQ1NzU1NSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmZmNjdmMGRlM2EyMDYyZjM5NDRhMWI5ZjAxZGIyNWM5MmVkNzFlZjc4NDk2ZTk4NGE0Y2VmZTk5MDUxMGIyZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9zaGFyZWQtY2hpbGQtdHdvLW9jY3VycmVuY2VzLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YjBhMmI3ZGY0YTViMTJjM2RkYzc5MDNhMWEzN2Q1MzAwZGE0MDg1NzAzMjk3ODdkMGQ2NmYwNGY0OGZhYWM5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3RocmVlLWNoaWxkLWhpc3RvcnktcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODM1LAogICAgICAgICAgICAic2hhMjU2IjogImRlNDBkMDk2NTMzNzhhYWMyNDA0NzgzM2RiMDAyMTk4YTM3MjFhM2Y0NGEyMjAzOGZhMzQ0YmVmMmY3YmIzMDciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vd2hvbGUtcmVxdWVzdC1zaW5rLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1LAogICAgICAgICAgICAic2hhMjU2IjogIjA5OTg3NjAxZDM5YTI3OTdkY2ZkMzQ5OGM3MDI1YjUzNzMxZDljMjE4MGU5MzE3YjY0NjVhMTZiZTIwMmQ4ZjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcGxheWdyb3VuZC9maXZlLW9jY3VycmVuY2UtaW5pdGlhbGl6YXRpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMWU5NGMwMzlkMGZkMGRmNzBiMGM4MDNlYmU5MjFhMjkwZDE1OTBiYWM2OWE5MDczZmU0OTEwY2E4OTM5YjZiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvZHluYW1pYy1jb2xsZWN0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmIzY2U0MDdhNjAwZThhYmQ0MTU3YjMzYTgyOTU4MDc2YTYwNDI5ZGMyZjliMTRhOTBlNGNhNDI2ZjMxYTlhNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtcGF0aC1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyOTEyLAogICAgICAgICAgICAic2hhMjU2IjogImFjZWQ3MzRlYzVhZjFiYzIzMjgwNzRhZTkzZDMwNGJmOTU0MDBlN2RlMjZlMmVmYzFkZTg2NGFmNjQwYmE4MzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1kdXBsaWNhdGUtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDAwLAogICAgICAgICAgICAic2hhMjU2IjogImUwN2U5OGZkNzQ2YmMyM2I0MmUzOThkOTAyNmFjZGVjMjk3YTVhOWFkYzg2MTMxNGE2NGY5ZTc3OTNlOTY2OTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1ldmVudC1vYnNlcnZlci1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMzNzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjg3NTZiYzRiYjMzOTE4MjE5ZmJiNzE5NmFlNjQ4MzAxYTQ4MGFmMTlmMWY0MDM1YWIxODE2MTJkMzcyZWRkMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLW9yZGVyZWQtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDM5NDRjYTkzMzI4NzljZTY1ZjliNDA3ZDA3MTFhNjRkOTQzZTJmODExMDBkZGYwODdhODU1MjYwZDdlOGIzYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL21hbmFnZWQtY2hpbGQtY29sbGVjdGlvbi1tZW1iZXJzaGlwLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NzVlY2EzODI4ODkyOWQ3MzQwMTkwZTczMTBiYjQ1ZjcyZWMyZWEyYmQ1NTUzOTc2YzRhZWM3MTY1YzMxZGY3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1nYW1lLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMzg2LAogICAgICAgICAgICAic2hhMjU2IjogImJmMWI3OTk4ZGQ5MDY0ZjMyZjA0ZDJiYTI4NWI1YWZkNDQ5NjQzYWJmNzdmM2UzNTYzYjYwZjQ3MmUzZTkxMjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uYmEtbGlmZWN5Y2xlLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJjZTQ1NWM2NDMwOThjMjhhZjRiYWY5MzU2YTRkMWQ2ODkzODA5YTJmODM4YzdiYjgyNzA0NDg1NjE0MzkwMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25lc3RlZC1keW5hbWljLWNvbGxlY3Rpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJhMGY1Mjc5YjkzNDE5N2ZkZjI2MGIzZTBkMDhiMDZiNmQyNGFiZjgwMDRlMDJjM2IwOWM2ZTM4MTdhZTEwNDljIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0FjdGl2YXRpb25Nb2RlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzljZTZmNzY2MmZjNDY3MWE0YWMxYTdhMThkODRkN2NiNzY5NmE2MzY4N2U1Y2VhZWNmZmQ2ZTY4YzhkODg5MyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDZlYzFkYWZhMmU0YzU4ZTdhODM2ZjQxMmY5MWRhZGNmYjQ5YmU2YTU3Mjc0MGY5YWZmYjg1YTg4YWE3NzUwYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FcnJvckNvZGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzQ0OWI5NTFkOGU5OTNkYmZhZmI1NTE0ZWQ1ZTEzNjExNzJjNWQwMWExYWEyNzA2Yzg0Yzk5NTZlZTE5YzNlMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjc2NjAxMjI3OGY3MjkzODk3NjczOGEwMTU5YjQ0YzI3NjQ0MTMwNTJlODNlOTYxMzE0MTRlNzU3ZWY3YjM2ZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25NZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MDYwLAogICAgICAgICAgICAic2hhMjU2IjogIjBlMGViOWU5NDU5NmU5YWE0M2M3MTc1MjgyMTlhOWI3Njg3YzBhNDYwNzdhMjQ5M2Y2NjA2MDNlM2Q3ZTIyYzEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnREaXNwYXRjaE91dGNvbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICIxMGZmYmYwOTEwMzA0OTYyZjViMTczYTZlNmE5ZWMzNDkzOTRiNDgzMDE3NjVkMzczYmU1ZmNjN2JmMGZmZTJkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50SWQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjBmODU4NWI3NDY4MGNiNzZmNTZkNTUxZjgwNDZjN2FlZTM4Mjk2YjY1MDU4OWQyNjgxMzA4YmM3NWE5NWJkMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudFJldmlzaW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MjAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ5OGU2ODdmMzQ3OTk0YzFiMzk2Yjc2ZDkwYjVlNDk3ZjU1ZjMwZmQ3NjVmZTYwZmVmZjUyMzUzZTJkZWUwYmQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnRTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzg1MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkZjZkZjE1ZTJkODczNDhlZmI2NmYxMGNmNTUyMzllNzVjMzk3NjBmOWZhMTZlMjgwMThhOGQzNTFmYWE0MGRhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0V4YWN0VmFsdWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5NTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDM2MDkxZGVjODVkZjI4OGU4ZDQ3YWE1NTk1NzA2MDczZDYxZjc2NTAwYjQ5OGJlZDUwYTEzY2Y4ZDUyZGFmZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9PcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzhmYTY2OGY5NDg3MTU5NzdkOWQyNGI0YmVlZGM3YjgxMTQ0MDZkOTJjMTUwNTJhNzJjNTRhOGIwZDMzZDE4MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Qcm9jZXNzaW5nRHJhaW5SZWNlaXB0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTIwLAogICAgICAgICAgICAic2hhMjU2IjogImIyOTFmOTk4Y2EyZTQwOGI4MmRjMzMzOTE4ZjAzMjYzYThiMjRkOGRiYzRhZWNiNTdlMmU5ZDczYzBkMDM5ZTEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvU2Vzc2lvblN0YXR1cy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc5LAogICAgICAgICAgICAic2hhMjU2IjogIjc1YzA2MWViZWFiMWNlMWQ0ODIwZTcxMTdkMjM5YzRkMDE5ZDkwYTdjYzYyNWVmZDk2NDUxZDg0ZGRlNDk1ZTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3NywKICAgICAgICAgICAgInNoYTI1NiI6ICJmOTIwMTFiZWIyOTk5Y2UzNmRiNTczM2U4ZjZhZjljODk4ZmFiZTc4MmRhOGU1ZDgxNjQwZDdhNTViNmZlMTViIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lQXBwZW5kUmVjZWlwdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzQzLAogICAgICAgICAgICAic2hhMjU2IjogIjljMDAxMTYyOWU1MmQ1NGFlODU3MDBlNmJmOTc5NzhhMjFiMmFkNzRiMDFiNDBiMGVjYzZmYTU0ODE2Njc0NDMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmVFbnRyeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzNTQxYTgzNDBkYzljN2Q1Njg0NjdiNzY4NTNhYmM0YTcwZmVhZGYxYzQzNzg0ZjZjNzZlY2E5NzkyMjBlYzEwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQmx1ZVJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzY1LAogICAgICAgICAgICAic2hhMjU2IjogIjA2YmEyYTA0MTI0YTBjOWYyMmU0NDIxMTBiZGQ0NTdhNTRlY2Q3YmQ4NjE3ZGM3ZmRmMzY5YTA5OWExN2U5Y2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9DYXRjaFVwQmFycmllci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjg4OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3MjU4NmFlNzA5NWRhNzEzNjQ1ZmViYTVhNDQxNWZjMWYxZTBiNDhmMTYxMmJiYzA1ZjRhNzMzZjUwN2UyNjlhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ2hlY2twb2ludERvbWFpbkV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTk2LAogICAgICAgICAgICAic2hhMjU2IjogImFhYjNiMTJjZWVjMThlZjJhMjYzODhiYTZmZmJmZGZlOWE4MjBlMjVlNGE0ZGFjOTY3NGY2ODQxNGU0ZWY0OWYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Db21wbGV0ZW5lc3NFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk5MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwY2E4ZjdkYmFhMzBhZTIyM2E5YmFlNmExNDc2Mzk0MTcwN2VmODQxZWY0ZjE5Yjk4ODlmNGJmZWIxNDNlNTllIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRGVmYXVsdENvb3JkaW5hdGlvbkVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzIxMTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODE2NWNiOGY4ZjlmYmJiY2MxZmY3YmEwZGQxMGY5NjNkYjRhNDJlZmM5OGQ5MTMxNmI0YjFiZDYwNDM1OGE4MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50SWRlbnRpdHlSZWFkZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWNiZjlkZDQ3YjBiNzYzN2NlZjM3MDcyMWE3NjUzNmEwY2NlODRmYWYwNTUxZDU2Njc1NzcwMTNlZGNiYjg3NCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50U2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI4OTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzEzMTEzNTczZWZhMDk0YmFiNjU2ODg3ZWU5NGE3ZTkyM2NhYjkzM2ZjMWYwNGRlYTUyYWI4NjBmMmVmZDFkZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50VHJhbnNpdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY5MzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWRmZmNhMTUxMjc3YjYxY2FmOGVmMzg2MGVjNjdhYWEzNzY3ZmRkNGI0OWZkMzA0MGEwNjI2NTlmY2EyZDdjYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkQm91bmRhcnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjZiMDM1NzQzNWQxZThlNGYxZjg2NjMzNTU4MWRlODBmZTc0ZGRjMWI3MjQyYmM5NmExMDBlOTdjYWUzOTlhMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hDdXJzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjZkNTVlM2FmMmExMzZmYmUzOGY4ZDk3NTc0ZWJiMTUzNDM2YTk0YjA0MzY3OTQ1NWRlYjk5MDY4NjAxMDQ4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRFcG9jaElucHV0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5OTUwLAogICAgICAgICAgICAic2hhMjU2IjogIjliMjk4Yzc3ZWEwZTc2MmIxMTE3MzVkNDNhOGYwMjhhOGJkZDhkZTc4Yzk1NWMzZGM5OWY5ZThiMGYyYmNjNGMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZExheW91dFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc4NjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzVhZTA1NWYwMjczMjJlMjA5M2VjYmJkOGM0ODVkMzkzOGUwNGVkNWQzYzQwNTI0Y2RmZDJiNTE0YWE0OTMzZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT2NjdXJyZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTE5LAogICAgICAgICAgICAic2hhMjU2IjogIjI1NzEwYWVlMGNlOTI2YWRmMGExYmEzZGIwNzkwMmU2N2E0YzFmOTQ3N2RiMTNkMTJhY2FmM2Q2NWI2ZTE2ZTYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9ubHlMYXlvdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3NDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWQwM2VlNmYxY2FjMDFmNDJjOTQ4ZmZhMjFlZmVkNGNmNDNiMjBmYjBiOGI1NTQ5YjI2OTRiYjBiMTI4OWE2ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT25seUxheW91dEJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NjY0LAogICAgICAgICAgICAic2hhMjU2IjogImY0ZjZlM2E4ODUwMjkxNjAxMmI3NDg1YzRmMTA1NzM0ZWU0ZmNjYjBjMGJlMGYzMjJlZjVjYTNlYzczMjczN2UiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRpbmdCaW5kaW5nLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NDIzLAogICAgICAgICAgICAic2hhMjU2IjogIjcyNDk2OTdjOGU4YzMzOTNmMjgxNWY1MzczOThlNTUzNjIwZmVkYmQxMWIyYzY3N2FhMmU3YTJjODMxNDViNTkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbmdpbmVNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MjI0LAogICAgICAgICAgICAic2hhMjU2IjogIjBhNTNmNTVjYzQ0Mjk5YWEwNDcyYWFkMGI0ZTcyMWViYjM1NDdjYjhiZDVlYjZkNDM2NTMxMTY0OGY2NWMwZjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9IaXN0b3JpY2FsQXZhaWxhYmlsaXR5Q29udHJvbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjgzLAogICAgICAgICAgICAic2hhMjU2IjogIjdiYWNmMTBmMDZlZmNjZGZjZDY0ZTRhOTQ5MmUzNTdhMmU2YzM1ZTdhODk4ODE2ODg5YTkyMWM0MzBjM2MzZTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9IaXN0b3JpY2FsU3RlcC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQyMywKICAgICAgICAgICAgInNoYTI1NiI6ICI4OTQ3ZjE1YTYxMjE0ZjkyZmQ2ZjQzMDY3Mzk5NjFhNDZiODZjOWMwN2EwMzhhZTdkY2M1N2Q5YjNkZDUxNDdkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW5NZW1vcnlEb2N1bWVudFN0b3JlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2LAogICAgICAgICAgICAic2hhMjU2IjogImYyMjg2NDBhZjcyOTM4Mzk1N2U1YmZjNWFmOGUzODM2NWM1OTExNzM4NGExYmYyMzY3NTViODZjN2JmNDczYWEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Jbk1lbW9yeVRpbWVsaW5lSm91cm5hbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTUzMTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjE4ODhmMTZkNTM5MzRkNzk1MGExNmMyN2I5NDUyNzA0MGVlZmUyYzdiMzQyZDNjNjQ1MjAxZGY1YzQ1MmZiMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0ludGVybmFsUHJvY2Vzc091dGNvbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ODNkYTQyOGRjZWYxZTg3OTYzN2E0MGIxZDVjZWIxYjNhMDAwZDNjMDU5NTVhMTlhZGI0NGM5OWY2MTM1MDdhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW52YWxpZEFkbWlzc2lvbkV2aWRlbmNlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjcxZDZlNmFiMzA4OWUzNjZjZmFiYWI3MGY2MWZkZGFiNmU5OWYyODlkOGNiN2ZmNGY4MTM2NTVhM2U3YWFlYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL09wZXJhdGlvblJvdXRlSW5kZXguamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNDQ2LAogICAgICAgICAgICAic2hhMjU2IjogIjYwYjI0MDM1ZjI2MGI4NzY2MmI0MWQ3NDcyNWQ2ZGU4MzY4OGI1YjkzYTJkNWI5ZTdiODQ5ZmJhY2QzYWUxYmMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Qcm9jZXNzRW1iZWRkZWRHcmFwaFNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjUxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYTlkODhiOTI1MDk4ZTlmY2U3NmUyMGNhZWJiOWI5MGM3Y2YyOWUwMzJiMGI1MjRmZjY4YWNjMGYwNDI5NWUxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvUm91dGluZ1N1cmZhY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNzc0LAogICAgICAgICAgICAic2hhMjU2IjogIjRlMDBkZGQ2NjkxOTZlYmYyMDM2MjY0ODYxZGY4M2Q1MmZmNzgxNGY3N2U4ZmFiY2ZkNDk2MjJhMDY3OGUwZjQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9TZXF1ZW50aWFsRHJhaW5Db29yZGluYXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTIwMzQ2LAogICAgICAgICAgICAic2hhMjU2IjogImE0ODk2ZjcyOTE3YzljNzY5MDRhODZlNzk5Y2NjM2FhMzY3ZjJhOWFhYTQyNjFjNDI2ZWE0OTNlMDQxMDViZjAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Tb3VyY2VTdXJmYWNlSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWEyM2IzMDU0NTVmYmUyMzgxZjNmOThlZmYwNDk0ZWQ0YmEwYjBmZTVhY2M1MDNmMWNiNTlhYWQ1YTc0YmFlNSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1dob2xlT2JqZWN0U3RvcmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTYxLAogICAgICAgICAgICAic2hhMjU2IjogIjRlNWRhYzJlYmExZmFmZGJiMDcxZWMxN2Q3MjlhZTMyNzQxODBkN2U0MmMyMDFkNGUwYWRiMTExODAzMzQ0NWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9XaG9sZVJlcXVlc3RFbnRyeUZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExOTUxLAogICAgICAgICAgICAic2hhMjU2IjogIjUwODEyYTYyMzg1NTVmOTYyYjJlNDlkMzA2N2M2MGMwZTE2MWJmYjBhMzgxNGNlZGRhODgzOTlhYzlkYjQzMTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQWxsVGltZWxpbmVzQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTI1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMDM2ODhjMmQyNTQyOWU5ZWEyNmUyOWQwNDJjY2NmNTFhNjJlYTM0MDJjOTFiM2ZlMmVkYjI2M2JlZjYxNzNjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0FsbFRpbWVsaW5lc0V4dGVybmFsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NTc2LAogICAgICAgICAgICAic2hhMjU2IjogIjkzZGUyNzhlYjc2ZWZiYWRhMzI2NzM5ZTMzMDYyZjNkZTJlYmQxN2RlMmRiNDliNTRmOGJkMmYzOGE3YjMzYmYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQmx1ZVNlbWFudGljSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU0MjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmY3NzY5NTdlNmE3OGJmMTJlYWY2MGUxNjdiYmEzYmViNzUxNTFiNjg0NWI2ZDk4OTkyYzU5OGJhNjE5NDk3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9DaGF0V29ya2Zsb3dPcGVyYXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWU4YjYwZTEwNWM0ODExMmY0NTMzNWEzMzc3NGM4NzAzMTAwNDFmMzE3MjUyMzZiMmZmN2E2NTk0Mzk2MzY5ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db21wb3NpdGVUaW1lbGluZUNoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4MzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGNiNjA4Y2Y2ZjdhN2YxZjc0MjcwYWNjNzA3MzJlYWU4M2Y0MWFhZGU3Y2NmZWU2NjEzZDk4ZTViYzI2MDYwOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db21wb3NpdGVUaW1lbGluZUV4dGVybmFsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4Mjc4LAogICAgICAgICAgICAic2hhMjU2IjogIjNlY2IwYWIxZDNlZjllN2RhODJmYWMxZjZkOWQ4NzNlMmE5NmI3MmUwZjk2MjI1NGUxYmYyMmRhZDQ2NmRiMzYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uQmV4SW50cmluc2ljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM0NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjMzMDQxNDUwYjJiNGNlNDBiNGZkYjJkY2QxYzFjZDlhNmZiYWMyZTYwMjVmYjk4Zjg3YWRlZjUxNzJiYzdkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkN1cnJlbnRSZXBvc2l0b3J5SWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjE5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NTI5OGNhMmI5OWM3Y2Q0NThlMGE5NjlmYjRmMmFlMzBiNDNlNDA5NGFkYmNjY2Q5NzhlY2UxOGFlYWI2ZTU5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkV2ZW50Tm9kZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3MzA3LAogICAgICAgICAgICAic2hhMjU2IjogIjVlZmYxNTY3Y2VmNmQxMWJhYmExNmZkZGM1OGYwYTgwZDdmMTMyYjVlZjIwMjIxMzE0ZTI3ZWMzMzUwMjhmYzYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUHJvY2Vzc0hlYWRlckJyaWRnZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiOTdiY2ZhYTc5NmI5MWU4MjQwYmM0MDBlNGMyZmM3ODU4NDExZTAzYzg5OGRmZDA1OWM1NWU3OWQ3YmNhOGJmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3Nvck9wdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NDIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2ZmZTI1NTc2NTBhZDk4MTdmMjQ3MTE0YmU4MTBjOTRkNTdhNDhmN2Y5YzBmODA3ZGVkYzk0NjQ5ZWU0ZjNmYSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzb3JzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDgyMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTQ3OWJlMjllOTA5NDI2MzI3NDhmNTY2MjM5YjlhMDI2OTNhZjc3ODg3ZTExZjI3ZDc2YmQzZGI5Y2ZhM2QyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVHYXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ3Yjg0OTcyM2QxZmQ0NjU5ZGMzN2U1YTk2ZmVjMmE4MGEyOWFlNzYwMzdlZmY1ODRmMGVkMjIwMmVkYmM3MyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lTGltaXRzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjQ5LAogICAgICAgICAgICAic2hhMjU2IjogImM1YjU3YmY2ODYzOTkzODc1OTE1OTE2YzYzODBkZTJiZDBlODA3NTViMzliNDkwMGY1YmUyNGU5MWU4OGYyYWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZVJlZ2lzdHJhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTA0ZTM0ZDgwYzNlOWRhNzNkZDBiMzRhM2M0YjU0Yjk4M2I3ODNkMGM0OTg1YTdmMTA1YzNlZTE1YTkxZDk3YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25TZW1hbnRpY1R5cGVJZGVudGl0aWVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTI3LAogICAgICAgICAgICAic2hhMjU2IjogImI1ZDYyYTdmZmYzYzU3OGNkZTM2MWE3MDc5MDYzYzRiM2NjOWEyMGY1NDcwNGQ0NGE5ZDg3NjViMDcyZDY1ZDkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ3VycmVudFJlcG9zaXRvcnlNYXJrZXJQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkwNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZGNhNDU5ZjkxYTliNGM1MTk0ZmRhMzQwNjE3ZDgyZWIyMTI5OTQwNjk4MDEyMmJjNGI3NDVjZGIzNjc5YWQzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0hhbmRsZXJDaGFubmVsUmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjNhOWQ4MzgyMTYwYWU1NGFiMjE2ZmVjZWEyNGQ0OTM2NTgxYmJlNDJhNzk2ODQ1NjI4NzkzZmI5NjY4YjVjZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyOTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTc2YTMxYzljYTQ0NWM4YmEzZmQ3YTJkZmQzOTZhZTg2NzIzMGYwOTEyZmRhMWVmOGNlYWY4Y2QzNTk2MzIwMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25SZXF1ZXN0TWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MDYwNWMxYjY3MDBlM2JkZmNkNjA3YzIwNjViOWRiZTIxMWJiNzJiZjNkZTMwNzRlYTQ2MzRhZmQ0YmViYzg3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL09wZXJhdGlvblJlcXVlc3RSb3V0aW5nRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODUzLAogICAgICAgICAgICAic2hhMjU2IjogIjA1NjNjNjM2ZGUzMzk3OTY5NzNlNzRkZGE2YTE3MjcyZjUzOGVjZWMxMjVkYTBiM2Y3ZGYwNWRmMzI3NTZhMTEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93RXZlbnRNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODU1LAogICAgICAgICAgICAic2hhMjU2IjogIjIzMjJjMmZkZDJiYzgwYjg1OWIyNjdjYWUxMTM5YTAzZTBlZGYyYzBjMzJkMjhiNzM4NGRmMGE4Zjg2ZmE2NDYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93T3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzgzLAogICAgICAgICAgICAic2hhMjU2IjogIjUwMWY1ZThiYzdhODRmNDA3MDZjZTQ4OTUyY2NiNmM5NWIwNTdhZWVkOWM4MTYzNDUwNWIyN2NlN2I0YzZmNmEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzA5LAogICAgICAgICAgICAic2hhMjU2IjogIjExYzk3Mzc5YjcyZDQ3MDgxMWQyMDFlZTEzOGNhMWI2ZjU0MTY1NzNhN2U4MzZkNjg3MjgzZjUyMWVmMzVhMmQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDY1LAogICAgICAgICAgICAic2hhMjU2IjogIjhhMTY2MWNmMzU3YWQ1ODU4MDRiMzMxZDFhMTk1NGExYWI3OTlkNTc2ZDdiMGY4ODM0ZDNhOThjZGJmNjQyYmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGFubmVsU3VidHlwZVByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYTZkZjU1ZDRkZjNlYTc1MDAzODU0MGQ1ZTRkYTUzMzE3NzQ5YTJmYTQ0YTU5ODA3Nzk3MGU5MzE1MzVmNDU0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lRXh0ZXJuYWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk2OTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWZmMjkxYjBkNTI3OTllNjA3ZjYzODJhMzRjMmY1MTk5Yjk4NjVmYTFiNTYyZGJjYjc1MGNlMmVjMTU2MWIwYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZU1lbWJlclN1YnNjcmlwdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmMzYjRlYzYzNzM1MDVkYThhNmJlMzIwMjc0Yzg1YmM3M2RiZDk4NDNmNjBiYzVjZDZlODA3ODBkYjk1ODRiZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVByb3ZpZGVyU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ4NjAyNThlNDc1NTk3OTczMDNhNDY0YmRjNjRkNGMzYmZkNTQ1M2JhYzhhNDJiZTNlYzRmYjdiMjM4MDFiYSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVN1YnNjcmlwdGlvblByb2plY3Rpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwMjg0LAogICAgICAgICAgICAic2hhMjU2IjogIjViODkzODJmYTI2MjRkZWFhZWIzODUxOGRhYjAzNGI5NTg0MGJhYTkyNDliYTUzNDUyYzI4MDM5MDM0YzZkZTYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFByb2Nlc3NpbmdNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MzUyOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxN2JjZDczZWRkN2M0ZjcyYzA4OWYzY2IyN2IyYTJhOWRhNWRjYmY5NzY3MDI2NTM3YTIzYTI3ZDg0NWFjNjhjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhXb3JrZmxvd0NvbnRleHRGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDMxLAogICAgICAgICAgICAic2hhMjU2IjogIjgyOTE2YjE4NzQ5YjNmZGYzMmE1NzlmZjk3YzAyNDdmNTI4Zjc2YWI4OTBmNjg2ZjE2ZWE2NDg1OTIyZDc2YWEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L0JleFdvcmtmbG93U3RlcENvbnRleHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzYjAwN2QxODRiNGU4Y2I1Y2RjNjFlMzE4ZjA3MmU4MzU1YjYwMTZiNDE3ODcxYzE4YTQ2YmQxNTI4ZWE3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNzQ4NDIzYzRiYWMxODU0OTg1NjA5MzdkN2I5ZmFkYTM5MTNjN2ZhOTRmZTdlNzliMTE5MGRhY2JiMDA1MmZlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9TY29wZWRQcm9jZXNzb3JFeGVjdXRpb25Db250ZXh0QmV4RG9jdW1lbnRWaWV3LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjI1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1M2Q3ZmU3MDU5OGIzYzliMTIxNGVjOTViNzJiMDU5ZGVjODQ2YjljMDliNDU5MzI0MDE2MzlmZDgxMjU2OWQ4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3N1cHBvcnQvQ29vcmRpbmF0aW9uQmV4SW50cmluc2ljc1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1MTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWIyOGE1ZWQ0YThhOTBlNjQyZWJmNjM1YzM4NDkxMmIwNDQ5NjRmNWYzMjhjYTMyMTM2NWM2MjRmMmUxZjAwNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblByb2Nlc3NIZWFkZXJTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NTY2LAogICAgICAgICAgICAic2hhMjU2IjogImY1N2FkN2FhYzY0OWQ5MzJlMTQ5MTZiODBjMDVlN2YxNzlhZThmOWMyYzI3MWVkZGFlOGM0N2M3MTMwZWI2YTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25SdW50aW1lR2FzU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc1MzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjdhMjg3ZjFkNTk2YzNlYzkwMDIyZDI4NGYzNGQxYmYwYmU1NDQ3MjU4MTAxNzMyMGQ3MTQxYTNmYmQwNzFjNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblJ1bnRpbWVMaW1pdHNTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmQzNzlmOTZjNWQ4MGU5M2ViNThiM2YxNGQ0OTVlMjE0ZGM2MDJjM2ZlZTViMjU3NmUxMjFiMDI4YjBlY2E4ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlRGVmaW5pdGlvblJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDM1LAogICAgICAgICAgICAic2hhMjU2IjogIjNjZjc1NzkxZjQ1Mzk2YzQ4ODE3OWE3MTE1Y2EwMjY0OGUyZGFiMmU3MWRlMTdhY2E4ZWZhNmJkZDZkZmRmYzkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZUVmZmVjdFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3ODYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTFhNTMwNDQ0NjQ5NDI4Y2Y1OWQxMDIxOTRhNWJhNGZlZDFlZDM3YzYwOTBhNDA4NDIyNDUzYTA4MjQ1NGMxZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUHJvZ3JhbU5vcm1hbGl6ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyODU1LAogICAgICAgICAgICAic2hhMjU2IjogIjVkMmE0MjY1MmVhOGQwNGJhNGUyOTYwMGI3YWJlYjY4M2RkZWI1ZjA0Zjg1ZGUyZjg5NjVmMDQwYjZhMzg1YTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1QbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjc0MTE5NDNjNzMyNTBhNTVmMmUxODg3MGJlYjliOWNiOGFhMzk2NmY0M2FkYTRkNjM5MTliOWI5YTczYjM5ZDgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1QbGFuQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWMzNGVmNzZiNzE1NjQzZTYxZWM3YzZkMTgzOWJiMDgxOWVhODE5MjZjNjUwNTQ2NzljM2UwMjMwODhiZjdhYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUmVzdWx0RW1pdHRlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAzNTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzg2OTY5YThiYjhlOGFkNmRiNjBmNmM1NDIwMGU0ZjgxNTQ1MDc1ODVlOTkzODBlNTkyNjVhNWM4YzUzYzczMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUmVzdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI0LAogICAgICAgICAgICAic2hhMjU2IjogImUwYjlkOTljZDBmOGYyMjcwMDMxNjc3YWI1NTgzMWVlNGY3YjVhZmYyYTRmNTYzYmYzNTA1YzM4YzcyZmUzMTIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVN0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ1MDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTJkY2Y2MzllZmVlNjUyZTJiYWFkZDU0MzI2ODA5YTkzNzdlNGViNDQ2Mjc2ZGViOWFjMTFmZGU5NDVhZWJmOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Gcm96ZW5Ob2RlVXRpbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzY1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJiMmJiODMzNmI1NTk0NjcwMTAxNGY0M2Q1MGM3NGNmZDE1YjY1MTM4OWY2YTZmYmIyYzI2ODczMzNiN2M3YTc3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L05vZGVVdGlsLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzM4LAogICAgICAgICAgICAic2hhMjU2IjogImQ1N2QxOGNhYzFlYmM5NTM1NjJjYjcyZTY3ZTZhYzU5MjI0ZjA0NGQ5MWIwMzk1NTU1OGYwZDRkNzIyNTgzNTYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg0NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWZiYTk2ZjRiZGUxZmNkYzcyMzI5YTY1Mjk4OTUyNzBjNGIzMzYwZWU0YjY3NmQxYjdkN2EzZWY5ZTkxMjhkZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dQbGFuQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGZiYjk5ZDJiMjk1MDQ3ZjU1YTU5MWRlZWQ5ZmQ4MjBiODU3OTk0MTZkYzgyMzU5M2Y5MWI2ODAzOTNiNTdiOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dSdW5uZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMTM3LAogICAgICAgICAgICAic2hhMjU2IjogIjg4ODIwNWMyZmI4ZDBmYjlkMjk0NWM4ZDgxODVhYmJlY2NmYmQ1NzdiNGEwZDhlMmRjMDIxODc2NjlmZmFkMTEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU3RhdGljVXBkYXRlUGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NzM5ZGQ0ZTVkNmVmNDY2MTc5NDI0MmFmYzZlMjI5MTcwOGRjMGE2MWNiMTQ2MzBhMTY0Mjc1MGU3ODI5YWU3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1N0ZXBFeGVjdXRpb25Db250ZXh0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzg0NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwNmRmNDk5ZTA5MGI3YzA3NThkM2E4MDJjODVhZTIxZmFkZTRlZjJhZGQ5ZjkxYjhmMGRmMzRhMzdmMDRjNThkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1Rlcm1pbmF0ZVByb2Nlc3NpbmdTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2M2NTI1ZGRlNTViYzU4MThiNzcyNTU1NTM3YjgwNWRkNWUzZmE4NDc3YjRhZmFhMDExNTNmZjI4NDhlMWYyYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9UcmlnZ2VyRXZlbnRTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQwMDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzRmMDdhYjBjMGJhMmYzOWU3YThjNmY0NWUzODY2NDY2NzFkZmE4NmFiOGUyNDA1ZjgxZWQ0ZmJjMTA0OGI5MyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9VcGRhdGVEb2N1bWVudFN0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI3MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTdiNWEyMjRkYjI4ZjIxOGNiMzQ1MzdjMjcxMzYxZDBmYmM3MDE0MjliN2YwNzYxZjE2MzMwZDMwMDRmNjE5NiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0JleEdhc0xlZGdlckhvc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MjA4LAogICAgICAgICAgICAic2hhMjU2IjogImFiZWU2NDA1ZjhkOWI2YTAzOTQzNjYwZmZkMDY0NzY5NGUyNDJmOTA4NmFjZjRhYjNjOGQxNmIwMzE5MDdiNWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dFeGVjdXRpb25TdGF0ZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzEwNywKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjdjMzAzODdlMmUxMDM1NTlkMDEwYWRmYWU4MDU4NTQxNzg5OWZmNjI0N2ZkYzVlMGZjNmI0ZjkyNmExYWNjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93UGF0Y2hFbnRyeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTIyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0OWZhZTBiMzJkMjIwOTNiYzIzZTUzYWQwYjM3OTFjOTEzMGRiN2YzNzE3NTBiN2E3NzJiZWU4Zjk4ZGFhMTNiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93U3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDk5NWY1NGExYjg1Njk2OThjZWM3MjY4NDBiMGZlYjkzMDcwNGJlNDY5OTg2YzA2OTc2YzM1ODdlMDIyMTNiOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1N0ZXBSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTBlMjliZGY2ZjkwNDU1YTZjZWU1ZTBjM2QzYTYyY2EwZjUyZGIyOGQ0MmVhYTBiOWUzMmEwM2FmMzhlZDUwZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1N0ZXBUeXBlUHJvZmlsZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjI4MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZjE3ODU2NjdiMDA4YWQwNDY5OTI1MGU1MGNhODJjNzQ0ZWMzZWFkOWQ0Y2UzMTUyYjI2ZmQzMTFkOWM1NDIwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvY29vcmRpbmF0aW9uLWdhcy0xLjAueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzNTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWZjZGMyMjU2MzE1MmNkZDhjYjM3ZjllYTczOTQ3N2NlZDVmN2E5ZTMwODhhZWNhZjI0NjgxMmMzYTNjNmJhYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZENvbGxlY3Rpb25BY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTY3MywKICAgICAgICAgICAgInNoYTI1NiI6ICI5YWZjYWViY2MyYThhODRiMzgwYzY1ZDFiOWFkM2E0YTllY2Y3MzNiNjE2NDQxOGYxZmI5ZTc1MjcxMjcxNGZjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9MYXJnZUhvc3RQYXlOb3RlU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MDI1LAogICAgICAgICAgICAic2hhMjU2IjogImU4ZTBjNjlmNTBkMTYyZGE0NmIxYzk2MTkzZmJjZjBmY2Y4ZDY5MjgyY2Y4M2RjNzgyMjViNzU1MDc1YzRkZjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05iYUhvc3RMaWZlY3ljbGVDb252ZXJnZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNzA2LAogICAgICAgICAgICAic2hhMjU2IjogIjZjOGQ0ZjZjZGI1ZGQ1YzBkODNiMDRiMWQ4MmJjYWIzNDc4Njc3NWFhNDY0NThkZjVlMWRmZWI0MjBjMTc3NmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05iYVNoYXJlZEdhbWVMaWZlY3ljbGVBY3Jvc3NIb3N0c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NTgwLAogICAgICAgICAgICAic2hhMjU2IjogImYxMmE1MTM5YmI5N2I0Y2RhNzM4YzRlNGUzZjM5NTk2MTcyNzY5NDlkZGZiZDNjOTY3MzM4OTA4MWQ4NDMyYTkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZER5bmFtaWNQcm9jZXNzRW1iZWRkZWRBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTIzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YmUyOTcxNWNkYmMyNmM2MjljM2RkYTMzODM0MDViZTBmY2I0Y2NmYTkwN2Q3ZWQyMzQwOTVlNTAzMGY4NTRjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VEZXRlcm1pbmlzbVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODc2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMmNmYTY3YjI4YTE3YjFmOGIyNGNiYzQyNzY5OWM3ZmMxNTFjNmNkZTg1OGE0YzJhODE5NDQxNzVkZTQ5ODUxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzQ5NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTBhZDY1YzdmMWU3Y2QxZTU4ZWVlMWM2Y2QzMWQ0OTMyYWUwYjkzMzZkMjkxNzdmNmUxM2NkYzI1NGY1OTgyYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlSW5pdGlhbGl6YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MjQ4LAogICAgICAgICAgICAic2hhMjU2IjogIjc0MTgzNmUzZmUyMmNiZjRkZjgxNGY2ZGY5OWM5MjBhZjVkYTZhNGYwOGRjNTNkZDE3MmY3YWE4MDVhMjE0ODEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTAxTmJhRmxhZ3NoaXBTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzY4LAogICAgICAgICAgICAic2hhMjU2IjogIjc3NTNmYWU0MmRkMzgyZDIxNTU2MDU3MTEzYmJhNThiYTc2MmZlNWQyNGNkMzMxMDY0MDQ0YjE1ODliMzk2ODEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQzMjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTg4ODdlN2I0MmI3ZjFjMTVmNTUwZGZmNzE3OGVkMjQxYmQ1M2U0NGM4NWI0NzAyYTJhYmUyMTA2ZjQ1YzA3YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGhvdXNhbmREb2N1bWVudExvY2FsaXR5U2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTMyLAogICAgICAgICAgICAic2hhMjU2IjogIjkyNTE5ZmI2OTEwOGRhMzE5YThhZGFjYTkxNTI1N2JjZTY0YmMwNWRiOTRhOTcwNDZlM2E0MmY0ODk3MDM0M2YiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1dhZG93aWNlUGF5Tm90ZUFjY2VwdGFuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTY3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYTZiOGVlNTNjNmMzMjhjNTlkYzAwOTJmMzc2YmE1ZDE2NjYyZGQ4YTQyMDhhOGI5NDE1ZGQ3YTRiZGEyYTI5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0Rml4dHVyZXMvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Db29yZGluYXRpb25UZXN0Q29udHJvbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAwMjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjczZWJjNDVkNWI1M2U3MjI2NWQ0NGY5OWU1MDgxMGZmYTYyN2VkN2I5ZGJkZDNmYjUyYTM0ZWM2YWNiNDZjNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAic2hhMjU2IjogIjE2OTBmZWFkMzYzYTlmY2ZhYjA5NTFkNjhlYjgwNzU0ZGQ0MzRmM2MwZTNlOTYwNTk3MjIyMTE4NDBjZWUwNGUiCiAgICAgIH0sCiAgICAgICJoYXJuZXNzU3VyZmFjZU1hbmlmZXN0IjogewogICAgICAgICJhbGdvcml0aG0iOiAiU0hBLTI1NiIsCiAgICAgICAgImluY2x1ZGVNb2RlIjogdHJ1ZSwKICAgICAgICAiZmlsZXMiOiAxMTgsCiAgICAgICAgImVudHJpZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogIi5jei50b21sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTU3LAogICAgICAgICAgICAic2hhMjU2IjogIjlhNGQ2OGE2OTllNzhmZjYwNGMyZTkwOWJmNmQ3ZWNkODJiZDIwYjRmMzY1ZWE4NWFkNjY2ZDg4YmIxYTA2MTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTMxMzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjNmM2U0OTRiOWYzZDg1MTBkMDQwMGI3YzM4ODExM2E1YjQ0ZTdhODQ4NjZkMWYyNTQ1ZjRmMGI4ZWQ1NTEzNGYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLmxvY2tmaWxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjM2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIyOWE2ZTE5OTZmODhmMDdhZTU2ZTRjNzIwNDA5YzA5MjQ0MGJjNmFkYTE5NzEyNWEwZGZlZjAxNzIyYzNlOTRjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ5LAogICAgICAgICAgICAic2hhMjU2IjogImZkNzNlOTEzMTdhNTc2YmU5ZmQ3MDdhZDM2Y2VmMmVlYjVmZjVkZDBjYmE3MTE2M2Q4Y2MzMDhmYTY1ODI3YzMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL2JleC1zb3VyY2UubG9jayIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwMWM5NmM3ZTc2YzFhNzVkZDZhMGRmZDA5NjU2ZDY0NDk5NTdmYjE0NGRkMzYzZjc4NzU2ZmM1NTY4NWRiNDE0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9wdWJsaXNoZWQtYXJ0aWZhY3QubG9ja2ZpbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTI5LAogICAgICAgICAgICAic2hhMjU2IjogImI0ZTdiNzhiY2Q3YWU5Mjk1OWI2MWY4ODJhMGM3NjJhNTY0ODRhNTdkOGQ2YTEzODhjMWZmYWJiOTYyYmIxNTciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3JlcG9zaXRvcnktc291cmNlLmxvY2siLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmQzYjA1NTEwOGVmNjVhN2Q1NGUwOWM5ZDljNjE5YzIwOGEzZTFmNzUxOGI2ZTFmNTE0Yjc1ZDQxNjM3ZmZmOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0ODQ2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI0OTdjOGMyYTdlNTAzMWY2YWE4NDdmODgxMDRhYTgwYTkzNTMyZWMzMmVlMTdiZGI4ZDFkMmY2N2ExOTRhOWM3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3IiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODY1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhNWE1YzE5OWJhMDIxODlhZThjNDZhMzM0MjIzMzcxYTIwNTk5ZDljMjk4ZWY2NWU3NTQwZWRlNGEzZjcyZDU5IiwKICAgICAgICAgICAgIm1vZGUiOiA0OTMKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXcuYmF0IiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg0OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTM5Njc2YzQ4YjU5NmFmZGE2NGM5NjNlYzhmN2VlNTZjN2IzZmU3ZTNiODFkMWRiZTJkMWExZTNkZDllOWY4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNjcmlwdHMvcm91bmQxMy1hYi1ldmlkZW5jZS5tanMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NTg5NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwKICAgICAgICAgICAgIm1vZGUiOiA0OTMKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNjcmlwdHMvcnVuLXJvdW5kMTMtc2FtZS1tYWNoaW5lLWFiLnNoIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwKICAgICAgICAgICAgIm1vZGUiOiA0OTMKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNldHRpbmdzLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTdjYTU4NTFmOWY2NjMyMDcxY2UxMmNmMGY2MjA5OGQ5OTVlYzlhYzI0NjJlZTAwM2ExODdjMjNiNjJkZDZjYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvY29uc3VtZXJUZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vY29uc3VtZXIvUHVibGlzaGVkQXJ0aWZhY3RDb25zdW1lclRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2ODQ0LAogICAgICAgICAgICAic2hhMjU2IjogIjk0ZWU3N2ViNDhhZDNjNDY5M2FlNTdlODBkMWFkMjVlMjZlNDdmNzFlYzgyYTQ5NzAzNDM4ZDZkYjJlOGY0OTgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0FwcGVuZEFkbWlzc2lvbkF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjZmMTdmNzNlODUxODQ4MDBjMTE2MzRhN2U2MGIwNTI4YzQ1ODVjZDdiNGM0NDIyMGI0YjdjZWNlOGJmOTQxOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ2FjaGVTZW1hbnRpY1Bhcml0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDk3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YzFlOTY1ZGUzNzc0OWVmN2YzNjYwN2NkYWFlYjQ5NjJjMmMyOWVmMDJmZGQwZjc4ZjVkYWI5YTRkMTI4YjYwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9DYXRjaFVwUGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE0LAogICAgICAgICAgICAic2hhMjU2IjogIjM4MGI0MzEyODk3NTJmNjY2NWNhNTlmZGExZjMyNTQyOTczMGI1YmI2ODRmZmY5NDRiYTJkZjc0NTQzZTRkZWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NvbmN1cnJlbnRFbWJlZGRlZENoaWxkQ3JlYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjgwLAogICAgICAgICAgICAic2hhMjU2IjogImQwYTI3M2FkYmM5OWMwYzE4YTRmYzdmZjNhNjQwMjZjYjQzYzM4Nzk5OGI0YWQxMDg4YzNmMjI4NjYzOGYyMDEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NvcmVCZWhhdmlvckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmM5NDJkMGE2YmQ4NGQzYTE5ODdlMzUyNjQyZTdiNDQ0Mjc5ODg5OWJmNGI2ZTIwMjdlNmIzOTdiYjQwN2IxYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRGVlcFNhbWVFbnRyeU9yZGVyaW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5ODcwLAogICAgICAgICAgICAic2hhMjU2IjogImUyMzgyNmE5NmU3YjU5OWJiN2Y5ZmVlZjhlODA3MTI1ZTA4NDE3YWRkODBiNDg2Y2Q5ZWNjMjM2M2Q2MThlMjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNIaXN0b3JpY2FsU291cmNlU3VyZmFjZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjcwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMTA0NDI5YTczYzNhM2IyMzI1MWJjNzk0NzJmMjAzNTUwYWFlMjhkMGU4ODQ3MTViMjNhMjkwYWRhNDZjOTNiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkSGlzdG9yaWNhbFBhdGhBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzI4YjY5ZmM3ODc3MmJmZTA4OGM3NGNiNjUxMmE1NjRhY2Q3NmE3MzUzMDAzMDNiOTQwZWI1NmY1YzAyYTEwYSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZFBhdGhBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDU5MywKICAgICAgICAgICAgInNoYTI1NiI6ICJlMmJmYjMyOGEyMTU2OTBiZDQ2ZDJlMGJlMDBhYThhYTVlZTI1MDgzMDlmYTNhZTBlNTM3NjExZDNiZjhkMmE3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZEVwb2NoRXZlbnRPY2N1cnJlbmNlSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Njc1LAogICAgICAgICAgICAic2hhMjU2IjogImY4Mjg3MGUzNzliZWNlYzhkOTdjOWFhYmQ4ZTY0ZWQxNjFkOTg5NTVmNzFjM2MxMzlkNzk0NzhkZmY3ZTI4MWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkT25seUxheW91dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ0MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMmY1MzlmN2Y3YWJiNjU2ODQ2MzhlZGYyZjI3NDU0YzAzOTQyZDFiZTkyNmJmYjEyNTE2MDlhNWYyYzA1YmUzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZE9ubHlTdG9yYWdlUG9saWN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE5MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMGFiZGJhNDA4OThjN2IzMmQ2YTZlMTQ0NjcxNDY1ZDUwYTRmNTU2MTZmZjAwZmE4MGRiZGU1MTI2NjIwNzUwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbmdpbmVNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTZlMjlkYjgzYzc2MmJiM2UzZjhkMzFjZDgxMzU4MjkxNjIwOTM0NDI3OTBkZTAwOTlkOTlkMjkxYmQzYzBmZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lVGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyNDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzQ3ZjY0NzViNWJlZTNhYzg1N2U2MTA2YmU0ZTQ5MmI1ODk3YzY1NGY4ZjA5OGM4OTBlMWY0ZTcxMTNkZGRjMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lVGVzdFN1cHBvcnRNZXRyaWNWb2NhYnVsYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZWU4ZTYyYmYxYmRiMDdhYjcyOGE2MTE0N2QzYjIzOTljMzgwNWY5YjM5NDAwZTRjMDdiNTU3YWViN2U1OTgwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FeGlzdGluZ0VtYmVkZGVkU3RhdGVPbmx5Q2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmRkOTY2ZWUzNDRiMjQwOGYzOTI4ZTM2YWVhZjQ2OGEwOGQwNGZmY2IxZjNkZWQwODBmNjk1NzQ4OTc1MDg3YiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRmFpbHVyZVJldHJ5QXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjIyMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjcwNzMwYTdjMDFmYTA5NTQ1NDIwOTZkOWE4NzFiYmZlMjdhNDM0NWYyMGUzZDdiMWZlZWIwMjgyMzQ3ZDMxOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSGlzdG9yaWNhbFNvdXJjZVN1cmZhY2VJbnRlcnZhbEludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc4OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjY2ZmMzg1YWI2NzI1YTQ2NDI3NWJkMDkxZjQ0NzNhZDExMjk5NTQ1N2U5NmM1YzE1Mzg2ZGRiZmEyZGEwZTVlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Jbml0aWFsaXphdGlvbkxpZmVjeWNsZUV2ZW50T3JkZXJpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc3MTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTdmYmRiYTQzYWVjZDM4YmQ3YmI5NjJlYzcyZTM0MzBkY2I5NDEwNDQ4NGQwMjI0ZjhkZWFkZDQ1NjZiMjYzYSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSW5pdGlhbGl6YXRpb25SZXRyeUlkZW1wb3RlbmN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk5OTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiODNhNmYyYmQxNzNjMzQ1YWIwMmEyYmQzZDc1MzQyZmMxMzA5OWFhNTliMjc5MTNiNzk0ZTIxZDJiNjM0NjAyZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTGF0ZUFkbWlzc2lvbkVtYmVkZGVkSGlzdG9yeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4OTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWU2ZmVjMDRkNWUxNWEzMmM4N2U3M2RjNGVkZWFjMzhhYjU1MjcxODFiODg5MmM3ZjE0ZWFmM2VjOWVkNzc1MiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZENoaWxkQ29sbGVjdGlvbk1lbWJlcnNoaXBNdXRhdGlvbkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzA0NywKICAgICAgICAgICAgInNoYTI1NiI6ICI5ODViZDk1OWRhZGRlMzBiNjc2NDY1ZmU2MzJiYTI3OGIxOTcxNWM5YzQ4MjI2NDQ1YmE4YmRiYmJmOWNhYzY1IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NYW5hZ2VkQ2hpbGRPd25lcnNoaXBHdWFyZFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1MzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGE5NDhlY2VjNGM2ZjYwNTVhYWE5MDRkNjkxZGM0NjNhZDUzNDg4NTllOTAwZWYzY2MzZTE3Y2ZlYzU3YzkxZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZERvY3VtZW50SXNvbGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDQxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJhNGZlYjFlMjRhMjZiYmY5ZTI3YjQ3ZGU3ZWUzYjU0M2U5ZTBmOTU3MjU1MzE5ZTg3M2IyNzFlYmIyM2VmMTc3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NdWx0aUNoaWxkU3luY2hyb25pemVkQ2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNDg3LAogICAgICAgICAgICAic2hhMjU2IjogImU3N2Q1MTE1MmFmNzdhYzhhYzU5NmVkOWEwNWVkNzE2ODQ3NjM3YTAyNjE2M2IwMjNjMjVkYjA3NWVhNmM5NTkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZEVtYmVkZGVkQ2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2JkYWUwZjc1ZWJiZTZmNjAyNWY5OWI5NGFjYzdiODI5YWQ0ZjYxOGEwZWRlODIwMDJjMzQxMjZiMmMyODIwOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkT3duZWRTY29wZVBsYW5JbnZhbGlkYXRpb25JbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTA4ZTMxM2VkNzMwMTI3MWM3N2QwNWYwMzA5ZjM3ZGIwZDIzZTMwZmI5ZmMwZTU1MzgyMGNlOTVkNGNkNWQyYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkU2libGluZ0dsb2JhbENhdGNoVXBPcmRlcmluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExNjE5LAogICAgICAgICAgICAic2hhMjU2IjogImQxOGRlODBlYzQwZDIxZjM1NmE5MGZjMzVkMzg1M2I3MzczOWRmYjU3NzZhZjNlNjJmMmI1OGMyM2U3YjdmOTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05vblNjYWxhclJvdXRpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzFmODNhNGQyN2Y1YjFmM2Y2ZTVlODgzODcyYTFhODU2YmEwZDVjOGFkMTE4NDU3MTkxZWJmMzNiZTQ4ZjQ3YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlQ29ycmVjdG5lc3NJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0ODc5LAogICAgICAgICAgICAic2hhMjU2IjogIjQ0NGU4NDc5NGI0ODMyMjRhNWI5ZWQyNzIwNThmNTk3MDlmOTQ5MmVhZjc2NTg4YTA5NTNkZmQ0N2ZlMzFjZGYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzcxLAogICAgICAgICAgICAic2hhMjU2IjogImYxMmU4OTJjMjEzYmJjZjc0ZDA5ZTJiNzFiYTFmZThmNzMzMjdlZWFkMDdhZDNmZmRhM2QzMTk3YTc0YjUyZjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZVJldHJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjAxNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiNzAwZTNkNzQ3M2JiMzk1OWRkYjQ3YTNlYjI3MTk1YTc1ODdhZWNjMGQzNTQ1Y2U3NjIyMTdjMDlhNzIwNGJjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Qcm9jZXNzRW1iZWRkZWRDb2xsZWN0aW9uUGF0aHNJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU1MTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGZhYTY5MTE4ZWU1Y2EwZTcwMmU2NWJmNGYwODJjM2MxNjU4ODdlZDdjOTdlN2E4MjBiYWMxYjg1OTU4Yzk3YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUHVibGljVGVtcG9yYWxGZWVkZXJJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1NDM3LAogICAgICAgICAgICAic2hhMjU2IjogIjU4NWUyNjE3NzdhNjZkNTVlNDg0NTg4ZGU5M2JkZGU2OTNiNTIwZDkyMjQ2ZTE2NzkxZjFiY2E2OWQwMDQ2OTEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JlbW92YWxDeWNsZUFuZFJlYXR0YWNobWVudFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg0MTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmEzZWQzMTg1ZWE4MzRmMjlkODIxNDZiNjQ3ZmU1NDJlYTcyNDNmMjdkYzA2Nzc3ZDBhZTdmNTMzZTVmZDkwMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUmV0cnlTdHJ1Y3R1cmFsQ291bnRlcnNJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3MzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmIyOWI2NmM3MGJhOWU5ZGNkZTA3MjcxMmFiNzVkNzMyNGY2NmI0Nzk0NTkzYzBjMWRmYWNiMmQ3ODljNDBlNCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMEluaXRpYWxpemF0aW9uSWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzOTk2LAogICAgICAgICAgICAic2hhMjU2IjogIjQwZWQ2NzYwZDAxNTRjMjM1NDZkOGNkZDU2YzU1ZmMxMGViYjllNGEyMzhkYmJlNjQyYTk1ZDhiNmU1Mjg0NjciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyOTRlMjA5MGI1YjZhMWNmMjY4ZDAwMjNkNzVkZmMxNGQ0ZjZlNTBlZDA1YzFhN2E5MWVmMTYwMTUzNmMyY2MzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TYW1lRG9jdW1lbnRJbml0aWFsSWRlbnRpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NTA4LAogICAgICAgICAgICAic2hhMjU2IjogImZhZjEwNmMyZjAwMWY4YTFjYTM3MThjZWVlYWJiN2IwY2VkMDJkYzg5ZDdhZTVhMjcyOTA3YTQ0ODk2MWRlZWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NoYXJlZE1hbmFnZWRDaGlsZFR3b09jY3VycmVuY2VzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTQ2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJmYTcwYjA1ZDJhNDFkMWMzZDRhMmVjNzViM2YxNGYxYTQ2ZjVhYTI0YmZjNGE5ZTkyMmRmODg4NmE1OTMyZDc3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TaGFyZWRNYW5hZ2VkQ2hpbGRUd29QYXJlbnRzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQwMDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDkxMzQ5ZDA4YjBkZTg0MWMxM2EzMDA2MGVlNzQ0MDM0MTkwYjE5MWZiMjE5YzdhYmE2ZDE2OWRlZDdjNzNiNSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU291cmNlU3VyZmFjZUlkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2OTM5LAogICAgICAgICAgICAic2hhMjU2IjogImVmY2UzMTVjZjNmYzczZmQ2MWYyMGU2NzgyZGJmMjdkNTMzYmQ3NmUxZTY2OTA5YjIwYzliY2U2MTRmZjM4MTIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1N0YXJ0QWRtaXNzaW9uQXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYjJjY2I1MmYyMDIyYjQ1ZWFkODc5ZDQzODAwYmUzOGQ1OTk5ZTg0Zjg5MmYzYjY1OTA0MTZjMjY0MjdmNDZkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZW1wb3JhbEFkbWlzc2lvblBvbGljeUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM5MTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWQ1MzM0MWVlNGUxMGZiNDIxMjA3MWIwZGY1MGExZWYzYWUyODVlMTcxZThhMGZlYjY0NDk5ZTQxZGE0MTU1MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVzdEVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA2NTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZGI4OWI4YjkyN2Y4NjJmYzVkMWE1MGE3ZGYyMmJkM2U5NWIzMDU0MmIzNmE1MTI2MmE2OTAwZTM3ZDAxOWUwYSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVzdFJlc291cmNlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjIzLAogICAgICAgICAgICAic2hhMjU2IjogImYwMDllMWYxZjA2ZWU3NzUzMmRkMGQ0ZWM2YTAwNjBkNzg4ZTZjYzI2OTMzMmM1N2M5NzY0YmQ0YjEyY2JkY2IiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1dob2xlT2JqZWN0RmFpbHVyZUh5Z2llbmVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODAwLAogICAgICAgICAgICAic2hhMjU2IjogImM3OGNlMTk3ZDkyZTZjMTg4YTFmMmU1Y2VjY2I2Yjk4OWY1YjhiN2U1NjhlZDk1Nzg0ZWU2MDllNGNlNTYzNjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0FwcGxpY2F0aW9uUmVhZGluZXNzUHJvb2ZJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk2NjgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTk4NzcxMTI2YmVmZWRjZjhiZGNlMmJiYzQ4ZGJhNDAxNDkzMzMxYWYwYzJkODMwNWJhMzMyYTYyYWYzNTgzNCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRSZWNlaXB0UmV0cnlJZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzk0NywKICAgICAgICAgICAgInNoYTI1NiI6ICIyOWQxMzliNjVhMzY2YTA5NWY1NjE2Y2ZjNDI3NDMwZWJhYzk3MTkwNWM5ODQ1NjFmM2RlZWMxYjU5ODIxNjdlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2FsbC10aW1lbGluZXMtcm91dGluZy1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE2LAogICAgICAgICAgICAic2hhMjU2IjogIjhlNzQyNDE4ZDY3NzA1MTg2NjZjNzNlNWRmNzNlZTk5N2I2NDU3ZDY1MjRiODk3NDJmZWU4ZDA5YWZjNGRlMTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vY29tcG9zaXRlLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNDU5ZGIyY2I4OGZhY2U4ZjNkMGI1OWI5NjhhYWI1NTIxZjM3ODUwNmI5N2FhZDBiY2VmN2Y4ZDllMmY5OGEwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2NvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3ODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTFmYTlmYzc1NTc2YWVkNDY0NjkzMjViMDI3NzgzM2NkOTA2YzM3ZWQyYzY1MDY1YzNhOGI5NWE1M2U3YmMyYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktYTEueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0NzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjU0Y2NkZTE0MTNjMzljYmY0ZDFmNWIzNDQzZTJlMzU4YmM0NGRlYjljZDg3YzY3YzQzYjI1N2QxNzllMDJkNSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktYTExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTNjYTc0YmVlNjU4ZDA1MTMzZTRhZWI1OGJmYzdkOWFiYjRiOTM3YjZjMDMxZDJlYmM4MWM0N2E1ZDE1Y2FkZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktcm9vdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg1OCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwZDQ2ZTU0YjU5ZTNlMDY2ZTUxYzEzM2VjMzdkYTEwMTIwMWM4MDg0NzQ2ZGEzZjQyMTZiZGViZjFjYjc1NWZiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2R1cGxpY2F0ZS1ldmVudC1lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ4ZDZlOGRjZDRlOTMzNmFmMGMyNjY1Y2UwMDdiZjQ5YjMyMTVkZDFjM2JmZjhiYTQwZmVlMWY0OGU1YWFiMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9keW5hbWljLXNvdXJjZS1zdXJmYWNlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzg3LAogICAgICAgICAgICAic2hhMjU2IjogImE2ZWUzMWUwNWEwMzE1ZDViNzZjMzMxN2VlYjg3ZmIyMDAxYmIzNTEyNzRkMTJhMmYxMDBjMTkzNjRkNzliOWEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY29sbGVjdGlvbi1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyMzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTViNDAzOWEwNmM1MTIyYWYyNjczYThkZjBmYTRjZTI0OTk5YTI3MmNhMGM4ZDk3ZDk3MTEzMDE3ZTUxMzc5NCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb3VudGVyLUIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjMjc5MDk0ZGJjNTFlNjgwOGI1N2RmMzI5MDBkMzA5MTI4YzRhMjA4ZWQxY2Y0ZWFkMThkM2U0MjllNTczYjc2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMzE2YWZiNmNmYjg5MTZkMzlhN2ZkNzIzODk0OWU0YjBhNThiNGQ3MmEwYjRiNDg0MTQ1OWVlNDA4OTUwMTNlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLW1pZGRsZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTYzNiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmOGZmMDJiYTRiOTZlY2QxNWU2YTM3YTk3YzhiMGJkODIzZGRlYjc1OWVhOTgwMDk3NTJjMzNmYmI0NTNkZTllIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2YjU5Y2MyZWMwY2FhOTQyNTE5ZDhkZDNhY2M4NTUxZjJjY2QzMDRlMGJkNjI1NDZkMzE2Njk0MTY4NDk0YmYyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjg2NzY2MTMzOGE4YWFkNTcyYTE3NWNkMmMxNzU4MzIzMjYzOGQ2MzBlOGYxZWQ3Nzc4MjI5ODU5YzgyYTdjMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1zdGF0ZS1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3MjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWZkYjA0MmNhMDc2MzcwYTcyOGZmZjlmODVkMTdkNDk0M2UwYTAyYjllZjY5YTJlZDQ5ZjRjMzBmZDk4MGY4YiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9pbml0aWFsLWVtYmVkZGVkLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjI5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NWRmMjMwZDZiZjkyZDJiZGJmYTZiMTgzYmM0YzI1MWY2Yjk3MzQwNWZiN2QwZTY2M2Y0YjBmMjlmN2I1YmZmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2xhcmdlLW9yZGVyLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYxMjMzLAogICAgICAgICAgICAic2hhMjU2IjogImZlZjQxYzUzNGE3ZDE3ODU3ZTlkMTZiOTY0MzFjYWFjYjhiZmViZGE0OGM5ZjBkNDMxOWJjZWE2ZTI3ZGUxMmQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbGFyZ2UtcGF5bm90ZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY4MjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzE3YmJiNmViMDNjMGE5MTUyYTAyYmJjZWExZmM3ZDdiYThjOGNhZmRiZGY4OTFlZjJkMjNhN2EwZTJjYTBhZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtZ2FtZS1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDg4LAogICAgICAgICAgICAic2hhMjU2IjogIjRiNWRkZTUwYzBmNGMyMDdkZjE1NjVhMjFmMjMyMzZjY2E3ZmMyMzViZTBmYmViYWI1MTg2NzZkMTIzYzgyMjMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjE0Mjc2ZTlkYzZhNGI0NjZmNmM4YjU3NjhhZGVhOTA4ZGViZTVjZjBlODI0NTA1ZmRkMDQ0YzNiNjBkMzM2NCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtcm91bmQxMC1zbGF0ZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDU0MywKICAgICAgICAgICAgInNoYTI1NiI6ICJjZDkwMWM2ZWEwMWNkODhkMDc2YmY2ZTgwNTllOGQ5Y2FiMDc3MWFlYmY4YTlmMTdlODY5YjRiM2YxNjY3OGY5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1zdGF0aXN0aWNzLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDc1LAogICAgICAgICAgICAic2hhMjU2IjogIjk5NWQ5MGEwOGY4ZTJhYTQ0YTU5MDljOTZlN2YzY2M1NTI1MWY5NmJhOWFkNjU4OTY2ZmYzZDFmZmU4YTBlMmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmVzdGVkLW93bmVkLWR5bmFtaWMtc3VyZmFjZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYzc0OTk5ZDQ3NzNhN2IyYjI5NWU0MjgzZmU0NmI2NzM2YWFmOWVkYmYyODYxMDY5MGUyMDgzMDM1YjNjZGVjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25lc3RlZC1zaWJsaW5nLWhpc3Rvcnktcm9vdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI2OGVlZWMzYTczNTA4ODc4N2YyZDUxOTc1ZmM1MzAyY2VmMjNiNmFjZDkzODgxYWVlOWY4MDUxMzRiNjI3YTVmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL293bmVyc2hpcC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIxMzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODk1NTNkYjY3YjIzYzNmOGNiMWIwYWZiZjg1OGE1MDhjNjdhZTc1NDAwNThmNmNlMmQxYWJmMTE0M2MyZTZkNCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9wYWNrYWdlLXBheW5vdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1ODIwLAogICAgICAgICAgICAic2hhMjU2IjogImJiOGMwZTFiYWE2NTc1YzM5YjYwZDk0Nzk2ODQ2NjFlNjZhODQ5OWM0MDhkNzcwZGJlZTNjY2FkZmNiNGQ5NjQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcm9vdC1pc29sYXRpb24tY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYzNCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MmMyMGNhOTM4NjMxYzI5ZTQ5YmEwMGU1MGEzMDdmZjUwNjk5ZTE5ZjM1NDkzYjEwNjg1NWY2YmM1NDU3NTU1IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3Jvb3QtaXNvbGF0aW9uLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyZmY2N2YwZGUzYTIwNjJmMzk0NGExYjlmMDFkYjI1YzkyZWQ3MWVmNzg0OTZlOTg0YTRjZWZlOTkwNTEwYjJlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3NoYXJlZC1jaGlsZC10d28tb2NjdXJyZW5jZXMtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjYzLAogICAgICAgICAgICAic2hhMjU2IjogIjdiMGEyYjdkZjRhNWIxMmMzZGRjNzkwM2ExYTM3ZDUzMDBkYTQwODU3MDMyOTc4N2QwZDY2ZjA0ZjQ4ZmFhYzkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vdGhyZWUtY2hpbGQtaGlzdG9yeS1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZGU0MGQwOTY1MzM3OGFhYzI0MDQ3ODMzZGIwMDIxOThhMzcyMWEzZjQ0YTIyMDM4ZmEzNDRiZWYyZjdiYjMwNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi93aG9sZS1yZXF1ZXN0LXNpbmsueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExOTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDk5ODc2MDFkMzlhMjc5N2RjZmQzNDk4YzcwMjViNTM3MzFkOWMyMTgwZTkzMTdiNjQ2NWExNmJlMjAyZDhmMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9wbGF5Z3JvdW5kL2ZpdmUtb2NjdXJyZW5jZS1pbml0aWFsaXphdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzk4LAogICAgICAgICAgICAic2hhMjU2IjogImIxZTk0YzAzOWQwZmQwZGY3MGIwYzgwM2ViZTkyMWEyOTBkMTU5MGJhYzY5YTkwNzNmZTQ5MTBjYTg5MzliNmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9keW5hbWljLWNvbGxlY3Rpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjNjZTQwN2E2MDBlOGFiZDQxNTdiMzNhODI5NTgwNzZhNjA0MjlkYzJmOWIxNGE5MGU0Y2E0MjZmMzFhOWE3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvZHluYW1pYy1wYXRoLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI5MTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWNlZDczNGVjNWFmMWJjMjMyODA3NGFlOTNkMzA0YmY5NTQwMGU3ZGUyNmUyZWZjMWRlODY0YWY2NDBiYTgzNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLWR1cGxpY2F0ZS1ldmVudHMtY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTA3ZTk4ZmQ3NDZiYzIzYjQyZTM5OGQ5MDI2YWNkZWMyOTdhNWE5YWRjODYxMzE0YTY0ZjllNzc5M2U5NjY5NCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLWV2ZW50LW9ic2VydmVyLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzM3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyODc1NmJjNGJiMzM5MTgyMTlmYmI3MTk2YWU2NDgzMDFhNDgwYWYxOWYxZjQwMzVhYjE4MTYxMmQzNzJlZGQwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tb3JkZXJlZC1ldmVudHMtY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwMzk0NGNhOTMzMjg3OWNlNjVmOWI0MDdkMDcxMWE2NGQ5NDNlMmY4MTEwMGRkZjA4N2E4NTUyNjBkN2U4YjNjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbWFuYWdlZC1jaGlsZC1jb2xsZWN0aW9uLW1lbWJlcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDk4LAogICAgICAgICAgICAic2hhMjU2IjogIjk3NWVjYTM4Mjg4OTI5ZDczNDAxOTBlNzMxMGJiNDVmNzJlYzJlYTJiZDU1NTM5NzZjNGFlYzcxNjVjMzFkZjciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uYmEtbGlmZWN5Y2xlLWdhbWUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMzODYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmYxYjc5OThkZDkwNjRmMzJmMDRkMmJhMjg1YjVhZmQ0NDk2NDNhYmY3N2YzZTM1NjNiNjBmNDcyZTNlOTEyMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDMxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMmNlNDU1YzY0MzA5OGMyOGFmNGJhZjkzNTZhNGQxZDY4OTM4MDlhMmY4MzhjN2JiODI3MDQ0ODU2MTQzOTAwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmVzdGVkLWR5bmFtaWMtY29sbGVjdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTg1LAogICAgICAgICAgICAic2hhMjU2IjogImEwZjUyNzliOTM0MTk3ZmRmMjYwYjNlMGQwOGIwNmI2ZDI0YWJmODAwNGUwMmMzYjA5YzZlMzgxN2FlMTA0OWMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRDb2xsZWN0aW9uQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU2NzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWFmY2FlYmNjMmE4YTg0YjM4MGM2NWQxYjlhZDNhNGE5ZWNmNzMzYjYxNjQ0MThmMWZiOWU3NTI3MTI3MTRmYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTGFyZ2VIb3N0UGF5Tm90ZVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTAyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOGUwYzY5ZjUwZDE2MmRhNDZiMWM5NjE5M2ZiY2YwZmNmOGQ2OTI4MmNmODNkYzc4MjI1Yjc1NTA3NWM0ZGYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OYmFIb3N0TGlmZWN5Y2xlQ29udmVyZ2VuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2YzhkNGY2Y2RiNWRkNWMwZDgzYjA0YjFkODJiY2FiMzQ3ODY3NzVhYTQ2NDU4ZGY1ZTFkZmViNDIwYzE3NzZlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OYmFTaGFyZWRHYW1lTGlmZWN5Y2xlQWNyb3NzSG9zdHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDU4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMTJhNTEzOWJiOTdiNGNkYTczOGM0ZTRlM2YzOTU5NjE3Mjc2OTQ5ZGRmYmQzYzk2NzMzODkwODFkODQzMmE5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWREeW5hbWljUHJvY2Vzc0VtYmVkZGVkQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2JlMjk3MTVjZGJjMjZjNjI5YzNkZGEzMzgzNDA1YmUwZmNiNGNjZmE5MDdkN2VkMjM0MDk1ZTUwMzBmODU0YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRGV0ZXJtaW5pc21TY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg3NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjJjZmE2N2IyOGExN2IxZjhiMjRjYmM0Mjc2OTljN2ZjMTUxYzZjZGU4NThhNGMyYTgxOTQ0MTc1ZGU0OTg1MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM0OTUzLAogICAgICAgICAgICAic2hhMjU2IjogImUwYWQ2NWM3ZjFlN2NkMWU1OGVlZTFjNmNkMzFkNDkzMmFlMGI5MzM2ZDI5MTc3ZjZlMTNjZGMyNTRmNTk4MmMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUluaXRpYWxpemF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTI0OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NDE4MzZlM2ZlMjJjYmY0ZGY4MTRmNmRmOTljOTIwYWY1ZGE2YTRmMDhkYzUzZGQxNzJmN2FhODA1YTIxNDgxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEwMU5iYUZsYWdzaGlwU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NzUzZmFlNDJkZDM4MmQyMTU1NjA1NzExM2JiYTU4YmE3NjJmZTVkMjRjZDMzMTA2NDA0NGIxNTg5YjM5NjgxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MzIxLAogICAgICAgICAgICAic2hhMjU2IjogIjk4ODg3ZTdiNDJiN2YxYzE1ZjU1MGRmZjcxNzhlZDI0MWJkNTNlNDRjODViNDcwMmEyYWJlMjEwNmY0NWMwN2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rob3VzYW5kRG9jdW1lbnRMb2NhbGl0eVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjUzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MjUxOWZiNjkxMDhkYTMxOWE4YWRhY2E5MTUyNTdiY2U2NGJjMDVkYjk0YTk3MDQ2ZTNhNDJmNDg5NzAzNDNmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XYWRvd2ljZVBheU5vdGVBY2NlcHRhbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE2NzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2YjhlZTUzYzZjMzI4YzU5ZGMwMDkyZjM3NmJhNWQxNjY2MmRkOGE0MjA4YThiOTQxNWRkN2E0YmRhMmEyOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdEZpeHR1cmVzL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ29vcmRpbmF0aW9uVGVzdENvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMDI1LAogICAgICAgICAgICAic2hhMjU2IjogIjI3M2ViYzQ1ZDViNTNlNzIyNjVkNDRmOTllNTA4MTBmZmE2MjdlZDdiOWRiZGQzZmI1MmEzNGVjNmFjYjQ2YzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInNoYTI1NiI6ICJjYWY0ODkyMWU3ZDIzMTlhOTZkODBiODkzZDQ2NWYwODIwZTY0NTUyZjJmMWJhMTYxN2QwNTZjNDc2YWU2MGVhIgogICAgICB9LAogICAgICAicm91bmQxMk5iYUV2aWRlbmNlIjogewogICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRXZpZGVuY2UuamF2YSIsCiAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgInNpemUiOiAyNDMyMSwKICAgICAgICAic2hhMjU2IjogIjk4ODg3ZTdiNDJiN2YxYzE1ZjU1MGRmZjcxNzhlZDI0MWJkNTNlNDRjODViNDcwMmEyYWJlMjEwNmY0NWMwN2MiLAogICAgICAgICJtb2RlIjogNDIwCiAgICAgIH0KICAgIH0sCiAgICAiY29tcG9zaXRlRGVwZW5kZW5jaWVzIjogWwogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYmx1ZS1iZXgtamF2YSIsCiAgICAgICAgInBhdGgiOiAiL1VzZXJzL3Bpb3RyL2RhdGEvYmx1ZS1iZXgtamF2YSIsCiAgICAgICAgImNvbW1pdCI6ICIzZWJkMmQ5M2JlN2YyNGNlNDQ4NDBmMGFiYTAyYjFjNDBjMjdmNWY4IiwKICAgICAgICAiZXhlY3V0aW9uU3VyZmFjZU1hbmlmZXN0IjogewogICAgICAgICAgImFsZ29yaXRobSI6ICJTSEEtMjU2IiwKICAgICAgICAgICJpbmNsdWRlTW9kZSI6IHRydWUsCiAgICAgICAgICAiZmlsZXMiOiA1ODIsCiAgICAgICAgICAiZW50cmllcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5jei50b21sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkZDMxN2ZiZTM2MjU2MWYwZTk4MjdjNzA1ZmY2MjYwZmQ2ZGYyNmMxNjUxOGUwYWNjZTk5ZWNiYTU5NWE0YjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuZ2l0aHViL3NjcmlwdHMvY29tcGFyZS1pbmRlcGVuZGVudC1idWlsZHMubWpzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTRhMGZmN2Q2NzU4YmVkM2M1NmEzMTBjNzJjOWEwZWY2MGYwOTU3MGYzMzAyMzZiZTdkNDYzMDAyYTdlYWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmdpdGh1Yi9zY3JpcHRzL2NvbXBhcmUtbG9jYWwtcHVibGlzaGVkLWV2aWRlbmNlLm1qcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWQ3MGM0ZjQ2YjE3MjFkOWNkNGM4OTk5NjIwOGQ3MzA2ODE2NzEwNzgxMjRkMWU0MzkxYTExMWQ2ZDcwYWM0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5naXRodWIvc2NyaXB0cy9wcmVwYXJlLXJjLXJlbGVhc2UuanMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzNTUzMzQxMjkyZDRiMzZhMjVlNGU5OTk4ODhhYjc2MDQ5ZGNjOWUwNjg2ZTljNGNiMWU2ZjgyNTM2YzE4ZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuZ2l0aHViL3NjcmlwdHMvcnVuLWZpbmFsLXB1YmxpY2F0aW9uLWdhdGVzLnNoIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjdkMDQ4NTlhOWQ0ZWI5ZGY0YzA1OGM4NDgxYmExY2Q1NmFiNTU5Yjk5ZjE0MDQ2Nzg3NmNmMzE4ODIxYzQ1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvbmZvcm1hbmNlL2J1aWxkLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUxMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZThlNTg0M2ZlMmI5ZjM3MDUyNzY4YjNkZGZjZDZhNzg5ZDljNzk1ZDVkMDg5OGZmNzY4Y2I1Y2E4ZTY1MzVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29uZm9ybWFuY2Uvc3JjL2ptaC9qYXZhL2JsdWUvYmV4L2JlbmNobWFyay9CZXhCZW5jaG1hcmtTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhNWNjNTVjYWE1OWIzOTE2ZTA4YTk5YjU5MjBhMTEwNjRjOGFlODM1MzVlNDJiM2JjYmUwZjcwMDk1NGIwNjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb25mb3JtYW5jZS9zcmMvam1oL2phdmEvYmx1ZS9iZXgvYmVuY2htYXJrL0JleENvcmVCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTkxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmZmY0OTNkY2FlNGJjYzcxNmIzOGI0OWIxNzQzODE3ZDgwZGUxMzlhZmU5NDhiZDY3NjI5NTVkMmY1NzQ3NzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb25mb3JtYW5jZS9zcmMvam1oL2phdmEvYmx1ZS9iZXgvYmVuY2htYXJrL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwZWUwYWY0YTNlMGE3MmYwOTM3YjNhZTAzZWM1NDVjNTc1ZWVjOWEyMmJlNWRkMzJhMDMxZjhmZmNjNThiMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb25mb3JtYW5jZS9zcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQmV4SG9zdGVkR2FzQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0MTcyOWRhYmU0ZjgyYjk4MDEzNGVhYThhOWU0ODEwYWRmZTMzY2M1NmQzODc3YWM5N2MyZjZiNTk2MWFjN2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhLy5naXRrZWVwIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29udHJhY3RzL2J1aWxkLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmY1OWUxM2E3NDlkNGIyZTUxMTcxMGVkNzcxNThhNGU5MWQ3ZmIzMjhlNTI4NjQ3MDliNTkzYjZkZjUxNTM2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvbnRyYWN0cy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbnRyYWN0cy9CZXhDb250cmFjdHNFeGVjdXRpb25Db250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4NDU5ZGFhZDlmNzM3ODEzOWYzYzc1ZThjYjIwMjc2NWQ4ZGQzYjc3OTUzYmJiNWVhMThiMzRhNzRmODhhYjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb250cmFjdHMvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb250cmFjdHMvQmV4Q29udHJhY3RzRmFpbHVyZUJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlZWNjMGY4ODM3Zjk2ZjIwZjFhYzdlMzNkNzQxN2RjYWVlZDJkM2RkNjhhNDBhNTgwNjZmYWY3ZDZhNmFiY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb250cmFjdHMvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb250cmFjdHMvUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dEJleERvY3VtZW50Vmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTk5NjhhYzkwMDM5MThkYmRkZmJhYTVjNmI2ZDllM2E5NzAwY2QxZjY3MWUzYWE3ZDBkMTI4ZDhlNmVlZmQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29udHJhY3RzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29udHJhY3RzL1Byb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHRCZXhHYXNMZWRnZXJIb3N0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTcyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwODQ4YmMyZTRhZTM0N2YyOWY5YTM4MzgxMDYzNzNkOTVlZGZmNTdjYmUxMzM1MmQyMzQ5NDZiNjdiNmIxMDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb250cmFjdHMvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb250cmFjdHMvUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dEJleFNlbWFudGljSWRlbnRpdHlCb3VuZGFyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTgzNjM4Y2RkOWI4NTYyYjI3YTRjZDExNGY0YWNlZjFlYzRmNDM2YjY4YmM5M2E3N2U5YmFkNmFmODY2NmY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29udHJhY3RzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29udHJhY3RzL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1YjhmZGIwNTYzOGUxM2VmNzRmYjdhZTYzOWUzZTIwZGQyZDMxNjZhZTRjYzRkOGMyYzliNDZlYzczNzg3ZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL2J1aWxkLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzdmNDBhZDc2ZmJhNGNlNTM0MzkzYmI3ZGQ1YjBjMmJkMjFkNzBmMWJkZmRkMmRjOWNiYzBmYWVkZDQzMmU3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9CZXhFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZmZGZiOTAyMDFhYzc4MzQyNzZlNDZkMWU5YTRiMjNhN2M5MTc3MTc2MGIxMGNkYjJmNWJmZjFiNzIzNjJkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9CZXhFeGVjdXRpb25FdmlkZW5jZVVuYXZhaWxhYmxlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0Y2ZjNjEzZGEwNzRmZGU2MWNkZDFkMTE5MmYxNjViMTE0YmU0YTUyYmZjOGY0OTFkYjFhMWJiM2E1OTFkY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvQmV4SW52YWxpZEV4ZWN1dGlvbkV2aWRlbmNlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2Q2MDU1ZWJiOTEyMWUwMWNiMmM1YzRjMDZhYTNlNGYyMjIxODE4Njg1MDRjZGM2OGIxYmZlMDZiMGZmNWE4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9CZXhTb3VyY2VQYXRoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiYmVjNmI5Mzk2ZmFkOTIxNjA1NmVlNzliMDc4N2Y3YzhmZmQ4MDE4OWZmNjgwYTllZTFkM2U4OTNlNTM5YjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleERvY3VtZW50Vmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1NDk0YTViNDI0MDBhOTRmNDZiNTg4Y2Q1YWQwYjMxYmE5ZWI5MmY5MjEzMTU3YzFlYzE2NDM1N2UxYzI1MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleEVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzA4NTEzODVkNmE3MzA4OWFjNjEwNjEwNmVlZjM5ZTJmYzRhYjk0OWNhNGFiMzM0ODMzYjM5Y2MxN2ZjZTMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhFeGVjdXRpb25Db250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTRlODUxYTlhYmNkZWU5ZWIwNzZjM2NkYmU1YTRkODc3YjZkZTMzYjI3NDY3YmJhNGJiMzdhYmNjOWMzYzY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhGYWlsdXJlQm91bmRhcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI1NWIxMzliZjMxYWNmNjk1NzljYmJiZTI0MTRhMzUyMWQ0ZjBkMTc5NjhmY2EzMDEwZWI2OTA2OTFiNWUzMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4R2FzTGVkZ2VySG9zdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNGYxZjFhMjM2NWNhZDBjZWZhODA4OGRiMzI5MjdhYWQ0YjkwY2VkNGNjMWYxZWEzMTI0ZjJkMGYwZDlkMzZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhJbnRyaW5zaWNJbnZvY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImM5ZjVjNGRmYWNkNTRkZDdhOGE3NzE4MzhhY2E2MTI2ODg2ZDZhNmMwYjViMzJkMGYxZDNkMDE0YzI3MjBjYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleEludHJpbnNpY1Byb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiODNlMGU4ZmNjMjNhMDIxY2U5YTI1YTUwY2I3NzI3OTNiNzgyZjhlMDExNDIwODY2NmZhZTYyNDM0ZjAwZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleEludHJpbnNpY1JlZ2lzdHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDA3NGI1OGIwMDhlYjYyZjRlODY4MGJmNjYzZmRhOTUzODMxOGVmYTA4N2EzYjNhMzg0YjBmMjZmYTU0MGIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhNZXRyaWNzU2luay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxMmMwNDJhMjA2Yjk2NTJiYjEzYTFjMWJkODAwNDIwOGNlMDNjZGIyN2UyMzc4Mjk0NTI3M2NiMjNhZTllOWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleFByb2dyYW1Tb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGY0NDM3YzJjYmVhOTYzYmFiMGM1NDEyNjllYjY5N2QzYzg2OGEwYzU3YjU0OGNjZTY0NTQ4NzZlNTYzZDRlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4U3RlcFJlc3VsdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjExYTliMTIzZWE5ODZjMDgxYWI2OWU3NjBlNmY4NjRiZTY1ZDUxYWQ1ZDk1ODY4ZjU4MjY5MmYxMjE1ODIzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4VHlwZUJsdWVJZFJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTAxYTRkNzk0NDMzM2NlMTAxYTNkOGE0NWUxOGY3MjFkODk2ZDdlN2JmZjM4ZDAxZTk3MDFhOWIxM2I4MzU5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvRnJvemVuQmV4RG9jdW1lbnRWaWV3LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2NjYyZTliMzM5NzljODg1YzFkOWFiMWM5YmU1NWRmYTNlZTdjYmE4NWFkYmVmZDIzYTA4NTQ2OWQ3MGE0ZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3MTkyYWEzY2FjMzVjZGFhYWFiMzdhZTlkNGZiZGY0YzM1ODE0Yzk4YzE3OTBiYjhkM2ZiMTRkMTUwNTliNmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxhdGlvbklucHV0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2U5NmJjN2ViYjBlN2NhZmE2MjY5NzhmMzdjODhjY2NiODFkMzMwODliMGNlZDA4MjFlMjhjODhjY2JlMzcxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleENvbXBpbGVkUHJvZ3JhbS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDEwYjMxNTc3YTkyNTc0ZjVmODZkNDYzOWViYmU4ZWZkYWEyMDk5ZDFmZWExN2EwMTc5Y2Q3NTdhNjM5NjA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29tcGlsZWRQcm9ncmFtQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZjhjMDNmYTM4NmEwMTk3NGY0NTg4YjNjMWU5OWUxYjFhNjZiMGU0ZWRlNTU3ZmM2MzgxMGZmZDdkZGQ0YjBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29tcGlsZWRQcm9ncmFtS2V5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiMDEyZGM4ZmIzMjMxMzg5YjFhYjI3NzQ4NDFkYTU5NjA0YzE2MWIxMmI1OTQyMmRiNzkyOTFlZmVkMmI0NjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlZFByb2dyYW1SdW50aW1lQWNjZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGZlOGMyODMwOGY2Mjg4ZDE1ZGY3N2YxMzk1NzMwY2ViNWExODkyMDdkMzk3ZmE5OWU0M2UxYzIwZjNkMTQ3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleENvbXBpbGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjg3NTNmMzAwMzA3OTQyMjVlZWRjMmI3OWVmNWJiNzNmY2Y5OTgyMjMxYTJhMmUzMDczMmExZGNmYTFmMmIxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleENvbXBpbGVyUnVudGltZUFjY2Vzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViY2Q3NTBmMTE2OTZiZjMwNWU0NmM2NDY4YWY2MTlkY2RkNTU4ZDJjMmRhNzZiZTYzM2VmYjU5Y2RmYmQxMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlclN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjgyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjViN2NjYzEwMjgwZGEyZWIwOWY0N2I2MWIzYjQ5NDA1ZWUyYzI0MTUzY2JjOThmZDE0YWEwZWI3OTM0ZmM1MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb250YWluc0NhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2NWNlMmU1YWZhZDQ2YjU2MGJhZmIwNWU4YjM2MzMwZGJhY2Q2ZmIzZTlhMjk5ZGI3Nzg2ZWI5OGM5ZTVjZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhFeGVjdXRpb25NYWNoaW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5YzIyNDdlYWVhNDk1NzE5YThhNTFjMTY1MWQzZWEyMGJkNTk4YjIxM2Y2MDQ3Y2ExNDBkZDQ4MTVkZGJjNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhFeHByZXNzaW9uQ29tcGlsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzgxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0OWIwOGZmNjExNmQ5ZWJkZTM3NGEyZDA4MDc4NzM4MjM1NjNjZjAxYmE1NTg5ODNkYjIyYzA5NWVkOTQ4MjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhHYXNXb3JrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjVjMjE3Zjc4MDY1ZmYyZGUwY2FhZWIxZTE5Mjg4NjdjZmU5Njg3YTJhOWY5NTlhMjFjNGI1NDJlMzAzNGY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4R2FzV29ya1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyZTdiMTdkN2NjZGYxYThjZDQ3YzA2ZDYyYTE0NjJlMDUxMzIzOTUyODY2MDkyN2M1MTRlMmJiNTE4NGViNGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhJbnRyaW5zaWNDYXRhbG9nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjA4YmMyODRhYTk2YWYzMzUyYzI2YTkzZWFhZDEzNTZlZTJjNDdkNmNiMGVkOTdhN2RjZTBiMjZmNTlkZTM5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleE5vZGVGaW5nZXJwcmludC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNmQ3MzRhMDlkZDNhMWQwZjNkMDkwMDQyZTc2ZjdlNWNjMzhjZWU0YWExY2IxYWE4YzY0ZWNjZGUwNDg5NzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Tm9kZUlkZW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODY0ZDFmYzM3NjZiYjY3ZTVlOGQ0ZGE4NjZlYzcwYjgyYjA2N2I3ZTAxZmYwMjBlNTJhM2EyYjZlNzk3MWUyNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleE9wZXJhbmRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3NTViMTA4MDY0NTRlMzFhZWM2YmQyNmNhNzc3NGVkYzA1ZGFlYmUzMDhkM2M0NjFlYmYwYzlkMDNkODdiYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhPcGVyYXRvckNhdGFsb2cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDYyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmMzNlZjE1Mzk4NmZlYThlNGQwOGI4ZTRiYTU1N2Y0ZTA1ZmM5OTY0MTZhNDFiODYzYTk2MWZmYjM0NjNlMDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhQYXRjaEVudHJ5UGFyc2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2YzM2OGFmZTI5MzZjNGI2MmMxOGQ2YTdkYTM3NjM3Nzg5Y2I4YzNmMThmZWFlNjg5MDkzMmYyMjkxYWU4MDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhQcm9ncmFtQ29tcGlsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjQwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwMDY4M2JmZTg5OWIwODE1YjAxODE4ZTYwYjViZDE2N2QzMTk5MTIyOGM3MGRiNDZhZWQ3MjE0OTk5M2U3NTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhTdGF0ZW1lbnRDb21waWxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzQzYmVlMWIzMzQ4Njc4NDIyMTRiN2UyMTk4MjdhOGExNWY3ZjRmZDdlNjBmN2M1ZjNmMzMzNjdjOGE2MWY2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleFN0YXRlbWVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQ4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkMTVjNmQwNDg2MDNjN2JkMmUwMjBlYjcwOWU3MzA5NmU3OWZiNGU1Nzc4Y2E0MDJiMGZlMjFhZjc2YWMwNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9DYWxsRXhwci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDdkNTQxYjU3MTZmYzZjZmY2ZTVjOWI4M2RiNmJjNGVmMjI4NTg4YTA5ZTViMjNiZjk3ZjcxOWQ3MzY3ZTY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29sbGVjdGlvbkV4cHJlc3Npb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZTk5ZTFjMzAyNmUyMDZjNTIyZTAyNTIyNzUyZGJjZWE5ZWZlOTUyMGRlMDI0Mzk3ZWI5N2UxNDk2MDY5M2JkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29tcGlsZVNjb3BlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5NDljMzYxYTQ2MjU0NWViZWRjOGQ4OTZiZWVkYjFjNWZhOTliMDFlMTgzNzQzODJkMjY5NmEwZTU3NGNjYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9Db21waWxlZEV4cHJlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTQ5ZjZlYjA2MWIzZjYxNjkyMTAyZTFhZGNkNzk0ZmUxZTAwOTg2YWE0MWI3M2Q5YTRmMWI5OWNjZDJmMjA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29tcGlsZWRGcmFtZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYTUwZTc4ZTI4Y2JiNmE1NTAwYWE3ZGU2NTNjY2NlMjg4NmRkZDQxY2Q1MDVjZmYzYTZhMzUxYmUxZTgyNTRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29tcGlsZWRTdGF0ZW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTJjM2Y3ODQ5ZDQyYTdkZWU5MGQ4OTRhM2IxOWFiNTlmNjYwNjA4MDlmM2VjNWY1MjhlN2NmOGJlMWNjNmYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29uc3RydWN0ZWRFeHByZXNzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZmE2MTZkZGEzODJhYzZlZDNkOTE4ODY4ZjkzYjU4OWNkMDBkODM0N2I1YmQxMjZlMjM1OWNjYTJiZDNkNGJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29udHJvbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmZGVkMmExYzgzYTFjM2QzNzM5OWJhM2NmYTRiYTY1NDg4MGIyYzNkZjgxNzRkODhkNjI4ZDY3MTI3NWNlNzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9FeHByZXNzaW9uQmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzhmMGVlZTFjY2UzMGE1ZGI5YjllYjJmOTZhYjIwZDdkYzI1OTcyMjlhOWY1YTc4YTRmMDM0N2M5YTAwMDZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvTG9naWNOdW1lcmljRXhwcmVzc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWM3YTFhYmU1MDFiNDFhMTcyMjQ1MTA5YThjZWIzMjgzY2JmOTkwMTVjMzk1MzUzN2I1MTkzYWEzZWMxNmEwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0xydUJleENvbXBpbGVkUHJvZ3JhbUNhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzOTM2ZDJiMmRmNTkzOTI1OGRhYzEzZjJhMjQxZDU5ZWI3MDk5ODY3YjRjM2M1ZTk1NGRhNzViODBmYzNjYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9PYmplY3RSZXN1bHRFeHByZXNzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YmQ2ODljNzNiMDNjYzk2YTk5ZDc4YzYwMmQ0YzEyMzY3YjY1NTZhMjBmZWNmZGRjYzljZDFkODFkNDdiMmUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvUmVhZEV4cHJlc3Npb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI4Y2FjYzg5NzFmNTk3OTY1NDM2Y2NiY2MzY2ViNDAzYTkwNmFiMmJlYWRkYjkyYzRmYTE5ZDQyOGNiYmQ3NzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9UeXBlU3RyaW5nRXhwcmVzc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiYThhOWZhYjk0NzA0YzM2NzZjM2M4MjAzYmQwMzg2ZmJjMGVkMzVmYTdhMGYzNzMwMTI2ZTc4ODYxNDRlMDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YmMxOTVmOGFkYzBmODM0MTA2ZTNiNGZjMWY2MThlMmQwYzJlYzAwNzUyOTY2OGVhNDAzMTFhNGEzZDcwNWEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNBZG1pc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWZjNWM0NjYxMGFhYzdlODhlZTc0YWQ0NmIzYTk5Mjk1YjdkNmE3MWM2NDQzOTFhM2UyOTEwYmE0MjA2OGFmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzQnVkZ2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1MDUxNzU4NDNiNDRkZTRjYTQ2N2Y0M2QyMGZmZGVmM2ViNWU0MjMyMGQ0OTBkY2NiMjZiMjdiNmE0YjEyOTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0NoYXJnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Njg0NjYwNDNjYzg2YTI0MWJjYmQ0NjE2NTAxMThiZDE5YTViMGVkYTkwODE5Mzc0OTJiMGVhODIwMGIwMDBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNDaGFyZ2VDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5ZTYxMjZlNmViYmMxZmY2MzMyZDM3MjdlMmIyNGMzMGFiZTM4NWU1ZGVkMDYxYmRiYTAxODBjMTllMTY1YzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0NvdW50ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzZiOGQ0N2M3NGExYjljOTYxMDRiZWE3MDhhYTEwOWQxMzY2OTU4NWFkODJhNzVmMjc1OGFhZWUxZjczNTFmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzQ291bnRlckNhdGFsb2cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0Njk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjAyODM2YTJlMGE0ZDYzMzBlYjdiYWFlMmQ3YmZiMzEwMmExMWQ4ZjBjZTAzOTFmNWEyYzA5YTIyNWM1MGRhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzSG9zdFNlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNmOGY0ZGVjMWM5OGZkMmFjNDk0OWU5ODM4MjM3Y2E3ODQ1MjdhOWZmMGY1ZGRkOTY2YzE0ZTdlNDM4ZjgxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzTGVkZ2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjM5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzZWVkMzQ2NGJhOGVjN2I0OWVmM2Q5MTdmNmE0N2U5ZTBiM2U4MjUyNDRmMjNkZjY5MGJlZGE5ZTRjMzgwMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0xlZGdlckNhcGFiaWxpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZmQyZGNhMTQwZTcxNzBmODlkNTM5ZWU1OWEzNmEyZjZmMTJhOGNjZDIzYzI3ODFlYjU4OWFlYzYyMTQ4YzFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNMZWRnZXJMaWZlY3ljbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTY0MzhjYjhhYmQzYTY4YTM2MDc5ZjNlNjY3MTVmODZhOTA1YjBkZDE1MmVhZTE3OTc2MWRmMDIxZWE1YjljNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzTGltaXRFeGNlZWRlZEV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjNjY2JmZWExNjY4Y2U5ZWYzOTFjNzlkZjA3MDg1OWZhMGZmZmMyMTU3ODAyMTU0OTMwMDQwNzQ5MmVmNzIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNNYW5pZmVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTI2YTg1MjE3Y2RkMTU5MTdhYWY4MDM2ZTEwNTlhYTUyOWQ3ZDU0MzcwMzRkN2I2NWE2ZjhlYTg2ZTgzYTA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNNZXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWMyY2YwOWRlZDg5MDQ1OGUxMTc3Y2ViMTIwNTM2M2FhZTQ0ZWRmZGJhOWJkNjU4MDA4NjZlNWU2OGFmYWUzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjkyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5ZTQ3Yzc0OGVhM2I2MTI4OTZhNmQ0ZGM1MWY2NDQ3MDdlZDRlZjRkOGZhNTJiYzk4MzVjN2NjNTkwMjYwMTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc1RyYWNlUmVjb3JkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmJmNWZkOGFkMmY5MzM3ZjlhNDA2NzdiNGNmZTNmNzQ3ZmM0NDUwZTIwZGZmOTdlNzYwZWVlZjQ2NmQyYWRhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4SG9zdEdhc0V4aGF1c3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ4ODRmZmUzM2UyZDg1MWRkNDhiMDY2YWU1OTlkOGJlZjg2Njg5N2I1Mzc0Yzc5MjBmMDEyZTMwZWRkNGFjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4U2hhcmVkR2FzQnVkZ2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2MyZDZkNzQ2ZGM5MTg1ZDFkMWIxMWM3ZmFmOTNjNTIyZWVmOWQwMmI2YzY2NDM5YmQ1YjNmOGM3M2ZkNmEyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNiNjE1ZmMwZDNjNDhlZWVkNzlhM2M5MWY4YjRjZTc0N2NjMDk4NGNjMjYzNzkxMzA0OWE0YTRkYzc5ZGJlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9vdXRwdXQvQmV4QWRtaXR0ZWRWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2NjYWQ2Y2YwZmViMGRkZDVhZjE0N2ZkMGVjNWEzMzQ5YmU4ZDMwMWU2MmU0MDg1YzVhNDliZDljYTJkMDA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L291dHB1dC9CZXhFc3RhYmxpc2hlZElkZW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1OTA3NzgyNzcxYTczYzYwYjRmMGNkMzFhN2QxODU4Y2E0YzFlZGQyNTVmMDU4MmIxZjRlNzFkNzU0NGMyZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvb3V0cHV0L0JleEZhaWx1cmVQb2xpY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjkyNTdjOWMxNGYzNTM4NzZkZmM4ODE3YWYyMDA0OTYzMDNiOWYzZjhlMWFmNjhkYzQzNWIwNDA0ZjdiZmZlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9vdXRwdXQvQmV4T3V0cHV0QWRtaXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwNzBlZjliZjdiYzhmNWQ3MjVhMTk2NzY4ZjA3OGY5MWMxYTllNGYwZDg5YjRlYzRiNDQyNDZkYjcwYzIxYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvb3V0cHV0L0JleE91dHB1dEtpbmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ODZiYTQ1YWJmMTVjOGU4M2Q4NTQzM2U1MDYwOGY1OWU1YTM3ZGI1Mzk3ZDkxODEyMzMyNTg0ZTk5Zjk4ZWEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L291dHB1dC9CZXhTZW1hbnRpY0lkZW50aXR5Qm91bmRhcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OGE0ZDgzZmIzYzk3MTg1NjE3ZjBhNGJkZWY0ZDc5YTk3ZmNmYmE5MDI4YzQzMjBiMDk5MzE2MzQ1MDk4MWQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L291dHB1dC9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjI5NmYxN2VmZTM3OWY1YWIwZjNhZjE1ODE3Mzg3ZTE4NmJjNTZjOTI2NjEwY2QxZjRiNzAwMTRhMzQxYzJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzZWJkZWU0MDU1NjliOWM4ZmUzOTJjZTY5NzBkMDAxMmY4NmE0NWUyZDg4MWE1MWZkZjNlMmZlNWM2YjAyM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcG9pbnRlci9CZXhQb2ludGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2Yjg4NjhjZDJlMTVmMGFiZjBhYjQwNjlhN2Y0NDhlNmU0OGNiZTE2ZTMwY2NlY2E3NWNmYzE5OTA2YTA3OTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcG9pbnRlci9CZXhQb2ludGVyQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODZlMmNhNDgzY2ZmYWJiNzE5NGE2ZTY2OWFlYzA3NGI0ZGQ5ZGRmNDdkYzA0MTExNjI1MzBmMmFlZjA1NDMxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9wb2ludGVyL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkMzFhN2IwYTc5MGUyZDQxNWUwN2E4YmEwM2Q1ZWU4ZjJhNmEzZTZkN2YyNDkwZWRlM2JjMDg4YTczZmM2ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L0JleENoYW5nZXNldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzUxMjY3M2VkZmUxMDVjNGRjMTliZDgwOTVlMmNiZTJmZWFhZmU4YTA4ZTExMzVkNGMwMTUzOGVhYjIwMmI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3Jlc3VsdC9CZXhFdmVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY2MDc0ZWJjODQzNDZmNzg1MzU4YTFmZWMzNmQ1ZWJmN2NhN2ExYWU1YzdjYWRlMDNmMWIxNThiMmU4Yzc1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9yZXN1bHQvQmV4RXhlY3V0aW9uUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjNzZiYjhlMWQ3MDAwMmFhZTRlMTg3NzFjOGRmNTJhZmFiZGZmYzBhMWMxNGZiMjEyMTg4MGY1ODBkNmU0ZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L0JleE1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNkNjdjZDZhNDA3YWI3MmM1NTZiNzkyYzYzMWU0YWM3Yjc4MTFkMjE1NjRiYWRmYWYxMWRhNzhkZDc3ZDE4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9yZXN1bHQvQmV4TWV0cmljc1JlY29yZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExOTQwMWIwOGY1ODlmZWNjNDYxM2EyYjUzYTAzZmY5ODBlYTI3M2QyZTg5NjNjNjFkMzlmYTZlZGI5ZGJmN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L0JleE1ldHJpY3NTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDYwMDA3NGVlMTM1NTc5NGUxY2EyOWNkNWYyYmYxZDk4NmI5ZmM5M2Q3YmFhOWJiMDE0MmY1NTgzMWViMzBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3Jlc3VsdC9CZXhQYXRjaEVudHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4ZWZlMjRlZGNmZGVlNDBlNWVkMmFhMDhhZGIwNWRkNDVhOGI1NjI5ZDJkMDM0MmUxNTY3YzQ3ZGMyNTEyMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L0JleFJlc3VsdE92ZXJsYXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDBlMDc0ZGY3ZmZkMDYyYjM3ZjkxMDJiNGYzOWUwNDExM2NiZTA1MWM3YjcxOTRkZDEyZWEyMmIxOGE4MTQ0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9yZXN1bHQvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWNlNTFlYzMxNmY2MTU0MGVkYzRjY2IxY2UyNWFjMGEwODNjNDhhZmNmMmNmMWJjN2NiZGRlYjdhMWY5Y2Q2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9ydW50aW1lL0JleEV4ZWN1dGlvbkFjY3VtdWxhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1N2U0ZTRkMGE0NGZlMzllODI0OWZhZmNiZmZkZDVkNDQ2MDE2OTlhNGM0YzcwNWNiNDU4MWZjNTA1NDFhN2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcnVudGltZS9CZXhSdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyODk2Nzg1MDZlNmY0MDU3OTFlNzNiMGFiMzgyMWY4MmQ2NTE4Y2U4OGVmODc4ZjE0ZDgwMGJiMjFlMTMxN2UzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3J1bnRpbWUvQmV4UnVudGltZUNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkM2JmOWY1NzBlZTI4YjA0NjkxOTRhY2JhYTBhYTA4YTQ2Yjg0MjUwNTI3N2I3ZDQ4OWY3YWM0M2NhY2M0MzIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3J1bnRpbWUvQmV4UnVudGltZUdhc1Nlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDA1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiNzcyZGMyODgzOWFiMGVmYmVlMzFhZjU3OGUwOTA3NWY4NDVjZmZjOWViM2RmMzM2ODRjOGE0NGM1Nzk2NjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcnVudGltZS9CZXhSdW50aW1lSW50cmluc2ljcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmYzMGZlMjE4NmYzMDAwNzc0M2Q5M2IyODQ4ZDYxNTQ0NmQ1YWZhNzAzY2Q4ZDU1NjdjZTVlMTdhY2FiNzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3J1bnRpbWUvQmV4U3RlcFJlc3VsdFZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDIyMTFlYjdiOWFiMDc0N2YxNjc3YTFkZDJkMzRlOGY3N2I3NTg4OWU5Y2UxNDZhNjBmOTFhZWJjYmE2M2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3J1bnRpbWUvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2UzNzU0MjhhMGY2MzgxOTFlZmNkZjU1ZDJlMTZiZDI5YWQwN2UzMWRiNTQ4NTNmNWY2YTdhNTJhMDU5MGViYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9zcGkvQmV4RG9jdW1lbnRBY2Nlc3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTgyM2IyZTcwOWMzMDM5N2Y1NmY1MTdhMGIwNzJiYTRkODlhNzAxNzNmNWQ2YWQ5MzZlNDhlNDFhODYxNzBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3NwaS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NDE4YWZjNWQ0ZWUyMTg2ODI5NDVkNWNhMDljM2I2NmMxMDY1NTBhYzAyYzZjNjMxMTNlN2MwNTFjNGNiY2YwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3R5cGUvQmV4Qmx1ZVR5cGVNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ3MjhlOGUyMzFmZWQ5NGE1YjI4OWRmOWE4NjIxOTNlNjFjNDlhNjAyYjUwZDgxNjk5OGI0YjlhZGMyYjUwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC90eXBlL0JleEZyb3plblR5cGVNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0MzlkMjg4MGRmNTU3MmZhMDE2ZmE3Y2I2MmI5ZDZlNTQzYWY1ZjQxNzZiZTcxYjA2MTgxMGEwZWY1NTc1NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdHlwZS9CZXhQYXR0ZXJuVmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjNzFmZTg4M2EzMzk4Y2VhNGQ0NGE4ODMzYTNiYWU3NTE1ZGM5ZWFlOGE3MzI2MGI1OGI5MjkxZjU3ZmRkMTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdHlwZS9CZXhUeXBlTWF0Y2hXb3JrUmVjb3JkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJjODNjNWI1NmNhMTllZTA0Yjk0N2U2YTI2MjI0NmIzZmIxNWQxZjk4NmMyMWYyZGJiNDdiNmIwNDU0NmUzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC90eXBlL0JleFR5cGVNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NGU3MDMyYzY3MzZjMTIyYTNmZjQzZTI2YWMzYmNjZDcxMGZhOTA5ZTEzMzg2MmYyZDQ5ZDA4MjE0YjU4OGI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3R5cGUvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY0Yzg3NGY0YWI1ZjAwYjI1MTI4Mjc5NDI0YmZhZDFjYTEyMzRmM2UxOWI5Zjk1MDExOWNjYWEzYjI4YmUyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9BYnN0cmFjdEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2M2Y2OTIyNmZjZTRkMGRjN2IzZmM0YmQ3YzM3ZDBiNTBjZjJlYTk0NWExMjkyZDUxNDBmMzRjMzViYmU1ZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQWRtaXR0ZWRFeGFjdEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NDJhMTk5NzE0M2VjZWI3Mjk4OWFiYjg3YTcxY2Q2NTg3OGZhYWJhYzcwZmVhOGU2NTVkYjdhYjNmNjlhNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4Qmx1ZU5vZGVXcml0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzYWUwMzI0YWRjYTM4ZWJkYjllNmE1OWJmZGQyYTlhMDNlZGFlYzc2NGU2NWI5YmEzOGMyODExMTYxMTM5Y2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4Qmx1ZVZhbHVlSW1wb3J0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjIyZDVlZmQ2YmE0ZmQyZmFhYmU1MDQyYmI2MWYxYTM5NGRiNjMwYTVkZjA1MDczMTA5NDFkOTQzMjM3MWQxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhDaGFuZ2VzZXRWYWx1ZVZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWZiYjc3ZTBjNzhmMWUwZjcwYzNmYzAxOTgzZWY4N2RkMWRjMzRhZTdkZTQ0MjUwMDU0Mjg5ZjllOGRkMDQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleEVxdWFsaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljNWJmNDE3OGUxYTZhZDlkOTdkZWQxNTQ2ZTkyMTQzYTc3ZmQ1ZThkNjg4ZjMwOGM1ODIyZDNjMjM5MzkyMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4RXZlbnRzVmFsdWVWaWV3LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDMzMzI1OGZhN2JjODgwODhjMjg2Njk5YTI3NTEwNDg4NWU3MjY5YzU3Y2NiMjdiNjg5ODQ5ZDFiMDI5ODUyNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhGcm96ZW5Xcml0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTUwYTNkYjc5MzY1M2EyM2VmMTY0NmFhNGJjZTNhZmRjOTA1YTkwMGE2Zjg3MzlhZjFmYWYzZWRiM2EzZjIyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhOb2RlV3JpdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDI2ZGRlN2U5N2ZmYmUyYzgyMWFlZjA2NGYzYzc4YzJhNGVhMzU3NWUyNDI4OWU5MWI2M2YxYWU2NmIzZmZmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhQYXRjaFZhbHVlVmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1NWZiNGNiMGQ1MjQxODAwNjcwMzQwMmQwNmY3YjhjNDIxYzljZTNkNzc2MzdiZTg3NzU0OTY2NzhiN2I2ZGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4U2ltcGxlV3JpdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2ODk2NjBjNTg0MTQ3MGIwYTljZGFiNzg1NjZhOTJmZWQzZTc1YzMwN2Q2M2NhZjQxZWY4ZTdlMmMwMjk0ZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4VHJ1dGhpbmVzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmNzhiYjA2NTJhMjU4YzllMzY0N2VkY2YyOWNhNWU0NTVlMjUzMDYwY2E5MTc1NzFhNjhjMDg3Yjg2YjA5ODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4VW5pY29kZU9yZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiOGIwNzIzZjA3NmU3NGZhNjkwZTljN2VkYzQzNjk1ZDU4NThkYjk0OGM1ZTViYThhYzE5OWU2NjcxZjk3YTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFmOTQ4MmQyYTA4YTgzYWViODE1YmNjZTU1ZDg5MmRjMzVjZjZkNzYzNmIxZGFjOTEyZTBjZmIzM2QzMGQyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhWYWx1ZUtpbmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTA2MjEyZWJhZGViNTc0ODNhZjQ1ZWE0NWRiM2VlMGZiZWNlMmNiNmQyOTgwN2UxNjM2YTFlMmE4YWIxN2YyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFZhbHVlTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1NWNlY2ZlMGRkODY2YmQzNzE3NzJmMWE2ZjU1OTI1MDQyY2Q5Zjg5NDE4YjVlNWJlYmJkOWMyYjJiYjczNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4VmFsdWVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOGIwYzc5YjQyY2I5MTMyOWI5N2ZkNmU4MjYzMThlZWZjM2M2ZmQxMGZkODdmOTJhNzQ1NTQyNWUxMmZlZTIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0NoYW5nZXNldEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2OWRjZjU1NjJlYjQ0YzYxZmE5YThmZGM0NmQ2MTk3OTU0MDY4YjJlNmI0NWFiZDU3ZThiNTg1MzBlY2UxOTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvRXZlbnRzQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzcyOGY3MDM4YTZlMWJlZWQ1NDZiNTI3ZTU2NGVhMWUzMmVhNDEyMWIwNTNhZjE0ZGZmM2I5ZWFkNThjYThjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9Gcm96ZW5Ob2RlQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTE0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5MDUzYmFiMzZhOTNhOGRkODg3YmMxNWI0ZmQwODg0MzkzNjhkZDA2ZWM1MGU5YzI3NjUyMGI5YmIzZjkyNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvTGlzdEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwNmIzNjVhMmRlOTQwMjVhOWE4ZTUyZGM3YTI3ZGQ2NGVjYWUxNDljNmU1ZTQxMzljN2EyNTI0ODRlNzRkNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvTWFwQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWM2NDhhMTg1ZjQ1Y2I3ODMyNTY3M2IyOTNhMTdmZjczZDBkMjhiYjdiNDBhYzkwYjc1ZjVhOTkyYzExOTFhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9Ob2RlQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTRkMWMwYzY2Mzk1YTA3NWI4NzYxNWMwMDM3MWI0OGNhMDI2ZjExZWRjNjIxZGZkNmY2ZjRlZDBjMjRlYzFkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9OdWxsQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjM2M5ZDZiNGNlZGIxYWI3ZDYwNDUxMTFiM2ZkY2FlY2QzYzUyZjk3NjZjM2FkZDQ2ZWZjYWFiYzEzYTIyZDA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL092ZXJsYXlMaXN0QmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjEzYWJhZWUzNjZiYThjN2JmY2M0ODgyYmZjYTZiOGYzNDk3NDcyYzU3NjlmMzU1ZWJiZGVhZTE1YWJmN2NhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9PdmVybGF5TWFwQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDcwZDMwYTc1M2U5NjM2ODI3M2RiZTQxMDU0ODg1YTg5NmRiN2QxNTg5MGNmYWI5NTZiNWIwZTgxMGYzNzU0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9QYXRjaEVudHJ5QmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE3NzJkMWNjMWU0YzI2ZWY1ZWFmYTQ3ZDdhZTUzOTExZjNjZTIzNWNjMTQ1NmYyOTU2NzQ5OTViMTY5Y2M2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9Qb2ludGVyU2V0QmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGI4NWExYmY2MWQ4ZTRhODUxNmRhZWQ4MTg0ODg0MTYyYTBmYTNkZDkxOWFkNThmYTY1MjU0ODBjM2M0NzliOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9TY2FsYXJCZXhWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGYwY2FmNGZjYWQ2MDc3YjA3ZDQwYzJjZjU4NjBkYWU4Y2RlZWRhYzhmN2U5OGI4NjA1YjhjMDlmMTYzOWQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL1VuZGVmaW5lZEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2ODI2Mjc4MzI5NTNmN2Y3YmY4NjBiYWRiMGE1YWM0NzVmYWJjM2U0YmQ4YTQ4YjI4ZTEwYmFmM2Q4N2VhZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTZjNWQ1OWFkOGIxYzgxOGM0MDgzMWEzZThiODU0MDdlNDQ0ZGM4ZjJhYTQ4NTkzODkzYzcxNDhlYjhlNmZkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUvYmV4L2dhcy9ibHVlLWJleC1nYXMtMi4wLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmNjg5ZTBjZjUxYjBmOWFmYTZiMThhNjQwZTBjNzU1NDcwOTIxYTdiMGQ2NmY2MmJmYzIyMDY2NzlkZTY0MGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1qYXZhL2J1aWxkLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk5M2M2YmNiNmYzYjE5MTE4ZTcwY2QzMzAyZThlMzAxODdiZDIwNGIwYTVmZWUwOTZhOWVkZjJmOTAyY2YxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWphdmEvc3JjL21haW4vamF2YS8uZ2l0a2VlcCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL2J1aWxkLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImMyYzNhMjY0MGVmZThhNDhiZWVmNzRiNGIxMTczMDAyZDQwNGQ1N2Q2M2Q1ZGM2MzA5MzQ1YTZlNDJkYzZmYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zZXR0aW5ncy5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDE5ZjEwYmRiNDFhYmQ3MWU5ZjA5MWViYmEyZTgwZmZiMWQzYjI0OGJhNzM2OTAwOTNmNmI4MTYwNDM4OTViMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9BcGlFdmlkZW5jZVBsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNWU5MDg5ZDU3ODhlODA1MDU5ZDlkNjVlZjcxOTkwODVhZTVmZTU4ZDVjMjZhOTEwMDMzNDE5ZTg4MTdkMDYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL0FyY2hpdGVjdHVyZVZlcmlmaWNhdGlvblBsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjQ0ODZjMzFjOTFhYzMxYzA0ZDUwNmY2N2RhMGVmNzhkZGYwODI2NjNlYjNkM2ZkMjA0NzQwY2I4Mzc2MGI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL0NvbmZvcm1hbmNlQ29udmVudGlvbnNQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MjYzN2ExMzBjMzA1YjNlMDlkNTk1OTEwNWJjOWNlZjNhNGE1NDc1ZDQxZGMxMGZjYTBlNTE3ODc2Njk3MDlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL0phdmE4TGlicmFyeUNvbnZlbnRpb25zUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYzUzYzlkNDM1ZDBkYmE4ZjdkNWVkZTBmM2NiNWZlZThkMDlhZDkwMTE1MTk1MDc0MmM2ZThhYzcxODE2YTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvSm1oQ29udmVudGlvbnNQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBiNmFhNTU4NzVkNmNkMmIzNzkyODRlODc3MGQ2NzI1Mzc3ODNmNmUzNmUyYmY2Yjk3OGVkODVjODZmMTVjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9MYW5ndWFnZURlcGVuZGVuY3lNb2RlRXh0ZW5zaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNThlOWRiMmYyOWUzMmMwMjMyMGIwMjU0NDdmZmZlZDA3MDE1ZjBmZGZhNmQ1MTE2NWM3MDA4NjdkMjZkNmM4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9MYW5ndWFnZURlcGVuZGVuY3lNb2RlUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImRjZDE2MzZlZWQ5OTU1OGQ2NjkwNjE2ZWU0NTMwZDY4NzAxMzNmNGIwYzU2MmZhODdmOGVhMzdmODU4NzUyZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvUHVibGljYXRpb25Db252ZW50aW9uc1BsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjU1ZGFhZDVhMjU1ZGI2NmJmY2MwM2Q3NzkxNTMwOWE2ZTcyM2M5ZTI3ZjU5OWQ0Mjg0ZmM2OTMwYzVmNjZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL1JlbGVhc2VFdmlkZW5jZVBsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjJiZGE5YjlhNDdlZGRjNjU0M2JhMTZjZDkxY2YxZGZkMzc1Yzg0MjI4YWRmNWNlZmI1NzNhMzg0MGUwYjAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL1JlcHJvZHVjaWJsZUFyY2hpdmVzUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjZGNiOTlkYjkwZGUyOGIzYzFlYjJkMGFlYWMxMmExNTZjNGViYTc1NjMwMWUwNTgzMzcwZTk0ZWI5MWNlMDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvUm9vdE9yY2hlc3RyYXRpb25QbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDAyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1MTZhOTIxNDg3NzVjNWQyNDUyZmZlMzk3OTZiYjBmMmE4ODBkYjRmYTQ0ODRlYmU4ODk5NzRiMDA3NGEzZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzBlNWQxN2EyYzllNmQ5NjUxMGUyZmQ0ZTMyZTc3OWJjN2Q0NWViMjFjMDVhMTZjN2E5NTg4MTJlOGFlNmFjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUFwaUNsYXNzaWZpY2F0aW9uVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODFiMTgwNmViODYwMTU0MDM5NTYzODg5YzBkNGYxYjhiYzg1ZGM4ODg4YzRjYmUxNjMyZWYwNzdhNWRkM2FlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlQmVuY2htYXJrRW52aXJvbm1lbnRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjNTViY2JjZjhlY2RlOTkzNzg5ZGFiOGZlODQ5MzhlYWJkZjlmZTJlNDQyMzQ2ZDU4YWU5YzU5NmE1MDAyZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVEZXBlbmRlbmN5RXZpZGVuY2VUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5YzY3N2ZhOTQ1ZDFjMDAxNmYxYTMwNzhkZWUzMmI2OWUyMzI0NjA5OGFlYTEyY2E3OGViZDc2ZTE3MGFmZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVNb2Rlcm5pemF0aW9uUmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NjIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmYyZjczYWYzMjY2MzYzYzExOThkMTdlMjI3MGM1NDVhOGM5OWEzMzU1MmU3N2ZkZDBkMmQ4ZjE2MTQ5NWVkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZVJlbGVhc2VSZXBvcnRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2Q3M2M3ZmI1NTlmYjE0Njk5OTA1NDliNGE2YWQ4MjJhNGFhMGQ4MDkzMjkyZGIxYTNhNDhhODJlYTA4MjRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlU291cmNlRmluZ2VycHJpbnRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjkwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImQwNjJhNDFlY2U4YTUyYjYzZTQyN2UzYWYyOTFkN2M3NmNkYmJiMDQ0YjBlNGVkNmMwNTI2MWZmYzk0YjQ5YTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVXb3JraW5nUmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMzYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjcwZWVlZDA3NjhkNjdhOTU4NGJjYzZmNTlmYTU5MDZiMGMyMTI3MDg0NWM1ZTVkMGIwNTc1ZjQyOGU4YjhkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9SZWxlYXNlRXZpZGVuY2VKc29uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAxMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzk0YzQ1ZmNiYWMzYTQ1NjhlYjlkNmM2ODIzMzc2Mzk3N2IxNGExNWU0NDBjOTEzM2E3ZmE1ZTU4NzE0MWQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL1N0cmljdEpzb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTczMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1MTVkMGRkZWVhZTI3MTg4MDdlYjczNTE4YjA4MzRiZGQ4ZmEwNGE5ZmQ3NTJjNjA3YzEzODc4ODEwZmU1OGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5QmV4QXJjaGl0ZWN0dXJlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzliODI2NTI4NTdlMTI1ZTEzOGI1Y2I5MGE4YzI1ZTE3ZmI0NTk5YjFhNDhiOTdiNmFmM2E3YWNkMzYyMjcyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlKYXZhOEJ5dGVjb2RlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDdiMWRlZWJhY2FkYzgzZTliM2RkYjRiN2RhMDE0YTM2OWYzYTk3MzQxNTM1MGQ1ZTJkNzU1NmUyYTZkN2E3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUxlZ2FjeUxhbmd1YWdlSW1wb3J0c1Rhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDYwM2VhOThiMDE4ZDgyNzZkNmEzOWViMDFlNjJhODY0YmM1NTRmMzg0ZWYwMWM1NGFhOTBmZjYyYjBhMDFmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlQdWJsaXNoZWRMYW5ndWFnZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjkxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyYmU0YzkwN2Q5MGY0Mjg0NGE4Mzk2ZmY2ZmFjMzY2NmQ4MmI4NDE4OWQ5MjIwMjEyNzc4NzMzYTk2ZDdhMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGFjY2MxZWRiODYwOTEwYzgxMjA0ODdjYmM2OGQxMWNlMDU1ZjFmMTEzMzU3ZjQwOWFmNDUxZDllZjMyMTdhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM2NjhhM2IxZTFiYzA5NDk4YTEyMDVhYzAxYWVlNDE0ZThiZDJiZTQxMTA4N2JiNzE2YjkwYWVmOGFkNGFiNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9idWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjMjE2Mjk1ZjZjMjlkNThmMDU0NTQ2ZTgxMjE2OGJhMDNjY2FkNTUzY2NmZjllZDI0NjBlYjI3MDBkMDFkZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2V4YW1wbGVzL0hvc3RlZEJleEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGJhNDlmMzNmYTM2OTMxZWFhODBmNTQwODZjNDUzZDFhMjAxY2ZmNDhmNmNjOWRiZWQxYjQ5NWI5MGFjYzRmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZXhhbXBsZXMvSG9zdGVkQ29uc3VtZXJTbW9rZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTBiNzg1NzVkNzY3ZmZlNTc0NmQ5ODNmMGExZDVjNzRkOWJiMDg2MjBhYjBlNWQ4NmQ1YzJjMzRkOTQwZjg2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZXhhbXBsZXMvU3RhbmRhbG9uZUJleEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzBkY2U5YjBkNzIwNWFhM2ZhZTJkOWE3YzRlMGJlYWEyYTQ2MDY3NTk3NTQ1YmJlOTU2OTE4ODI5OGNmMjg4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZXhhbXBsZXMvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzk1YmJhNGQxYTM4NzM4MjZkOWM4M2IxYWM3OGU3NjgwZTc3ODgyN2NjMDZjYzU4NTgwN2RjODViM2MwNzk4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy90ZXN0L2phdmEvYmx1ZS9iZXgvZXhhbXBsZXMvSG9zdGVkQ29uc3VtZXJTbW9rZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZTAyNmQwMjZkNDU0MzJhZWE4OGQ1ZGY2Y2FiNjU2MDMyMzVlNDljODk5ZDI1OTdkMGFlOTVmZGE4Y2M0MTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLnByb3BlcnRpZXMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc3YTZjMjBhMTE5NmZiYzdjNDkzOWRiNTUwYWQwNjYwZTViNjVmYjgxM2YzMDVkNmI5ZGYyZWE5ZjM3ZjE5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS92ZXJpZmljYXRpb24vYXBpL21vZGVybml6YXRpb24tYWRkZWQtZGVzY3JpcHRvcnMudHh0IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWNiM2U4YTJlZjg3MmQ1ZjIzMzRlOTI1MWZlY2EzYzA4M2Y1Yzg4N2E3NjU0OWNlM2RkNjBlMmI0MGEwMzk4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS92ZXJpZmljYXRpb24vYXBpL21vZGVybml6YXRpb24tcmVtb3ZlZC1kZXNjcmlwdG9ycy50eHQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZDNiYTVhNWU2OWRkZjhlMmZlZTBkOTJjOTI0Y2FlM2M0ZGQzNmQ0MmU0NjVkYzk5MzFjNTUwYTk5ZGIyZDk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3ZlcmlmaWNhdGlvbi9hcGkvd29ya2luZy1jaGVja3BvaW50LXB1YmxpYy1hcGktY2xhc3NpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGMzNDg2YzNiYzJlN2Y0NDI2ZThlMzk3M2U3NGEyMzE5NDU3Y2NiOTExYmI2ZGE1YWIwM2U2ZWEyM2Y0YTc0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS92ZXJpZmljYXRpb24vYXBpL3dvcmtpbmctY2hlY2twb2ludC1wdWJsaWMtYXBpLnR4dCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1Mzg1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzYWVhNmFlOWRlNmYzOTcyOWY5M2MxNDZmZjU0NTM4ODdkYTlhMjMwM2Y2ZjRmMzM1NzNiYTQ3ZjM3ZDViZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvdmVyaWZpY2F0aW9uL2xhdGVzdC1sYW5ndWFnZS1iYXNlbGluZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzN2YwYWE5MTQxZTUzZDJjZTc3ZjE1YjVhYzRiYmVhNDQ2NWJlNDQwNzZlOTlmMGE0YTFlYWNmMDU2NjgwYTc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXciLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1YTVjMTk5YmEwMjE4OWFlOGM0NmEzMzQyMjMzNzFhMjA1OTlkOWMyOThlZjY1ZTc1NDBlZGU0YTNmNzJkNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNldHRpbmdzLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiYzBjZjUwZTVhOGY1NmRiMmJmMzkxYWExM2UxOGFmYTNhMWIzNTAxZjExYmE5MGU3Y2UxOGE0ZGI4NjMyYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEFjY3VtdWxhdG9yUG9pbnRlckNvbnNpc3RlbmN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzI4OTM2ZjkwMWMxZjA0ZTE3YjlmYjAxMGY1NmY3NTJiNDZiOTUxZWU5YTIwMjllYWE3OTg0ZmQyOTg2YmZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhCbHVlVHlwZU1hdGNoaW5nR2FzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA0MjQzNTk2MDFjOGZlNGU5YWU3NjJiYTRjYTJhYTA4MjMxZDE2MmI4MWM3MTRjM2RlNTQ0N2YyNDk5ZTI0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Qmx1ZVR5cGVTdXBwb3J0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmI0ZjRkNzkzNjNjNWIzOGJjNWI3YWIzNTA0NjZmNTI0ZGU3ODFjODhmMDI3YjNhYjc0NWZjYjgwNDA1Mzk5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Q29tcGlsZWRQcm9ncmFtQ2FjaGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTY5ZWJlOTZjN2U5ZGFjMGQ3NTIxZjJiNDg1YzQ5NDg4ODMxMTg2OWYyYTIwMTJmYmRjZTk0ZTliZmYwY2Y5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhDb21waWxlcjIwVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTg5YjMxMjg0ZGI4NmIxOWVlYTM2OGRlZTc4ZTYyZGM1ZTFkMDMyMTRjOWI4NjQ1YzdlZmIwMjI3MzdmYjEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhDb21waWxlclNjYWxhck5vcm1hbGl6YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmZGI3ODhjMjMxN2RjYTE1YTRmMjBhMjAwOThhNmVmZjJlMjdlOTk1NzhmM2E0NWZjMTc0OWEyZDMxNDhiZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleENvbXBvc2l0ZUV4aGF1c3Rpb25FdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTY0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwNWY0NTBkNjQ3MzU5Nzk1YWEyOWJkZGI4M2U4ZTA3MDk2YmIwMzE1ZTkxODRkNmE4NDRmZDJkNzk2YWZkNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleENvbmN1cnJlbnRFbmdpbmVJc29sYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzNWRlNTViOTIwZDcyNTY3MDU2Y2Q0OGQ3YzliOWMzN2MzMTAyYzdkMGFlYWI0ZGQ0M2MyY2NhMDc1OGQ4MGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleENvbnRleHRSZWFkVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkZDc5NTU0NzJlZTVmNmFkNDc4ZDJlNjNhMWY0ZDc2MGE2OGZiMjk1YTdkZmNmMWVmZTQ4M2YxN2I1Zjc5NWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleERlcGVuZGVuY3lCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjcxZTA5MzU5NWM2OWI5MTMxOWY0MjA0MjNhMGNhMmVhNWM4ZTMxZWY3OGYyZWFlOWNlMzQ3YjU3ZDIwNWQxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4RGlhZ25vc3RpY0FkbWlzc2lvbk9yZGVyaW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWU4NjM0YTgzMWY5NTkyZGJlZTM0MmZmOGM0NTg3Y2I3MzU1ODMzZDZmNWZjZDYxYWRhMmNjNjRlZTYyNTkwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4RGlhZ25vc3RpY3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwYTg5MDg4ZTNlNjZhZjc0OTNhNTUyOGE4ZDNhYWZhMDMzNDRhZjQ5NWQ3MGM3Yzc4MDk1NDQzZDY4MDgzN2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEVuZ2luZUNvbmZvcm1hbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxOTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmJkYmQ4NjM1MzUwMDViYjVmNDk4ZDFlMmMyZjMwZDM3NjNmMjgwNzBiYzcyMmMzZjRjYzk2YzcyYTM3NWZmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4RXhhY3RHYXNSdWxlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQzNWNlZjdjMTU4NTc2YjY0YzQ1YmI4NjM2YzU1N2E1ZDg0ODA2YzUxM2JiMDI5ZTdmMzg1ODIzNjc5MTUyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4RXhhY3RSZWZlcmVuY2VEb2N1bWVudFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjA4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0ZWI1NWQwZWRlMWJhNTAxZjg2NDIwNDQ1OTM3M2EzN2M2MDQzMTZlODA2YjYzMzVhODE1N2YxMDQ5NGJjY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEV4ZWN1dGlvbkV2aWRlbmNlTGVkZ2VyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJlMmI3YjkzZTZmY2QyMmM3YWQ3MjJmZWIzNTEzNGVlZjE3MDFjZjdmZGFiMzJiMDM5YzViODEwN2M4MDYzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Rm9jdXNlZENvbmZvcm1hbmNlVGVzdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjcyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiYTQyNDFjZGIwZTA2ZGIzYTFmYTgzNTg5NzA4Njk2Njg1OWY4MGVhOGU0ZjhiNjViYWI4NjhhNjQ2OTk3ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEZyb3plblZhbHVlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTdhN2M2Y2ZlMDM3Y2Q0NThkNmVjMGVkZWQ3ZDVlMzMyNTA4OTQ3MTkxZGVlZWI4MGYxM2M2Njc0YWJiYzRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhJbnRyaW5zaWNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUzNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMTI0NzU3MWM3NDBmMTk0MzI0YzM0MTUzOWI3MWRkMmY2NjdlZWRmYTY0ODdlODNhYzhhOGVlZjQyNjcwMjEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhMYXp5QmluZGluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzY5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwNGM2NjU5MWExYTg3NGI5MjJiZTM3MzI4NGQ5MmNlYjg2MmIwMDg4ZDI2MzQ5M2ZkNzM1ZWI5ZWZhNTFkNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleExvY2FsQmVuY2htYXJrVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2Y2YjRjNjBiYzEwMDRlMThiMDYzMzIxMjg2MjAzNTMzMWVkZWVhMjNiM2M1ZGI2YWRmNTk1ZWM4NmEwY2JlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhOb2RlQ3Vyc29yVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiODlkOTIwYWI2Mjc0MTdjNDFhZWVkODYyNTBiODA1ZjU3Mjg5YjMxZTdlNzA0ZWYyNGY5MGYzOGI2N2UwY2M3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhQb2ludGVyU2V0MjBUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzIxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2MmEzNWFjODU5ZGE3YTJiNmRhY2MyZTUwZmE5NjI2MzBiYTRkYWI3MmFkNTRiYjk0OWM0MjQyOGZhOGE0ZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleFByaW1pdGl2ZUV4aGF1c3Rpb25FdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjBjOTJlNjBkYzNmMmY2NWIyNGQwY2RhMTM5MjRiYmQzYmY0MzVjYjU1NGQ1OGYyMzI3OTMwZDdlYjgzNzY4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4UHJvZ3JhbVBhcnNpbmdCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM5YTc4Y2E2ODlhOTVkN2E4MDQ1NWMzNTk0ZWJiOTE4NDcxZDdhZDdkZDBhNjU5ZTAxYmU0MjlmM2RiYTFjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4UmljaEZpeHR1cmVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQwOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMThmMDg0MDlhNGVhZDg4MmE0Mzc0ZTJhZTJmZWE1NjdkNmVlNWUzNmQ2YWM5NzU2OTZiNmU5MTUwN2RiMzg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhTY2hlbWFWYWx1ZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTYyZWY2NTRiYjM4ODIwZmQ3YTM1Njg4OTVkMzZkZThiNGFkMzIwZmExMzA5YTUxMzlmYjcxYWQ5YWVkMzVlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4U3RydWN0dXJlZFJlZmVyZW5jZUV2aWRlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYWFlOTM0MjZkNWJiYzFjYjhkNDY4NGEzZWM4OTUyYjNiZWU5OTI1MzY2ZDM0M2IwMjk0OTQxZWI2NzhmNjdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhUcmFuc2xhdGVkQ29ycHVzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3OTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc2ZGEyMjFhMDNmMGYwYTJmZWNhNDJkZjIwMjE0YzMxNjRlNzU2YzBkNTNlYTdhOGNiZTE4NGUzMDE2NzBmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4VXNlQ2FzZUNvbmZvcm1hbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjRkYmQ1YjQ2NzJlYTRlNzI3OGNhNTEyMGU0ZWFlZDgzZmY0N2Y1OTZjZmIxMTQyZDQ1MDFjOGUyM2M4N2E3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvRXh0ZXJuYWxDdXN0b21lclBheU5vdGVCZXhGdW5jdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5ODI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE3NTA1MGYyNjJmYmM5NWZlZDkxZDNiYjBlN2M5MDc0YWRjMTRiZmY5YjlmN2MxZmEzMTQ1ZTg3NWE2Nzc5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvYXBpL0JleDIwQXBpU3VyZmFjZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyMjBlMTI0NTM0NjdjOGZiZThkNTQ1NjdkN2RjNjk4NWVkMjI2YjczN2I0YzE5MjZjNmU5MzA0ZWE1MGFlYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2FwaS9CZXhFbmdpbmVCdWlsZGVyVmFsaWRhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2N2M3MDNjYjU4NzdjZjQwNmQ4YzRkYmZiZGM0YzA5OGY0NjE1ODQzOTkzYzIwYTlhYmI1ZDA4MjNjMGE4OTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb21waWxlL0JleENvbXBpbGVCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDI2ZGQwYTVhOTcxNTJmMDYzNWU3NTA1NTc3NDVkNTBkZWZkMTBjNTA5Mjg2MjVjZDc3ODNkMDc3ODc2YTFiNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlZElySW1tdXRhYmlsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjZmM2ZlOWVjNmZkZDI4NDhhZDA5ZTQ4Njk4NTU2MTY1ZjFlZDNjNTA0YTliYWY0NjZhMjFmODI4YTMwYzk5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhPcGVyYXRvckNhdGFsb2dUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YmExNjIwMmU3ZGQzMTY4MmJhMWQ2NWE0OWI0NjAyMWQ1YmQxM2VlZDRlMDcwYmY2YmYzM2JmYWQ2MGQ5NDEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhCaW5hcnlBcGlNYW5pZmVzdE1haW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWYyZjEwNWYzMzMxYTUyNGQzMTM2MWE2MzBmYzEzNDQwMzY1ZDY2MjVkZGI3NjRhODg5NTM1YjU5OTFmNjk4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4Q29uZm9ybWFuY2VEb2N1bWVudGF0aW9uQ29uc2lzdGVuY3lUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0MzcxYzE4MmMwMDlhYjYyYjc5NjJjZjIzYjBkN2YwZTQ0YjE2ZmRhNWM5YmIzYjE3MTIwODAzZTZlZTljMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleENvbmZvcm1hbmNlRml4dHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc0MjA3ZGZmYzllYzg1YzkyOWJlNDI4ZWJkNTc5MWZhZWVmYzZkNDMwNGU4NDRiMDNmOTA0ZDVmZDRhMWE3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4Q29uZm9ybWFuY2VQYWNrYWdlSW50ZWdyaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY4ODIxNzhhOWQzZGVmNDRlMWFiN2UyOGE5MWM3YjY0YTMxOTVhMTFjYTcxYTY5MmJlODllYTBhODUxZDQ4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4Q29uZm9ybWFuY2VQcm9wZXJ0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjMGZiY2M4ZWVlODRlMjA1NGE3M2JlYjgwYzg2MWYyNTU0ZmRlMjNlOGFhNGY0MDgxN2QyOTJhZWM5M2U0YzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleENvbmZvcm1hbmNlUmVwb3J0TWFpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNjk5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyMjgzYWE5ZDc0NGNkMDQzY2YyNDg4MGNmMjRkY2UyNzZhZTVlN2IxMmY0MDA2NWM1NTBhMWM0MWI5MDliZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleENvbmZvcm1hbmNlUmVwb3J0VHJ1dGhmdWxuZXNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDY4YjFhMzRiZTE1YzJmMjBjYjkwYzhlMGUwMWFmN2QzZjRkZGM1NDA2ZThjZjk0NjExY2NkOTllNjg5Y2RkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4RW5naW5lRml4dHVyZUFkYXB0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTA2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxMzMwMGFkYmYyZjYwNjkxOTA3N2U5NDE5MTcwNmEyYWQ1N2I0MWY5OTg5MGRkMzFmMTFiYmFlOWRmMzNiMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleEZpeHR1cmVSdW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDNkNjBiZmQ3ZWVkYWI4ZjU1NGQ2OTk2ZjBkZGYyMDNiMjNhYTdkZDE5ZTc2NjJkYjdmZDQzN2UyNmJkZTE0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4Rml4dHVyZVJ1bm5lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNzQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA3Zjg2MGJjMjBhNWExYzVkY2E0NTc4ZjY1YWIyMjhiZDRhNWUxMmFkNjI5NGFiNWNjOGQ0ZTg5MGFiOWE5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4Rml4dHVyZVNjaGVtYVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzEwMjc0YTc2ZTM3ZGQwY2I2MjU4NGJlYmI1MGRlNDg1MzNiNDEwMmE0MTE3ZjE5ZTcxNWM0MTI2YmY4MTU5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4R2FzTWljcm9maXh0dXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYjc0ZTIyMWJmZjJkM2ZkYzU1YjUzNmJjYmM3ZDEyMDZkMWVmMTUyNTFjYjgwNDkwYjc4Mjk4NWUzZjJjODJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhNb2Rlcm5pemF0aW9uUHJvcGVydHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjE2NDVhNGQ3OTA1Njg1Zjc1ZTYxYTA2MDM0ZTEzM2EwNDZjYzhjM2Y5YzBjMDgxMGEzNzM5ODU2MmI4MmNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhSZXByZXNlbnRhdGlvbkludmFyaWFuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMzMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTY5YmE0M2JlZGRkMTRlNTM2N2I0ZTM2ZGE5YjFiMjZhM2I0ZWZmZmUzMzg1NmUzOTVkYjhiYWZmM2U2ZjRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9Db25mb3JtYW5jZVBhY2thZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTk5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmMTFhYTRjODJiY2IxNGIxZWVhYWRlMDIyYzE2MDJjNmNiMjQwOGQ3YjU4NTc4MzE3ODMwYTdmMTJjMTU5YjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNQcmltaXRpdmVzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NzA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmYzNjNhNGVjZjhlYzlhZTk0ZDlmZDI4MTFiM2I0ZTQ2ZGYxOTMyNDU2NjNlOGVhMTdlMWM0OWYxYmYyOTU2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvb3V0cHV0L0JleFNlbWFudGljSWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2NzllMTc2OGJlOGY5ZGIxMDkwMmJlZjM2NGU0YzdiNjM4OGVhMWNlMmNhOTExOWRhNzc0ZmFiY2MxNGE1ZGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L3Rlc3QvQmV4VGVzdEZpeHR1cmVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNDdmMzgxYTQ0ODAzZDJiNjBlNzQxYjhjZGRmZDgyYWU3ODVmMDhhN2JmMDQ0NzcwYzMzNzlhNDVkYjlhZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L3Rlc3QvQmV4VGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmQ1NzhjNDE5ODBhY2Y4YWZlNmEzMzdlNzEwMjZlNzJkZTIxZWU4OTYwNDI1MWFlZjViZGYzNmRmMmRmOWRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC90ZXN0L1Rlc3RCbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzY3MjRhMTc5NTYwYjhiZjJjYmQ5NWU1ZTA4YTk1ZTdkMzVmYzgxMTNkYzMwOTFjZWE0MjI5OGJhNDBjZmE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC90ZXN0L1Rlc3RHYXNMZWRnZXJDYXBhYmlsaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5ZmYyMTIzYTRmNjE4MjM2NDgzYzc2MDQ0ZDc5OWM5YjhlOWZmNDE5Y2Q4ODdhOTVjZmIwODY5ZTgyYmMyMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFVuaWNvZGVPcmRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDMwNDI3YjdkMzI5OTc2YmUzYmEyYTFhODFjMWMwZjY1NDEyODk1NWY0M2FkZmM1YjM2YTA1ZjcwMTU3ODlkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4VmFsdWVzSWRlbnRpdHlWYWxpZGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYjE1ODgyNThmNDU5MTdjMGFlNzAxY2FkNDNkMWY0ODUwNzY4MDQyYjQyYmI1OTE2OWQyYWE3ZTFjNzY4MDQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9CZXhIb3N0ZWRSdW50aW1lV29ya1Nlc3Npb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI4NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODFiMDg2MmE5MWI5NTE5MjU5NzljMzFmNzY3YmUxNDU0OTI3YTIyOWIzMGNiOTFmMDkzZGE0ZGNmODNkYTFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzLy5naXRrZWVwIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWJhNDcxOWM4MGI2ZmU5MTFiMDkxYTdjMDUxMjRiNjRlZWVjZTk2NGUwOWMwNThlZjhmOTgwNWRhY2E1NDZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9IQVJORVNTLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxM2Q4MTI0ZDU5YWE0OTVmNDFjZGM0MGY2OGQzOGJlMDI5OWRjNjE3NjViNGI3MjcxOTc4ZDcyOGU4Mzc2YjAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9SRUFETUUubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTA3NzZhMGUxZjNjMjFiMzg4MzY5YTdhYzkyNTA2ZDJjZWNhMzRkM2Q4MTNjY2VkMDlmNjI3ZDI1M2NiNDJmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvYy9iZXgtYy0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlNTNkMjM1ZWY4NDk3NWViZmEwNzUyMjcwMzM3NmRkZWMwYTE1OTY1MTBlOTA3MDRlOTIzYzkxMTIyYTcyMDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2MvYmV4LWMtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDQ4MTUwYzhhZGE5OWI2Y2E4YjBhZWMwMzIwN2M2NGNlMzZkYzA0NjdmNGRkNWNlYmMxZTVmZmU0YThmMzJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9jL2JleC1jLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDllYTc2YTQ1ZGNiNjA1MGY2ZDM3NTgzY2MwZTUxNTBmZDU1ODU3OWQ3NDM3ZDRkNTRkMzI2YTVkZWEzNDRlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvYy9iZXgtYy0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImEzNWU0YmM0MDg1ZmFjMWI5MTY1NDA1ZDk5YmJhYmJhYzk5MDcyYzA0Mjg1NjE3ZDFjNGM3OGQ2NjkyMjdkYTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2MvYmV4LWMtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Y2Q5MTMzOTZmNjQzMjNiMTQzYzIxNWM0YmQ2YzExMjhlYjAxMGNiMzUxZDVmMDMyZjdhZTgwMzkyZjNlNzBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9jL2JleC1jLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGEzM2MyZjkxYTJjNjBiNzNjMTRmYzU2ZDMwYmY0MDllOTJiNDUzNDM1MjI2NWI3ZTU2ZTNkMWZiYmI3NGRhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvYy9iZXgtYy0wNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1NGY5MzljNjg0ZjYzYjQ2NzFhMDI1MTNhYzQxYmZjODljYmFiY2I3OGU0N2E0MDQ3YzE1OWExMmQwN2JjYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2MvYmV4LWMtMDgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNWJjMjcwOWVjY2MzYzU2MzI2ODk0NzAyNGY1NmVjYWY1N2ZhNDYwY2E4MzM5ZDM5NDFkMTAxZGE5NDM3ZTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9jL2JleC1jLTA5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWViZWNmNWQzN2M3YWU3NDg2NGQwMjI1M2NkOWIxMGMzYjExYjUxZTgxZWZlNDMxY2QyNjE2YjkzNGIwZTc0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNjg1ODk4NWYzZjIzNmZmMDk5MWU5ZTJlZjM0NzRiYWQ2M2I3NmNmZDIwNWE0YzM0MTAwMTRhOTU1NzliNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDRiMjdkOGMxNGViYzdkMzE0MGIwMWE1Y2Q3NjM5ZjllYzU4ZDg5Njc0ZDc3MDNiYzljNzI0NzIyYzFhMTE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjFlMWE5YTViZjBlOTRlYzJlMTg1YzBjNjIwOWYxNGZhNTczMGNiM2VkYmNkMWUyZGM4NGIzZTUzNThjNDQyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4N2FiMjhhMTllZGM2MzBhOWExMzQ0ZTkwNDkwNjc5YjYyOWJjMWM1ZDJiZmY5ZDdiZWY1Y2VkYTQ0MDExOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzk1MGM4NjVjNjc2Yzg2ZmM3OTU3MGRlYzY3Zjg5YTlkYTg1NjkyOTMxOWFkMjZmNmJkZDA2YTYxZDI5MjdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFmMWZkNGRmMGQ0YzFmZjYxMmQxZGQwYzc2OWRkMjk1NDM4OGZhNzQzN2U5ODg2Y2E2ZGMzNjI4Njk2NDg2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0wNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhZjZjYjQ1NTJmMWZkNGJiMTIxMzFjNTcyZGNlYzcwMmNhYTkwYzM5Y2UyMmQ0MWVjMjY5MzA2MDgxYWNhMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMDgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDg3MWU3ODVjMmU4ZGI4OWU0M2E1YWEzNTI0NjU5YjdkNTQ4YzJkMWZjZTAwNzEyZjQzNjZiMWQzZTlmOTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTA5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2U4ZDNjMDY2ZTRiNDc2NzQ4OGEyOGJhZTBmMjc2YmRlMTczNmUwOWE3M2E5YWM2MmY5NTdkNzg3MzUxZjE4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0xMC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzYzEzODEwM2NiMmFhMzkxMWExZjAzODU4NTFjM2MwODVjZThlYzdhODE3Y2M4ZWQwMDY0NWI1ZTRiMjEwMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMTEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NWJlN2IxMWM4ZDgwY2M2YzkzMDk2ZWIyNmM0Yzc3ZWU0Nzg2ZGNjNWY3ZmM5MzIyYTBhMWU5ZTIwMGU5YTUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTEyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc4M2NiOWY0N2I3YWJlNmU1MDk2NDZiOGQ0MmVhYWMzYzhjNGQ2MzkyODExYjAwMGFhODJhOGJlODZlYzM0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0xMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2MjMzYTY1N2ExZDRmNTRlMDI2M2Q2ZThlOGFkMTRjNGZmYjkwMjQ5Njc5MTY0M2RjNGI1MGZjMDhmZmJhZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMTQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MmYwNzRiMzQyNjg2NDBkYmExYzllMTU3MmI4ZjE0YWNhYjZjMzE5OWFmYTJhZDNkYTQzZjgwNzJmNjBjZDA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9maXh0dXJlLXNjaGVtYS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODA4ZDVmYjZmZTdmNzU5NmZkMTJiMTdiOGMxMDg3M2YwMWMwYjhkNzMxYzg0NWMzYmZkYTJjMGU1NzBiNmRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVjZWE4Y2UwMjIzMTJhZDA4OGQ4OTZhMmE3NGVjZWJlNjVlYjk4ODEyYmI2NWM5NGU5MTc4ZTc2YjczYThmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhM2Q0Y2NiNjg3NWIwMjhmMDQ1MGJhNTQ0YTVmZjNmZGFmYzVmNjFhMzk1MTM0YWEwYWE5OWYwN2VlMTVmNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMmM0OTg4ZTdjMWZlNWY2MTkyY2FiMWZiMWVkYmQxNDFkNTg5ZDdlMmFkMzI3MmE0YzM2NmM0YmI0NmY5ZTU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTM0MzFkMjcwODExYzRiYmZmZTVlOTdhODFlZmI5YjJkNzAzOTYxOGY2Njk2NDkzOTcyYmIyYThkY2RjYWU0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1MWJkOGUzMGQ3M2FiMGFjMTY0OGY3Y2Q0NTRkYjhkNTlhNGY1YTlmYzdmMzMwODAyZWNhNDJiNjJkMmZkOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMWQyNGNiZTVlZjE2Mzg0NjdjNmZkZjc4OTQ2NDJhZTM1Y2JhMjE0MDE1OTQ5MTRkNDg2YWYyY2UxNGFiMDljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDhhNTczZDlkYTQ5MDhkNGVlMzFkZTVjOWY0MjEyNWNjMGNhY2JmNmNhZThlZmY0ZWE1MjgwOTk2NmMwNGZiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0wOC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyYzEyMzNjMjQzMDJhOGJmMDI0YmNhYjJmY2I5MjgzMjY2NDJiYzYzMGVmYjkwMjA5ODEwNDRlODBiYTkyZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMDkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NzE0YzRkMjgyZTg0ZjUxOWM3OTE4NGQ1ZmQxMDdjMDc5YjIyOTIzNTBhNGFkMGM3NTAzZGQ5YTBlNTI2OWZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTEwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2FjYzQ2MjcyY2RmNjg5ZmM4YTA1NmIwNzZhOTgzZjIxMjc1NzRlMjk2NDJhZTM4OWU0NjgwMGVkN2M1Yzk1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0xMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhYWJjMzgxZmNhYTY2NGE2MDQ2NzdlZDk0NDM0NjhlOTA2NGMxYzdkMTFlM2JjZTRhNDM2MDJhYTVjN2QwNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMTIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Nzg2Y2Y3ZDA5MmQ4ODMwMWQwN2JjODk0Y2JjNjYyZmRjMjhjMTQwYzlkYmU3NTNhNTVhN2E4MDNlMTkwZTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTEzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBlMjIwZTgxYTM0NTA3ZGU2MmM2MTU4YWNkNzA0YjNjYTk0MTUzZDg4OGRmZTc0OTQxNjIyMGE1NGYwN2I2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0xNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUwNmZjZGExNzlmMjMyOGViNTcyYjRmMjE5ZmZjYjhjYjdiODNiYTFkNTYyZTUxYjllZmJhYzlhNzgwMmM3YjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMTUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmM4YWM2MTM1YTNlMDg0YjU2NWQ3YjVhOTVlZDI1ZjQwYjI2NGVlNDA2NzQzMTM3M2I2ZmQ1ODM0NWFhZmFlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2JpbmRpbmdSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDhjNzQzMzNlZGYyMDg5NDgzOTk2OTdmZDJjZjlmMjc1NmE3MjE0NjM4MTg0ZDNkMWE1OWYwMWYzZWY5MTM5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2JsdWVPdXRwdXRCb3VuZGFyeS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg1NmQ3N2JiYWQ5MmUwZTdhMmNkMTI3ZWU5MzgzNjIzY2NjNmJjMWJkNjM2N2MyNDYwNDZhZTRjNjJjN2YzOTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9jb2xsZWN0aW9uSXRlbVByb2R1Y2VkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQyMzU0NmVhMDVmZGRkYjhjM2FjY2M2YmQxZTc3NDFjM2NhNDVlMDdkODJlMjQ4NjE0MjhkZTZmYWQ0NThhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2NvbGxlY3Rpb25JdGVtVmlzaXRlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2Yjg0MTczNGZjZDcyOTdhYzlhZmU1OTE0MmMxY2UxOTM4YTAzZWYxMjQyMDFkNjNhZDhkNWFiYmY2NTVmYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9jb21wYXJpc29uTm9kZVZpc2l0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDk4ODNmMTgyMmQwYzE2YTQ2OGQxNThiYWExMzc0MjIyODU2NDY5ZDYxMzQyZDE3OTY5Y2M5ZTBlMTU0ZjhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vY29uc3RhbnRSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzBhZDZkYjNhZTRiNWU4ZDA5NjMyYjA3YWI1Y2NlMjE2YWM3MDAyOTIyNzkzOGEzODMwMWQ2Yzg4ZGMxMTFkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2N1cnJlbnRDb250cmFjdFJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDdjMjk4NGUxMGM5YjM3NWVjMTEzZjE3NjQzMjcyMDdlMzU1OWZhMGMyZWI2Y2M2NGVlNDVhOTY3ZjEwM2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vZG9jdW1lbnRSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTc4YWJlMTc1NmYzMzEwYzEzOTU0NjQ1ZTZiZGQwN2VmYzg4NTRhZGVhYjU0MjliMDU3Nzk4NDE3Y2JkYTA4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2V2ZW50QXBwZW5kZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDRlNzIyNDNiMGZlZWRmMWNkMjU1OTMyMzZmNWJkYmZiMDM2Yjc3MjViOTY5ZTI5ZDRjM2Q0MmNhMGM4M2I2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vZXZlbnRSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNiNjMyNjExZTcxOWY3NDRkMzMyNzZkYjQ0YmY1ZTNhMDQyNTI4MmQyMDJlOWY1ODc0ZjQwZWU2NTEzNmJiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2V4cHJlc3Npb25FdmFsdWF0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZTdjNDEwMTI0YTgyN2YzZGI0MDBkZjVjMGY2OThhZDNjZGUyMWI4NDk3YzYwNDZkZDM3MWE5OWUxNDFhZTJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vZnVuY3Rpb25DYWxsZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODY5ZmM5MzY1ZTdhNmMwNTE4MDdlZjUwNjBmZDVjYzBjYjhhMjI2YWYxYjg4ZDVmMmI5NzU1ZjE2ZGE4Y2VlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vaW50ZWdlckxpbWJPcGVyYXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODFjNWY1YTliYjg4ZjU1NWNjMWFmM2RjNDJjODZkODIyZTNmZDkyMTY4Zjg1MzkwZDQyODEwZmI4ZWE4NzVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vaW50cmluc2ljQ2FsbGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQ5NmYwM2MzMzcxZmRlM2MzNWY4MjI5YmI5NzRiYTFiNDQ1YWFjYThmNTAxYWQ2YTdjNTQ5YzA4ZDU4Zjg4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2xpc3RJdGVtUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwNTNiMWI0Y2Y3Mjc2Y2Y4YjYxY2ZkZjdhMjQ2Mjg5ZGNhZGE5YzQ4NjUwMDJkYzAyMmY4ZjUxOWY3ZjI4YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9ub2RlSWRlbnRpdHlSZXF1ZXN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTFjMTQyNDRjZDYyMjlmYjNlNzRjZjNmMmY4NWNkMTA5NjJmNTBjNWI1NWZhNWM0NzQ1NDllNmIxOWUzOGI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vb2JqZWN0TWVtYmVyUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmNzhlMjc0YjMwYWIxZmZiZDQyNzk4ZmZkNzI5ZTU5N2E2MGY5N2RkMzRjMjlhYjRkNTU0YWZlNjkwNjFmMTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9wYXRjaEFwcGVuZGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzlkOTY2OTBlN2E5YTc0Y2Y3NzMzODZkNTg2ZGQ5MzA0Y2Q0ZTNhNDc1NjY1ZTYxODU0NmVmM2U4YjgzMWI1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3BvaW50ZXJTZWdtZW50UmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhYTlkNjkwY2M2Nzk4MjU3OTY0MzVmYmIxNDAwZGJmYjE4MTAyNmMyZmNkYTU5ZTRiODRiNjE4ZmQ5MzFiYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9wb2ludGVyU2VnbWVudFdyaXR0ZW4ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZjgzOTY1MTgzYjcwZTYxZTc5YzJhZDg1YzgxZTkyN2ZlZTIyNWNjYmY1ZTkwYTQwYWQwNmY5YmYyMDI3YjEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc2luZ0V2ZW50UmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhZjZlZTY1ODFmM2FmMGM0ZTYxOWMyYzdmOThmZWU0ZjNkMjcxYWQyYzA4NTAzYzA5MGE5MTI3NTgzNTAzNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9yZXN1bHRWYWx1ZVJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOGUyOGFiNmZjMmUyNWE3NzMyNWRlZDAwMjMzYTNlMjI1NTI4NjhiMjBmMjQyMDdkYTI0ZDIxMjhiNGVjY2QxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vc29ydENvbXBhcmlzb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmMwMTdlOTc4MmViZjMzZDY2NTQ1MmE2ZTc2NWMxMzU3ZjJmOTVkNzg2ODI2ZmMwNGI1NTk4YjY5ZmU4Zjk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vc3RhdGVtZW50RXhlY3V0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YTZmMzMyOGRjMzA1NDI2NmFmNmYzZmQ5YmJmN2NkZGE0YmJkNGM3ZDhhZjJkYTY2MTk3OWQzNjM3MzFlMmVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vc3RlcHNSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJiOGI2ZmQwMjJkMjU1MjQ2NmY0ZjE5ZjBkODU0ZmQ0YWFlMjFjYzQ1MjFhNjRmOGQ0YjRiNDYyZDI0MTkwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3RleHRCbG9ja0NvbnN0cnVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTlhZjdhZjE2NDFhMTNmOWM4NjFlYzMxMjVjMWFjMDI2MzFhZjI2Mzc3M2NhYzMzOGI3YzFhMDUwMTIyN2JkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3RleHRCbG9ja0V4YW1pbmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDVhZGQ5NzFlM2MwMTkzNjE1MDUwZTZmZDJiYjRjNzU5ZTZkYzNmZTBjYmY2ZTliNGM3MGI1ZmYyMWM4ZjdhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3RyYW5zaWVudExpc3RJdGVtUHJvZHVjZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNzA5YWJiNjA3MjUzYjlkNjY5ZTIwNDU4MGE3YTQ0NDFiYzRjZjg1NTlmZWU5MzJhNzVjZTg4YTUwNDhjMjhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vdHJhbnNpZW50T2JqZWN0TWVtYmVyUHJvZHVjZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4N2RkMGY0MDhmNWZkZTYwZjU1NWFhMDRkNzY5ZTUzM2UzMGU3NDRmZDZhYWM2NWMwNjA3NzA4M2JhMDU5ZTllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vdmFyaWFibGVSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmEzNmIwNWIwNGQwNWI0NGJhYTNlNWUxOWFiMGUyNTM4M2EzMmQ1NmMxNGQ2NzQ5ZTFiYzY1MDJlODY1ZGM2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvaC9iZXgtaC0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmNiZmY5MzJhY2I5N2UwMjM0NTQzMGZhYzQ2OGE2ZTRjZmQ0ZjU2MWYxZTFhZjY2YWZiNzBhYTY3NmE0NGQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9oL2JleC1oLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk3M2Q4YmJmMzMwYmVlYmQ2NTM1NDRlNWYxN2ZlYTQ1OTM5MDI4MDc1YWMzNDc1YzY0ODE4ODZjNzQ1MDM4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvaC9iZXgtaC0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0OGFiNTEyZGZjMDYxYjVkZGQ5OGIxZDcwOWJmZDJlYTQxZTdjYjVmMjM4ZDI3MGJmOTFkMDZjNGM0MjNjNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2gvYmV4LWgtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYzk3MThiNDQ1YTViNTM4Y2RkYmViMWI1ZmI3MjA3ZmZhNWRjOTc0MzIxOTg3ZWMzY2QzNjFlOTE1NDQ3NzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9oL2JleC1oLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk1NjExZjNmNWYzYWRkNDRjMzA1ZDRhZTVkNTVkOWY5NjI3M2VlOTE3MWUzZTExYjQyOTczM2IzZTk4NjIyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvaC9iZXgtaC0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlNTlmNTJkMWQyMjdlMTY0NzJjODZkZjY3NzA3YTBmMzMzMTQ1ZmU3YzExMDFlYjg4Yzk3NDliYjgxZjcyYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL21hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzFlNmY0ODNiYjhmMTZhNmNlOTRkYjVhYTk5ZmEzZGIzNTViNTkyZWY2Njk2MTZlY2I2NDE4OWVhNGQ3ZjYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvci1jb3ZlcmFnZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODIxOWI1OTg3MDU3NzY3ZTQ5ODA5NmQ0MjI0MmU5YjgzMjZmYjYzMWFhNDI5ZWZjODIwMTI2ZDNiYTIxNmZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWFkZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjZWQxN2YzZDhmMjZhNDE2NjkzMjg3MTM0OGM2Yjc0ODZjOTczMmNiZjhmZDdmZWZkOTA0N2FmMjFlZGM5OWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtYW5kLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjgwZDJkMzhlNDc2ODkwMjllYmQ1MzY4OTdjMzEyNzU0Y2FkNTk3YzhkNjg0OWE4ZWFmYzA0MDc1NDE1YjRjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1hcHBlbmRjaGFuZ2VzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE2NzJhOTk1NjNiMDVhNzZiZWNiNzRlMGZlMDgyZjFmZjNkYTViYTc1ZDczZDM2OGI2Nzk3NTA5ODYwODRjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1hcHBlbmRldmVudHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzM2JmMTYyNmVkM2ZmZTRhYmUwZWVlYjE4OWFjMGFjYmZjM2E0NTg1YmY5MWVkMmIyODc2MzczZWU0Zjg3N2EwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWJvb2xlYW4ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNGJhZDEyZDUxZjcyMWQ4MmU4ZGE2MzVkNzYyNDBmZjQwZWQ1OWI1ZmM4ZGFjYzk1MjZiMzY3NWMxNTZmODQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWNoYW5nZXNldC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2ZGE5Yzc1NmY4OTlkMGM2MWFlN2IzODc5NGNkNDZjMzI4NzJhMWRjMzExMjMxOWM0MWNiYTY4ZmU4ZjllNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtY2hvb3NlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI2ZGIyMWE1ZDQzNGE1MGUzY2Q4NGY1YTEyNWIwZTE5NDUwZTY5OTRhYThlMDY4MWQ0MDk2ZmQ5MDM1MTliMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1jb2FsZXNjZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3ZjAyMGRlMDJlZjY1ZWM5YmM1NGZhMmRlMDE4MTZhM2JlNzA0MzYwMGU3MmUzN2U1YWE1YWJiZmUyMGM1MTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZGVmYXVsdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1MGEwMWIwNWYwMTdhOTg3YzhiNDdlZWViM2YzMDA1OTc0YTUzZmE4ZTc0NzQ5ZmFiZDZiMTM1NzQ5NWIxYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZW1wdHkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmU2ZTJiNzU2Y2QxODAwNzgyYzQ3YmJkMGQwZGQwNjg3Y2EzYWI5NGYzZmM4ZmE2NzU4MTRmODFkOWZkN2IyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWVtcHR5bGlzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkNGRmOTYzMjUyYTg4N2UzNTRiNjQwYzcwYTk3ZTA0ZGExZWY2YmQyYWIzOTExMTFkZjQ0ODBlMTNkZjZmMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZW1wdHlvYmplY3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NjBmZTg1NTc3YTM4ZDU3MmRiNzA0M2NiYjg3YTQzZGQ3ZGM1MmNkMjYxOTM1ZThkNDM0MDc4M2UwOWUwOTQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWVudHJpZXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YmQ0ZDQ1M2M2NzVmN2Q2MGQ1ZjllYmMwYmY1YWVmZjAyMGQxNzJlODJjN2U1M2I0MDFhNTBlNDhkMmJlZjlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWV2ZW50cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhNWFhMTU2MWVjYTY3MjEzN2Y3NTJhOTgzZmQ5ZjFlZjI2NmEwZjljYjRiMDY4MTg1OTc3NGEyZGMyOGExYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZmFpbGlmLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzEwOTQ3ZGVjNjNmZDEwMjFiNGJkMzNmNGVlNGE1YzIwNDMzMWMyM2QyNWI4OTc0MTE3MDdiZWU3MDk0YzNjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1maWx0ZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOGFjNGZkYmNhYWZlMDBmZGQ1ODJhOGMzZjQxOTQ2MmNhZTg5NTJjYWY5NDY0NGI1NzNiM2I3YjhkMTNlNGZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWZpbmQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTFmMTUwOWMwYTdiM2RmYmJjZTRiNjVhYWE2ZWFlN2Q4OWUwOTQxNGU2NTU3MDM2MDNjOTU3Y2JhZDEyMzc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWZpbmRlbnRyeS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5ZWRkMDE1OGFmNzQzOTMzYjM3ZDE2NTk3MDJiZDJhZTllM2EzZDBmNGZiMjE3ZjY3ODY4MTllNDVjMjQ0MjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZmxhdG1hcC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhZGIyYjk3M2Y0OGMzMGQyYzU1MWYzYzVmZmUyYmVlZDRhMjg0YjI4NDBlMDljM2YxZjJiYTVkOWYwZmRlM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZ2V0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdiMWZjZjZmYjE1MDQwODYzYzFiMjlmMDI1NTcxNGMwNDlkMjJhNmQ2M2VlYjkxMDE0N2Q4MzljODI3NDJmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1ndC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImJhZGE1NzJiYTZiZTJkMWNkMGZlNzNmMmQ2N2JiODMwMzM1YjBlNjVhNTA0ZTQ2MmVmNzIyYmQxY2RiNjVkMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZ3RlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVmOGQyYTA5ZGMyODA2M2NhZTQwNjRhNzJjMzM1Yjc0OWJhMjA4NTUxYmIwYjJlZDUyNmQ4NWI0YWY5OGRiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1oYXNrZXkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDZkYjJiYmNiNGVhZGRiZTU3NGVhYjliZTA0MTc5MzIzMTczOTMzNTkwZDQzYzVmYTFhYTgzYjQ0ZmMzMGMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWluY2x1ZGVzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWM1MjViN2EzOTY5YzA5OTBiNDM4ZTkxMThmNThlNzBhMzQ4NTZhMTU5NWM3ZmE0MTUyZTQ0MWU5NTA2MDE2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1pc2VtcHR5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWY3YmM2ZDg2NjJjMmQ4NWYxZmIzYzQxNjU0MGM0MWJmMTZlMjg4YTg0N2EyZWYzZWM4ZDI2ZDkwYWFkYjhiYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1pc2tpbmQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmQ5NTIyYzdjMTJmZTE0NDJlODc0MjQwMmRiYjQ5NGFhOGI2ZDc0MTRmYzE5ZTViZGQ2ZmRhNzJjNGViYTAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWpvaW4ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjY5NjA1NzAwMmJhNDMyNGQ1YzZiNGNjZGI0ZTIxODY5NmZiZWU3YTljZTI3MDQyNzY3YzllODNkNDY3YTM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWxpc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MjUzNzM5OWUxNjk3ZDNmMDA5OTRlNWFmOTlmOGUwOWVmMGMzYWUyNDZlNTZiNWNiOTc2ZDJkZmQzOGIzMWE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWxpc3Rjb25jYXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzY2ZmVhYzQ0NDM2OTcxMGI3YTY0YmVkMzJmMGQ5NzI0ZjFkMGVkZWE0ZGJjYzAzMDBkMzJlNDBkZjEwYjk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWxpc3RnZXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2U5ZDA4YjY2MDgzN2RmNjM4ODAxZmFlZDczOGUyMjZkM2RhYWY4MjJjMWFhNzljODc2M2VmZDJhNzYyYzgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWx0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjI1ZGQyY2FlZTk0NjViZDliNzUzMTI2NzZiYWEwYmU1NDcxOTJlZTAzNWZiZjRlYzkzNmYyZDA3NGU0MmU0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1sdGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmE1ODk3NjU3N2Y5ZmU5NDBlNjMwYzBmZTc3N2MyY2FiMjU4NThlYjQ3YjA4MDcxYjI4MjhjNzg3ODkzNjFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLW1lcmdlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTk0ODQ1Y2M1M2IxNjg1OGZiZDBiNzMzNzM1ODNlODVhM2YwYmZhOTIxY2EzMzE3ZWJkZTM3MDRiOTUxNTMwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1uZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5MjI0ZTVkZmZlMzA3ZWQ2N2QxZmFjN2U0ODNjYTA3ZTMwMmI0NDQ2Nzg5ZGEwZWNlYjZlMTYxYTMxMjdiMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3Atbm90LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDQxMjhmOTFhYjg5ZDFmYzgwYjJhM2I2ZDY4ZWQyYjMxM2YwMTc3NTg5OTBkYWRiODdlMDc4Y2E1YTdmNGY5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1vYmplY3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTJkN2Y0MGVmMzJiODhiZTU5Y2Y4YTc1MmMwOGY0YWY0MTQxOGZjMmVjMTE2NjMxOWM4NTQ2MDllZDkzNGI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLW9iamVjdGZyb21lbnRyaWVzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFhOWQ0YmYyYTBhYmFmMTYyNzA5NTI1MDI4YzhiNzI2YmI3OGQxN2U0Mzc4MGYwMzRkN2NlNGJhNzhhMDY0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1vYmplY3RzZXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWE5NWI5YjkxYTQ0OGVlOTQ4N2UyNTYxYjM3M2IyOTRjYWRlYjdjMDIwNzNjMTAwMzRiYjZmODc1OGI3OTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLXJlZHVjZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImY4ZTFjOTExODhlODZiZWM1OTZjNmI2ODFmZDk1MWY1MzFiMDA0YmM3OGZhOTg1YTlkMDNkMjU1NjE1ZjlhNTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3Atc2xpY2VhZnRlci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzYTU5NzdkY2Q2Njk0MzMxNzY5ZDExZmY5NzU5NjVmNzdmNjY4ZGQyMjEwZmUyMTg1NDc4MWFjMzAwMzZmZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3Atc29tZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4MzlkZWRmOTkzMmUzYTU0ZmZlYjhlOTMyZGYyOWIyOTI2OWQ0NGY1YWFjYzY0N2ZmOWMyNDFlZDhkMmZhMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3Atc3BsaXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzFjMTdiNDM5OWY0ZDUzMmEyM2UwYzA5YTcwZWFmY2VhZjJiZjI1MWM0ZWU4Yzk3NTIxY2E2MGNkYWI2ZDU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLXN0YXJ0c3dpdGgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDI2ZWZkZmE5ZTUyZDI0OGNmYmQ5YjRlOTNjNWQwZTI2NzJmNGU3M2ViZjA0NWRiYTM4MTFiNmQwODAyYThhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLXN1YnRyYWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JiMzExYTk3ZGE5MTI1NjkxZWVhYzc1MDI1ZmZmNmI4NzhlMTU4YTUwZGI5MmFiOTkwMDhiNjA5OWMzMTliNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC11bndyYXAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzQ0NGNkN2VjM2M0YjQ5Nzg3ZjgxMWQ0NDU2Yjg1NjAzY2RhNDg1ZDhiZDBhYjcyZGFmZTc4NjJhNWQ4ZDVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9wcm9qZWN0aW9uLWNhdGFsb2cueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDU2MmRhZjg5MWU2Mjg0MDU5NmNkNWQ1MWZlNDFmZGEwNWVkNDI4ZDY3MzE1Y2NlMGRkZDlkNDlkODgzYzhlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvci9iZXgtci0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmNTQ2NmEzZDBjYmVmYjY5ZDFjNTgyMGNmOTgwNjZmZjg0ZWRjNzgwZmRhYzE4MjhmNjJhOTc5YjZjODhhMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE2M2QzOWRkZDYzY2QxNGJiODEyYTY1NWJhOGI5Nzc2YzM0ZGU2MTFmZTE2NzQ5MGY2YzgzM2M0YWM5M2Y0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvci9iZXgtci0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkyN2IwOWE3MWJjMTk5NWM3NWZiNGFmNWNjNWUwNzE4ZWUxNzI5MjZmN2JiMWFjZGU0NTIxNzc1MGQ0Y2I0MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYWVlODVhNTc2NTI3MzRlMGI5NWU1ZjE5MjFlOGZmN2JlZjJhNjRmMjgwZDA4M2YyMjY2NWU1NTI0NjE1YTE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9yL2JleC1yLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM3YjQ2ZjUwZDg1ODc5NjFmOWQ1YWU1YTY5ODE5ODgxMWQxYmNkZDBlNTk3OWUxZjkyNzFlMWM0ODU1NzljYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvci9iZXgtci0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUyMjc0NGRlMGQ0MjZiYWYwOWUzNWFiODY5Y2JjYjlmMTljMWFhZWM3OTQ4ZjYwMDFlNGZmYTQ4YjJmM2VlY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMGRlY2NlMjRiZTZhOWM0MzNjYzRhMDk4MmM2ZWI3MWViZWM1MDdkMjg0MzA0OWYxZmI1NmEyYWY4ZDhjZjI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9yL2JleC1yLTA4LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDI0ZTM3MmExYWM4MWZiODk3Y2VkOGYxYTQwNDAzOGUwMjgxMjllZTgwMmU4NDQyY2EzNmVjMWE4ZGU1NDQxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvci9iZXgtci0wOS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjYWViNDE0NWQ0NjMyZWJjNjUyNGQ3YzI2MzE2ZjYzZGVkMmNlMTczMDlkZDVhODk0OTAyZWNjN2QyOGMyMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3MvYmV4LXMtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMjk1MWMzYjhmN2NlY2FiMDdhNWU2NTMzM2MzNDhjZDZlNGFjMGZjZmU5YmU0Njk2NWZkODhhY2NjODhlMDc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9zL2JleC1zLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTVhYTBlNTgxZDU3ZjdmYThjM2NjMGU3ZmI1YTRhMzRiYTZkYzczOTZiMTFkYTlmNzM0OTFiYTAxOWUyODc0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvcy9iZXgtcy0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwNDczN2JjYWIyMmNjNjk3OGE3OWMzYzlmZDQ3ZjM0YzY4MzBhNTYzMDcxNWQyM2I0YTdhNjExNjNmYmIxZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3MvYmV4LXMtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTliMWZjYWQyYjM5YWU3OWIwZDM3NjdmN2I5MGE4MmRjODJjNTA1ZDQ1YTAxMTUyMTU1ZTA3Yzk2OTBhZDRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9zL2JleC1zLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjg4MjEwOTYxNTNmMzYxNTlmMzU3YmYyMDIwOTI3NGU1ZTljMDYwODBjNmFhNGNjZGRjZGVlOTdkZjVmODUyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvcy9iZXgtcy0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyODI2OWY2MjEzNDhmNDYwOTc5NGIzYzc5YTJjODIxMzEyZWY0MDhkNjUwNDFmMmNhZWNkNzQ5NjEzMTcxZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3MvYmV4LXMtMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDAyMDY5ZGIwNjdkZDJkNjE1ZDBkNGMwMGY0NjMwZGRhMWEwYTlmYWY4YzBiMjgxYWRkNTE0NzJmYjkxYjcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy92ZWN0b3ItY292ZXJhZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGVkNDA2Y2JmMjhlNjU5ZmYyYjBiN2FiMzdiYjgzOWIxYjY0YTI1OTU1NTVhMzY4MmNkYmI5NzhkOTIyZjhkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZ2FzLW1hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmNjg5ZTBjZjUxYjBmOWFmYTZiMThhNjQwZTBjNzU1NDcwOTIxYTdiMGQ2NmY2MmJmYzIyMDY2NzlkZTY0MGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L3JlZ2lzdHJ5L0NvbXB1dGUyLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjRmMDBhMWY5NTNlMzM3OTgyZmRiNjY4ZWVlMWU5ZmE5ODcxNDNjMWZjZmFiYTkxY2ViZDYyYTBhMzU5NTZmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvcmVnaXN0cnkvRml4dHVyZUludHJpbnNpYy5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjZmFmN2NkOWZmOGJiNGI4MzM2OTIwMDFmMmY2OGNkYTUwMTc5MTEyZDU4ZThmMmU5OGZhMmJmY2U3MmY0ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L3JlZ2lzdHJ5L1NvcnRGaXh0dXJlSW50cmluc2ljLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQzODMzYzBhYzhhMzRhMTFjOTc2YzIwMTk5YzZhODllODE1MzYxNDQ3YjE1NzhlODZlNTI2YjI5NDJlYTE4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvcmVnaXN0cnkvbWFuaWZlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWU2NDU2YWFhODQ4YTYzNzEwNzI4MGRlOTEzNWI0ZGRiZGFhOTUxNDM2ODEwZjIwMmJlMGIxY2FkZDQxY2NmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9maXh0dXJlcy9jdXN0b21lci1wYXlub3RlLXNuYXBzaG90LWJleC1mdW5jdGlvbnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTcwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwYmY1YzdlNGYxYTFkNDA4ODU2MGZhMjE3OWZjOGRlYmJhMGRlOWNmNjMxMDIwZGZlYmEyMjZhOWZmZmRmNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvZml4dHVyZXMvY3VzdG9tZXItcGF5bm90ZS1zbmFwc2hvdC1ldmVudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1NTI1OTUwM2ZmNDEyZTUyYjU0ZDkyZjIwNGMzM2U5NzhjMzQ5MDgyN2ViNDk2MDc5NjQ0ZTIzM2E5NDgyNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvaG9zdGVkLXJlbGVhc2UvYmFzZWxpbmUucHJvcGVydGllcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2FkMThmNDExYjY5Yjg5MGM3ZTFhMmQyM2ViNTRiZDYwMjIxOGU2NzY0YmRjMzJhMjBjYWU1MDQ5MTUzZTFiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9ob3N0ZWQtcmVsZWFzZS9nYXMtZXhoYXVzdGlvbi10cmFjZS1leGFtcGxlcy5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTFjZGRiNDdmMzFiYmQwNmMwOTU2ODc4YjRhMmQ2NjcwOTExZDZlYWI1ZGI3MTg3Yjc5MjQ2Y2NlYjI5MDVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2hvc3RlZC1yZWxlYXNlL3B1Ymxpc2hlZC1hcGktaW5zcGVjdGlvbi5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODg5YjBkMWU2NzgyMWNiZmNjYjRmZTE2ZTMxMGEyNzYyZjEwZDc1M2NkYzM4M2UzNTkwYzA4MjljZGY4MjQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2hvc3RlZC1yZWxlYXNlL3JlcXVpcmVkLXB1YmxpYy1hcGkudHh0IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5NTY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWFjYjQ3MTJlM2UwM2M1YmE5YTU4ZDg3YjRhNDBiZWQ0ZTFkY2NhNzZlZDU4ZWYzNTVhNzdmMGVmYzlkM2M5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDEtaXMtbm9kZS1wcmltaXRpdmUtdHJ1ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZmEwODZkYzNmODFiYzZjNTRkZTc0NWM5NjM2ODYwNmIwMzliMTIxMTY2ZDQ0MjAxZjMxMmM4NTg3NGJhMDNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8wMi1qb2luLWxpc3Qtc3VjY2Vzcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2EzZDIxNTE5MjcwZmFhYjYwOGE1YjUwMDkxMTlhZDcxZDk1YmI5NGM4NDkwMWZkN2E2OGNmMDhlMmM3N2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8wMy1jb25zdC1rbm93bi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NmI3ODFiNmE4ZWVjMTBiMzk1YmQ4MTJiOWY1YmIxYTRlNGM4ZWE3NDkxYzliZWQ1NGIwZmJmMTMyOWJiOGVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8wNC1jb25zdC11bmtub3duLWNvbXBpbGUtZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWRjOWE5NjcxNjQyYjQyZWQ4MWRiZDU1MjE5NzYyZmVmZjc3MDAwYzhhYTBmMTZiYzU1MTZjZGIxODFlZTBhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDUtbGl0ZXJhbC1wcmVzZXJ2ZXMtdW5rbm93bi1jb25zdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODkwZDljOGU3MzI2ODVhYWY3YjczYmI2MDZmZGY2OTRmMzUyNGZmNTRkMTM5MThlYmI3YTNlODMzYTc5NTBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8wNi1saXRlcmFsLXJlamVjdHMtYmV4LWluLXR5cGUtZmllbGQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjVlNjJjZjUwMDFkZWVkZTdiZTViZGZmZTcwOWMxN2NiYmQ4MWNjNDU2NTU0ODBmMDJiZmMzODk4ZTljYWYyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDctZnVuY3Rpb24tdHlwZWQtaW50ZWdlci1wYXNzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3YWUwMDhiODNjMjAwMDEzNjg4MWFjNTk1ZDdlNWQyMjVmYTUwMjA5NmE5OGMyNjc0OWE2NDMzYjJjODdlNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzA4LWZ1bmN0aW9uLXR5cGVkLWludGVnZXItcmVqZWN0cy10ZXh0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzNjFhMTNlNjA4MjJlM2QxYjI4NTZkNjdlYWQwZDA1OWQyZjQxODVjZWIzYzY1OGYwNWI4M2I3ZGFhYjExMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzA5LWZ1bmN0aW9uLXN0cnVjdHVyYWwtcGFzcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjE1YTNmNTIzNzQ2NzlkMGNhYjg0ZGE5YmU4YWZiNjlmNzcwZTM4MzZiMjE4NjhkMmRmNGU4MjNkMWU4OThiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8xMC1mdW5jdGlvbi1zdHJ1Y3R1cmFsLW1pc3NpbmctcmVxdWlyZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODVmNmY1ODA4MmJlZmM2ODM3NzBmYjQwNWI4NWM2NzZkNjg4MmU3YzkwNTNkOTQ3YmViODUzMzRhNTQ4YTQyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTEtZnVuY3Rpb24tZXh0cmEtYXJnLWNvbXBpbGUtZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGM0NDBjYzg2N2U5MWYwMjIzNDU4YTAwNmY5ZTkwOGM4ODMyZjgyY2MxZjIyYmIyODUxYTExNjlhMWVhMGQzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTItZnVuY3Rpb24tbWlzc2luZy1hcmctY29tcGlsZS1lcnJvci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTg0ZDAzMjcwZDlhYjIyNTEwOTExN2JiOTIxZTFmZDBhYThiZmEzNDY3NjdiNDNjZGQwZTE5YzdiMDU0OTA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8xMy1mdW5jdGlvbi1yZXNlcnZlZC1hcmctbmFtZS1yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYmZmMmM2ZTRhNzU5YTZkYjMwYzRhYTU5YTJkMjZiMGYxOWVhZDM5MDgzMGU3OTc0NDUwYWMwMDUwNDY1NjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8xNC1pcy1ibHVlaWQtdHlwZWQtbm9kZS10cnVlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImEzOTE3ZTBkMzAwYWU4Yzk1NWNmN2Y4ZGFmYTAyMTc0YzI4ZDUxNTRlYmVlYjhlZWJmOWJjMzVmNGJhOTlhYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzE1LWlzLWJsdWVpZC13cm9uZy10eXBlLWZhbHNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwYWUxN2JkM2NmNGQyMmNhMWQxNDc1MWY3YWJmOTkyYWI2NDliNmE2YTA0ZThkNzQyM2E5MWU4ODJkN2NhNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzE2LWlzLXBhdHRlcm4td2l0aC1iZXgtcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE1Y2Q0MDQyNjI1MzczNDU1NzkwNTVhZDA3NGMyOTRhMjhhNmRhMTEwODEzNDE3NDZmOGYwODExMGZiODBhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTctZG9jdW1lbnQtc2NvcGUtcmVsYXRpdmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc3N2Q4ODUyMmE5Y2IxMjMzMzQ3MDZkNDQxOTk3ZDk3M2U4MmE5MDhjOTk0NmYzYWQ2NThhOGFhYTk2YWE1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTgtZXZlbnQtdmFsdWUtbG9jYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjMzNjg3NzFmOWMwMmFhMjkyZDcxYWI5ZGRlYWM3NGEwZjcwZDE3MDJhY2IxODY3ZWUyNmRlMTliYWFlZTdjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTktY3VycmVudC1jb250cmFjdC12YWx1ZS1sb2NhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTM4MDJlOGQzMzdjZWQyYmRjMDVkZjAzYWQxZGY5M2JhMTM2OTkyY2JhNWJjYmYzOTNlYzhlN2JlY2U4NjllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8yMC1zdGVwcy1vYmplY3QtdmFsdWUtbG9jYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDVjZDI1ZWM0M2Q5ZWZlY2UxMzQwYzNjZGFmOTM4NzlkMGQ2YjljNDYxNTBjZTdjYzVmYzVlMjk5NzAwNDAwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjEtcG9pbnRlci1nZXQtdmFsdWUtbG9jYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2IyNjA0MTBhOTcxYTQ0NjAyNDE0OTZkNGYxNzJkNGYwYWQ0NmJiNDYzNmUzNmQ3ODM0NGQxMzc5YzgwNjI5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjItcG9pbnRlci1zZXQtdmFsdWUtbG9jYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk3MjdiNWEzYmJmNGQ3NmE4NjMzNjUyNjg0MjBmZTI3ZDIwODVhMjAxODU2ZjIxMzViZjc2MGEwYmM4YjQ2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjMtZHluYW1pYy1wb2ludGVyLW1pc3NpbmctZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzliZmEzOGMzOTA3MjM4ZjkzM2U5NDMxNmM5NWM2NzY4ZWVmMjNkOTZiYjQ4Mjk2YTYwMDg0NjJlNDY0Yzk3ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjQtcG9pbnRlci1qb2luLWVzY2FwZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYzkzZmM3ODNlZGE3ODQyZmQ1YzkyZTM0YjVjNzVhMGJiOTdhNzhhMzNmM2ZjN2IxMjdhMmUxMjY2MzFlYTEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8yNS1hcHBlbmQtY2hhbmdlLXZhbGlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImVmNTEyM2YxYTI1MmZjOGNiNjJkMTk5MTRhNmU5ZDU4MjA2N2FmNjA5ZGM1MzVhOTg4NWUzZDg0MjhlYjIyNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzI2LWFwcGVuZC1jaGFuZ2VzLWJhZC1vcC1lcnJvci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzFmNzE5YjFjNTA2ODZkZTdiZDc0OWViNWM5NDU1YjBlM2YxNGI0ODQyZTIyYzc3YjZhZjA3OWEzZDkxM2FmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8yNy1hcHBlbmQtY2hhbmdlLW1pc3NpbmctdmFsLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkOWZmMzAzZDA2YzFkOTFiZmU3YjVjNGVkNGU4MTZkMGMwZmM5NWU5ZjRkZjJhZWE4MDc5MTc1MzM5ZGFhMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzI4LWFwcGVuZC1jaGFuZ2UtcmVtb3ZlLW5vLXZhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDE3ZmQ0YTYzNzJlZDBiOTA3YzY3MGZlNmQ3N2RlZDlmNDY5NGMwZmJhOWQ5OGU2MTM1ZTNjNjZhYjQ1OGJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8yOS1hcHBlbmQtZXZlbnRzLWJhdGNoLXN1Y2Nlc3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdkODFkY2JkYzhiMzMyNDhlMzdmNDI1OWFlZTJhNjhhZTgwZTZmZDA5YTQ1YzhmNDJmMmRhNTg5NmYxMDhlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzAtYXBwZW5kLWV2ZW50cy11bmRlZmluZWQtZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmZiMDE3MmM3NGM5OWNkM2VhOTNmNTEwYzE2M2IzYjVkYjUzYzRmOWRhNDBiYWE0ZjY3OGE5MjQ1NDQwY2VjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzEtcmVzdWx0LXZhbHVlLWV4YWN0LWxhdGVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzExYjcyNTgwOGJjNmQ4ZjQwZjBiZjFjOTMxMWM3MzFmNTY0NTc2MzUzZDIwYjJlODlkNzNjOGUzM2U0YzNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8zMi1zdHJpbmctb3BlcmF0b3JzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2YWQ2ZGEzYTdlZmJkNTlmYWJhZjQxOTI2Y2YwN2NkYzY0M2VjYThiYjY5NmE3MTIxNmIwZjY3MTA5YWUwMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzMzLWxvZ2ljLXRydXRoeS1lbXB0eS1jb2FsZXNjZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MTIxMjU3ZDUxOTZkODRiYmRiYmI3OWEyNWMxZjI5ZmMxYmYzN2I3MGNkMzEzN2IwMjA1NzdlODJlMTg3ZTU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8zNC1udW1lcmljLW9wZXJhdG9ycy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxODE5OGY2YzlmMGVhYTMxZGUzYjlkMjdjNWU5MGRlZTQzNmVjNTA3ZjVlZTRmYjVmMGM1Y2NlZjg3MTU1NGQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8zNS1udW1lcmljLW5vbmV4YWN0LWRpdmlkZS1lcnJvci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZWEyZWUyMDQ4OTMwNjM4YmE3NThhOThkNjJmZjhiMjNkZGRjMGQzNDhiYWJkYzNhYzM2ODVlMjU5Y2JiNDk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8zNi1vYmplY3QtbGlzdC1vcGVyYXRvcnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWRhMTYyZjc1N2FlNTNhMWJlNGFiZGY2ZjUyMDdiMjhhMjNjNTgyNTFmNGUzMWZkNjRkOTMwZmU0MDE4YzMyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzctYmx1ZWlkLXNpYmxpbmctb3V0cHV0LWNvbnZlcnNpb24tZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDFhNDhiMjg2ZmRlMTk5ZThmNmUwZjc4ZDQ0YmNhZmQ3MDFmMWFkYzk5MWNjNWQ4M2RmYjdjYmFiYTBiMjNmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzgtaG90ZWwtY29uZmlybWF0aW9uLXVzZS1jYXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwMWNmN2MzM2I5ZDM2NjY3NDVlY2M4ZTBiNjU3NTQ3MzhmMWU1ZTFhOGI3ZjlmNDY4YjM5NTg2NDg2ZDg2NjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzM5LXBheW5vdGUtY2FwdHVyZS1jb25kaXRpb24tdHJ1ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDA4MTc2ZDE2MmQyZDIyZjFiYTBkM2I4MTcwNzJjMWEyNjg3YjI3NGU4YjRmODQwYTNhYWVkNWJjM2JmMjcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80MC1wYXlub3RlLWNhcHR1cmUtY29uZGl0aW9uLWZhbHNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzMjMwM2Q4ZDlmZjA1OGViNzM2ZmE0NTBjMDk4NjdmNDE4YmUzY2JlMGE4MTQzODVmNTRlYjgzNjk1MDQ3ZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzQxLWV4aXN0cy1taXNzaW5nLWZhbHNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxZThiMTIzODQwMDQ3Y2M1Njc4N2QzNTlkOTAxYWI2MTM2MDU3ODU1OTU1ZGFlZTY4N2U5YzEwZDQ4YWQ2NWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzQyLW9wdGlvbmFsLW5vdGUtdmFsaWRhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MzZjOGE1M2Y0NjY0NTE5OTViNDkzMjA1MTY5MDZhZmQyOGZiNjQ5NDllODRjYzgxNGJkMGNhYjFhNzYxNGVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80My1mb3JlYWNoLWxpc3QtaW5kZXgtcGF0Y2hlcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTI2ODE0ZjA4Y2ZmM2YzYjY3NzA2ODNkNWE1ZTJiZjhjZTExNjdjMWM5ZGE0MGYyY2IwMjgxYzg3MzQ4OWZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80NC1mb3JlYWNoLW9iamVjdC1rZXktdmFsdWUtcGF0Y2hlcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNDAwMGQwYWNmMzFkYzUzMTZlZWQyNWFkZDc2OWRmY2M3OWIxZjgxMzkxZmNmZGIzNWRjYmZiYzlmYWFkMmFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80NS1keW5hbWljLXRleHQtb2JqZWN0LWtleS1taXNzaW5nLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNWUxZWMyNjUyNDg0ZDgwNjhmMjQwYTA4ZWRiYzUyMzYwNjllMWU3M2QxYTJlM2Q4M2RjYWY5YWZiMzg4YzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzQ2LWR5bmFtaWMtdGV4dC1zdGVwLW5hbWUtbWlzc2luZy1lcnJvci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzZkOGRmNWRkMDc4ZTljMjU5NmM5YTA5ODJiOGVlYzRjMjQzNDQ4MDI0MjRjNWVlNTI2ODIzZTA1OGZkOGZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80Ny1yZXN1bHR2YWx1ZS1wYXJlbnQtY2hpbGQtcmVwbGFjZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTZkMjAxODhmMWI0YmNhYjgyM2E4YTFlNjg5NDY5NDVhZGViZTU5NjdkMDllZWQ4ZDJmNThmOTRjMTRhMzkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80OC1yZXN1bHR2YWx1ZS1wYXJlbnQtcmVwbGFjZS10aGVuLWNoaWxkLXJlcGxhY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWNiM2FiNTgwMDUxZGMxYzE4ZDgxZjY2ZGUxNWI0NjA3YTU4MjcyMmFkZWUxYjhlNTk3YjU1YjAyNDY4MDQ1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDktcmVzdWx0dmFsdWUtcGFyZW50LWNoaWxkLXJlbW92ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWJlNzE2YWNkYzY5ZjU1ZjhhZGRjYTlkMDI2OWYyN2U3M2M4ZWJhZTlkNThlZTEyMjQzMzdhMGZmM2ZmMTYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC81MC1yZXN1bHR2YWx1ZS1saXN0LWluZGV4LXJlcGxhY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmU4NzYxYjFkMzMyZmZkYjNkM2IxNzJmNWQ3ODE4YWFmM2MwNzE4OWI2Yzc5MDA5NWZhNDBhMTZiZGQzZDE0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNTEtZ2FzLWxhcmdlLW91dHB1dC1jb3N0cy1tb3JlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5NWVjMjdiZjMyODJjNzBhZjNkMjgwY2M2OWZlNDUxYjQxZjY1YjczM2E5MzY3ZDEwYTYwMTcyM2NhZThhNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzUyLWVyZ29ub21pY3MtZ3VhcmRzLWtpbmQtcGF0aC1sZXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDkwOTNmZjUyODg3ZmUwM2QxOTNjY2Y1MThhNDg4ZjM1MTg1MzFlYzFiZGJkODJmY2NiNDBkY2FjOWY0MGI0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNTMtY29sbGVjdGlvbi1xdWVyeS1jb3JlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmOTkwNDJhMWYzNTdmODM1YmY0OTdlMWVjM2IyZDRkMWY0MDllZTM2NjQxYTMwNzlkY2E0MDg2NjYwMTE1NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAwMS1yb290LWV4cHJlc3Npb24tbGl0ZXJhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3Mzg3OTAyNjQyMTZhYmIwZDM1NWUwN2RkMDJlN2M0YzU2MzEzMjg1Y2I1NzNjMjFhNGZlN2EyYjhhYjI4YzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAwMi1lbXB0eS1kby1ib2R5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTc4ZTA4NjNlY2Y0NGU1ZWU5YzEwZDlmN2I1NGE0OGYxNjIxZmEyOGZlOWMyNDZiZmFhZGM1NWFjNTczNDMyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDAzLXJldHVybi1saXRlcmFsLXN0YXRlbWVudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5YjE0ZmRkODA5ZTEzOTJjZWY4YjEyZTJkMTUzYjU3Y2E5Njk1MmIyMjMxNDMxMmJiMjkzN2JkMGY0ODBmMjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAwNC1jdXN0b20tZXhwcmVzc2lvbi1iYXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM0NGM4ZDIwZWNiZmIyMjlhYWQyOTYyZjg2MjgxM2I5MDU4MTViZTU5Y2I3NDIyMTM0OWY1MDYyNTFhZDExMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDEwLWRvY3VtZW50LXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTAxMDY0YWZiYTMxMThkZjg1ZDI4NzRhMjc2N2E1NTVhYWM3ZDdkZDdkMzFjYmI4MDZkYWEyNDkxNWMyMDk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMTEtcmVzb2x2ZWQtZG9jdW1lbnQtcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3MjliYzYxNTljYjQxODQ5Y2U2YjIyNDBiNmFjOGM3NzNmZDIwYWRjNThkMjczODdmYWI4MTM4YmE3NTQ3YmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxMi1ldmVudC1yZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjAwMDZiYTY3OTY4ZDQxMDRhNDI1OWUyNjE1YzlhMTRmNTNiOTk3OWJhNTY2NjE3NzU5NmYzNTE0ZWYxNjA1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDEzLWN1cnJlbnQtY29udHJhY3QtcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmNjI1NmVhYzNlM2RhZjgwNTk0NDJiNmQ1YmVhM2Y2NjU1MTJkNWM4NjNkNDQ2NjRlMjFjYjJmZTYxOTA5YTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxNC1zdGVwcy1yZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2FiMjVjZWU1MzExMmI5ZjRlYzlmODRiYjYwZWVmMDVkNmVlZDFlMjYzNDZiNDk4YTVkZGFmNjNlYjI4NWMzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDE1LWJpbmRpbmctcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyMzUzNTFlOTEwZjI3NWVmMTQzZWRiMTc1NDQ2NDNkNjgwNzIwZTIxY2U5YTM5NDU2YjFiZmU2YjU1M2RmNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxNi12YXItcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJlMTA0MDY4MjliMzQyZDkzYjE0YzQ4ZjIyODU2NzU0ZjhkMzVhNjgxYzQwYmU4ZGNlMzU4OTM0ODNjZjI3NjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxNy1yZXN1bHQtdmFsdWUtcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlMjM4YTJkODk0MThiZDFkYzBlYmJlMmI4Y2UwMzM0MjMwMWUzNTZiMDIzNzliYjExNDgzZjNjYzdhYzdiYmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyMC11bmFyeS1pbnRlZ2VyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzU4NTgyOTA5NWM4M2MzNmYwNGIxMzMyMTc4YTY2ZmI5MmQyNTVjOWVlMzU2YmUxYzYyNTQ5MzI4YWE0ZGM1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDIxLWlzLXN0YXRpYy1wYXR0ZXJuLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY0ZGE2YjA2N2VlOWI4YTMyY2U4ZWM4NDNlMjJjODBlYWU4MTZkOWEyMTVmMjNlMjU1ZDQxNWJiNzAyYTQxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDIyLWNvbXBhcmUtZXEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDVmMGVhNTBhY2FlM2I4MDM3MzNhN2M1OTZlZWYyYzYzYTkyYWMwYjE4NDUwMjU5ZjU1YTVkMjdkNDhmYmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjMtbnVtZXJpYy10aHJlZS1vcGVyYW5kcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlM2JkZDE0MDM2ZmYyMjg2MmEzMTk4YjkyMGQ4MzQxYTliM2QzMDVmMTljM2RhNjg0MzM1Yzk5ODMyYmVmZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyNC1jb25jYXQtdGhyZWUtb3BlcmFuZHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNmMxOTFmNmQyOTc2NWRjMTU2MzY1NTlhOTk2YzFkZWM0ZDEwODdjZGIyYTAxZTZhYmUxOTA4N2MzY2U1OTMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjUtam9pbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyYjY5NTRkYmUyY2ExYTE1MTAyNWY3MjdiYzUzZTFkYTdkYzk5NmQxYTNlZTc5MzgxZjNiNWMwNjI5MDM4MDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyNi1zcGxpdC1uby1saW1pdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3ZGY2MWRlM2VjMmZhZTljNzkzYTcxNTUwMzZhNzY1YjhjNDU2YWVlODI0MTFhOTI2MzFmZmE5NjJlMTQwZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyNy1zcGxpdC13aXRoLWxpbWl0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTkxYTJkMjcwNjRmYmJjMmZlYWY5MzkyMzQ0MzQ0YjE3NDVlMGI5ODgxYmU4YjFjYjBhYzAzZmJiOGY3YWMxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDI4LXBvaW50ZXItam9pbi10aHJlZS1zZWdtZW50cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxNjI0NWVkYTM3MmEwZjI2MzQ3NzM2ZGUxNzVmYmU0NmFjN2ZlOTcwNmI0M2MyOTcxNjRkN2MyMzBiMTIwOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyOS1rZXlzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU2MTRmOTRiNzRkNGU1NTBmNDFjNThmMmNjZDljMDAyNjNmNDk1OTZiMzMyYzIwYmViOWZmMjQ4ZmMwZjkwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDMwLWVudHJpZXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MTc2MzhhZjEwNmQ5ZTJjYTIwNTY0YzA4MjEwNjU5OTNkZWE0MjVmMzBlNjRhZmJhMGIyNWMxN2VkNDk3NjkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzEtc2l6ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlNDA3OGI0YzVlYWM2YmMxM2U0NDI1NTk3YmFkODgyYmM1MTFjNGJiNTRiYTcwODA3ZGQ0MzQ2NWMzOTNjYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAzMi1saXN0LWNvbmNhdC10d28tbGlzdHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTBlYjMwMmQzYTBmOTI2ZjQ5MWQ1MTk5YmQ3OWQwZjNlNTgzZDZlODVjZmZmOGU5YzdjMTdlMTcyZWM0ODM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzMtbWVyZ2UtdHdvLW9iamVjdHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZjEzYWE2MjI4YTY2NTM0MTBkNDJiOWJmMjA5NzdiZjY5N2Q2ZDY0ZTQ3MjAyZWMxODI4Y2E2ZjMxYjg0NWMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzQtc3RhdGljLW9iamVjdC1saXRlcmFsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGEzZjFjY2E4MDhlOWQ1YmZlNTg1MTQ4ZjcxOWYyN2I3MTg3NDAxZjE3MDk5NDRjOGQwZDZlMjM5NzdlODg2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDM1LWR5bmFtaWMtb2JqZWN0LWxpdGVyYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NGM0N2U1MTVjZWM3NGEyZDRmODE0YzU4NmQ0NDhlZTg2Y2IwOTU2ZGQ2ZGQwYjM4ZmU4YzU5ZThiMTI3ZGJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzYtc3RhdGljLWxpc3QtbGl0ZXJhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2NjcwYzM2MWE1Y2Y1Zjk2ZDU4YzY3NzVkZTU0NTM0MjE2OWIwMTVjOGNmYTljYzkwMTA4ZTMxMzY5YTA5N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAzNy1keW5hbWljLWxpc3QtbGl0ZXJhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjZGUyODMxNmY3ZDcwNGRlMWUxNDFlNzRlOWM3ZjNiYWJhNWRlOTdkMTBiMWE4NDRhOTIwOWM4OTk1YmQwMDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAzOC1nZXQtc3RhdGljLWtleS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImU1NDk3M2Y4ZDM4ODY4YTcxMjliY2VhMTg0YzIyYTVmM2IxM2JmNjJmMmNlOGUwMDZjZjMxODRjMjYyZGI0MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAzOS1nZXQtZHluYW1pYy1rZXkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZmM2YjI5MWY4ZGQwY2ZiMzAzYTU2YzkwODA3ZDEyZWZjNzU4MDY2ZTY4N2FlZGYzMDgyMDBlMDE3YzM1NDAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNDAtbGlzdC1nZXQtaGl0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDcxNjhlMDMwNzk2MGZiZTk4YjE1NTE5YmEwYmQzODg0NjAyZTIwYmEyNDY1OTEyZDhlODg3MTg3NDU4ZGViNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDQxLWxpc3QtZ2V0LWRlZmF1bHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDEzM2ZlY2MyYTE3YjFiYmIzYTZhOTAzNmMzZjYzYjZmY2NjYzk2OTMyODZjNjljMTBlYzE1YWIzNzA2YzFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNDItb2JqZWN0LXNldC1zY2FsYXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYjczMzJkNDFmMDk1MDNiOTVmNWU4MjZkMGU3YmIxOTU4YmU0ZDBjMzM2YWVmNmFlYTM2MjdiNzM4M2JhZjExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNDMtcG9pbnRlci1nZXQtaGl0LXR3by1zZWdtZW50cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2MWYwOWMxNDk0ZjYwYWI4NjA3ZjRmOGRmNGU0YjYxNjUzYWY5ZGFmNWY0NmFiYzQ4ZGUyNmUyZjc1OGNkY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA0NC1wb2ludGVyLWdldC1kZWZhdWx0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIwZmEyZjZmNzU4NDU4NGQ4YmZlMjcyY2M5YTdiMWJkNWZmNzMxNDE0YWI4NDFkY2I1NTEyNjY1NmJjMzU1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDQ1LXBvaW50ZXItc2V0LXZhbHVlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGE2MjcyYzNmZWQ3NTI5ODI2OTgwZTFkMTRiNjA0YWViMWZlZDE5ZjBlMjI4NjFmZDc1YzdiMDRiYTljNzEzNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDQ2LXBvaW50ZXItc2V0LXJlbW92ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg3MTFjNWFlNTcyZTFiOGIzODgwMWU0YjFiNDQxZTRiNWQ3ZTRhMDRiOGQyZTFlMzk2YjNkZjNkMzAyN2M1MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA0Ny1jaGFuZ2VzZXQtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4NThkNGIyNTZlODZlYTU4YWFjMWI1ZTFkNTczNzEyOWU5YjUxOTgzNDMwMjljNThlNzRiNmY4ZDdkODJhYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA0OC1ldmVudHMtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlMjExNzk0ODM5MjkxY2U4NmYxZDBiYzJhYjM5NWIyZWMxZjYyN2I1YjU3MjkyMmU3MWNjZjA0NjY0NjRmM2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1MC1hbmQtc2hvcnQtY2lyY3VpdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhNGYyYjNhMjYxODE1ZDc4YTMwNjFkZDM4MWY1OTVlZmIzYzliYTYzN2M2ODVkZjUwNjNmM2ZjNDE5Nzg4OGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1MS1hbmQtZnVsbC1ldmFsdWF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ0YzE4ZDc2ZGEwNTBlOTMyZDA1NzNmNGEwMmIxZjllNWZhMjg0ZTNhODMzNWRhNzVjOWQ5MWNiYjBiZGFlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDUyLW9yLXNob3J0LWNpcmN1aXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMDY0M2NlMWNiYzA3ZTJhMTc0OTM4YmYwOTVjY2EwOGE4YTFkM2ExMmM2NDg2ZDU5MDNkZDhmMDE0YTRiYTkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNTMtb3ItZnVsbC1ldmFsdWF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRhNjNlMGI1NTE0MmQ0NTk5YzU0OTc4NjYzYmE0M2RlYjE4NWIzOTEzYTRiNjA0YTBkMGY5N2IxMDhmZWNkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDU0LWNvYWxlc2NlLXNob3J0LWNpcmN1aXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NzdjNTI1ZTFiNzg0YWZmNGZiM2ExZmUyNzNmNmQ3MmZlNTg2NjZmZWQ0ZGQ0MzAwMzgzNzBiYTA5OGRkYTlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNTUtY29hbGVzY2UtZnVsbC1ldmFsdWF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2FmZGJjMDYxNzcyZDM0ZTk5ZTlkMTYxNTFmNDRkNjk2YmZmZWU3Njk2NzMxYmQ0MDQ0YzBmMmI1Nzk3MzYxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDU2LWlmLXNlbGVjdGVkLWJyYW5jaC1vbmx5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYxMmEyN2UyZWVmNzQ0Y2RkZWQ4MTgzOTI0MDlkOWM0OTRjZWZjMTdmNWI2MWUxN2UzMmEwMTM0MzFhZWYyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDU3LWZvcmVhY2gtbGlzdC1lbXB0eS1ib2R5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzdlMDg4Y2NlNmJlYTQ1MWI0ZGFmMTBhNDljZmE1MDA4M2U1YzFkY2ViYzRkNTU3NjdmYzkxOWViZDU5ZDUxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDU4LWZvcmVhY2gtbGlzdC1ib2R5LWFwcGVuZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2MGVhZDYyMzkwYjNkY2I1NzRkMjQ3YjQ4NmZkYzY1ODZjOTM3OTZjYjc4N2FkMThjN2FhOTA1ZTVkNGY1M2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1OS1mdW5jdGlvbi1jYWxsLW5vLWFyZ3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzkxNThkNGI4ZDNkYTdlY2M3YzMxNDY1YzIwOTc3ODk3ZDNkMjc3ODg4MzQ1Y2FhYzcwNWRiZTQyNGI2NWNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNjAtZnVuY3Rpb24tY2FsbC10eXBlZC1hcmcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTY3NDFkNjkzMzRjMzZiMDRmM2UyNjY2ZDI2YTM2MThiY2Q4ZDA4NjZhZTk3MzFjMTE5OTYxNGY3NGY1YzhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNjEtY2FsbC1zdGF0ZW1lbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ODE0N2NhNDYxNDk2ODY1OGI5MmJjNDA4ZDdjMWUwMGNjOTYzODIwMThjYWU4OWY1ZTY1NTU0ZmNjMTVkZmE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzAtYXBwZW5kLWV2ZW50LW51bGwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmFkMDlmYmNiNWY3ZDgzMTE1MzY1ZDgzMjEyMmMyNzcxOGJjOTVlMmQxYTI2YjQ2NzkwZDIzM2JmMzRiMjU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzEtYXBwZW5kLWV2ZW50LXN0cmluZy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3NDlhOTMzYTBmZmRhZDA2YThlOTI5ZjViMGU5MTE0MmU0NmE5MzFjYTdlNWVkMGI2YmYxNDljNzA1NjczZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3Mi1hcHBlbmQtZXZlbnQtYm9vbGVhbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmYjJjNTAxMWJlZWJjZDYzYzQwMjQxZTkxNzIxMTNmNTc3OTUyNGVkNWM0OTRhYTYzYWMzMzU2NzgzNTY4M2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3My1hcHBlbmQtZXZlbnQtaW50ZWdlci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhNDQ5MjdjZTU1NzA0MDQ2YzU4NGM1ZmNhY2M4NGViNWVhMGMxMzYxM2EwN2JlNzc2MTAyMjQ0ZDU3ZDUxOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3NC1hcHBlbmQtZXZlbnQtbGlzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyMmI0MGVlYjRjODM4Y2FlYmExZWM0ZTA5NmNkNTJjZWZmYmJlYTg2M2MxZWM2YjBjNWYwMzNiN2ZkZDRkMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3NS1hcHBlbmQtZXZlbnQtb2JqZWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTBmNmU0YTkxOWZkYjU4Mzc1NDcxMGM4MTM5OWQ2YTVmZjUzMGZiYjFkZDlkOWE1MjIzZGJhNTI4MmUzZjA5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDc2LWFwcGVuZC1ldmVudHMtdHdvLXNjYWxhcnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZmI1OGExZTk4OGFjN2ZkNjNhMzI0Mjg0OWUzZTQ0YWYyYjk4OTVlOWQyNzgxYmE5NmE3YzQ5ODMwODk5ZmUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzctYXBwZW5kLWNoYW5nZS1yZXBsYWNlLXNjYWxhci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxZmRiZmRkYzRiNzU0YjY5OTE5OGI3ZjQwOWZjMTAwMTRjZTlhZmFhODFkNDM1YzAxMzc5ZjlkMGIzMTM0YWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3OC1hcHBlbmQtY2hhbmdlLXJlbW92ZS1sYXp5LXZhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImE3MzZmNWYzOTY4NDc1OGEzM2MzNzA1MWM0OGI5NjczZjQzNjc5MTc0YTE4MDljMGM3OWVmNmZkYTAxMGUzOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3OS1hcHBlbmQtY2hhbmdlcy10d28tZW50cmllcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkYWE4NjdlZGU0OTEzYzhiNTQ2N2UwOWI1NDgzZTUxNjYwYWI1MThmOWE3NTM1N2YwNDBmNTY0ZjgxNjcxODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5MC1leHByZXNzaW9uLWdhcy1leGhhdXN0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDE2Y2IwNzkzMzE3N2U5NTcwZGFlZjIwNGYwZjY4ZmM1NWUwNjBkOWM3YWE1NjFiYzJlNmMyNmVkMzJlZDg5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDkxLW91dHB1dC1zaXplLWdhcy1leGhhdXN0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGMzYTBjMjYwMDg3YTI2ZTgxOGI1NjYzNjc4M2UzYzEwNDcwNTdmMTgyMzE1YWNlNDRiMDgzZTljZDkzODM1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDkyLWxpdGVyYWwtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0MGEzNzE3NzU5OGU2NTEzZDEwYjBmMjNiZTIxZjBmOGRlOTA2ODg3ODUxZWZmNjVjZWRhYWI4MDEzMTNhMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5My1jb25zdC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODljM2FlNTZkNmExN2M1M2JjOWZiNDI0MDk0YjViYTJmMTg3NDJkMzEyZjc5NTk5MjNhZjVmOGFmNWZmMjhlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDk0LXVud3JhcC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGZjNzRlMjQxM2ZhNGFlODkyMzUxZjFjYjMxMjE0YzYwMWMxYjYxMDU2OTBmZGU5NWJjYzg1MzQ3OTAyZjhiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDk1LXRleHQtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxOGVjZjNkNmMwMmE2OTgwNTVjMjViMmNkOTQxNDdlNjY0MDcwMzIzMDMyYzEzZDVlOTVkZTljOTNiMjJmODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5Ni1udW1iZXItZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjODNkNzJjOTRkZTI0YzkwMzllNjBmMGFiMGIyYzI5NzU4Y2JmMWFkMzYwN2IwMzkzMGMzZWJjYjE1ZmMzZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5Ny1ib29sZWFuLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTBkYWRkNzI2NDM4YjE0OTRlNTJhYzljNGM1NmUzMzY4ZmNiNDBkZGJlMjg3ZDJiMjljMWMxYjcwZmZiNjA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wOTgtb2JqZWN0LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTljMThjNzZkYzBmMDIwYjQ0MGE1NDE3NzRiMjVlMTU1OWFjMTlmMjY5NDkyMmEyNzE4ZjA3NmI5ZTBiMWNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wOTktbGlzdC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVmYTNjODlmNDJmNjYyZGI3ZDIyYTgyMjBkYTJkODgzZmQyYzViYjU2ZWRiN2U0OTBhMWMzNzBlOTQ3ZDg0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTAwLXRydXRoeS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjg5ODQ4ZTQ0MGRjMjM4MmEyNzkxM2RlZWEwYjk0NzNjNWUyNGIyNmYyZWFkZWE3ZGQxNjJlODYwMGI0ZDVmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTAxLWVtcHR5LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MGM1ZDM3ODQ1MzBjZWUxZGM1NDEzMTI3YjZiMzY4NDdmNTZlOWI1NDlhNTc0ZWI2MmMxNzhmZDNiMWIyNDEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMDItZXhpc3RzLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMTNjNTBjYWIxZDA1MGIzNDIzMjJlMTc3YTJiMmYzZTA4OWViMTgzZTJiNmI2YWY2NGM2YTA5YTU3ZjJlNDc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMDMtbm90LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDNlNGQ5NjdkM2ZhYWUwMDc4MGM1OGU5ZjY3ZGY0MTQ4ODNlZTU3OWI0MTkwODJjZjkzOTUwYjY0Zjc0OTY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMDQtZGVmYXVsdC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWEyMmY2MWRmNGZkZDkxYWRlYzE3N2EzNjYyNDE1ZTdkZGFmYTJiNmIxOTNhNjc4ODkzMTlhMWIwZjlmMDM1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTA1LXN0YXJ0cy13aXRoLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyY2ZhZTdhODA4ZmEyZTlmNjNhNGVhMzdjMDdjZTFkYzUzZDcwNzBiYTQ1ZjI3MmE4ZmI3YWM4MWNkMDQ3MjFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMDYtc2xpY2UtYWZ0ZXItZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmMjdlMzAxYjgzNmJhYTM1MDY2NWIzY2UwMWY1NThiYTA2YmJlYjdkOTBjNGNhNzBmYzJlNjQ2NjMxZjFhNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEwNy1uZS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzYyOWZhNGY4NjA5NjIyM2M2Y2MyMTcyYmJlYzQ3MjgzZGI1OTZiNTg2MzJlNmQyMTg0ODRjNDQ1ZjM3MTBiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTA4LWd0LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MmViYjViYTg3YmI5NzBmODExZTAzOGM3MDlkY2JlNjg0ZDI5Mjc4OTY2NDViMzIwNTYxNGY0NWM0ZjMyYWFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMDktZ3RlLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMWRhMDJiZDIyYWI5OGEyZjcyYWVjYzNiOTIwMWUwY2M3NjI0NzAxYzAyYzU0MWY1ODY2MmVjNjhlODg3ODU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTAtbHQtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNTFiM2JkOTg3OTBiODgwN2RkMDIzMDgxYzM4MzZjZGFhZmQ5ZmY1MjczNGUwNGYwNTRiZDY0NTQxNzAxYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTExMS1sdGUtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0ZDc2MTZmODU4N2FiZjhlZDkzYzNjYTNkMDliMTc4NDczY2ZhOGQ4OGJkMjk0MDgwMmUyMTcxZTQ3MDg0NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTExMi1zdWJ0cmFjdC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDA1ZjAyYWFhODkwY2EwNmEyMTZlNTg4MDUyOWVhZjAxOTJlMzFjMjBhMGVlZTMwMGFiMzE2NDViNjU0NDdkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTEzLW11bHRpcGx5LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2N2JmNTY4MTA1YWZiNjM3NTk3YjJlMDBjNWNhMTNmNDk1ZDg0YTNlNDJjYWVkNDJjZTdiYzcxOWZjMTAwYzUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTQtZGl2aWRlLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDcwZDczMDIzNGMzY2QzYTkyZWJjZTM0MGI3MGY5NDg4YTc4MzA5MzQwZTc1MmQxZmIwNzkzMjE0OGVkNjQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTUtY2hvb3NlLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMmM0NzBlYWE0YzU5NGY1NjFkN2FkYzM2NGMzYjY4NWJkOWE2MDg5MGYzM2U2NGM0MDcwODI3ZDU4NTBjNDQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTYtc2V0LXN0YXRlbWVudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0ZGUyN2NkOWIzNWEwYTBiZGQzY2E2OGRlYTQ4M2QxZWM0MjE4NGYyNjE3MzUyM2I2OGFhZGMzZjZlN2ZmZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTExNy1hcHBlbmQtY2hhbmdlLWFkZC1zY2FsYXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YjNhYzFjY2FjMjE3MTM2NmI5ODcyMjUzMmNhOGFiZDUyNGQ1MDQwNGU2MjUxNTU3NTc3NDRjZmZmZWViNjMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTgtYXBwZW5kLWNoYW5nZXMtcmVtb3ZlLWVudHJ5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjA1NzI2ZmYzODY3YjBhNjhjZmI5ZDI3ZDk5MDZlNTUwYzI3NzVhNjhlMjcyNzQ2MjEyYmIyZjYxNDVhYTU1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTE5LWR5bmFtaWMtcG9pbnRlci1leHByZXNzaW9uLWNvc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTVlYmI2OGQ4MGNhN2NlOWI4NDQ4OTRkZDY0OWI1MmEwNGM1OTc1MjQxMWRiZWIyM2U3ZTdhNTIxZjZiZTEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjAtZHluYW1pYy10ZXh0LWV4cHJlc3Npb24tY29zdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwOWJiMjJiYjBjMDU1NmE2NTNlZWViZjUzODU2MGU5ZjNkZjZiZGI1OGZhYjIxYTg0ZjNjZGViYWZhZDJhYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEyMS1jdXN0b20tZnVuY3Rpb24tY2FsbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImEyMzEwYTQ0OTc1OGZjNzBmNTE1ZTQ1Mzg1NzRmOWNjZThlNzhjOGU4NzIwMjViYmRlYjBkMDQxYzM3MTgyYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEyMi1jdXN0b20tc3RhdGVtZW50LWJhc2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYWY3OGU2MThmODlkNTNlMWUyMWQzYzdiNTcxMDhmOTBlM2EyZWM0M2IyOTBkNGI0YjAwODczZTczOGY4MjAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjMtY3VzdG9tLWFwcGVuZC1ldmVudC1iYXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2QzNGMxMGZkYzA3ZmM1NTJhOWE1ZGE4NTUyMmM4Njc3M2E3MWJiMjY1ZjBlN2Y4ZmMwYWRjOTQ3OWY1MWI2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTI0LWN1c3RvbS1hcHBlbmQtY2hhbmdlLWJhc2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODEzNjUyMmNjMzgwNzZmODBkMTI0ZTdiODQxZTRlNTRjYWM5NmZiMjUxOWRmYWJhZTg2Mzk1ODJiMWUxYmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjUtY3VzdG9tLWRvY3VtZW50LXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZTc4YzE2NjViYWM4MzViMTEyZGE1YmFlMzk0YTViNjMyOWU0OGY3NTIyMGY4ZjIyNTVhYWE1YmQ1OTAwMWE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjYtY3VzdG9tLXBvaW50ZXItc2V0LWJhc2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2M4MjcyNjI5OWY0ZjU0ZjI1ODkzNTNlMGM1OGFhNmQ3MWY5NzY2OWNmZGQ0OTMxYTcxNDI2ODZjNzU0YmI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjctY3VzdG9tLWZvcmVhY2gtaXRlbS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkMTA1MDdkM2VkOGEzNmUwYzk0MWJhMGEwOGY3ZDNmMjc5OWM0NGUxOTc4NDEyOWRkMjE0YTA0MmYwMWY5MDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEyOC1tYXAtdHdvLWl0ZW1zLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE1Nzk5NzM4ODc0YmYzMDU2OThiZDBiZWM2ZWUxNmY3YTdiZjkxMGZiOWY0NTBlMWU5ZDAxZTk1MTZmNGRhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTI5LXNvbWUtc2hvcnQtY2lyY3VpdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2ZDI0ZmE5NDU4YTgwNzM0NzBkOTdiMzIzNjU3NTdmNTczMDVmYzNiY2NjN2UwNzUzN2Q1ZTgwYzViMjA0MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEzMC1kb2N1bWVudC1zY2hlbWEtYXBwZW5kLWNoYW5nZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzMjAwOTVjODIwOGVlNjdlYjFlYjA1NWE0YjU5YWQ3YjlkNDgzMTYxOGJkNGM3OTM1YTkyMmJkOWYwOWI0ZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY0MWYyYWI0NTFmY2ZkMjZjZjg2OGU2MmU0ZWNiNWRiMGIwMTYwN2EzZjZjZDkxODlkZjcyZjk2ZGYwMjMwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL3BhcnNlLWVycm9ycy8wMS1pbnZhbGlkLWlzLXZhbHVlLXNoYXBlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZThhNDhjZGM3ZTg1ODhkZmFlMzU5NWI0YjJlOGM1NzdiZmI2MGM5YmM5Y2ZjMzk0YTdhYTJlMGZjYzJlODBkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL3BhcnNlLWVycm9ycy8wMi1pbnZhbGlkLWpvaW4taXRlbXMtc2hhcGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2YxZTE1NjdlNTYwYjk3Yzg2YjgyNDhlOWNiMzNiMTllZDlkZDgzZTUzZmViMTIwOTJjNzJmNzUzMmY5MjFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvcGFyc2UtZXJyb3JzLzAzLWludmFsaWQtYmx1ZWlkLXdpdGgtc2libGluZ3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYmJlOTc3OTA1ODkxYzdkNGY3ODg1NjQzMzNhMzcwMDg3ZGE2MWE2ZWU3Y2QwMGQyN2Y4YzQyYjAwN2Y2MzJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgInNoYTI1NiI6ICI0ODEyOWVhZGE4NmY1NmZkN2ViNzY3MWIwMjdkMmZhZWFiYTI4Yjg3YWJmZTM0NDVhN2FlM2E0ZjlhOGMwNTY0IgogICAgICAgIH0KICAgICAgfSwKICAgICAgewogICAgICAgICJuYW1lIjogImJsdWUtcmVwb3NpdG9yeS1qYXZhIiwKICAgICAgICAicGF0aCI6ICIvVXNlcnMvcGlvdHIvZGF0YS9ibHVlLXJlcG9zaXRvcnktamF2YSIsCiAgICAgICAgImNvbW1pdCI6ICIyMzc5OWIxYzYwYzkzNzIyNTJmM2U5YzczYzAxYmEyOTJiMDUyZTAyIiwKICAgICAgICAiZXhlY3V0aW9uU3VyZmFjZU1hbmlmZXN0IjogewogICAgICAgICAgImFsZ29yaXRobSI6ICJTSEEtMjU2IiwKICAgICAgICAgICJpbmNsdWRlTW9kZSI6IHRydWUsCiAgICAgICAgICAiZmlsZXMiOiAyMjQ3LAogICAgICAgICAgImVudHJpZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuY3oudG9tbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyY2JmNGM5YzEzYWM5Njg1MDA1MTUxZmQ0YTc5YWFiNWU1YTVhZTZkMTc5OTE5N2E0YjdjNmRkZWE2YzYyNzNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmdpdGh1Yi9zY3JpcHRzL3ByZXBhcmUtcmMtcmVsZWFzZS5qcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTM1NTMzNDEyOTJkNGIzNmEyNWU0ZTk5OTg4OGFiNzYwNDlkY2M5ZTA2ODZlOWM0Y2IxZTZmODI1MzZjMThkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTIzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0OTdmNGI1YjJiNTAxNzIxMDZiZDU3MzgyMzc3ODIyMTVjZGIyZmNlNzczY2RjNzVmMDZhMDZiNGY4YTFjYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUucHJvcGVydGllcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzdhNmMyMGExMTk2ZmJjN2M0OTM5ZGI1NTBhZDA2NjBlNWI2NWZiODEzZjMwNWQ2YjlkZjJlYTlmMzdmMTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXciLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1YTVjMTk5YmEwMjE4OWFlOGM0NmEzMzQyMjMzNzFhMjA1OTlkOWMyOThlZjY1ZTc1NDBlZGU0YTNmNzJkNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNldHRpbmdzLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTY2NjZkOTAxM2RhMGE5NjE5OWU1NWQ3ZDk1MjRmZjYyNmM1ZGIyNWRiMDZjMGQ1YTBkYzhlNjUwMzM0MzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vQmx1ZVJlcG9zaXRvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRjOTk4ZjQ1MTY3YjFhOWFhM2U2MTFjNGNjNWQzNzk4ODA2YjljOGRhMzI3YTc1YjU5MTNjMjgzNzJiZWQyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL0JsdWVSZXBvc2l0b3J5TW9kZWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIwNjEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzU0MzllNTM0M2QzM2M2MzMxOGM0N2YyNWJlN2QyMjg2Zjg4MDgyNzA4ZmMzODllNWUzYjZiMjRlNzljNGJmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL1JlcG9zaXRvcnlEZWZpbml0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwZmVhNWZhYmNhMTczMzg2ZGI2MDI4YWNhNDdlMGI4MmIxMzFkYjVmYWQwMGUzMzRhZjk2ZjdhMDU2NmJmZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9SZXBvc2l0b3J5TWFuaWZlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFhNjIxNmQwNjRhZjBkMWQ4OTI1NjhkN2Y2ZTQ1MGU0MDVhYmQyMzM4Zjc3ZTk5M2IyMmI1ZDYzODNhZjEzNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL1JlcG9zaXRvcnlUeXBlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwZTUxMTBiMjg5Y2ZmMWMyMTZiYjBmYTY0OWQ3NDE2YTBjYmU0MjFmYzdhZDE0NTc0MWY4NjljZTc4MjExOGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9SZXBvc2l0b3J5VHlwZURpY3Rpb25hcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2IyZjhjZjlkZjZlODUxZTIzNzQwZDk1NjA1OTA5MTcyODkyNmY1ZmRmYjc5MTQ1MzVmYWI3M2NkNmM3OWIxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTJlNGJlNWFlMjQ4OThhNDExMDM1NDdjODdmMDk0ZjEzYWU0YmY0NTkzNWU3MDM0ZjRmMjYxZDYyNmU3MjljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vYm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwQ29tcGxldGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlZTA0NzI5MzIyZmE1NzExZmFlNTFhNWEzZGJkYjc5NzFiNzQ4ZTIwYzgyYzAxNTNlNzY3MmIwOWIzMzU2MzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9ib290c3RyYXAvRG9jdW1lbnRCb290c3RyYXBEZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODBkNTYwZTg2NjAwNGM2MWU3M2NjNTRlNmY2YmQzMTc2OGU5MGNiOTJmMzNmNDA5NDY3YjY1NTg3MTA2YzJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vYm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4ZjliOTliMGM2ZWU0NTFhOThhODhmMzg3NDNlZDY4NmNmMDJiODI3ODExNjc0N2JlOGNlNWJiMzM2MjkwNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9ib290c3RyYXAvRG9jdW1lbnRCb290c3RyYXBJblByb2dyZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmYzQxMGMxNGVjOWM4YTM1ODJjNWRmYmU4N2ExY2JhYjhkNWRkMDQwYmQ1MjcwYmU4ZmQ3NGU4M2IxODJlNzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9ib290c3RyYXAvRG9jdW1lbnRCb290c3RyYXBSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI2OGRjMzFjYzUxYWNkZDMxNzg4MmQ2ODVkZTFlZDBjMDMwM2JmMzQ1NjIwZWY1YzU3MWQ3ZWVhMzdkMmY1ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Jvb3RzdHJhcC9QYXJ0aWNpcGFudE1hcHBpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWEyOTFkMWE5NTM4NjlhMzJhNjc3N2VhMWU0ZDI2MGFkMDAyNTc3MmZjOTdjNWEyZGRhMzg2Y2MyNWU4ZjdjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9DcnlwdG9FZDI1NTE5VmVyaWZ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxYWM1ZGJmNTkzOWUwMTYyNjc5MDQwNjRjN2Q1YTM0NDRjN2ZiOWE0YWZkN2M4NzhiNGU2ZGE5NDZlNDExM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vQ3VycmVuY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMzc3YTljZmYwMGQyMmM2ZDM0YWQxODdkNGU2OGFmNjJiNWRkMWFiOWY1M2M5Y2JlMDgzODU5YTE2NWExOWUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL0RvY3VtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NmRhZjdlNjRmZjVjMmE1OTEzMzBmYTcxYjQ1NTg4YmZjNDE2ZWE1MzBjYjExNmUzNGI1ZDNmYzMwYjI4M2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vTmFtZWRFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlMjg4MGM5YzI5YTMwNGI3NDdiNDBmZWUwNzEwOWQyYWUwMzQyNGFkNGUwYzRkNDRlODJhOGJjMGZkNjRmMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vUGF5bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzZDNmM2MyMTgxMDg5MWZjMjU4ZjFkZDg0YTIxNDA1ZmY0NmFmODU4YzkyNDg4Njk5MjUwZjZhZjRmZWE3ZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vUHJvZmlsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5M2IxYzY2ODg5ZjExMTRjZjVjYmUxN2U0YWJjNDVkMWU3ZjUwYTg0M2E5ZmE2MzFlNGY1YjlhM2E4NzliNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vUmVjb3JkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzA5OTBkODZjY2VjN2M4NjgwNWU2ZWExOWI1ZWQ0MDI2YmUyZmE3N2Y4NmE0ZTYwMWZhMTQ0MTQ5ZTc1ZjA0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9SZWxhdGlvbnNoaXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZWJkZjNiZTNhY2Y2ODc3NzAzYTQ5ZmJhNmM4YTAzYmY3YTFkMmFhZWU1NTI2ZDUwZGFjNmRiMTc2NzA4NzMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL1JlcXVlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNjllODNkZjUwNDRmYTUyODk0Yjg5NjljYmI1NzdiMDczZTFmMjI3NDU1NGMwOGU1YWZkMGI2ZDViZGU2YTliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL1Jlc3BvbnNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWY4MWNhZWRlMmI5NGFlY2Q4YmQ1Yjg2NDA0YzU4ZjI5OGE5MjVlYzI1ZmExNTc1MGM4Zjg5YmMxOTg3OWUzOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9TZXJ2aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlZjAyYWEzNDg5YzUyY2RmNjNlY2M3MTVjNDI3NjQzOGM5NGFlZWZiZDJhMmRiMWYxYzA3ZDZjMjY1Mzk4MzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vU3BhY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2QyNmUzMDgxYjcwY2UyNmQzMWI0ZjgxZDE4NWZjNzIwNzQ4ODlhNmFmNDVjZmQwYjhjNjM0YzFmZWMxNjg2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9UYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzdlNGZjOWVhYjY3ODQwYmU3OWYwZTFmOTY3NDBmOWM4YTRhOWM5YTE4MGNiMjU1NGM3ZDk0YjM0ZmU5N2VjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9UaW1lc3RhbXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYWZmZGZmYjE1ZjhhMmVjZGQ3NDY2ZDcxNTdlZjRlNDYwZmFjZTNhNDQyNjc4YWVjNjI0YzRmMzlkYjkwN2UwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0FQSUNhbGwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBjMzA1NWIxNjRiZDc5NzUyNjk5N2E0YTQ3NjU2MTQzNTg0ZWIyNmE5ZDM5YmUwNzYzNTI1NDY3MjZhYzU0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9BY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4MTU1ZTRmOWNlYzhhZDlkYTAxNWJhZTEzYjA5ZmM0M2EwODRlNGIwOGI0YmFlMTYwNGRlYTQxMjk5YTdhZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQWN0b3JQb2xpY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JiZGFkYzhkMGY1ZWFkM2M1Yjk2ZGM1YzFiZmUzOGZlMTc0OTJlMmM1OTBiNTIxMGVlNDU1NDdkY2I4MmU1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9BZ2VudEFjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlOWQ0MTI2N2E1NWNlZTk3MzZhNjgzYTg1ZWJmOGI1NzUwYWRiZjJkZmRlYTA2ZGE0YTJhM2JkZDJmZGZlNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQWxsVGltZWxpbmVzQ2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDk3MzAwNzBlMjc4Mjk2YWJhZjVhYzZiMTFlZGM2ZmI4NGU4NjU4MzlmOTM1M2MyN2M0NGZiYmYzMGU3ZGY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0F1dGhvcml0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4NmUwMDE4ZWQ2MDIzYWNjOTQzMTE1NDVmODhiYmNlNjEyNzhmMGMwYzkwOWQzNzZkMTM2ZmRlZWY3MjU3MWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQnJvd3NlclNlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTBkOTZjZDM2NzIyM2Q4NzZlY2FmYWEwZDcyNzJmODFmMGRlMmNhNTc5NzZiYjM2NjZiMjMxZDg1MjdhNjNmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9DaGF0TWVzc2FnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNmE0ZDU0NjVjOGYxMDEzOTU1ZjBlYzdlYjI2OGRmN2E0NTQ2ZGIwMmFiNjc1ZDk1MzY3MjdlNjkyOGVlM2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0NoYXRXb3JrZmxvd09wZXJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmY5YjAxNzkzNjRhZmVjODg4Y2FjMTIwNWQ1NDZmMjlhYmIzMzE3OGIzM2Y4NmFiNDQzZmMwMTA2ZDk0ODJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0NvbXBvc2l0ZVRpbWVsaW5lQ2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTQ1YTc0YTg5NTBiNTIyODIyYmJmOTFmMTdlZGE3NGNkYjc3MjFhOTA0ODMxNTg3NTI1MzVhZTc2YjAzMWYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0NvbXB1dGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBiMjFlNjk5NDEzZmVlMDE3MzY2YjRkZmUxNjMwZmU3MmRhMTFmOWY0OGFlYTIzOTE5NzMyODVhYzM0MTUwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Db21wdXRlRGVmaW5pdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTY4YWMyNTczMmJmY2I0OGNmMjNjMjczYmJmNzFiM2RmMTAxMzg2OGM2MDE3YjI0Y2JmZjczNDYxMTM3N2JlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0N1c3RvbWVyQWN0aW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2MGI1MmY1ZjVjYzNiMzZiMTVkYTNlZWRlMTA4MzA3MTllZDdmOWUzMjAzNzBiN2NkYTRlZTM5MzQ0YzM4MzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQ3VzdG9tZXJBY3Rpb25SZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODM0YmQ0ZDQzMzZlYWU3Yjk0YWExOWNjY2NmZjU0NDRmMDg0ZDk4MDBhOWZmZmVkNjQ2MmExODM1NGM4NzVkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9DdXN0b21lckNvbnNlbnRSZXZva2VkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImIzZTFjOGU4ZmM0ZTU4YzY0NDFjMzZmYTg0NWVlNjdjZThkMzAzOWJkNzY0OTUxMDk2OTFkMGQ2MjBhMGYzYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRBbmNob3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDExN2Q5YTAzMjY2YzkzY2E3YWE4MWU2ZDk2MWI4ZThjZjc2ODdlMzEyN2I2MjY5NmRjNzYwNzU3ZjQwMTMwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Eb2N1bWVudEFuY2hvcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQ5ZDFmMjZjNjNhNjdmNzg0Mjg4MGIxOGNhM2RkNjgxN2NkOGNmNmFlNTVlY2ExNzk5ZmM5OGJkMGNkMTM5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Eb2N1bWVudEJvb3RzdHJhcENvbXBsZXRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDgzMGNjMzk2NmQ1ZTdkY2UyNzIyMjUxNzRiYWRkNGE1MzMwZWNlMTJjODVkNDkzMDhmZjM2MDBmODc4Yjg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0RvY3VtZW50Qm9vdHN0cmFwRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5N2RjNzgyYTk3MTAzYWU4MzI0Y2QxYzFkZmI1YTdlNjJiMjU4NjNhZjRhZTU2MGY2NjJmNmUxY2ZlYTNiMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRCb290c3RyYXBSZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzIxNDAxNTNiMmE4YWY3MTE2YjVlZTc2ZDVlYjg2MzZjZTljNTQyMjU1ZGUyZDdmMzI4M2ZmZjMzNGViOTVhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Eb2N1bWVudExpbmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYThiNGRhZTVmODIzN2U2NWUyODU2NmE4NTAxMWI3MDYyYWE4Y2M2ZjYzYmMyOWQxNmEzNTY0ZWMyMjM4NWY2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Eb2N1bWVudExpbmtzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwOTc0NjllNjQxZjhkOGE1NWUyM2UyZDJmZGFmYzcwZjYxMWY5ZjdiZWYwYTFjMDkwMWVhZDRiNTgxZTA2ODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRSZXF1ZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImRiOTY4OTZhNzE2MGFlNzVlMjU3ZGRlYmMwY2E3YzMyNjVkYzU2MThlNjQwMmE2YjFiN2E1YjE5MjMwYmZmNDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRTdGF0dXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmE0YjU5OGY1ZTUyMDQ4NDE5MWM3NzM5NGU2NzhlYzdlM2E5NDkwZmNhZTdhOWRmZDY5ODM4MDk2NGEwNWJiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9FdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzZTFhM2NiZmEyYzZmYTNmZDMwYmE5Mjk4ZWQ1OTgwZjE4OWNhZTkyNjIyYzg1M2M0N2NjZjAyNjUzZDliZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vSW5mb3JtVXNlckFib3V0UGVuZGluZ0FjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOGYxNGY2Y2NlM2NkZjRkMzA0YzljZDFlMzI5MzBlNDJmYmEwZTM3MzZiYzRhMjdiZDljMTk4N2MzOWJjYmVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0xpZmVjeWNsZUV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDdmZjc3NjEwZWJjZjJkNWU1ZGU3NTFiMjAxNjA3ZDM4OWFiYTc4NDA2MzkzMTJhOWQ4ZmJlYjk0ZjE2ODhmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9NZXNzYWdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI1ODIxNjQ5MDI3NTJhMGRlMTg0YmRhYmRkZGIyNzcyMjk5NGJmMDg2YTVhNDRjOWQxNGYzODI5MjIxOGViNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5ZDVkMWE5YjI1M2I3YWUwMjQ1ZTdhOGNjN2NjNDdiMTdkYjkyZGUxNDg0MWE2NzExMGUyNjE5YmFmYTlhYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vT3BlcmF0aW9uUmVxdWVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MjgyYWQ3OWUxZmVjMDBkMTIyNWE0YmQyMGUyZDlmZWFhYzNhZjBjYzhkZGUyYjZiOTMwMmExYmNmOGRmYmIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1BhcnRpY2lwYW50UHVycG9zZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDc2NjhhMDBkYmZjYjZlMjMzYTRhYjgzYTFmOWQwZjBkN2VhMzc3MGMzMzUyNDZhZTdhNmU1MWRiOTE3ZDI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1ByaW5jaXBhbEFjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjI0Yjg1ZmRkZTkzNzQ2NGIyNGM2OTk5YWViNTMzZWUzZTg2NDJiOTVmYjE0ZDI4YzYwZGNmMDFhMTVmNTZjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9QdXJwb3NlU3RhdGVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5MGRkYjZhMmM4NDQ2YTA1ODJiZGY5YjNmZmE2NDNkN2NlM2E2YjVjYTMwM2ZlMGZjODk1Mjc5YjMzNmE3YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vUmVxdWVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0MTdlZjFmYmNmZTlmYTE1NjE4MmI1NTVmN2Q5N2NlYTg0ZTRhNDA2ODkwNjg4ZWRiMWVkNjAzOGQ4ZTQ1NmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vUmVzcG9uc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGU2MWM4Y2Y0ZTE2MDg2N2IwMDQ0OWI2ZGJlNDIzYjViNWI3MTUxNjY5Y2MzYjc1YTI1ZmYyMTI3YWI4NjdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1NlcXVlbnRpYWxXb3JrZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OGQ5ZmY1MjU2ZTZjNGM0MWJhNmE1MTY0MDQ1ZjlhYWNkMWIwZWQyZmU1OTUyMTQzZWQ3NzEwNzZkOGFjMTMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1NlcXVlbnRpYWxXb3JrZmxvd09wZXJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDgyYjZiZGMwYmY5YTBkMjcxNDExNzYwZjA2YjZjZDhkM2I4NzAyNTA0YzIzMGYxNTRhZWRmYmFmYTRhMDViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1NlcXVlbnRpYWxXb3JrZmxvd1N0ZXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MWZlZmUyMDU0MDlmOGY5ODJiOTc2MDQ2ZWY0OTI0N2Y3OTBiNTE4MDY5MTQ3YTgxZTJiOTc5YjJlY2M4YzMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1NvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlNTlmZWIwZmY1ZmQ3MzNjYzBiY2U3YzI0M2Q4OGIzODYxNjM3MTY4MmJkMzQ1MzU3M2ExYmFkNjUxZDEyYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vU3RhdHVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIzZmMxZmVlNGFkNThkMDAzMjFkN2RjYTc5Yjk3MDBhZWY4NDRiYjk0YjVlODI1NTQ1N2U0OWEyOWI1NDAyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TdGF0dXNDaGFuZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzc2MTU1MWZlNGI1NmJkOWViZGM5OWE4MjFiNTEyYTYwNzA1Y2MxNDdiYTk5Y2JiY2E1M2ZiNTA3MTM3NDYxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TdGF0dXNDb21wbGV0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NWQyZGMyZTBjNTczMzZiZGM3MTViZjY3ZjQzZTc5ZjIzMWNkZjc2MDQ0ZjA1MDIxOTQ5NTg1YzEzOTQ1OGY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1N0YXR1c0RlY2xpbmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDM4ZDIwMTgzODNiM2M1NzYxMzBmNTI3NDBiOTFiOWM0NDVjOTBhNjI0ODFjYjQ3N2Q4ZTljMjQwMTA2YmUxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TdGF0dXNGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOTU2NTBhM2U3YmFlNGExZTllNTQ3OTllMGJlMDUzM2RjODNmZjM3MjY2ZGM2Y2FjYzBiYzBmYmYzNzkxYzczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1N0YXR1c0luUHJvZ3Jlc3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDYwMGJkMzZmM2ZlZTc1ODM4MTY1MWMxYWI1NzE3OTU2MTc4MzBkZjE0YjY5YmZkODkwOTQxZjkxMjQwM2JmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1N0YXR1c1BlbmRpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MTBkM2ExNTM1MjljZjA3NDJhZDVhYTFkM2QyMTRjODZhNjcyNzIxNWNkZmJkYWQ2ZWE1YjgxOGM3YzAwNTkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1Rlcm1pbmF0ZVByb2Nlc3NpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTQ5Y2FmMjBkZjllNjcwYTlmOWNlMWI2NzQyOTg4Zjg3NTZlZjc1MzAwZTY0Y2VhZDA0MTE5YTQ4NGIxY2ZmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9UaW1lbGluZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDhkMjRmMjA4YWEzMmFhZTg1ZjAzNDk2ODM5NzUyN2RiNzhmNzRkMDRiMGNlMzYyNWYzNDkxNTU3OTBiMTE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1RpbWVsaW5lQ2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjBjOThkNWFiNzAwNmM0N2NlNjA5ODU1ZWMwYzIzOWQ3ZWVmNzk1NmQ3Zjk1OThjYWM0MDlkNzc2NmE5YjI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1RpbWVsaW5lRW50cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmU4ODMzZmI5MDk4ZDI5MTViOWM2Y2FmMDY3OGE3OTE2OTM0NDIzNjY1ZWYwNDZiMTc0NWQyYjM5ZjZiZDJlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9UcmlnZ2VyRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTExZGU4ZTFjOGVmNzIzNjYxNGI4MWNjZGI5MjFmZjkyZmFlODllMGYyZmEyODg2MWM5NTE0YzE2YjhlZWNiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9VcGRhdGVEb2N1bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDcxM2ZhMjI4MTYwNjRkOWRkZWZmMmI2NjU4YWMxODI5ZDVmN2Q1NDIwNzVkYTE4ODUwZGVkMjEyMGMzN2RlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVBZGp1c3RhYmxlRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjBiZGNhZTgwOTU2OWM5NWNiNGU0ZmYxZDRhNGM4ODZkNGRmZjViNjNkNGMwNGRmZTNhNjllNDdhMjUzMzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVBZGp1c3RhYmxlRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTY1MDA3NmEzNDQzOWJhZjk3YTlmZWIwZjMyMWVkYjljY2MyNWRjYzA0ODQ1ZTQ4ZDU3OGI0OGIxYmM2NDc2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQWRqdXN0YWJsZU9yQWRqdXN0ZWREYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYzZkOGU3MjdlMjBmMWZhNjdmYjI4YTY1NGJkODdhOWI3ZWU1OTViN2IyMzM5ODI5MGVlYTFmNzQ0NzYzNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUFkanVzdGFibGVPckFkanVzdGVkT3JSZWxhdGl2ZURhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODVlZmNhNTc2NTkyOTg0Y2YxNDkzYzY4NmNlZmYxZDJiZDczNzc0MjY3Mjk5NWQ2ZmFkZjM5ZTc2YjdkMjFkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQWRqdXN0YWJsZU9yUmVsYXRpdmVEYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzZTcxOTkyNThmODQzM2ZmODk0MzNiYTA4Yzg5NDdiODQ3MTAxNThlZmIxZTQ1NzZlZWI4ZGQwYTQyNGM0ODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODcxZDAxYjIzMjdlZTRlNDA5ZWQ4NjczZTdmYzY5NTY5MzM4NTUwNDIyYjY1OTA3Y2YxZGNkMzViM2NmYjA0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQWRqdXN0YWJsZVJlbGF0aXZlT3JQZXJpb2RpY0RhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzOWJkMTBiYWYxZDIwZDQ1NmNkNWQ4ZmQ3YzIxOWQzNzZlOTljMzZhNTRiMzdhMWIwNDdiMjgyNWEwZjEwM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUFkanVzdGVkUmVsYXRpdmVEYXRlT2Zmc2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjMGNmMWRkYTNiNTRlNDE3NjEwMDM1MDlhNzdkNWI2MmY2NTczMTVhMjVmNTE2NmIzMDY1NThmNzUyMTdmMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUF2ZXJhZ2luZ1NjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiM2U2NzU5MTg5MWU2NjJlOWQyZDExZWUxNjdjYmNhNDBjOWFmMDRlMzFkYTU1NzY4ZTA0M2VjMDI0YTY2OWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUJ1c2luZXNzQ2VudGVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkM2JjZDY3ZjMyYjZkZTFlNTRjYWU3YmI5ZTk4Y2M5MGQ1Yzc1MWRiZmE4YzZjYTQ4ZTFkNDg5NGE4ODA4MjhiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVCdXNpbmVzc0NlbnRlclRpbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWYwZjIyMjhlOTBiZjE5YWI3YjBlM2RiNTAzMmY4MzVhYThlZTdkOGQ4YTQ0ZWMzYmY3N2JkYmVkNjczZWFjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQnVzaW5lc3NDZW50ZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiMDgwM2ZhMjRhNGI3YmMzMTRlNmI0NDU2YjkwMjY4YThkZmMwOWFmNjE0MTFjZGU5OWVkODEzZTJlZmUyYTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUJ1c2luZXNzRGF0ZVJhbmdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhYjRlY2IxODZiMGE1MTk0NjkxMmRkZWFjMmJhZTY0MTgwZjZlYTQ3ZDAxOThhODk4YzA4YTBmYjQ3Njg5ZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUJ1c2luZXNzRGF5QWRqdXN0bWVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTY1MjliNTA2ZDAyYjI4NDk4YjI5YmMxN2Q0ODNmZDY0NGU2NmExNjhhZmUyNDgxMmY0ODFiNjA5ZGVjNzliNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQnVzaW5lc3NEYXlDb252ZW50aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWE4OTUwOWY1MjE1NzZiOTAxMDcxNTE5YmYyN2ZmNzNlZjVlMzMxODRlYzhmZTA2OTBiY2Y1ZTUwZmYyOTBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVDYWxjdWxhdGlvbkZyZXF1ZW5jeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZWZmYzkxYzFmMjM5N2ZhZmZhNTEwZjZiNGYxMmFiY2U0ZTg1MWY0OGE4OGFjOTBhN2JmM2YyNjA5YTNkNzM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVDYWxjdWxhdGlvblBlcmlvZEZyZXF1ZW5jeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDBiMTdkZDE4YmY4MTUxNjFiNmVhOWIwOTU1ZWEzMTYyMjM4NzQzNmQ4MzgyMjkwYWNiNTE4MGEyNmUwNGE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVDb21tb2RpdHlCdXNpbmVzc0NhbGVuZGFyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNTRhMTc1NzBhMWU1Y2QwYTBlZjc1ZTVhYWU3NDBkMjEyNTdiNmZmMDAxZjNlYTVkZDQzYTk3YTJhY2NmM2FlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVDb21wb3VuZGluZ1R5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzMjAxNjY1ZjAyMDg1MzJiMmQ1MTZjZWMyYTk5ODdiZDcxZjA2MzViZmQxNWJkNjI3ZjFhMjcxYTk4ZWRiMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUN1c3RvbWlzYWJsZU9mZnNldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNGI5MDljNzM0Y2Q0YzI1YTI0ZWJkY2ZiY2ViODQ1M2FjYzJkMjkwNDU0NTdmMzBjN2QyOTljZmE0MjAxNjllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVEYXRlTGlzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YzAxYjM0NGE5MjBiODNkMDNiMTM3OTQ1MjljZDUyMThkZmNjNmI0OGIyNGM4MGE0YmZkMDY1NjlhZTY1ZGYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVEYXRlUmFuZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzhlNjk1ZDRjMGZmYmMwNmE5NjRmYzkzOGUxNmMyZGQ3Mjc4NWM1NGZjMzBjMWMwOWJjNGU4ZmIxMmE5NTNlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRGF0ZVRpbWVMaXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlMGE3NGM1MDE1OWZhOTc3Zjc2ZDZmZjlhMjljODMyNTI1NTJjNTBhNWUxMWM0ZjdiOTBiZDE5MDQ3NWUzNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZURheU9mV2Vla0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWUyNjEzOGUwNGE1YzMwYmZlZjY3NmY5NzAwNzM3YmViMTIyYzJlZTVhMzY4YTYzNGQ0YjE5OTVlYjBhYjQxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRGF5VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDVmZjU3YzcyMGJkMWY5OWQwMDlmMDlhMWRkYjAxMThiYzYzMTMzMjQ1ZGIzZTVjYzlhZWExMjI2ZGNhYjgxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRGF5Y291bnREYXlDb3VudEZyYWN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZGU1ODE2ZmYyYmIyMjJmNDNhYzMxOGE1NTQ1YmY0ZmJiNmQ1Zjk5NmQxZTI5ZmQxMGExNjZhYjI1NmNlMDJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVEYXljb3VudEZpZWxkV2l0aE1ldGFEYXlDb3VudEZyYWN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDUyNzJkNTRmNDI5OGViNmEzYzUzZTczOTdkMGMwZTE5ZjU4MTUzYTFiZDQwYzUzOTY1NGM5ZjI1Njk2ZTQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVGaWVsZFdpdGhNZXRhQnVzaW5lc3NDZW50ZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1MzFlMjY2NDhiYTE0MmRlY2Q4ZTJhNDYxOGVjMTMzZTA1N2Y3ZGViMjc2MjdjZWExZDhlZWUwZjE4ZWM1OWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUZpZWxkV2l0aE1ldGFDb21tb2RpdHlCdXNpbmVzc0NhbGVuZGFyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZjU5YjI4YjA5OWQyZGZlMGRjNzg0ZDZkNWIyYjJkM2UwYTcxYzcwMWE0NjkwNjQ2MmVmNDM0ODQ0OTNhZGU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVGaWVsZFdpdGhNZXRhVGltZVpvbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTNmOTg0OTQzZGYzNGQ3OWUyZmQyMjAzZTMwZTBlMjVkOWE3ZDA5NzkyZjExY2I5MWIyODY3YWQ4OTViNDEyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRnJlcXVlbmN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjZmU5Mjc1ODRiNGIzYWI1OWU3MWUzNWQyYTE3YmUxMTJlMmQzNjQ4MmVlM2FjYWY3YTM1ODZiYmRlZWYxNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNWIzNmE1MmY5ZTg2Nzk5MDYxNjY4M2IyNDU2ZTkzNDkxN2Y0NjM5MDc0MmM0NjZkZjYxMDM5OGY3OTAzNzA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI3MzgyMmY0MTM1ZTUzNmEyN2M4MDVkNDExOWUyYTBlYjE2YmJmMzE1ODUyNjUzMTUzN2Y4ZTUzMWJkMmZiOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUJ1c2luZXNzQ2VudGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NWIzZjBiMWM4Y2Q4ZDhlMGE1ZTFjZWI1NzFhZGE4ODE4N2FjMmM3MjE2ZDRjMjMxOTY5YzY3Y2VhNTliY2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFCdXNpbmVzc0RheUFkanVzdG1lbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI4MGUwZGIwMmFlNDY3OWU3YmJjYjRmMWVjNTFmMWVhMWYxYTcyM2FhN2VlMzA2YzM3YjJiYmY2N2NlZTE0MGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZU9mZnNldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDY3ZjQ5MTI3NGVkMjRmYWI3OTBjYmM1OWY3ODYxOTcyY2ZjNzE0ZTYwYTc4MjNmYTBhY2UzOTg4NzI2ODdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVQZXJpb2QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE3Mjc2ZTEwOGQ3YWUzZThmZDFjNGYxYjJhM2NkNmQ5NWE4YTBlODQzNjZlNGQ4YmM0YTVjNjY5NDA5NTI2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kQm91bmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWEzNmI1YzhiMmM5ZDI4MTk5NGU0ZTcyODhkZDhmYzFjMmEyNTNhMWJiZjlmMzY0N2JmOGE0YmVjMTEwNjQxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjYwNGY4OThhMzIyMzg0MDA3MjZmMjZiMjA4NTNjYWVkYmIxNDUxOTY5MTVkODA5MDA5NjkzNmJiY2ZmYmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVQZXJpb2RFeHRlbmRlZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjdhNGM5M2Y0OTEzM2JhMmEzNDhlNjZhM2NkMDIzNjBmYTIyMTE0ODc5NzU1MjgyN2YwZTg1NWNiYWY5OWFjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kUmFuZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmE3Njc0ODcwMTk5M2MzY2M2NTNkMjRhNWQwNTA3Yzg3ZWMzMGM3NTlmNzBkZjYyNDk4ZTM1ZDVhYjhmYTI4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kVGltZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NkMGY3YzNjODQxZjI4ZGJkZmE5YWZjOGU0ZTJlOGI0NmU5MjI3MzYyOTI1M2NiMTRiY2MwZTgzNWU3YTFmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kaWNEYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTQ5MGJhODRhMTM5ZDIyMTA2MWE1YTRiNjQ2ODFhNmFmMDU2N2M1MzNjMjhlYTJmNDkyZWZjNWQ0NjUxNjcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVSZWxhdGl2ZURhdGVPZmZzZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNThhMzMwNWM3ZjdmODQ0ZGYwYTM4MGIzNjQ4MDI1YmY4ZWE1MWY5YjhmYWQxNDUyZDdhMDJiZjY5MTg1MjliMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUmVsYXRpdmVEYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOGNhZjk1N2UzOGI4ZGVkMTNhOGU2ZjE3ZWZlMmI3NzUwZDllZjIwYWMxMzhlMzgxOGVhYjQ5MjM3NzRkYmUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVSb2xsQ29udmVudGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjAzOTZlOTZlODE4NmU3MTNmYmM0M2MyNjU2NDJjYzk2YWIzZWRmY2M4OThjOGRmYWYzYzFmZGZlOWEwNGRlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUm91bmRpbmdGcmVxdWVuY3lFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3NjdkOGFjOTk4MjYwZTViZjQ0N2ZjNWM3MDFhM2M4Zjc0ZTNhMDdiZDA0MDE1Y2UxZGQ2ZDcwYTg4NzUyODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVRpbWVVbml0RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTM1MGQ0NTU0OGQzNjYyYzU0MDEwNjY0YTFkYzJlM2Y0MWJmOTNhM2YwMzFmMzgxNjIwMTgzNDg5NWJjOTVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVUaW1lWm9uZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2N2UxZmFiMTEyMGE3Y2ZkNDAzODg1ZTViOWQzYTFlNDhmYzg5MzJhNzVhYWJkNGQ3YmM4MmVmMDdjOGYzYzkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aEFyaXRobWV0aWNPcGVyYXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxMmE1MDViOTA1N2RkZmFkMTRiYTI3OTRkOTRmMWM0M2IwMWExYmQyMzQyOWMyNGJjODA3NDExNzRiNjc1ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoQXZlcmFnaW5nQ2FsY3VsYXRpb25NZXRob2QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQzNDUyYzUxMDc5M2JiNjc5Y2NlMTUzZjE4M2VjNDY3NmQ0NzRiZTFiMDdhZTc5OGRjNGI5MzU1ODUwMzg4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhBdmVyYWdpbmdDYWxjdWxhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdlZWFkNGY4Y2FlNWEyNzUzMWI0YWRmNmIwZGYzMGI1NDIyYTk5YjkxNGI2NGExNzdkOWI5ODhhYzFmMjU0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhBdmVyYWdpbmdXZWlnaHRpbmdNZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2ZmZmM2FiZmI2YzJiMDEwZTBkNjdlZWNlMzBkMzJmMmNhYmQwZWMzMTdhODgxYTZlODA0ZTM0NWExY2FhNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoQ2FwYWNpdHlVbml0RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YTY3NjdjMDg5YWFkZTU3Mjc4Yjg3YWMzZTA2NDg0YzYyOGFmOGMyODJlODYxZTE4OWFjYzJlNzBjYmI2NWUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aENvbXBhcmVPcC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDc5YTAzNmViYmIzNjc2YjZmYWE5OWNlNGMxNWY5ZjQ1NzliYzBhMDBmYmYxNjMzNGRkMGY3MDg5ZjcyMDhjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aERhdGVkVmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODBkZmQ5YzA5ZGI5OWVlMDMyNmE4MWQ2MjA0YzEyNmRkMDI3ZGVlNmM0YjU1MWE0M2Q0YmFjMzEyYjE2NDU4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhGaWVsZFdpdGhNZXRhTm9uTmVnYXRpdmVRdWFudGl0eVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxMWZkMjFiMjY4YmZhZTMxZjVkNTgxZTNiZjY4ODZkY2QwMjEzZDkxYzNhZDU5YTlmNjRmY2MyNDQ0YzczNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoRmluYW5jaWFsVW5pdEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q5NDkxY2RjNWY3NjBhMDU5ZWYyZDc4ODAwOWMzOTNiYmY0MDFkNTRjMzA4YWE2ZDg2ZWU1NWQ4ZTRkNjllMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhNZWFzdXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwMTBiZjExMGRjNDQ1YjNmMGIyZjQ1OTA4ZjU1MzZiMjExOTRmYWUxN2RiZmZhNzMzZjY1NzkzYThjYTMwNWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTWVhc3VyZUJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2E4ODlhMTYzNWVmMmIxNGQ0YzIzNWI2MzdiMjU2ZmIxYTg1NjlhODYxNTIzYTYwMzQ2NThmZTU2ODhmODk0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhNZWFzdXJlU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdmNGQ2NTQ1ZmJjM2RhZWFkNjk4ZGZhMDg4ZmY0NTU4YTY0ZWY3Mzk3YzEyNGNlZTczYzc5ODc5NmRkMWQ1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFOb25OZWdhdGl2ZVF1YW50aXR5U2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJlZWE4YzAyY2ZhNTg3ZDQzYWRmMWFjMTc4ZDQyOGM2ZDgyYjdiY2RmNDY1MTFmMzcwZmQ5YzJmZmFhOWU2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhNb25leUJvdW5kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3ZTIwMzlmZGNhZTNmMDFkMDYwMjRhZGM2YmUxNGFmZTViZmUxYjFkMzRiZDA4YzIxYTNkZGY2YjhiYWExYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTW9uZXlSYW5nZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjMzZGJlMDc2NjdiMDk1NzU4NDYwMDFjYjFhMDAzYTA1ZTE2MWU5ZDkzMjQ3NzdiZTNmNGVlYzQzYjM5MmMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aE5vbk5lZ2F0aXZlUXVhbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDA1YzZjZGE5ODA0MDg4MjU5ODEwODVmNTA5ZWQxYTg5ZTJjZmIwZGJkMzFmODUyYmVjZDkxYzFlNzIyOWMzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhOb25OZWdhdGl2ZVF1YW50aXR5U2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQyMjVjYzM2YTdkNWM2ODM4ZWE3MWJlMjY1ZTg1OGE0YTk0NWFiZjc2YzM3ZTYzMTZlZTYzOTRhNWI1ZmYwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhOb25OZWdhdGl2ZVN0ZXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzU3YTE1YTViMTdiNTBlZjI4YjI4MmY0MWRlMTk5M2IyYzM3ZTRlYjU0OThiOTFiN2QxNzI5ZmI4OTlhMzA2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhOdW1iZXJCb3VuZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZmJlZTFiODZjNWFlOTA4ODcwOWY1OWViZDU2YmM5ODIyNzY2ZjViNDZhMDgxZGE5ODFkZWU2MDhlMzgxZmM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aE51bWJlclJhbmdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5ZGI2ZTExYjg1ZGVhMjczMDJiNWVmZWQzNTk1MDM2OTI5MGQ3ODc0YTkzMmMwYmFhYzAyYmJkZjgzNjRlNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoUXVhbnRpZmllckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmYwMzRlN2QwMjNkMjI4YzZlNmQ4MTlhMDc0MTQwN2IzNzM4MDcxZWYyM2RiMTgzMjM2NTBhNTkyNWVkZTU1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhRdWFudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDdmYTBhMzM5OTMwNjE5OGZjZTk4YzhhZjg1ODJkODYwYmZkNmQzYzNhOWRhYTQ1Y2YwMWM0NTU4MTYyY2FhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFF1YW50aXR5Q2hhbmdlRGlyZWN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGNlYmYxZTE1NWVmNjc5MjQ4ZjcxZjgwMDhiYjE3NTgwMGFmYjRiZTk1YmI5ZTM3MTlhNGNjMjA0YjFlMmU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFF1YW50aXR5U2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDJjMDFlMmVlMmQ4NDEzY2NmN2ZlYzkyYTEzYzA0MTliYTY5MDlhNzBkNTVlNTFiYzU0M2NmZDZhMDc0NzlhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhSb3VuZGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTdhNzY0NmNjY2E3ZDExMDMyOTU4NGY2OTdiYTBlOTViZmQ2YjVmYWFiZDdmZmY4ZmI4ODRlZTQ2YmI2ODc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFJvdW5kaW5nRGlyZWN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Zjk5NjE3OTU1NTE2YmM5YjMyOTliZTlhN2MzZTcyMzMyZDJlZjhhZTQyNGUwOTQyODQ2NGNjODRhOTJlMmY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFJvdW5kaW5nTW9kZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODZkYjQwODQxZjk3N2VjZTUzMDA2NDE4MjAxOTAzNWI0NWQ1OGEyN2M1OTYxNjMyM2I3NTMyNWQyZjg5YTM2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMDQ3ZGU0ZTFjZTlmYTQwZTNhN2M2NjdmMzdjOTgxNGYyNjVhYzJjOWE2MGEwZTJiYmEzZGFjZWYwZDM5YzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFVuaXRUeXBlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2MTYxZDM5ZTk5ZTU3ZmI0OTk1OGQ1M2UwMWRmYjE1NWQxODk1N2NiZjYwOGE4MmVjNWEwMTk1NjM3ODgyMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoV2VhdGhlclVuaXRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyOWVhM2QyOTVhZGFhMjU0MmE1ZGNlYmNiNjNlOGIwYjhjNzAzZjFmMDBjYmIxNTk0ZjljZjg2MzdmZmI5NDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Bc3NldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZTU4NjA2MGU5YjdmMThhNzFkZWFlYjc5NjhlNDRhODQ4NDY5NjA4NzE1ZjY2ZWNjMmY4NTBjOGJmMTdkZmU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQXNzZXRCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiMmQ1NTk5ZTdhODA4NDJjOTUwZjcxMDkyYTFiNWY1ODJmODM5YTIzNmNlNzk3NTI0ZmUyMmQ2ODdkNGUyZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Bc3NldENsYXNzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmUyMmU3ZTUzMjRhNzBkOTBkZTYwYzc1NzA0ZjAwYzA4ZDgwMDA4MDc2NTEyZTVhYTkxNDE4OTYxZjg4OTIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQXNzZXRJZFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ4OWJmOTE2MmY4ZmY2ZGIzMGNhNDdkY2E4MDY4M2YxYmM1Yjc1MDk4Y2RjYmRmMmQ2MjFmMmVmOGUzYTJlZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Bc3NldElkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzMzNDJhMTY0ZGI0MmY0OTA5Nzk2NDAxYTMxOGMxMzIxYzE0MjkwZWQ0ZDY4YzAwYTJkYzUyNGQ2NzEwYTRmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkFzc2V0VHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzBiOGZhZWI5N2NjYjdjZWMzNDJhMmE5YjJjZDM4NWUwMjVhZGQwM2NkYzQzMjhkYmI1OWQ5ZTZiNDVhZWYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQXNzZXRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOTRjNTU5YmQxYjU2ODBhN2UxNDcxNjQ2YThmYzMwYmRkY2Y0ZjU1MWZmMmM2YzI3NGZlNDQ0Y2RiYzJkMTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ2FzaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMGFhNjlkMzdlNTA1MDU4NGI4ZmIyOWE0MmVlZmViYzk4Yjg3YjdhZGMzY2M5NGMxYzE5NzIwOGE2ODgzMzNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ29sbGF0ZXJhbElzc3VlclR5cGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGUzNzAzM2ZhOTQwMTg3N2U1ZTBlZjYyMDA1OTUzYjBiNzc5MzQxOGQyM2FkMWViY2VkZmFkM2JlNTEwYWI4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNvbGxhdGVyYWxUYXhvbm9teS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ODMyYzA1MzM2ODFjMjA3ZWRmMzUwZTg2YWJkMzUzOWQ3MmM0MGY1ODdmYTk0ZmNhMDkzZGFhNGNkOWFhZTUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ29sbGF0ZXJhbFRheG9ub215VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGZmYjBkODJiYWExNjUwZDQyZGRlNzI4NzZlZTg3MGMxMDliYmY4YjNhZWIyOTJlNjM4ODVlNGI4YzVjNmNiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNvbW1vZGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNTNkNzc5NDFkNzEwMjkzNGY4NTIwMTcwOWIxMjE0NGNlYmYwMzhjNTQ5YjczN2FmYWFmZjdkNTNhM2IyOWQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ29tbW9kaXR5SW5mb3JtYXRpb25QdWJsaXNoZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0NDc4MjMyZjBiOGNlY2Y3NDkyMTJjYmIwMjMzMWE5OTA5YmU5ZGU2ZTczYWM0YTBiZjZkZjBiZGQyMzc0MDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Db21tb2RpdHlQcm9kdWN0RGVmaW5pdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NzFhNjYyNzYwZDdhNWRmNTRlYzYxYTBhZDNjYzk4MWQ4MjM2MjYzMzRiN2JkODc5YzY4MmVlZjg4ZTE5ZWJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ29tbW9kaXR5UmVmZXJlbmNlRnJhbWV3b3JrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmMGNmYjk3NTcxYmQ2YjRmYzE2NWNhMTY0NTE3MjI4ZWRmMGJlOTk3ZmRlZWMxMWEwYWIwNzkxNDUwNTdlYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25DcmVkaXRSaXNrRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDk0NzExNTE4YzgxNjlmZWYwYzMzZDEzZTZkODUzMzU4MGJlZmZiMDhkNzFiYjg2ZmE3ZDdjOGRkYWRiYjc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ3VycmVuY3lDb2RlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzZiZTcyYThhYjg3NGQwYjljYjA1Y2MzZmU3YzJkNTdmMTIxOTM0Yzg5MGExYmRmMzA4NmQ4ZTQ4ZmE3YmYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVidENsYXNzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmQ1ZWZmNTQyOGJhMWNmOTFmZTVmOGIyZmI2YTc0OTBkMjg0OWIzN2M0MTAzYzk3MWFkMzIyMzA0NzdjNTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVidEVjb25vbWljcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NmEwZGY5ZjUwOGNjODZjODRjNGNiNDdiOGQ2MmUzYjBhZjdkOGFiYjQxNTAwNmQzNjk2YzllZGFjYmQ4YWVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVidEludGVyZXN0RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzE3M2RiNWQyYjJjMjg1MjRhZGJjYzdhMzBlOThmZDAxZmY4ZmU5OTViYmY0YTIwN2FkYzZjN2U4YjMxNGYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVidFByaW5jaXBhbEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2YwNzhmNDcwZDYxMmYzNDJkM2Q4ZThhMWUwNjMzY2U4ZWE4NGRhNjQ0NzliYWU3N2U5MzVhNmEyZTA0OWEwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlYnRTZW5pb3JpdHlFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkMTM2NTkxNjZiODc5NjI0NzRhNmJlOTRmY2I3NDIyZWMzMjUwYmY1MGVkZDczZDdkZmY0MDAwZDAyZjhlYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25EZWJ0VHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmJhNGNmYTQ2MDI1ZGI1MDRiNDFhZDhkOGFjZjEwYjY4ZjM1YzhiNGI4YzRlODY3YWQ1Y2NkYzM5ODIwNjI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVsaXZlcnlEYXRlUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWIzOTNjNWE3ODMzMWYxYTU2ZGRkMjM2MGE0MDlmODdmM2EyMGI2ZjQ2ZTg2NGI2YjNlODgyOWZjYTBlNWZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVsaXZlcnlOZWFyYnlUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3N2M4ZDVjNjFkZTNmYTRiYWIyMjkyMGQzZDQwNzYxMWU3Y2U5YzJiOTA0MDUxYTliYTdlZjRkYmQzMjJlNDgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGlnaXRhbEFzc2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4NjllNWFmZGFhOWU2OTI4ZjFhOWY1ZDUzMWVhMjAyNWY1ZTNhN2JlMzNlZDU1OGViMDViNDFkNDViZjU5OTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25FVUVNSVJFbGlnaWJsZUNvbGxhdGVyYWxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxNTRjNmU4Zjg0MjdmMjVlOTU4NWZjZDVmZWZkOTI5NWZhMzRhNTAyOTQ1Zjc3ZDM1M2EwODk0MTA3M2I1NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25FcXVpdHlUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmY3YmExZDA3ZTRlOTY2YTljMzkxZWE2MjM2Mjk1ZjgxODUwZjYzYWQzYzBlODQ4ZDczN2FhNjAxMTVmNjUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRmllbGRXaXRoTWV0YUFzc2V0Q2xhc3NFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjYTkwNjZlOGQ1MGIzNWFhZmVjZGJjMmU4NTAwMWFlMWZmNzRjYjlkNDY1YzU4NTdkNDNmOTYzNzBhZmVjZGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25GdW5kUHJvZHVjdFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczZGExOTdlYTQ4ODE2NDA4MjhmMzE0MTJkMDVjYTI5NWVhMjA0YTgzYTRjYmNjNDhmMTZlYTM2ZDNmMmEwYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25JU09Db3VudHJ5Q29kZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjY0ZWI4NzBiYzFkYWUyZGE1NDNiZjk4NzIyMGQzM2EwNWE2YTVmMjRlYmEzNWZkMzg0NzYzOGYwMjk1ZTg5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbklTT0N1cnJlbmN5Q29kZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzg3M2FhZTEyZTQxMjI0YzI5MTRhMGVmNWEyNDYwYWM3M2ZmMjA2NmFhZjUwODNjYzM4MzBkZWU5NmUyZWExZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkluc3RydW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTM5YTkyMWQ3ZDM5ZjVlYWFjYmVkMzM0Mzc0YjJmYjJlNjJhM2MzYjdjNTY5OTM2MmI1MGU4YjY5YWQ0MDVjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkluc3RydW1lbnRCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFkNjNhMjRiZWMzM2RiMmJlMzY4ODg0OWZhM2E1MWJmNjA0ZjcxMzQ1MDUwOGNjOGYwMTQ2YWZiNTAyYmNjMzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25JbnN0cnVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2ViYjZmNTljNjVmZjdkYzQzMTJkYmMwNzg1NjYzOGEzZDFiNmE0ZTk4OGIxMDRlZDYwY2JlOTM2NWQ4MDAzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbklzc3VlclR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5ODI4N2QwZTE2YTRiZTk4MTY3NzI2Yzk3YTQwZTI0ZDU0NzkzYTBjNDRhM2QwMWU1MWYxMDU3MTA4YzUwNTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25MaXN0ZWREZXJpdmF0aXZlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1ODZiZGM0NTM0MjM5YzYwNWU3ZjVmMDRkZDhiMDgwNjJmYzhjZjc2NmIxNWY5OWJlNTAzZTI5MTFmY2ZhYWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Mb2FuLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDcyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzMThmNDE1MjQ3MDMxN2UzZjRmYzg4OGJmMzcyMzZmZGNhYTFlMmZlODA4OWUxMjE0ZmYxNTBhMjFhY2MyMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25NYXR1cml0eVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmYzc1ZWJmYzIyZDhhZjFmOTE3YTEwMzI3MjgwNTI3MTMzNWQ5ZTE0MGE2MGRiOTk2YjRkMWJjYjhiYTkzOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Nb25leU1hcmtldFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjZWNhNDViMjZhMGZiNDhlMjI5MjdjNzYyYmU5NzU0YjRkMTQzOGNhNWM0ZmY1MTEwZTc5MTc2NWQzNDY5YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25QcmljZVNvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODkzZDc3YWM5YmY2YzFlMzExNzNkOTUxOWUzNWYxMmNhZDYyNDVjYmI0Y2EzYjY1NTAwM2IwYjMxYzllZDRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uUHJvZHVjdElkVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmI0NTIwNWIwOTg2NmI2ZWE3MDg0ZjdmZGQzODExMjhiOWFlZGUwNDJmYzA3NzhiZjE3YzFmZDk3YjBmZWNmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblByb2R1Y3RJZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImU0YjA3ZmJmOTg3ZmI1MGY1NWZkOWM3NWNmZjlkNGZlMWQ5ZjJiNDIxMDU0ZGI4MjIzOWJhYjRjMTI3NWZkNGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Qcm9kdWN0VGF4b25vbXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2IxODMzYzMxMmY3ZTA1MjBmMTdkMTQwMTQyODU1N2Y5NTg3NGM5OTU2YzhkZmU4NWIyOWYyNWUxMWM0NjA2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblB1dENhbGxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2NGVhZWU4ZTVkN2MwYjlkNTUxMThjNmYxYjYyZDU1MmE2MTBiYTgzZDM5NTE2ZTJlZmYzMzk4ODI2NGU4NWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25RdWFzaUdvdmVybm1lbnRJc3N1ZXJUeXBlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0MWRlYWE0ZDZiMGNhZWFlNWZhMDVhOGYyNTY1NzBkMGRjZmRmZWQ2Njk1ZjkxYjJiNzYwYjBjOTE3ZGFjMTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25SZWdpb25hbEdvdmVybm1lbnRJc3N1ZXJUeXBlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2ZjYxMTY2NTkzMTViNDY5NjlhOWZhZjU4YTA1NmRiOTk4MmJjYTMxM2JmZTU3MTZjNmYxMmVjYTY1MTg2YzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25TZWN1cml0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNGQyOTNmNWFiMTYwZWRmNWMxZTk0YTAyNGE3ODU2NDI4NDA3ZDEwNTliZDRmMTI0MjM2NmIwYjFhYjM5NTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uU3BlY2lhbFB1cnBvc2VWZWhpY2xlSXNzdWVyVHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjcyM2I4NmE0NDQ4ZWE1MjM2OGYyMTg0ZGIzZGNhMzRhNWQ2YWY3Njc3MWE5ZWY0ZTU1OWVkYzk1ZGM4ZjdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uU3VwcmFOYXRpb25hbElzc3VlclR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3YTFiYjhhNjQxYjFhMTYxYzY0YmEwOGE4YjJlYmQ2Nzc4NmZlZTQ5YzVlZWZiNDNjOGM0ZTM1NTYzZTkxMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25UYXhvbm9teS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTJkZDUwMDUwNjQ3M2MxMmRhZjA3MDJkNmMxMDAxYzkwZjg0NWIyMTNmNmExYjk2YjVjMGE1NWFjZDJjNDNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uVGF4b25vbXlDbGFzc2lmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNjhiNDI3MGFiMjQxYmE4OGMzNzI1NjM2MTI2OWIwNWU1NzIzNzU4YmNhOGUxODM4YmQxNGIwYjAyYTE3MTAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uVGF4b25vbXlTb3VyY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVjZTY1M2ZhYmE3YzYyZmFkZDBmMTJiN2YxYzA1MDUyOTBkOTQ0YzJlNGQwMzliY2ViNzNmOWUwNWQ0MjA4ODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25UYXhvbm9teVZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyMTc4ODUyOTU3MzgzYWU5YzA4MGFjZDQ2ZDAzYzUwMjU5OWQ2NWM5YzZkYjJlN2Q1NzNhNWNmMzljNWM5NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25VS0VNSVJFbGlnaWJsZUNvbGxhdGVyYWxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5MWUzMmQ3Nzc2YzE3ZjQ0N2ZmMzY0ZTQyZDczNzE3MjZlNjhiNmZiMjlmMmUzN2RkOGQ2OWFmZjUyMjRhODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25VU0NGVENQUkVsaWdpYmxlQ29sbGF0ZXJhbEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM2Y2EyNTBhZmNlMzYzOTk0YWIwNjUyNjdhZmIyNTcxMDc5YzlkOTEwYTc1ZmQ1Yjg0NTA1YzJhNmZiNmY5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENyZWRpdE5vdERvbWVzdGljQ3VycmVuY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTk5M2E0ZDRhMzVmYjg5ZmNmYmQwMDJiNDZiMDU4OTlkMjAyZDAzNzFjZjBmNDFjZWU5OTA5M2YwY2Q5ZjFmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENyZWRpdE9ibGlnYXRpb25DYXRlZ29yeUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGU1YWU0NWIzYWIwOTE0N2E3OTdlZDVlZDIyYmI0ZDA5MDA1NTQ4NDBkNDE0MmNmNGIwNzg1OTgxZDdlMWVlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENyZWRpdE9ibGlnYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlNzlhYzM1ZmQ4MjVlMzA1NmYyYTEzMjEwNTQ5MmE5M2I2YzMwMzEzZWM4ZTg2ZjEzMjNhMjc2N2RlNGY1OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDcmVkaXRTcGVjaWZpZWRDdXJyZW5jeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMjkwOWVkZTJhOWQ4N2ZlNWY5ODMxZmFmZWM5NGE2MGE4ZDgyNjc0MzBjNWY1ODEyZTZlYzlmMWExOTRjYzQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0UmF0ZXNGaWVsZFdpdGhNZXRhRmxvYXRpbmdSYXRlSW5kZXhFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzOTgxMmE4OTE5MGI5M2UwNjE5MTVkYWM3MjljZjQwYzBlOWUwNDA5OTVmYjFlYjgzMzNhZDg3YTk1NTk2MDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRSYXRlc0ZpZWxkV2l0aE1ldGFJbmZsYXRpb25SYXRlSW5kZXhFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImVmMzc5MmUwMDM1ZjEzMTlkMDIzZjE2ZGE1ODJlY2UxYWUzMTlkNzAwMTE0MjJlM2U0NmU4ZjUyOWNjYTNiYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRSYXRlc0Zsb2F0aW5nUmF0ZUluZGV4RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTE1MDMzZGRhMzg2ODY1NTI0NDFlZWQzMjdiM2IwMmUyOWVmNzdjNjBjNDg1MjJiMDA2ZjZjMjBjZTZmMTRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0UmF0ZXNJbmZsYXRpb25SYXRlSW5kZXhFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwZmRkYjZjOWI2ZDQ3ZDFlNzcyOGI1ODZlZTY5MzE3MjQ3ZDg0YTVjMDkxM2UyZjVkZmQ0NjRlYjk2MzIxZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhSWRlbnRpZmllckFzc2lnbmVkSWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OTg1M2Y4ODRhZDk0MTUxYTBiNTVkNmZiZTZjNGU2ZTAxN2ZhMDY4ZGExMzE4NmQ0YjA3OTk0YWI4ODRmMWZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJDb21tb2RpdHlMb2NhdGlvbklkZW50aWZpZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NGQ0NzY3MmJkMDM0ZGZmYjMyMjZiY2E5ZWNlNmIyYjNlM2I4OWNhNjUwYjMwYTljYWY3MGY4YmYzZjk5NDAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJGaWVsZFdpdGhNZXRhSWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDlkYjIwMTcxMzFhNDRhNzVjZGNmNDlkYWU3ODEwYWE2MzBkZTU1NjNmNTliMDlmYzJkODMyOTMwOGY5MzczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJJZGVudGlmaWVkTGlzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDAxMjM5Njc5NGRkOTk2MDY3NzdhZmVmODdhN2ZmZWNjZDc1N2QzYzE1OWJhMDM2OWIzNTc1M2VmNzI3ZDk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJJZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImViNTZlNGY2NzRkMDc5MmZjZDQwNjhmMTU5MWYyNGQ5NTc1ZTc4ZTBlMjY2ZDAyYTAzYjEyMjc4ZmU4NWYxODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhSWRlbnRpZmllckxvY2F0aW9uSWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OGY5OWFlOTI5YjFlZGNkOTEyM2Q5N2E4NDQ5MjI0NWVhNjg3YTAwNzg2OTVlMmVmMGE5MTM0NTc0NmFiMDQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJUcmFkZUlkZW50aWZpZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhN2E3YWRhYmE5Y2NiYWEyNDJiMDM4NTNhZjRkYzQzNjZjZWE0ZDNjNWNkYmFmZTEyZTk1OTU0YTVlYzVhYzRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QWNjb3VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZTdkODE1NWEwYjc1ZWFlNWJlY2VkNDViZDFmMThhYmM5NGYxNDQxNzRmYTM0YmM4YTdhNzRjYmIxMWE5ZGRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QWNjb3VudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2MDEwNTY5N2ZhNzY2Mjg3MjBmZTRmMmExNWU0ZjZjNGNiM2ZiNWIxNjNmYzczYjhmZTVlOTMxN2M1YjdkZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlBZGRyZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyNzlhMTBmNjA1MTE5NDAwZjRiMjZlNTcwYjI4MTdmNmQyMzJkMDllOThlYTljMjViYjVlNmQ5NTVkNDk1ODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlBbmNpbGxhcnlFbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTgxMDhhNTYzMjU4NzU4OGNlYWEwZmNkMTE0ZmZkYWM1ZGI1MTQxYmYzNzAyMzMzZTE5NzM2YTAyMzRiNGNlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUFuY2lsbGFyeVBhcnR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhNGRhYWI3YmM2YzU0M2Y4NWEzNDdjZmY2MDE4OTdhNWI5Yjc2Zjc2MWViNjRjZWYyNjQzZDFlNjNmNmUwMWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlBbmNpbGxhcnlSb2xlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzc3YWYwYzYxYWM5Y2VkZDRiNjI1YWJkMDAwZTZmMDk4NjBhN2NlNWE3ZGY3MzNiMTM4ZWRmZjA2ZTYyNzRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QnVzaW5lc3NVbml0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiYjNhM2ViNmYyMzFmNzYwZjNhYWZmMmNlZTlmN2Y3NGMwYjVmMDk5YjQxYjQ2NGQ3ZTEzNTk1ZTg5NzkyYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlCdXllclNlbGxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMmNlOGFhMjI1NDcxMWZmZjllNTA4Mjc1ZjE2YjJlZWJkMTU4NmY0OWZkODA3MGQ2NTE3OTRlYThmODQ2ZjIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5Q29udGFjdEluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkZGE4OTU5OGEyN2FkN2I4MTk4ZTc5MjQ3MWQzYzBiZGU2Yjg1ZDgwYzFmNTlkZGJjN2VhYTE0MTg2YjQzY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlDb3VudGVycGFydHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmNlYjJhN2YyNDkyZGI5YmNlZjA2YTBlZjY5ZGQ3ZmQwMGVkNDc1ZjZmMTA4M2U4NGVkZDE1Njk1N2QwZTc5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUNvdW50ZXJwYXJ0eVJvbGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1NWM4OTI5MjMzYTE3OTI4MGEyN2NmNTU4YjlkNGQwNDAwN2RhYmNiNzVmM2RkMGZhYWRiY2MyYmFjN2VhZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlFbnRpdHlUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MWMyZTMxYTYzYWQwM2JhYjUwNmRhYjI3MTM0YzcyNmU3MTdjYzc1YjQ4MWNmYjBiYmY3OWEzNDczNWFhZDRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5RmllbGRXaXRoTWV0YUFjY291bnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDk3MWIwM2ZlZGZhZDZhZmQzYmI4ZTdhMTY2NWZmOTdhOTI4ZjNhOGQ4MDg5NjI4NWNiMjgwNTc0NzI3NzQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5RmllbGRXaXRoTWV0YUVudGl0eVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUyNjk2N2ZkNjBiYzY2OThhMWNiMWExODAyYjY3ZTMzYWYyM2RlMzg3Y2FjMGY3ZTM5NDU2MDg4YzMwZDg3MDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlGaWVsZFdpdGhNZXRhTmF0dXJhbFBlcnNvblJvbGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRmZmJlMThiMGJlNmQwZjJjM2U1YTBlZDA2MGViZmNiNDhjZmU0ZmJiMGYxMDQwZGUxZDhlNzVlMGNhYWFmMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlGaWVsZFdpdGhNZXRhUGVyc29uSWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmZlODc4ZjM2NjFhODY3MDRiYjFkMGI1M2VjOGM4OWU0ODI0MDQ2MjhjOGVlODIxMGQzNzExNjVkZmZhMGMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5TGVnYWxFbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNmNWY4ZjE2MDQ4ZWNiZWFiNWI4ODBiMGU2ZjFkMjk3YTk1Y2EzZTVkZmRjYTMxNGMzZTY5YjNmOTMyMTQ3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUFjY291bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGI1Zjk1M2FmNWYzODQwNjlhZjM5YWYyZmNjNjM4YWUyZDc0ZTE0YzU2YjRiNDY0ZDUyMGE2ZDdmNDdiMDY5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUxlZ2FsRW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkNzA0Mjg1MTA3NGZjOWE4Mjk1ZTcxZWUzYmRhM2MxOGZmNjEzNmI2MDQ2ZDA3MDEyMGZlNDRmMzE0MzMyMzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFOYXR1cmFsUGVyc29uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzZDY5YzRiN2ViYzc0NDUzOWJmMThiMmY0ZGU1NGIzY2UyNzE4MTNmZGJiZjBhOGE4MDMzYTllODA1YTU1YzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQYXJ0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjg2MDA4ZjI5YmM4NmQ0NzA0MzliZmU1NTllZWFjNWQzZWNhMzRhZmQ1YmZkMzkwMzUyNThiYmRmNDE5ZDc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5TmF0dXJhbFBlcnNvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDViMjA1M2Y5ZmM1OWZkNDU2YTFhZjM5YTI3ZGE4Y2Q4YTJkMTdmMTdmM2VlNjhmM2YzN2ZkNmQ5ZDdhNzdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5TmF0dXJhbFBlcnNvblJvbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFiZjNlN2I5YWNiOGNkNDdiZGRjM2ExMGVjNGU0MzgyMGY4NDE3YzIwYjY5OTQ3YWNjM2UxYzkzZTVmYmQ5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eU5hdHVyYWxQZXJzb25Sb2xlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDRkMDUxYTEyZDM3MTQ5NGNlZmM3MjhmMTRmYWUzZDQ5ZTgzNWQzYjMyYzc4OGE2NDNkMWFiMjVmZmU3NTMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UGFydHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE0MGRkNDM3MjZlMDYzYzg5Mjk0M2E4YTg2N2Y3NDVjNDM5MmRlYzJiOTM3NTY3MzhiNGI3NDU5MTdkNTVlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBhcnR5Q29udGFjdEluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmMzAxNzVjNmJiZjkxNjI0NTlkOTZlYTkxODJmMTNiODliZjZlOTM5YmY1NjZkYzQxYzc5MmYyOTU0YjYyY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQYXJ0eUlkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWRiZDY2Yjc0MzM2MGJjNzM0ODljZmI2ZWRmZTc2ZmRmMjAzZmU3MTNhODFjMGUxY2ZkMmI0YjVkMzM1MjYyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBhcnR5SWRlbnRpZmllclR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiYzExMmI0YTEyNzI2MDc5Y2ViZTE1ZjBmYjczMmMzZDgyNzJjNDFjMmZmYTlmOTM2NjM2NjdiYjc4M2QxNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQYXJ0eVJlZmVyZW5jZVBheWVyUmVjZWl2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjVhZjBhZWI1MTliYWY4OGZiODZjZjhhYzU0YmMwMGEzMTViOTdkMjhiMWRmY2M0ZWJiOWRlNmFkMzc2N2NjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBhcnR5Um9sZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2JiMTMxZGY5ZDQyOWUwMDdkMWVjZjMwMzdlZTc0MzIxZGQ0Yjk5ZTE0NmZiYWI3ZDBhYmMwY2ZhYjMxNjRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UGFydHlSb2xlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODU1NDZlZTFlMzI2M2YzYzBiNjI0NzYzMDI1M2E2YWRiYmZlM2I1ZjIwNjY5N2FiNjY1MTFhNTM2MzFlMGFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UGF5ZXJSZWNlaXZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2YwZGViMjU4ZDIxNjM5YzlkMzY0ZjQ5NDA5MzYzN2I2NzFmZjAzZTI5MWI1MGE1MzllZTAyOTQ1NjU1MTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UGF5ZXJSZWNlaXZlckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWMwMjdhYzM4OGU5NGE1MzE5MTBlODc0M2ExMWNjNTAyMGUxMDE5MzNkMjhlMjZlY2RjY2UwZDcyYmYwNzU0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBlcnNvbklkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2ZkNzJmOTUzMDQ1YTdkYTBkOGRkM2E2ZTUyNjk3ZjU4MThhNGQ0OWQyODRiYTNlYzIwNjZmYTRhZWJkMWYyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBlcnNvbklkZW50aWZpZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTBlYmEwYTc4OGM3NjRkYTY1ZmZlODNkMjdhMWVhZGJhYzhmZGE4ZGJiYTkwMzkwMjg4NWNkZTVlMjkxYmMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UmVmZXJlbmNlQmFuay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYzZkNjY3YWFmMTE0NzZjZWE1MmY4NTkyNjEyNTEzZTM4ODk5MjJhYWQ3ZDRjMTMzZjY1YTBhYWExNDBiN2QwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UmVmZXJlbmNlQmFua3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjIyNGQyMjg0YjFmM2MwOWFiZjg1MjFmNjJjNzk3MzViMTE1YTQ1YTc3ODE2OTk3MWMxYTU4ZjYxYzM2MzllOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVJlbGF0ZWRQYXJ0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNWQyZTJmNTQ3MmY1MGZhNDUyM2NkNjRiMGEzNjU2ZDBkM2M4NzA1YjJhZWNhMTUyMjdiNzY2NjA1N2E4YmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5VGVsZXBob25lTnVtYmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmNmZlZDZkMzZkYmRjOTBjYjYxMWMxZjBhYTI4ZDliZDg0OTU1MjZiOTJjOGY2MTYwMmJiMWI4ZjhmYTQwMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlUZWxlcGhvbmVUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODc0M2IzMTU5MjkyYzQwNzk3N2ZjMjQ2ZTcxZDMyNjhlMTNmMTlkOGM0N2I5YmU4Y2ViNjUwM2RlMDU5MmFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkFjdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNkNDAyOGIwYjMyNTUwN2Y2M2NlMWUwMTQxYzc4MWI4YzdiNTVjY2VmODk1NTNlMTQyOWU1NTg3ODUzMjRhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25BZmZpcm1hdGlvblN0YXR1c0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGUzNTlhYjZhNjY0NzJhNjRiOGY4YTcwYzFlMDJlM2NkOTM0OTg4MTgwNjM5YTY0YTYwOTYyMTgwMWJhMTZhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25Bc3NldFRyYW5zZmVyVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjk0MGZiNzMxMjE3NzdjZWU1NWYzNGFlZmNjM2ViNWYxZmZhMmQ4ZGEwNDYxZjFmYjRhNjI2YjZhMDZhMjYzMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25CaWxsaW5nSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGYzN2U1MGVhZGZiOWQxZjJkMjI4MjkzNjMzM2RjMTNmYjI5ZDY4ZjEwNjY3NTRmYzAzY2UzNDJjODdiNTdkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25CaWxsaW5nUmVjb3JkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU0MywKICAgICAgICAgICAgICAic2hhMjU2IjogImM1MTE3YTRjMTM1OWQyMmRkZTViYjcwZTYyZjYwZGNhNmQ0MzkzNWEyZjcyZDU2MTRjZDUxM2M0MGRlZmQxYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQmlsbGluZ1JlY29yZEluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5ZWZjYzAyMTkzYzM3YzY3MzE2NWNkMzQ2ODcwYjc2NjdlYTcxN2JjM2FhZDI0OGFhYTMyYTQ2M2Q3MjJlZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQmlsbGluZ1N1bW1hcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTE2MTMxYzY1NGFmMWQ2ZGVkOTY3NDJiNmU1NGM2NDMwNDQzNzZlMjM2ZjgxZGExNmY4MjRlYzVjMWYwMWU0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25CaWxsaW5nU3VtbWFyeUluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiNmQ5MTYyYzNjMGRkOGVkMWI2NjNkZjM4Mzc0OTg2NmMzYTYyZDI5ODcwYjdlOTQwYTJkMjZhNWE0NzFhNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQnVzaW5lc3NFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YTJkMGU3MDczYjMxOGM1MjE5YTM2OTk1ZTljZDA1NjQ5NDQ2MTg3YzE5YzFiZDMwNmE3NTJkNDAxNTQ1ZDI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNhbGN1bGF0ZVRyYW5zZmVySW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjgzZDFkYTFmOWFmNGNjNTM4NGI0ZDBmZGM5NzJkZDlhNmZhYTUxZWI3MjFjYjc2NTJjMGUyMzhlZDVhNmJlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25DYWxsVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI1MGFkNDYyMGI3ZDc1Njk5NmUxZDJhMWIzMDE5YjUyYjFjYTQ5ZmI2MzA0Y2FkNTdhNzJhMmEzZmIxM2E2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25DbGVhcmluZ0luc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2ODUwMjU5ZmY3MjU3MDg4ZmZlNDJmYmRlZjlkNmJkYmRkNzg2ODc2YmI0ZWZjNDNkZmQ2Mjk3MzNkY2I0NGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29sbGF0ZXJhbEJhbGFuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmMyZmQ2NzAyMDk3YjA3ZWFmN2I4NmRhNjNhOWYyMDA1NGNlYzY5Nzk1ZmQ4MTY3N2YyOTAzNTQ3NDZlZTU5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25Db2xsYXRlcmFsUG9ydGZvbGlvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjMDlkZjdiYTczMGQyYjEwMWU2OTYwYjkzZTJlODMwYzM1YWRlZWViNmY2ZTM4MWJmNTcxY2Y4NjBkNTFhYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29sbGF0ZXJhbFBvc2l0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4OTA1YTJhNTc5Yjk2OTkzMzFkNDQ2NjliYjUzMzdkMGE3YTZkNDNjZTM1NjEzMDQ5YTQ1ZWFkMzlmZjk4ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29sbGF0ZXJhbFN0YXR1c0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmExOTA4Njk5ZTZiNWIyM2Y2YzdmNTkxMDE0YmVmNjQ1NzMyZDA4NDFlNWNkMzdkNjhiNDdlMGJiZTQyYWFiYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25Db25maXJtYXRpb25TdGF0dXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk3OTJiNWQxZDM2MjhlN2RjYjM0ZDhjMjY5MDk2MGM3YzEwY2Y1MWZhZTY2MjE2NzJlZDAxNTE5YWE2MmIzYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29udHJhY3REZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxOWExMGQzMmJiODY1YmFmOWQ3MTRiOGY0MzZhYzI5ZjMyODllMzNiZDRkNjcxNzRmOGQ2YmE3YTFlOWRhZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29udHJhY3RGb3JtYXRpb25JbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3M2YzZmQ3YzUxZDczMTkwZGJmNTE3NTRlN2IwYmY4NjM4ZmI0M2ZmNGI4YmZmYjNlNDYxMWI4MjEwMzhlZDVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvcnBvcmF0ZUFjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMWM3ODc2Y2ZjNDAxYmJmN2M1NjE3YjI5MWI4NmU4YzlkYmIyZDE1NWYwYTlkYjIyNzNkMjQ2NmQ2NmRhYzE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvcnBvcmF0ZUFjdGlvblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwNTgzNGI2Mzc4ZDJhOGUwOTc3OWZmZTg3MmY4NDkzZGE0ZTBlOWJmMDJiMWI0OTNkYzdlODU4YTc3ZjQwYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ291bnRlcnBhcnR5UG9zaXRpb25CdXNpbmVzc0V2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiYTc3MTQ5N2EyMGRlMmRlNDU4MWEyOGUxODk0OTE1YzRlZDkyY2NmYTgyZmVmMWFlMGE2YjdkNjE4YmZkMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ291bnRlcnBhcnR5UG9zaXRpb25TdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTE5ZjE1ZTBiMzk3OTUyOGUwNTIzMjgwODg0YWE4N2RlZTg2OWE4Yjc4YTZlNjE2YTcwOTY5OTg1MjI3OTBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNyZWRpdEV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlYTY1ODQ5YzkxYWEwNGQyZDAyY2ZkN2NhMDJiYzZkZTM4ZGMzZDhiOTk0MWU5MTM5MzdlNzUzYjA1NDE0ODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ3JlZGl0RXZlbnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYWYxYWU1NWJhZmY4ZWY1NTE5Y2EzMjkxYTE1YmQzOTY4NDQ2NTc4ZTU0Mzk4NDllY2RhNzY1ZTVhMDA2NGZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkV2ZW50SW50ZW50RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYmFjMTlhYjJkZjk3MDI4MWY4OTk4ZTRkMjdiY2JlNDM1YzdlMDJjMTc0M2U1ODA0MzhkNzUwOWY0ZGMzMTk0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkV4ZWN1dGlvbkRldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2RlMDc0MzRiNjVmYWVmMjQ5MWRkYmE5MWViOTE3NWU3NGQ3MzAxY2ExNmJlYTc1MGMxNjcyMjg1ZTViZWNjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25FeGVjdXRpb25JbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTQxNTY5NGRiMWZjOTY5OWMwNzgzMzRiYTE4Y2ZlZTI0NTcyMzJhMjYzZjJiMzkwMTRlZDQ0ODAxYTFiYjQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkV4ZWN1dGlvblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlNzI5M2M1NWM0MWMyN2FlYjU1OWFlZDllNGMzMmJkM2U0MDdlMzlhMDU3ZDM0NzRmNDY1YTYyNzI1YmI4NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uRXhlcmNpc2VFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2ZhN2FhM2FmNmU2ZDk1ZjhkODQwMzVmYjJkYTBiMmRmNDZjNmMxZWY4NGIxZGM2OTExZjQzNmE4MTkyY2VjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkV4ZXJjaXNlSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmZlYjE0OWYwNzJjMDUyMzVmMTM2YTk2YjJjMmY3MzdkMjkxMjkxMzAwMGNmODZmMjg4MDEyY2MyZWMzMjZiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25FeHBvc3VyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMTMyYzBjZWFkYjk2MTZhZjVmNGM5OTljZThjODdmYjU1NTc5N2ZlMDBlOWJmNWNhZDdlMzljNWRjMzU1ZDQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkhhaXJjdXRJbmRpY2F0b3JFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0OTI2ZGI0MTJjYWE1MTVlMzkxODdiYmMyMjg4MDc1Nzk2ZTcyN2ZmMWRmYzI1YTg4MWI4M2NiMzBjMjEwOTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uSW5kZXhUcmFuc2l0aW9uSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTEwMzEzZTJlMjEwYWI4NWFiNjA3MDJhMWQ0YjYyYzM5OGRjYWE5ZGYxNGE2MzY4MThmY2RmMDkwYWEyNzdmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25JbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZmQ1Nzc1MWVhZjg2YzEyYzMyMWYxNjM0NmU3YzkyZGMxNTdmM2M1MmZmYjgxMWM1MTMwNDhjNjU2MDBlZWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkluc3RydWN0aW9uRnVuY3Rpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2MzE3OTIwNTVjOTZhNjg4Zjg1NWQxZGY5NTVjN2UyYjg0OTkwYTkxZGUwMTMwZTVkN2MwYzY2MDYxYmRjMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTGluZWFnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Y2Q2N2M1ODI1NjVmNmM5ZDQ5NWZjZWI1N2QxNDRkOGYzYzgyNzM1NzhlYjYwYTRkZDc1MTA5YzYzNGYzZjU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1hcmdpbkNhbGxBY3Rpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5ZTg1YWVjNGNiZmExZGYzYTFiNjY1N2MzMmZiOGYyY2E0ZDJhMzUxMWVhZDAxM2M2N2MzZjMyMTJlNTE5N2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbEJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2NlNDdjNmU5ODk0ZTNhZjJjNGM5ODNhNmEzM2NhNTQyYWRhNTU0MzY0NjNhM2EwYTM4NWMzNzAzY2M1NTRlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25NYXJnaW5DYWxsRXhwb3N1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTU2NWNhNTE0MGZjNDU4NWNjYTE2ODU0NmY1Y2U4NWMzMmE5NDEwODI1YWJlMDNkMjQwNjA5NjkwNGUwMWQyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25NYXJnaW5DYWxsSW5zdHJ1Y3Rpb25UeXBlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3ZmRhNmFlZDZjODIxNDUyMGY0YTYwOTEyNjQyZDc4MmVmZmQ5MDBkNDRlN2YyZjY0MWJjNjg0N2Q0MTQ1ODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbElzc3VhbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImYzODM4OGE0ZTFmZjA4NDg4NDM2ODQzMjJkNWU3NTkyZDBiNDgzZjZlOTYyNTlkYTVmOTdhYmFmNWE0ZWJhYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbFJlc3BvbnNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViMGY2MThkNzlhOWJiYzM2ZTczM2ZlYThiNTg4ZDhkMWJjNzA5MzJmZDM4OWJjYmE2NWYyYmZkZDNjNDZhN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbFJlc3BvbnNlQWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhZWNjMzhlOTQ0ODUzZmYxNzRiYWZiMmE2MjkyMmQ3ODcxMzNmYTA2MGI5MTk2MDg5ZDFlYTc1NDQyZDM0OTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbFJlc3BvbnNlVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzhhZWE3MzYzYjVmNjczYjkwODA1MGM0YTQxYzZlNjUxNTA5OTNjMDM3ODhmOWFiMTQ5ZmM2OWY3MjA2NTU1ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25NZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDb2xsYXRlcmFsUG9ydGZvbGlvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkYmVjYTlhNTA1NGJmOTMzNjQ1YzMwNGQ3YzRkMmE3MmU3OWE3Yjc2MjQ4OWJiODRlNjQzYjJjNDBhMjNiMWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ29udHJhY3REZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjZmRkNjY2ZTUwNWZkODk3Y2RjOTI5OGJmZTllN2RjNzI3N2FlM2YyMjE3MGUwZjE2ODE2ODBiOWQ4MWI4MjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhRXhlY3V0aW9uRGV0YWlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NmY3ZjkwYmRlMjIyOThkNjNiZjUyYTg4MzgyZjU4MjBjNTJlNjI4ZDQwYTViMDljOTliNjRkMjA3MjBjNjI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVRyYWRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzMjdhZWNkMjMzZjIzOTQ4MzZjMzU5MjQzMWUyZjUwOTA3Yjc1MjYzYjAwNDBhOGQ1NjZlMjIzMWI0MWQzNWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhVHJhZGVTdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzBlMjljMDkyZmFjMDNlNzI4NTlkZTFmYjljYTg5ZGUwNzhlMTQ3Mjg4MWMwNDEwMWQ2YzhlYmViNjNmMTE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk9ic2VydmF0aW9uRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODhhNDVhMzU3NjhhMjYyY2RmYjg5NDhhNjIwOTA3MDc5YjhiNzZlM2M1MDFmMGNjNDg2ZjhkY2MzMDVjZjZhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25PYnNlcnZhdGlvbkluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljZjk0NTk0NDNiZmZmMGQ3NDNiNThlOTkwMjI2Mzk1MWM3ODg4ODJjMTZjMTU5NTQyMGE3OGU0ZjhhNzY5MzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUGFydHlDaGFuZ2VJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTUzNTVlYmRiOTI4ZjM3NTg2NGJlMGVkYWVkYWI3MDY0MmNiMTQ4ZDk3OWY4MDdjMDk0ZDllZTdkNjA3ZmNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblBlcmZvcm1hbmNlVHJhbnNmZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Mzk4Nzg5MTIzZThlNjg2OWY4OWQxNDdmM2JhMDc1Njc4NDc5NGE3OGE5MzM0YjZlM2Y3MzZmZmUwY2U0NTZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblBvc2l0aW9uRXZlbnRJbnRlbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2MGQxNTY3NGRmYzJkOTUyNDI4MWZlMzc2ZDE5Yjc2MzU5NzZhYjYyYzAxNGY3OGRkYWJhN2MxMGI5OTRhNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUG9zaXRpb25JZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlNGJhMzI5MjgyZTdjOWM0Y2UwN2IyMzNmMjI4MzgwNGM2YjY2OTg5Mjk2YmY1ZjcwYTZkZDk1Zjk3MGQ4MDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUHJpY2VUaW1pbmdFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkNjExY2NjZDk2NTU1MjFiZDdkMzEzMGQ3NzYyZGRiN2NhZTJiNTRjZDA4YmEwMjc4NzEwODdmZDU2Y2E2MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUHJpbWl0aXZlSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWNmNmUwY2MyNTM0NDc0Mjg3NTgyYTcyODExMWY4OTcwOTU1OWQxNDAyNWIxOGVhZjVkYzU0YzhjYTBkZjdmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25RdWFudGl0eUNoYW5nZUluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxYmY4NDdmY2RjOTg1MTNlZTRjNzNhMmRhOTVmOTQ4YTZkMGY4MTlmYTk3YWFhNDlhZTExNjhjODJjN2IwODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUmVjb3JkQW1vdW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmM3NDc2Y2JhZTdhZTNkYjA5YmQyZjRjZmViYTliYWEwZWQ3YjBkZjRmNjRiYmRhN2ExMTA5YWQxNzE2OTIzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25SZWdJTVJvbGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyN2M3YzgxNGRlYTNiYzdmZWQ5MzFhYmI4MWZhNDUzNjEwNzk3OTdiOTg3YWYyYWFlZTZmNDVhNjNjZjY3ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUmVnTWFyZ2luVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWY0MWVkNTdiOTFjZTVmN2I2YzJiN2VhZTJkMzczODRjOTFmMjQyMGM3YWM5MGIyYWRkMWQ2MmRjNDVkNjJkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25SZXNldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNGE3ZGQxM2Y1NGE0ZmU4NGMwMGNmNDI1MzgzNzExYTU1YmYyM2ExMjNiMjdiODU3Yjc2NDUxMWZlYzdmOGU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblJlc2V0SW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDcyN2YwMmY2MmZkOWJiNzdhZjU1NTQ0YThmNTljZTNjMTY4NDYxOWFlMTI0OTE2NzA0MmVmNTQ5NzkwOThlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25SZXR1cm5JbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzc4YjBkMmY0MDdjNWQ5ZDIxNDMxMGExOTVmNjVlZTllMDY2OGE2MGM2MTRjNGFlN2VlZjUyYmUwMzQ5NGFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblNjaGVkdWxlZFRyYW5zZmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0ODNiMTMzNDEzNjU2MDE3ZWFiODE1NTNhODg5NTA0N2M1Y2UxNjVjMmJhOWE3YWE0ZjI5NDdmOWVkNDM0NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uU2VjdXJpdHlMZW5kaW5nSW52b2ljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NzFiNWNiMjEwMjBiZDI2YWJmY2MzZTM4OWMwNDQwNzE2NmRiZjU2MmMzZDBlODE2ZjJlODYzZTE3MzRhNDk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblNwbGl0SW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmE0ZGQ5Y2Q5M2M3MzI4N2Q1OGUzY2ZlM2MxN2YyNjNhMWNiNzNhNmRjZWI3NzJmMzMyMjY5OTNiMTZhNDA0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25TdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDk1MGY3OTY5N2ZkMjA5MjM0MzVlYzVhNmQ5Mjk2OTlhNzVkNDQzMTgxMmE3ZDU3NmM5OTQ4YzBkMDlkNjMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblN0b2NrU3BsaXRJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWFlNWEwZjJjOWMxNGY3NTlmZGQyY2U5YjUyNDBhZTQ4MjFkYzYxMjM3MTIyZTFkYmNmZjBkOWE3OTFhM2M0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRlcm1zQ2hhbmdlSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE1YWIzNjdiZmQzM2UyMzgwYTc4OGI2MjU5YWJhMjdhOWY4YWU4YWE1YjQ5ZDMxMDQ1YzQ0OTcyNDAwZmRhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFkZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzEzZTJlYTE2ZGUwZmMyNTUyNzNkMDE4MjJjYzFmOTQ0ZDMzNjgwODY1MTcyYTU3NGFjZTcxOGVhZmYxOGNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRyYWRlSWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTMwNTg3NDRmZGJmYmRkYjVmNDI0ZTM0NzcyZjhjZWRkZDg4YzkwNTJmOWYxMWZiNmJjZjYwYTE5YjQ2NjhiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRyYWRlUHJpY2luZ1JlcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWI3NWZlOTYwMmIyNDJlOWI4Y2VkNmIxYjRjYjI4NzM4YjhjMGJjZmEzNGEzMzA4MDNhNmUwNzIzZjFjMWVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRyYWRlU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmFkNGIxNTRiZjAwOGQzMTc0MDliODI3ZTRjYzIxM2JlZjNlYzA4ZGRkZjQxNjMxMDRlYjMzZjJkOWUxNjhmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFuc2Zlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjODc0ODg2ODA2NGFiZGZmNWY5ZjcyYzEzM2M4YmExMzBkMzczMWJhMzRmNDBlMDVkMjhmM2FjNzhhMzIwZmJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRyYW5zZmVyRXhwcmVzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2EzMDVhOTQ4YmI2NDAwZTZiZTRmZjlhYjAxNWQzY2I1NzQyY2Y3YmIwZGJlOTBhZmRiNzgzNjRmYjExMDEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRyYW5zZmVySW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWQ5NzQ4YWZlYmZkM2E5MDU1YjQyNGFjNmUxYmY2NzAzNzAxOTJkZmQ4ZTRlZGY4MTA0NjBhNjQyZTEwNjllNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFuc2ZlclN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwYTk1ZTg3MDY1NzU3NzI3NDNhZWIxYjVjMjViZGVjMTE4ODk4NTNlYjdlMDFjNmJhODVjNTExYzI4ZDQ2ZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVHJhbnNmZXJTdGF0dXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3ZjFkN2ZhODUxOTMzZTQ3YTBmNTZmNWIzZjEwZDBhOTc1NjE0NzYxMWIxMzU4NjM5M2IyYmMxMjRmNTU1MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVmFsdWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhNDQ1OTQyMjkxNzJhZDVhOTRiMTBhZWM0YzMxZDk3MGY2Mjc5NTE3ZDlmYzcwNzVkZDE0Zjc5YWEzMGNhODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVmFsdWF0aW9uSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQ0NThjMjIzY2E1MzRkNGI1N2NkZTFlODI2MGM3NGQ4ZTc0OWJiNDU3NzkwMThmMTk3OTFmZjZlNzI3ZWI5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25WYWx1YXRpb25Tb3VyY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhMDNkZjYxZjQ1Yzc0ODJjNGJlMjcwNjU5MWY1MDhlODk4MzJiMDViOWQ3ZTg1ZTE3NzYzM2FmOWViZjQ1ZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVmFsdWF0aW9uVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGYwYjIwNTFhODdmMjEzNzQxY2VkMDEwMjY4MDkzNjdmNTI3MDg2N2RmYjJlNDM5OGMzM2E3MTZkNzBjY2Y5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvbkFnZ3JlZ2F0aW9uUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOGZkZDgwMDgyNDhjMDcwYWZkNjIyNTg5ZWI3MzJkNjVkNjNkZjFmZDU3NDU4ODBhMDljMDc2ZmFlNGJjZjdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uQXZhaWxhYmxlSW52ZW50b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImFlYjU5NjE1MzNkMzA0Zjc2YzIzODYxZTQ3OTBkZWZiMGQ5Njk3ZDU3YjczYzAzNDlmMjk3NjdjZmViOTliNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25BdmFpbGFibGVJbnZlbnRvcnlSZWNvcmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDRiMGI1ZmEzZTMzMjI1NzFjZTQyZDk1YTA1ZjE5ODEwM2RiNmQ4Njc0NDMxNDU0NjYyMGFjNWFmOTJjODQ2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvbkF2YWlsYWJsZUludmVudG9yeVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1MDU2Yjc0N2MyNDZiMmY3MjMxZGIxN2E1MWU3MmE4Njg0Mzc1NGMzODk1ZjlmZmI1MzAxNTVjYTMwYjdmZTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25Db250cmFjdEJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjVmNWMzYTg3MzA2MThkOTYwMjc2NGY4Njc0YTg3MTJmM2ZhZTZhMzAxMzE0OGM2MTgwYWY5YmFhMGZhZTY4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvbkNvdW50ZXJwYXJ0eVBvc2l0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczNjk2NWYwOTBkYzZkMDI0MDNmYWVmYjg5ODI1ZmZhZTUyNWI4ZGJjNjM1ZmFiZjI0M2Y0MTk5ZjcxMzYyMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25JbnZlbnRvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODM0MTg5ZmQ3OGRhZDQzZmIwY2ZlZTI1ZTdjODRkNzEyZDc3Nzk1Yzg3OGQ1NjFhZDYwN2E3NmI4YjJiZjc3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvbkludmVudG9yeVJlY29yZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OGU3ZGQyMmYxOTNiNGNlMzg5NmU1NDc1NzVkNzAwNTM3NGM4MzIxYTY4MDcwNDAxOWViY2FiNzZiNzk4MWNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUG9ydGZvbGlvU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODg2MzYyNGM1ZjcwNmEyZWU5NjQwMWEyMzA3YjExZTQyOTBmZDI3MTY0ODEzMmU5YjI3ZTc3Nzk0ZThlYzJjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvblBvcnRmb2xpby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTcyY2QzMTBmNTQ3ZDJjNjA4NDJlMjYzZjYwNTExZmVjZDc4Y2I2Y2JkNjUwNGQ2MTBjYzI2ODUxYzdjM2Y5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uUG9ydGZvbGlvU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDk4NGI1ZWY1ZmIyNGY3OGU0NjRhYjU1OGJjZmM4NzkwMTIyZTUyODJlYWZlOTVjYWFjNGM2NWExNzUzYTkxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvblBvc2l0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3NjE4NDk4OWY3NDgwYzk5NDNmN2NhNTk5NDVjM2ZjZDhlZTE2YWY5ZTZkYzAxNTM3MzM2YjMzMTMzOTZmYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25Qb3NpdGlvblN0YXR1c0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDM4Yzc3MDE4MTZhMjZkNzg3ZDFkNGVhMWQyZWQxYjAwYWFlNTQxMWNmZmE2ZGEyMjJhZWRmZGRjYzYzYWY2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvblNlY3VyaXR5TG9jYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmNmZkZDRlZWFmZGRjYTRkZDhhZTI3MWI4MDVmNDY3MjM4ZDkyODVkYTg5NTFiN2Y1YWM1MDg0NjM5ODgxZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dDcmVkaXRMaW1pdEluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5NTFkYzBhNjgxYWE1OTY4MDM3MDcxMWI2ZmZmZTRiNWY0N2YxZmY3OTY0YzI1OWU2YWY3NDVhY2IzNmViNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dDcmVkaXRMaW1pdFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxZjA2ODgyMThiZjE4MzczMjg5MGVmOWVhZDE3ZmIxOTBkMTc4Njc0ZDFlODQ1MWEwNTI2NDlhMDkwN2U0NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dDcmVkaXRMaW1pdFV0aWxpc2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5YzdkYWFlYTUyMjZkODNkOTQ5OWRhMGNhZDA2MjdmYjUyZDFlNGYyYzk0OWFiYWE0NzNjMTJlMzE1MDVjN2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dDcmVkaXRMaW1pdFV0aWxpc2F0aW9uUG9zaXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDgyYTc2MmJlOGM1ZmY5ZmQ4Yzc2MGQ1YzU0NDRlMTBjYmM3ZDdmN2VlYjNiZGQxNWYzZDNkNGI5ZTI3OGYyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0N1c3RvbWlzZWRXb3JrZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWQyNjkzZTg0YzkwOGViOGNmYjY3ZTI4MTcxZmFmOWE1Mjk5Zjk3YTlhZWViYmE2ZGM2MmM3MzQ2MGQ1OWU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93RXZlbnRJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YTNmN2ZmMDkyYTExMDk5N2VmMThhYWJkYzZhYWM1MzQ2NDg0Y2FkOTkyOTU5NmU1NWViODEzMGIzMjRkYzc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93RXZlbnRUaW1lc3RhbXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjYzOWI1MTAzZmVmYzQ3NWMzZjI4MTAyNDBlOGRlNTRlNDkxNDkzNDM5ZDhlNmZhMDFiZWVjMjlhMzA5OTUxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0V2ZW50VGltZXN0YW1wUXVhbGlmaWNhdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDI3ZDMyZWI0MjZjMWFiNzFjODhjMTljMzM0MTZjNTQ1ZGVjMjc4YTY0MjhiNzE3Zjg3NDZkNDI0MjRjN2FjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0ZpZWxkV2l0aE1ldGFDcmVkaXRMaW1pdFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5NGQ5MjdiYTY3YmVkYTY5OTg0OTc4ZDJhZDFkNTBhNTc4NmZkOGYxY2FmNmM2YjhiNjMxMzkzNGJkOTIyZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dGaWVsZFdpdGhNZXRhTGltaXRMZXZlbEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTU0M2Y1OGM3ZDUzOGVhM2I3N2Y2YjYxZjYzNWZlMzY3NDJiZGQzMjFmODJhZGU0MDEyMjZjNDNjNDZmZjUyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0xpbWl0QXBwbGljYWJsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDk1YTk0ZDhhNThhZWNhNDBmMmZiZGRjMTc4OTE5NTQ0OWE4YTRlYjNkNjZlYTIwODI4NjEyYTg0NjM3MzEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93TGltaXRBcHBsaWNhYmxlRXh0ZW5kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDFiMWJmNmIwNDM1ZTNkYmFmMDFhNzBmYzE2NGNkM2NiMzFkNTg3MzA2ZWJiMWRlOWI4MzNkNDAzZGI3YzNmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0xpbWl0TGV2ZWxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0NTBhYWU4Yzg5ZmU2NGQ2YWNjYWMyZWZiMDIzYzM5YTYxMDgzYTBjYmVjZTU3OTRkZTJlMjNlMWJmMGJhMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dNZXNzYWdlSW5mb3JtYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjYzZGE2ZjVhNzMwOWFlYmUwMjVlNTllYzA2M2IzNzQ3YTA2NTYxYjZlZTA1ODkyODhjZjc1ZDBmYTNjY2UyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd01ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVdvcmtmbG93U3RlcC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Yjc1YzM1NDgwZDVhMTgwYjNiNzkwYTA3ODNjMmJjM2ZjNjY1NDNhZjUzOGNjNWQzOTVhMzJkMTUzMDQ4NTRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93UGFydHlDdXN0b21pc2VkV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEyMzliZTkxYzQ2OTc2M2U0MjkyOGFjMjg1MDhjMGMzNjUzY2UwZTZhZDQ1OWVkMjkzNDUzNDJjZjk2YjdkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd1ZlbG9jaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmMmY0ODNkMTAxMWJkYzU0MjA5MDk2Njg5ZDgwNzdjOWIwYjE4ZjhlMmYzM2EyY2Q4MTc3MThmOTBjNzVlYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dXYXJlaG91c2VJZGVudGl0eUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2FkOTM1YTlmODEzNDYzMTM2YTQ5NGIyNDIzNTM2NDk2YjI2MzBlZjgxY2E1MDk2MWY0YTc2YTY1MDllOTc5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd1dvcmtmbG93LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2ZWY1YzA0YTk3OGExMTU0ODE5OWEyODI2YmE4Y2I5MzQxZTZhZWUxYTk3ZWVlN2RjYmUyNGE2YWM1M2QwNjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dXb3JrZmxvd1N0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0NDE4MDA0ZDNjYjZkZjFjNDJlMzZiNzM2ZDc4NGI2MmM0OTkxM2VkNGJmNmQxNmQ3OWMzZGY1ZDg5OTRiMWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dXb3JrZmxvd1N0YXR1c0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGMyMWQ0MzBlODhiZWJlMTI0YWRhYjMyMTM4Y2M5Zjc2MzkxZjY4NzJiMzliNDY2ZjBkYzhhZGMwM2I0ZGU2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd1dvcmtmbG93U3RlcC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDE1NTJkYzRkNGNhM2UzZGQ5Zjc5YmUwNzJmM2ZiYzllY2ZlYzA5YmY3ZDg0MjFiYjJlZjNhNDI0NzdkNDVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93V29ya2Zsb3dTdGVwQXBwcm92YWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzdiMjliNmU0OWQ5MDNiOWVmYzI0YzExOTRiZDU0OGNmOWZhYTE0OTY3MzZmMWU5OWIwNTJhZTkyOWJmODAyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQWRkcmVzc0Zvck5vdGljZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2E1YzRkMGQ2ODM5YzY5NWRkZjdkOTk2MWFjYjhiZjdhMjIxN2IzYmQzZDcwMTI2NDA0NWVjMjI0YjlmNTY0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQWdyZWVtZW50TmFtZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNWJlODUxZGY1ZWEyZTgwY2JkYzhmMTE0OWQ0OTBlZGZiZTY3MWIyOWRlMzU3NDRhYWM4NTQ3MGNhZGVkZDNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25BZ3JlZW1lbnRUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZGYwMWUwNzRmM2Y2ZTRiYjBlNDlmMDYxODAzNTk3ZDBlODQ0NTEzZjMwMzIyYzE5ZTNlN2ZhZmRkMGI4NjZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25DbG9zZWRTdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTc5YjljYWJiYjE5OWU2ZWM0ODYwMDY0ZTU0ZDc0NmQ3ODRkNmJkMGM2YzcwOTc2NzliNjQwNDAyMzhlYWJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25DbG9zZWRTdGF0ZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQ5YmE5YzJmN2U0NGFhY2ZjZTlmN2IzN2YzYWU3Mjc3ZTU5OGY3MjgyMThjZGVjMjNkNGU0ODkwODgzZjVlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ29udHJhY3R1YWxEZWZpbml0aW9uc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTlhN2RkYTkxNDcwN2Y2ZDk4MDIyNDU2YmZiMGU0NzA2MTJhMTMyMmRlYTQ5NjMwNTRhOTFkZWUzNDhlMGRhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ29udHJhY3R1YWxNYXRyaXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDk0YjViY2E1NzM5YzE3N2E5YmFhNzY3MjQ2NzlkOWVhYWI0ZGM3OTQ5MGRjNmM5YThiYTI0ODg2YjI1NGMwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ29udHJhY3R1YWxTdXBwbGVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGIyZTBiZDk0NTc2ZTIwNTQ2ODI3NzZlMmE1ZDVmNGU3ODQzMzM2ZmUzMDk4NzY5MjhiNGE3NzMwNGZlNDA5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ29udHJhY3R1YWxUZXJtc1N1cHBsZW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzZiMjFhMjU3M2FlZjQ4NTA5NTY0OTU2MTVlOTk2MDc4NDM5MzE5YWM2Nzk4OWJjNTJiMTQ1OTMyNDgzZjczOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ3JlZGl0U3VwcG9ydERvY3VtZW50VGVybXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmMjI5YmY1MTNhOWE5ZmQ4YjRiYjQ1NzAzNzVkZTg1YTIxYmUyNzMwNTVjY2Q3Mjk3YmJjMjgxMTBiZWZiM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkNyZWRpdFN1cHBvcnRQcm92aWRlclRlcm1zRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjJhY2Q3Yzg4OTZkNzI1NzcxNWZlNzk5ZTdhZDg3NDIyN2RjMDc1Y2EwMzFlNTczYzhiMTY3NjhiZWU4OWJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25FeGVjdXRpb25Mb2NhdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNiNDI5ZjBhN2VhOWEwMDY0NmI4OTcyZjUyNzYzMTM3YzI3ZWVlMWVkZDdkMzY4MjhiOTM5MjJmZGNmOWZmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uRmllbGRXaXRoTWV0YUNvbnRyYWN0dWFsRGVmaW5pdGlvbnNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUyMjY4Mzc5OGEwODZiZmIwNTQ4ZTQwMTMzNDExYzFmZTYzNzMyMzI5NzBlMzUzMGZmMjQ3NTFhYzdlOGZmYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkZpZWxkV2l0aE1ldGFDb250cmFjdHVhbFN1cHBsZW1lbnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNDBlOTBmNGM5NWFiZDViYWMxOGVlOWRjM2MzOGNhYTdkZjRkY2JjYTc1NGYxMzJhOTZjYzI3NDg0YWMwOWY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25GaWVsZFdpdGhNZXRhR292ZXJuaW5nTGF3RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTRkOTFlYzY5N2UwYzc1NGFkNDIwMDFmNjBiZjFiZDE2YjZiODEyYzY1YTA1OWQ4Y2JiMWRjZDY0MzJhMGJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25GaWVsZFdpdGhNZXRhTWF0cml4VGVybUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWU2YTI4ZDEzZDYxMzA4YzcxNDVjYmI5NTVlZDdlOTEyZWMwOTI3ZjA0MzI4MjEyZGJhNDU2MTBiZDg0ZjY4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uRmllbGRXaXRoTWV0YU1hdHJpeFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4ZDIxZWE3ZWZkMDZlMDUxNDQ3OWNmOWU5ODQ2YzM2ZDc2YzgyNWY5NWNiODkzZmE4MTNjOGU1OWNiZTliNTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkZpZWxkV2l0aE1ldGFSZXNvdXJjZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzNjVhYWI0YTBkZWVjN2Y3M2UwZTZmYzk1OTAzMjZjNjQ3YmQ0ZmYzMmNhZmFmYjU4MTQ4ZTdiOTI5OGVkYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkdvdmVybmluZ0xhd0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmM5YWE1NGZhMWU3NTY0NzI2ZGZkNWFjM2Y1ZjFkYzM1ZGNhYzE2YTUzODc1OTNkOGE4MGM0Y2EwYjJjNWNjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTGVnYWxBZ3JlZW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGE1MmVhNzU5NzVmZTliYmY3MDI1M2ZmYjc2M2UzOTEwZTgzNzI5Y2E3NDlhMjgxN2FhMzRjYWY3NWQ3MGViOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTGVnYWxBZ3JlZW1lbnRCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1ODQyMWMwOGM3ZGY4YWZhNGI1N2JjMGYzNTM3YTE0NGYwM2M3NTJlMWVkYzU3ODA5ZmYxMDE2MjFlNjg4ZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkxlZ2FsQWdyZWVtZW50SWRlbnRpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjJjMTYzNGUyNTAyMThlOGNjYTcyZGM4NmVhYzI5Y2U0MjU1ZjU4YjFkMjU2NDdmNGQ0MTUwMDI3Yjc1MDE0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTGVnYWxBZ3JlZW1lbnRQdWJsaXNoZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ4MDEwYTdlMTRlY2Q3N2I5YTQzM2U0ZmUwMmZmMzQwNzZkZDFkOWQzMTYwNzhlMGNhMzYyMTQzMzZiOTc0MTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkxlZ2FsQWdyZWVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzRlMDVhODBkOWJlYjU0ZjNkYjcyMzRiYTI0MDVkNTJjM2ExZDI4NjQ0ZTdiZGYwNDA2ZWI4ZmJlNjgyNWJlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTGVuZ3RoVW5pdEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGFkMmIzODc1NmEzOTE0NDMyNGRiNGI2MDFlYjQzYTlkZTY3MjhmYmRlMjI1YThkZjU4ZjViNGM3NjMzNzU0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTWF0cml4VGVybUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWVkY2FlYTcxYjA2MjhlYTc4NGE1NmY2Mjg3ODEyNTcyMzBmNDEyMzk1OThmNDU2OTAzNDE1MjExZWQ5NDIxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTWF0cml4VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVhY2JiMmQ4M2Y0Y2E4ZDk4YTdkZTdmODI1NDY5ZmMwMzliMzEyYTgzMDQ2ZmMxYjQ3MzQ5YjM1YWZmNDI3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhTGVnYWxBZ3JlZW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjUwM2E5ZTQ2ZDNkMGExMzI5M2U5ZmIxM2NiYzM4ZDhkYjlmYWQ3N2ExZmFiYTI4MGY5OTM0ZDczOTUxZDc4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uT3RoZXJBZ3JlZW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzkxYmZhNjkyNjNjNTY5MTc2NTdmNTJiOWM4ZTEwMGU3NTgwZDM4MjdlNGJiYzMyZTljZTExOGI0NDhmM2VmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uT3RoZXJBZ3JlZW1lbnRUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNDM1NmQ5MjljZDcxMmJlOWFkZjVmYmU2YThjZjJmMzZhOWE5N2IxN2EzNmQyODA1N2E1YmVjMzBlMTEzNmEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25SZXNvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZWQ3YjY4MjgzODkyZWQ5ZTg1ODMzZDBlZTY2MTc3NTA4NmJkNDk5ODcxZjQ5YmE1NTc2YTlmYTVjNmU1ZGEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25SZXNvdXJjZUxlbmd0aC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Y2I3MzMzOTAxMjBjNWI3OWE2YjM3ZDMzODI2NTRlMzZjMDhmODc5YWU3ZjVmODRmN2ZlMWI3MDVjYjgxMWM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25SZXNvdXJjZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkNzI0YjU4NzJlNDk3YTEyNWI4ZjZiNTc0NDZjY2Q3NmJhNzczOTJmMTI4MTlhYWEzZGM4NmRlYTA2M2U5YTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vblNwZWNpZmllZEVudGl0eUNsYXVzZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGJlMzA1NDBlOTg0MzM5Y2Q1Zjg1ZDAzYmM3NWE4MjFhMDVmNGU5YWQ1OWNkOGZlZjllOWY5ZThkYTJlNGEzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uU3BlY2lmaWVkRW50aXR5VGVybXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwNGRlZjIyOTIyNzZkNGQ5YjI2NGUyNDUzZDg2OGRiZDY5YTRhOTExNDg2Y2ZhY2Y3MzE4MDNlN2EwODg4MGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vblRlcm1pbmF0aW9uQ3VycmVuY3lDb25kaXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2ZDk0NTlkZTg2YjBlMjUyMzEyNWMxZWVlZjM1M2U1ZjFjOWZmMDY3MmYzZTBlNDNhNGIzZDFkNTQzZTE2YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vblVtYnJlbGxhQWdyZWVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhM2NiMzY0MjhiZGI0YTM2YTQwOTZhNTU4MDI3NTQzYTgwY2MzMzkwYTk1ZmI0NzRlZmNlZjJlMjQ5ZTMzYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vblVtYnJlbGxhQWdyZWVtZW50RW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiOGVjMjdiZGFhYzdkNzNmN2Q0MmU4MTU5OGY0OWNmODM3MDRkNDc2ZWMxMDAwYTY5ZjUzOTQ1MTNlYTQwNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbnRyYWN0QWdyZWVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlZDJlOTkwN2Q1ZjBmMjM5ZWUxNmY4ODQxMjIxZjY4YmFiYjhlNTIwMTQwMjk0ZjBlNjc3ZDYwYjRlZTcyMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNzYUNvbGxhdGVyYWxUcmFuc2ZlckFncmVlbWVudEVsZWN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZGMzOGY1ZjQ4YTliNWVkZTQzNTFlYzdmNzVhNTk4ZGEwM2NjYWRhM2RiN2Y0YWJiNzE1OTIzYjJjZjAxNzQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Dc2FDcmVkaXRTdXBwb3J0QWdyZWVtZW50RWxlY3Rpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlZmIxMTUyMzZhYjQyZGY0YTYyMmRjNDk1NDYwZWEwY2Q0NWI0MDA3MzA5ZjUxYTVkNzJkOWRlNzc4ZWMwOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNzYVNlY3VyaXR5QWdyZWVtZW50RWxlY3Rpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmYzA3YWIyODZjZDBjNDkxMmNhMzg4NjY5ZDkxZDVkNTI3OGI5OTk0ODE0MjVhYjBkOGU2ZTg4ZDc1ODM1OWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckFkZGl0aW9uYWxEaXNydXB0aW9uRXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjOGVhZjRkY2Y0Y2RiZWYwMGYzYTQwZDQxMGZlN2NiZWNmZDk2ZDMzZWRhMTY5ZTdkMjU4ZTZlMjI3YzI2N2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckNsYXVzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYmNjYTE4OTQxYmY2ODk5ZWFlNDI3YTUyMjM5YjQzNGRmMmIyNGMxZGVmMjdjZTM1MzQxODk3ZmQzODYyY2M5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJEZXRlcm1pbmF0aW9uUm9sZXNBbmRUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZWQzYmM2MTJiOWRmMmQ4NDVkZGM0ODk4NzYzOWQxOWUxM2Y4NWIyYjcwYjUxMGE1MmQ4Y2I5MjlmYjUyODU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJFcXVpdHlBZGRpdGlvbmFsVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTM4NGIwY2I3Y2Q1NmM4OGRjNTViYWYyNTU4YzdjMTE5MmZlZDlkZjdkOTA4ZmUzOWQ0OGRhM2FhNjJhZmU4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRXF1aXR5Q29ycG9yYXRlRXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyZWExY2M1YWViYWI5ZDhiMTRlMjQyYmU2Nzg5YmVlNWVjNGNlMGYyYzM4ZDdjMDE2MTExZjExMTNmZGVmMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckVxdWl0eU1hc3RlckNvbmZpcm1hdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODYyOTk1Y2Q0NmFhNDg4Y2Y3Mzg5OTI0NWI1OTI1MDRmNWYwZmFmM2NmODUxNDA4NWM5ZWJmYTM0ZjMwNzhkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJFcXVpdHlTd2FwTWFzdGVyQ29uZmlybWF0aW9uMjAxOC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZmU3M2EwNTNkZjQyMzlmYmQ5OTdhNGFhYWEzNzAxZGYzOGY1OTA4ZTc0ZWFmZWIwODdiNjg2YTAwOGE0N2U4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJFeHRyYW9yZGluYXJ5RXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwYjBhODI4MWU1NmJhNjM2NjAyNzFmYWM2Mzc3ODVhODFkNTRkMzJlZGFiMTE3YjRlMDk1ZTU1MTcwNTRiMTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckZpZWxkV2l0aE1ldGFNYXN0ZXJBZ3JlZW1lbnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZGI2ZGE3MmNjZjk4NTFiZDljZjIxODI0NzEzZTQ4OTkxOTE3Y2JlYzM3NWI5MmZkYWZhMTdmYzBlZGQyNjg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJGaWVsZFdpdGhNZXRhTWFzdGVyQ29uZmlybWF0aW9uQW5uZXhUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTUyNzYxZTBiNjRiMzgzZDE5NzU4YmY4MDM4OWNlYTUxMjE4NTA2NGQwMGU3ZTYwY2VmNWRkMmMwYzRiNjM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJGaWVsZFdpdGhNZXRhTWFzdGVyQ29uZmlybWF0aW9uVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzNiNDA0NGI0M2Q4YWY2OGI3OGEzMjk1OThiZTEzMDY4MWUwOTZjZGI3ZWQ1ZWRlZTRkOGUyNmYxNWI2M2Q5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRnhBZGRpdGlvbmFsVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjViYmY4ZWVjZmYzYWZlMjg4MjA0NzM5NmQyMWE3ZTBjY2E1M2YxNmNkODY3ZmJmMjJlMWI1ODA5NjgwNTMwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVySW5kZXhBZGp1c3RtZW50RXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjNTI5ODQ1MDRkM2FiZGEwZWNlOWZiMjUyNWU0YzJhMTMxNmYyZDdlZDJmZmQ1ZjJlZmFlZjRjM2MzZGIxNzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckFncmVlbWVudENsYXVzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYmNkM2ZlOTRjOWMxYWFiYWE2ZDAwMDI5YTY3OWViNWZjNWY0MDYxMDMxYWFjODA2N2RlYTcxZWNkNmNlZDY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRDbGF1c2VJZGVudGlmaWVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMjBkNzI2MGI2N2RjY2U5Y2Y5NmRmMGRjOTEwMjI2OWZjMWJiNTI1NmJiZjI4ZTMzYWM5NGM3MzJkODI5MmI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRDbGF1c2VWYXJpYW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhYmExNGFjMGVmNDU5NzllM2MxYTlmN2VjN2NhYzkzZmQxYWIwOGM0Njg0M2M3MDNjZjQwNDZlZjFmNjYyNmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckFncmVlbWVudFNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNmZlZTA2N2M5NjY2ZjFkYjE0Zjc4NDYwNDcyMWFmMDRlMjhiMTIyZmRmZjJiY2I4NWI0MTM0MzdhZmU2OWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckFncmVlbWVudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiODBlNWZiZjMxZGUyOGRiN2QwNzNlOTE4YTUwZDI2M2UwOWFlYzc4ZGYzZDQyNTRkMmQ5ZGNiMDFjMzdkNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckFncmVlbWVudFZhcmlhYmxlU2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNmYzRiOGI3ZWRjYjA5Y2IyYjM4MWRmZDk0NGY1MDc1MjFkMmMxZDNiOGVlNDE4Zjg2MzViMmNjMzM0MmIxY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckFncmVlbWVudFZhcmlhbnRJZGVudGlmaWVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Zjg1OTVmMjc0MjI2MWYyNTRkMjUzZjFkOTNjNDU5ZmEzM2Y4NjViZjU2NTc5MDZjMzBjNjQzMDJlNmI0ZGFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJDb25maXJtYXRpb25Bbm5leFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3YjVlODVkMTVmMmVjNzE3ZWYxZDMwZDEyNTgwYzFlMTgyMzEzMDVjY2M0NGJmMjM0YTcxMTg3ZGU3OWQwYTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckNvbmZpcm1hdGlvbkJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjI0OGFhZGU0MTQxNDE0ZGFmNmI2ZTNmMDQyODViNTEwOGI2NjMxYTYzNjQ3N2JhNDlkMDI2M2ZlNzkwMzhkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyTWFzdGVyQ29uZmlybWF0aW9uVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDdkNzYxZTJhMTc5ZDEzZjg3NDU2MTZmNDAxMDA1YmE1NDJhZDRlMWQzYjFlMDJiN2JjODFmOTIyZGRlMGI0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyTmF0aW9uYWxpemF0aW9uT3JJbnNvbHZlbmN5T3JEZWxpc3RpbmdFdmVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjdlMDFiODQ5Mjc3NDA1ZWExZTkwMGVkNTQyZjcxYmZiOTBkNjkxNmYyNjQyYzNmYmNmYjE5ZDdjNzc1NzRkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyUmVwcmVzZW50YXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4ZDllMzQ3OWY4NDU2MmY3YTQ4ZDgxZGQzNjAxODJjN2YzZDVlM2FlZTkxNTA5NWZkNDE4OTcxMTdlZjRjNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlclRyYW5zYWN0aW9uQWRkaXRpb25hbFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyYmVjMTY0NTI5ZjAyYTI1N2NlNmQxZjMxNjgyNzNhMjBhMDRlNzA4YzhhZjljNmM3YTllYWMyZmNjMmQ1M2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlclVuZGVybGllclN1YnN0aXR1dGlvblByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZmYxZjBjODY2MDljMTEyMzlkN2M4YjIyYTQyM2RlNDBlZjY4NDg3NTIzYTg1YWI1ZTEyNDdlZjlhZTFkNzQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1NYXJnaW5TY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkNTgzMTE3MDMxNmE2MDFmYWNmZGRkOWYwNGQ5ZDUwZTdlMWUzZmEzODA3YjIwOTk2YTNjYzIxMDA1MzY0NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU1hcmdpblNjaGVkdWxlU3RhbmRhcmRpemVkU2NoZWR1bGVBc3NldENsYXNzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMDQ5ZmYxYzEwZGJiOWVjMDQ2N2ZmYzgzMjNhM2RhMDc2NjM0YjU1Zjk3MWIzYmVkMmZiZTRjODE1NmY5YTUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1NYXJnaW5TY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlSW5pdGlhbE1hcmdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjlhMjhhMTgyZTFmNTdjNTg1MTdiMjY2OTgxZDkzNzNiYTg4M2U2Y2U4OGE0YzM0ZTE0YjVlMGM5ZTNmYWVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1NYXJnaW5TY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlUHJvZHVjdENsYXNzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDkzYTVmMjk2YmVhODIxN2FhY2ZkYzYxNGJjYjg0NWEwNmE0N2UyMTBmZWE5ZjA5OWJhMjRjNmU3MjJiMWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1NYXJnaW5TY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlVHJhZGVJbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1ZTUzZjc3MWE2NDhjNzBhODE3MWFjODhhN2Q0ZGJmYzQzODY0ZjAxNmY3NjhjZmIzNjE5YjBiOGFkYzRlODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEJhc2tldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2Y2ZjZmOGRiN2U4NWJjYTdkNTFkZDZiMDRiZDJhMzgyYjFkMGI4MTg3Mjc0MTFkYTdkY2E2YTdlNzczYjZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRCYXNrZXRDb25zdGl0dWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTlkYmE5NTQ5NDEyYzM5ZWFlOWQ4ODViZWQ2YWIwMmUzNDI4N2UxMWI3NjYzOTRjNDg1MjgzNGQzN2NhNGI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUNhbGN1bGF0ZWRSYXRlRGV0YWlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNjNmNTUyZjA3NjcxNjIyNTU2OTI4NzI4OWVmOTYyNGY3OTM5MmM1MWJiNjM3YTcwZTY3M2Q2M2JlYWI2YTA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUNhbGN1bGF0ZWRSYXRlT2JzZXJ2YXRpb25EYXRlc0FuZFdlaWdodHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZlODg2MDE5YzMyN2I5MjZhZTIwNDEwYmZhYmY3MjViMDFmOGRlNDdlMzUwZGQ5ZDRhM2Y3OTYyNzJjNmRkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVDYWxjdWxhdGVkUmF0ZU9ic2VydmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTdlMTQ5NWQ0MjdiMzk0YWMwN2JjMDgzNzA2YTdhOWM3YTk4NDRiY2E0NzQ3ZmE1NTA1MTk4ZGY4NDBlYjU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUNhbGN1bGF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjFhZGU4NzNhMWY2NjU3MGJjMGMxNzQ1MjJhZmRlZTg0MWViNTM5MmVjZGI5Y2Q0NjhkZTY4N2EwMjlhMjYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUNhbGN1bGF0aW9uU2hpZnRNZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ZTZmNWUyMzFlZDNjN2EyNjk5NjIwNTZkZTM4NjU2YmVjY2VhZTM2ZWVjMTEyM2YzZjhkZDFlNGZkNzlkOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhbGN1bGF0ZWRyYXRlRmFsbGJhY2tSYXRlUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTYyMDA1NjZjZTRiZmFjMWEzYjVlNDZkZWY1ZDI5MDRjOWI4ZjljMTVhODIyZjczNWVkZDljMWY2ZWEzMWJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUZsb2F0aW5nUmF0ZUNhbGN1bGF0aW9uUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjRiOGQ4YTExMDdjNWY3ZTM1ZDU1ZTIxM2E1OTBhNjM5NzkyNDgxMTg4MjNkZTkwYjlhODE4MmI2YTY2NGI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUluZmxhdGlvbkNhbGN1bGF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2MwN2NjNmU5MzQ0Njg5MjUzMWMxNmM5MmM3NzY1OWJiNjQ2NGUyMDBiMzk5MjYxNTVmNzhjYWM1MDUzODg3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUluZmxhdGlvbkNhbGN1bGF0aW9uU3R5bGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlMGIzMzQzOTJhZDdhMTU4NWFlN2JjZDFiNTViZWI5NjIzZGVhZWY2NjdiNzU5ZmJiYjRmNWZjYWRlMzNkZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhbGN1bGF0ZWRyYXRlT2JzZXJ2YXRpb25QYXJhbWV0ZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxZjkwZjY1YmQzMmFkZTRhOGY3YjM1ODRmMjRlMTI5MzY3MTRkODE2ZDY4YTgyZmU2NWVkMDMwZTIyNWY5ZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhbGN1bGF0ZWRyYXRlT2JzZXJ2YXRpb25QZXJpb2REYXRlc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODEwNmYxY2JiMzU0ZmMwNWI0NDkyZmNmZmVmYWY2YmEyYWU3YTIxNzViZDEyMTlmMGFiNDliMjMzMDdiN2IyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVPYnNlcnZhdGlvblNoaWZ0Q2FsY3VsYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI2MGM1YmRhOWUyM2ZlYzdjMzE0OWIwZTJjMDM1OTA1MGRkYTQ4MDljZWVjNDdmMjNhNmJhMmY5MGQzYjU4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVPZmZzZXRDYWxjdWxhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTkwNWY5ZTE4NzA2ODY2NzNiYjUyYjE5ZWM3ODQzNzM4YmFkNDkxYmFiZDdiNmZjYzIwN2MyZTM2MTBhMDc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGlvbkFnZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0ZjhlNzFhZmM0M2ZmMzU1ZDJiZWU2NDA5NmI5OGU3YmI2MzI4MzdmNWU5M2UyMGNhYmY4ODQ5ODlkMjliZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhc2hDb2xsYXRlcmFsVmFsdWF0aW9uTWV0aG9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlYzgwZGMyZDhmMjI5YWM4NWUyNjliZjNiMDhiNzg3ZTZkYzg3NzMwZTdhNDZhMzc5N2FmOGM3NGMxODU0NGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhc2hQcmljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTliZDQ3MTZhYjZlNDViZmJhNDFiZjgxY2JlYjJkYjkzMjVhZGU5NDQ4Njc1YzM1MmViMDMwZmM4Mjk1NzQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYXNoUHJpY2VUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDFlMDgyNmMyM2ZhYmIyMGViMjgwNDI4ZGQ4Mjc1YWEyNTIyZWYwZDFkYTVkNTBiMjAxMzBmZDUzNTI0ZjU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDb21tb2RpdHlSZWZlcmVuY2VQcmljZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODliYTM5N2Y4Y2IyNDk0ZTcwNjk3Mjk1ZTFiZjI2Y2EzMzMxMDg5YmE3MmQ2M2ExZjYyOWRhYjE1ODNkNmI1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q3JlZGl0SW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWNiMjEzOTYzYmJlYjExMmJjMTBjYWYwMGNlYjFhMmM1YjE4ZTZlMDg3YTU5OGFjMGZmN2MyN2Y0MDg0YzQ5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q3JlZGl0Tm90YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjcyNGNlOTVmOTQ0ZDg1Njg1NzE3NTdiNmU4OGJkMzY3ZjA3NWUxMjY5OGM0ODk1ZDljMTVjNDVmNzRkNWVjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q3JlZGl0Tm90YXRpb25Cb3VuZGFyeUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDYxODAzYTJkN2ZhZTg0MzExMzU3ZWZlYjY2NTFjMzA5NDkyNzMzZGVhMGY2ZGY5ODExNzg4YTBlYjI3MWNkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q3JlZGl0Tm90YXRpb25NaXNtYXRjaFJlc29sdXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhYzA5NDM3MWQ5Mjc3NTliY2Q0YmYxZTJmY2NmYzI0MDI3ZWI0ZTgzNmM4ZTNkOGMzN2NhZjc5OGU4YjNkODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdE5vdGF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODU2NGJlYjA3M2U3M2YxZTRlOWJiNDg0MTNmZmUwZDE1OTEwOTE5MzE2ZjgzZmRlNjA5NzM0NzliMGNmOTYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDcmVkaXRSYXRpbmdBZ2VuY3lFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViYjE5ZjQ4MzI0ZDgwYjBjMWMxZjlmNzg1NTVlNWQ0ODU0OTVhZTgyMTliMDAxNDc2ZDkwOTYyN2FiZDk2OWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdFJhdGluZ0NyZWRpdFdhdGNoRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjhjOTgzMzczY2ZlNjQ5N2FhY2Q4YTVjNjUyYjU1MDM5OTc5M2Q1OGNjZmNlZjliNzAwNzQ0ZTRjNmQ3MzM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDcmVkaXRSYXRpbmdEZWJ0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlNGNjZjlkN2U3ZmU1YTUyYjU2ZTFkYzhlYzYxMmZiNGI1MjMwYjRiNmRhNGIwYzM1OTI2MjZmZDQ3MTc3M2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdFJhdGluZ091dGxvb2tFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxM2I1MGQxN2Q3NmExZmY5Y2E4NTkzM2FlNmFkZjIxYjc3NjQ0YzI0NzRmYzRmYWM4M2I2YTgzNzNhNTNlOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENzYVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0NTZjNzQ1YThiZTlkM2FmMzMxMTRjN2FhMDBjZDJmYmJhZTU1OGZlMjVmNzA0NzBiMmM3ZWU4YzJiZDk2MzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEN1cnZlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjZWE2NjM4ODhhYzU3ZWQ3N2I3NWQ3ZGNlYWYxNDZhOWY1MWU2NDAxMjEwMWFjNzlhMTVjNzBhNGQ4NjE1N2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldERpdmlkZW5kQXBwbGljYWJpbGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzhkN2ZkMTc1OWNmOTZmMWUxNzJhNTgzODdiOGQ2ZmEzYjViNzQyMjY3NDQxMjBkMmNiN2E4OTc5ZDdhODY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRFcXVpdHlJbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTM0NTkyNzhmYmVjOWIxMTU5YzU0OTFjNDkxZTAxMWQ2NDQ4NWU5ZTRkZTFiOTBhMzNjYzZkMDY0NTFkODVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGYWxsYmFja1JlZmVyZW5jZVByaWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2MWJiNGU3YjgxYWVhY2QzNDdiOThkNWY5NjVhYWY4MzM1YmI0OGQzMjk4YzRkZjNkNDVjNjVkZGY5MjYzYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZlZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU0YWJmN2MyMDg3ZDQ1NGY2ODhlMDQxNzc2OTNiMTc0YWQ3NTlkMGRmNjkzYWY5YTFlNWU1NGRhMTNlNjMzZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZpZWxkV2l0aE1ldGFCYXNrZXRDb25zdGl0dWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTBiMmQ4YzA4NDQxZDk3Y2U0MjRjYjRlMjI1Y2EzMWY5YWExYmI4MjVhZGQ1NzBkYzk5ZjEzNGMwZmM0OGM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhQ29tbW9kaXR5UmVmZXJlbmNlUHJpY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImVkYzNmOGJjZjAzNDBmN2U1NGYwZGIwZmY3MDNhZTZjZjJhNTYxOGQ1M2U1OTliN2Y5YzYwMmU4MTMzMGMwYTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZpZWxkV2l0aE1ldGFDcmVkaXROb3RhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNzFhNjIzMzM3ZmQ5NmNmNjVlZTVjMzM4YTYzM2IyOGViZDk1MjIwMjA1ZDk4ODM2YzJiOGExZjI1OGEzM2E0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhSW5mb3JtYXRpb25Qcm92aWRlckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU2NmQ0ZWJjM2E2YmMzMWFmZWRmMmM4ZWFlZmVhN2EwOGM4MmJlM2Y5M2MxODU0YzU3YjAwOGZmODk4MDU0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmllbGRXaXRoTWV0YUludGVyZXN0UmF0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImMxOTNhZTZhZjMyMTQ5N2YxNzkyZTBjMjBiMTQ5ZTQ0ODdmM2E1NzYyMTVkMjdhZTc5NDZlNzZkZWE4OThhMDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZpZWxkV2l0aE1ldGFJbnRlcnBvbGF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOWQyODNkZDY5NTNiYmQ5Mjc1OGRiNTA5NTMyOTFkZGVkMDQxNTY2ZTk5ZjU0Zjg5ZjY0NDA4ZTM5OTU0MWU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhT2JzZXJ2YWJsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDAwZTE4YzM0ZWY0MDNiMzg4NzZjMWU3YTAwMDZkMjM2MDQ0ZWJmNWJmZmI2YzlmYTA0MDY3NWI0YzY1MjgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhUHJpY2VTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTEzOWU4YjVkNGMxNTFkYzgwMGJhMDE5ZTlkNmJhOWE3MTMxN2VkYjFhYTdkZDA3ZWM0M2VmZjBhYjY4ZDYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhUXVvdGVkQ3VycmVuY3lQYWlyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5NmQ2NTI2YTZjNzE3NjdjMjM5YzhmNThlZTY1MWFlYjkyYWRiMDljNGExMzE2M2RlYWEwNTM0ZWJlY2I4ZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZpZWxkV2l0aE1ldGFTZXR0bGVtZW50UmF0ZU9wdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGE4N2M2ZWIyYmY3Nzc0OTUwZDgyZWI1YzJiMTY0MTg4OTY1ZTg3Njg2OGQ1YThjZjU4ZmQ0Mjc0NWFhZTViNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmxvYXRpbmdSYXRlSW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzY2NTA0YTI5MWY4ZjcyMGFmYjY3ZjlhZTdjMTQxYTgwNjQwYzFkYTE1Zjg1YjFjNTRjNzY2ZGNiYTU4ZDIxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Rm9yZWlnbkV4Y2hhbmdlUmF0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyM2FhZDJjMTVhMjY0NThkZjEyYzRjOTJhZTM3NTk2M2ZmM2Q4NWUwMWQxOWZhNGE4NDFmNWE4YjEwNTZhMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZyb0Zsb2F0aW5nUmF0ZUluZGV4Q2FsY3VsYXRpb25EZWZhdWx0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2M2N2Y4YmRlNzk0N2Y1MGQ0NzRhMWEyYjRhYTE1MDJiMWM5YjVjMmM0ZGRkNTM5ZTBiMjcwZjQ4ZjEyZGI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGcm9GbG9hdGluZ1JhdGVJbmRleENhbGN1bGF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NzY0N2MwOTFmMzA1MDQ2ODUwZWI4NTE5MzgwMTc1MzQwYjY0MTBjZDNjNDliY2ZiZjVlNWM0NzM3N2VmOGE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGcm9GbG9hdGluZ1JhdGVJbmRleENhdGVnb3J5RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTkxMGE0NDEzMTk2NDhiY2M3OTgxNTNjNWJlNDIwOTI4NDBlZWMxYWY5OTJhNThkZGUzY2Y3YzkyMWY5NzAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGcm9GbG9hdGluZ1JhdGVJbmRleERlZmluaXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFkMDEyMTI2ZTgwZjM0NTI1ZGRmNjJkMjFiMzE4NmI4Y2QyZDkyZDY4Mjk5NDdhNTM4YTZkMjFkZTNiYWE2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnJvRmxvYXRpbmdSYXRlSW5kZXhJZGVudGlmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGQzNzJjM2M1NGZlZGE3NzRiZTllNjhhMjdiOWJiYjIxNzZmYjQxMjM1OTM0NjkzOTEwYmJhYzM4MDE5NDU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGcm9GbG9hdGluZ1JhdGVJbmRleFN0eWxlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZGQ1ZDZlMDE0MDFhZmZlN2FmMmZmOTZkODRmY2Y5ZjI1OWVlYmUzYzk3OGRlNDhhMDZjNTQ2NzYxMDhkNDY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGeEluZm9ybWF0aW9uU291cmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2ZmNkMGE3YjJjMDVhNzRiMzlhZGU5YTA3NWYxMzVlNmMxZWM3NWMyZmJhYWEzYmM4NGY5NjUyNmZjZDc4NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZ4UmF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODE2N2ZhYzUzNWQwMGZkZDYxN2QzNjAyOGQ0MDNmZDY3ZjczYTk4ZWM0NWUyYmYwYWM2MWIxYjkzZWNiZmM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGeFJhdGVTb3VyY2VGaXhpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjRkNTcyNWY1ZTg5ZGM1N2U3NTg4NzNjYTdlYTYyMjY5Nzg2MTQ4ZDIyZTg4YTJjOWJiY2UwMzY2MTQxMmRlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnhTZXR0bGVtZW50UmF0ZVNvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzBkZTRhMTY0Nzc3NWE5MjVjNTliNGVmZDg1MzE5MDc4NjFlOTBkZTljNzQ1ZWViMzRhZDE3NWMzN2RjNGM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGeFNwb3RSYXRlU291cmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MzNhNGRhMTM1NDE5MzFiNjdhZTk4ODVhNjU2MDg1YjEwZDM2MDI1OTk2OWZmYzk0NzFkZDdkYjE2MWMxMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImU4NTE3YmUxYjQ5Yzk0NmZmZTk4MDY0ODA2NzQ4MzM0NWNlZTNjNTkzZDBiYzhhNjAzNzlhM2ZiMDgyMzQyMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEluZGV4QmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzQ2YjE3ZTRhNDY5ZjY1OTIwMDMyYmY0Njc2M2M2Y2RmYzgwNzljZGQ2YzY0MjA5MzUxYjYxZTQ0MmVhMDk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbmZsYXRpb25JbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjE5Mjc3ZmRiNGZmMGNhNDRkOWY3MjE1MGE3MWUyYWMwYzZmOGRjZDk4NTI0Y2ZjMTBmYmQ1N2MyY2QxOTI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbmZvcm1hdGlvblByb3ZpZGVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YzVhN2IwMWQ5MmQ0NGRhZTU2MTQ0NDliZTNkNjM5MWZhNGQ0YjA3MjU4NWFhNzA4YWMwYjU4OWI2YWVhZThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbmZvcm1hdGlvblNvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTkyNDdmNjMwMmQwNzYzNjA2ZTFkOTBjYjBkZDQ5MTY1ZTYwYzk5ZDNkYmVhMDk3MTNjMGUzZGQyNzhkYjdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbnRlcmVzdFJhdGVDdXJ2ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYWRlNWQ4ZGMwMDdjNTA2ODIxMjdjMjA2MjUwYmNiYThhNDNlYzk2ZDdjYjU3Y2M5YzQzMzRhOGE4MjEwM2QwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbnRlcmVzdFJhdGVJbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNzczZmY2MDM2MDkzZDViOTQzNTQzYTYzZmM1ZjlmYzRhYzM2ZWIxODJmMWJiZDViN2ExMjA4ZmZhYzA1YmRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbnRlcnBvbGF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDRjYjJhNTc0MDYzOGEwYWMxYjdkZDEwZDNlMzQzZTg2MDcxYzVmYWU0YzdmY2Q1YWUyOTExY2M5MDUyZDc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNYWtlV2hvbGVBbW91bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDRmN2ZmM2U3ZTViYzYxM2QzMzZjODFjYzFmNTJkMjU2Mjk1ZWIyZmMwZGU3OGIzNGEzYjE4OTJiZmRmZmJmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQmFza2V0Q29uc3RpdHVlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI0ZmE0NjU1NmZiZTYyZGUyYzk1ZjFiODcwNmI5OWYyZGQ4Zjg3MjM5OWRhZDYwYjA3OTEyYmY4Y2UxMGIwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhSW50ZXJlc3RSYXRlSW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjExNjNhNDAzNDVkY2UzZGNlMDFlMzIzNmE3ZWEyYzUwZWQ2NjQ3MzYyY2QyYjhjMGRmOWI2YmJlMDM0YzVlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhTW9uZXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE3ZmI1YzUwMGM0OGE1NDRlMzBlMzZlMjNkZDM1NGU2M2M3MmQxNDA3MDJjYjZmOTU0MzY1NGFkYWViNmQwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhT2JzZXJ2YWJsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YTFlNzU0MTZlMzVmY2ZjNWM3MTEzMjg4YTg5ZmQ4NTJkMmU2YjRjMTM5N2I3NDE2NzIyMTViOTFlYzcyYmI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQZXJmb3JtYW5jZVZhbHVhdGlvbkRhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmNTUyOTAzYTU4Nzc3ZTFhZjI1OGY0ZTM2ZTQxMTNhMzU4ZWMyOTNlNzI5OTJiZWFiNDY4MDc0NGJhOGM1MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVByaWNlU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk1YTk1YjQ4YTljNjIxNmNmZjA3N2E2ODY4NmFkN2UzNzkzY2JjMDZlNjZjMjExMDgyOTRhOGJjYjhhNDViYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUXVvdGVkQ3VycmVuY3lQYWlyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0YTM5NzgzYzhlMjZiMDkxMzYwNWZkN2E5NzI3ZjgyM2Q1YjJlZTUxNTI0MGE2YjA5MjA0YTg2ZDEwMjY3MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVJhdGVPYnNlcnZhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YzFlY2U1ODYxMTJhZWM4NmI5MGVkMDQ4YTE4YmVkNzNlY2YyZjhhNzE0MzI5NjNiZTkyMGVkNTEyMjVlOTNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNb25leS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMGIyYjk5ZDlkMTQ2MDUxYWE2NmY0MjFjYjg3OTMxYWIyNTk1NDg5ZjFmZjQ0OGMzYmM1ZDc4NDA1NmQ2ODNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNdWx0aXBsZUNyZWRpdE5vdGF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODZkYWMwNzM4NjY0ZTc5M2YzNTQwODFkY2ZjNTBhNzg2NDEyNTc1M2Q0ZmJmYmI1NDc5MmY0ZTdjNDEyYWViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNdWx0aXBsZURlYnRUeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjg0M2ZjZGRlMDViYTlkNzBjOWVjZGM4MjFjNmMwOTllMDA0OGJlODI3MzI3MmYwNTc5M2Y1YzRhZWFmNWFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNdWx0aXBsZVZhbHVhdGlvbkRhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1MGFiMWY5NTEwOTdkMDM0Y2FkMTRjYTNhNjAwOGI4NjdhZjY0ZjkyNWRkOTc4OTgxMjBjZWZhYzM2Zjc0OTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE9ic2VydmFibGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2Q2MjQ5NWJjOGU1NzhhZTA5NTBlMWNlZjIwZDc0ZGJiZjg5MjM1ZThkOTU1MzRjZGI1MWE2MTM5ZDliNmQzMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0T3RoZXJJbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YmNhMWViNTRhMzY0MGVkNjAzNWVlNmFlYTc0ZTVmZTQ5YzQ0YmI4MzQwM2M1NzRjNzA0N2ZiYmZiZDNiZWExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQYXJ0eURldGVybWluYXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkMTYzNjQ5MDA4MGMzMzc1NDliOTZhYmNmY2M3MTMxNjM0NGIxYTRmZmIxMzVkNzk2MmI2ZDEzNjk5YTA0YmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFBlcmZvcm1hbmNlVmFsdWF0aW9uRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ5OWM0ODkyOWFmOWVmZjI2MWUwZTdhZmVlOWY3MTA3YzEzOTk3MDdhNWFiNTg4OWZlZTg1YzEzZDNmZTJmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UHJlbWl1bUV4cHJlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQzZDYxOGY1NmFiOTRjMDU3Yjc5YmUxOGIxZDg3M2Q5YmJlNjNmZThlOGU1MjM4MjFiYjhlZjkzY2IwZmYyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UHJlbWl1bVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkYzMyNjA5NDQ2ZmYwMTcxZTdiMjEwNzJkYzRkMGM3OTZhM2Y0ZjIzZGNmOTU0MzRjZDZjM2E4OTFjZDE4ZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxNmVmMjg1MDFkMzJkZmE0ZDQ4MWE5OWQ1Mzk3MGUzZGZjMzE0MmE4MTM5YmUwMGI4MjJhNDk1MjkzNmRjODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlQ29tcG9zaXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzY2UyZjkzMDI4ZTkyMjEyNTBiOWYyNmU1Y2MzYzk3N2Q3NzBkYzQ1NjhiYmFjZGFiOGIxYTIxNDVlNDJiYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlRXhwcmVzc2lvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTBmNGI5NTg4Y2EzYWI0YTQ0ZGFjYzhmM2ZhMDdiYzM2MWEwMGJiZWZmZTE5NDhkNmQwOWEwNzJhNDg0ZmJmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UHJpY2VPcGVyYW5kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzFhZTZiNTc2ODlhNTc3YzA0N2ZmOWFlNmI3MGMzOTQ5NzEyYzc1NTlhMjcyOGQ0Yzk1YTI2YmEwNjgwMGIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQcmljZVF1YW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwOTM2ZmIxNjM5NDBiZGMyMjFlOTRmZTUyYTEwZGI1MDQxYWJhNDhjOGNiZDcxOTBjZjc4YWJjMTA5MGNlNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY4OWVjYjY0ZWI0MzRiZWIyNzQwMGI0MTFkNDJiNzAzOWNkY2MwNDZlZGVjYTI4MGQwODU5YzY0ZDRiYTc0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UHJpY2VTb3VyY2VEaXNydXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg3Mzc2NzJkNDc5NDU4MmJlY2FjY2ZmOTgwNGE3NTkxZWIxMzhkMjJmODBmYzZmNTk5N2FlNDU2MjhiMTI3ZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDNmZmM5Yzk0NTliMjcyODFiZDc5YzBiOTg3NjQ4NTAxZTQwMTAwZWE4YTcwYmExNzQzYThmZTMxM2MzMzY1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UXVvdGF0aW9uUmF0ZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwYThkMjY1ZTRiZTUzODgzZmUwMzg5MjI2NDg2YTNkOWQxYTk5NGFlYTVjNTg3ZDBiM2Y2Y2EyZWY1YTZmMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFF1b3RhdGlvblNpZGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwYzBhMzRlNTUzZTYwMzE4OGNjNmJmMTAxOTllYjhmYjRkNTkzMDM2OTg4Mzg1NWFlOGI3ZjMyZjlmYWVmOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFF1b3RhdGlvblN0eWxlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OWI3N2E2NDdiYjM2MzU4MGVlNWE4N2E3MTg2M2M3OTgyYTFkYTM0NzA2ODRkZDRkODU3MDkzZGFjMjJkZWQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRRdW90ZUJhc2lzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjNjNmJkY2FiN2ZmODQwYzE3MjFkOWZiMTI0OTNmMzY4ODhhZmZiN2QyOTMxMmUxMGQ3M2E5YTMwYmU4OGYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRRdW90ZWRDdXJyZW5jeVBhaXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmU3ZTk5OWI0ODk4NzE1YmYxMzk1NmIyYjNkYTQ0MWUzOGM5ZWY5ZmFhZjU4YzU2MDVmODc5ZDQzNGJkYjIzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UmF0ZU9ic2VydmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5OWZjMjk3YzFlZjFiOTYwYzA1ZTdlYzhmMjg1MjRkM2JhMDAzNjYwMmQ5ZDg0YmJjOTFlNGZjZWRjYzBkMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFJlZmVyZW5jZVN3YXBDdXJ2ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3N2M0NzE2NTgxMTRkM2FmNDkzODZlMjBkYjNjNGM0Y2JkNmE1MDBiZTRhNTBhNTA0N2QwMGYwMDg3MTg5M2E0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRTZXR0bGVtZW50UmF0ZU9wdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWM4OTNmY2UwMTJhMzBkZTNjNmQwM2E0YTIxYzA1NjcyNDhiZTA5NDdjM2I4ODJjZDYyODFhNzdiZDc5MjkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRTZXR0bGVtZW50UmF0ZU9wdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjhkZjlhN2ZlYmFmYzlmMTQ5ODgwNDZhZTBmZTJkNDI1NjhmY2VmNmVmNjk1YzVmYjIxNDE3Y2VmNWZmZTZhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0U2luZ2xlVmFsdWF0aW9uRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNmY2MGY5OWI1ZjYyOGIwNzQzYWFlYTU3MjExM2M3NWIxMTNhMmZlNTEzN2UwYTIyYTBlN2Y1YmY4MzhiMWE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRTd2FwQ3VydmVWYWx1YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JjNTUyYzQ2MTk1Y2QwMDgxNTlkNjEzNjA2ZDQ1OWEyNzZiNjBmYzZjMzQ2ZDQ3MTVjOTRlMWIwMjE4YzZlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0VHJhbnNhY3RlZFByaWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1MDc1ZjIyMmRjOTdmMTNiNDEyMDJmMWM0ODAyZWZlOWVjNjg1MDNhNWVhZjAzZGE1MjIzN2M0OGMzOGZjYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFZhbHVhdGlvbkRhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjYzg0ODZhN2QwNTM5OWRhMGU4MDI5NWM2YmUxM2RjZGM3MWEwNGU1YmFiOTJjZGFjN2Y2OTNjY2IxNGRkZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFZhbHVhdGlvbk1ldGhvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTVmZjJhYjRjNjliZmVhYTJjYmJlMmMwMmVhYWY3ZjNjZTc1ZDI3OTY0ODY1YTQzODQyYmU5MGI5MmQ3MjRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRWYWx1YXRpb25NZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzNzhmYmE1YzQyZDM2NjZlOWYxNDBlNzEzM2M0MjViNzMwMmY1OWYxNDhjYzQyZTM5ZGI5Mjg1NzAxYWNiMGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFZhbHVhdGlvblBvc3Rwb25lbWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzZkNzEzNWU0NjViZmYxZmM3MDFmZTJmMDk0MDA4Njc2ZGVhOWY3ZWRlNTNjNWQ1YTk1NDlhY2I5MDQ0NDFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRWYWx1YXRpb25Tb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmU2MGU3MjRlMzViMTI0NWI1OWQyNTcwNmE2YTk3MDMxMWJkZmYwOTMwNjYzNTEyNzhlNDc1ZDVlY2I1OTQ0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUNvbW1vbkRldGVybWluYXRpb25NZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyZjdiMDY0ZmY2ZGRhZDhiYmZlYTFiNTdiZDRhM2FjZWM5MmUzN2MzZjQwZDZlYzhkNTE3MDJkMWMyZTc0ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVDb21tb25UaW1lVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzQ0YTg1N2NiZGYyODI5MzBiOTUwMGJiODVhYTBhMzM0NTBjZGY5NTQ4ZmFhYmJiYjFkNWQ1NDkyM2U0ZWEwYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50Q3JlZGl0RXZlbnROb3RpY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzhlNDBhNTdhMmQ4Y2JjZjk1NTFiOWNiZTJhZGIzYTcwYjRkYzAxZmYzNGYyMjkxNWQ2YmNhNGIxOTNlMWI3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50Q3JlZGl0RXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxZDBmNGJlZDFlYzRhZmY0NjlkYmZlYjdlOWMxMWZlNTg0M2FjYjE5NGFkYzE2YWE2ODQ2NzViYzgwOTI0MjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudERldGVybWluYXRpb25NZXRob2RvbG9neS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjJkNTJiNmNiYzY2M2YyODUwZTdkN2I5NjQzMDBhYjY4YWQ5MDYyNmZkNTZiZjkxMTIwN2U2OGM4YjU2OTQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRGYWlsdXJlVG9QYXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE3YTVjMDBjOTI4ZGIyODdhMDIyZDVjN2UzNDA5ZDM0YzY0NGM3ODVkMmFmZWYxYjE2NTVlNGQ4NTJlNTAxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50RmVhdHVyZVBheW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDU3ODBiY2YwYmQyY2M2ZTc5YTBjN2I4YTJiYWI0MTg4YjI2ZDYxY2RmMjdjZjkyMTg1MDc2ODQyNjM0YTE5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50RmllbGRXaXRoTWV0YU1hcmtldERpc3J1cHRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3NjUyZTI5MzFkM2RkM2I5MmQyYWViM2MxMWI2MDNiMmVjZWQyNzBhYjJhNDYxN2U1NmFiMzMxNGI0YTM3MjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudEZpZWxkV2l0aE1ldGFSZXN0cnVjdHVyaW5nRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYmMyMjBkM2Q3MjRjZDRiMmYyZTM4MjI4NTY3YjI4MmM5NTJmM2E5OGM0YmQxMTdjZmMzM2U4ZTFiZTY2ZjlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRHcmFjZVBlcmlvZEV4dGVuc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWVkMDVkZjUxMjA0YWJjNGMzZTlhYmUwNmFhNGZmNWIxOWZjYmViMjdlMTQ3YzlhYzdiZjU5MTlkZDNjMTQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRJbmRleEV2ZW50Q29uc2VxdWVuY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjMDc5MDA0MzU1Yjk0M2QyYWI2YTQ5M2Q3MjA1NWYyNjVmZDU1NTUxNjhjOWI4ZmMzMDJlNWZjODVmNmE4ZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudE1hcmtldERpc3J1cHRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkOTY2NmJlZmM5OWFiN2VhOTg4N2RiMmNjM2NkZGYwM2RhYWZkODg1MDMxM2ExMGEzOTI0YTM0YTBhNzljZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNyZWRpdEV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNTE0M2Q3ZGVlZDM2OTJiYTFlMWM4ZTZmNzcwZTA3MWIxYzY3N2MxNzUwMjA4YjRmODcyYmYzYzdiMWY1OWNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFPYnNlcnZhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMmM5YjIwM2EwYWQ0MzJiYjU0NzBhZDEzMjk1YWM2ZjY3NTg5MmQyZDBmNWUzMGNkNTliZWQ5NzM1ZmY0MGIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRPYnNlcnZhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNjZiYzUyOTQxZGM2ZDE5ZGI4YjZlMzQ0ZDFkYWIwNDYzN2M0MGNkOWNjZWI1MjM4MmQ2MzQ2MWQwMzhmYzVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRPYnNlcnZhdGlvbklkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDkwYjViZjBkZDNiMTQwZjFlYjllZjg3MzZlZGNjMDQwZmViNjVjMmJmNjE1YTI4ZTY2OGVkNzc3ZGI3Njg3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50UHVibGljbHlBdmFpbGFibGVJbmZvcm1hdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZGFhMjhlYzgwZmQ4ODJiY2Y4OTdiZDZmNTY5ZDU1YzJkNGE3MzU0ZDlmYTYzNTJkNjZkN2Q3ZWU0MTY1MWYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRSZXN0cnVjdHVyaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxN2M4OGQ3YzUwNTJkMTQwNjZkOWNlN2UzNGJmN2MwNzQwYzcxZGUzNjkwZjJkNWY3NzM2YjIyMDkzNmJiODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudFJlc3RydWN0dXJpbmdFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhODdmN2UwNjE3ZWM2YWU3Mzk5MTM1MzVjN2JkMTZiYmU1MTFiNjgxNzEwYjI1OTFmNGM5ZjJkNzYxNmY1ZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudFNoYXJlRXh0cmFvcmRpbmFyeUV2ZW50RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2M1ZjUyOGZlYzIwYzAzOWEyN2ZjOTE4MTdjNDdlM2E4YjJjZmVmZTI4NDY0MmRjYTgxNjI0N2QzYTA2YzQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRUcmlnZ2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1M2NmZTU1Nzg3ODEwYTdjMGM2OGFmMTdjNDhiY2QwZTkyNDBjODk2ZDRkZmEwNGUyNDM2ZDA5NjZlNWJlMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudFRyaWdnZXJFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OGYwZGI5YmVlYzE0OGE1YWVmODY1YjE3ZWM2ZWYwYWZjZTgzM2VjNDZhOGIyYmI5Y2EzNmNkMGU0YjEzNzEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRUcmlnZ2VyVGltZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmNmJlOTNmYzUwMTQzYzFiMTI5YmY3OTA2YmUwNzA3ZjQzMmRjMDZhYmU5MmY4NzFmN2YyMDI4ZmFhY2Q2YmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudFRyaWdnZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGUzMjdlMWNmZDExZjM1NGZhYTVjMDM4ODQ4MmJiMmU4YWNlZTZiNTkzNDQyYmQwNTg0M2Q1MTZlZTAzMjFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRBZGRpdGlvbmFsRml4ZWRQYXltZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZTBhYWY3ZDBlNjhmYzFiMWFiMmNhMmVhOWI0Mjg1YzE4NDY0YjFhMDNkNjJjNTE3NTM0ZjRmNDBiNmUzNTkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRBc3NldERlbGl2ZXJ5SW5mb3JtYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGZkNWQwZGUxZDEzNmExNTcwMmU2YTBkNmRkYTcyODZjNmM1YjQ0NzI2Zjc3YmRiMzFlNWVkYjMyYTYzNjExOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QXNzZXREZWxpdmVyeVBlcmlvZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI4MDE5ZjUxODBkNGJjMzk0YWJkNWQzYTE5NjkzZDM0YTBjOTE3ZWVhNTNhMDQ1YTMwODM0Y2ZjMmRhN2JhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QXNzZXREZWxpdmVyeVByb2ZpbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjgyOTdhY2FlZWYzNTAwZDUwYTY4YWVhNTdhNWM2MTEwNmJlMDhmZDZjZmJhMGM1NmE1MDMzZWU4ZDgwYWI3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QXNzZXREZWxpdmVyeVByb2ZpbGVCbG9jay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZGQ1NWQ0MzU5Y2NlMWZiY2ExMzUxNWM3NjVlNzY2MDQ3OTY1YjM0OGI2NDEzMGZkMzJhODNkZDBhYzkyNTg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRCYW5rSG9saWRheVRyZWF0bWVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY2NDQ2YmFlMDEzMGNiNzkwMDgyMWZhYzNmNjNlYzk0NTE3OTYzZWNmOGMzZDczM2Y2MWY2NjYzOTc2ZTU1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QmFza2V0UmVmZXJlbmNlSW5mb3JtYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzRkNzBmNmQ0MjNjYmYxYmI2MWFiMmRhNWQ1MjM0MDYxNjI2ZmY1ZTVmZGZiMzgzMjQ3OTg3YjJhMGVmYjE4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Qm9uZFJlZmVyZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjhjODg5YWJiYzdiNGI0Yjg4Mzk5NzM2OTA4Njg4MGI4MGZkMzdmMWMwMjVkMjQxZTU5MzkzZjUxMTZhZmU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRCb3VuZGVkQ29ycmVsYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTA1ZWE2NTc2ODJjMzgwZjhmNDc0MmMxMWRkNmY1OTEyZDcyMzU3NjI0YjUyYTM0ZGFiYTgwOGE4MDkzZGI2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Qm91bmRlZFZhcmlhbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImFlMDY2MTg5NTM0YWNkMmExMjdkNjYxMjlkNDUxNzljMWFmYWNhMGU0MjFkNDcwYTc0MjA1OWFmNDc3NGI2NzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldENhbGN1bGF0aW9uU2NoZWR1bGVEZWxpdmVyeVBlcmlvZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM0ODExZWQxYzYxNDk1YjEzZDUxN2IyMDU0MDFkOWMxMDAzNGUwOTU5MjcxMzU5YjVlOTQ3ODRlMmQ0YWZhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Q2FzaGZsb3dSZXByZXNlbnRhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzA1ZDRmNTI1ZWJiYTdjMmE2YWRhYmUxNGYyMGVkNWU5MDVlMjQxOTRmMzVkZTgzNDM0ODAyMzNhODdhNjg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRDb21tb2RpdHlQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhjOTMwNDMxODdiMDgzYmQ2NDZjNGQ4MGYyZTgyN2Q2MDMzMWQxMzdiMzYzZjcwMTcwNWE0MmZmNzkyODIxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Q29tcG91bmRpbmdNZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwNWU2MjQ5ZTZlYjhlNDExNTVjYWJlOWI1ODNkYmM1MjUwNmY3OGRlNGFlNzIyMjYxNDZiZmExN2UyZDJhOWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldENvcnJlbGF0aW9uUmV0dXJuVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTM3NjVkMDdhMTJlNWQ4NThlNDZiMGFlNGU1NjczZmEwMDM2YzQyYjg1MDI3OTYwOWI2YzI1ZmIyYjM0ZjZjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Q3JlZGl0RGVmYXVsdFBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTY4Zjg5MmFlYzAzN2VhNTIxNDAwY2Y0NDI2NGZjY2U3MWJlNzNjMWQ0N2FmMWRlMmNhY2IxM2M5MDVhMTExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRDcmVkaXRTZW5pb3JpdHlFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImExNzVhNTI5ZDFiYTVlMmM3MDQ1MDExZjUwMTFiMmU1YzM4MTE3NWEzNjE5MDY1MzkwYWU5OWE1MTI5NzJhZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERheURpc3RyaWJ1dGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODkzNjE2ZDY2MTg3MGI0NTI3YTFjMDIxZjQ1NzBhZTE2MzQ5NTg0MTg1ZjEzYmUyOWEwYjQ5ZGRkNmZkNzNjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGlzY291bnRpbmdNZXRob2QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQzZDU2YzJlNTc1NmM1NWZhM2FjNzFlMzA4NjljZTNiYjA4YTFjZWU2NWY0NjQzMzlmZGFkNWE3M2Q0ZjQ4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGlzY291bnRpbmdUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YTEyODEyMTAxZmE3ZjljN2JlOTFmM2ZkYzYxYTI4ZTY5ZWJiZDZlMWExOTAzZmU4MDliYjYxMDAxNzQ5ZDY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZEFtb3VudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczMjhmZjkwZTRiY2RlNWE5MDI1MmRhOWFjMTZmODAxZjQyYjcwZWQ4YzI1ZWFmNGViMDM1NGEyMzQ5ZjQwMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kQ29tcG9zaXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1NTU1NzcyYmUwNzAxZDQ2ZGI0Y2Y4OWZlOTA3MTljZDcwZDc4NjdhZWMwMWFkMTczMTliMDkzMTUwYTk3NjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kQ3VycmVuY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU0ODdlOTVlMjVhM2ZiNjllMGZmNDU3NzE5NTQwYzgyZmM5OGMyNWMxYmEyZjRjYjBiZGE1MjM1OTNkMTYzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGl2aWRlbmREYXRlUmVmZXJlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3Nzk2Mjk2NDgyNTRmZGFjZWEzMWE3ZTcxNTY2NTA3M2I0YzFjNjU2ZWFjMmNmNzdmN2YwOTY2ZmNlNzhhZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kRGF0ZVJlZmVyZW5jZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWQ1Y2ZkNWNiM2M1YTc0Y2ZlNjRhZDMwMGM3NjU1MjQ5OTQ0N2E0Zjg5OWUzZmE4NTA3YTU0MjJmOGZkNmY3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGl2aWRlbmRFbnRpdGxlbWVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmIwOTMxOGY4ODk3MmJhNjNjZTQ0ZjlhNjM5Nzc4OGE1ODBkYTUwNDEwYjk0NDllNTNjM2MzZTA2ZmZiZGY0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGl2aWRlbmRQYXltZW50RGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGYyZDY0YmZlM2QzNzMwNWJjMDZjZjhlZmY4NTBiYjU5NjViN2ViODI0MGMwNzUzZGQzMGUyNzVkMTYwZTJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZFBheW91dFJhdGlvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwZDcwODhkZmUzZTViNjIwMzI3NjRlYzkwOGIxYjJlNWQ4Y2MxZTRmODk4ZWNiOWE0ZGY1NTg1MDlkN2NjMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0MmUyMDEzNGFkNmEwMDk3NmQ5MDQ1NTNhN2I2OGExNDE4N2YzODg4MDk1ZjYxODU4NGI5MzM5ZDc3YzNmYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kUGVyaW9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDczMDY3MzYxMGQyZDA0YTg1YTQ0ODNmY2RiNTBiZGM4ODgxODRmOGIyNjBmMDY4YmU4NDAzNDczZTc2ODU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZFJldHVyblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjI5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4MGRlZTNiZDE3MTExZTcyN2U1OTIyOWZkZWViZWI3MDI5ODYzOWM2YmU4YWQyMjVmYjk2ZGQwNDhjMTEyNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEVxdWl0eVVuZGVybGllclByb3Zpc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWE2YTQ5YjEwYjk4MDdkOWRlNGI5Y2RkZDU3YmM4MWU3ZGQ5OWU0NzNhOGI2YWM5MzQxMzFmMWY4ODYwNzhhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RlBWRmluYWxQcmljZUVsZWN0aW9uRmFsbGJhY2tFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1ZjY1YjZhYzU3ODBjMWYzMWE2ZjI1YTEyOWI0NDg0YjgxOGNlYWYxMjU3NzYzOTQzNmQxMDFmZDQ2Mjc4ZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZpZWxkV2l0aE1ldGFJbmRleEFubmV4U291cmNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNjZiMTJkZGZiZDg3M2JkZDY1MTgwMTU2Nzc2ZjIwYzYwMzRjNTQyM2NkN2YzM2UwZTZkNzhkMjc3MjY1OWZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGaWVsZFdpdGhNZXRhU2V0dGxlZEVudGl0eU1hdHJpeFNvdXJjZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGNlNWYwNzIxOTQ2Y2Q4YTVhNDc2NDE2NzkxNDk5MGE3Yzc4OTcyZDNiZWE4MDZmZTZlN2M4ZWQzMTMzOTMzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmllbGRXaXRoTWV0YVNwcmVhZFNjaGVkdWxlVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI5MDJlMGNhM2MyNzkwYmU2NTcwMThiODY4NGY5MDk0ZGMxYmM5YmMxZjA3MGU4ZWFhMThiYWQ1NzlmMmY2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmluYWxQcmluY2lwYWxFeGNoYW5nZUNhbGN1bGF0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYzliZTBkMWRhY2Y3YjFkZWFiNmIwNjkzZWIyNjAzODUwODFkYzZhYzBjOGRlYmQ2M2Y0Y2NhMzYzMGQ5ZTU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGaXhlZEFtb3VudENhbGN1bGF0aW9uRGV0YWlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMDMyMDVlOGZkZWNhMDk3OWFkOWM4MzM4YThmN2JkMDEwY2NkNmNjN2I2M2YxZTI5NDdhZWQyNDRkN2NhZTZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGaXhlZFJhdGVTcGVjaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImFiODMyOGIxNTI0NTliYmY1NWFhYWI2YTU5ZjgzOWQwYmU1ZTM2NjE2MzY5ZTUyNGNkNWY3ZDI1MzYxZTZkZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5nQW1vdW50RXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0YjgyOTRhNjNmNTBmOGY0ZmY5ZjJkN2Y2MWFmMDNmMDUxYThjZTRmMGE2OGRkMmVlMjljN2U1M2M0YjE3ZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5nQW1vdW50UHJvdmlzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZjliZjVkZjZhNGZmNzg1ZjFjOTVmYzAxN2NiYmEwMDZhMTBmMjA0MjUzYzFkODMzMjY5MzA3MWU5ODgzNjA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGbG9hdGluZ1JhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2U2YzQxNzcyOWE5MTcxMzVmNTY3YjhlODgxNzMwMWMxNzNjZDBjN2UxYTRhNWMzOTRjMzlkNjgwODRkMjA1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdSYXRlQmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWIzODM3ZTJmZDA4MTAzZWM3MjQzM2JiZjQzYzljZjhhZDdjM2JmZjgzMTViODhiNzcxN2ExY2RjYTFlYTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGbG9hdGluZ1JhdGVEZWZpbml0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwY2QwZjE5ZDdjZDg5OGNhOTg2ODliMjlmYWI4ODllNzBiODdlZTk5OWU2Y2M0NjU3NzNjZDg2OTllMDllYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5nUmF0ZVNwZWNpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzFhYmQ5M2I2MTEyMGUzNzZjMThkYzYzNDM0NWUzN2VmN2NmYzIxY2MyYmIxZGQ1OWU5YTlmODViMDBmM2U0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdyYXRlRmxvYXRpbmdBbW91bnRDYWxjdWxhdGlvbkRldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODNhYWZhMzEyY2M2ZjNmYzIzYzI4ZTg3NzJhYzFiZGUxNzhhNjg4ZTYyYTZkOTBkNWE0ZWMyN2QyOTQ1ZWQ0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlSW5kZXhQcm9jZXNzaW5nVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODJmZGRiMTI0MTc1NmIxZGMzYTQ1NzEzZDdmZTFlZTFiNmY5ODVjOTc0ZGUyZTdlMTRjYjllMzYwMzc5YzZlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlUHJvY2Vzc2luZ0RldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDBiNmFjNjYzZTk0M2JhOWFjZDdiZDU1MzEwZjA1M2E3YTIxNTMwYWUxYmY0NGRmNTgxYmRlMThhNDFiYWEzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlUHJvY2Vzc2luZ1BhcmFtZXRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjY1MTczZGMyODQwMTUxMDQwNWI4Zjk1MzE0OTdlYzc0NjAzMTEwY2QzMGY4ZDVmYzQ0NmU3ZTAzNDYzZTQ0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlU2V0dGluZ0RldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGM3MjI5NTExZjc2Nzc0YTQ5YmRiN2UyN2NkMGM4NTlhYmM1MzBjMmRjODQzNTczZTQ5MGU4NmUyMmFlOTY5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Rm9yZWlnbkV4Y2hhbmdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0MjQ5ZDkwNDQxNWE2Mjk5OTM1OWI3YzFjN2Q1MjZkYmQ3Zjk3Yzk4Y2U0NjAzYTRmNDg1MmNhZDI5ZDU2NDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZ1dHVyZVZhbHVlQW1vdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyOGUyYzFjMDQ0NTg4YjAwM2QwYjE4ZWU4MTgyNTBiZDY2YzU2MmYwZjY2MzczMDgwMjU3Y2E1ZjYwN2Y1MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEdlbmVyYWxUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYWMxNTY3NjRhOWM1YWU0YjIyMTA3M2Q5MjJmZGY0M2JjMjRhMDE1NzdmNDcwYmUwZTM2Yzk2NWRiNWJiMjFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRJbmRleEFubmV4U291cmNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmY4ZWUzMWE0ZGNmODczYzQ4YzcwY2I4ZmIzYzM4NDYzYjc3NDU3MjNmYWU4MWE0YzVhMmQwMGRjNWE3OTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRJbmZsYXRpb25SYXRlU3BlY2lmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDViNTIzOTIwNDVkNjY1YzI2YzhjZmExNTMyMDJlYWY3Njg2OTQyOTcxYTJiMmQ0ZTU3N2EyYWVjNjkwYzBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRJbnRlcmVzdFJhdGVQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWYzNzM0ZmRiZmU5NWVmZDA2ODZlZjQ2Yzc4Y2IyMmQ3YTc5MjQ2Mjc4ODYxMDg3YTQyN2M2YjRiZjQ0M2QzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0SW50ZXJlc3RTaG9ydEZhbGwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWIwOThiMGMyNGY0OGU1MjRjYTAwMDIwMWNmNjEzYTJjNGM5ZjhmMjU1ZThjYjcwNDU5NGE2ZTUxOTlhMzJkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0SW50ZXJlc3RTaG9ydGZhbGxDYXBFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmMzdjYzBlZmQ4ZTE4MDkxNTI2NTQwMTgxMzE0ZmIxODk5ZTAwYzZiYjAxNzE2NTRmODM4Yjc0MWU1NjNkOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldExvYWRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjZhZTE5N2RiNTk3M2Y1M2IyOTcyMzI2MjcwMzg2NjE2ZWY3MmM1OTBiZDgzNWMwZTA1ZGVkODQ5NjE1ZDhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFGaXhlZFJhdGVTcGVjaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczMzU3Mjc4NGU4MzhhNTdkMjBmNDZjY2RhMGQ1OWRjMGU2MzlkMWZlYmFiYjQxMzAzN2Q3NTNmMzg5Nzc0NGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUludGVyZXN0UmF0ZVBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTEyZWM3NTRmMDk4ZDUwMjBhMGJhYTI5M2RlYjkyMTc1YmZhNWU3Mzk0OGEwYzZjOTE1YjllYTk2ZTNmYzc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQcm90ZWN0aW9uVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjVkMWI2MWIxNWJlZWM5ZGQ1Njk4NDQyOGEyNGNmODM1OTRjYzNjODc4YjY2ZTk0NDViZDJiMmRkNGEwZjFjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0TmVnYXRpdmVJbnRlcmVzdFJhdGVUcmVhdG1lbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxMzdiOTg0MWQyNDg2YjRjY2Y2NjMwN2FlMmFjNTE1MjQ2YWNmMDJhYzc0ZWM3NjUyYWVmNTllMTQ2Yzk4N2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldE5vbkNhc2hEaXZpZGVuZFRyZWF0bWVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjc4MzJkYzcxNzMxZGY1ZGVhNWEyN2Y1ZmZkYThiMmE5M2Y0OTRmMjhhNTZmZjY4MzRiN2EwMDhkMDIwYWM3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UHJpY2VSZXR1cm5UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzZkYmExNTg3MDdiMDI4MGIwZmFmNmIwMzRlYzU5YmI0NzAwYTcwZTNiOGM3NjcyNmIzOTA4ZDY3NzBjYzFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRQcm90ZWN0aW9uVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjQ2MzhiMmFjMmM0YThiYjYwZWExMTI2ZWZiNjM1MTRlMmE0ZjQ5MmE5ODQwMGFhMzNhYWRmYTMyYjUxYTRlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmF0ZVNwZWNpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJhMTIyMzY2MThmMDdkNTQyYTA5YTE1ZjUwZTEwOTUwODBjODY2NWIxZjNkOWUxMDI4MjE0NmQyZTA3Y2EyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmF0ZVRyZWF0bWVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWNhYTRlZjdmN2I2ODI3YmNlZmVmZjI5YzNiMzFmYmU1OGIzNGY2MTU4M2Q5YjNiNzI1NDU4NWM0NDg4MjA2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmVhbGlzZWRWYXJpYW5jZU1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjAwYjM2Y2IwYzBiMGVjMDU0MTZlZTNhODcwZmMwZGJhODhjMmYxYzkwY2Y3ODU1Yzg0YjdjM2Y3NjVhMjQwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmVmZXJlbmNlSW5mb3JtYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTM1YjE1NGQzOTBhNzZhOWE2OWI3MWFlMDgwZWU1MDQ3MGNjZjI2ZTE3ZTUxZDk5NjI1N2MzZWM4OWUzNTE2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmVmZXJlbmNlT2JsaWdhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTUzNzU2YTBlYjE1MmI0ZTgyNGY5OGUxNDhhMjA1NDQ0MzNkZTYyMTVjYWIzMTA5ZmEyMDc0MWEwNGY4Y2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRSZWZlcmVuY2VQYWlyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjZmM4NjU5NzRjNGUzMzZhZmU1ZDRhODQ0ODgwNWNiOWVlMDM0N2E4NTJjZGNkNzg0ZDQwZDg5ODE4NjZjZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJlZmVyZW5jZVBvb2wuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTc0NjM4YjJkNjZmZGE2NTdhNzEyZGJmNTdiZmI4NDg4ODNjNzY2NzdmMjVhMTA4YzEwZGUxYjVjNDM2NGU3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmVmZXJlbmNlUG9vbEl0ZW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU0YWI0ZDM3N2U3MzdjZTM0MzczYWJhMjEwYWRkYmE3MmE2YjYwM2FkM2ZlYjJiY2MyNzg0ODk3YjQ2YjNhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmV0dXJuVGVybXNCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3NTUwZjIyMmJlMzUxNjQ4NTRmYmY4ZTJjM2FlYzcyNzdmMzcyZjhhZTU1YjViZWEwNGJlNWUxYTE3YTAwMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJldHVyblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzMDgyMDFlM2E4NWMxNmRkY2I0MWU2MzIxNjg5ZDljMjA3NGJhMDNmNDRkNWM3MGJjYTNkMjBhNTRjOGY5YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJvbGxTb3VyY2VDYWxlbmRhckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjRlNjllZDY4NmZhMzM1YWM1M2UxZWJiYTMwMDczMGYxNzMzMDBjMjc2MDMzMzViMzVkMzM2OGMwZjdkYWM3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0U2V0dGxlZEVudGl0eU1hdHJpeC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjODExNWY3MTdhNTMwYjBkYmM5ZTFhMWFmNzc5ODUxZTZmMzRjNWZkODEyMTNlYTZhZTczZWNmNGMxNmVlODY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRTZXR0bGVkRW50aXR5TWF0cml4U291cmNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMmZmNTdlODRlMGRiMjA1MWRjNWRjODM0YWJhMjA4Y2QxYjYyNzJlZTc0NDhiNGFjMDhjMjk1MWNkYzc3MzRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRTcHJlYWRDYWxjdWxhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzJmMjY1OWVhOGNiZjUwNWJmZThkNzU4NmI0MmQ4ZTk3YjM5Y2M4MTkzZDUzMjQwYmNmMjg3YTAyOTRiN2I0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0U3ByZWFkU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3N2IzMDI1YmEzMjcxMDEzOGMyMDM3NDZlMGM4YTc3MTA2M2RiOWI1MmMwNzQzMDVmNDY2YmVmNmIyYzI1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0U3ByZWFkU2NoZWR1bGVUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDQ4NGU3N2IxNjVmM2Q4ZTEzYzQ0MGRhYmVkMTAzYTllZjY1MTEwYjNhOTEwNjBlNTRkYzcwMWFiOWEzZGJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRTdHViRmxvYXRpbmdSYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImQyNGE2ZTQ1M2FlNTAwNjdhMDAzMDg1MGEwNjA2Yjk2MzQzN2YzZTkyNzg3MjE1NDFhZmFjMTc2ZDI4YmVjOTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFN0dWJWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDI1NTA0ZDBhYmVhOGRiMjM1ZTRiMTM3NzRlNmU2Yjg0ZTEzY2Q5MWE1M2Q1OTIyZTgyZWE1MTM2MjUxNmEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRUcmFuY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjYzE5MmU4YzhlNTI1ZGM2OGZlNjFiMDE4YmU1YmVhY2I4MWU4ZmIzNjM2MGI2YzJhODRlMjQ3MmI4ZWYwNGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFZhbHVhdGlvblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyZTAxMmFhZjYxZDM4N2VmZmFmNmUxODIwNGVmYTRlOTg3N2M1NjFhZGQzMTJmNGE0NjgyZGZmZWRjOGVhZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFZhcmlhbmNlQ2FwRmxvb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDhhNzY4MDdmY2JhMWEyMmEzNjhkYzkzNjU1MzI3NDdmODgwYTAyMmUzNjk2OTFkMDE3NzFiY2Y0MWM0NDZlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0VmFyaWFuY2VSZXR1cm5UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NDFiODUwMTA1ZTdjMjk2Mzk5NjQxZmY5ZGZiM2JjZDA1MmY3NTRjZDE5OTcwNmFhNzI4NTc1Mjk1MzIwOTk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRWb2xhdGlsaXR5Q2FwRmxvb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzdjM2YyZWJkOTU2MTcyZDk5ZDY3MTA5YjQyZTRiY2UxMGM4YmViNjEyODcxZDllMjU2M2MwODNlNGM1NmZlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Vm9sYXRpbGl0eVJldHVyblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTczNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzOTI2NjkzYzI4NTY0MGRjMDBjNThkY2NmZmM0NThlYTg3MTI0NmYxZWMyYzllMGI0ZTdhZTRiNWMwN2U0MTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQWdlbmN5UmF0aW5nQ3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWM3N2JmMWEyOWI0YTE5NzY3NmUzNGQwOTk0MzBkYWM1NjViNWVhNWE2Mzc4OWFhMWM4NTYzNWVjZjA2YWFkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxBbGxDcml0ZXJpYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZGYxMDE2OTFlMDAyNDViN2EwYWY1NjExNDAwYTlmNWM4NDhiM2MwNmZkYjI1ZjBlODYzYjNlNTY5OTI0NzhiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEFsdGVybmF0aXZlVG9JbnRlcmVzdEFtb3VudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzc1Mzk3ZDZiZmM5ZmE3Y2MyZWU5MzFjZmMzMjgyNWVlZDI5N2JjYWI0MmE5MmEyOTI0MDI1OWY2YTU3ZWU5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxBbnlDcml0ZXJpYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0N2I3YjhmNTY1YmQ0OThiYTEzZTQ1MDc1YTU2ODI1NDE5YmM4M2Q4YzZiZTkzMWJhODQzNmQ3OGJkNGRlNWQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEFzc2V0QWdlbmN5UmF0aW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlOTE0N2E2MDg0ZjljYTdmZTBmOWQ3OGQyYTkyNDQxM2M5YThiNGM2ZDk0MjVkOWEyMTQ5MmRiYjFjZDJlZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQXNzZXRDb3VudHJ5T2ZPcmlnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTMzNDY0ZjRkN2I0YWU5NDk5OTYzM2ZhYjRjZTQzNmZjMmFkNGE0NjVmYjlmNWQwMzg5MWRmMmEzMjMwMTAxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxBc3NldE1hdHVyaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImI5OTJiMDZiNTA5NGIwNmE2MWE0Nzk1MmUzNDQwZTNkNmU0MDRkNzMwODI0N2JjOTQxZmE5NGU1ZjMyNmMyY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQXZlcmFnZVRyYWRpbmdWb2x1bWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNThmNWMwMDEwODhjN2VjZWJhNzNmNzc4NzQ1ZGUxYzIxYmZkYjVjYTYwMjhhZDM4MDdhY2Y4YTg5ZDkyOWZiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxBdmVyYWdlVHJhZGluZ1ZvbHVtZU1ldGhvZG9sb2d5RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTQ5NTkxMmRjYmZmZWZiMDVjYTIxM2NhZjBkZDU5OTU3NThlZWFiZDFmYmYyZDYzNzU2ZWZhNzNjNTM4NWU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENoZWNrRWxpZ2liaWxpdHlSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM5ZjllYWQyOGUwZDQ0ZWRhMzhiZWIyM2ExYWM5ZTg2YjU3ODczY2U4NjU3NGY2ZGM5ODUyNWZjZjU3MDM0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ZDc4MzY4MTFmNWFlZTE3M2Y5YzhhNDdkMmNkYzRjNTg3MDVlNjE5MjRjN2Y0MWZlNWMwYWZkNDE0ZDBhZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbEFncmVlbWVudEZsb2F0aW5nUmF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjA1NDQ3NmQyMTNiNjM0NmNhODAzM2Q3M2VmNTczODFiYjEwNGNiZDIzNjE0ZWRjODM1MDRlNTRlZGY5NjUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxDcml0ZXJpYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDEyZTNhM2RhYjRlMDg4NWU3MzQ5YmUzZjQ3ODM0MDgwNDA4MmRmZmJiZTVjZTBhYzhkMjlhODlkZmQ1OTEzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsQ3JpdGVyaWFCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjczOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5ZGMwNThhNzk1YTFkOGMxYmM5Njk4M2JiM2U3NzNkNjUxNWFiN2M2YWRhZTRlZGI0YWU1NzZlYzg0NmMyOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0Q2FsY3VsYXRpb25QYXJhbWV0ZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3YmM2YmVmMDQyZTY5NzFiMmY4ZjUzNTc4M2JmN2JlMmEzZmIxZWUyMjYyYTcwNmJhMmI1MWFkMDcwMmQ0NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0SGFuZGxpbmdFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmNjA3YjNlNjM5NjkzNmE4OWQxZTdkNTBjZjRhNjUxOWIzOWU5NmViZDc1NjEzOGQ5YWEzYmZjYjQzY2FiNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0SGFuZGxpbmdQYXJhbWV0ZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3YjhlYzA2YjllOTdjNzFkZDY5NGQyYzRlYjFmYmJhOWViZDQyZTU5M2YzNmZkMzM0M2Y0MTI3N2IxMTJlZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0Tm90aWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjMTFkMjlhNGQ3ZDQ5YWU1OGM2ZDRhMTBiMDJlZDU3Y2U0MjZiMDA1MjBmZTE4YjRkODliOTQ1YWFhYzc0MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0UGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZjVkNTg1MGQxN2NmNjE5YTMyODc5YTJhYjk4M2ZhMjliMGE0YTk0ZjA4ODMzZjQxODNkZWI4OWM2MWE0ZjQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxNYXJnaW5UeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTBiNDg1Y2Q0ZGEyMGYwZTc3ZTYyZTU1ZTcwNmRhZGNmNWVkNGU3YjVlYWRmNDdmNmJmYzRlMGU2NDhiMWYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxQcm92aXNpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwNmYzYzI4NWZmMGNiMGJmMDVjZGRhZmUxODdlZTUxODZjYjk3OGI3MTJlMjAwMDhkZTY0NTZhZTJmZmMwYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbFRyZWF0bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMjZiYjU1ZmUwYmJiOTg4ZDljNGY2Mjc3NDZhZjY3MDAzZGVlOTRlZTVjZGFkNTEzMjhkMzkwNzI5YmZmZmMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5N2E3YTJkMDExMGRlMjdmYTZmOWJhY2FkYmJlYzMwMjdlNTk0MGI4ODIwZmUwMTcyZDk1NDlkYzBjNjllMGIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxWYWx1YXRpb25UcmVhdG1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDA1MGI3YWIzOWRhMmE3NTdmNjdiYjkwOGYzMzM0ODgyMTNhMGI4M2FiY2IzNWVlYWRiNzA1OTAxOGEzYWFjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb25jZW50cmF0aW9uTGltaXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjhjNzZmNGY4YzVjMmQ2ZjQ3MDk5ZjBiZTg3ZDZjOTBmNDk4NzVkMzk2YWM5NGI4Y2JjNmI4ZjRhNmNmMjE5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb25jZW50cmF0aW9uTGltaXRDcml0ZXJpYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzdjNmFhNWEyMDVmOWU4MTYxNmFhOTM0ZWQzZTAyMDIwMjU0OTVlN2I1ZWI0YmY1NDFmNzQyNzI2OTQ3MWEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbmNlbnRyYXRpb25MaW1pdFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2NDIyMDEyNDFjMWFhNmZlMTgyYzNlNjVkMjRhOTAzYjhiN2NjNjcwYjUzYTdhMTZiZGE2YjQ1ZTc2YjZiY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29udGFjdEVsZWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYzBiNTI3ZDQ5MDM2MGY0NGJiYzQyMGRhZDVjMmZmYmVlZTE3NzdjZjdiOGM3NDZhMGJlMDQ3YjQzZmM1NTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ291bnRlcnBhcnR5T3duSXNzdWVQZXJtaXR0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzMyMDEyOGFiNzk3ZjdkOTE2Yjk3NjVmZDYwY2M4MWM5MWU1NzAwODQ1OWI5MzE3MmUzNTQ0NTVmOGU3NTQxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDcmVkaXRTdXBwb3J0QWdyZWVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODk4ZDljNTIyY2U2OWE0MTk4MGZhNWZhNWY0OTYyYzk1ZDA1MTE3NzFmOGZjMjYxZDkyZTU4Y2QwYTY4NDFhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxEZWxpdmVyeUFtb3VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjUwZDhkNTI5YjcwZjc4MWY5ZDE5M2E3NjlkNzBlMTA4YWJjMWQzMTllMTllMjUwYmRlMzBjZjE3YjcxNzFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbERlbGl2ZXJ5QW1vdW50RWxlY3Rpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmNGQwNDBjY2UwMWFiYzVjYzY2N2RiZDY2OTJlNWM1NDNkODNlMmZkY2NkMTVmMjljNDU1NzBjNDIxNTAyZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsRGlzdHJpYnV0aW9uQW5kSW50ZXJlc3RQYXltZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImYyYjgxYWE1ZTdmYmJlYTZkNzFlZjJlNDU2MmI2YjFlNDhkYmU5YzllZjg4YzFiNWJlMzliYjUyYzMyNDM3ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsRG9tZXN0aWNDdXJyZW5jeUlzc3VlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDY2Y2RhMDc2Y2I0MWIyMjFlNzQyZjA1OWU0ZmMxZWM2YTUyMWM4OTM5YmJkOWNmZDIwYjE3OTA5OTE2MWVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEVsaWdpYmlsaXR5UXVlcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDI0OWJkOWViOTg5ZGQ2Yzc2NzllMzllZjRlMWZjZWZkMGIwYjhmNTQxODVmMTA2ZDY0N2Y1YTk3Y2U0Y2Q4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxFbGlnaWJsZUNvbGxhdGVyYWxDcml0ZXJpYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNGZjZjExYzM1ODlhZWExZDQyMmQyMGU5ODliMWE0ZDc5YzUwZmE5MmRkYThkZDFhMTVhNGZlZGViZmUwMTUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEVsaWdpYmxlQ29sbGF0ZXJhbFNwZWNpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjEzODA2ZWNiNmFiMTM0M2U3ODIwZDcwMDVkNTUzOWViMDM5MjUyMTYyNWIwYjBlYjUzNjI0NWMyZjEyODNlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxFbGlnaWJsZUNvbGxhdGVyYWxTcGVjaWZpY2F0aW9uSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFmOTY3NmEzNjA0MGU1YTgwY2YzOWFmZTZiZmVkMmY0NzUyMjdhMzcwNWI3MzcyNDJhZWQ2MmE4YzI3YjQ3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxGaWVsZFdpdGhNZXRhQ3JlZGl0U3VwcG9ydEFncmVlbWVudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5NTUyOTM5ODYwOWFmY2ZiNzIxN2Q2NjQ5MDEzNTNjODRjMWY2MzRkZDQ0NzZjZmIyMjk0ZDRlYmY2MTk5ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsSW5kZXBlbmRlbnRBbW91bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjcwYWIxMmE2YzMzOTUzN2UyYjNiYjc5M2JhNzVmOWM1NzVlYjMzZWRlNjM3N2I1MjQ0NjQ0NGMzNTFkYWNlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxJbnRlcmVzdEFtb3VudEFwcGxpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxYjk3OWQ3MzBmMTQ0N2IxM2NkZGI2OTRlYjhlZjlkYmZmNDM5OThhZmEwNmI0YThiODk1YTViN2Q5NDBjOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsSXNzdWVyQWdlbmN5UmF0aW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUwY2QxYTdhYzE2ODgwYjdiN2UzNmQwMTliZDQ0NzA2MTkyNDNiN2Y4M2MyMzk1MjY0MzBiYjQwNTZiOTFhZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsSXNzdWVyQ291bnRyeU9mT3JpZ2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwMTUwYmU0MGQ1NDY3NDllODg1ODAwNjNiZjEzZmRiNjYzOWNjMzFhNzQ4MmJhOTViOTFhZDE5NzgyNTg4ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsSXNzdWVyTmFtZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmM2YjkxYzI4M2FkYzM2ZGYwMzk5MzIzN2UyZmE5YTAxMzkwZDFjNjk3ZDYyOWIxYzljNWMzNWIyOGI3NGZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbExpc3RpbmdFeGNoYW5nZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2I5OGM3YTg4MGI4OTdjMWY2ZjNiZjgzNTExZDhkMTBhZjc0Y2VjOTgwZGViMTY0YjdhZTJmYjVmYWZiZmU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbExpc3RpbmdTZWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYThhOTVhYTI1NTVkMzk5YzM4ZTMzZDNmNDZlN2Y3MWIxODY2ZWM1MjAzOWI0ODljZGI1NjUwZDlmZjdlNWVlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDb2xsYXRlcmFsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ZjczMzAzZDM1NGU0NTBiODg5MjljMTY1YTZkYjRjMDBmMTA5OTNhNWRkMDBhOWY4Yzg0Y2Q1OTExYzk3YTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsTmVnYXRpdmVDcml0ZXJpYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMWFhM2I4NWNhNDFkNjE0OTA2NjY4MDA5MWM2MTU3NTBjY2Y1Yjk2OGRhYWRjZjg2MDQzYWIxNzg5OGIwNmNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbFJhdGluZ1ByaW9yaXR5UmVzb2x1dGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJlYWRjNTJkYmFmYzZkMTQxNzkwZDI2NWFkOTBkNGRjMmEwMTFkNTI4M2Q5NTZjZDQzMjkyYTUzOTBiOTkyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxSZXR1cm5BbW91bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJlM2E3YzcwMjkwODU5NTY5ZmNmOWIxNDBhMjZjYmE3MWI2ZTZhMmU4MzM5YjA3NTE3ZTQ1OGRhY2M1ODFmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxTb3ZlcmVpZ25BZ2VuY3lSYXRpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQwZDkzYjE4MzcwZGZhZTNhNjFiYWRhY2QzMzAxMGE2YTBhYjIyMjYyZDRhYjBjODQzZTFiMGRmNjAwMjc2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxTcGVjaWZpY0Fzc2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxZGY2NWEwZTkyZGVkZWYzMjVkMTk2OWUzNjY0NTEzNmI1ZDU4ODg3ZjJkMjliYTU1YTE4OTNiZTg5YzU3MjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsU3Vic3RpdHV0aW9uUHJvdmlzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjJmMGQ3NzMzMzM0MWY4MDVlMTYzOTVkMmJiNjhhM2JhYjY3NzQxODI5OTBlNjgwMDM0Zjk4OWJmZGNiZTcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uTm90aW9uYWxBZGp1c3RtZW50RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMWY2ODlkM2YyYmYwYTVlYjNmY2Q3YzA3MTg4MDcyZDc3ZTUyNmIwNjJjYWNlODg0ZjExMmI2YzlhOWYxZDJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVBbW91bnRTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjODFmOWM4OGJjY2NjZDU2YjJhZmFjMWQ1YjE4MTE4ZjNiMmQyOWJiMmYwNGU1ODkxODM2ZTJiMmI4MjExNDZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVBdmVyYWdpbmdPYnNlcnZhdGlvbkxpc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmViMzYwYWU0MzJjYzU5MDFiODUxNTA4NzFmZWIzYjc5MTdhZWI3MjVlOWU2ZmIwMDcwZmI0NWI1MzhkMmY3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlQXZlcmFnaW5nUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViMTYyNjExMTUyNDI0YzQ4MWE2MmExYmQ2ZDc0NjAyODRlZmIzZDFjMmQxZTNiZWJjZjM5NDMxMDExNjY5OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4MGFlMmJhOGIxMTk4Mjk4ZTI3YWE1ZDBmYTFiNTdlNmI5YjUzMzBlN2JlMzQwMDQyOTQ1OGE3ZDk5NTIyMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kQmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTBkN2M5ZmM5MzhkNTU5ZmI4N2E1YjZiNzU4OTE2MzI3N2VlODY5MTUyMTcyZjVkMDMxZWE5OTQ1YzE0NzAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVDYWxjdWxhdGlvblBlcmlvZERhdGEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODkzZTQzOGZlYzM4MjI3NTQyMWVmMmIxYjQxMjZmYWFhZjY2MDk2OTE4NDczYzcxYjNlNjEyZmQ1MjI0NDZhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlQ2FsY3VsYXRpb25QZXJpb2REYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZmM0ZWY0MmMyN2M5MTQ1ZjVhODMyZjc0ZTM4MDNlNmYxOGRkN2ZlY2IwMjQ5ZjExMzY3MmIzYWFjNzc3Nzg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVEYXRlUmVsYXRpdmVUb0NhbGN1bGF0aW9uUGVyaW9kRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDczNDUzMjliYzNjNjJmNzIzZDI5ZmI0ZDY2YTc5MjBkYzVkNzYxNDM2NDRlNjRmYWJkYzIyMWI2ODZhNTJhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlRGF0ZVJlbGF0aXZlVG9QYXltZW50RGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJhYjcxYjhmNzkwZjBiYjgyZjQ2MzdkNGUyZjMyY2IxNDEyMWExMTcxODhhYTk1NjlkYjM1NGJhYWUwYzVmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlRGF0ZVJlbGF0aXZlVG9WYWx1YXRpb25EYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNjljZDRhODcwZDFlODY2NjU3MDQ0ZmJkOWY3ZGViYzEwNzY2MjFjYzlhZTk1ZTAwOTU3NTFmYTU5YjAxYmY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVGaW5hbENhbGN1bGF0aW9uUGVyaW9kRGF0ZUFkanVzdG1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGRkZGQzNTIxZmVhZjEzNGVkZjUzYmMyN2JmODdmN2EzYmM5Mzc3ZTNiYzBhNjI4ZjliNWQ4N2FhNzdhZDM3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlRnhMaW5rZWROb3Rpb25hbEFtb3VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZGE5MzM1MmNlM2Q2YWZlZWY4NWU4ZjI5MjhkMjI4ZjRlYmM0NjlkMDg0YWRiYjk3Y2Q3MjgxMmYzMDA2ZDZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVGeExpbmtlZE5vdGlvbmFsU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzJkMDMwMjFlNTc4MjAxYzZkMmZkY2QyMzMzMGZmZjZlZjNjNDk1YzlmNzUzZjk4ZTgwMWNlZGYzNTk1MWVlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlSW5pdGlhbEZpeGluZ0RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmVmM2M4YjlkM2RiM2UzYjk4OTQ2ZTBiMmM4NTJjODk4ZmY2MmUwNTExMGFmNGQ3Mzk2MTkwN2ZkMTE2YzRkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlTGFnLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxNjk1MzJlMDM1YjYyNWZhMGU3MTcxZTNkM2M5OGM4NjBlYjg0ZTIxNGIxNGI5Y2Q1YWQxY2I4MzUyMWQ4ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNhbGN1bGF0aW9uUGVyaW9kRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWNmNWRkOTZiYzNiMjQzNWM0ZGQ2YmJiNmZlMjUzZmFkZTU4M2YzMzY4ZjAzZDc0NTAyYjJhZTkyZTcxMzBlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGF5bWVudERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlYmI4OGVmNmQ4NTE2OGNiZWRlNjMyZWU3OTUyN2I2MTZlMzFhYWU4MmM0MmIyYTc2NjVlN2RmMThhNGE3NWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZU9ic2VydmF0aW9uRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNjNkMDJkMmFkZjM0NTNiZjFiMjQ4M2QzMDUzNGFkY2IyMDMxZjI1ODIxMzRiZjM3N2ZiZWFjZjg5ZjdkMzFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVPYnNlcnZhdGlvbkRhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkMTFlMzA4MGY1NzM5NWQ1NmY5NzQ2OWIwNmFhY2JmZTAzYWEzYzJmN2Y2M2EyMTZkNDk5YWZiZjNlM2RhY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZU9ic2VydmF0aW9uU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGE0MTJkYTYwODJlZTg0MjljM2YzYzMzYjMzMzI4NzgxYzk4ZDlmZmQxMjIyMTFmMzI0N2MxOTcxNjI0OTNjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlT2JzZXJ2YXRpb25UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNmM3ZTQ5Yjk5Y2MyYWEwM2Q4YjU4ZDY2YWY1M2VhY2Q0ZjBmNWRiOWQ2MzczOWU1ZDU1YjA1MTc1OTUzNjg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVQYXJhbWV0cmljRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGZiM2E1MWQxNjNmMzRkMzQ5MTViMGJlOWJkMWU0Mjc1NTgxNmM5MDJmNWFhZWRkOTFhZGU2NWE5YmQxMTc2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlUGF5UmVsYXRpdmVUb0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDVhMzdkZjgwZWQ1MWRjMzAxNDU1NmU1YmIwOTM2MGE0NmRiZjgyODg0ZDBkOWU5ZDA5ZDNhYTg0NjJiNjk4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlUGF5bWVudENhbGN1bGF0aW9uUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhZmQxODUxZTNmMzJjZTE4MDhhOTQzMjAwM2YyMGUxYTMyMTM1ODU1Y2I0ZGJmYTJhNTM1OTE1YzM5MWRlNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVBheW1lbnREYXRlU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWYwNjUwZjA3NjM0YzJhNjQ4OWFkMThiMmE5YTg4M2M1OGVkZmFjOWExNDg4OTMwZDcxZmUzM2ZlYjdjMzIxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlUGF5bWVudERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3OTQ1ZTUyN2JlOGE4ZDU1NTUzNDViYTM2MDAxNTljYmNkZmEyYmRhNzFkZDMwZDhlMTIyOWQzM2QyYjdkYzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVJhdGVTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTUxODhlNDE3Y2QxNWM1MjIzZDU2NjRhNzgwODY4NGE3YjZkNmE3ZWY3NzNlZGUzMDlhYmIyMDAwNTE2NjFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVSZXNldERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2ZmQxNzM5N2QxYzVhYjA0OTA1ZDliM2M0OGQ5YzRmMTk5Zjk4MTg3ZGY4NWI4ODkxMTQ1ZDU4NmY5NTQwM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVJlc2V0RnJlcXVlbmN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4ZWZmMWE5MjMxYWFkNDFlNjkyMmQ4MzNiNzUxM2JkM2ExMTA0OGJhZDg1MTIxZGVjOTRjZmRiMGEyMDMyNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVJlc2V0UmVsYXRpdmVUb0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA5NmRkY2IyNzA0MDVjN2UzZDdjYjE1ZDE2ZmY0ZGUzM2U3MzE0YTUyZjViMDU4NmQwYTUwNDhlMzA4N2UzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlU3R1YkNhbGN1bGF0aW9uUGVyaW9kQW1vdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2NGZhZDVmMjhjYzMyODc3NTczYzkzMTQxNDZkMTQ1ZmQ3NGI3NGY1NjQ4YmY5Zjk0ZjhhNDc3OGFmMDM2MGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVN0dWJQZXJpb2QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2Y4YWVkMDM5YjVjZWQxMzBkNDc0OGM2N2UyNGU1YWNiNTZiZmRjNzE4NDNlYTljMTg1ZjFjMTliYzM3YTQ5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlU3R1YlBlcmlvZFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5ZDYzNDdiMGNiYjUzODU0ZGNlMjRhMDk1NWVmM2VmMDk1Zjg4ZDk4MGJhYzhhYWU4YmQyMGU1ZTFlMGIxYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVdlZWtseVJvbGxDb252ZW50aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNDgwYTdhY2Y4OTA0MmNkNWE5OGIxM2VhNzBlNTJmYWU2NjM4YmMyYmJiOTVmOGQyNzRmMTlhY2IxN2UwMjAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVXZWlnaHRlZEF2ZXJhZ2luZ09ic2VydmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmNjg2YzJhZWI3OTFmMmMxNGUwZTFjYmIxODcxMTI5MzJhNzMxZGI2MTUwOTg3MDFlMTJkZGI1NjFiMTdkNWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50QXNzZXRGbG93QmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTk4YjdkZjQwMDMzYjBlZjMzYzI3MWMxMmZhOWQ2OWJhMWE4ZjI5ZGUzYTBiMDY0NzQzMGQxYmE0NTEwZjA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudENhc2hTZXR0bGVtZW50TWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZDgzMzg5YjkxYzRkZDdhOTdiNDZiYzczMDI3ZGI4MGUxYTc3MmJmM2YwNGVjZmNkYzM3NjA1NjgyZjY1MjhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudENhc2hTZXR0bGVtZW50VGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTEyZGE0MTk4MDAwNWU4YTk5NGJlODI0MDdhY2IwYWJhZmEzNmQxZTUzODA5MWE5NzMzZTdlZjhmMTM0NDViNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRDYXNoZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzg4OWM3MWNiMjM1ZGQyMTA1ZThlMmVmZjA4Mjk4Y2U0MjJjMGY1NWE5NzA5NGE1NDljOGRjN2E5NGYwOTNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudENhc2hmbG93VHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OTYyMmY0OGI5NzU0MmIyZDE1YjVmZWNkNmFiZGIyYWZlZDQ3YWE5OGFjOGEwMTAzZjEyODY5MTJjYTNjNzJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudENvbW1vZGl0eVByaWNlUmV0dXJuVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzllNGE0YjgxYmI5NDYwMzMyMTgxNzg2NzhiZGRlMjI3Yjg2ZjQ5ZjcwNGRlYTcyMGZkZTgxNmYyZGI3NWJjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRDb21wdXRlZEFtb3VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDY3NjBjZGZhNDZmYjc4NDBhZWVhMmM4N2RjMTY5YjNiY2U5NzliZWQ3Y2E3YmM5NDFkYjhhYWM0ZjExNTQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudERlbGl2ZXJhYmxlT2JsaWdhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5Mjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjI4OWIxMTg4MmViZDQzNWFhZjAzNjMwOGU5ODU5NmZmZDEzYjA2ZjcwNDg0YzhjNGQ5MjMxOWNlMTY2ODdhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnREZWxpdmVyeU1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTUxOWVmM2Y0OTFjYjFiYzcxYTE4OWUwYTU2MzExNmI4MTA5MzRmZmRmMWZiOTNiZjI2NWYwMmJiNzUxZGI4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRGaXhlZFByaWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYmUxZGI1YzZhYWQ3NzAzOWRjZTcyZWJhNDgwM2MzNDMyZjgwMzQyZTYyZjJjNDEzODc0ZDRiMDAxNjQ3MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50RnhGaXhpbmdEYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTIyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4NzBkMjEyZGY5MTU3MmVmOTNiYjhjYjBmMmY3MDEzMGRiYWQ0YTQ3MWUwOTBhNjZjMTRlMTRkZmY3NTk2NjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50TG9hblBhcnRpY2lwYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE4MmNmN2E5MmQxNjc0Y2Y3OWNhYWUzNzFhYTlkYmE3ZTU0NGZkNTE2ZGMwZGU2OGQ4NGVhNGNlMTVlNThjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDYXNoU2V0dGxlbWVudFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwNDc5YTU4YjI3ZDdkMGFlMjg1NzExYzhiY2M0YjMyNzdjYWEyNmE1ODUxZDQ3ZWZjNWRjYjI2ZWY4NjMyY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGh5c2ljYWxTZXR0bGVtZW50VGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjNlYTFjYjExYjBmOGZmMjJjMzAyYzM1NGI1MTMzMTBhMzI5ODdjZDI1OGY0OTkyMWJmNGQ5YzRlM2ViYTYxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFSZXNvbHZhYmxlUHJpY2VRdWFudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTliNjhjNjhjMzU2NDFjMWI4NmJiZjZkMjk1M2FlM2ZjZTYzYWI3M2I2ZGQ3YmIyYjYzNDNjMWQ1Yzk0ZDc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBDRGVsaXZlcmFibGVPYmxpZ2F0aW9uQ2hhcmFjLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwNmI4ODFlYjUyOWZmOTc4ZTY2ZmYxZmM2NWViNzAyZDUyM2MyYWYyYjE4ODZhODE3MmYzYzJiNTIzZWI4NTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UGF5bWVudERldGFpbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NzdiYzU4OTUxOGEzZDUxMmEwZjkwM2E3NzYzMjI0NTI3MzEwOTc0NmExZWQ1MTRlZjk2ZGE4ZWJhYTYxNzI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBheW1lbnREaXNjb3VudGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDIxZTAwZGFiNjViYmYzNDQ3N2M4ZTQxYWI0NzU2MzY2ZmIwYTkwZDIwMGNjMDllZDNlYmFlY2U3NGQ1ZTExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBheW1lbnRSdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwM2E3OTVjNmMwMmMxODY1MTcyNTZiNDU1MTAzN2FjMWVjMTVhOWM2Y2M2ODlmOTYxOTM2NDAxOTlhMzliMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UGF5b3V0QmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTE1NmM3ZmRiMWJjYzhlZmZkN2I3ZDJiZjJmMWJjYTlkMTRiZTk5ZTY1NjAwNmZlYTI4MTgyYTA5OTk0NzZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBlcmNlbnRhZ2VSdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlODRmODk5ZDM3NTI3MGRiMzI0MjlmNjc2MzFkZTRjMjBlNjIzOGYzYjE2NzA1MzA2MDc3ZTI3NDgzODVkNGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UGh5c2ljYWxTZXR0bGVtZW50UGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3NmIyNzFmMmFiYTdkNjdlMTI5MTJlMTQ2ZTU3NThhZjc4ZDMxNWNkOTM5Y2IzZGZiNDQyY2VmYTZmZjQxYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UGh5c2ljYWxTZXR0bGVtZW50VGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIyODQ5MzNiZDg1ODZkZTU5NjRlMTI4MWY3ZDYyOWI1ZTdjNzc2MmJjOGRlMzQ3MTJjMDZmYTY0ZGYzMDNjNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRQcmljaW5nRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNThlNTc1MjIzZTBkODlmODVjZTI2ZWFlMTM2ZWZlYzUzZWE5M2VkNjZkNWUzYTAxMjFlZDM0MjBhNmZjMzY0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRQcmluY2lwYWxQYXltZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzZDQ5ZTc0NzhhYjExY2E1Zjk5ZmYzODcwYzRkMGNlMGFmZDc3MzNiMDkwMzZkMWY5NDI5ZmY3ZDU0NzQ3NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UHJpbmNpcGFsUGF5bWVudFNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxMzRhMGE0OTY3OTc3ZWJmZDgyNGRiMTc4OWZjZWUyMDgxZWY3OGZhYmQ2OTI3NmUxMzQyZDU0MWFlYmRlZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UHJpbmNpcGFsUGF5bWVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2I5NmM5NmQ3ODBmMGZkMzI4NWE2ZmFlMGYzNTc0MDFmYjMxZjkyYjA0YjcyMjNiODNmOGVkN2Q1ZTlkYWYwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRRdWFudGl0eU11bHRpcGxpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhkNTY5MjhjMWZhZGE4MjUyMjk0YjJjZmUxYzZiNjAzZmQ0NmM2N2Y2YzkxYTE5Mzk2ZDg1MDQ0NzRkMDY2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRSZXNvbHZhYmxlUHJpY2VRdWFudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZmZmMGRjNWM4ZmE4NzI4MzY0YmZhMTIwNmM0ODIwOTU3M2Y4Y2Q4ZjdiN2QxNWJlYmM3Yjg2M2E4NjkzODE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFJvbGxGZWF0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0OTliMmM3MDIyMDlkNDlhY2IwNWQ2NDkwOTFjNWMwZTM1MzQwYWI5ZDYxYWFiZTVjOGZiNDgyOWY1MGVhODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50U2NoZWR1bGVkVHJhbnNmZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzN2ZkMDUxNzMwMTM2YTcxMzlmYzczNzhlZGRmZGYxZmM2NTI0YzI3YzRjMTczZmI4ZDE5MjFhZmEzZTkwNmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50U2V0dGxlbWVudEJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDlhZWJjZjE3OGNjNzhkZmE0M2E0ZjlkYzgzNjZmYWViYzI2MDY1OTg2MmZhZDBlNDBlYmQ1ZDU3Mzc3NDMxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRTZXR0bGVtZW50Q2VudHJlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MzFlYTk1NmFmNjk2MjBkOThhNmVkYWU5ZWU0MWUxYzQ5OWY0NzhmZDBlOTFjNzExOWI4M2VkMTAxZjA1YjY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNldHRsZW1lbnREYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkMjcxZGE5ZWIxN2I2ZDcyMzFiM2UwZmE1NjE0Yjg2MWZjZjNiZWE4MjNhNzJkMzEwNTFkYTM1NTBiZjBiOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50U2V0dGxlbWVudFByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjdkMDg5NWIyZjYzMzljOTQyOTQ3NTI4Yzc4NDM3ODYxNzhkNzA1NmNkYWRjNWEwNDU0NmY2M2ZmOTJlMWIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNldHRsZW1lbnRUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYTAxOGNkMzM4NjRlYjdhNTc2NTE5ODcxNjQ4MmM3NzFmN2RhMzViYTVlMTNiZGUyZWE4MmM1ZDM3ZDc3MDk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNldHRsZW1lbnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTk1ZDE2MWJhZGVlNzM3Y2ZkM2JlYmU4NDkxNDQzNTU5ZTFjMzdjMThjZDc1NzVjNzliNTI0NzdlOGI0MjA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNoYXBpbmdQcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTZjZmEwNjJhMjNkNWQzZDc1ODYyMzdhOGMxYjFmYzA1MzBjMDdiYmUwZTBmNWZhY2Y3MGVmNzdiZmJiMjczOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRTdGFuZGFyZFNldHRsZW1lbnRTdHlsZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE2MGVmNzcwYzIzMzhkYWMyMzUwYTIyYTgzMjUxMjM1YzAxNDczMDlkNDY3ZDM5ZTM2YTliZWUyMjQ2NGExOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRUcmFuc2ZlclNldHRsZW1lbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1NTk1YTYyNGUxOTE2NGVlMTIwZmIxNTM1N2IyZWFhYjY3MmZiYjg3MzdiMzgzNzEyOWNkMjFkYWQ0NzQ5NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50VmFsdWF0aW9uRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2JhNjIyZmFjNzFiMTExOTM0Nzc1NWM4ZGMzZTk0MmZiNmZmN2Y3ZTU3NjA5M2Y3ZTM0N2MxMTM2ZmZmNWE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVBc2lhbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzY5NWJiMzZkOTE1ZDI3NjYyMTA2Y2IwYzk1MjU0N2ZhY2U2NzlhNmVhMTI4YmJkY2RkNDg5YzY5MzA1YjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVBc3NldExlZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzBlNTIwOWNkMjFjYjAyNDAzMTVjYzFmMmZkNDNiNTc1ZTgwYjllOTk2N2MxMjQ4NTdiM2M1YjI4ZDEyNGJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVBc3NldFBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmY2EzNTg3N2JjM2Y1YjJjNWI4YjQ2OGVjYTUzM2FiMzVjYTI2NzkzYjBjODUzMzQ4ZjY2ODdkYTY2ZDc3NzdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVBc3NldFBheW91dFRyYWRlVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjMzMmU2ZTcxY2I4NTAxYmFhZjhlYzBiYWJhN2RmNDhmMDg2YjI0NjI2MWVlNDI3ODdhNTZkMTk4NzcwNTFkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXV0b21hdGljRXhlcmNpc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTgwY2M0ODQyMzM3YWZkYmJkZGQ0NjIzNmZkM2FiNjRiZmM3MGFkZWYzYTFjOTQ4ZGZlYjZhMzliZmRhOWM0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXZlcmFnaW5nQ2FsY3VsYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzkzZjViMDllMzA2NTljYmI2ZjRjZjQ4YTc3ZjgwM2YwMzU2OWUyMTY3OTcxMGU1YjJkY2Q0ODE2MGJhMTM2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXZlcmFnaW5nSW5PdXRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ZGE2NDNhZDlhNmE4ODdlYTdhOWU0MmQwNzQxMTdiYWYyZGZkY2Y5MTZmM2VkYjRjMzA0Y2ExYmFmMGQ2ZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUF2ZXJhZ2luZ1N0cmlrZUZlYXR1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDU5MzQ3OGYyNWZjZTA3NWU4MDE5ZmY5YWU4NTkzYzA0MDVlNzQ5YWZjMzBlMDE5MTc3YzAwZDM3YWExOWZjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQmFycmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4N2Q2ODA2NTQwMWE2Njc2M2ZkMzViZmEzYzAyNTMxNDM4YThlNmFmODg2NTk3MmIzNzQyM2QxMTI5OWVjYTFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVDYWxjdWxhdGlvblNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljZjg1YmRiMTk4ZTVjOTRiODIzYTZmN2U0ZDU1YjExODI2NjYwZTA0OGJhYmFjYzIwNmI2MzFiMGY5MmY5MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUNhbGVuZGFyU3ByZWFkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0MTJjYTQxOTgxMzU2YmIwOWM5M2VlMzI2ODc0ZTc4Y2VmMWRkNzlmNjJiMGU0NzY4YjVkMzVhY2FkMDQ3YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUNhbGxpbmdQYXJ0eUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjU2NTdiMmU4YjA2NjM1YTc2ODg0NGZiYmRmOWRhN2U4ZjM3MzA3ZmIwYTUwZTdiNDczNjg3MDFlMTM5MWZmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQ2FuY2VsYWJsZVByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNjM0NmMwMmQ3ZTVjYzdiMGVhMmYyZmU4NTVkM2JlYzViY2Q2ZmJjODcyZTUwMDIzZmQ2NDljOWFkMjQzZGYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVDYW5jZWxhYmxlUHJvdmlzaW9uQWRqdXN0ZWREYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzRmYjBhODIzMGEzMGIxMDNhNTVjNTNhYzRjZDMzYTQ1NmMyNWJmMDdlYWIyZDIyNzY4MGNlZDVmYThhODZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVDYW5jZWxsYXRpb25FdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTBiMTdmOTM5ZGQyMjBlZjM5ODg4ZGNkZjQ3YzNkZTUxZjgwYmEzMGJlOTBjN2VjYmUwMGFmODY4OGE4YjNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVDb21wb3NpdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2NjZTA4ZGE0MmYwMDgxZjU0MzhhYmNiYzQ0NDIwYzAyYzFmN2YzNTY0Y2IxNDk0MThhZTZiNjUxOTFjZGQxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQ29uc3RpdHVlbnRXZWlnaHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmI3NzdkNGViZjAyMDU4NGEwYmNiNGU2NTgyNWM5NGYzMTdhZmYzNDdkMDFhYzkzZTJlN2EyZDdkYmE5ZmZiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRGl2aWRlbmRUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMWE0NTMwN2EzYTdhMWJlNjViYWY5OTk0ZDRlMDVhZGVjMzNmODMzMTFkZGE4ZDA0ZjhmMzMyNDdmZjg3MzI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFYXJseVRlcm1pbmF0aW9uRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk4ZWJlNTY4MDE4ZWQxZjM3MzAwNzE2YmNmNWZhMGJhNzdjMzYxZDM1NjNjM2YxNmU1MmRlYTNkZDAyMGMyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRWFybHlUZXJtaW5hdGlvblByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5N2I2ZmY0OTk3Nzk4YjQ2NjFmYWZiMWFjYTY3NjRhYTEwNmViMmMwNmJmNGQ1YmZkMTg3N2U5ZGE3MWYzM2FmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFY29ub21pY1Rlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdjMjNhN2FkNzgzMmFmZjAzNTA1YmYxYWM3OTU4NDkwZGQ2OTg2NWRlODgyNDExODJmNDQzOGU4NmEyYWJhMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV2ZXJncmVlblByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5N2Y1ODg0M2NlOTQxNDliZmRkOGU1NDYwMzc0NzE0YmUxOWE0MWIzMzdkMmJhMTU2NGQ4MDU4N2E4NWVmZDE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZUZlZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzMwODI0YWUzZjI1NGE0ZWNkNzgzNDQxZDY1NTI0NzE3NjU2NDgzYTdhZTJiMGMyZjJmN2NlZjgxN2M1MDIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZUZlZVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2OWZmODU2YzBiMWU5NzMxOWU5N2QyZjY0NWQyMjczYTg3YTFhZTYyZWMwMzQyZTgzMzVmYzI1YjdmNWVkZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4ZXJjaXNlTm90aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA0MzhiYzdjNzU3YWZlNjBhNDE4ZDJhZTdjMTFlNmJhZDlkZTg5NDU5ZTNjNWFhZWM0NDFkNzhhMTQ5N2I4NDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4ZXJjaXNlTm90aWNlR2l2ZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNlMzc0N2QwMWRiYmI1ODRhOWM5NTBhN2RmNzgwMmM4YmZmMDZiYWFkOWQ3MWQ3NWI5ZjQwNWY2Y2M0MGRiYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4ZXJjaXNlUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1MTQ1ODFlNzYzN2ZhN2UxZjRjNGM4ZTgxY2VhNTczNTg0YmQyMzRkNTA0MjNhZTZlYTA5ODRhYTAzZjdmMmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4ZXJjaXNlUHJvY2VkdXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1MzQ5Njg3ZjZmYmQwMDEyOWExZWEwMDRiMDUxMDM0OTA3OGFlOGQzYjAyZjg5NzMyMjRkYzgwMTgzODAxMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4ZXJjaXNlVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmViMDc4YmY4OGE4YzlmNDFhMGFhMDlkM2NlMzU3NmJlZmY2MDIzMGZjOTk2MGRiM2NmOTQ5MzdhY2IyZDAyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRXhwaXJhdGlvblRpbWVUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTQ5MGUzMmYzZTAzYjcxNDU4ZDA2ZWEyYjIyN2Y3NGE4NmQ5OGY5YWQwMjIyMmZkMmZiNDRkYjVkMDZhNjY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeHRlbmRpYmxlUHJvdmlzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkNGFhNjY4NWIyZDY4NDI1MjhjZmVhZWNlZmI0YTg4NDJmOTIxZjFhZDJhZGRhNzYzMzVlMDgyNzRjMzgzNjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4dGVuZGlibGVQcm92aXNpb25BZGp1c3RlZERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5OGRmZTE1MmEzOGRjYTQzNzhhMjUzYzNiNjdjMzdhZjM3YTJhYTM3YjdiZDk3NTRiNDM4MTU3ZDkyMzQ2NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4dGVuc2lvbkV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkZjRkN2MxMmI0YWZmYjQzOWNhNmQ2Y2EwMWEyZTI4YjJjM2Q5NTY0N2Q3ZTA5ZDY0ODU5Mzk2NjAwMDdlMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUZpeGVkUHJpY2VQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODdlMzkxMjFhYzViMjBlYjBjODFhMDU3NzE1MDMzZGZkZmJmNjMwMDFjNjA5NzIyZDZmM2JlNzc4OTBmNTMxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRnhGZWF0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyNjQ1MzM3M2ZhMzgxYTBiYTEzNTIwNTVjYzQ3MjYwYWU5ZmI2NGJhOTRhNDQxODM3NWNlZDZmOTQxMGVkNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUtub2NrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImY1Y2Y2MDk5NzJmNzIzNGRlYmY4NDYwN2UxMmMyMDU5MmEyNjQ1MDQxNWI4NjEzNjkzZGQ5MWI4MGI3OGZmZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU1hbmRhdG9yeUVhcmx5VGVybWluYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWIxODhkOTI3YmVmNDBmZDJlOTU3NDU5NzE5MmJiMmQ3NmI4NzhhODY4NGQ0Y2Y2YTU0YTJjNTA2Mjc2ZGVlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlTWFuZGF0b3J5RWFybHlUZXJtaW5hdGlvbkFkanVzdGVkRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTFiYTJlMzQ0NjM1YWQ2MzU4YzA1NGI4MmRiMzc0ZjQ4OTQ0Nzc4ODI1OWZmOTAwOTVmOWI1ZDUwMWM5Y2FmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlTWFudWFsRXhlcmNpc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M3NDQ5OGViOGRhYzRlMzVkOGRhNzdkZDQ4MDEwNzFlN2E3ODQ2Nzc2MTdkMjY5ZjlhYzNmN2IwMDA3MjgyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlTWFyZ2luVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2Y2MDE1NTdjOWNhMWZjNmUwYjFjNTYxN2ExZTFiOWZjNTMwMWVlZDcyNWQzNzdiNWEwNGM2NzExNjFkMjQ4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhT3B0aW9uUGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImEzOWY5ZGE5MTNjNjUyMzcyM2VhM2JjMWM2ODRhZWFhZjRhMjA3OGEyZDJlYTNjZDZkYmI4ZTY2ZWI5ZDc2YWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOGQzYzhjYzhhZjI0NjNjZjY4YzhlZDI3YWY2OTFkZTE1ZDM3YTE5MDI5Y2RhYmI4NWJmMzhmYWI4NmFjYjlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVNdWx0aXBsZUV4ZXJjaXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImU3NzVkMGE2ZTM5OGIzOGFhMmI3OTA4ZGJjMDVkMGVlZGMxMGVjMTdmYTA4NTI4ZGVkYTRhMGRkNTk2N2RlMGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU5vblRyYW5zZmVyYWJsZVByb2R1Y3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTUzODQ2NzQyZTNmMDJjMjIyMzUxNTI5NGI4ZmNlNTI1MGU5NTBmOWFiNTdmZGFhYTI1MmRkZWJlNWVhYjFlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlT3B0aW9uRXhlcmNpc2VTdHlsZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGFhNzVjNDgyZWY0NWRjOWY1ZTZjY2VjNDYzNTFkYzQzYzUyZjFiYzNjMjhmOGU4ZTYxMTdmZmIwN2M0NGYxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlT3B0aW9uRmVhdHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OWRhZmFlNGMyM2VhMzM2MWU0MTk0ZjhlM2NiYThmZmI3YjI1M2EzYTFmZjc2YzJlZTA0ZDgwOWE4MzU3OTQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVPcHRpb25QYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQ0N2Y2NGY1ZmZlOGUwYjdiM2E0MmY4MmM2MDIwMDk0ODFkZTc5NGU4MjQxMGQ1MWEwMTk5YmQwMmIzZDU4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlT3B0aW9uU3RyaWtlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwNGIyNzIyNjk4ZGYxYzJlNzA1MWQxNTVkZGZkN2FkZWMxMzA4YzMxNTQ1OTY3NGU3Y2YwMWM3YTkyZDgwZGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU9wdGlvblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlZGEyZDUzYjlkMDYxNzk4ODQ5YzUzNGY3NzExYmFhZjQwZDk2ZTZiMjBkN2FkN2EwYTIwNDg2NjhmM2VkYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU9wdGlvbmFsRWFybHlUZXJtaW5hdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzdkYmZhMWI5N2MxODFiNjgwYjdiMTIzNGFjNjM0NmJkMDY5MWRkOWU3OWE4NDljYTZiYzcwNmRkMjljY2U4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVPcHRpb25hbEVhcmx5VGVybWluYXRpb25BZGp1c3RlZERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlOTMxMjAwMjRhZjA0ZGRjMWUyYWM1YWNkMTI4MTgxNmRhODkyMTRkZDg4OGE3MjNlNWMzZjFmMDJiOTRjYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVBhcnRpYWxFeGVyY2lzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDUyNDQwZWY5YzBkYThmNjFjOGJkZjc4N2MzZDU1MThiZDZjZWFjMmVmMGMzODRhNDA5MDlhNDljZWNmYjVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVQYXNzVGhyb3VnaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MGIxYmMyNDAyOTY1YTlhMTlhNmUwMDY5NGI5ZjAyN2M0MGE1Yjg4ZTBmZjY2ZTlmNThiMTc0YTU4ZjhlZjBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVQYXNzVGhyb3VnaEl0ZW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjZiZjYxMjFiN2MyYmE2MmM4M2ZmNDcxYzFhZTVkMzI5Nzc1YzhiZjQ4MjIyZGMxZWExZWIzZjg5MDU1NGUzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlUGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyMjRhNWM5YWFiNWY1Y2M0NGVlMzE0MzJkYWRhYjAzMjA1YWQ4YTdmNTk3ZmZjZjYwZmJkYTVlYTkzZDAxMzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVBlcmZvcm1hbmNlUGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjU4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkYWVjNDdlZTliOTViZTVmODJhMGY3ZTQ0MmY2MjQyNjcyZWE3MjM5ZWFlNTM2ZmIyN2E1MTlkZDdlYWZjNTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVBvcnRmb2xpb1JldHVyblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyZDY5ZThjNjhmZWM2OWJlNmEzYzZhZGVjNzY3M2IyOGMxOTU0ODM5Mzk0NTg5MGQ0OWJlMDlhNDBkNjY4OTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVByb2R1Y3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWRjZmE5YjY1ZWY5M2VkNGNhMWIwM2Q2NDk1MGQ5MWEwMzNlYmYzMWVkZTJkNmFhMzU3NzlkZTA3ZDNlOWNmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlUXVhbnRvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiZTgwMWE3N2YwMWU1OTI3YjU0ZDgyODVjYTgyZTdjZTA2MTA3OTE0NDg5YmZlOWE4NDdjNzIxMDNjNmM1MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVJlcG9EdXJhdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NhM2FiZmRhZGQ1ZjlhOWU2ZTI3NzZiMTlmOWY4YWZkYWQ0MTllM2U1OGE2M2NjZGQ2ODMzYTE4YmI3YzIxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlUmV0dXJuVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTJlYWMyZTNjNzU5NDVhYjVhM2VhMmNlNDBkZDE0OTRhY2U5MTU2MTU4ODkyOTIwODRhODU1Y2Y1MjIzOWYyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlU2NoZWR1bGVQZXJpb2QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjhlY2FmZmIxOWNkMjNkNDkzZWQwMzA4YzQzZDZjZmZhMTlmZGQ2ZmM3M2Q3MGU2ODJjNjBkMjFiZjNjN2EzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlU2V0dGxlbWVudFBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmIyNmMxNmU3MTQ2MDlmMGI0NmVjODA5OTA2OWNhZjZlOTgzZjZiMTkyMTNkODRiNTFmZDc2ZTNlODk0YTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVTdHJhdGVneUZlYXR1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjA0YTlmNWJiMTc4YzhmZGEwZmM1YTgzYWY3NmQyZGI4Yzc4YmRiMDkyYmFjMGZhYzkzOTQyYTNkNDRkNmI0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlU3RyaWtlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlYTczYjE3ZGJlNjFhZjRmMmNmZjFlMmNjZDczMWFjODkxMjI4ZmE0ODgwYzliYTViYzRkYjg0ZmQ2N2Y4MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVN0cmlrZVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwNTE2YWQzNmMxMTQ1MDU0NThlZDRjYzI4NzE2Y2Y0ZTY2NWE1Mzc1Mjc2MjVlY2ViMWM5MzNjYmU3MzI3NmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVN0cmlrZVNwcmVhZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNDQ2NzE5OGFiNzI5MzM5MTc5NzcyYzVhNzcwMWEwYTg3MDhhMTRjNjhiMjg5ZjFmYmJkNTI1NmQ5MjUzMzZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVUZXJtaW5hdGlvblByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZjkwMGViZmNlNThhMjc1ZmE5ZDBjMzA0NDU0ZjM0ZDNiOWU2NmU5M2MxNWJhNjdjNjBkMGQwNGMxZDVjMmU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVUcmFkYWJsZVByb2R1Y3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGMzNzRiMDYwNmEwMTVhM2IxYTk4ODhjMjA3YjZkYWJmZjFmZjNjODA2ZTkwMGQ0NWVjM2U1NTRiMDc4OTU4MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlVHJhZGVMb3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjQwYjhmOTMyNTIxODhhNWVmMzRlMGZjZDY5NTIzYjU2NmFmOWM0Y2JlODgxMzlkNGJhYTdkMmJiYjk3NzFlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlVHJhbnNmZXJhYmxlUHJvZHVjdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGJlMzJjMjRiY2M2ZjhjMjMyN2RlNDY3MTQ1NWE1ZjEyYzA5MDc5MWJiNzUwMmNlMTA2ZDdmYjcwNTFmODM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVVbmRlcmxpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWI0Y2Y1MGJkM2YyYTJjODk1YTBmNDg2OGUxMGYxNTNhOWQ1Mzc1ZmRlOGZiYzFhNjRhMGNmYTNiZDY4OGI0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbkFjY3RPd25yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1NGEwZmMwNzNkZGY0MTFjNGJlZDI1ZTY3NTdjZjljZGQ3MTcxYzBjMjFlNjE4YzI1NTMyNDdhY2ZhNGViM2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25BZGR0bEF0dHJidHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM1MDYxNDcwODYxYzZmMTQ4ZWIwZjIwMGM1MDNlMDZiODljZjg5ZGZjZTc4ZTU5NjUzODk1YTFjNGE3ZTc4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbkJ1eXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEwOWJkMjViMzVjZTk5OTM2M2Y1MDIxN2I1ZmJmNmIwOGFiZGIzZDA0YjQ2MjNhMjI4MWQwMTI1NTgwZjEwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbkRlcml2SW5zdHJtQXR0cmJ0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OGVjYWUyZDcxNGNlNWJhZmJiZDcxNzM0YmViMTdjZDQwZWQ5MzA0NmQyMWQ5OWZiNDQ2NTI3ZDY1ZTY2YjIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uRG9jdW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZmNDE4MDFlZTdiOThiMzJjYWU2N2ZlMTZiNzg1YzM2ODNhYjZmZjYxMDJmZmI2ZjZhOTJiOTA4OGQ0YTAyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbkV4Y3RnUHJzbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyM2JmYjZhMTVmNTc1ZmIyMjlkODVhNGE5ZmM1ZmYzZDg0NWY5YWY1NjExNTc5MGQ3ODE4NmRiMDUxNWI4ZjNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uRmluSW5zdHJtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzZmFkNTQzYTZkMjk3OWNkN2M5ZDA0MTgxYjI0ZTc4YzFjYzhkZmRmMDlmM2UxZTRkZDFmMjE2Yjc1NTZjODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25GaW5JbnN0cm1HbmxBdHRyYnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5MGZjMmUwNTNkZTUyNThhMmFhZjNlMjY2NTAwZjlmZDZjODY5Y2MzM2ZmYTdlODE1OGNjZTg2MTc0NzlkMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25GaW5JbnN0cm1ScHRnVHhScHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODk0YTdjOWRmZGFiMTlkNDI4MWJiODMyYWFlNTkxZGIzOTQyMjc2NGM4MWRjMDg1MTQ0OTBiNWE5YWY2MTk3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbklkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3Nzc2NDFkZmFkYjMwYTQ4ZWUyNzgyYjk5MTgwZTgxNzBkODdjMDUwZDVkODIzNmI3NzFlY2JmNzkxZmY3NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25JbmR4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlY2RhMmZiZWIyZGRjN2Y4OTllOWRjMGUyODFmZjY4NTA0MmU3ZWYyYTU1ZjUxNmExODJkMGQ3YzZlZDIxOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25JbnZzdG10RGNzblByc24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2UyMGU0MTQyNWNmNGJhZjVkNTliODM5ZWMxMzAzNjA5ZWYyZTc1YmRmM2VhYmU0MmM4ZjI0NjRmNjlhZmVlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbk5ldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMGZhOWIzOWFhYzg1ZjI4OWE4NTMxYjFhYWVmZWYzMmM3N2U2ODYwZTZjNWNmNmIxNDk1MzlkNjUwYzgxMDkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uTm0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDEzYWY0OWFlYjFlNTEwNzU5YWJlNjY3MmViZDkwMTYxZjMwZjZhODgxMmVhNDk4MGZmZjg5ZjhjZmQ0NjA4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbk9yZHJUcm5zbXNzbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OTA5YTMyNmFmMmY1Y2UxMzUwZWM2NTRlZmM3NmQyZWE0ZDVkYTE5ZmJkNmM2NWE3MTNhZGI3MTEzZDFjYTlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uT3Roci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTFkMjE5M2M4MjE3ZjVhYmQwMDBkYzhiOGE5YzY3NzQyMDQ3MDg3NDUwZDhiMzMxNmIwZWQ5ZjVlMjZkYWNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uUHJpYy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNThhODE0MmNjYTZmZWE1ZGI2NDA4MzQ3ZmI0MTQ1ZmNhNjlhZDhhNzZjNGExNjA4NTRjODM2N2M0YjMyYzE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uUHJzbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTI2Zjc3ZjY3MTlhOTA2ZWRhNzBkYzkyYmZiNmU5NzA4OTY3MDQ3NWE5NjNiZWQxM2IyZGZlNmE2YzlkMDZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uUXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyODA0YWVhY2FlMjllNzNlN2ZmNzAxYzU3Yjk0MDkwNThmM2VlYjk2NDE0MDI4NWRjOWU2ZTdlOTZmMmY2YTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25SZWZSYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczNTkyMzA1YzQyNTcxNTgyYWRlZDk5YzkyYTE2OTg3Yzc5MzI4NzU1MTI0MTIzY2M0Zjc2Y2MyNGIyY2I5ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25TY2htZU5tLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxODVmYzYxMDAwYjkzNDJhMzRhMzY2OTdiZmFmYzNmYWNhZjE2Nzg2NjY0MzlhZDNmYjA5Y2U2ZWJjNTRlZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25TZWxsci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMjVkMTk2ZDhhOTc3MzY5MTQ4NjczMTI0MjhlNGMzNjQ2M2VlNWM5MTUxNGZjMDUxNGMyZTZhYjgwMDAyNjAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uU25nbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTc4N2Y3ZTYxMGQyZTFkNTk2NDc4MTNiYTA0ZGU5ZTZmNjc0M2JiMDcwYmRhNDg4NGMyY2QyZWQ1OTkzNjZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uU3dwLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2NWE1YjgwNDMzOTZkNWFjNjZjZDJhOTEyZjdhOWU5ZDk5Njk2ZDJiMDIzZWQ0YWY0NzgxNjlhNTM5ZWY3NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25Td3BJbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMGUxNmM4MjFjNmI0YTA2YTMyYjUyYTg3NzBkZTAwYTVhMTRhNWJiYzJhMWE1NTZkYTZlMzkxMzI2MzcxZTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uU3dwT3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjYWM4YjA0ZjAyOThjYWMwOWY2YTkyYjYyODA2YWQxYTM4NWVjMjM2ZTgxODMzNzdlMjZiOWMyODlmNTIxODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25UZXJtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1OTI1ZTE1ZGZiOWE4NTE4ZmI0OGUzMzU5NDFlNjJiYWM2OWE3NDNmN2IyNTBkMDdkMjM5OTZmZWVjNTcwNGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25UeC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjQ1YjY2ZjNhMmZjNGRkMzhkOWM2MzRkYjgzNTc5NWE0ZjU3MTRiMWYxYjBiMThjNWQ2OTMxMDg2ODU5MGJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uVW5kcmx5Z0luc3RybS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTc3NWMyOTdkZTI2NmIzM2E0MGMyODkyYzZmMjkyNTVjNGM2NmZhZmMxMTc4MjgzZTQ5ODBkOTM4MjRjMjBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9Db21Sb3NldHRhTW9kZWxGaWVsZFdpdGhNZXRhU3RyaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJlMzM3YzhmMzFjN2I2NWE3YjBiMjkxYjc2YTA5MDFkMTdhNjRjZjIwNzBlNmE1ZDhlODI4NmY3MjQzYzhjZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NvbVJvc2V0dGFNb2RlbExpYk1ldGFLZXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjA0ZTIxMzliM2UwNDQ0NmViMjlmMDFhNGFjNzAwNjc2ODgyNzRiMzQ4ZDkwYmMzZjE0Y2E3ZmI1YmY4Y2FjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ29tUm9zZXR0YU1vZGVsTGliTWV0YVJlZmVyZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MmExM2QxOGEwNmYwYzY2NjFlMzU2ZDUxNDgzMTMxNWUxNDk5YzNmM2M5Mjc4ZGM1ZTQ3MzliMGU5ZDVkMzdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9Db21Sb3NldHRhTW9kZWxNZXRhZmllbGRzTWV0YUZpZWxkcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyM2U5Yzg1ODQ0YzMyMDM1YmE4OTdkYjViYmNiZWY2NmYxYzYwMGFmZWVmMWRmZTYwYzI1MGE4NmIwNmNiYTQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9Db21Sb3NldHRhTW9kZWxNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFTdHJpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjRlZDczNjNlMzcxZDNkYTcwMTQ5Zjg5MDA2OWE1ZjI4ZjY1NDViNjg5ZjY0N2Y4NjVlMDdkYjJlNzJlM2M1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvRG9jdW1lbnRSZXNwb25kZXJNYW5kYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyYzkyNDZkZGVhYTkyYzAwOWZjN2U4ZWFiYmVlZWMzNWRhMjFhMDhhMzM5YjMwMzUwZjM3NjA1NDRhYTM3NjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL01hbmRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmZmZTJlZjcyYzlhYjFhYzI1NGUwMWZjNzhlOTFhYTg4MDMzYjBlZTJjMWE3ZjY0MWExNzA4ODUzNzZhYTRjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvTWFuZGF0ZUFjdGl2YXRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2ZkYmZmMzQwZTAyODFjMmMwNTg4NTFkOWU2ZTBlYmQ3MDc0NDM2MjBlMmQzNjg2Yjk4ZjQ2MmI4ZTcxNmQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbWFuZGF0ZS9NYW5kYXRlQXV0aG9yaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyNDQxMWM3NmQwOWNiNzc5MDM2OTAyMjA0ZWMwM2JmYjEzYWZiNjg5Yjc3ZTdhMzFlOTk5NDRlNmEzZWViMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL01hbmRhdGVBdXRob3JpdHlDb25maXJtZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q3ODYzYWQxZDk0ZjFjYmQwZGQ1NmNlN2IxZWJlZDdjYTQyMTQ4NGI1YjFhNTRlZmViMGNhNmNjY2M4NjZjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvTWFuZGF0ZVRlcm1pbmF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWU5ZWE0MWJhNzAyNzBiYzRlY2QxNjZmYjM5MGI1YjEwM2FhNmQ4NzE1Y2E1ZWEyMDQ3Yzk2OTNjYzY5ODliZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvTWFuZGF0ZVZhbGlkYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTcwMmFmY2UxMzBlN2EzZTViYjQ0OWFmY2NlYWYzOWNkZWNhYTQ2MmNkMTAzNmQ1NTE2YTI5ZDJkMDYzMjBhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvT3BlcmF0aW9uTWFuZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NzI0MTE3YWQ5ZmQzMGE1NmFkNjhjYjE4MTJjMWQ1OWNlYTYwOTI2MzQ2MmE3MGM5NGM1MzVhY2FhMzU4M2JlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbWFuZGF0ZS9TdGF0dXNBY3RpdmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2RhOTFkNTk4MGYyM2U1YmY2MmY0MDU1NTM2NTgwMTU5ZTA1OTFjYWFlMzJmZjQ5Yzg0ZDY2OTY0YTAyNWRiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvU3RhdHVzQXV0aG9yaXR5Q29uZmlybWVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzODI5MTBiYzhiYTJhZmQ4NzUxYTg0ZmE2OGNmMWE1NWM3MjkyNmRjYzFmOTA1ODQ5YzcwYWM4ZmRmOWExYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL1N0YXR1c1Rlcm1pbmF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzU0M2YwMzBkZWEyY2U4MDBjMjRlMmM4YzE4YTQ3ZTY3YzBkYmZjZWZiZTM0ZjI3YWVlNmIyMDY0M2MxMzQxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQWRkaW5nUGFydGljaXBhbnRSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2ZmMjliYmUyYmIxMTg2OWYyNTY4OWUyM2M1OGY1ZDM4MmZmMmM5ZTAwZjAyNTdiMWY4ZjM4Nzg5ZDc3ODJhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQWRkaW5nUGFydGljaXBhbnRSZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDU4OTNkMzQzZjQzYWNjMDM1OGIwZTI5ZWIwZmRhYzg1ODFhNWVhZDdjMmQzYTZmNTdmYTRmYzkyZjE2N2E2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQWdlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YmFmMzIwZDQ1MzlmYzQ4YzE5OTlmYmQ0MDk1OThiY2UwNWI5YWYxYTdhMmFjZTdmOTA2NDU0OTcyM2M1MTQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9BbGxQYXJ0aWNpcGFudHNSZWFkeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNGY2MWQzYjgxYTVkNDMxOGJiZjdhNDRmMDE3YzY0MjU4NTIxNmFjOTY1OTY3ZmU0NjdhYTVmY2VjNDkwODdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9Cb290c3RyYXBGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWJiODgxM2YwOTJhZmYyNTk3NDY1Mjg2YmJkZTNjYTUxMzM2MTM1ZmJjNjc5MWM1NzkxODExZGEzMWYyM2YyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQ2FsbE9wZXJhdGlvbkFjY2VwdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiNTZiZmNlZWFjNGNkY2QyYmM5NTRmM2UxOWY3Mjc0MThkZjQ1MWFlMmI3ZmRiNDJhY2YyN2I3YzNjNjE4ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0NhbGxPcGVyYXRpb25GYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQ3MWEyZDUwOGVhOGIxYjRlOGZlMDY3NGJkY2I2MmExZWYzYzY2N2YzMWI1Yjk2MGY4NzNjOWI4NDlkYzIwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQ2FsbE9wZXJhdGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZjYyZmYzNTBhZjgxMDViMWQ2NDIxOTFhODhmYjk4MzkxZmZiOTU0YjA3M2ZjNWFkOWY5MGUwNGE4NmUyZWJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9DYWxsT3BlcmF0aW9uUmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjNmQ2OGJjODYwM2VmOGIyNWEyMGJhZDZlZTcyZDRjYjE2MDM0OWNlZWU2YzBhMTFhZDBjNjg5OTQ1MDU4MDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0RvY3VtZW50SW5pdGlhbFNuYXBzaG90UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhZjhkNDBmNzZjYWRiMmRiZTYwNTIxZmQ3MWJiMTc0YmUwNjA1YzMyNGIzNWY5ZDIxYjRjNjBjZWZhODQyMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0RvY3VtZW50SW5pdGlhbFNuYXBzaG90UmVzb2x2ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTNiNmU1OTFkMzY3OGI2OWEyYmExZDE5YWRhMjQ3ZDRkZGY0MWY4NGVjYWVkYzRkNjY4MjM1ZGU2NWRkNDRkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvRG9jdW1lbnRJbml0aWFsU25hcHNob3RVbnJlc29sdmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1MmM1MTNmMjM5ZmVjZjBhNzNlOTAxZTAyZmQxNDE5YTc3NzZmMDQ2ZmU2ZDU3MjM1NDg5NWYwZjJmYmMyYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0RvY3VtZW50U2Vzc2lvbkJvb3RzdHJhcC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MWZjZmE1NjI4MjVjYTc2Y2QxMjQyNjc1ODJhNmI2OTNjMTZkZDA2NjZiZmMyYTU4Yzk5MjI2NWExODM5YmI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9MTE1BZ2VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImEzMzAwNTNhMjRjOTYzMDdkODkwMzc1MWFiNzllMTE5ZmFjM2NlZGYwMmM1NTkzNzk5NzE3Y2IwYTk4ZmY1YWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NBZG1pbkFjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2E5NjJiNDQ3N2RiNDI0MjRmMDgwNWYyNzlkNGMwNjQ1OThkMTZkYzkwN2MzZDllOWQzODRkMWFiNzFlNTM2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0FkbWluQmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjlmYjYyODQwZmJjYTAzOTU4NWRlNTNmMTc3ZDQxZWEwYmRiMzhlZmUwMTU2YjhhMmY0ZTA4N2E0NGViOGM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TQWdlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmFhZWQ0MzRlZDFlN2Y5ZGY4MWZkNDZjOTE5MTRhMTYxNTdlMjQ1YzI3NWUyMGY5MTE0ZDliOWI1MzU1NWVmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0FnZW50QWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjYwMjU5MGZkZTFhZTU3OWU4NDBlNzhlMmJjMmFmZWQxMTU5ZDk1NjFhZTQzZTZjMTFkODU5MzgxZTVmOTgwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0FnZW50Q2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWYxNGEzYjIzNzY0MWQ5ODVmMDUxMGFhMjdkN2IzYzUyMTZiNjg1MzUxYTBiNWM1M2U1YWQwZmIxNTVmZWU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TQWdlbnRFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MGE4ZGQxYmFlNTQ0N2RmYmVmOTc1NTRlNzliNzAyYWY4MjhjODNmYjY0MDcyZTU3ZDczYzQ4YjQ1ZjJmZGM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TQmFsYW5jZUFjY291bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTFiZjhkOTQyNmM4ZTcwYmZlOGRhNWFiODlhYTEyZWZhMTYzMjc4M2FmZjM0ODNlY2VjYzZkZmRmNDlmZjNhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0RvY3VtZW50Qm9vdHN0cmFwTWFuZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Mzk4YzZhMzVmMzI0ZGY5YmY1MjVmZDVmZmFjZGEzYmI4MGEyNTcyNjZlOTIwMGI1M2ZkZTBkMmVkOWM3ZWQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TRG9jdW1lbnRPcGVyYXRpb25NYW5kYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkMzMzMzI5ZmQ3ZmM0OGQxMTE1MmE4OWQ5M2FlYTI2N2Y0OGIwOTBkZTMyODQ3YTVmMGY4YzIxNTk1YzM5NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NEb2N1bWVudFNlc3Npb25SZWZlcmVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIwN2ZkYjNiODkzZGFmZDAzZjI4MDMyZTAwZjE3OGJlYzc1M2RiMGZiNDBhZjM3MGRmMzM0MzQ0ZTZjYTgwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU09wZXJhdGlvbkNhbGxSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDk1ZDMxNmYyY2Q2OGI2MjBlNzIwYmJkZWVjOWQ5ZDhhNDI3MmMzY2ZlY2M3ZGJmZWQ4MDM5MTQ3OWIzNmFjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1BhcnRpY2lwYW50c09yY2hlc3RyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NjFjNjQyY2Y5MmU0NjM5MzQyMjU4ZmY1NWUyN2FjOTcxMzQxNjFkNmZmYTA4ODk4ZmFiODFjNmJiMTEwMjRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TU2Vzc2lvbkludGVyYWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGE1MGYxZWJmYzQ5NzYyYTM5ZDg4ODBlYzRiMjAwOGFkNjNjYmEzZjY1NTlmMzg2MDc3ODE5Nzg3MzUxODU2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25FbmRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YzEwYWM4MmExNWYzYzE5MjBhMDUxNjY0MTdlZjM3YTFmZTkwMjQzZjczYWE1ZTc0NWE4MTJjZTk0YjcyYzIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TU2Vzc2lvblN1YnNjcmlwdGlvbkZpbHRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ODY0Y2EwMTI4MzA2OTcyOWUwMDZiMmYyNjhkYTA1MTJkM2VhOTdlMTZmZDE0MzQyNWYzZjRlYjc3YzViNWQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TU2Vzc2lvblN1YnNjcmlwdGlvbk1hbmRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGQxZmUzYTYwNTE5NzI0MGZkNTEzZGJlOTcyODc2ZTAyNWQ1ZTRkYTExZDRhNmI5NTI1MGJiNGZhNjMyOTgxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25SZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzk5MWVhZWI2NDA5YWEzNDMzOWUyOWNhYmM2MDYxOWM5ZWU0N2IzMTQ2OTg0MmY0NzM5MTU4Mjk2NzU1MjBlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25TdGFydGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiNjI2ZTE1NGRkNDZiYWE4OWYzZGZjZDE5NGQ4ZmMyODM3NTUxNGE3ODYwOWU2MDVhZjQ2ZGNmNjE2ZmM2ZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uVXBkYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhOTM1NGM3OTZlNmNmNjRlMGRlNmIwNzZiODU4NGU5MTc0YzhiNTQxNWVkY2RlMDcwZDJiNjEwY2Y0NWFjNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NUaW1lbGluZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEzZmQ2ODBjYTc5ZjM4ZTFlODc2OWU3ODE1Njk5ZTZlYzQ0OTFlZDVhM2YwZDY0OGYwNmMxZjVlZWM3YzYxMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NUaW1lbGluZUNoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmJmYzY3OWZmY2JkNjc2YzYzNjYxMzY1ZTZmMWI5NDBiNWMyMjczNGU5Y2IzN2YzYWNmMzEwZTZmZjQxOGMxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1VzZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBkNDNiOWQ1OGZlZWNjMzBjNGI5OTczMWJjZTdkYzczZjYxYTMxZjZmMmQ4ZWVhOTgyZDIzNjk0YzU4MGNlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGFydGljaXBhbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFkNzQzMzc2Zjg1MGVhYTQ4Njc3Y2Y3ZThmMTNhOTAzMjdlYTAwMzMxZDZiNDI5YmUxNWUyNGQyM2FkNGJiNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGFydGljaXBhbnRBY3RpdmF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzVmZmQxODQ5M2VkNGQyMGI1ZWU5Y2ZlYzAzOWQ4ZmMxZTU0ZjhhOWQzZTUxNjU0M2M4OTg0YTE3NjI3MjhjZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGFydGljaXBhbnRBY3RpdmF0aW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTJlMmFjMjE0YTAwMGZlNzUyYTE5NTg2OTdhMjBkNzhkNjdmYmVjMGM5ZTY2MzgyN2E3ZjEzNzYyM2FmN2MwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGFydGljaXBhbnRSZXNvbHZlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjIzNGU5MTAzNzNmZWM3ZmFlOTFlYTNmMGVhYjE2MzFmOWZiN2M1MTI0MDAyNDI4YTRlN2YzZWVlM2E2NDQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9QYXltZW50SW5pdGlhdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxMDkwZTFkNjQyZjIwYTcxODU5NTk2YWM5MDBmNzA3NjFkZjA4ZjRhMzc4Y2NlZGY2YzYyZmMzMTZjZTY3NzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BheW1lbnRJbml0aWF0aW9uQWNjZXB0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmIxMTk2NjVmYzdlNmVkYjc4YWM2YzQ3MTUyZGYwZjM4MjNjYTNiZmVlYWFjZTY2YWE4NGM5NjVlY2Q0ZjNlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGF5bWVudEluaXRpYXRpb25SZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTc5NWEwMDg3YjcyZWM2MWE4YWY2ZjVlY2QxY2VhMTc5MWM2YmJjNzdjNDYyOTE3MmQ0MTFkNThmYWMyOTllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9QYXltZW50SW5pdGlhdGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjJlZTIzZjVmZWIyY2UxNzYxNWUyNzY2OWJmZWY2Y2U3ODdiNzYwMzM3MmZjZmI5YzhkOTFjYTFkMjE3ODgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9QYXltZW50VGFyZ2V0UHJlcGFyYXRpb25GYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjYyNzA1NmQ4NjY5Y2UyMTI0Nzk1YWIyMTA1NzRjMjNhYjdhZGIwMTc4YjM1NzdjMTExNzNiOTVmNTAzMTI0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGF5bWVudFRhcmdldFByZXBhcmF0aW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4NGEwNzYzMDM1OTllOGY5YmRhMWIzOTFiZTQwZGFhMDQyZTRiNmJlOTRlZGM4YjM0ODRiODE2NWMwOGM2YTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BheW1lbnRUYXJnZXRQcmVwYXJlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDA1NTNjYTA0YTE1MDM0ZGRlZjUwYTkzZDdmMTRmNzkzNjMyZDE5Yjk2NDQ5M2M3ZjQ2MmI4YWIwYjlkZWQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9QcmluY2lwYWxBY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjE5NDRhMDMzMTU0NTVjOGU0ZjcwYTM4ODViMDgxNWUzMWYwMjNkY2RmYzI1MWI4OTdlMWI3MDQzNzBkN2VkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9SZW1vdmluZ1BhcnRpY2lwYW50UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1OGYyNDkzMjFhZWY4MTA1NDRiNGUyNjU5MTNlMGM3ZTMyMzliYzQyZGU1NGRlMTJhY2RlNTdkNDMwNWY3MzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1JlbW92aW5nUGFydGljaXBhbnRSZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQxYWE0OTE1MjYwODBhOTcyYjNmYTMyYWYyNDIxMGFiZGZmNmE4ZTNkYTJhNzc2Yjg4MDk1ZmNmYzQyYmQxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvU2VhcmNoQ29udHJhY3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ2NjFkYWQzNGQ4YzY3MjUwMWRkYzQ2M2MwZDU1YTg0NzRhNDhkZDI0MmY2NGIyZTkyOTY0OTIyZGZjNmY5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvU2Vzc2lvbkVwb2NoQWR2YW5jZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2VkYmYxOTg1NmM4ZmNmNmYzOWUyOTEwNjUwZmUzZWJiNWU4ZmNjOGFkZDExOTFmMWVhYzQ4OThmZjgxZWY1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvU3Vic2NyaWJlVG9TZXNzaW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhNThlNTIyZmRhYTgwZmJkZjEyYjI3M2VlMDI5ZmZjMzEwZmJkODBmNzM0MTU4ODBlMjg0OGNmOGRhOWE0OGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1N1YnNjcmlwdGlvblRvU2Vzc2lvbkZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MzkxODU2YTc0YzZhYmUxMWE5N2U2YjFmNmNlZjFhNmY0MjRhZmNlNDliMWY3Yzk4NDUxNzNhNjM3YjYwNjNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9TdWJzY3JpcHRpb25Ub1Nlc3Npb25Jbml0aWF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGFmNTZhZmI2ZmNiNmVkMzk0OWMwOTg3NzlhNTc3ZTM4ODZiZDYzN2VkY2EwNWFlYTBhZjZiMzJlNjJmNTFiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvU3Vic2NyaXB0aW9uVG9TZXNzaW9uUmV2b2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYWQyOGI5NjVlMmJhZDJjMDNhODZmYWM5OWZkMzkxYTNkMDRjMGM3MzFhNGJmMzAzM2JhNzhjNGY4YTg2Y2ZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9TdWJzY3JpcHRpb25VcGRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGI4ZmExY2VkZTQ3MjE1MTNhNTIzOWEyODY3ODg2ZDRiNDdkYjk1Y2VhODA0ODNkNTM4NmNhMTY4ZDY2MDU2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvVGFyZ2V0RG9jdW1lbnRTZXNzaW9uU3RhcnRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NWJlNDFiYTBkMmU2ZDI5MjRhMDA1MDdlMDk4MDEwZjQ2MmRlYWQwOTE1NTAyYWJmNjQwOWNmN2Q1ODMyY2Q5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYW5jZWxCZWZvcmVDb21wbGV0aW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkODNjMzI1NDJlYTBhMGUyMTkzZDQ5MjdlMTU1YTI2M2E2YzYwMmE3ODM0OGRjNzVmN2RjOGE4NDEyM2VmZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcHR1cmVEZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDFmN2YxOGNkMzIyYzQ2ZmFmYTFkMGFlNmIzMDEyNmJmZTY4YzE3ZTk4ZDI4ZDg1MzVlMTFhNjRjMDkyYmNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXB0dXJlRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmMWQ4NzdiNDFkM2MzOGRjMzliZjllMDg2OWFhNGVjOWY0YzY4MTczYTU0Y2VhNjBkMGM3Y2U5NzY5NjI4NTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcHR1cmVGdW5kc1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDY0MGJmOTA2ODIwNDNmZjIzYTU1MmUyOWYyZDE0OTU0ZmU4YzU4YzI1MDkwNDMwZmEwZTdiOGJlZWRiMTQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkQ2hhcmdlQ29tcGxldGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2NWZlNjA5M2E1YTQ1MWJiNDA3ZGFkODExYmJjMjVhOWRhNDdmNDY2Yjg2ZTI3MjkyMTk2ZDlkODdjNWFmMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRDaGFyZ2VSZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjY1NjNiYzQwMTMwZDQ2ZTlmMmJiZDliN2JmZGE4NzlhNTA5YWQwNTBiMGQxZmZkOWQ5MTcwYjA5YzQyOGNmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZUxvY2tDaGFuZ2VGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWJjOWU4M2QxNDI2MDBkMWRmMDI0OWUyNTI5M2M1Y2RmOGY3ZWNmOTUwMzg4NGU5NWZhMmRhZDg3YzlmNzBiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZUxvY2tSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDRkZWY2MjZhMThlNzgzODBjZWI4NTc0NGQwOGNiNjc2OTJkNDQwOTU2YjliZjlmZWNmZmUwNDFlNTEyMTAzMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZUxvY2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYzI2ZWJkMzZjZDgwNzE0NzdiN2QwMjVjNTkxZTc2ZTI5YWI1NmU0ODZjMzAxMjRlYzliZGE2YjZiMGEyNzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkVHJhbnNhY3Rpb25DYXB0dXJlVW5sb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4MDJjMWY3NTdjYmVlYjFhZjBmZjc5N2E3OGRhZmRlYzE2ZDJiMjBjMjM1YWVmYjBmZmUzNDcxMWIyZTFkZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbkNhcHR1cmVVbmxvY2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTUyMjNiNDAyZDVhNWU1NDkyM2ZkMTBmZDcwNzUxM2FmNzY1MmU3MjNhZTYxZTA1MWQ0NGIxZDU3NmU0OWNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkVHJhbnNhY3Rpb25EZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlMGUxMWU5YmJjMTI4YzRhZjVlOTVjY2VlNDg3N2UwN2QzZmQyMmU2MTUwZDY1NDJjYTMzMmM1ZDU2NDc1MGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXF1ZXN0UmVqZWN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGJmYjMyYmYxNTg4ZmViZTUwNDA4OTJmMjU3OGJlMmQ4Yjc4MGEyMTc0YzQ1MDY2NDBkMTYyZjkzYmIxZjA1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uTW9uaXRvcmluZ1N0YXJ0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzExNDc3MjlkYTc3ODVjZjM3MjYyN2Q4MjFjMDM4MjgwMGRkMmI1ZTBhNjQ5ODgyNjY3YmY2OWI4YTEyMWNmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uTW9uaXRvcmluZ1N0b3BwZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdlYTg5ZDI3NzExMzE2NmYyOGU4NThiOWI0YjAzZWY0YTk3MjVkMWRhMDFmMTVlZTVhNGE5MTU2OGZhNjJiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uUGF5Tm90ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMTA4ZmUyMDg2NjhiYzc0NGE0ODdiOGZhODJkZjQ2MmJiYjAzZDU2Y2YyMjRhNjNjMTBhY2E2MGI3NGZhOTMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkVHJhbnNhY3Rpb25SZXBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTRiMzBlNzdmYzFmZTAyMzVhOGU0MTliYzI4ZmRkNTE4N2JhNDk2MWEwMzFkOGE5MmY2OGNkYWZiZjY2NTUxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2hpbGRQYXlOb3RlSXNzdWFuY2VEZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMGZlYmY4ODBhNDNlZmIyNjVlMDMzNmQ4NDI3M2JjMzZlNzJlZTNiNDY3YjFiNDY3NGQ2MjNmOTgxODQ4ODM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DaGlsZFBheU5vdGVJc3N1ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc5YTAzMjE4ZDRkN2IxNTI3NmEwOGZhY2RkYWE2ODFmNGQyMjI5MTFiYjM4NGRlM2RjYWEyNGEyZTdjMmI3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ29tcGxldGVQYXltZW50UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0ZWVlMDYyZGVjYTlkYTEzNjI2OTk5OGNjMGE0MTRlMTQ0MmQyYTM5OTNmMGU2MWYyNGM4YjNkMzBkZmY1NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0ZpbmFsQW1vdW50UmVzb2x1dGlvblJlamVjdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5YTlhNTkzMmY2MTcxNmU5ODg3MDAxMzM0ZWUwZGUzNTNmOTNkY2Y4YThhMTAzODQxYTM1ZjBhYWYwOWEyOTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0ZpbmFsQW1vdW50UmVzb2x1dGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0N2JjNTI2YjNlZWY0OTU4OTNlYmY2NGY0YmQwYjIwOWU4NmNiYjI2NjY0NDBhMDQ1NzUzNTU4ZWRjM2FiYzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9GaW5hbEFtb3VudFJlc29sdmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmMWRlZTI0NzFmMTY5NjVmZWJiMWZlOGYwZTUxNGFkODE0MThiYTkwZGNiM2Q4NjdkODBjOTkxZDAxNmFkZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0Z1bmRzQ2FwdHVyZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjU4ODA2ZGNlN2NkMzQ2YWUwMGM0OGIzZDczYTY2YzI5NTQ2YTIwN2Q5Njk2ZjRhY2Q4OTk5ZTA1MjczMmQwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvRnVuZHNSZXNlcnZlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YTJjNWQ4OTQxODFlM2Y4NGY1Y2M2NDBjZmI0MmQ5M2U2MDE4OTA3MDNiOTY4MzM1MjZhNmUzZjM2NmRkM2IwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9GdW5kc1NlY3VyZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGVhZmM3OWQ0MDg0ZDk1OThjYjhlNGViZWY1Mjg0YzI4YTM5ODlkNjlhN2FkMTQzY2JkN2YwZTBmOTI4OTRmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvRnVuZHNTZWN1cmluZ0RlY2xpbmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2OWY3Y2Q2N2YxYmYxMzIwZDJmYmRjZTkwYTg4MmYwMzJlMWY1NjJiMjgyZmQ3ZWQwYjFlZWMxOGU1NzNiOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0Z1bmRzU2VjdXJpbmdGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2QwZWE0OWUwODU4ZjhmZDA5NmE4OWZiZGRiOWEzYTFkZDM3Y2Y5YjcyY2E1NmFhZDJmZWFiM2FhMDVlMzg2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvSXNzdWVDaGlsZFBheU5vdGVSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA0MjM5YmQ1MTFmZDVmM2U4YzE1Zjg3YWQzMzUyNTY5YzEzNzFlZjgzOGM1ZGE0NDdmMzM2OTNhYjM0YzgwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvTGlua2VkQ2FyZENoYXJnZUFuZENhcHR1cmVJbW1lZGlhdGVseVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTFjMTk0ZWU0ZmE3OTA0MTcxNWEzMmRiM2EwYjhlNWZhYWUwMGFiMDFhMjM3NjZiMzdiNzEzN2Y2N2M4Njc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9MaW5rZWRDYXJkQ2hhcmdlUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlZmYxY2Y5NDhlNDc3MTYwODU0NWIxMDJhODU1M2Q5ZGVhYTMwNzExNjUyZWY1ZTczMmQ4NGRmYjk0ZjQxZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0xpbmtlZFBheU5vdGVTdGFydEZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NGVlNzBhMDQzOWExZWVjOGMyNTc5ZDc4NjFjMjE3MDM4OWY0YzZlNDc1ZmVjMzliZDQyYWZiZGNiNjQ0MmY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9MaW5rZWRQYXlOb3RlU3RhcnRSZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTViMmE0M2Y2MWJmZTAyOTM0Y2Y2NTEyZWUxMzA2MjFkN2UxNWE4MjMyOWEyYTA2NDYxNTU1MDY5NDJkMGNkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvTGlua2VkUGF5Tm90ZVN0YXJ0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWNjOWQ1ZTVmYzM5ODg5YWMzMmM1NDFiODdmMTk1OGQzMzdmMTY0Yzg2M2I0Y2VkZDYyMTU3MWMyYTg1NGRkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvTWVyY2hhbnRUb0N1c3RvbWVyUGF5Tm90ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjQzYTdkMjJkNGY1ZWE0ZDM5YjllNmE2ZWVlNDE1OWQzNmIwMzNjY2RhNTQwZmZkY2QxZWNjZGI1NGEwZDAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjczMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjljMTA5MDRlYWQ3NmJkMTkzOTQ4MmJkMjgxMGUyN2FjODFmYzIwZDg4OGQ0MjlkMWNhMGVmNDZkNmZkZmI1NmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVBY2NlcHRhbmNlUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwMTg0MmU1ZjYxYThmNmViMDM5NWU4NjMzYmFlYTNiZTM4NDg2NDFmOWNmNWRlMTRjM2RkYzQ0ZmFkZGQ5ZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVBY2NlcHRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4MDRhOGJiYWE3MTU2ZmYyNmYyNWJiNTU1NzM3ZGEwNzA1ZTRiM2IxN2JhYjljMTM1ZDRlODY0MDI2ZTcxMWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVBY2NlcHRlZEJ5Q2xpZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxYmM0NGIzNmIxYWMxYmMxNGI1MTQ4YWE4ODhiZGRkNGFiYmE4OWRkYWVlOWFjOTRhODFjMzE4ZjAwYTI2ZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVBcHByb3ZlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1OTFiMmM5N2NjYWEwZDkyZGIzNGE1MDk4NjQyNmFmODQyZDJhNDI5ZGY2ZTNmYjZlNzQxODc4ZjUwN2NmNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVDYW5jZWxsYXRpb25SZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYTBlOWM2MjJhZGQ4ODg4YTU2MGFhNGM2YWQzZTllM2RiNmYyZmI4OGUxNzIwNThlNWE3NTUyMDJkMDM1NTBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQ2FuY2VsbGF0aW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyMjI2MDc1N2Y0ZjQwMDEzMDk4NmQ5NDhhMDRkYjg5MWE3ODQ5NDc0ZGY3NTQ2ZTU4MGQ0MWIxYTNkYmRjMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVDYW5jZWxsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDRhNDc1NmNiZDMyMzdkYmQzNzk4MDM3MTJhOTk3MTAzMDE4NTg4YmRmZmIxN2JlZjUwY2Y2ZGNiYjc5ZmVkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5Tm90ZUNsaWVudERlY2lzaW9uRGlzY2FyZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzOWEzNTEyN2E1N2VjYWQ1ZjllMGVkZmNhMWQ1YTUwZjc1MzgyODBmOWU0NTIyM2ZlOGUxMDI5NDZhYTcyMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVEZWxpdmVyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNjk3ZWE2ZWMxMDA5M2I5ZTNjMWJlYWFkZGMzZWRkMWJhM2Y1NjhjZTNmNGNlMWJlOWJlOTA2MDlhY2JlNzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlRGVsaXZlcnlGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE1MTM1ZjQwYzhjZTY4NWUwOTAxNDFkOWNmZjQ5MmQzYTcwMGEwYjJhYWIyYTI5MjFhNDJjMzA2NjgwM2ExNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5Tm90ZVJlamVjdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1YTViNWQyZGNjOGZjMWMxNzNkMDQ2ZDM5ZTk5MTAzYjU4MWEyMjUwMWE4MTJjNDcwZDEzZjAwNWI1YzQ0MWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVSZWplY3RlZEJ5Q2xpZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVjZDgxZTE4ZWUyYzk4ODI5NDYyZjgxNDk1MWQwYzI0MGVhMjc4N2VlM2FhOWU2NTY2M2MwMWJjNDA2N2Y4MTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheWVlQXNzaWdubWVudENvbmZpcm1lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZmE1ZmI1MDEyMGNlMzA1MDhiYmQxNzA1MjY4MjMxOTk3ZDVlMDQyZGQxMzM0MGFlNGJkNmFiMWQ4NjM2ZDZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXllZUFzc2lnbm1lbnRSZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZmJjMjM1MDljMjEwNjM1YWFlOWU0MDg2M2Y3YzM0ZTQ0MTBhOWE0MTg3Y2FhZDhiMzU3MjIzMjQ4ZDRhYTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXllZUFzc2lnbm1lbnRSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGEzMzdjZTYwY2M0YTIxNjA3YmQ1MzQ5OGIyYTQ5NGUwYzExYmRjMTk0YmFmZGEzNDcwNGYwZjUyMGE5MzJjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENhbmNlbGxhdGlvbkRlY2xpbmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkyNTAzYWZjZTM2MDNlMTdkZWZmZDNiZDQ4ZDRhZGEzMTMwYzM3ZjQxYTk0MDBiZWQ3MDc4NTg2YmEzNzJmYWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDYW5jZWxsYXRpb25GYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTA4OGVmYTU1NDEzMjUzMDA5MWU5Y2YxYzg2MWE2MmUyOGJmMThjZDQ4ZTU4OWMwYzg4N2UwZDg2YWViYjlkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENhbmNlbGxlZEJlZm9yZUNvbXBsZXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWNkYWZlMGZmNjQ4OWYyMWYxNmI5OTUxYTAyOTdkMDVlZTFiMWExODg3MmRmNDcxYjY3YWM2MjAzNTNlZDFlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENvbXBsZXRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYTYxNjk2ODg0N2U4MzVlNmE4MjliMGY3Y2U0YTE4YzQ4Y2RlNDEzMjBhZGU4NjhhZWEyZjIwZGVjY2UxZmE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50Q29tcGxldGlvbkRlY2xpbmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjOTdkOGQyZGRmMWQyMTI1NjMzNDM2ZjkwNTAxNzg4MmY2NDFmMjA4Mzg0YTRkNjg4ZGZlOGE0MzU3NGM2NGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDb21wbGV0aW9uRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2YThiOWY4YTlkNGRhMzRmN2U4MDc0NWM3ODBkNDgyYjViN2ZmOTVmZWM3YjJlOTczYzFmODc1ZTE2YTNjMDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDb21wbGV0aW9uTG9ja0NoYW5nZUZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjQwNzUwM2VhZTA3ZmQwNzlmZDdhMTYzNGRiNGU3ZWMyYTI1ZmZjYzY1MTU3OTE3ODQ2OTRlMTVhNDUyNjg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50Q29tcGxldGlvbkxvY2tSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTA0Mjk5MmM1NTc3NTAxOGRmMTU3ZTU1NTE4NjMzOGZlNzJmN2IxZDIxOTNhNmZkMjRlZTg0NDIzYmE0MGMwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENvbXBsZXRpb25Mb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2FiZTdhODllYTMzZjJjOTgwNzQyOTc3OGY1ZTI1NzMwNDE0NTdmZDIzYzNkMDM2OTQ3YzEwNGY0ZjExMWEzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENvbXBsZXRpb25VbmxvY2tSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjc0ZTA5NDAxMGExZGE5NmVmN2I5NzVkMjM5N2UxODM1ZDRjNDVmNjMxZWJjMDQ2ZGY5MzNhMDhhZTM0MmU0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENvbXBsZXRpb25VbmxvY2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjJhN2RmZmU3ZjRmZmU1ZjRhYThmYTZhMjdiOTA2ZjQ2NDhlNjNkMjJjOTEyYmVlOWFmNWNhZjMxZTFhN2ZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjRjMTJlZGU1ZTNmMTU2NGRmNzliOTVlZWRjMjgyOWNhOWI1NzNlNTg2NDczMjczZmRhOTA1NmQ2MGQ4MDBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZUF0dGFjaGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5ZmUzODlkZjBlODFkODg1MmYwNzAxMmI5ZTRlM2M3MjljMGVlNzFiMjNmMDQzYjQ1MDA3YzI3NWU3YTk2MmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRNYW5kYXRlQXR0YWNobWVudEZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZjI1NGMxYWY2YjBlZjk0NDFhOTAxMTlmMDBlYzRhNmY1NGY5ZTgxNGZlNDM2Y2VjMDE0MGRlNzQxNzk4NTRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kQXV0aG9yaXphdGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDY5YmRhYTE2NWEwYjRiYTVkNzljMWQ1YWFmY2EwYjU2ZDRiZjMwOTVlODEyY2Y0YTM3ZGM4YzhiMmI3NzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kQXV0aG9yaXphdGlvblJlc3BvbmRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNGQzNjY4OWZmZTU2MjFkYWU0Mzk2ODVkZTIzZThhY2ZmYzdlNDkzNTUzMTYwYTMxYzgxOTZmZmQ2NTcxZTU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kU2V0dGxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODAyN2Q1NTNiMDkxM2M4OGNkNTdlOGJjZjYzMGQ0YzRjN2UwZTE4MGMzODI4Zjk0NDFjMzNiOWZlZWY0YmZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kU2V0dGxlbWVudFJlc3BvbmRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmYwMWFiOGEwMjZlOTE2ZTA2OGY4MmI5ODAxZDhhOTMyODI4MDY5ZmZiOWIxYmZkNzAxNmE3MjUyYjMxNmYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50UmV2ZXJzYWxEZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYjQxMzM2YjQwMzEyMTlhY2M1YjFkNDM2OWRlYzBiYjAxZmMwNWUyMzBiNTdjODZmMmViZmFlNzAzZWFkZjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50UmV2ZXJzYWxGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE0Y2NjMzE2MDhiNDMzNGJjZWZlZDE0NzI5YTkzN2YwOGFkMTFkODBjNTkzZjAzMDEzMzRiMDU1NGQ3NGRiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2FsTG9ja0NoYW5nZUZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDljOGE1MTI2Nzg2NjZhMzBiMjUyZTM1ZDFmMGRlZmIzNzdiZjNkYzcwZTQ5NzNlMzE3YTZiYTI4YzRjYTI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50UmV2ZXJzYWxMb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5ZTcyOTcwMWQxNGEyZGU0OGNkNzVhZDhhZDJlMTkyZjk5ZjA0YWE5ZmIwOTU1OTNlZjhkNTA0MGUyNWM1MzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRSZXZlcnNhbExvY2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2Q5MWRmYzRmN2I2ODgyN2ZiYmUzYjlmNTZmMjg0MjM4YjA5ZWQ0YjU5ODM3NDlkNjE3OGM1ZjhlNjQ4OWVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50UmV2ZXJzYWxVbmxvY2tSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTcyZjFjYzU1ZjkyZWIwZWE4YzI1MWVjNTEwOGEyZjAxYjgyZTVmNzkzMjBlZWQyMmQwMmYyZjk1MjE2ZGQxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2FsVW5sb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDU3OWNhNDdjYTYwMWVhNmEyN2RhZTlhZDYzOThhNGRlNzhhY2Y5ODM2MTVjNTlkZmM5NDg1ZGRlMGQ2NzQzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2VkQWZ0ZXJDb21wbGV0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxNTk4M2IxNmEzYTVmN2YzYzI3NmZmMWRiYjllNThmYjcyODMzMzQwZmY5ZGViZDQ0ZTRjZjA5NjVkMTE5MTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1Jlc2VydmF0aW9uRGVjbGluZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDhjODZiNzY1NzZlYmI2ZGQxZmQ2Njg3NTJjMzViZTY1OWVjOWM3NDIyNjI3MjgxNzRmNzk3MmMyYjZiODRhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUmVzZXJ2YXRpb25SZWxlYXNlRGVjbGluZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2E5YTM1OWVhNjJjZGQ2NmQ3YjBjMThhMDZlYjkyZDlhMDI3YmNhYzU4MDQ4MTg5ZGUyMDBiNGNkOWM3ODI2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUmVzZXJ2YXRpb25SZWxlYXNlUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkZGMwZWI3MGI3YjRiYWM2NzcyMWYzMzQyYzU0MmFiMTUzMDEyMDQwNDFjY2JmYzkzM2MxOWRjM2NkZTYyMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1Jlc2VydmF0aW9uUmVsZWFzZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFkYmMxY2U5Yzk1YWYxYTllOWVhOTEwOTgwNjQ2MjcxZDdjNWYxY2Y3ZTFjMGE4MTQ2NDQzN2ExOGRlODkzNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUmVzZXJ2ZUZ1bmRzQW5kQ2FwdHVyZUltbWVkaWF0ZWx5UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzMjU1NDM4N2RhM2NjZGU4MGJmMGVlY2NkYmZhNWQ5ZDA1ZWUzNmY1OGE0NDlkNzkxZmY3MjhmNGY1MWQzN2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1Jlc2VydmVGdW5kc1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYjM0NGQ2NGFhNTU4YjRmNTMwNzg2ODAzNGFhMzBiMjY4MjUzYjNjNTk2MmEyNjg5ZTA0MDE1NTJhNmYyYzNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9SZXZlcnNlQWZ0ZXJDb21wbGV0aW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3ZWM4MGM1MWVhYWI2MmQxOGNkNzVkZGUyZjIyYmFjYTNhZWQxZDJiMDY4NmQ3ZDM2YzNiZTA5YTNkNmYyNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1JldmVyc2VDYXJkQ2hhcmdlQW5kQ2FwdHVyZUltbWVkaWF0ZWx5UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4NjBlOWYyZDZhYzQxMDFlNmNkYWYwNmJjMDRjNDgzMDRjNzMzODQxZDllNTUzNTU2MDM5OGEwMTVjOThmY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1JldmVyc2VDYXJkQ2hhcmdlUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjOWZhYTlmNTYyNDMyNWFkMWRkMjkzYTM5YTU5MDQwNzM0NWU3YWQ5NTcxYjI2ZTk1NDc5NmM4ZDFhNGQ0MzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1NlY3VyZUZ1bmRzUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxYjMyYjU5M2JhNmY2MDY4NGI4NjYxNDIwYmQ3NWYyNDA5YjI5NDI5NTNmYzQ2MWE5YmY2MmMzNWE3ZTUzY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1NldHRsZW1lbnRBbW91bnRSZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWJkNDc3ZDRhNDA3NjRiYjZhMWZmYjU1NGNjNGE2Yzc4OWEyODljNzE5MTBlMmJjZmE2ODBlYjU0MDZjNjRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9TZXR0bGVtZW50QW1vdW50U3BlY2lmaWVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYzY4NDUxZTNlNWZkNmEwOWVjMDkzNzE4MzkwMDU5YmQ2ZTQ2NTE2YzUyNDI5ZDA5OTY0NDUzM2Y2YjE4YzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1N0YXJ0Q2FyZFRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZTU2NTM1YmM4ODQwZjU0NmI1MGY0NWVkMjYxMGQ3YmI3NDRiNWU2NTQ3YWExYzY4NGFhYWY5Mzc2OTg0Y2NlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRmMDM3MDQ0ZDI4MWIzMzJkZjMxMWYxODcwY2MyMWE4ZDUwNTlhMTY0YzZmMTZjMzlmMDgyYTZmNjEwY2M5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlTG9ja0NoYW5nZUZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjRmNGUzYjcwYzlmYmIzYWJiMjBlOGJiZmI0YTBlMDM2ZDQ0OWY1NzA2NDdlMzUyMWFiNTAyZTg3NGJlMGNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVMb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0NTlhZWNjOWQwY2ZmNTkwOWI2OWRkZjA0YmIwMmEwOTVhNzMwZTg1ODk5MTc2OWYwODQ5ZmQ5OTg3NzNkMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZUxvY2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODA3N2ZjOWIwMmRmZTJjMmU1MzhhOTU0YTI2YjA3M2MzMmQxMjE5YzIwNGI1M2IzMGNhYzVkODQyMmJhMzg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVSZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOWMxOWFmYTUzMzA3OGVkZGM1YzQ2Y2I2YjdiNzExYzBmNjI2NzU2NDU1MjEzNGFmODhkNmQ5NDdhZTQ5MWQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDJiMGRhZjhjZDQ4OGM4ZDE4MjI5NDMyMTg1ODBhYWJjNzRkYTE1ZDNkZDM0NWIwMDhiMTY4NDhiMTk0OWMzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlVW5sb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhNTA3MjIxYTJjNGU0YWIwMmQyYjkzNTQxZDNmMzk4NTE3YTdhZTAwMDhmNjZlODIyNzQ2ODM1Mzg2ODUwZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZVVubG9ja2VkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4ZGMyYTMxMWYwNzhjZTM1YjcwN2RmZWVlMzMxOGViNWFkYTFkYTlmYzM0MmMyZmE5YWU1MmJmNWZiZGQ3MjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQyMjFkOTIyNjQ2MTQ1ZmYxMDc2NzQyNmEzNjVlMDg1YzE4ZDg4ZDY4MzI1YTFmMzBiMzY4NGUyNjhkMjRkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25JZGVudGlmaWNhdGlvbkZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NTY5MDQ0MGQ1YzEzZjJkNDkzYzAwZTQ0ZGNiN2FhODY3Mzc1MzFjYTk0OWI4NmI1YmYxMjRhMzE3MmMwZWVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbklkZW50aWZpZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQ1OTk2OGQ5ZTY3MzNjYWE2ODEwZTExNzI5NTcyODM3YWFkOGM2NDhhYmZkZDk3ZDgwYjY4ZmUyZGQ3OGNiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25Jbml0aWF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmU2YjcxZWVmY2Y5ZGRmYjg3YmY4Mzg3YzA0YzhjZTk0NjgxZDA5ZWNhYWY1YjUxNzllNjA0ZjY5ZWQ1OWQ4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25Jbml0aWF0aW9uRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwMmE3YmQ2MGFhZWMyZThmMGZhYzRmZGZkMTM5NjlhMTNhNWQ5ZDVlOTQ0MTg3NGFmNzFmZjQyMDFmZmVhOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uU3RhdHVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImNlMjUxM2ZkOTI0ZWFlMmUxMzVkM2RlYzNlYTE4MzA3YTQ4MDdiNjZiNGZkNTRkY2U1YzNhY2E0NjZmMjg3OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wcm92aWRlci9Db21wb3NpdGVOb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYTFkZTE3OTYxN2I3MzNiNzQzZTZjZWI5MGM3ZWNiMzgxZjY0Mjk2M2ZkNWMyNzNmNGVkNjBkMDVhM2QwMDM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcHJvdmlkZXIvUmVwb3NpdG9yeU5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE2YTYwNGVjZWI5NGVjODhjNTVjMGEwNGY3ZjgzYzAzZTE2NjA2MGE4NDMzZTZjYTZmZDBiYTZlMGVjZjcwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3Nlc3Npb25pbnRlcmFjdGlvbi9Eb2N1bWVudFNlc3Npb25SZWZlcmVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBlNDM0YWJjZTBmMjMyMjY4YmUwNzFjNGQxNmIzMTA2ZDVhZmI1Yzk0MzAxZjk0MzYwZDIyYWYwNTQ2NGRlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL0Jvb3RzdHJhcFR5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5ZmVlMTZjYTgwZTdjNGJhNDZhYmUxMDg3NGMwY2JhN2Q1MzExNzg4NWFkYWM0NDU5ZDk3M2Y0OTdmZWQ5YWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby90eXBlcy9Db21tb25UeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NzBmY2I3NmU4MWRlMmIyOGY2NjVmZjg5YmE5ZDUzMTViMDllYWZmMTM0YmNhNmFlNGYwMDdmMTdlOTU2MTYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vdHlwZXMvQ29vcmRpbmF0aW9uVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmQxNzViMzJlOWNlYTE1MjFhMjY3NzkzOWIzMmIxYjhhNTBlNDRhNjRkOGViZDIzN2UxYmJiMzU2YWY1Y2JkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL0ZJTk9TQ0RNNjBkMDdUeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzA1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImRlNWJkNWY0Mjg5M2QxZGY1YWIyMTQ0MTE4MmExMzE1NjYzNWI1MWU2Y2I0NTg1ZWUzYWQ2NmNjMmY0MDAwMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby90eXBlcy9NYW5kYXRlVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM2ZjUwNDU3ZWFhODVlMGUyY2ZmMzYxYTEwZGVlZTI1M2Q1MTI3MjJjZjFhYmYxODhiMWU0Nzc5YTU1ZWQ5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL015T1NUeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NGFiNTQxODJmNTJlZDE4NjU3YmUzMzJmMGEzYmVmZjc4Y2IyOGMzNjc4NWU5YjE0MmQyOTAxNmViYWYzMDVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vdHlwZXMvUGF5Tm90ZVR5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMWU3OWQ1ZjgyMWExYzFiNzI5OWE0YjNiMzYwNjgxOWIwMGY1NzliYmFlYWFiM2MxMDZlZTEyNzhmMWMxNWYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vdHlwZXMvU2Vzc2lvbkludGVyYWN0aW9uVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZmE4YjIzNzIwYzkzN2Y0NGJjZjY0YTFmZmQzZjA4YWJjMDU1ODZlMGI4NmQxNjljNGYyN2ZlM2ZhMWMyN2JmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vdHlwZXMvV29ya2Zsb3dzVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI4ZWUyOWRlNDQyZTM5Nzk5NDVmNWM0YzNkZWNiODNmYTkwYjQ0ZDE1OGEwNWJlMjJjODc3YWM4MzdiNGM1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9BY2NlcHRDaGFuZ2VPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmZjNTUxNGQ2OThkNzgyMGE3NGE4YmMwYzBlY2UyM2VkMzZlZTExNjUxOThiNTcyOWVmNmRhZjEzY2E3ZTBiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9BY2NlcHRDaGFuZ2VXb3JrZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MWZmZGQ3YjAyNGUyNDE2NWMxODBkNjUwZjEwNDQ4ZTM0OTZkNWM2ZWQ2NjQ0YjZlODEyMTQ0Y2NjYTU5MTc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0NoYW5nZU9wZXJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmM2ZlZTM1YzlkNDMxNGQ3NTk1MmY3NjczNTNjMjQ1ODg2MThhNGYxMmQzYzMyOGM5M2JhMGUxYzU2YmI0ZTdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0NoYW5nZVJlcXVlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjIwMmIzOTY5Y2UzZjRjMmE5ZjY5NjQ2NzBkYTU1M2Y4MjI1ZmMxZDE4YjI1ZDQ0ZTE5NTcwMTU5ODNlNDNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9DaGFuZ2VXb3JrZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNDQyM2Y0ZTlhNzBlN2Q1NjI4ZjE0OTRjNWJlMGYxYWQ0OWZlMTBkNmMzY2FkNTUxYTQwNjg5ZDM1YmNhY2FhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0NvbnRyYWN0c0NoYW5nZVBvbGljeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYjZjZWNlNDg2NWI3YmU4NWI0MGUwYjkyMWRjNjgyZWE2YmU3ZjVhOTZkZGY3Yzc4MDYzNTdjZmQ0NTQ1NzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0N1c3RvbWVyQ29uc2VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDQ0NGE2YjhhOTlhNDI0ZDgwODZhZTZkMzBlZDRhODVkZWMwOWY3NDg2ZmI4OTIxYzg1ZGQwMjRiZjRjYmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0RvY3VtZW50U2VjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzlmZWYyZGQ1MzE2Yzg3YjNjNDEyMDIyNjI5ZWJkNTVkMjQ4ZWJmNzU3MzY4ZTNjOTdlNmRlNWRjODNhMDljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0RvY3VtZW50U2VjdGlvbkNoYW5nZUVudHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjZWU5OTk3ZmNjMzNlYTdmMDQ2MTM5Mzk5YWVjMzNhYjE4ZWVhZWI1YTgxNTkwMmY3NzM1OWU2YjM5NTA4MDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvRG9jdW1lbnRTZWN0aW9uQ2hhbmdlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMjI1Mzk5Y2U5OTZjOGUwZDMzYjg3NzFiZTUzYjU3Y2U0MzU1YzA3Nzc4MGI0Y2M4OWZlMGY2ZWYwMmE3MGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL1Byb3Bvc2VDaGFuZ2VPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2ZiZjJiYTZiMTAxZDdmZWIyZTVmM2VjZDg1Yjg0NjVmODc2NjZkMWI3NmM4ZDc2NDY2NmI0MjRlMzk2ZGViMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9Qcm9wb3NlQ2hhbmdlV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE1NDQ0OGI2MWMyNjA3YzY5NDIwMTM2YmZkZjFkNGFiZjY3NDg5ZGMwY2E4MGU1YTNhNzRhZGE1YjUzZWI5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9Qcm9wb3NlZENoYW5nZUludmFsaWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzJiNzEwODhkODk0YmNmNmU3MDEzZjM4NDlkZTI4ZTMxN2NjNDRiMzVkOTIwYmVkYzYyODhkMWUzODVkNTM1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9SZWplY3RDaGFuZ2VPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI5YmM5MjU3NDFkZTRlZjNkNGRjZWIwM2I3YzllZmI3NGFlNmQzYjNhOGNkYTcxNmU3MDE2YzZiY2FmYzQ2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9SZWplY3RDaGFuZ2VXb3JrZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWFmMjliZDYxNzhkYzg3ZTBmYzMwYmUxYTk2ODcyNTE4MTlmNjJlYjYzOGVmZTM3OWQwZGNhY2I0ODVmZTc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9CbHVlUmVwb3NpdG9yeS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjM2MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Mjc3NzlkNmE4NDhmMGZlODlhOTZmNThiNjUzNzcyNjJkMDYwZjMzNTUzNjg5YzhjOWE5NWNlYjgzZGE4MGNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Cb290c3RyYXAvRG9jdW1lbnRCb290c3RyYXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllNThlMWRkNGRkZWRmNTJjNWI4MzBjOGJmOGRmODljZDExNzE4YzkxNzM5YmU2N2NkODFhZmY0ZTFiOWFlYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcENvbXBsZXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkZTdiMTZkYmY2YzU3NDY5YmI5YzYwMTY4MTQ1MzA1ODMyNDVkZDVkMjkyNmZhM2RjYzY0NzFmNjU5ZDMzNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcERlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmY1ZmY2YjMyYmM4NjBmYzllMWMzZTdkNWRkZDIzNDAzY2UzZTIwNjMwN2U1ZjE4YmI1YzA0NWMyNmQwNzNiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIwMTJkMDliM2QyMzViMzI0NDk3OTE5ODhmZTRiOTZhMWI5MTQwNTUyMjEzNzAyNGY3ODNhZjQ0YmJjOTQ4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwSW5Qcm9ncmVzcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2OTkxMGU5MjZhMTEwOTlhZWM0N2JmY2ZmMzg5MmQ5YmUwZWFhOWUxNDUyMjQ2NmVmMzMzYTQ1ZjFhNTg4NjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcFJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWE2Mjk4OWI2ZjJhY2ExYzE0MmViZTA4YzJkMjU4ODU0ODAwZTY2MTc5YTM0MzJmNTFiODJiOGY1YWQxZmFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Cb290c3RyYXAvUGFydGljaXBhbnRNYXBwaW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2IyNmE3ZmJjZmE1YTI3YzM2ZDk2OWQzNjg2NmJlOWExYTJlMjY0YjM5NjM1OWU2MTIxY2YzY2E1N2E0ZWYyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL0NyeXB0b0VkMjU1MTlWZXJpZnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OGI5ZmJmMzE2MjRhYTk0ZDVjYjg5ZTJkODBmYmRkMDc2ZTg0N2U5NzRkZWFjOTY3ZDMyNjMzYjliZTIzYzg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vQ3VycmVuY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjU5YzY4MzgyMmM0OTE0YjMwNDdmMzQxYjM2Y2VkNDMwNGZhNjY3N2Y0MDBkOTMxZTEwY2YyZWJiMTBkNjY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vRG9jdW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjJhMjhiMDQwN2M2MWI3NTNjN2Y4Njc4NmI4YWUxYzI0ODE1NzViNGZkZWI1YjRlODViZTQ5Y2IxMDE2M2ZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vTmFtZWRFdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxNzIxYTFkNjUxMjAxNDk3MGRhZThmM2Y2OTkzMGNkZGYwZTY5YjUwODllOGNmODg2MmM3NjczZjU5Njg4YTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9QYXltZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGUxMWFhYzllMGVlODdiMDM2NzUzNTUwZDc3MDBiNGNjMzZlMGRjYjczMjM5ZGQ3NzFhZWU5MTMxODhmOTU0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1Byb2ZpbGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjQyNmE2NTY3MGQ3MTAyMDg0NmEzMDM2ODM2YTVkZjEzMTIzZmUyZmZkMmY4YzAyYTQzZjgyOGRkYmYwZjcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vUmVjb3JkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzk4MWJhYTUwNjdhYTgzN2EzNzM5OTE4NDM0YjFlNzU5M2FhNDkyZTVmMjI4ZWE3OGM1NjIxNmY5MGUxNTE1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1JlbGF0aW9uc2hpcC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwODI4NDU4YmY5NjE1Y2ZiODhmYjVkYTVjNjU2Y2ZmYTQ5OWEwY2RiNzVkNjkzY2UzNDM1ODUxZGE2OTY5N2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9SZXF1ZXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M4MWRmM2I1Mjg4OTAyZmRkY2MyNTZmNGQ5OGU4YTUxMzUyMGZkYzRiZmMxNTM0NDI5ODI3MmY4YTAyMGYwOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1Jlc3BvbnNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODhmYTZkZTg3OTZiMzE3ZTc2YWY4ZmE0YTQ0MTdhOTRkMGJmMDBkOGQ2N2QwZjliMzA4YWNkNGUwOWJhZTM4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1NlcnZpY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxODA4MDM5N2M5MzU1OWE1OTA4YjQwMTc3ZDQzNjU4YjRkNDk3N2I1NTI3ZGZhOGE1ODk2Y2NlODlhYzE0NzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vU3BhY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4N2NkYjI3MTI2MjlkMzIwOGFkZGVjNzRiMjBkNjNkM2Y4ZjU3NDk5MmQ5ZmYxZmU0ZDA1NjgyNGIyOGQ1ZTNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vVGFzay5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjMmJjMmM0ZmExMzU5ZjI3N2Q3NjZjZDFmNjRmZGExYTA1OGU1YzRkYjU5ZDcwNTQxZmY2MjY1ZDdhYTUxZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9UaW1lc3RhbXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzlmOTVlODUxMDRiMzFhOGYwMmM2OGZjZGRhNWY4NzhjZjY3YmM0NGM3N2YwMTdiMGVlOGQxMzdhZWZjMTQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQVBJQ2FsbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzg2YWZlZWQ2YmQzMDI5Yzk2Zjk1ZDZhMDAxZDg4ZmRiMjhhMTYwMzA4ODJlNDgwMjc0MmIxZDNkMDk0ODk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQWN0b3IuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBmMGZhNmY5MzUwMTg3YWE2MGI0ZGQ0NjMzOTM5ZGRmMDZkYmFhNjZlNTUwZTdhMjVhZGRmYWVlMzIxN2M0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0FjdG9yUG9saWN5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlMTJkN2JjZGMzOGEyNWQzYjE0ZDAwZjZmNTA0MzczOWJlMTA4MzQyZGI3MDQzNTliYTBkNTI1ZWFhNDQ2Y2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9BZ2VudEFjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5NzhkYWRmMzhlYmEzMzNjODQ0OWE5MGUzMjRkNGFlNjg1YmY2YTQxNWM4ZjU1NTY0NDRhODllODY3N2NiZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9BbGxUaW1lbGluZXNDaGFubmVsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyY2ZmNWNiNjA2ZTVmNGNkMmFkNjVmM2IxMTQ5MTZhZDk5MWYzNmQ5ZjE2YjA5MGQ0OGJiNjk1MzcyMjFhODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9BdXRob3JpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZTU2MTg5YTFjNDU4NWY1OGIzYjJhYWE4YTMwYTQ5OTE5ODVjOGEwOWFhMGM0YWRhNmI0ZDM4M2E0MjM4ZTQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQnJvd3NlclNlc3Npb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGNiNzhiMzY5OWNiYzkwNDVkOGZkZGNjNDI3YmVkMDBiMTg5MzBhOTY3MDFiOWU0NWZkMjNmODVhYzIwODcyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0NoYXRNZXNzYWdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhlOGY4ZmQ5MDk4YjlhNTczOWVhYmExZTE2ZWY1NzdkMzE4MGUxOTc3YjczYTIxODllM2Y2MmI0MTc4ZmMwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0NoYXRXb3JrZmxvd09wZXJhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2IwYWI5NjBlYTVhNGViMjU2NjA1MTY3MjEzZDM3OTZhZGQyNGFlYTY2ZTA3ZWVmOTE2ZWQwY2E1YjBiZjdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQ29tcG9zaXRlVGltZWxpbmVDaGFubmVsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzYTZhMzFiZmQ5YThlNmU0NWM3MDViMjRkZTBiM2M4Yjk3MTY1ZGJlYTk1N2RkNmIxZGYzNGFlY2EzMTcwMzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9Db21wdXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzZDI0NjVlNmY3ZWU4MjFjYzcxODIwZDU5M2M2MGM0NmRlOTBmZGYwMTQxYTBkOGQ5NGYyY2ViZDhlZjlmYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9Db21wdXRlRGVmaW5pdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzI0M2YyN2JiMGUzMjE5ODRlY2ZmNmFiOGFhZGJmZDRjYzE2ZDYwYmU1ZmRjZmI0NTU3NGMxMTRmNTgxMDRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQ3VzdG9tZXJBY3Rpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWI4NDFlMTFmNDgzNWNiZjY3N2U3YTVmYmRhZDE0NDY4OWUzMDcwMDI5ZWY4ZTNmZmRmMTdlM2RiNDA3N2RiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0N1c3RvbWVyQWN0aW9uUmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxMTY4NzZjMzkyOWQ4MjI4MDk5Y2RlZTMyODE0YTdkMzU3NmU4ODgyMDBhZmQzYTAxMGQxMWY5NzhkZmQwZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9DdXN0b21lckNvbnNlbnRSZXZva2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5MTkwZThjNzllYTMyNTRhOGI2ZTQ1MzMyODg0ZWE3MzhkMWJmYWQ2MmRhNTYwZWU2MGU2MTVjYmNkZDA2MzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9Eb2N1bWVudEFuY2hvci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkOWFkYzEyMDAxMTI2ODE4M2YzMDAxYjVlNWNkYjE5M2VhNjMzNGVmOGNmNjY2MGNhZTA3NmFjNGVkZmMzMWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9Eb2N1bWVudEFuY2hvcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTNlMThmZWZhOTIyNTQwNWQ5MmJmMzVjMmFlOGYxOWMyYzZmZDM3MzMyMjBmODc5MGNkMjE1YjI4ZmUwNWViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRCb290c3RyYXBDb21wbGV0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDA2MTQ5ZTc2YTFkYTlhMjdlNzk5NzQxODk4MmRkNzcwMmI2ZGQ2MzI2NmU3MDMyYmU1MThiOTRkZDdhOWQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRCb290c3RyYXBGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTYxMDQ4ZTYwMDMzYjkyNGNkN2FhOTNlNzRkNmJhODE1Zjg3NGEzNGM4MmUxMjQxZWNhZTM2NGI4M2FmYThjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRCb290c3RyYXBSZXNwb25kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTExMmExNTc2NTM2N2E4NTRhZjY3NmFhNDgzNzFhN2ZhODQ1YjNkNWRkN2RlZTEyZjViNTA2YmVhYWJhZWJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRMaW5rLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImUwYWZjNmY1OGExNWMxZTMzMzEzMDg4NmMxZmVjYmQwMDViNjU2MTVkYmE2NjRmNThlYzE3YTZkYzAwMDc2NjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9Eb2N1bWVudExpbmtzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGU1Mjg5Nzc2ZjU2ZjcyNWM3YmQwZGM5Mjg3ZGRkM2QwOWM2NmFkYThkZmZjYWNmODE5NzU2MjJmZTJlZWQwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0RvY3VtZW50UmVxdWVzdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNWJkMjBkNTA0OTg0MDY4N2JjYjFlNTcyY2I5OTFjMTgwZTA4YmM3N2FlNTRjYWIyNzQ1ODE2NDFlYjgzNGYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRTdGF0dXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzI4ODI4ZjM0MmUyNWZiZDFhYTcyMjU2NGZmMjllYTY2NDEzMjg1MGEyNTRhOGFjYWNhNmVhMjY0MzQ2ZWMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZGEzZWQyYTA4MTFhNWIwMTE4YTJkNDNmYTcyYTA4OTYxMjM2ZTEzMmUzN2ZjODY1YzY3YWFlMTUyZjA5MzdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vSW5mb3JtVXNlckFib3V0UGVuZGluZ0FjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2QyOTk0Y2MxZDM4MTE0ODk3MDdlMGRkM2UwZjIzYjAzZDhkMzVhZDUzOGE4NGUwYmNhMTk2OWFiNDliZTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vTGlmZWN5Y2xlRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNWJlNjU1ZjZjNjVkZWJhYTBjNTQyNTUwMGQxNDA5ZTI2MmFmZGMyYmEyODE0MTUyNjk3ZjAxMjA4Y2VkZDI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vTWVzc2FnZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjRlNzJkNTYxOGJmNDJkMTE5NmQ0ZGRhYzRjY2VlNDc0YmZhYjU2YWEzN2E1N2ExMGY1NWRkM2JlYWEyODY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vT3BlcmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkY2ZjOWNmNTNmN2Y2NzM3Njc0ZmE3MmFhY2U2Y2QzNjYzZDg1NGY0NjQ2NDMwMjY5NGVkY2NlOGU1NDQ3MjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9PcGVyYXRpb25SZXF1ZXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5NzYzZjFmZTVjYTU4ZDBiNDEyNWU4ZDBlMjhhM2E4NmZiNDBhYmM0YmRjODA1MDhhNzAxZGQ3NDVhOTJkMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9QYXJ0aWNpcGFudFB1cnBvc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhM2RlZTZjNDA0OGFiNDAwNWRiMjRjMjc1MGNkMDgyNzI5MDVhZjAwMjYzMjA5NTY4ZDVhZDUxNWQzNzJmNTlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vUHJpbmNpcGFsQWN0b3IuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M4MjE1NWM5MDYwNjZkMmM1ZjI5ZjExNTVjZTllOTNkOWQyZTA1Y2Q3MDljZThhMjlkOGNiMmJmZTI5NTIwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1B1cnBvc2VTdGF0ZW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDg1Mzc3ZWJkMThkYzBiMjY0ZmM5ODlhZWE3M2IxOTM4MTYzOGY5MGJmMTg1MTk5ZjkzYjAzNjVlNGIxZWNmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1JlcXVlc3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2NlMTRlZDIyNmZhNTcxOWM0NzFjZDUzMTcxMDFiYTEyMzZlODg4MjkyY2FhODViOWFkZTk1NmY5MjBlMTliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vUmVzcG9uc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMWU0NmQxNWQ5ZmQ4ODI3Zjk4ZDJmZmQyNzk5ODFlMTUzNTE2OGU1NWQ5MjkxOGU4MWFlYTg4NWM1YWM0YjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU2VxdWVudGlhbFdvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4MTliNzM0NjVkMzlmY2YzMzdhZmIzYzczYzI2Zjc2MmNhZjZhNDE0MjAyNWY5YTc5ZWU0MThmNDU0YzA4MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TZXF1ZW50aWFsV29ya2Zsb3dPcGVyYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFhNWQ3ZTUxZjgyNjY4MTRhMGYxODA2Mzc1OGY3OTYxZTI2MjIxNjMzNjA5YTAyMzUwYWU2YWMyNzQwOGEwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1NlcXVlbnRpYWxXb3JrZmxvd1N0ZXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZDBjOGI1NDg2NTA3MWNiM2RlOGU1ZTdhNDI4OTgwNjE1MDkyMjE0N2VjOGVlMDgzMTdkZGQ5NzFiMzgzYmYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYTg3MzE4OGE0MmNiYWI1OGE3NzNiOWU0Yjc3NjRlZGUzMTE3YmI3ZDU3NjMwZGNiZWY0ZDc2MzE0NzQxZGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TdGF0dXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTgyMThkNmEwMmJmMjNiNGUxYjVjNjEwMzUxMDc0OGRlNTdlNGMwMzVlYjFjNGYzNmZhZjkyN2IxOGRkYTcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU3RhdHVzQ2hhbmdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2IzMDFmOTdhODNjMjIxMjkzYzZmMjYwZDQ2ZWU0ZDBiYzYxYzM3NjdlODI3NWNmN2M5ZDU2NTBmZmUxZjU3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1N0YXR1c0NvbXBsZXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImM5OTE2OTU5NWFkYjU0MWIzODA2NmIwODgwNGNmNTllYWQ5MzBiZDJkN2I1ZjJlNGQzN2FmNjcxYjI3N2E4NTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TdGF0dXNEZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmZTQ5ZGIwMGZmMjBmOTBhMGZmMTJkYmI2NTYxZmIyNWQxOTVjNGEzMDk4NzQ5YmExYzNhMjQxOTlmZTIxYmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TdGF0dXNGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzlhOGY0ZWE5YTBhOWQ5NDIyZDJmYjY0MDk3ZDJiYTZmMGI5N2Q3MjJkY2Q5ZGE0NTg5OTY5NjVmNGEwMDRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU3RhdHVzSW5Qcm9ncmVzcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0MmY0ODRmZmI4OWM4ZDQxZWZhMDY1OGVhZDRhMzMwN2YzZDU2ZmJhOWZjYjM4MjQ1YjJmNzY1YmJjNTBhYmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TdGF0dXNQZW5kaW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTM4ZDgwZTEwMmI0YmM5NDEwNTljMWFmYzliYmZiOGYzMWY2Y2UyMTk0NjA0NzUzNjRiODMwNDhhY2FjODAyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1Rlcm1pbmF0ZVByb2Nlc3NpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI4YjE4M2QxMmQ1NDVkODQ1M2E1YTBlMjMyNTFjNDFlNWIwMjE0MjZkYzExYTI4ZTRhMGM2ZGUyMTdiNWRkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1RpbWVsaW5lLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4OGViNjIzODU0ZTkyOWNiZDBmYzhjYWU0Nzc0ODViOGI4OGI2YjE1MmQ0YTA4NGFlYzdmMjdmMDVkZGYwZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9UaW1lbGluZUNoYW5uZWwuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JiN2I5Y2IyMDUyMDIzZDUxYmM5M2JlZmFkMzkwZjRjNzI2NjNhNDI5MmJiYmQ5Mzk2Zjg1MDhiMThhNDkyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1RpbWVsaW5lRW50cnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjZjZDFiNGY2NjAxOThiMWNlNjc3NGM5NDQ3OTAxNGNjNDY2Yjc3MjhmNzA2NmI5M2FjZDRlNTA0MDJjM2M0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1RyaWdnZXJFdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODFlMmQxYmNkYzc3ZWFkOTI1OGNkMWJhMTAxNjJlNjIwZTFiZTc1YmY4ZWMxMWJiMTBmYmM2ODZiMDNhMjcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vVXBkYXRlRG9jdW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmFlOTQyMDc1NDA5ZDgwYzIwYTk5MzQzZjJiZGE0YTVkZjQzYTYyYjY3MTkwYTA1MGFlYTE2Njk1OWY2ZGUzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQWRqdXN0YWJsZURhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzlhZDVlYjc2ODFmZTNjYzRlN2FhM2Q3MTUzN2IwYzRiY2IxODdmZGI0MTllYjQ1MjhkZDI5NjcwYjRlMzhhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQWRqdXN0YWJsZURhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImE4ZjViNTJlYmVhZjg2Mjg3ODk3NmEyZmFlZjBhOWIxNzliMjYwZjM0ZTFiNzQxZTdjZjQwODU3ZTBiMjQ2OWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUFkanVzdGFibGVPckFkanVzdGVkRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNWVkZTk4ZGI3ODRmNDk3OWI2ZmM3NGQwZWE0YWFlYWRlZWM2NmU0OWNjOGExNTk2NDUxNmFjOGRiMTNiZDQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVBZGp1c3RhYmxlT3JBZGp1c3RlZE9yUmVsYXRpdmVEYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0NDI5NWI3MjJjMzA2YjkwNjdkNzc1Y2JkM2IwYmFjMjU0OWVhZTY2NjQ0OTNiMzM5YmVlMmYxZGRkZmFhMWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImViYTcxODVlNWYyNzI5MTBkNmFkMmY1NzRhODdmY2VlNWY0ZGJjNmY5MWMyMTA5NzkxYjU0MGFjZmM2ODRkZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMGRkYjIzNjM2MGIzODlkOGMxMmRiMWQwZjY1MjI5ZDRjMTU0MzA0NjkwZDBmOTVlYjUyZGYzMDc2ZmYyZDFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVBZGp1c3RhYmxlUmVsYXRpdmVPclBlcmlvZGljRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjA3NjE0ZTI1YmQ4ZjAzYWMzZjM2N2NhMWVhOTRiYzI0MDYxZTFmNjJmOTM1MjU3YjA0NjNhOGYyNTUyZTlmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQWRqdXN0ZWRSZWxhdGl2ZURhdGVPZmZzZXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzE3NzIxMzg1NzM3NzliMzY2MWUzZDJmYjI4MzYyODNkM2Y3MzZkMjgxMzQ3OGY3NDQxZDZjZGQzOWFkZWY5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQXZlcmFnaW5nU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjBhM2FiOTY4NzlhZmU2MTJkMmNiMjM0NTMyYzcwNjI0YjUzNzJkMTkwZTJjOGM5Nzc2MTFhN2RlOTE5Y2NhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVCdXNpbmVzc0NlbnRlckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTA0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4OGViMWU0YTE0ZjZjNGRjNTI5YzZkNmM4OWJjNzY3YjgyOWY2YzcyNDA2YmI0NjRiNzMwZTljZjEyMjBkYzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUJ1c2luZXNzQ2VudGVyVGltZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmNmFhODMxOGYxOGEwYzAwMGQ5NTQ0NTVjYmM4MDQwMDFhNmZhYjgxNzc4MTFkNGU4OTc2NGRkYzI5YzY4ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUJ1c2luZXNzQ2VudGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTg5ZDFjZmY0ZjUwMGU4OGY2YWMyOGRjMmFlOGUzNmI0MzJkYTVmN2JlNTMxZTY3ODNiMmVjOTE5MTVkYzdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVCdXNpbmVzc0RhdGVSYW5nZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMWQ4YWFhMjYxM2M3NWRkYjdmODc5MjcwZTQ4ZjBlMzMzNTBmMzg1YTkwODEwZWVkMjA4MjI3MmFlMmJjOTU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVCdXNpbmVzc0RheUFkanVzdG1lbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGU2NWY0ZWQ1Mjk4MjVkMjY3YWM2MGVmNWU0MzczZDRlYTMyNmZlY2UyZWU4M2QwMjNmODk5YjhlODBlYTRjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQnVzaW5lc3NEYXlDb252ZW50aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWQ5MjY1YThmZDE2ZTNhMTlhYTI2Yzg0MWUxMjkwMDc1MzRmNzQwZDY3MjA4ZjdkZmI4ZjIwOTlhMzQzNDJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVDYWxjdWxhdGlvbkZyZXF1ZW5jeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhN2U0NmVmMTNiM2E3ODRkNjhmYWU0OGE1NmZkMjg5ZDdlZjkzMTdiMzVlMmJhM2FkYWQ4YWNlMDdkNzgzNjZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVDYWxjdWxhdGlvblBlcmlvZEZyZXF1ZW5jeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTU0OGI2OWY2NDA1YTRmYzdjNDIwZTc3MDg5NDY1NTFmY2VkMGVmMTJjYTNkYmNkYzRkYjM4MWRjNGU2OTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVDb21tb2RpdHlCdXNpbmVzc0NhbGVuZGFyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTFkOGEzZWIzMDJiM2YxY2JiMmY5YTg0MmZhODhkMzRhMTEwMWNhYmE2NzNlYmZiYzcyYzllZjYzMDExODgxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQ29tcG91bmRpbmdUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2MTBjZGE2ZmVjNjY0NGQ1NGVkZDU2NzU2NTZiNmJmOWM3NTNkMDdlZDlmMmNjYzdjZWI5MjE4ZmZkMDhhYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUN1c3RvbWlzYWJsZU9mZnNldC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExNDJmN2VlNjY4ZWQwMmU5OGY0Y2Y3YzUwMmUxYmUzZGQxMGNhODBmNDAxMDkyMGMzNTZhYzUxZDVkNWZlNDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZURhdGVMaXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk0MWU5NWJhNzc3Zjg1NTM3OGM3MWFiODQ3YjRiZWRjZmU3NDlmNTBmZTE4ZDI4NzljNDVkNDQ0NWQ2MTE3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRGF0ZVJhbmdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjZmNjhhMGE0ZmNjYjhkNWZhNzRjNWZjN2E1MjI3ODA2YWQzMDMwOTI3ZmEzY2EyZTQzMzQ1M2I2MzZmYWYzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRGF0ZVRpbWVMaXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjMyZjUyZDQ5YWE4OTNkYzE4NDg2MjcwZGY2Mjk3NmY0YWM0ZDBmOGU2NjEyYTY3OTFlY2NhOTIwOTZkMWQ2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRGF5T2ZXZWVrRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDZmODczZjRmODk5N2IyYzllY2IzMzUxMTc5OGUxYTk5ZDM0N2NlNmZhZmRlYTk3ZTJjMjA1NjAwNjU3NDczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVEYXlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyODJjZDA2MGNlZDZmYmRmNDM1MDM1N2IxMjJmNDQ4NGQ5Y2ExM2E2MWFlOWI2ZDc3NWYxMTFjYmIwNDI4ZjdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVGaWVsZFdpdGhNZXRhQnVzaW5lc3NDZW50ZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFlNWU1Y2ZmNTUzMTE0MDhjY2IxMjA5ODQxMjQ1OGFkMzZmMDQ0Mjk5Yzc1ZTUxMzhhOGU4MjRlYjdiZDc2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRmllbGRXaXRoTWV0YUNvbW1vZGl0eUJ1c2luZXNzQ2FsZW5kYXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjljM2M3ZmEwNTYwYmZhZTZkMWM0MjBmNDI0MTEwMzg2OGQxMTg5MTdlZGMxZmJkMTE2NzA2MjBlZWQ3NWNkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRmllbGRXaXRoTWV0YVRpbWVab25lLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDI4ZTkzMzQzZjAwMTA4MjdhOWI4MGYzNGQzMDBmMTEwNzBkMDk0MmEwNjgxMDk1NjI0OTM4NmM2Zjc1NmUwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRnJlcXVlbmN5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDMyMzNiOTg0ZDFjN2NkMjc0ZDc3MDM5YzQ5YjZiODlhMDNlYjIyYWI4YmJmZWJmZDFmYWJjYWY4OTk0ZjZkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lT2Zmc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxMjkxNzczY2JhMGIzOWNkNjIzYWZiYTdmMDk2MzQxMjEzOTNmOTlmMzcxNzc2OGY1ZDlkMWIzMjc3NjVkNjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVBlcmlvZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwMWNjMmYzMDRkOWQ5MGJjMWJmZTU4YWIzMGNmYzExMTJlODU0YmEzZjVkOTU0MTQ5NzYxZDg4NzI4MjUzMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVBlcmlvZEJvdW5kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjk4MGQ5MzdjMTNjZWQ3YzUzY2Q2MmYxZmExZGU1OWE5OWYxMjJmYjFmOTkwNDExZTRiNWVmMzUzYmVhYmM4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUGVyaW9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxNTVlYzdmMzg3YTcyNGI0MzY2Y2RhZDA4ZGQwY2YxNmM4ZWZhMGZlZWViOWRmMzA0ZWZlNzE2Zjc3MGVkZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVBlcmlvZEV4dGVuZGVkRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ODk3MTI4YzJhN2YxOTJmN2U4OTEzMzI2ZGRmNDcyNjUzOTQ1MjNmZWNlMDI3NDdmMzZiYjc5YzQzOWNlZDUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVQZXJpb2RSYW5nZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmYjJlYTcyNTU2ODdjNGVhNTZiNDcyYjUxODI1NjdmZGE4MTg4NTU4ZWMzNjMxNTFkZmY4MzQ0MTIyYTZiOGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVBlcmlvZFRpbWVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTczZjE3NWJlMzhkYTBlZTNmNmFiZDM5YjI2YjI4NmViY2JkNmE1ZjM5NjBhZjc0ZmJlYjhkZmI4OGVhYmJhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUGVyaW9kaWNEYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2NhODI1NjMzYjc1OGYzNzEwZDljMzRiZmIxN2E0MmM3YjhlZGU4NDBmNjA1ZjAzYWI2ZWQwNjEzZjgwOWQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVSZWxhdGl2ZURhdGVPZmZzZXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFjYWIwYWMzMTI0ZmMwMTY2YTU0ODRkYmYyNzdhMmNhOGIyYjUxMzNhOTUwYjUzMTAxZmM0ZmUwMjZlOTg4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUmVsYXRpdmVEYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODNiZTFhNTg3YzYzMjk5YmQ4ZDZlNWRkYzFjNzJmOTY5NDhlMDg3NWIzZmNhYTgzODhhMTY4NGRmNjA3MWU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVSb2xsQ29udmVudGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzA1N2U5NzYzMDI1OGUzYTMxNzNiZjJiOGNiYzUxNDY0MWM1NDlkMTlhM2M0MDI2YjJlZmM1ZGU5OGVkZjI5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUm91bmRpbmdGcmVxdWVuY3lFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjI3NmNhNDRjYmY2YmNiN2Q4MGI2YmRkZTZkNTAyOTQ1ZTMyNzVhNmIxODQ2NTQ5NDllNzMzNzYzNTc1MDU3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lVGltZVVuaXRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0ZTQzY2JjZjU3MzAxOGIzZmZlNDg2MWZiYmQwOTE2MmNhMTI0MTUwNjI2ZDk3NmY1NGI5NWExYTQ0ZDU2M2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVRpbWVab25lLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRiZDAzMTRiYmUyNTBkMGVjOGNkZjkzYmY4NDliYWU0Yzk4N2Y2NTEzYmUwNGQyNDkxOGI3ZWU5NmM5YTdiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lZGF5Y291bnREYXlDb3VudEZyYWN0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZGMxNzc3NmQ0ZDFhNmEzYzYyY2FkNWEzZTY5ZGJhMTkwMjAxYjY4ZDZhZjFhNDQwMGZhYTZiZGU2ZjE0NDA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVkYXljb3VudEZpZWxkV2l0aE1ldGFEYXlDb3VudEZyYWN0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4NjI2ODNiNzYyZjAxNDMzMDI0MTE3NWExNTBjYjBjNjQxMDEyZjgxNjVhMzY1ZWU4MTcwY2ZjNzBkN2Y3NjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkYzBkNTBjNDQ2ZTI0ZGY3MmZjNDM5ZWU2YjQxMmUwZGU2NDEyMGEzZDhiYmYzYThhYzBhNDc3N2Y3NmE0MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzNmMDdiMTg2Yjc0Yzc4MzBiN2JlMTlmYTc3MjFkODljMzA5OTA5ZmM5M2E5NzQ5NjJiNDA3ZmI5NTg3YTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFCdXNpbmVzc0NlbnRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2JlOWQ2YWJkM2EzNmI4ZmM0Mjc5ZWU3MDFkZjAwOTQyNTFiOTk5N2M5NzMyMGMwNWY4MTQ5M2QwYjk4NTM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFCdXNpbmVzc0RheUFkanVzdG1lbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGJhYzhmZWYwN2Y3ZDk3NDJkOWMzNjlkOTZlZjA5ZWExYTE3MTE1MGE2YzgyMWNjMDVjN2JmNmZmOTZkM2UyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhBcml0aG1ldGljT3BlcmF0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNTNlMWY1MmI3Mzc0OTQ2Y2QxZmFmOTEyOGFiNWM3MjY4NzU3YWQxNzg5NmYxYmE4NDM5MTU5MTA4MmU4MTBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aEF2ZXJhZ2luZ0NhbGN1bGF0aW9uTWV0aG9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2RkNzBlOGU4ZjVlZTIzMzQ0OTdlYzk2NGYxYWJiNDlmMjYxNDRiZjIyN2E0OWZmZTUyNGUxNDU2OGQzMmI5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhBdmVyYWdpbmdDYWxjdWxhdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYjUzYmYwZTA1NjdkMDlmYmUwNmM0NTk0MDNlMmE1YmM4OWU3NmI1MzMxYzZiOTk2MTNiMmQzNjk1MzAwOThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aEF2ZXJhZ2luZ1dlaWdodGluZ01ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YzkyMmZmNzM5YTZkMzk1OGQwZDdlZTQxZDMxMzQ2YjNlMWI4Nzg2OGMxZDZjZmYyMjc2OGExODBiOGIwYmZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aENhcGFjaXR5VW5pdEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGUxNjRlN2U5MmY2ZTA4ZjdlMzJiOGEwZWMyNjU2MjgwMDQ4MzIzOWQzMzk0YmJjMzE5NTZjNWJmYjU5Y2YyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhDb21wYXJlT3AuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYmIxZDE4NGJkZmE4MGRiNDk5MWI4MDhmZTZjMTkwMTJhNDkxYzNjMTE5ZDRiMTJkNjQ5Zjk0OGJlNjc4MjBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aERhdGVkVmFsdWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjliZDQ2OTIyZjI5NTE3NWZmMjJjNDBhMjhkY2Y0NzcxYTYzZGQ3MjUyYmFlMmFkNTM1M2FiYmIxYmIxZThmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aEZpZWxkV2l0aE1ldGFOb25OZWdhdGl2ZVF1YW50aXR5U2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZmQ4YTJmOTg4YjAzZWYwZWZhYWJkNDczMWJlZGFjM2E3ZWIyZTUwOWI0MmJhNTdlZGJiZmY1MGYwNjkxZWMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aEZpbmFuY2lhbFVuaXRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3OGRiNWMyNzRjZjVkMTdkZDRhZDZkZGZkNDJkOGQ5NDYxYTI4ODExMzJhYjA4NzZhZWRhZWQ4ZTA4OGU3NWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoTWVhc3VyZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiZmM5NWQ4NTk5M2Y1ZmIyODcyMDYyNmNmYzY2NzIwYzBlOTRjYTRlZWM2Yjc1N2U4YzBkMDNjODVjNmQ5ZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoTWVhc3VyZUJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4N2NhY2RlMDIzMDMyNmNlM2Q5YjQzMTgyNjE4NDRlNjgzZTliY2RmYjcwNmEyZGQzNGY3ZDk2MmEzOTlmODE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE1lYXN1cmVTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjg4YThlODkzZDA3ZjNhMWIxYjNmYWFmYTA2NWY1MTA0ZDhhZDQzNTI3ODNhYjE1YTcyZjM1Yjg1OGZjNTlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE1vbmV5Qm91bmQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZmFmM2Q0ZmZiNzQ1NTg1MjNjMmNhNDg3NGQyYTQ4OGViYzQyNzIxNDEzMGZlZWRiNjZhOTg4N2E1MDM5MGEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE1vbmV5UmFuZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTZmNGEwZmFjNDU4ZWRkYTMyYThiZTFlNjc4MzgwZGI4YWI4ZWI0ZjUyN2Q5OTI1OTM1NzljNmNlNzAxMThjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE5vbk5lZ2F0aXZlUXVhbnRpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWVkODVmMDlkN2Q0MzdlODQwODdlNzAwNzJjYmQ0MGQ4MDhiYmJkMGZhNTNhOWZkYmYyNmNjNGFjZDJkZGM2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhOb25OZWdhdGl2ZVF1YW50aXR5U2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmVmYjM0ZDI5YWYwZmYyODIxNDdhYmM2ZGU4ZTMyNzU1MjAzMWU3OTNlZDVkNTVlNWUxMWE0ODcxMDE0YmY5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhOb25OZWdhdGl2ZVN0ZXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YTdkZDg4YmZhYTkxNDIxOTU4NDY0NTA3OTE5YzhkZjZkNzY3MzkxODc3NzY4YzVlNWFlZDUwODM0ZjNkZjQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE51bWJlckJvdW5kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJlMjkzMGJlZTgxYWMyMmNkMGFhZGEzMjIyMzYxYjZlNGI1MmNkODIxYWM0MGQxODVjN2JiMmExYjExMjBiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhOdW1iZXJSYW5nZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUyNmI3MjE1ZTBjZjk4NWJiNTJjNmUyYmU2MWI2Mzk5YjQyOTM2NzA5YjUyZGI5MDk4NmNmMzgwMWJjMzEzYTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoUXVhbnRpZmllckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4M2IxYmRiMzNkODgwOTk1YTk0NzRhZDQwNTVjNWZkZTYxMDg0NGY5M2YwZjQ5MWIxMTNmMWQzNzE4NzE3MjFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFF1YW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiMTUwMjZmOTgyMGViMWNlMzE4NzdkYWYwOTc0YmFmNWI0MWIyZWUyNDc3MDhjNGRmNmZkOWU4ZDg3NjYxMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoUXVhbnRpdHlDaGFuZ2VEaXJlY3Rpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGU0ODdhMmQ3ODk0NTgwN2YxODIzOGY0YjhmMDBiMjczMGUzNzY0ZWE1NDU3N2RlMTRjMjAxOWQzYzFjMGU2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhRdWFudGl0eVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3NWQ3MTBhYzY2ODgwNTljNTRlNzMyZmVhNGVkN2U3MDJhOTdmZDQ5NTdlMTUwNzFmMzMxZjg3ZmNkNzA3M2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoUm91bmRpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzVkNjNlYzc2YTM2Y2I3MDE5Yjc0ODg4ODA3MDQ5NWUyMDk5MmFlN2IzMGJiYWY3OTdmNjU2NWU2MWQ2ZmExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFJvdW5kaW5nRGlyZWN0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0OTc0ZjY0N2Q1ODdiNGFiYjQ2Zjg4YTA5OGE5OGY5YzQ0MGYwYmRhNWExYjI0ZTcyZDQyNjBlM2QxYTZkYTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoUm91bmRpbmdNb2RlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3NmZiYjhjZWYwNmRkMTA3YWNhMTIwMmE2OGI2MjNkZDEzZTQ2MGFjODVjZmI2ZjU0MWIzNmQ5Yjc1OTU0MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTg0MzU1NDU4YmE0NmI1ZjYxZGE5OTRmYzgxZDEwZDRiYjcwYzhiYTliMDczZGU5ZWI1Yjc5NDViYjAzYjA0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhVbml0VHlwZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NzJhNDRkNzNjZmU0YTQ4NjQ2ZWY4NzRlNDU2MGQ0NjFhNmE0OGEzOTFlMDM3ZTk5MDdmNGIyMGMyZDQ1OGFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFdlYXRoZXJVbml0RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwYjc3MDA3NGQ3YmNiYjgxYTY2ZmY5YTliMWQwMmNlOGQyMzgxZDg1YTQxYzc5NDQwZTE2ODFlZDc0YWYxZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRobWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhTm9uTmVnYXRpdmVRdWFudGl0eVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU4ZTBiZjA0MWEyMWY3OTFjNmNkNjg5N2I5MWE5ZWIxYzUzOWJiZTRmYWZiZmM1YzM0N2Q1ZDgwYzA4ZDJiYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkFzc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImMxYmJiYTQzNGQyMzk4YTU3MzExOGIwMjg2YjQ0NjUwNTEzMDMyZGY1YTQzYjUxZWNiMzc4ODExZjgwZmM5YzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldEJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjE1MjNhODA3MzJjMDJmYjRhNWJiNDA3ZmJkZGE4NGJkMjJlMGY2NDk1MzQ1N2E2YzdiYTg2MGM2ODg2NGY5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkFzc2V0Q2xhc3NFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY3MDgzZjhhMDFhZGJlMTBmYmI3ZTU2N2RmY2NmMWU3MmViNzUwODc2MjEwMTI5M2Q2NGRlNTg1ZDYzMjM2ZGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldElkVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzdlYTI2YmViMjkzZTNiZmJiYzllNjJlMWNmMTk5ZjNhM2I2MzMwMDI3YTJiY2Q5NmViMjUzYzlhZTVkOWRiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkFzc2V0SWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5YzQyZGE4MzVhZDVjNTNmODA4M2Y0YzJjNGRiNzkzNzQ4NzYyODlmMjhiMTU0YTE4ZGRmNWE1MjI5YTFlZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldFR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2I1ZDg0MzYzNDE2YWJiYjFjNzQyZWJhMjlkYjY2YTFhZjFiNmVhMzM4MDc4ZmNmMzI2MDI5NmMzNDY0M2JhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkFzc2V0VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MWI3NzIxNWJhN2IxNGNmOGI1OTM2MDBjMTlkYzJjZmJkYWNiMjU0ODVkMDc5ZDRjOWFmYzFkMTM0ZGY1YzJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ2FzaC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MjhlMzhjZWNkZTA3ZmY3NzJlODBkNmE4NjYzOGFhNWVjYjI5NWYxZjY0MTBjZjhhM2JhMWFiNjFkMjQyOGMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ29sbGF0ZXJhbElzc3VlclR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDcyN2JmYTUwYzAzMzZlZTlkMmY5MjUzYTI5NmUwNjAzNTliMmI2NTNjNWRiZjVhZTgzMWU4NDc2OTFlN2ExZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkNvbGxhdGVyYWxUYXhvbm9teS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1OGI3MWVjMTgyN2U2M2Y0YTZiZmRhZjM5MzI5MmVhYzVmNjk4M2ZhMDBhNDljM2ZiNmU2Y2JhODIwMWUzNzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Db2xsYXRlcmFsVGF4b25vbXlWYWx1ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3M2QyZDIxM2QyYmQ3NDU1NWUwMWE4N2QyMGMzMDA4NjllM2VkM2FlMGMxOTVjOTE0OGUxMmUzMjRmNGY1MmI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ29tbW9kaXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNTEyZjBiODQ1ODg1Mzc3ZGJlZmZlOTQ1MmE0Yzc1YWJjNWM0MDNjYzRiN2Q0NzYxY2RkYTBmNjA5MzA1MGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Db21tb2RpdHlJbmZvcm1hdGlvblB1Ymxpc2hlckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjAwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlZGNhMWZmYmY0YTU5MTY4ZWQwNzg4YzNiNzIyMzJkZmNlOWE2Y2IyMWNiNmY4ODRkOTdkNzhkYjE4Nzc1OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Db21tb2RpdHlQcm9kdWN0RGVmaW5pdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxODY4NDNkYjVmZjhjOWYxY2QwZTI1YWM5M2JkNDJlNzIxZDU3OGQ1ZTc1NDg2NjQ2MTQ4ODM5OTJjOWVlYzhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ29tbW9kaXR5UmVmZXJlbmNlRnJhbWV3b3JrLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzOTg3NzVkMTMyNGRkODA0NzBjZWE3YmNiYmM4YjlhNThlYTYwNGY3NjRhMDNhMWI1OGQ5NjQ2MDBjOWJkNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25DcmVkaXRSaXNrRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3YTMzNTg1OGIxZDE5NzU1MjhiYzNhNTYxNTZiYzNlZDExNGQ4MzU5NGJjYmZhZDRjZTRjMDA3MjRhZmI5YTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25DdXJyZW5jeUNvZGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNGE3YzczNTY3MzY3NjkzYTAyMWRiZjU3MTIzZDFjZjA3OTA5OTMxN2YyMWE4NzEzODBmM2NlZTJhNTQwNzEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVidENsYXNzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDcxODUyYjQzNTg0MThhMWRhODVjNmJiYWU4MzBiOWU2ZmRhYmU1Y2ViZmYxM2Y0ZDIyOWVmMTRjMzdhMWY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVidEVjb25vbWljcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxNDljOTAxNDMwYTJjODMyNTY2NzFjMGI3MDllZTBlZjFhZGFhMzBiMjczNDdmYTExN2YxYTAxZTUyYTA3ZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25EZWJ0SW50ZXJlc3RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYWQzYmY4MzlmYjE0ZTFmYzJlZjA1ZjIxZmJjMjU4OGU5ZDEwMWM5MDkxODNlZjEwNzQzM2ZjNzk1ZjU2MjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25EZWJ0UHJpbmNpcGFsRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyODQwMzJjNDdjMzBkMGExODA3ODQxOTFjZWU0YzAxNzdjMGEzNWRmNGEwNjE0MTllODMxODkwMzcwOTQxYTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVidFNlbmlvcml0eUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTY2NDY3MDFmNWVmOGYwYjU4OTdmZDZjZjlhMmY5OTM0NTUxYTQ5MWM2NzE0NTM1M2M2MmIwZDM3ODg1Y2JjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVidFR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDRlOGRjZTM1YWQzYzc4OTBkMzRmMTI0MzFmZDRiMjI1YjM4NTIzMzUyN2IwZDBmYTc2NzU1NzY4MDY1YTYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVsaXZlcnlEYXRlUGFyYW1ldGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMmMxMGI1YmU2ZjY3MDJlYTI3MDhhMTMyZTMxMmMzOThjMGI2MjQ0MTRkM2Y2MmY2MDgyYmY4Y2M4NjRmNGQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVsaXZlcnlOZWFyYnlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxNjlkYWI3NWQ2YmI3NDFiZWI5YjgwYjdjMDllMjQwOTFlZGY2ZTUzYzJlNGIwNDQzYjExYzRmZTQ0ZjMzZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25EaWdpdGFsQXNzZXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDVmZmY5MmYzMzFlNjMwZTM0MWNlZjU4YzcxNWNlMTZhOWU3ZTQxODU4NWNmMWNjMGM5ZmRhZmNlOGUzYWY3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkVVRU1JUkVsaWdpYmxlQ29sbGF0ZXJhbEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWJhZTUzNzA4Mzg1ODE1ZGJhM2FmMWJlOWMxMWI0NDYzNzJhMjY3ZGJlNWIyZTkyNmNlYzAxNTFiZjNkMTc3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkVxdWl0eVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTIzMWRhY2JmZjhhMjJhZTViNDEyZGJiYjlkZDc3MWM3Yjc0Nzk4OWUwYmFiOTNlZmE1MzliY2I1ODc3YmM2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkZpZWxkV2l0aE1ldGFBc3NldENsYXNzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5YjQxN2E2NGU0NTViMDc1N2VmMGYzNDFjYzE1Yjk0OGZhMjBkODJlMTVkMDEyZjQ1NGM4MDdhZjlkYzU3ZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25GdW5kUHJvZHVjdFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmY0YTdmZTA3MjUyYTY4NDUyOWI3YTk0MWVkZjc1NGMwNzk3Yjc4NDIzMDUzOTA5MmQ1M2FlMmY1MGNhNDcxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbklTT0NvdW50cnlDb2RlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDMyODIxZDljNDRkNDMzMzM2NmUxYzY3OGQ4ZmU1NWExMmE4NmI0OTE3ZGE3YmY4Mzg3NjE1Y2M3ZjNmZjdmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbklTT0N1cnJlbmN5Q29kZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDgyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImFlYzdhMDNiNjQ4N2EwMzQxYTNhMzE5ODJmZTgxMWE1NTc5NDYyNTRkYmI5ZThkYmEzYzUxZjEyM2U0MjcxYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25JbnN0cnVtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGU4MmZjZTVjNDkxNjA5ZmIwNjgzMWQ0MDBhNTRkYzYwY2Y1MGQzNTUxZjk3OTJlZTYwYzViMGUyNzMxOGFlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkluc3RydW1lbnRCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1ZDRmMTU3OWE5Y2MxNTI4NjJkMGI3N2RjMmQ0YWYwODdhNzBkNTZmY2FjMjZlMDNhNzg4NzVlYmNmMjdkNGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25JbnN0cnVtZW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY1YzRmOWEzMDAwNjBhYWFhZDQxOTY0ZDA2ZWQxOWRmYTU0OTEwNTBhZTkzZDdkMzdkYTYwNWVmNWZhNWQ1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbklzc3VlclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlYTE5NTNjZjBiMWQ4Zjk0MGY3NjBhZjE2OTIzZTgwMTgwMzA3ZTNmMDBkNGEyMjNiNzUzMWI3NTlhNWVlY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25MaXN0ZWREZXJpdmF0aXZlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmMWY0MTE3MWY4YzA1ZTg0MDIwY2FiMzNmMGM5ODI5MTRlN2Q3NTQ5ZTFjYzA4ZWM4ZjViNmU4OWEwYWIzNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Mb2FuLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwOTU4YjI0MTBhN2NmZjQxNWIwYTI4YWIxNmQzNGVkYzVlNWE0NTRhMDc2NDk1MTg0ZjU0ZDBiMDgxZGQxZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25NYXR1cml0eVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTg4YWI1OWE0ZThmMmEzM2QwZWYyNzc2Yzg2MDhlMzY2MDA0YWI3ZGQyZGNlZjI4ZDRjNjdhNTEwM2Y2NDEyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbk1vbmV5TWFya2V0VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWQzZmU0MmZlZDQyZDg3ZWY0NGViMTJmOGRiODA0OGUzNjY0Y2I0OTQ2YmM5MDcwMDc0NDlhNGJjM2M1ZTRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uUHJpY2VTb3VyY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQ3ODJmNTZlYmQ4N2VjMzBhNGJiNjkyODg1YzJkY2JiYmFkOWUwNGM5N2M1YjVlNDBlMWRhOGJmYThhODM5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblByb2R1Y3RJZFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNzA3ZDUyN2RhMTk3OTlhNTFhYWYzYTZkYWIzNzQ2MzE1NjQ3OWJhOWIyMjQyOGY5ZWY2ZmM0MTU2YmEwYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Qcm9kdWN0SWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlN2ZmYWVlM2Y4Mjc3YTZlNGY0ZjFlYjkwMGI0N2ZmYTU3YzMxY2MyNDViYzhlZDcwNGIxYjIxYjYzMjNiYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Qcm9kdWN0VGF4b25vbXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVjNjgzNWNjOTEzNjVmZDM1NzgzOGU1MDVlYjBiN2IzMTYxNzY3MmEyY2RiZjc3NWQ4MWJhMDE2MDdjZTlkZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblB1dENhbGxFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA2ZWUxNjcwNDM0NDU3ZTc4MTY4NGZlZWRhMDg2NTk0ZGM3YTQwM2RhMzk4ZjBjNTg3MTg3ZGYwNDU3MmY4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblF1YXNpR292ZXJubWVudElzc3VlclR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYzRlYzYwNTZhZjBmYTdjNGQyYzk5NTEwNmZjZTNiYjExNDUzOTZiMGRlOTJjNmY3NDk0ODk1ZGVhZGYzOTZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uUmVnaW9uYWxHb3Zlcm5tZW50SXNzdWVyVHlwZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5M2UyNWI5MzlhYTBlY2Y3YWZhYTM5NGFlNDVkMmEzYTJkMTJiOTM5YzVjYTBmZGEwZWMyODc5ZDY0Njg3N2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25TZWN1cml0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWVmYjU2YWFjMjUwNjE3ZGMxYjI0NjQyMGViY2Y0YmY3ZTQ0OGVhNDQwMWFjMDY2MTk3ODI3OTFiNzk5MmE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uU3BlY2lhbFB1cnBvc2VWZWhpY2xlSXNzdWVyVHlwZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjYzkwMmZlYTUyNjU3YTEyNTEzMDkyNDQwYzI2YmU2NGRmNmVlODE2OTFhOGI4MTk3N2FkMTY1ZWI3MDI3YzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25TdXByYU5hdGlvbmFsSXNzdWVyVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYWRhOWU0MDJmNGJmZmY4MmExOTA5YzhiNjVmZWNhZTY1NmQ0NWI0N2UyNTg4MmFmOWM3ZWM2NjBkZTI5NWE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uVGF4b25vbXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODMxOTk1NmJkZDBhYzYxY2U0MjEwM2I5MzkyNGE4YTk3ZGE0NGI2YzkzZWM2ODM3NjhlODM5NzQ4MDJhOTk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uVGF4b25vbXlDbGFzc2lmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhZmZmZjJkMjQ5MjQzMzc3NzgxZTBmY2ZlNTQ3MDMxMzM4MDViYjcyOWIyYmM3MGE1YjU2OGU3ZDdhNTA3ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25UYXhvbm9teVNvdXJjZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODljMmFmM2MzMjhhZGIwZTQwOWE5ZmFmYzY2MTM5Mjg4Nzg5Yzg0MzBjOTIwNzllODdiMTE3MDMxMGExOWRjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblRheG9ub215VmFsdWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjc0ZTc2YTVmYTAxYjk0NDIyY2MwYzZhNDQ5OGUzYzVmMjZlMTg5NTM5ZThkZDY0ZTFhNzA1ZjlhY2YyODlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uVUtFTUlSRWxpZ2libGVDb2xsYXRlcmFsRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YTUyZGY4NDIzZTdjYzY5MmFkNmUzYzhjZjk1NWFmOGE4YTEyNjA2ODI3YWIxMzU0YzE0ZGVjNzJlMWFiMDM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uVVNDRlRDUFJFbGlnaWJsZUNvbGxhdGVyYWxFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzOTQ0OTI3YWU3N2FmMjk2NDQ5NGY4MGM1ZTkyYzg5ZjhjY2JlOWJmNzNkMTRkMTkxMGNmNzU5N2EzZjE3NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjcmVkaXROb3REb21lc3RpY0N1cnJlbmN5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2NiOWEwMjdmYzUwYzY0NmE3NGFkZDc1M2QyMzcxMWNiZjlkN2VlYzM0ZTcyOTlhMDMzMzMzNzYyOGU3OGUwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNyZWRpdE9ibGlnYXRpb25DYXRlZ29yeUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWZjOGQ3ODA0Y2MwMjc1OWI3YTFhODI3OTMzNWUxOTAxNWFiYzk5YTA2NGJiMjdjMDE4ODhjNzAyZDQ0M2VjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNyZWRpdE9ibGlnYXRpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyYWIwOTY0MjIyNTAwYmE2OTRlNGFhYjFhNTAwNmI3Yjc2ZWYxMDMzZGM3NTdlNTNlN2NkNmEzYzRhN2MwZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjcmVkaXRTcGVjaWZpZWRDdXJyZW5jeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI1Zjk2YWJiMjU2YmFhN2JiODIzY2YzMjEyYjFlMjk1YjFkMzIzODJjNDA1MDdiMDZhZDY4NDQ1OGI3ZjQyNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRyYXRlc0ZpZWxkV2l0aE1ldGFGbG9hdGluZ1JhdGVJbmRleEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMWZlZjZmMTc1NTJiOGM3ZWYwOTAwMTcxZTJlOWNlYWUwYTU3MzY0ZjYyZTJmM2NiNDAxNDk3MGJhOTAxNjY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0cmF0ZXNGaWVsZFdpdGhNZXRhSW5mbGF0aW9uUmF0ZUluZGV4RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmODdmMWQxNzAzNWFjZGZmNTE4Y2VkYjYwZmUxOTEzNGIxYTc2NTFmMGYzYjU3YWQyY2ZiM2RjNDVhYWQxZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRyYXRlc0Zsb2F0aW5nUmF0ZUluZGV4RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjkwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1YTY0ZDJmYTc5NDdmOTk0OWQ5ZDY5Y2FhNmFiYjA4NTk2ZjI1NTQwYWRlOWZkNTVkOGE1YWIyMjQ5MDgwNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRyYXRlc0luZmxhdGlvblJhdGVJbmRleEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQ0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0NmNiZDk2NjlmNjRjNGM0MGM1MjA4NTNjZWVmMmU5YWVhZWIyMGIyOTA0NDQ0OTM1MzZiYjVjNDUyYjFkNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhaWRlbnRpZmllckFzc2lnbmVkSWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzYjEzZjk5YWMyMDkxNTIwNjZmNjMzY2Q0YWE4YmU0ZDgyOTQ4MjliYzYwYTFiNGYyOWVmMDk1YTkyMmU5NTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhaWRlbnRpZmllckNvbW1vZGl0eUxvY2F0aW9uSWRlbnRpZmllclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwMmQ1NGU2NWE4MjY2N2ZiMjdmNDllM2Q2ZDEwOWI0MDI3NWI3NzdhZmJkNWIzZDViOGQzN2JmMGViNzVkNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhaWRlbnRpZmllckZpZWxkV2l0aE1ldGFJZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmVmOGI2ZWEyZGViNTQyYmQ3MTBiOWE3MDJlMjAwMTAxZTc2MGNhZjkwZjk3OGMyYjA1Y2NiNmI3M2RjYzFkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFpZGVudGlmaWVySWRlbnRpZmllZExpc3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmUzNGNjMDE5NmRlZDllOTNkZjc1ZmFkYmJmNzA0ZDllN2FiYzVjYTYxNzI3NGJjODBkZTExNWJiZWI4MDYwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFpZGVudGlmaWVySWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTcxN2IwMzRkNDNjYTZmODQ5ZDdlZmIzZGVmYzY4ZmZjZWYwZDE5Mjk4ZTM4MmUwM2Q3NTI0YzE0YTlmMGJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWlkZW50aWZpZXJMb2NhdGlvbklkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI2M2I2MzNhNDNkZDQ5MmFmMDAwN2IxZWUzNTgyNGY4YjgwZWU1NjA1NzQ0YTZjODRjZGYyY2FlODVjY2I4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFpZGVudGlmaWVyVHJhZGVJZGVudGlmaWVyVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTdiMGMyZGQwNWNlODVjYzA5Yzc3YjRlMjY2ODgwYmFiZDQxMDI1MzdkOGExMTAwMDgzOGVjOWFhOTM2OGU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5QWNjb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODg3NTkyY2I0ZmM0YzAwNzcwYjZmZjU1NjAwNGFkNjA1NTVjZTIxOWU1NmMwNDRiZTMwZGQxYzQ1MjBjZTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5QWNjb3VudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTc2MzlkMzU3MDFkY2IzNzZmZGZjYjIxMTI5NGQ2NmZmNjEyZjhiMDNjM2E2ZjBiZjQ5MTA1NmMyMmQ5YWE3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUFkZHJlc3MuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGNlMDc5NDhkODk2YWNiNzRhZjdkMDk5OWRlMjM0OGNmMjI4MzkxNjYwMDZkZjAzNWMxYjNmZjhjMmRkYzQyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUFuY2lsbGFyeUVudGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImRhMmM5MGIzYzhlNzY5N2M2ZjQ5MDVmMDlmY2UwYjViMzM0OGQ0ZjIyYmNjNmJkMjYyZWIwN2RjYjc1ZTI3OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlBbmNpbGxhcnlQYXJ0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmQ1ZjZiYWU4MTJlMmNlN2I5ODI2NzA1MmRhNjk3NWE5ZTZlZTFmYTc5M2MwNDMwMjA5NjBmOWI2YTdjOWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5QW5jaWxsYXJ5Um9sZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE2N2ExYjRiN2UyMjgxZGMzMzgzZGZhZTA5MWNjY2QxMGQzZDJmYzg1NDFmNDNkZjI4YzMzMzE1ZTdjYjczZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUJ1c2luZXNzVW5pdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjllYzI4NzNiZTRhYmY1NTAyZWU0M2NmN2Q5YTAyYTVlNWEwNTkwNjQxMTJmNmJhODRlNzcxY2IxNjU2MWZlZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlCdXllclNlbGxlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGFlZjQ1MzcyMmI3MjZjNzc0OGI3NWMyZjdkMjVlMjgxNDY2ZWE0MzdlODM2NDUyNmVmZTg0ZjE2NzgzNGI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5Q29udGFjdEluZm9ybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxMDFmZmJkMTVlOTBkMGNjMDA3YWUyYTVmOTBlNmI5YjQ2N2FmZDZkYTEwYTg1ZDkxMmU5NWE1YjdhNzRmMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlDb3VudGVycGFydHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjEzZGQ3NDhkOGYxYmU1NDU2NjA0OWM0NDM2ODY5ZjIzZDFiODRjNzBlZmU1OGNlZmE1ZmU0MThlODZjOTA2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUNvdW50ZXJwYXJ0eVJvbGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjM5ZWMyMzRkYjBlMGY0OTk5Mzk0MmIyOTJjYzhkMGI0MjA5NGQ1NDk0ZjBhZDQxMGRlZjg1Y2U3MTVkNzIxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUVudGl0eVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiMTQ1N2JiMTEzYmEwZTQzYjM3NzJkZGY0ZDA5YzliOGVmZjY2MTE1NTBiOGI5MzI1ZDZiMzU4ODUyZDZhOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlGaWVsZFdpdGhNZXRhQWNjb3VudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTUyODAzYjQzOTYwOWU5ZjhhOGU3ZDM2MTJmZGYwYTUyODBmODRlMTQ3NjA0ZTY5OTAwYjRhODU2YjBmZTIzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUZpZWxkV2l0aE1ldGFFbnRpdHlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5MzFmOTgzYzJjYjBiNGIzNTU1ZmI0ZGIyNzJiZjJkOTYzNzVmNmUzNGQxYjNmZmRhOGMwNGU1OGExM2E4ODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlGaWVsZFdpdGhNZXRhTmF0dXJhbFBlcnNvblJvbGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzc4MDgzNTE2YmY1MDg5NTZmM2RmMTZmNjEyZThlOWU0MWExODRhNWQyNjJlZGU4ODkyODc5NjBlZDdlYWZhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUZpZWxkV2l0aE1ldGFQZXJzb25JZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjg1ODhlNzA2M2YyM2ViNjQ5MTViMjBiZWE5YWE2ZGQwZDgyYTgyNDc5MGI2NjQzMDkwMjQxZDhkMDE3NjY3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUxlZ2FsRW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzRjYWI0MGIxZGRiMWUxYTI5YjM2YmQ5ZjQ0ZDViNTExZjAzMjc0YTMzZjI5NjA3MjZiNWUxN2YyMGY0YTdhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eU5hdHVyYWxQZXJzb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTI1YjU0MWIyOTUyN2MzNGRlMmFmMDZmNzE3MDdmNmQ2MmNmOTgzMTM3OWE2ZGZmYmYxNmVhY2NlYjYyZmFhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eU5hdHVyYWxQZXJzb25Sb2xlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWQyM2YzMjhkOGM1ZjAxZGZjNWZhNmVjOTI2ZWM1OTM5NzU1NzhiYzg4Zjk5YjVkMGIxMzg3YjE3ZWVmZGM0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eU5hdHVyYWxQZXJzb25Sb2xlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODA3ZmNhYjYwYWNkOTQzYmE1ZTFmMGQ0NDgxZTg1OTMxZTU5YWQ1ODAyNjA0MjlkYjEzZThhMDRhMWUwNjg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGFydHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTgzNWFiZjU5ZGViOTg4OTIyZjY5MTAyMWI0OWVjMGY4MzVlYjY2OGI2ZGY0YTZhZGYyZDgzZTcyNmQ5YTNiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVBhcnR5Q29udGFjdEluZm9ybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwNDkwZGY4NzFjYjUzNTg4ODViN2FkNDQwNjhkMjVhMDMwOWFjODY3NjE3ZjIyOTg4Nzk0OWYyODI5NzA5ZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlQYXJ0eUlkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYWI0YzQyOGJjOGY0ZGIwZmUyNjFmMzhhNzVmMzMxZDkwZjRjOTY2MGFkOWE0Y2EyYmRhZWRiODBhMjcwNjI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGFydHlJZGVudGlmaWVyVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYmZmOWNkNDVjYjU4YzlmM2E0ZmYzMmJkZjg4OTE3NWI3NzVhYmY0MTU4YjNjNzgyNWMxZjY3OTY3ZDY2MmNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGFydHlSZWZlcmVuY2VQYXllclJlY2VpdmVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmOWQyZGU3YTIxYWU4MjA4YmNhNTNlNDFmZjgzYTk0OWM4NjA3NzI2MDUxZDZjY2JlOTc5Y2JkMzY0ZjhkZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlQYXJ0eVJvbGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjJiYzZkZGQ1ZDc2ODA4NWVhYTE5Njk4ODgyODM0YTFhZDI1NDQ0M2ZjNzI5ZmU4ZWNhNzE4NDgzZTM2MmQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGFydHlSb2xlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OTllNTU0ZmYzZWRmZWQ1ZWFkZDdiODQ0MmQ4Y2E5NjZiZjFlNGVhNTBlMWI4MDUwMTg1YmU5ZTU1YTU0MWRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGF5ZXJSZWNlaXZlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NDA1MDBkZmIyODU2YTY0ZjJjODU0Zjg5NDJmY2JmYTYxOGNlYzMyOWE0ZDAyYWVhZDI5N2IwOTUyZjFkNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlQYXllclJlY2VpdmVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImQxZmEwMDhhNzA2ZTNhYjM5MTExOTlhZTA4NzFlY2NjMGJjNGY4NTEyYmY5YTYxMmUzYjhkZGMyYmU5NTcwY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlQZXJzb25JZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzMmQyY2E1YzJmOGI5NjVkZTA0NjVkZjQzMzRlZmMyNmMxOWM0NmE4OGIxY2E3MGE3ODhmMmIwZWRjNjU1ZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlQZXJzb25JZGVudGlmaWVyVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGMxM2Q2ZDBiZjI3NmZjZWQ3MWUxMjYyZjdjNTZlYWJlYjAzMzNkMWI2NGM3ZmI0MTRjNzUwMjE3ZGQ2NDBhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVJlZmVyZW5jZUJhbmsuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNjA2ZjNiODYwNWY1MTJkNTczZTBiZGUyYWRlMzk5Yjk3YzdmOWVmMjA2NmQ4YjEzNzkxZTI0OWI2ZGE3ZTU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UmVmZXJlbmNlQmFua3MuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYTVjMDY1MjlmNGFhZWM2YjE3OGNjMDk4M2U2YWMyYzdjM2MyZTYyNjYxOGNiYjM3NzRkMGM3M2I5NzhkZDlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UmVsYXRlZFBhcnR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzYxN2M3ZmEwYjRjNDhlNDg0OTBiOTQxOTI5OWZiNzA1MjM5YmZmYjhjZjA1NWZmNzBiYTY3MmMwZjg3Nzk4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVRlbGVwaG9uZU51bWJlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzNzY3OWQ3OGE5ZGI2MDg1MjcwNGRlNGEzZmU5NDJhMjU1NTUyMjQyNDIxOWVjZGNiNmJkYmJkOTMwNmM2MjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlUZWxlcGhvbmVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1MTljNDExNDY2MTAyM2E1ZjgwYjg0ZmViZjBjZDNhNWFmYzFiOTY3ZDExM2IwNWRmZDdjODZhZDE2NTE0MmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHltZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFBY2NvdW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjAxZmFiMmM0MjZjYWU4MjA0MjZjZjc3Njc1N2MyMWZlZWNlMjAzNzliMTUyOTc5MTA1ZDdjZDJmZGE0YWJmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUxlZ2FsRW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2ZDJmYmYwMWY2MjcxNWZlN2Q2NTI0OGNlNTJlYmZhMjMyZjAyYjRhMjdhY2FlNTM5ZTgzNTVhMzA2MjUyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU5hdHVyYWxQZXJzb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNjI2ZTc3ZjI1NjJhNWFlYjFiZmY0YTcwNTY1OWJhODc4ZTY0MjNjZDkxMDI4NGIzNTEwMmU2MWUwNDdmM2YwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGFydHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzM5YWRlNDc0ZTk4NjhkODEzZjY5MWVmM2IwODc5ZmYwZWY2OTk0MjJlZTQyMDkwYTY4MWJhYzcyYzcwYmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkFjdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMmViYWNlOTBjMjU2NDk3MjA2YTgyYzExOTVlODZhNzAwYWUwMWEwYWRlMGY1OTY1ZjJhNTIyZTYyNzAzYWJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkFmZmlybWF0aW9uU3RhdHVzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjZGQ2OWQwY2EwMGFlNjVjMmJmYzc4NDdmNmQ3YWFiNjc5MzE0YjEwZmQ5YjE5MzljNTlhOWE0MWEzZjk0NTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQXNzZXRUcmFuc2ZlclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JjMjhiN2E4YzczMjgxNTkyMzE2ZDczYjgwZTdmYTk0OGNjNGJkMzIwNDUzZWE0OWUxODZmOGE2MWM3YzhhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25CaWxsaW5nSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTA1NjFkYWQ0OTEyOGQwMmUzMzRmZTYwNGNmZmY2ZjBhMWVmMDY2ZjhiNjgyZTA3Y2ZmY2FmYjlhMmE3NjE1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25CaWxsaW5nUmVjb3JkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmMTQ3MDhjMWI1YmZkZDRmMmFlNmI5N2IwOThjMzQzMTRlY2QyZjZhMWU1MmQwMzViNDk0NTQ4ZmY0MTM1NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQmlsbGluZ1JlY29yZEluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhNGUzNTFlNDJmOTliMzNkNTM2NWQ3NWY2YzU2NzkzODdkOGQzZjJlMGYwODliMGEyMjI4NDJkNGFhYTA0ZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQmlsbGluZ1N1bW1hcnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OGU2OWNjZDQ4MzM1OGJlZDljMTg1MzQ0NmE1ZTc2MzI1MzdkNjc1ODRiMzAwYzUyZjU4YWU0YzA4ZWE1ZWVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkJpbGxpbmdTdW1tYXJ5SW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZTI4YzVlZGRmNTAzM2Q3OGU3NDEwOGRmMGY4MWQ5MzU1NjE0MDlmMjQ5YmFiNzRhMzIxOTQ3MzNlODY0YTE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkJ1c2luZXNzRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjkxNzljZjY5YzQ5MTA5MzNkOTllNWI2Y2JhOGM4YTViMmQzMThmODI1NTU4OTAxYWIzY2JmODM2YmMyNDg3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25DYWxjdWxhdGVUcmFuc2Zlckluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwNjlhOWM5MjEyNGI4ZTA2MDMxNmYyNTNlYjBlZjYzYTMyYzVkMjE2ZWM5MmQ1NjRkZjhjNWRkYjVhMTg1YTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ2FsbFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjBhNThiMmEyYmIyZjE3NDYwZDU5YWQ4NzM4ZWFlMmU1NDJjMWQ3ZjMwNzI0MjUzMTcyZDMxOWQwNjZjZDM1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25DbGVhcmluZ0luc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUyOWNlMWJhYjE2MjljNTdmOTlhZWUyZThmZDVmMmM2ODZmY2Q4YmZkOWI2Nzg3Y2FiYTI2NWUwNTc0NTUwNWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29sbGF0ZXJhbEJhbGFuY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk4ZGRjZWQyMzAyNzY1NzNiZDBiNTUyZDI5NTM5ZTQ3ZWNhMzkwMzY3YjQ2OTliMmJlOTkzMjdiZjNmMjJlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25Db2xsYXRlcmFsUG9ydGZvbGlvLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5YTk2MGFlYWMwMzk2OTA5MTBhZTkyMjY1NWVkZDcwYWNjYzYyOWE2MTg3OGU4YzE1YjM3ZjA3YTZlZDNlYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29sbGF0ZXJhbFBvc2l0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwYWY5NmVmMzg2ZDAwMzE3YmE4Y2MyZWM1MjYwN2IyZDRkMTVlNzFhN2E4Y2IxMGZjMWJlYWYyODM3Y2IzNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29sbGF0ZXJhbFN0YXR1c0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODJlMjI1YmZmNGIzZjY0NDVlMGI5MDVlYTkwNmI2NDMxZjkyNzdhYTlkODRhYzE2NzI3ZGJiZThjYjE1ZWIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvbmZpcm1hdGlvblN0YXR1c0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDg0ZjQ3OTY1YmMyN2ZjNTBhOTgwNTRjNTcxOGI0YzRjMjM4NWE0YmIwN2FlNjM1MDAyNjFmMmQ2ODdiYzRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvbnRyYWN0RGV0YWlscy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzNDcxZmU1OWQxYzkxODZkMzBmZWY5YzE0MDBiNWVhNDIxZDJjMTMzMjdmZTY0OTdjZGQ3ZmJhY2MzMDFmNGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29udHJhY3RGb3JtYXRpb25JbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NGJjYzUyMjcyYjk0YThjY2VkMzJjODg3M2JkNDUzZjczMGNhZGNkZWIzMmYwMzExODc5MDhhNmNjNzYzYWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29ycG9yYXRlQWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE4MmVjY2EzMzUxYzc2ZDdiNGRlYmJiODAwNWUwOWM1ZjdiYzRhZjQ1MjQ4ZGVmZWMwNmYxM2I4NzI0YzkxMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29ycG9yYXRlQWN0aW9uVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDg1MDdhNTZlMmQyNjAxNWUzYTEwOGFhMjJlNGYxZGFkMjY3MjAwYmQ3MThjNGMzMDBiOWI2YmRjZTA0OTNhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25Db3VudGVycGFydHlQb3NpdGlvbkJ1c2luZXNzRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTM4OWFlNzg2ZDBkYWZhOTlmNDZmNDhjOTc4YjU2OWY3NGEyZTViZWMxZjQzZjliMTcxMDIyNGI2MWMzMjQ1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25Db3VudGVycGFydHlQb3NpdGlvblN0YXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmZTExMGQ1MTNjN2ZiMjY3MjcyOWVkNGQ2MDE5MDg5NTRlOTNhMmE3OTIwZGE3OTczNjcwZmRkMTU5M2I0ZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ3JlZGl0RXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQxNTY1ZDFkMTAwYTE0NmY1ZGUxZmFiNTgzYTViMGI1ZTIwMjk1NzJjMmM4MWUxZjEzYzUxMGEwNzQ5MjEzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25DcmVkaXRFdmVudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1MDY0NzkwOWUyNTcxNDdiM2QzZGNhOGRiNDc4MmIwN2RhODA1YTJhYzgwNzJhMDAzYzU0NTFhZmExMGE4YTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uRXZlbnRJbnRlbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlZDQ3ZjYwMDY1MGJmNTRhNTlkZmMzNTVhODlhOGI3ZGEzZjdiMzFmNDg5NGQ5NzU4NzkxMDE5YWZmZDAyYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uRXhlY3V0aW9uRGV0YWlscy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczNTU2YTU2NDlhMzdjZDFhODc4ZDIxNzRlOGU2MzEzMDkyMmZlYzMyNTU5YjhhYTIzZmE3MzJiMjZjMTY1NTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uRXhlY3V0aW9uSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTkxM2MwOTIzZDZkOTBiNGZiNDZlYjkxNmI0NzY4ZmNlMDQyYmY3NjhmZGEyZjc4N2NkZjYxNWVmMzc0M2JlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25FeGVjdXRpb25UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5NzNkNTdlY2EyODgwOGQ1MmI3YjQ5NzAxNDQwNjhkMDA5NWM3YzU2OWFiNmEzOGZiMDY0ZDIyZGYxZmJkYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uRXhlcmNpc2VFdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzN2JkNDU3MjMzMjY4MWYzYzRiZjNjNTg4MGYyNTM1NWRhZjk4YWQ4MTU2ZmE4ZmM0Mjc3MjBhN2Q4MzI4OGZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkV4ZXJjaXNlSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjI3MjQ5ZjhhODBjM2Q4YTY2ZDk3NmFlZjVlYTg1ZDA4MjBmMDg0ZThjYjA5YjdjMTgzMjliY2JiNGJlODdhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25FeHBvc3VyZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWE0OGJkMjY5ZjVjMmVlMjcyOTFiOTY2MjRkYmY5OTRlMjYwYzg1ZjE3NGJmZmRkYWFmNDRlNDY0NjBmZGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkhhaXJjdXRJbmRpY2F0b3JFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWJhOTA4YmMxYmZhODQwOGUzNzdjNzY5ZDE3N2QxOTRmZDY2YmM5ODkwODYzOWFiODFjNDkwNTVjM2Q2ZWMyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25JbmRleFRyYW5zaXRpb25JbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODUyNzBiMWZiNTQ3NDZlYzk2YmVkOTNjMWM1NjJlOGRhNDJhNWE0M2E2OGVjMTNiMWEyMTJhZDA3MWFmMGE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjI1NTI1MTk0Y2M5NjIxMmE1MWZhODE1YTI1YzNlODI4NDgyNWNmNzIwMTVkMjg1YzVmNjA3NTg2MWJlNjI1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25JbnN0cnVjdGlvbkZ1bmN0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZWE1MmVkM2UwNWIyMmM2MDcxNmVhNTYwYTdlMjY3NmE4N2Q1NzE3MzNkMTMwNGQ2OTQ1OGY3MmQ0MzlmZWJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkxpbmVhZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ5MDFhYmNkN2QxMDRmNDIzMmFlMjdmYjM4MDkzNGZmY2RlNTgxYWEzNDk5YTZjZGEyNmIxODQ3ZDllOTU2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsQWN0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlNzUzNzdhZmRmOTM5NjY1ZGMxZWE4OGIyNTM4M2ZjMTkyMGYzOWUzNGJlYmM2ZGRjNTg4NmM3NzBmMGQxOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbEJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQyNTg5ODU3Yjg5Y2IwMTc5ZTVhMGIzZjAzMGVkODI3ZGNiMDQ4NDAxZjFkYjFmY2YxYmE4ZTBmY2E5NWFjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsRXhwb3N1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTExNjJlNDQ5YzNiYjczNGRlNDYyYTE0YTZkNDIzOGM4ZjE2NjQ4MTA1YTEwOWVlMmMwZWFkZjNiNjQyOGI0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsSW5zdHJ1Y3Rpb25UeXBlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjljNDc2MzA1YTUxMDg3YmVkMjIyZWUxNDI3YWUzNTEwODljNTQ2YTI0NmIwODFkMTJiNWU1ZTk3ZTY0MGEzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsSXNzdWFuY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTA3NGJjN2ViODZmZjAxOTI2Mjg1MWMyN2ZmZGJjOWIxMzQxYTcxNmY4NGQxMjc2MTJkMmMwOWYxYmY3ZDJjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsUmVzcG9uc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M5OTQ0NjI0YzU4M2Y0ZTNhOWRjM2Y2OWI4MTJlNjE3YzdlYjc4MGRkNDczMDAxZmI3MjkxNGNjMDIyOTBkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsUmVzcG9uc2VBY3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MzkwNDlhOTQyMmI2MTRmZThiZTAwYmMyNjRlY2QxNWU4Njk2MGY2MmU5MjcwYTE1ZTlkYmQwNWM3ZTc4ZjkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbk1hcmdpbkNhbGxSZXNwb25zZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE1YjQ5MjhiZmI5YTc2MzBmMzA5ZmJiZTk0NDhlNjQ3YmVmOWI2MzQwYWE5OTdlNzBhZjViNWIwYjJiODFmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25PYnNlcnZhdGlvbkV2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNhODFmZTllZDVlMjYxMGUwYTUxZDY4OTA4ODNlYjM4ODVjOTRmZGRiMTg4MGNjMTFmYTkyOGRmZmY0ZmI5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25PYnNlcnZhdGlvbkluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWFmZTI0OGJhYjI2ZDg2MWQzMTQyYWVlOTY4ZDllYThlODBjYTcwMWYyMzA5MjYxOTkyZWIwNTFmNzllYmEyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25QYXJ0eUNoYW5nZUluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzNWY5MjIzMzg3YzE1OGNhZmRmMGJhY2IyMjk5NTQ3M2I0ODE3YzEwMGRmMTE5MTZjNGFmNjQ1YmFkNThhYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUGVyZm9ybWFuY2VUcmFuc2ZlclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4NjgzMzk5NDM5YTY2NGRiM2YwMDRjYzI0OTgwOTY2ZTE0OTg2NTU4YTNlNzFlMGQ5NDgxYzNjYTYyYWNiZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUG9zaXRpb25FdmVudEludGVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZmZDc4NDdjMmQ3OGVlYTNiYjg1ZmU1ODIwNmZlYjk2MDIxMTQzODM3Mjg5YzdhNmVlNDA3NjQ4MWM2ZjJiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25Qb3NpdGlvbklkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVmYjYxN2MyNzJkY2ZmOGU1ZGVjZGE2OWJlMWRhNmQ3NTNkM2Q2MTAzMGRlNzY2OGVkMGE2NGMxNjhmZTViZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25QcmljZVRpbWluZ0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMjlmZTgzOWM3OTVlNjU5MjMwM2YzYmMwNGJhYTdiMDg0YjUzOWFmODBlMTlmNzRlZDRjOTZmZGRjNDVjOGEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblByaW1pdGl2ZUluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkZjljNjllNWYyMmVlYTUxOTc4MGEyNzM5ZmUxZGI4MmJlMTEwNGJkMGQwMDgxZGQwYmVlMWEzNGJiMTcyYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUXVhbnRpdHlDaGFuZ2VJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODE0YTM4ZTdhNmIxMDI2NmQ0Yjg5NGY1MzI4NzZkN2E0YjMyMzVmYmZjYTE0MzYyMTczNTI3ZmQ4YjAwN2ExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblJlY29yZEFtb3VudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ5MGRiYmI0YjliNjk0OTViY2YwZmRhOTFkZDQwNTA1MWFkNjlhNDJlNmViNWNiZWQwNGFlZjg0OTJmNWYyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25SZWdJTVJvbGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzQxM2NlNmMxMzFkMzEyZTIxMjUyMDAwNTJiNWY0MmM1MGNlYzJiMTg0YmIyZjBkY2FiMmM4OWYwNDQ1NzllNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25SZWdNYXJnaW5UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFkZDM4ZmQ4NWNkMWIzZTQ5MWFiYjVjNGFkZDhjMjdkNmU4MDIwN2IzYzExNjQzMzZjOWQ2NGYzZjZlMmVjYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUmVzZXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE2MmQ3ZjRiZjlmNGYyN2I1MDM5ZDdlNGIzNzdkNzU4MTdmODJkZTE3NTM2MDQyMmVjMmZhMGYxYjdkOTQwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25SZXNldEluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlMGRhZjI1MzRiYjQyMDhkZjUzZjgzYWRiMzljZTJhZmM0YmU1ZmI1MDNiMjJjZTU5ZmQ5MjJjZjk3MDdhMTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUmV0dXJuSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjEwYTljMWMyYzc3MWM2N2FmMTc2Y2IxMmU4MTlkN2VhOGFlZTNiZjZhYjBiM2YwZGEzZWU2MWJmNGE3YjliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblNjaGVkdWxlZFRyYW5zZmVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA1N2Q1ZDE0OWZiODEwOGEzMzFlYzA1YjMwNDM4NDNmMTJjYWYxOWJjMDE5MDMwZDJjMjgxNmM5MzhjZjZlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25TZWN1cml0eUxlbmRpbmdJbnZvaWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzOWExNDEzOWFjYTQ2ZjA4MWQ5YmY4ZmFjNTZkMDM1NzM2OGIyNWQ3ZGQ4NWZkYWVkOGFlOWJhN2VlMzY2ZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uU3BsaXRJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhODMzNjQxYmU4ZGU4MWJjMjBjMGIxMjc3MWZjOTA5ODFmYTI4YzI3ZDhkNmY1MzFlNjJhNmJlNmJkZjU3YTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Y2IyZTAzMWZmNDQ5NzM2NTIzNDgwZWMxMTg5Yjg4N2NhOGRhN2IxMTViNTdhOWJkZDk4YWUyYjIwNGMyYjc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblN0b2NrU3BsaXRJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNGFhOWQyNWFlNThiNGEyMjU2NjhjZGQyYmFmNTk0MGIyMzU2Y2RjM2VmOTdlOGU2YTVlNTdmYWE3NTlmMDRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRlcm1zQ2hhbmdlSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMGFjZmFjOGYyODFjZWFkMjFjZTE4OGIwNmNhMWZkODIzNWU4YjliODMxNDc1NjcwMzkwMGY2MTc0MmM2ZDg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRyYWRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0N2I2Mjg4MTBkNjI2ZjBlNTAyZDllZmNlOWJjYWNlYzdkNjQwYTRiZjg2M2VmMTU1Y2JlYTUxN2YyMWM1NjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhZGVJZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwYWRlYjY0MjdhMzEyYTVjNDJjODE5YWY1NDAxZDZmNjQzZDFlZTI1YTU1NTQ5ZGJmNjhkNTFjMzVmYThkZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhZGVQcmljaW5nUmVwb3J0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmN2ViNzdjOWJiZjQ2YWNmNDI5NDZjMTc4ZDBiYmNiN2I3Yzg1Y2VhMGQ5M2IxZGZlZDYzZDBmOWM4ZjVkYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhZGVTdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMjY5ZjYwZGI1NTQ0ZGQ5YjNiMmE2MDdkNjgyMjUzYWViYTY2ZWU2NTZhMjUxNGFkOGFkZTI5NjY5NmRhMWI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRyYW5zZmVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3NjA2YWI4YTQzMGQ5YmJhNTU3MmQ2ODYwYzEwZjViNmZjNDNkOWVjZTczNGYzOTI0NDUwMTE4MzgzOTI3MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhbnNmZXJFeHByZXNzaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmYyNjBjNjViZjU3MjJjMDEzMDA0NzVkYjIzNmI2YTQ3ODkzOTE5YjUyMGYzYTIyYzYzNTZkNWQxYTM4NzM3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25UcmFuc2Zlckluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTZlODVkNzE3MWYyZjE1M2VmNzM2Y2NmYjRiNzAzNWEzZjJjYTUxNDcxYzVkNTc3N2Y2MTM1ZmE3YWEyMWQ2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25UcmFuc2ZlclN0YXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDlkZWY4YTQ4NzMyM2RhNGM4OTE0MTgyODJhMTQwNDc2ZjJiNzJjZjM1OGY5ZjNkMGZjMTRjMzZjNTJlZmJkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25UcmFuc2ZlclN0YXR1c0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YTVkNjhkZWQ5MWQ2YWIxNzZkYzA5MDViMDNhZTg3ZWU4MTU1NDBjNGFiNGFiOWFkOTU1Mzk0ZjNhZDE5OWJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblZhbHVhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjNjMTExMmQ4OTE2NzY5OGJiMjQyOWFiZjlkNmUyZGMxYjM3Y2QyZmVlMGI3YWE3ZTc3YzQzYjkxMDExYzE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblZhbHVhdGlvbkluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQyOTFkNjM5MTYyMDkwYjhiM2Y5MGU5Y2JiNGU5MjgwODU2NGM0MWVlNTJlYzhjMjg1NDBhNDQ4OTcwMTI1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25WYWx1YXRpb25Tb3VyY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTQ4NTFkYzJlZGQ4ZjcwZDU4YzAxYTQ4YzkwOWU1NDY4YmJlYzRlNzkwMTFmNWU4ZWFiMTE4NTU5ZDViNzAzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25WYWx1YXRpb25UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmM2IxMjJlYWUxNDhiNGQxZmYyYzJiNDViZjQyNTc2N2Q5MjA5ZTViYjU0MjlkNTc4MTQ3NzNkN2IzNmNiYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9ubWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ29sbGF0ZXJhbFBvcnRmb2xpby5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3ODQyNTczMGY1ODFmNWExMjU1ZGQ1ZGM2OGJjNGRhYTdhZTdkYTI2OGE5YTRmNmExOTEwMGQ3OWE4MjhiNWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9ubWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ29udHJhY3REZXRhaWxzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzAyNmE5MzQ2ZjRhNzFmYzg2MzE0ZTZjOWMyNWI0NzM1YjMzNjVmMWFiYTc1ZTNjNTI4ZDE2MGEyYTFiNmI4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25tZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFFeGVjdXRpb25EZXRhaWxzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDViZjI1NWI4NGEzZjkxYzU1MzhhOTg5ZGU5NDNiNjZlZTY3MTdhMTJjMTllYjFjODE3NWIyZTVkNGUxYTJlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25tZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFUcmFkZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiMjEyMjJiNGVjZjJmNTA0NTI2Y2M5ZWU5NGVhN2IzNmI2OWE3YjI2ZWMzMDM4ZDcwMWIyYjY4YmEyNzZkNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9ubWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhVHJhZGVTdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNmVmMWJhOTIzMzE5YmUzMjJlNzU2NzQ0NjE1NjNlMjM3MTJmYTk2MDQ0ZGIzYzgxZjA0NjY5YjJhMjQxMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25BZ2dyZWdhdGlvblBhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGY0NGRmOTZlNDdmN2YzOGMzNzcyY2M2NzMzNDQ4ZTJkNTE5MjMxN2YzM2FlOGI5YTBiNjljM2IxNGZiZjhkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvbkF2YWlsYWJsZUludmVudG9yeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZWUwMjM4NzQ0MWNkMjNmYzBhNTQ3Y2Y5OWVjNzk0YjdlMDk4YzFiOTc0OGUxNmI3NTc4MDg5Y2Q1Nzg3YjYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uQXZhaWxhYmxlSW52ZW50b3J5UmVjb3JkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlMDI1NjFlYmM0ZDNjZTEyMDc4MGNlMTA2NWYwZWU2ZWYwZDgyYmMyYWNjMTMyOGNlZmUwZTNlMGQ5NTQ0NTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25BdmFpbGFibGVJbnZlbnRvcnlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkZmU1OGNhZWU3YTRjOTI2YWVmN2YyZjNjNzBjNjEzOGRkNzYyMTE0MzgyZjU2YTIzZmZlYTFlMGExNGY1NzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25Db250cmFjdEJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOTAwOTgzZjNjNDNlOWFmYmU3YjgxMWVlZThiODEyZjliYzAyZDRiYzlmNWE5YmM2MWI5OWQ1MWNjMTcyZGE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uQ291bnRlcnBhcnR5UG9zaXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGVkMDA3MjRhOTI2NjdkNDQyYWVmMTg1YThlM2Q5MTNjYzQ4OTQ0MmZhZjI0NTA1ODJiMjI2NTA5YmE4MTFkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvbkludmVudG9yeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0ZjQ5YjliODcyMzg1NjJkYTg2YTczOWYyZjY1YjdhMTJmN2Q0ODQwMDE2ZjQ3NWExNTMxOTU4Yzg5MTFiYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25JbnZlbnRvcnlSZWNvcmQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNWFhNjIyY2FhYWI5MzY2ZWZiMjRmMWZkZjJkYmMyZmY3YjM1ZjE5MDM5NjFjMzQ4YzYwODcxYjA4ZWFmOTQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uUG9ydGZvbGlvLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4NzVlYTczYjI5ZDAwMGJjNzdhZDNjNzZkNWMxZmY2Y2NiMGEyNDNjMmU2ZTUzY2Q3ZmM0Mzg2NjY3NTgzZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25Qb3J0Zm9saW9TdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNmRjZDFkZjZkNjg0ZDhlMmEwMzhkZDljNDI0MjA4NmU0MGVmMzI2M2U1ODY2YzU0ZGQwMTFiZTczNGU1ZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25Qb3NpdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOGM2OWQ5NWI0MjI1NWM0ZjAzMWM1ODNiNDZhOWM1NDMwMWEwNzhhMzBmMTdmYzI1YTkxY2Q4NDBmOTJhMWQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uUG9zaXRpb25TdGF0dXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWZkMjY3YWRiMjkwYzZkNjI4NjIzYjU4ZjM1Y2RjOTI0YTBkZjllMDFhNDRmZmU2OTRhZWJkMDU5ZTRiN2U1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvblNlY3VyaXR5TG9jYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJjNDUyODE0YmVmNmViN2E1ODRmYzk2ZWM4OTcyZjI0NzRmYzY5MWI3YmUwZjEzN2IwMmNlYmQ3NmVkMGNlYWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25tZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQb3J0Zm9saW9TdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3NWUwNjNkMDI5YmRkOWRhNGRkMzNkNDcwYmU0MWMzZDZhMmVhNDM1YWIzODMxMmViYmVkZjc0NTZlZmU0MDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dDcmVkaXRMaW1pdEluZm9ybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjA4NGM5NjU1NTg5ODBjOWFhOWYzODBkMTJhYmFkYjcwM2NjMzI0NDk1NmFmNjY0NmY3ZTdkNWE2Nzg5NDllYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0NyZWRpdExpbWl0VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmJhZDA2M2ZmOGQxZTFhM2ExMmZjNTA4ZDNmYzViZWIwMjMwNjY4NmZlNjI0YWY3MTM1MjE0MWI2OWE1Zjk5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0NyZWRpdExpbWl0VXRpbGlzYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTdjMzcwOTZhYTU5ZTRmMjY3NmNlMDZjYjYxNzhiZmVhOTcyNGFmMzczMzA4YjRjZjYzYTg1NWNlNjZmMjk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93Q3JlZGl0TGltaXRVdGlsaXNhdGlvblBvc2l0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDkzMTUyMWEwNTdmNTg0OTdmMzFmZjUxMzJlNTI0NjdlY2ZkOTk4YWI4OTE2ZWQyOWVmZTg5NWNiNjUyYjA2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0N1c3RvbWlzZWRXb3JrZmxvdy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1NGY3MjkwYmQ5NTQ0YWJmMmZmMGIyZWIzZTJlZDhjZmI4NWEwZmM3Y2E3MDNlNmI1MjYzYjUzNDU1NWIyY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dFdmVudEluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4M2I5NzNlMzgxNjc1MDdiYjM1N2MwZjVmMTYzODczNWI3NTc0YzgwM2U0YjhjOTI4MmZlZTE3YWY3NGIyZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dFdmVudFRpbWVzdGFtcC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNzY2MDUxZWYyNjA1NTRmNDcwZTcxODUxY2ZjZTgxNGJhMGQ4NzMwZjdmNmJlM2IxM2Q2MjllMGI3Yjk0MmU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93RXZlbnRUaW1lc3RhbXBRdWFsaWZpY2F0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Y2UzZTA3YzlkYTQ5ZDEzODIyODlkZThlNmQ2NzNmNzM1NjBjYzJlM2M2NTZiYzVhM2JiMTc5NDg1MGMzM2NlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93RmllbGRXaXRoTWV0YUNyZWRpdExpbWl0VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDEwNjYzZGEzODg1ZWQ3NjViZTAzNTJkNzM5MmY4OGM3MGQxZDAxNDk5MjI4NTMwZGI3MDIwNDM1YjlkNTZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93RmllbGRXaXRoTWV0YUxpbWl0TGV2ZWxFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmQ3OTM3YmNkZTAyMmFkYjFkMTAxMTBjOWRjNWFiOWU3NjA3ZDU3MTZmODA1NmU2NDc0ZjNlZjE0N2MxMTY5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0xpbWl0QXBwbGljYWJsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTJjYWNmMGIzMzg3YTZjZGJlOTU3ZTEwNGU3NzJkN2UwZjIyM2MxMmFjYmZkNDRmZWM0MjAyZDM4MDc3YjcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93TGltaXRBcHBsaWNhYmxlRXh0ZW5kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGUwYmQyZGRhOTRkNTBlNDRlYzc3ZmRiZTcwMmRiNWU1YTZmMzM4NWRjZWM5MTE5NTEyMjNkOWE0ODg1YmFhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0xpbWl0TGV2ZWxFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFhZDJjY2UyOGI1MTAxY2JiODljMjE1ZmQwMDlmMjY3N2RkNDE0MWZmYzM4Y2JlYzk1ZWFiOTk3YTk1YzdlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd01lc3NhZ2VJbmZvcm1hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjMxODgyNDEwYzRkODlhYTE0YzI5NDk5NDQ1Y2IzNjMwNzBiNDFkYWI0YTYwNDcwMTI5N2M3NTJjMzQ3YzJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93UGFydHlDdXN0b21pc2VkV29ya2Zsb3cuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjM2QwMjQ4OTk2ZTk1NGVjZjdkNWM2YmNjN2U5NGQ5YzIyOTViMTJiY2MzZWE4Y2Y1ZTk5MzNlYzI0YTZjMjJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93VmVsb2NpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTIwYjcxZWM1NWZiZjBiOTk3ZGZhZDU2YmI2MjJkZWVmNjlkY2VjOWViN2YwMDY0NDg4MDRhNGEzMmViZDQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93V2FyZWhvdXNlSWRlbnRpdHlFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDYyODdjZmY0MDVjNzZlOGI1NmIzNzcyOWJkNTg1NjE4YWI2YWY3ZTUxMzdmZDZjY2Q3NGViOWVjNGQ5Y2M4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1dvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTZkOWFjYmJmNmI5ZGFkY2NlY2RlNjUzMmU2MDI3OGMwOWVlYWE4YzBmNGUzODQ0NjJlMWI1ZWQxZjMwNDAyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1dvcmtmbG93U3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2VmYTA2YTdmZDQwYmY0OWMxZTljMTMzMzNjNWRhZWI2NjFhMzA5MmM3YWNjOTY1YmFmOGUyZjY3NDllZmM1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1dvcmtmbG93U3RhdHVzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNTljZTE3N2EwNGM5NDlkMWFmNzEwZTg5M2JjNWJiYmMxOTc1MTMzZjAwNDM2YTE3Y2QyYmE0M2MzYzg0NjQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93V29ya2Zsb3dTdGVwLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3YTFiMzlhMjcyM2Y1OTE2Y2RjZjkyMTZmZjNlOWZjMDEwYmU1N2JhM2ZjN2FjOGJhMzIyNzAwMTVhOTY1MzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dXb3JrZmxvd1N0ZXBBcHByb3ZhbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkMGQ2NzFhODY3Mzk0ZmViYjI2NDEzN2Q5YTg5YWVhNTdmOTUyOThkZWVjMDU4MGYxY2MwOGZmOWNkMjIxNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFXb3JrZmxvd1N0ZXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWZjODY4YjgzY2JjZmRhNjFmMDRmOWNlMjFlNWQzYmI3ZWE2OWE3ZDZlMTA4NTYyNWU4NzRiZmJkZGI5OGFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25BZGRyZXNzRm9yTm90aWNlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjMThkZTFlZDhlNWZkODY5NmFlMTk1ZmI2ODQ1NTM2NmI2MWM0NWVmMWE5MTc3ZWU0NWYyMzJiODQwMmIyMDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkFncmVlbWVudE5hbWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhjOGY4MjNlYTMwMTFlMDFjZDExNmJhN2Q4ZDQyNDI3ZmRiY2ZiNDg3NDQ0MGQyMzdkYjllOGRlZTY3YzU5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQWdyZWVtZW50VGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMThhMjgwYTRlMzg4NTNhNWNkNDZlZGFiZjdlNjNhNWZhNTlhODE2NDJmNGVlZDM0MzUwZjc5YWY4ZTExNTExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25DbG9zZWRTdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OWNkMTRjY2EwYzkzZDcxZGEzODQ1ZDgyNWQ5OWY1MjJhY2E0NWM1MDliZTI0MDhhMWRhNmRmMGNkMGJmMzY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25DbG9zZWRTdGF0ZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVhZWYwMmRjNzlhN2IyMGViMzUyOTA2ZTYwYTNjYzk3MDA3MjU0OGQyNDEzOGNmNTkxNDBkNDQ3Nzc0MWQ3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ29udHJhY3R1YWxEZWZpbml0aW9uc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWUyODRlMTQwMGRhZDdmNjBiMzZjMWUwZTY5MDQ3ZDVjODY1YThlZTE1ZmU1MWU0N2FmOWFkMTBkMjhhNzcxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ29udHJhY3R1YWxNYXRyaXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWE0ZTkwNjczNWJhMTgyOTExNTcwYTc1OTBlMDYwY2IzZTgyYzY3N2M5YmE1MzFiNmM3ZTEzOTRiMGM1MTY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25Db250cmFjdHVhbFN1cHBsZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTdmZDdkY2FmY2IzYjQxMjU3ZjlhMDE0OGUyMDkyOGQ0ZjQxNWJiMWIwNjIwZmZiMjczYmQ4YjRkODJmN2FmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ29udHJhY3R1YWxUZXJtc1N1cHBsZW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YTJiYWQ3NDYxYjI4OWY2NzdmN2VhMzAwYWYxNTYyMDQyNWVmNzRlOTBmNWQ5MzY3YzE1MjkyMDcyNTk3N2Q4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25DcmVkaXRTdXBwb3J0RG9jdW1lbnRUZXJtc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYjg3MmFhMmVlMmY2ZjUwZTE1MGU5NWFlYThiZjQ1ZjBlMTRjYWFlZmIyM2U5MzI1ODkzNzQwNDY3NjZkZDI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25DcmVkaXRTdXBwb3J0UHJvdmlkZXJUZXJtc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTc3Y2QxOTRhY2EwODNiMDA3ODMzNTJjNjI2OTM3ZGQwZmQxZDJiMDEyOTAwN2FkNWQyMGYyOWJhYTg1OTUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25FeGVjdXRpb25Mb2NhdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODBkZThjYmRiODg4Njc5ODJmNGI1M2JlZWIzZjJlMzVhNTZlYjBjZmNlOWQ1NDMwYzJiMDY0MjJlNjRiNDY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25GaWVsZFdpdGhNZXRhQ29udHJhY3R1YWxEZWZpbml0aW9uc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTM1MjE1NmRjMmM4NTJkNDY4YzM2NmU5MDkyMjA2NmE5YmFjNTY3ZGI2YjIxNzI5Y2ViZDU1NTg4NWEwMDM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25GaWVsZFdpdGhNZXRhQ29udHJhY3R1YWxTdXBwbGVtZW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzI0NjRiNWVmYTkwYzE2YWI0NDRkNjVmNGI1NDhmZjk5ZGQ3YWZlZmNiMDBhOGM5YjZiNTcyZjZjMDM5MzE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25GaWVsZFdpdGhNZXRhR292ZXJuaW5nTGF3RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlYWQyODlmZDRlM2FjZmZkNTIyZDUzM2JjOGNmYWQzZTg4NzI2MDhiMDBlYWJkYTk5YmI1MjM0YzJlNjhkNWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkZpZWxkV2l0aE1ldGFNYXRyaXhUZXJtRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjODY5Yjc4MDgyOGIzZDIyZmU0MjlkMTIzZDgxNWFiNjVhMDEzM2Q3NjdhM2M2OGI3ZjJiZTdkNWQ1MDU1ZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkZpZWxkV2l0aE1ldGFNYXRyaXhUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyMDUzMDAyZGZmMzdhNDQ5MTgxZGZmMDg4MTIwZTQ1MzVlNDc5YzNmNjM0MTIwNjM2Njc0OTZjNTQ5ZGM4YjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkZpZWxkV2l0aE1ldGFSZXNvdXJjZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjAxYTQzNGNmMTNiNGFlZGY1NzQwNDcyNWZmMzBkYjNiZTYzNjcwZGJiZTQxYjljODlmNDM4YWY3MTgzYmVkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uR292ZXJuaW5nTGF3RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NjQ3NDBhNzkxOGYyYmRhMTQyNTgzYWM1YzNlMTljNmNhZGE0ZjczMDk3YzJiZDc4YmU2ZGY5YjFkZjdiM2QyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25MZWdhbEFncmVlbWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjUxN2FiNWM2NmJhZDM5YjQyOGFiNmI5NzE0NTA1N2Y4NWQ0YTIwYTRkZTljNjc2ZTQ2OTI4YTVjNGNkMTZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25MZWdhbEFncmVlbWVudEJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzEyYjlhOWFhNTYzOWZjYTQ1YWNlOGJjNzBiYWE1ZGFjMDMzZDZhZTgyZDAzMzVhMTFiYzllYTA3N2VkMzU3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTGVnYWxBZ3JlZW1lbnRJZGVudGlmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMDNhODdjYzI1MTUzMjM1MjE0MDcyODA1NmFkOWNlZDhhODBiYmJhMDMzOGI3ZjJmNmJjZjlmY2Y0YmFlNjBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25MZWdhbEFncmVlbWVudFB1Ymxpc2hlckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQ5N2M3MDZhM2U3YWNmYTM1ZWFlODRlOGRkNDFhODI5MGMxY2ZmZmQwNWVhODQzMzE1ZTAxNDg1NGE0NmI1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTGVnYWxBZ3JlZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZDA4YTRmOTEyMWEwNmIxODM0ZTdkNzk5MjJlNGE0ZTVhNTc1MjNmOGNmOWEwZmQ0YWFlYmI1YWQxZDg2YjBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25MZW5ndGhVbml0RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjM2FiYTVjZWQwYjkxZGU0Y2QxN2QzMDdkZDliZGM0YWU0NTIzZTk4ZGMwYWVjNDc4NTc3OTkxMTg5ZjZlNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbk1hdHJpeFRlcm1FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNmM4Nzk5ZDc0OTVjMjJkYmZmZjViM2Y1MjVmYTQ2YTgwY2YxZTQwOTI1Y2E3ZDk5OGFjNDhkMTNhYWE5NDg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25NYXRyaXhUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNlNmFiZDRkNDJmZWIyMTg5MTM1ZTEwODU3ZDAxNTBhODIzZTA5MWQ3ZmE3N2JkOTYwZjcwNTY3ZDU2OGU3MDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbk90aGVyQWdyZWVtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjNiMTM2YWM0ZDdkMWMxYzllZGUzMjBiNjY3ZjUyMGYyNzRkYzU0ZjU1NzE4YjVhNWU0NWFlYjdlYjE4MWVmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uT3RoZXJBZ3JlZW1lbnRUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhNTgwMjYxZDg3NzFiZGQ1NjY2NzYxOGEyNjc3OTI0N2I5MjQyZjYxY2UzMzVkMWQ0ZWY5YWY1ZDViMGE1YmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vblJlc291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzMzc0ZWQ0ODhjNDZiZTZmODM3OGNmNWQxYzhjY2M5YzZmZjNiZWIzMzdmYTE0OThjYjJiNDY2NzFjMmI4NzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vblJlc291cmNlTGVuZ3RoLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDFkOTMyMDVhZWEzMjE0Yzg0MmJlOWI2MmNlODEyM2FjOTUzOGY4MzRjMTM3YWQ1OThlN2E0YWVjZGRmYmIxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uUmVzb3VyY2VUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3NjExZWViNTRjMWNjNTdlNjhkOWI0OGJiYmZmZDIzMWEzZGJjMWNlYjBjNjM5NjIwNmY3M2I3ODEzNTk5MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vblNwZWNpZmllZEVudGl0eUNsYXVzZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOWRkYTgwOWFhZWVmODNiYmRmMTkyZmFjYWU1OWVlMmI5NDViODczYmU2NDBiMDkyNTVlMjI1ZmRjYmM2MTQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25TcGVjaWZpZWRFbnRpdHlUZXJtc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODAyOGVkMmE2ODhlZDY0MGI4YjdhYWE5ZTZmM2NiOTYxYjJjNzg3YzE1Y2EyZTUxMjMwMjJkMDk5ZmUxNTYwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uVGVybWluYXRpb25DdXJyZW5jeUNvbmRpdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkN2NlMjkzZjQ1MWVkYmMzNDZiMzAzMmJkMjUwOWIxMGM4ZWQ0NzU0N2IzMDY4NjQxOTBjNWRkMWY1NWE1Nzc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25VbWJyZWxsYUFncmVlbWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODI1NjBjMTU1OTZkYzdlNjlkYjFmM2UzMzMzMDZjNTM4Y2QwNWU1ODg0YmJmY2MwYzIyMTIxMjA0ODQyYjE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25VbWJyZWxsYUFncmVlbWVudEVudGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1ZDlkODE0OTkyM2FhODFmZjdmMjNhYTgxMzFkOTk1YTY4NmI2NDYwNmM1NWU3NDAyYWVkYmI0ZTJhMjYzOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbm1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUxlZ2FsQWdyZWVtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzc1OTUzODBjNmE2NzY5N2QwZTc0YTQxMWNmYjFlMGJiMjcxYmI1YzAyYzY3NDBiZGM3OWY2Mzk4NWY1NmRiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29udHJhY3RBZ3JlZW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjYzY2I4MTBlZjNlNTYyNTU4NzMwZmI4YzM2NzExZDAzOWMwNTM3ZTZjM2YxZWQ3Nzg4YjI1NTY4MjQ1ZjA2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY3NhQ29sbGF0ZXJhbFRyYW5zZmVyQWdyZWVtZW50RWxlY3Rpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGUwMDYyMzc4YWExOGI0MWQ4NmE5ZDU0ZDViOTIzZWY3NGU0NzkyNGVmMDc0MDYxMmVmZDVhNDhjYjViZjRhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY3NhQ3JlZGl0U3VwcG9ydEFncmVlbWVudEVsZWN0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyN2FhNmQ0M2JiZjAyMTcxODQyMTIxZjUyZWMwYTkyYzFiNDg0YTMwNWU1ZTBlZmZlZTcwZjFhMDQ3MTY3MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNzYVNlY3VyaXR5QWdyZWVtZW50RWxlY3Rpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTE1OTY1MmU2YmE3NTc5YTRmY2VkZWI3NDg4NDFmZDNlNmUzMWE0ZWFlNjU1NzVmMGU1MGYzZDEyMjA3NDMzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyQWRkaXRpb25hbERpc3J1cHRpb25FdmVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWYzMzZkZTdhZWJiYjM0MjYwNWYzMWYyNDlmNTliOTQzZDIwMTUxMWM0MWNlNmQ5MGUwZDcxMmU4NWUyM2JhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyQ2xhdXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2VkNDMzYjQwZjI5OWM3ZjA3ZDUyNzU3Y2NmOWRmODVmZTM0ZDdjY2QyYmE1Zjk0MzY5MzQ4ZWQ1NmUzZjE0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRGV0ZXJtaW5hdGlvblJvbGVzQW5kVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNGU2Y2JkNTQ3NWI1ZWY2NTc0ZjJkMWZmMTMyZTBlNzdmYWMwOTBmY2Y4OGE1Y2YzMjc5NGI5MWIzNjAxNjc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJFcXVpdHlBZGRpdGlvbmFsVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOGFkYzc0YWJjMjJjMjk4OTBjNTQzZjk2OTA5YTViZTgxZjA5MGUzMWNjMjJiMzliOWNmODU4YTBiZDFiY2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJFcXVpdHlDb3Jwb3JhdGVFdmVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YmNhNTM2NzI4ZmVhNTIzMDM3NjM4NTUwMzI2YzRlYTVkZjJkZWVhZmE3MTM4OWMzYmEyOWNlZGRhN2JiN2ZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJFcXVpdHlNYXN0ZXJDb25maXJtYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YmIwNGI3NzFlNWRhNGZmZGE1YWVhMTRhNWQyMTgwYjliYmZlZTA2ZjU3NzA5ZmI0MzUwMDc0NzE0NzQwZWNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJFcXVpdHlTd2FwTWFzdGVyQ29uZmlybWF0aW9uMjAxOC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MmI5NWY3YTUyOTRjZjNhOWY2MjNlNTQ1OGY5MmNiZTgxNDY0MmM2N2I4OTZjYjA3MmJkMDIyZTllYjExM2Y2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJFeHRyYW9yZGluYXJ5RXZlbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5MDg4YTRhZTA2ZGNjNzdmODEyNjVmYzdiNDA0ZmQzMjkwMjFmOTcxMjA4MjNlMzlhZDIxOTQ1ZDE2YjY1ZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckZpZWxkV2l0aE1ldGFNYXN0ZXJBZ3JlZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhNTVlOWRlNGM4YjJiZWE3Y2IyOWQ2ZmZlMWFkODhhOGI1NTQ4MTY5Y2Q0ODM2MGMyOTYxZGZkMzY2Y2QzYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckZpZWxkV2l0aE1ldGFNYXN0ZXJDb25maXJtYXRpb25Bbm5leFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODFmNWViMTYwYjNkNzk5ZTc1ODlkOWZmOTIwNjZjNzYyN2QyM2E0MjNiYTVhNmIwMzJhMzY4ZjgzYjFmMjMwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRmllbGRXaXRoTWV0YU1hc3RlckNvbmZpcm1hdGlvblR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTljMTNmY2ZjMzBiYmViY2RmNTc1Yzg2YjZhYTVlYmU0Yzg1ZGFmN2FjOTI2NTVhYjM0YzI5NjI5ZjExNmY3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRnhBZGRpdGlvbmFsVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjMyZGE4ODI2YTgyZDQxYWRjMzUyMzgwZDkxNDI3MGMwY2RmMDYxOTNiMWI5OGM0OWMyZDY4YzJkNGY3YjlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJJbmRleEFkanVzdG1lbnRFdmVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzA4YmFhNWIxMzM3YTU5NzlmNTU2ZDMzNjQxNDBmNGFmZTIzN2RhOGY4ZDcxMWY2NmVmNjE0NjFhYmNjZjI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRDbGF1c2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTc1OTY4ZTk1NjEwZGExNmI0ZmY4ZjNlZGVlMDFjZTFiMTFmMzAzM2ZkZmJiMzgwMzI3YTM5NWYwNWVmN2Q5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQWdyZWVtZW50Q2xhdXNlSWRlbnRpZmllckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JmYzlkZjMxZTNlNGMzYmM1NGMxNTFlNzQ4ZGMwNGQ0ZDYwNTYxZmY1NDY5MmQzYzY3MTcxMDdiNTM4M2JkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQWdyZWVtZW50Q2xhdXNlVmFyaWFudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOGIwNGVjMzVlMzlmNDgwODMyYmMwMzdlYWQzYTBhODRkN2Y0NTBhNDQyMTQ1MmM1NjRiNzdjYWMzMjI3YWNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhYjc5NDBkYmU5MzNhNWQ4NmViZjRkYmU4ZTQzNDRlZTYyZjc3YTMzZjAxZjhlOGRlOWNhOTNmYTMzNzQzMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck1hc3RlckFncmVlbWVudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxNzUxM2ZmMzY3MzJhM2VlYjdmY2RlNGVhMWQ5NDkyOTBjMTFlYzg5YTUyYzY0NDBjYWQwYTA3YTVmNjI5YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck1hc3RlckFncmVlbWVudFZhcmlhYmxlU2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWRlZWNkM2FmYmZjNDZmYTdmN2QyZmMzNjY2MGVkYTUwNGJmMjAxN2E5YjlhYTU0MDYyNzQ4NWFjODRiZDFlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQWdyZWVtZW50VmFyaWFudElkZW50aWZpZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU5OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZjU3ZDkzYWU5Yzc5MmFhOWQzZjBkMDVlOWI5Mzc3MTQ3N2U5YjFlMWY3ZmU3MjE3ZmJhNzZiY2RjMzEyZDEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJDb25maXJtYXRpb25Bbm5leFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5ZTgwYjEwMmNkNDY0MjBjYzFhYzNjMzEzZGVkMTI3OTlmNzg0N2QyYzE0MTU1NDM1ZjE3MTZiNjI5YjU3MWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck1hc3RlckNvbmZpcm1hdGlvbkJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNWQ0ZmU4ZmQwZDYxNGQ2NjFjNzFjMWNjMzAwN2VlOTcxMmZiYWE5OGU3OGZmMDA1Y2FkMTIyYWNhMjYwNDRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJDb25maXJtYXRpb25UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWExNmViMmFlNGJkM2VmMDVlMTY2ZGRhNWI5MTk3OTMyZTBiOTJmNmZiZmIwZjMwMTFiOGJjZDg5OWJiNTYzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTmF0aW9uYWxpemF0aW9uT3JJbnNvbHZlbmN5T3JEZWxpc3RpbmdFdmVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOGU0NDk5NjBkZTI1MzY0YjJlYmI4OGQ5ZjRkODYyNGFiYjk5OWJlY2U3OTFiZjExMWUyNzI0ZmU1NjUyYTYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJSZXByZXNlbnRhdGlvbnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmNWNiMTlkZjE2YmFiNDkzNmY0ZjI3MGUyYTAyMWNlM2JhYTZiZGQ2ZjAyYzI4MzJmZjZlMjlmZjM3MmI5ZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlclRyYW5zYWN0aW9uQWRkaXRpb25hbFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhOGYwN2E3ZDM2OTQ4Njg5NDRhYjQ4ZGYzNDRlNDUxMjIwMDE1NTkwYzcyNGZhMzNhN2ZmMzBjYTUwZjczODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlclVuZGVybGllclN1YnN0aXR1dGlvblByb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjYwOWI0MjZmYzBkODMzMzU2ZTk4ZjlkNzdjMGViYWM0MzAxYWMwYzNkMWY4NzY4YjU2NTg2YWZlMTMyMzdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1tYXJnaW5zY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQyN2MyMDMzODZiZjZiYjg4Mjk0M2U1MmJjMWY0YmFhZTVkMjc3NzY1NjRmZjExM2IzODA0YzcwNzM0ZTRiYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbWFyZ2luc2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZUFzc2V0Q2xhc3NFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGFkNmUwYTMzMDFjNGZhYzU0NmYzMzhmNjQyZjQyNWZhZDQwN2YzMjIyNTUxMTQzZmU3NmJiZmMzODA5NTE5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbWFyZ2luc2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZUluaXRpYWxNYXJnaW4uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNTM1ZjY4YWMzNGUzODg5NzFhMmIzYTNkM2Y2M2QzODRkMzBkYTAwNGFlMDFkNzg0ZjgwOGMyMTU1MThmZTVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1tYXJnaW5zY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlUHJvZHVjdENsYXNzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDI4ZTU2YWVjOTBhODhkOGVkYjM3NzcxZTI3OWNkMjdhZTQwMWVjZjEwODc5MjIyNmE1ZjNiMzIyMDY4MTA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1tYXJnaW5zY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlVHJhZGVJbmZvLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTFlMjMxNzgzOTFkNWQxNmJlNTY0MDMwYmE1MGY3Mzk4YzYxNGZiY2ZiNzcwYTAxMzM4ZTE3NzlkY2YyNWI4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0QmFza2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImE4NGI5Yzc4OWY0NzkwMTlhZWY3NGM3NDUwNThlNDcxM2ZjMTViNjA2OWMxYzQyMDY5OWZkNWUzYWRhZTZiMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEJhc2tldENvbnN0aXR1ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjOWM1Mjk1ZWIzMDA2N2UxNzdkNmM5MmE1YjZiYWU4N2UzODcwMzgzNTcyMGU2MWJkMTU1YTAzZmNjZGNlOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENhbGN1bGF0aW9uQWdlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjUzZjZmMWM3ZjllYzk3NWVhZDFkMzJjN2UwYzgzN2ExZDcxM2ZlMmY1NDcwYmU3NGYwY2RhYjA1ZWUyNWUwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q2FzaENvbGxhdGVyYWxWYWx1YXRpb25NZXRob2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTUxYmUyYTJhODUwODZkMGIyMmI5MGZkNzc1NDUwZjYxNTc0ZTc1MzViZjgxYTIyNGEyM2UyZDlkZGNhNTg5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q2FzaFByaWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTIxYmFhMWNjMDc0MjBkOTc2NzY5NjkyOTFmNzZjMTRmMjRhNGQ5NDhmNTg4YzQxM2MyYWIxYTg1MzhmYWE4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q2FzaFByaWNlVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MTZjYTA2NGZmZTIyNDJmMTg0ZmJhZTA2MzAzMmMzNjdlN2QzZDMxMmFlOTZjMjkzZDBlZmNjMDQ5NzE3NjVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDb21tb2RpdHlSZWZlcmVuY2VQcmljZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTg4M2ZkMTQ0MWY3NzhmNjg1Mjk5YTdiMTViOGZiYWFjMDM3YWRiYTVjOGJkZjM3NzVmYTAzNjM4NGEwZWQzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0SW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTFjNjg1MTQ0Y2Y1N2NkOTY2MDM0ZGQ3NjY4YmYwMmY4NjkzM2FmNGEzZWM5YmFiZTc5MGQyYWYyNWJmYzZhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0Tm90YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFhNGIwNDNjNmIyZWQxMWEwZjNkNzE1MDBhNjdhYTJjYThjOWVlNWVjYTIyNjFhOGMyOThlYzU4NjJmNDA2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0Tm90YXRpb25Cb3VuZGFyeUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzBhNzQ5YWQzNmYyODQ5MWU5NTY1MDc0NzQ1ZGNiZDQxYzFjNDA2ZTMyZmNmOTNmOTRhMTNhZWI1NWViYjc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDcmVkaXROb3RhdGlvbk1pc21hdGNoUmVzb2x1dGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzU2M2QxNGEyNjJhNmNkYzkyZDU3ODM1YjEyYzE4MDRlYzQ3MThmOTU3YjVkM2E3MmE0Y2JkNmU0NTBjZGU2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0Tm90YXRpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE0ZTA1YzFjYjg1ODMzNDk2YjEzMzIwMjMyNmU0MWNhYmZlMTk1MmU5MWQ2YTEwODMyOGU4N2JhYjgzOThlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0UmF0aW5nQWdlbmN5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNmFiMmM4MTY1NGExYzlhZGE4NTM0N2ZlMmEzMWJjNjc4OWQ5MWQ0NGIyNDhmMWQ0N2RhM2IyMTA1ZDc3NDUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDcmVkaXRSYXRpbmdDcmVkaXRXYXRjaEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NzEyYzYzMWI3ZGEyY2UzMjFkNWVkNWM2ZmJhM2I1MWMzMjMzMjhjNWRmYzA0Njc5NTc2OTdlOThkODQ0N2ZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDcmVkaXRSYXRpbmdEZWJ0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzBkZTRjNGM5Y2EzY2I2ZTBhYTE5YTY0ZWU2NzlkNzU5MWVlZTM1NzYyM2MzMGQ5OGIwNzI0MDExNGE1OTZjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0UmF0aW5nT3V0bG9va0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTNjODU0YzdkMWFkM2I4NmVjMTZmOTIzMTYwOGIyOGI2ZjBmNzBjYzBiYWRiNTZjOTdjZjMyOTcyOGYzOGE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDc2FUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwMzgwZGQ5OWU5NmFiMTIyODNlOWU0Nzc1YjAyOGVlYjI1ZmNkYzcyZDRiMWZlMTY5NWRmZGEwYWM5MzQyMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEN1cnZlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGI5MGEzZmIyZWIwM2Q0MjJjZjgxMGY2YzAxNTY5OGU3N2U5ZmYzNDc2MzZmZTBkZmJmOWVmZDdkMWY0MDQwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RGl2aWRlbmRBcHBsaWNhYmlsaXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjNzljMDFkMzcwMDczMjZlMmQyZGNmMjhjZGYwZDUxMGI0ZGE2NzdiMTY0MjExMTZiMmYyM2I1YzBiZWViMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEVxdWl0eUluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2ZWU0ZWY1ZTI2YTRhMWMzZDY3ZThjNDM3YzM2ZDMwZjIxYjNkOTlmOTRlYjMzNzY4MGFiMTVmMDkwMTE2ZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZhbGxiYWNrUmVmZXJlbmNlUHJpY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODYzYmNkOGQ4NTY3YzM3ZDM0YzVhNzJkOWQ1MDcyNDY2NzcwYmYyMGEwMDllNGRkMGRjYWM1NGU1ODE3N2M3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RmVlVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjU2YjlhMzVhYWMyMGM0NTBjNjg2M2E5YmU4OTM4NjU1MmI3OWVkYWIyMjRjMjdkZDg5MjdlMjRhMmVlZTQ4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RmllbGRXaXRoTWV0YUJhc2tldENvbnN0aXR1ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQxNWZkMWEzOTllNWVkZjJhZjg4OWJmNGJmMzllMTk4ZjkxN2Y1MWY1NzE4ZjY2NzEzOGY0Zjc1ZGEyMmViZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RmllbGRXaXRoTWV0YUNvbW1vZGl0eVJlZmVyZW5jZVByaWNlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZiMDdiYmU1MzZlMjEzMWRjMTk4ZmQ5OGRkOWNmOGFlMjAwZDcwODFjZTk0ZGNhMDUzNDkzYTM1YTNlNmQ2NmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFDcmVkaXROb3RhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiYmFjODlkYjI1NzAyOTExOWQ5YWRhMWUyNGVhODhiN2ZjZDhlNzhmMjgwNTdiNGNmODU3NmZmNGI3MDUwNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFJbmZvcm1hdGlvblByb3ZpZGVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImMwZDMwYjY5NzgzNzJlMzQxOWVkODgwZDM4NTFiNzU0YThhYTU5YjIxM2EyMGFlNmYwNjJlZGVmOTRkZmQzODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFJbnRlcmVzdFJhdGVJbmRleC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5YTBjNmMwZWEyNDc4NmRiMjQ3YWFiMWRhNjAyMjE4MjY3MTI4MzRiMGVkNmU2ZTRkYWIwNmFhMDlmMmJlY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFJbnRlcnBvbGF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwMWI3Zjg4MjcyMjMzYzUzZDE4OTBkNmY0OWJjMmYxZDAwYmJhODA0NmVhMTVlMmY5NzY0N2UzNjJiYjI0NGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFPYnNlcnZhYmxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjg3Yjk2NzZhZDQ2OTA4ZGMyNTE2MmNhNzAyYzRkMDkzZGU3ZWE1MGI5NDYxMzllYzg3OWI2NjljNjI4NmM4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RmllbGRXaXRoTWV0YVByaWNlU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYTNiM2ZlZmQxYTI0MTA1M2Y3ZDFmNGU2MjA5MTIzNWRhZWQ3MmIwYWU3NmVlNjZjZTFlZTUyNjVkZmUzZjQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGaWVsZFdpdGhNZXRhUXVvdGVkQ3VycmVuY3lQYWlyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzc2OWM1Zjg2MDdjODIxNTJmZTcwMGYyMjViMTg0NzExMjM5NzJkMDRiN2JlMWM3N2NmZjZlZDZhOTQ3NWU3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RmllbGRXaXRoTWV0YVNldHRsZW1lbnRSYXRlT3B0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxYWQxZjNhMDkyOTFjOWFkMmI0YTE3ZDA4MGRkYTU5NWRlODQ3NDkwYmRmOTk5ZTVmNDNhMDk1MmEwMTY0MTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZsb2F0aW5nUmF0ZUluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3NGZiMDVlMmU1NWYxNjNiYmE5Y2MyNDQ5MTA3ZTdhYTVhMmVlNGJjMTMzOTdmZGNhZWM2NzMxOTAzMzJjMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZvcmVpZ25FeGNoYW5nZVJhdGVJbmRleC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODQzZWE5OTA0ZTYyYTgwNDU3YTY5ODBmNzgyNGE5NjQ5YWU2ZjgzY2Y0NGFjMDZjZjc4NDhiZDI4NDQzYWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGeEluZm9ybWF0aW9uU291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzYjI2OTJiN2IzZmYxYWQ3OWJhMzY2OWM3ZDAwMmE1YTM5YzFlZmJlMmM3ZDM4ZmM0N2M4NzVmYmMxN2E2NmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZ4UmF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyN2RhYmNlNzY2YTkwOTk1MDkyMDVhM2VkNzdjOWRjYWM2OTA4MWM4YjAyZWY5OGRlZmRiNGU3MjhiNGI3MjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZ4UmF0ZVNvdXJjZUZpeGluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxNTA5ODljMzdmM2Q1NDIyMDdjMDczMmJiOGY0ZDYzYjIzZWI2NWFhODQ5YWFhYjJjYjZlYzYzYmI1Mzg2MGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZ4U2V0dGxlbWVudFJhdGVTb3VyY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZDUwNzkzNzA5NGQ5Y2JiMWNmMGMwY2E3YTMxYzAyZGZkZDhkYzI4MDc0Mzg2NjYxOTlkOTk0M2E5MThlMzkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGeFNwb3RSYXRlU291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODZhM2M4OTcxZTE2YzI1MzI0ZWIxMWFjYTg1ZDU4NDc3MDc2OTI5YjQwYWMwMGRiN2IxMmQxZWFhYzFjYTEwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0SW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTExYzIwODg5MzAyMGIxODBjMzhmMzlhZTQzMTM5ZGE5MzBiMDJiZWQzMDA5Y2VlYmE4NTZhMGQ1YTkwMzExMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0SW5kZXhCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkOTAxZTk2OWNiODUyMjM1MzY4ZjU4ZWYwOGI5MWU3NTJkZGMxNGI2MjFlNTZlN2QxMDY3Yzc5MTU0NDNlN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEluZmxhdGlvbkluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1YzAyYzExZDk2N2I5YTZkY2MxMTRlODFlNDg3YTNlYzU5NDQwMTAzMjY0YzU4YmFjN2M1YTJmMTRhNmI4MzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEluZm9ybWF0aW9uUHJvdmlkZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3OTg1NmNmOGE4MTAwODVhMDVhNWJjZGM5MWVhZDM4YzgzOTg5ZGJkZWFjMmZiOWNiOTBkMzU5NDBkNzZhMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEluZm9ybWF0aW9uU291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwNDczMjExZjZiYTFiYWU4Nzc5Y2U4Y2E2MGU0ZmZhYTRjYjJiOTkxZjU3ZTRhOGU5NjY5ZmM3NDEzYWI4MTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEludGVyZXN0UmF0ZUN1cnZlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODNlYzg0MDhmMDczZTQzMTM4NzM0Y2QzNjg1ZmU0NTdhNzVkMjg0NDYyZDVjNzgwZmI4MzFjYzFhMzkwMDkyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0SW50ZXJlc3RSYXRlSW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmZiYTdmN2FkNDQxOWY0ZGQ4MGMyODc1OTJhYjk4NGU4MmNlNGQ3MzYxNzRmMDgyNTIzZmE3NmJkMGJkZmU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRJbnRlcnBvbGF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3ZTkwMzJmNzBhYjRkMzIwMjY1OWMxNjA2ZjRkNjBjNzI2ZGQzZTk3OTg4YThhYWE0MzliYWY5MDY5OTBiZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldE1ha2VXaG9sZUFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjJhNWQ2YzViMjNhMjMwNDA3NmJhZjA3ZTZkYjA1OTM0YzEzODYwMjA3MTBjYzliMGUxNTUwYjQzYzE4MTY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRNb25leS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0N2ViY2Q5MzdmYTIzYmU5Mjk3MmYzYjgyNmJhY2UwZTUzNmVmNjkwMTNjYmVlYjFiYjMwODEzNTc3M2E2MmM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRNdWx0aXBsZUNyZWRpdE5vdGF0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJjMTM1MzQ3MTc4ODc3OTczZDk4YTFjODc3NzNkZDdiYjM3ZTgyMTFiODI0MzkwYWYyODJkNWRkMWI5NDY3OWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldE11bHRpcGxlRGVidFR5cGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFmODdmZGYyZjQwY2I1ZjQ4OTE4YzE2MjM0MDhhODY1ZWIyNzdkYzc5M2FmYzQwZTAyYjRmZjBmNzkwNzlhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0TXVsdGlwbGVWYWx1YXRpb25EYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjlkZTY5NDJiMjA3ZDYyY2NhZTc1NGMyYzM5MDQ5YWQ5MGQ5YzEwYjI0NjIzMDY3MTA1ZjQ5OWE0MGE1MmNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRPYnNlcnZhYmxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDZiMjVjNGZmYzI2MzQzNWNhNDYyYTEwMDZmNTlkYjNhOGE3MGVkMzE2MWRmOWEzYjVhOTU5MTZiMTEyNjQ3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0T3RoZXJJbmRleC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjI4ZGFjYzlhYzBhOTQ2MTA2ZjUxYmY3NDJkMDc5YjhjODQ2MTYxYmI5NDg4OWM2Y2M0NjUwYTUyMmUzNDI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQYXJ0eURldGVybWluYXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1NWU3ZjQwMTY2ZTE4MzY1MTk4YmMyY2EwNjEyOTEzODQ5ZGEyZTQxZWY0NjU1MDA4OTYzZDk3ODU2MTkwM2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFBlcmZvcm1hbmNlVmFsdWF0aW9uRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGI0NWNjMzRlZWUwNzZjOTc4ZDMyZTg3NTA3NDU4ZTA2YmY5OTcxMGM2ZWJjMzg5OTZjNTI4Y2NkNzNlZDkzMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJlbWl1bUV4cHJlc3Npb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmVlMzdhNWFlYWViMThhNGI0MWVhOTAwN2JlMjI3Y2Q0NGE1MDA2YmU5ZjkzZTc2ODRhYTZhZmY1ZThlNzc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmVtaXVtVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDJkZWU3ODAxNDdkZWE3ZjMyYWU2ODI5NTBiYWFmMDM1MWJiNTliODhiOTk0ZjgzZWI1YTljNzViZjA0NmNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YWUwNjMzNDgwNmRlM2M4YjVlMDY2ZWEyYTA2ZjQyMzBhOWE1ZDc1NzE3ZmY5YzZhMDBmNTIyODg1MjUxYTEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmljZUNvbXBvc2l0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDZiNzVkYTdiYmJlZjU2ZTA1MzVmOTgyZWViMmI5OTUyNjY4YWE4MzRmNDk4ZWM4YjIzNmNkOWRhYmFhODE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmljZUV4cHJlc3Npb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzYxM2E5ZTZhNDc1MzNjOTVmZjJiYzdlZDUxMGM3OGIzMzU1OTUxMzcwYzNlNmI5Y2E5OTkyMGFlYTcyZTFlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2VPcGVyYW5kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNmEzMGEyYzBjNmM2OWY5MDQ0MDNiOWY1YzA2ZTQ4MzA0ZWEwZjliNDkxOWQyYTk2ZDQ2ODRkODJjNzVmMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFByaWNlUXVhbnRpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRmZTEyY2I5ZDRmZjllY2I5OTQ3NDZmMTBlMzk0YzgxZmQ3NjcxMjdjYmNhZjBlYmEyZTYwNGYxMDVkYzcxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2VTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYmMxZmZjOGQyMTQwMjhjMWY3ZWNmM2I3YTRjNmM5YTUyOWRjZjMzNWUwOGE0ZjYwYTY3N2VkMWZhNGRjOGEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmljZVNvdXJjZURpc3J1cHRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OThmMDM1ZTBhODkwMTA3Y2FhZDRiMTNhYTcyMmMxOTJkMmFlYmVhZWM4MjhhYjg3MDM0N2VlZDAwYTBiNTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmljZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1MmNlYTFhZWVjMGZlOTljZjE4ZDAxOTkxNWNlYzgzNTc2ZjFmZWRmZmUxZmE5YzUxOWNkMDE2MTMxMzA2NTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFF1b3RhdGlvblJhdGVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2MDliYmNjNTMwMzI4OWYyNTU1ZjAwMTI3MWZhOTEyYjg5YzBhZTZlMDdiODRiZTBmYTQ3YmNkZTM0ZmFjZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFF1b3RhdGlvblNpZGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyODI2YTlkZmJlNmFiN2VkZjJjZGE3MDA1OWYwNjEyZjMzM2JlNTI2YzkyYTIzYTI2NGZiN2ViZjAxNjljMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFF1b3RhdGlvblN0eWxlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImUzMTM2MDQyMDg1YTkyMjhmNDZkMTEyMDc2ZDJiN2Q2ZTE5MzFjZmVlMzFjZGQ4MWZhMzVmNGViZDU3MzcxOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFF1b3RlQmFzaXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOThiMjg0Y2E3NjE2NzI4NGNjMmExMmM1ZGI5YmZkN2RiZTZjODRhMzJlMjE4YjhjZGI4MjAxMTQ5NWRlMTMyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UXVvdGVkQ3VycmVuY3lQYWlyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzMzQzMTc0MzljYmFjMjlkM2ZkMTlkNDhjMGQxYTEyNWNmYzRlNzljYTJjZDA0YWRkMzE2ZjQ1NWRmNzAxZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFJhdGVPYnNlcnZhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjM5YWFhYjdmMWFiYmY0ZTRhODgzNjRhMWNmMWVlN2Y4NmMzMjc5ZDkzYTU3MjMyYTMwNjA4NTRhYTE4NTYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRSZWZlcmVuY2VTd2FwQ3VydmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzRmZTljNDUyMDIzMjEwNDdjYjhkODNlYzlkMGZkNTZmMWY3OTE2OGQ4ODE1ZjFkNmYzZDM5Njk2NmMwYmIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRTZXR0bGVtZW50UmF0ZU9wdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlOGFmOTE3NzgzYmE4NzljNzY4YWM3NThkN2I0MjJiOWU5M2RiZDgyYzk3Mjk4NzdmZWMxOTRmM2UyOTUyYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFNldHRsZW1lbnRSYXRlT3B0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1Mjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2RhNTQyY2YxOTZlMjE5ODYwYWYyZWQzODE4MDQ3MDU4ZDZlOWE4MWE2NTQ3NWJkYzJhODM0MTEyYTIxMzg3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0U2luZ2xlVmFsdWF0aW9uRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmNzgwY2I2MjlhOTVmZjdhZGIxNjM1ZTE3MzhlYmU5ZGViNWQwODE5ZjA5YjZmZGIxZDA1MzE5MTJkM2MyOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFN3YXBDdXJ2ZVZhbHVhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzOGMzMjQ5YzA2MTYxNzI4ZjRjODRkYjVhNjI1MTI3MDgyYzQ2YjI5NjE5OWM2YmY1ZTViMjhmNGFiNDZkN2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFRyYW5zYWN0ZWRQcmljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWEwMDE3ODc0MmNmNDA2ZWY3ZDA4ZWIyNWZhMzc2OTZlMzIzNzE1MjFhZjQ5NmMyMDkzMjMwODdjYTA5M2UxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRWYWx1YXRpb25EYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5OGNmYWEyMjhlNDI1ZmY4Y2U2NWQ0N2UyZmI5ZGI3ODgzNWZhZTY2NWJkZDdlNGY2YTVlMmI3ZTVlZmQxMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFZhbHVhdGlvbk1ldGhvZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzBjZWRlYjIzYmFkZDgzNzUxNDQ5ZTdhMDc5NzAwNTI5NTk0ODUxMDQ1MTU3YWIxN2FlOWEwZGFiODMzMzg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRWYWx1YXRpb25NZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzNGZjMDZhZjdlYWM0M2FhM2U1NjZhMTliNDhjZmNlZmI2OWM5OTQzNjIwODY5YzA0YjIwNWY2OGIzODIxYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFZhbHVhdGlvblBvc3Rwb25lbWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0ZjA3NTEyNTQyYjRmNmE3NjRiYmE3YjdjODA2ZmZlODJkODA3MjI0YThiNjlmMzA0OWFjMjg2YThlYzdlNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFZhbHVhdGlvblNvdXJjZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjkxMGYzYjY0NjEwN2M4NDVlNTA0ZGRhZDg2YzYxOGFkZDQ2MWRmMGRkYmY0OTQ2NTFkMDA3MjhmYWIyMTUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUNhbGN1bGF0ZWRSYXRlRGV0YWlscy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2VlZGNiMmZkNDQ5NjU3MDgzMTU1ZTI4NmY2ODlhMzJmYjY1OWUyZjVmMjRiOGIxZmNkNzg0MWFiMDA0Y2YwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUNhbGN1bGF0ZWRSYXRlT2JzZXJ2YXRpb25EYXRlc0FuZFdlaWdodHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZDIxNjQwNzcxOGRiY2JlNzExNDY0NDE5MTViYjNmYTI5MjljOWMzNWVjNWMzYjUwYWVmY2RhMTY0ZDAxZDRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUNhbGN1bGF0ZWRSYXRlT2JzZXJ2YXRpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhMmEyNWU5YWVlZTczMGEzZjgzMWQxNjViZDE0NDE4ZTEyOGUyZDY5MjhlMGYzNThmMDlmMjU3ZDY3OWU0OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGNhbGN1bGF0ZWRyYXRlQ2FsY3VsYXRpb25NZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDIwMWVlY2RmZWZlZGVhN2NjNjQzZjcwM2YxZjFjNWYyZDcxOGJhZTFiM2MyNTNhNDU4ZWMyNTUwYzU1MzBmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVDYWxjdWxhdGlvblNoaWZ0TWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2ZDhlOGE5ZWVlYmNlMThmNDZiYzRhMDViNWM3NTVhZGEzMmI0MTdkZGFkYjUzMTYxN2U1YjQyMzM5ZWFkNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGNhbGN1bGF0ZWRyYXRlRmFsbGJhY2tSYXRlUGFyYW1ldGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZGFmNmQ4MWVmOWZkYjFlYTA0NmE1ZmM5Y2ZjNzQ3MWZhNzAzYWE2N2RkNjljMzYxNDVmYmEzYzI0NGZlOWQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUZsb2F0aW5nUmF0ZUNhbGN1bGF0aW9uUGFyYW1ldGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YTIxZmFlMTY1MDI1NmIxNDhiOTY5YTljYjE3ZDc5Zjc0N2EwNGJmN2M2MTQ4NTdiMWJkNzZhZWY0MjY5NjYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUluZmxhdGlvbkNhbGN1bGF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExOTcyMGU4N2NkNDc5YWI1NzcwODY3MzU5NWQxYTgwNTJlMTk5ZWM5MWNjMDI1Y2VhMWFlNGM2MmY0NGY5OWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGNhbGN1bGF0ZWRyYXRlSW5mbGF0aW9uQ2FsY3VsYXRpb25TdHlsZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTQ5OTVjY2NkMjg4YTgyNDRmMTg5ZjdjNWQ3NzcyNjVjYzRlNTQxMGM1NjdiNWYyN2EwZjc0MDlmYzFkMzU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZU9ic2VydmF0aW9uUGFyYW1ldGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxN2M4Y2U5MzE0YzE1YTAzMjhiOTU1OWJhMzY2OTc5Y2QxODJkZDM0OTZhOGU4OTA4ZjE0ZWIwNjZlYmI2MjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGNhbGN1bGF0ZWRyYXRlT2JzZXJ2YXRpb25QZXJpb2REYXRlc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMjEyMDRmNTg5NjJiMWI3ODNmNzg4ZDlmYzIyMmNkMWQ4YTQyMGJjODU2YzYzYjE4ODU1NzRhMGY0NmE1Yzc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZU9ic2VydmF0aW9uU2hpZnRDYWxjdWxhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjNTMxNGY0OTFjNzJiYzRhZDRjNmE1ZmEyNDI1NzA5YWFlN2VlZTMwMzE0MTJhMmQ1NDhhMWFjYzkwZGI1NWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGNhbGN1bGF0ZWRyYXRlT2Zmc2V0Q2FsY3VsYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ODU3Yjk3NzhiMjhkN2U2ZGM4NTc1ZTQ0YjBjNThhN2FiYTFhMzNlOWQ3ZjNiMjQyMzViZGRiNzY2MDM4MzE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRmcm9GbG9hdGluZ1JhdGVJbmRleENhbGN1bGF0aW9uRGVmYXVsdHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDVkY2IyODgyYTQ1Y2QwMzBiZWI4YTJlNjQzN2MzOWRhNTJjNDZhMGFjNTIzM2IyYzllOTc1MzMxZDU2OTY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRmcm9GbG9hdGluZ1JhdGVJbmRleENhbGN1bGF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3MWUyMTQxZGZhZWIzYTI4M2MwZTkyMzU4YjVhNWVmYjNiODU2YTFiNjkwNmUzY2E1ZDA1M2JjM2Q1ZjRmMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGZyb0Zsb2F0aW5nUmF0ZUluZGV4Q2F0ZWdvcnlFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGNhYzMyNGRlOTVmNjhmODAyMTU4ZDkyZTE4NDk1N2Q4YmIxOTE1MTBmYjI5YzY0MjRhMjE3NWMyNzAyNTE0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0ZnJvRmxvYXRpbmdSYXRlSW5kZXhEZWZpbml0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjg3YzQxMjAxMTRmNjAxZDBiYjliM2JiMDZkYjU3ZWI2MzcwNDdhZDMzMzQ2YmRhNzgzZGUxZmFjMGIyOGY5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0ZnJvRmxvYXRpbmdSYXRlSW5kZXhJZGVudGlmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM2OTQ0NzlmZGM4Mjc4Yzg4NjdjZDZlYjQzYTk5MTQzNDIyNWIzOWFmMjg5ZGU4NjExYjBlYzBlZTJlNzY3MTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGZyb0Zsb2F0aW5nUmF0ZUluZGV4U3R5bGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmYWY0YjQ0ZmFjMjhjMWE4MTgzOTM3ZmQyNDUwN2JhM2Y3YmEwZmJiOTMyMTVkMDYwMDZiOGE3MTk1NDczZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUJhc2tldENvbnN0aXR1ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYThhNDMyZjc5MGM1YWUxM2IzMmI5YTBjNTBlYjc3NjNkMmRjMDIxNDlkZWY5NTM3ZjhkNWRmODEyNzhkNzdkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhSW50ZXJlc3RSYXRlSW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZmM2NDgzMTU1N2VkYzI4OWY0MTZiYzgyNWRmMDRhY2EwZjlkNjY2NmY3Njc1NTQ0YjE2YTc2OTdkYWU2ZGE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFNb25leS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzNTdhMjA0OGY3MDZkODMzOGNmNzNhNTk4YThlYThmYzViNzg3N2U0Y2Y2OGMxYjZjZDQ3NTRiMDc3MzE4ZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU9ic2VydmFibGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDlkNGU4MDQ1Mzg4ZWFjNjI0OGU1ZDlhNTIwNTk2YjcxNTg4ZTY0YzE4YjIzMWM2NGQ3OTI5NDEzZjJhMjc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQZXJmb3JtYW5jZVZhbHVhdGlvbkRhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFlNjI0Njk5NmU5MDhkOTE2NDk0NTM5YjA1YTQzOTg5Yjc0ZDE3MDhlZjYxZGNlNWM0ZmU2NTJiZWY4MDgyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUHJpY2VTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyNDFiYzcwM2YzMjAxNGMwYmY4OTE5YjkyNDQ1Yzc0Yzc5ZjhlYzJiMGQwMDNiNTg5ZTliNjJjMTFkM2M0MzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVF1b3RlZEN1cnJlbmN5UGFpci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlYmI5MTQ4Y2UyODU3NmZhYzIyZmI0ZTQ3MTYxMTgwYzU5ZjBjNDZlZWZjMDdmZmJlZGFhNTJmOWFkM2YyNzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVJhdGVPYnNlcnZhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjYjQ3YTFiZDEzOWRmMjY1ZDExNDYwNGI1OTcwMGViYjRjNDY3NjI5ODc5NzQ2YjY3OWY5MTk5NGY2ZDkwZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVjb21tb25EZXRlcm1pbmF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YjAxMGExYzdlOTIyNzI2YjlkNGJkZTAzY2RhMGFiNDM0MjU4ZGQ0ZDVlZDk2OWU3NTdhY2UwZTAxMGQ2ZjkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlY29tbW9uVGltZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwZTA5ZGE2Yzc4OTFjYTZhODAwY2Q1ZDY5YWZlNzU1MjIyNTVlYWJmZjEzYjZlOTM1ZTQxMDI4NGMzYzJhOWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudENyZWRpdEV2ZW50Tm90aWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlYzk0NDJmYWMzYWFhZDg1NjAzZWVmYzRkNTEyYzE3Njg1NzAwYTI2OWY4YTZhMTEwY2VlMzUwN2I1NDRjMzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudENyZWRpdEV2ZW50cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjkwNDkyNTRiMmEyYjk2ZDBhNjRlNGE5N2ZmYjUyYTFiNjY1NmU4NDk5MmU1NTI3YmNlNjExMTAyMzcyN2NlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnREZXRlcm1pbmF0aW9uTWV0aG9kb2xvZ3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NGQwODQ4YWE4NjQwZTY3ZjhjMDNmYTg2MDFlYTkyODVjNzFlYTk1NGRlNjkyNGNkZTY1OGVlOWJiYzI2NWFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRGYWlsdXJlVG9QYXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjVhMjU4YmY4MjAwMDUzNGI3YmI0OTkwNmMyYWQ3YWI1OWM1ZmY2N2Y2NzM5ZjdiM2Y2ZGU4Nzg2ODU0OWU1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50RmVhdHVyZVBheW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWM2OGQ2YzBjZjA3M2FkYmI2ZmE0ODZlYWIxYTI0OTIzNTQwNzI0NzdjOWNkYjM5Y2E5YjdkMjFjZWZhOTBhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50RmllbGRXaXRoTWV0YU1hcmtldERpc3J1cHRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjJjMDE3YjVhNWEzNzFhYzhiMDVmZGRjMTU0M2E4MTU3NWJmNzdkMWFiZWYzNGZjNGMzZGEzNGJlNTQ1YmZlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50RmllbGRXaXRoTWV0YVJlc3RydWN0dXJpbmdFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA3ZDNlODBlM2U4ZWQzMWJjMjdhMmEzODIyMWRkYzRjNjQ4OGRhMWEzMWFiNzU0YzBhNDk5ODM5OWU0OGUwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50R3JhY2VQZXJpb2RFeHRlbnNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MGVhYmEzMWNhODM1YTBjYmRkY2E0YmUwYThjZjYwMDNkNWFlZjMzZjFlNDJmYWZmZGY4NzExMTVhMDI4ZDc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRJbmRleEV2ZW50Q29uc2VxdWVuY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVjOTllZjY5ZjcyOWQ0ZTdiYmNjNjExYzY1ZTMyMzNmZDU2MGUwMmNhMGI2ZGVjZTIxZWNlMDI2OTM2ZDM1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50TWFya2V0RGlzcnVwdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NzQ3MmNjY2M5ZjIzYjlhMTIyNTJjYjA1NDVhNGZiYjQwZmQxZDU0ZDc0MWJjYjI5ODRiNmZiMTgyYjcyMjRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRPYnNlcnZhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZGI3ZDI1ZmZhMDUwNjA3OTRlMjUyYjg2ZTk1NjM0YzU2MWEyMmRiOTExZDRmOTg2NzczNjIzMWFiMzk3MzlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRPYnNlcnZhdGlvbklkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGQyNzUxNDU1NmMyZDc0NGVlOGIzM2JlMjc5ZjYyNWM5NzdkNWQ2ODBhZTcwMzdkMjYwYzUyNTFkM2NiZmEzMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50UHVibGljbHlBdmFpbGFibGVJbmZvcm1hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDI4M2IzM2I1MGU3Zjg1MzdlZWIyNDc4MTAwYTJkNWIxOTUzNmRlYmI4ODM4ZGJkNjUwYWIyOGJiOTU1MTM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRSZXN0cnVjdHVyaW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1YTVlMmYwYmE0Njk0ODRkMTliNDI0MjRjOGUzMTNmYzdjMGU5NzkwNTMzZDAwYjZjYjY5MWJkYWYwMmUzMzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudFJlc3RydWN0dXJpbmdFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzk2MGM2NjNmNGMzZjI5NDQzNjc5M2ExMWY0NWVmNjQ3ODdhN2ZiYjlhOWE3MjAxNzdjYTc1NDk1ZGY5OWRkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50U2hhcmVFeHRyYW9yZGluYXJ5RXZlbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlZDE1NDg1NzliMjNmY2Q2ZjZkZDBmNzIyYjQzZmJkMjdmZmRkNjk5MDQ4MGQyNjNhM2VhMWFkY2QyMTk4MDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudFRyaWdnZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTYyNjY1MTZjOWVjYWYxYzdlODI5OWQ3N2YxMzNhYjZkNTcyOTA5M2JjZDIzZjQ4MTcyOGViNmYzYWVlMjg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRUcmlnZ2VyRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDc3MmExMmNkYzM1OGI0OThmMWEyMTBhODNhZGZlOTA2N2JhMmU4ZTY3NjA1ZDcyZjZhMmM0MmQ0ZmJmZjkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRUcmlnZ2VyVGltZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjJmNTBhMjUzMGY4N2MwOGE1OGM0MWU2NjU1NDA2MDgwMTEzMmM2ZmQ1Zjc4NDkwOThlZGUyZDhhNmFhNThjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50VHJpZ2dlclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwM2E3N2JmZTMyNzI4OWY0MjdhY2MyOGNhN2QyZmJhOGU0N2JiM2FhYmE2ZmZiZDRjYmE3Mzc1NDdkYTIwMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNyZWRpdEV2ZW50cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1MGEzMTBiODNiMmZhNTI0NTEyOThjZDMyZjUzNmQ4YmQ0NWJlYmI5MzJlMjgyMzBjZDA4YzY0OGQyYmEwNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU9ic2VydmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjk2MTlhNmE5NzcxZmE3ODYxNzk1MmM0NGEyZmMyODkzNzBkMDBhNGI4MDNkYzkyMjFmZjc4NWE5Zjk3MmY4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0QWRkaXRpb25hbEZpeGVkUGF5bWVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYThmODg4Mjc0MWY5NDg3OTBmMzkwOTY0MjYwMTM1MDhhNzQxYzc3NmI1MWZmYmJmODA5MjVjZTkyZDI2MGMyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0QXNzZXREZWxpdmVyeUluZm9ybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWVkNmE1MmQwNDljNTQxMmQwOTA5M2QyODU2Njc3Zjk5ZDAzMzJlYTYxODg1MTEzZDk3MmMzYWFhOTBjNzUxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0QXNzZXREZWxpdmVyeVBlcmlvZHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYTNjZmVlNGJlMjdhN2NmZjczNTNlOTg2NWE4NjRlZTU1M2E3NTJkZjUwM2IzMTIxOWExYjM1MDk2ZjJiNTZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRBc3NldERlbGl2ZXJ5UHJvZmlsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5NDAzZjFmZDExZDMwYjgyODJjMmM3YzgzZmQ3MWU1Nzc1MDBiM2YzYjNkNzYzYWUyYWQ0ZDBiNGE0NzU1M2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEFzc2V0RGVsaXZlcnlQcm9maWxlQmxvY2suanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQ1MzNjNjhlYjhhM2U5NTRjY2ViMDg5NWE5NmNjZWQ3MGQ3OTcyNWFkZTJjN2Q4M2U0NTgyYWZiMjkyNjMyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0QmFua0hvbGlkYXlUcmVhdG1lbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWU0MWNkNDJmNjA3NmJmYjRmNjlhMzZiMzA2NDA2OGZlYWI2N2YxMmI0YTFjNTRhMTg1OWE4ZjBmNDkyNDU3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0QmFza2V0UmVmZXJlbmNlSW5mb3JtYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTBhMjU0MjdjZTY2MTUyNGMyZmNkOTlhMDg3NzE3NzQ0MzRmMGMyMDVkZDQwZTMwZGFmMTM3YjZmZDdiMWJkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Qm9uZFJlZmVyZW5jZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjFkNTZjZDYyMWYwMTZlODZmMDk0ZDI4NGY4NjAyZTA4MTFhNWQ2M2Y1Zjk3YWFkZTExOTE5ZWY5ZmM4ZjNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRCb3VuZGVkQ29ycmVsYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjczMTQyMmQ1MjMzMDYxOGFhMGZkZGU5NjEyMDQyMjNhNTA0NDhjYjUyMTMyYjRkNDJhMDQ1Njg0YmMyNDQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRCb3VuZGVkVmFyaWFuY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIyZWQ3ZTkyODMxZmJkZWQ3MDE2YzQzOWI2MmIzMGMxY2NkNzc1M2EzNWVjNmI5OGFjNDFlOWRiZGMwMjEzZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Q2FsY3VsYXRpb25TY2hlZHVsZURlbGl2ZXJ5UGVyaW9kcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYjBiNmYzN2I1Njk2YzNkNzUyYjVkNTAzNWJiODA3M2MxNWJlZTczMDZmOGY5N2NkMzFlZDI0ZmEyZDY1MzVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRDYXNoZmxvd1JlcHJlc2VudGF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1Njk3YjM2ZDE2MzU5ZTAxM2IyMDcxNWJlZWE5M2Y4MTkzNTM2NzFhNzE2YmI4ZTAzNDFlZjkwYjg5OWRlYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldENvbW1vZGl0eVBheW91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzNhMzMyNzNhNTA4OTM0OGJmYjg1M2YxZmNhYWQ4ZGQwNjJjZThmOTQxOWNlMzQyYjk4OTM2YjhhZjkxMzg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRDb21wb3VuZGluZ01ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDFlNjhhZTdhNmFkZjIyMjYzMDdjYjRiNWNiYTNhNTIxNmVlNGY1ZTc5MDdmZDMyYmMwOGQwYjBjMmUwZTY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRDb3JyZWxhdGlvblJldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2MjlkZjZiOTIxMjc5NjFlZjFiNzVlZjhmNmZhNGNiOTI3MzQwMDEwNzBmMTliYzgwZWM2NzdjZTY5MDBkNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldENyZWRpdERlZmF1bHRQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTI1Yjg5YTRkZTk4ZDc3NGNkMDIwZGVlNTUyNTY2YTY2MTkyNDc3ZThhZmU3YTg2MTY1OTg4MGMzNjY4MzY0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Q3JlZGl0U2VuaW9yaXR5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTE1YTM0ODg4MDYwMjU5ZjY3OWY0ZDA4YTAxMWJjYTlhYzRmNDk4YmM3MGQyY2UxNjJmZDZlODc5NDU3YTdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREYXlEaXN0cmlidXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjliM2Y1MDBjYzAyMDgwMjJlMTM0ZWFhYjk1YjY4Yzg5ZDMxNzViNTMwMzcxYjMzZTRlZmJlYTQ1OTNmMmE1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGlzY291bnRpbmdNZXRob2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2MTZmMGM5NTA5YjY4YzJjNjIyNDA0YjMyNzllZjc2NTA3MWEwZDYxOTE0OWQ4YjIyOThhNjljNmNjMjczZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGlzY291bnRpbmdUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiYzAxZTNiMmIyZmEyOTNjNjAxZTIxNmEwZDg5MDk5MmU5OTc4MGY0MDRmOGY4NzMyNjE4MzhmM2UyYzcwZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kQW1vdW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNTQ0YzRhNmIyZDExNGI5MzMzYTAzMmZmODVjMTVkZjI3ZGQwYjc4MmJiYjFiNjJkZGE5OTYxY2YzNTdhNDhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZENvbXBvc2l0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhY2RkMWRkMDdhZDI2Y2E5Mjk4Njk3MGYyMTE2ZTQxZTZhMzAyNTY4OTMxOTUyZGVhMzY4NjFiMWJjY2U1YmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kQ3VycmVuY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWM5MDg3ZjdkOGFjYWI2YTg0ODAxOTU4ZTY0NDcxZjBmYjgyMWZkYmU1YThhMTU5NmMyMDVlYTc2OTg0YjUxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGl2aWRlbmREYXRlUmVmZXJlbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRhZWIyODFlODViYjJjODVhNmQyOWMyZDFmOGFmNDAzZWQ3MDJhYzFjMjE1ODIwMWFhOTE2OGQ3NGE4MjQ2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGl2aWRlbmREYXRlUmVmZXJlbmNlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YjZmZmMzOGE4ODA0NDIwZmQzZjIwYjAwZjZkMDI2ZTgyN2I2NjczMmE5ODM0Njc2YzE1MjFkNTRmMmEyZTIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZEVudGl0bGVtZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5MTZlZDA5OTZjZjJiZjM3NGEzMjhiNWVlN2RiMTg5OTcxN2Y4MTQ4YWY4ZjdjZWY1ODcwNzBjNWIzYzlmNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kUGF5bWVudERhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTE5YTdiOWUyM2ZiNTczMTk0ODZmM2M1ZTNhMDJkNzIyODQzZGE5MWRmNTZmYWI1YjVhODFmZDZjOWIwZGQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZFBheW91dFJhdGlvLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlNGM3MzhhZDQ5MjQ5YzRmN2Y2MjE3M2RhMTVmYjU1ZmZiYjE1M2U4ZTdlYTI5OGU1ZDhiMDhiZGE4MGRlZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kUGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmMjhlZWE5OTYxMDQzMmJmNGNmNTFiYzk0YTA1OWNmNTM5NDYyMzFjMmY3YmIxMmY0NTQ3Y2UwYjNiOTE1NjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kUGVyaW9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlMzdkM2YzYWU4YTliZTc1OGE4YzA4ODBhMTZlNTIzZjQ5NjZhODE1OGUyNzM5Yzg5YjdiNWYzZDA2ZTM4YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kUmV0dXJuVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI5MGNiYTEwNzRhYTRiM2YyMzE1ZTA2MDFhMWVmM2QxNWU5NGY0NjFhMjA3ZDI4YTEyNWVmNDZmOGZlNWQ0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RXF1aXR5VW5kZXJsaWVyUHJvdmlzaW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDZhZWIwY2E1NzRmMjNkYTY4OGM5MTNjNTlhMjlhZWVhYTdjZWQxNTQ2YWIyYmRiYTllYTlhMTQzODlmZDljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGUFZGaW5hbFByaWNlRWxlY3Rpb25GYWxsYmFja0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzNlMmM0ODRjYmZjZGYyMTM2ZDQwMGY4ZjI3YWNjNzM5YmJmZTZjMjc4NjZjOTAyYjA2MWNkNGNkYjI2OTgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGaWVsZFdpdGhNZXRhSW5kZXhBbm5leFNvdXJjZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDdlOTc0OWU1MGQ4MWIxZjVlMmI3OGQwMzdlNDc5ZDExMmIwMzQ3ZjRkN2RiMGRmMzQxMGY4NTQwYWJiNzQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGaWVsZFdpdGhNZXRhU2V0dGxlZEVudGl0eU1hdHJpeFNvdXJjZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTI3ODc1YmUyZjViNWJiMmZiMzczZDFkYmQwOGRhM2RiOGM1MGEyNTI4Zjc0MjMwZDA3NTRhYWY4MWY0YmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGaWVsZFdpdGhNZXRhU3ByZWFkU2NoZWR1bGVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3NTBmYjg5OTAxYmY0NmIzNTQ4MThiZjQ0MzdkZTEzNzEzMDBhMTUzYTI1YjgwNDM0YzdhMzE4NTdiMTRlMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEZpbmFsUHJpbmNpcGFsRXhjaGFuZ2VDYWxjdWxhdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjODBmODY0ZmRjYWNiMzNjMzdlZjI4NmRiZmFhNGM4MTRlMGE0M2Q0MjJhZDU4Y2U1YWEwN2YxODEzNzMxMDA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGaXhlZEFtb3VudENhbGN1bGF0aW9uRGV0YWlscy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YjM1MGE2MjEyMjkzNmNlMDQzZTQzYjYwODhhNGI3NjkxYzNmMjQ0YjJmYzExNjYzMWFmMzEwMjVkMjNjZmNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGaXhlZFJhdGVTcGVjaWZpY2F0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYThjMjcwNTMyMGUwMDc1ZmJkYTk5OTI5OTNmN2M3ZGJiNWJlMDZlZjc4MGYyMDMxMTY0MDYwYWZmMDFiMzUyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmxvYXRpbmdBbW91bnRFdmVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGNhZWZiNTJmMDExNTI4MTI1NWRlNTc5YTUxNmQzZWMzZmQ1ZjM5NDhkOTA3MDgzY2JiM2FlOWFlZDUwMmNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmxvYXRpbmdBbW91bnRQcm92aXNpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlZDExNWMwMTcyZmVhODgxYjZhMGZmNzIxY2NjMTk2ZTU3NzAzZjVjMDhhYzU3OTdlMGRiN2QyODM2ZTE1NzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEZsb2F0aW5nUmF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYjM2YWYzN2QyYWI3MDAzMWRhZmQ2OTRjYzk0MTdjMmY0NWE4NDc5MTA1MzQ0YzA0NDM2ZTY5ZDFhOTk0MGZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGbG9hdGluZ1JhdGVCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjMzRkMzgwOGVmNjM5ZmRhZDYwZTlkMTI4NGY3YzJiYmQ5OTlmMTI5MTlmMGM1Y2U1ODhmNTIxNWYyMTM1MDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEZsb2F0aW5nUmF0ZURlZmluaXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWI1YjYzNmUzYjQxMDlkOTE2MThmMTJlNGM1ODFhMzY3ZDUwODQ3ZTg0OGNkNWEzNThjYjM0ZTA0OTQ5ZjE4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmxvYXRpbmdSYXRlU3BlY2lmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDRiNDA2MzA5NmFkODY1ZjY0NTRjNTYxOWIwMGQyZmI3ZWQzODdiMzBjMGYxZTRkOWYwM2E0ZGEyOTMyOTQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGb3JlaWduRXhjaGFuZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYWIxYjBjNGQ2MDlkZGI2NDZiOTgxMjI2NGYxODZiYzY2NWIxMDI4MTU3YzdhODY2ZmY1OWEzZGJjNDg0OGViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGdXR1cmVWYWx1ZUFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMmZjNjliNGMxNDBmNWZhNjU3NjVjNWFkY2RjMmM2Yjg3ZmRiMjRmNDczOWMyZWQ4N2ZjOTY4ZDExNzI3MTkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRHZW5lcmFsVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTM5NmU0MTA3MWVlYzVjNTUzMzM1MDNiODFiM2QxMTc0ZmUyYTIxY2NiMGJhZTUyY2IyOTNlZmYzMzRkNDIyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0SW5kZXhBbm5leFNvdXJjZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZGE1MWU5MmQwMjg5MmU1MzkxMDMwYTlmNTc0YmFhYjI4Y2U1OTg0ZGQwMTdjYjNjOTExYjE5ZjdmOGIwNDk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRJbmZsYXRpb25SYXRlU3BlY2lmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDNhZGNjODgwNGI5NmRkNjdiMmNhYmJjYWRkOTZjMTEzZjY0NmJlMzJiOTliOTY2ZTExYTk5YTIyY2U2NzU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRJbnRlcmVzdFJhdGVQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTBmMzhlNWZhYWM1OGM4MTJlZmQ5NDQzNWI5YzA0MzU5MzQ3YmFjNDYwYmIzZTE1ODIxMzY2NmM3MTYyNmU4MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0SW50ZXJlc3RTaG9ydEZhbGwuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMmY5NjJhMTRmOWRiZGUzNjgyMjEwYTdhYTc1YmY5YzgzYzM2Nzg3YjIxZDFlZTMyMDJkYzVhNWZjZDhiOGY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRJbnRlcmVzdFNob3J0ZmFsbENhcEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWM1YjQxMDhkM2NhZDhmNjgxNGI1MWM3MzdhZDkxMDRiMTVlMTUyNmY3MTkzN2Q5YmRlOGE2YWFkYzk1NTM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRMb2FkVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWFiNjU5NmYxOWJhODFhZjdlNDY5N2QyZjUyNzQ0ZTUyMTNmODdlOWUwMTY5Zjk5Yjg5ZTFjYzUxYTJlODk3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0TmVnYXRpdmVJbnRlcmVzdFJhdGVUcmVhdG1lbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2IyMzAxYTJhMjI2Y2YzMDRjOGMzOGEwNTZjZWI4ZDc1MzNiZmI0NTkzZDU1YzNlODdmYjQ0YmMzMzRiMGIyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Tm9uQ2FzaERpdmlkZW5kVHJlYXRtZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImRkNDlhYjQwNzQ3MTY4NGI1MTY3ZmZhYjU2MjAyNTI2ZGY4NjJmNzkxMmQ4NTE0MGFiNGQ1NGQxNzAyNWQ2MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFByaWNlUmV0dXJuVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDNiMjZjZjRkYjVlMTA5YTY3ZjRiNjJmNjhlNzIxZjExNjkyZGU4Yzg3NmEzZjRhYjViNTUyZTBmNGE3YmNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRQcm90ZWN0aW9uVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDMzZDlkNjM4YmMxOWU3YmJmZmE4YzRlNDZmYTZiODJmMWRjNGY5ODQ3ZWE5NWE2OWE1OTk1YzNkYjAyMTFmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmF0ZVNwZWNpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmRiOGU1YmY3YmE0NjY4ODYyYTM0MGVkMDkwODI5ZDRhMGY0NjEzNGE5ZWE0ZGM1ZmI2OGUxMTM0ZGI0OTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSYXRlVHJlYXRtZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjMDdkMDljYjBmMjllZjMyZWQ1YzVlYWFiMDU3ZDkyZDE3OTI3ODMyYTkxYzdhYWJkMTU5Nzc3YWY0NTRlNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFJlYWxpc2VkVmFyaWFuY2VNZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTE5NGIxYmJkMjgwNjExMTExODU5YThhMDQ1N2IyN2Y2NGRiODc1NWM4NjlkNWNjZGY4ZGM1MjIzMDg5MjM1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmVmZXJlbmNlSW5mb3JtYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQ0YWEzMDhmNjE3ZWJjY2YxNjVkN2VmNDg5NjMwMGI4NmFkYmUwODk3ZmU4NTM4Mjg4NTI4NGI1YzExMTNjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmVmZXJlbmNlT2JsaWdhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNjFmMDhmNTY5MGU3NThkZmE3MjVlZThlZWMwOWE5OGFlOGFlMGU2NmYwZjA4OWE0MTBmNzcyZjc4ODk5ZmY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSZWZlcmVuY2VQYWlyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhYzEzOGM0NGE5OTI1ZTEzMDAzMzFlMjdmYzFkZDdlMDQyNWZkNDU0YTVhN2U1N2E0MmVlNTgzOWMyZDZjNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFJlZmVyZW5jZVBvb2wuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjM2NjYTVjN2RhNTVhOTdlZTU5Njk2ZGM3MjYzMzk0ZmMxMzJjMmU5YjhjNGU5MDcxM2RiNDFjNDYxZTRiYWZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSZWZlcmVuY2VQb29sSXRlbS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTFlODk2ZWJjZTZkOTdlZmNmMTE4YjIzZWUyMzBmZjBkNTMwODVkMTFkMjg0YzQyYjYwNTI3MzAxN2ZmZTE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSZXR1cm5UZXJtc0Jhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTUwZGY2OGI3NjMwMGViOTBiZmViOWNjNWRmOWZlMGE1YzA3ZDI2OTVkMzZjMTNmNzMyNTVkNzJjYzI2YmQ1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmV0dXJuVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDQ2Y2MxMTE5N2EwZTRiNTBmMTBiNmU4YWE5YjAwZTc2MzMzZTRhYTQ3M2FkZGY1MWNjZWQwYmFlNTI1NTM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSb2xsU291cmNlQ2FsZW5kYXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5NzMxNTZlMjIyMzc5MDk0MDIyZjdlZWFhOWM3NjJhMTY2NmI5MjU4MDk5OTdiOTAwZGZmMGMwNGRkNmI4NGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFNldHRsZWRFbnRpdHlNYXRyaXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTY0ZDkwNTJkZjFmZDVhOWU0ZTkwN2QwNWZmOGFkODk1NjhiMjJlMjlkNjI0NDE1MTMzZTE2N2UyOGMxMzEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRTZXR0bGVkRW50aXR5TWF0cml4U291cmNlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiNTkxNGI1NTBlNTY1MDdlMWM1MGQxOWY1MTQ1NzJlMTViZDY2NDBjNDVkZjJlMzgyMzNmOGZlYWYxYmU1YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFNwcmVhZENhbGN1bGF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0NGRlN2UwZTFjYWVmN2UxZDMzYzBjMjkyOTBiMjdhOTcxNmIyMGQ4MWJjMGQ0NzAxZGJkODVmZDg2NTA4M2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFNwcmVhZFNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTgyOTlkYmNmNmMyYWYwYzE0YjllOGVkOTg3MGI0ZmRhMGQ3MGQwYTM0YjdhNzNjY2JjMTRmYzZmNGQ5NzZiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0U3ByZWFkU2NoZWR1bGVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2MWM3MmRjYWI4YjRkMTQ0NTI3NWMyNzA5NDhhMjFiZGQ3YmZlNGJhOTU4MjlmNjQxMDkzOTc0OTg1NjUyYzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFN0dWJGbG9hdGluZ1JhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzYzNTY2YTU3YzU1OGMwMzgwMmU1YTY4ZTBiMGRiYTkzZTU4YzVkZDIwZWVkY2UxZTZhMzFkZGIwMjRjNTQ5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0U3R1YlZhbHVlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkZjhmNjg1NDg4MzUwNDljMWRhZDk2NTg4YTk5YjI1MWViMGVkNmJkN2ZkNDBmNjcxZjE0OWZjOGUwMTI0MjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFRyYW5jaGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGVkOGM5MTcxNmYyNTVmMzEwN2MzNmY5MzIzMmVmODQzN2U2ZDQ5NWIwZDE1YzRkNzZhNmI5Y2ExNjQxYThjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0VmFsdWF0aW9uVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjdlNjE2ZTNmMzUyZjgzNjBhN2E1MjI3ZjFkZWQwZDEwMWMxNzZhZjNkMTc2YjNlZGI5MWVmMDJjNTlhZDg0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0VmFyaWFuY2VDYXBGbG9vci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTZiMWQyNGU3NjlhYzc4ZGQ3NDNmM2RlMTZhMDc4OTkwNjg4M2YxMjg4YzFlMGI5NzE3MGNiZTZhNzQzYmUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRWYXJpYW5jZVJldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmZDY4ZDFmY2E5YjVjOTIxYWIxMDhkOTg4MmVmYWIzMzM4OWNhZmQwZGI0ODFlYWQwYTI3NmVkZjY4NThmYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFZvbGF0aWxpdHlDYXBGbG9vci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDY2MDQ3NzJhYTJhNTJkY2JlNDc0MWYyMTcwOTQ0MzNjM2Q1NGZmYjkxZGFiYTgyNzFjZjgzNzEwZWFkYmUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRWb2xhdGlsaXR5UmV0dXJuVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI5OWVlYWU0OTE4OTAwYWVjYjhkMjM4NTE2ODVkMjJiNzBlOTI2OGI3ZjY4ZDFmMjA1MGYyZjkzZTZkNDg2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0ZmxvYXRpbmdyYXRlRmxvYXRpbmdBbW91bnRDYWxjdWxhdGlvbkRldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjdlMTFhNDBiNGY2ZGQ3ZDRkNzQ4Mjc5MWQ4ZDYyNmY3ZGJmZTRkYzljMDczNzdjYmM4NTdmN2FiZWJkZTE4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0ZmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlSW5kZXhQcm9jZXNzaW5nVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjg2MzY5YjJkMWIxOTJjNmY0Y2ZiZmIxZGJlMjAxOTY3OGFjMDExZjg0YzY0NTIwMmM2Nzg2MGQ2M2YwOGM0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0ZmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlUHJvY2Vzc2luZ0RldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTVjZjVhOWYwNWIyNTczY2EzOGNjNDllOTQwMmUzYTIzNTg5M2NlMzIyM2Y0YTVmMWM3M2VhMDVjYTZjNTM1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0ZmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlUHJvY2Vzc2luZ1BhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGM1N2UzZDA3MWVjZjhhYTM2M2YwODZkOTAzNDZlNjMzMzAwMDViNWRkYTliMzUzNDE1ZTU4M2JkNDhlZjg1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0ZmxvYXRpbmdyYXRlRmxvYXRpbmdSYXRlU2V0dGluZ0RldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE0ZmJlY2YxMzFhNTY1ZTQzZmFiYTZiMTZjNjhhYTM2OWViMDFkZWZkZTQxZjRjNThmNmNjZDUxOWM5NDA0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhRml4ZWRSYXRlU3BlY2lmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzNjRjNzlmZWQ4ZTNiODZmMjMwZDg0ZDMzMDQ1NzIyNWQyMjlkODk5Y2JjNzE3OGEyYTkzMzM5MWUwYTgwZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUludGVyZXN0UmF0ZVBheW91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjNmJjN2ZkNGUwOTk0MzcxZjIwYWVhN2MxOWY0Mzg3NzNiMTg2N2U1MTAxNmFlNjk3NzFhZjIzOWQ0MGQ4NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVByb3RlY3Rpb25UZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5NzdjNDdhN2E2OGFkYjExOWZhZjFkNDUxMWE0ZjMwZTEwMzgyYzcyMGY3ZTcxMmY3YTVkN2JiMjM2ZGNiZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQWdlbmN5UmF0aW5nQ3JpdGVyaWEuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTRkNmNhY2Y0ZmUyNTRiMmU5ZmRjYTFlZTQ1MzhiMTIzMGY4MGE4MmQ4N2U2YzJiODdiYmU0YzMxOTY4YjljYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxBbGxDcml0ZXJpYS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiNjZhZGIwMGI0NDEzYTE1OTJhZGE4NWY1OTRlZjQ3ZjczZTVhYmIyYzAwNmRmMzliYTg1NDhmNGE0NDA3ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQWx0ZXJuYXRpdmVUb0ludGVyZXN0QW1vdW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyZGQ0NTdlNWNjMGI5NTYyY2UyMTYyMmEzZmU2YzQ1OWMzOWVjNDVjMzBlOTZiZjYzOWFjNzMzYzNlZjNmMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQW55Q3JpdGVyaWEuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMWYxM2RjYzAyOTFjYmExZDBmZDk3NGQyMjgxNzI3M2M4NTU4YjA1YjJhNjVlYWY1NjQzZjJjZDc5YWI1YzYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEFzc2V0QWdlbmN5UmF0aW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWZmZTk1M2QzNjcyYjVmZjNkZjQwYWQ5YzgwNjQ2MjEzMWVmZDVhZThkZjIyNTljNWI2ZTc3ZTA0MGZjMjNmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxBc3NldENvdW50cnlPZk9yaWdpbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4YWIyNmIyY2Q3MzY4YWVkNTZhOTY2N2E3ZTkyOTcwNDE5YWZmMmUyMzUwODY2YjM0MzkzMmE2ZWM1YWYzYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQXNzZXRNYXR1cml0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1M2Y2Yzk4ZmNlOGJhOTg2NWZhNzMwNGY3YWNlNTRjZWJlNjI4Zjg4NWE1YTZmMGIyNGM0MzJkNjhkMmIyMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQXZlcmFnZVRyYWRpbmdWb2x1bWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjg3MTU3NDJmZGY3OTUwNjVkNTc0Y2IwOWY3ODM5ZmNhZGFhYzNmNjE4MzRiZWJlNDhhNTgxOTViZjI1MDNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEF2ZXJhZ2VUcmFkaW5nVm9sdW1lTWV0aG9kb2xvZ3lFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgzZWZiNzc1MmJhNDUwMGQ1NDg2OTE5NTM2MTdkOWRkN2ExMWM2MWNjOTgzZTI0OWU0M2Y3YjE5ZDA1Mzg4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDaGVja0VsaWdpYmlsaXR5UmVzdWx0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYjBiNDA5OGY1ZDViZjNiZWJmNzZmYjJkZTg1YmQzMDgyYmNmMWEwMzE1MTc4NTQ4MDY5MGU2NDc2MDk0MzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWVkNmM4MzQ4YjE3NmUxNTgyYjJlOWMzYTRhZDFlODg4YWZmYzMyNjQwZDFkNWQwNTc0OTBiNzMyOTVhMzQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWxBZ3JlZW1lbnRGbG9hdGluZ1JhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzNiZmMwZTZjZTk4ZWUxNzU2YzZhODJjMTgxNWE1N2YwMzNlMjVlNWU4MDUwNzllNWY3ZmU5NTQ4ZWFjOGUzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsQ3JpdGVyaWEuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY0M2U1NTM2YzNkNzk4NTYyZWI2NzQ3MmUwZTZkNGM3ODFlOTZlZGNmOTNiZWUxNzgzNTliZGZhZmM0YTE2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsQ3JpdGVyaWFCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkZDZmMTc2ZWMzMzIzY2Y5YjhlODQ5YWJjMjViYzU4YmFmYjRjZTFhZWJlNjFhMDlhMGRiYTk1MTU0OTg5YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0Q2FsY3VsYXRpb25QYXJhbWV0ZXJzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0MjkyNTMyYzdmODQzNDQ3ZjY2YjhiNGQxYzE5OTYxOGNkNDFjODFlMDg3ZDYxZTcxNGM0ZDc5N2FmNGRmODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0SGFuZGxpbmdFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzY4M2QxYzJlNmU5ZWI4MmI4MTcxOTAwMWZkN2VhYjJkOGQ3NWFlOTk5OTc4NjNiOTAxNzhjNDQ4MWRiYTE5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsSW50ZXJlc3RIYW5kbGluZ1BhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmU3NjViMGE4NTc1NWZjNWNmNGQxMmUwMGU3MTk0Y2I4ZDNkNTVkNjE3NWQ2MmZjMmM5MjU1NTcyMTkwZDM5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsSW50ZXJlc3ROb3RpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTg4ZTM2NWNjZTY2YzZmY2Q1OWM2NTA1ZWU1OWRiYTNmN2ZlMWQ5OTVjNjY4NGVlMDBkODUyYjI0YjUyNGY2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsSW50ZXJlc3RQYXJhbWV0ZXJzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY1ZDhlNmVmYWZjZjhhY2M0Y2ViOGQwNjRkYWExZjhlODcxZWQzZTQ4MDg4MTQzOTE3ODBkNGQ1MDMyNmYwY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbE1hcmdpblR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTQxZjVkNGM4ZmQyMGY2MjZhYjFiNTdlYmRjZGM0NmJhNzlhMmE3NmEzYzcxY2EyMmE2N2RhZmVmNDNhYjAwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsUHJvdmlzaW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhYjc1MTNlNTRkY2NhZjU3ODQ0MTBiM2E3ZDA4NTdkZGU1NWI1Y2Y1NmEwOGYyNDdlMTBjYWZlOGNiMmU2NTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbFRyZWF0bWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1ZTFhZjM2YTRhOTEzZDFkNzg1YTFlYzRhZDRlMjFjNTFhMDY4MzdmNjY1NmFiZGFmOTJlODQ2MDE3N2ZjYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNhODA5YTFhNGIzZWM2OWQzNTJkNDE2YTM3YzBjNDIwMWRlYTA5YTJiNGU5ODcxMTg4NWJjMWU0NWVmOTBjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsVmFsdWF0aW9uVHJlYXRtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk3ZDljNTFkNTNmNmZhOWYxZjk0OGUzNjlmOTA0MTQ1NjI5NDdiOTE4NDNmZThlOWFjNTAyM2IzYjc2OTBjZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29uY2VudHJhdGlvbkxpbWl0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWEzNDQ0NDJlYzk2NTM5YjNiZjFiYjAzZDBmZGM1MzIxYjExNjM0NjdjMjU0NjlkYzBjMzE1ODBjNDY0YzcwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb25jZW50cmF0aW9uTGltaXRDcml0ZXJpYS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOWI2ZWQ1YjBmZDE2OTY1YTIyNzc4YTJlYjFlMmMyM2NmYjZkZmRkM2VkYjA0ZmJhYmYyZWI2NGQ1MGJlZWRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbmNlbnRyYXRpb25MaW1pdFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5NGJlNzYxN2U0NzlkN2E1ZGJhZmVmZGU2OGM4MjMxY2E0Yzk3NmJmZmM0YTNmYjczMWRhYWUzOTAzMzI2ZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29udGFjdEVsZWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI4MDg1ODNjM2FhNGE2NTkxYzNlYjU5NDFmMzYyZWNkZDYxM2IyYWQxNzNmZWVkZGMwNDVkZTUzNDkyYjcxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb3VudGVycGFydHlPd25Jc3N1ZVBlcm1pdHRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmMzVmNmZjYWVmMjM4NzBlZWQyNzkyYWZmMTI2Yjc4NTlmNzMzNTAxYjA0OWYzNjBhMzQzOWI5MTE1NWE1NGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ3JlZGl0U3VwcG9ydEFncmVlbWVudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjdjMDc5NmNhYTY3YzJiZDRlMmRiYWJlOGRlNmViYzcyNmI0NTlmMzE1NTczMTAxOGJiZjZkMGY1NDQ4ZjAwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxEZWxpdmVyeUFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1MTg3MzcwYjE5NGNhYmMyNzYzOWM1YzM4NzMzZjg0ZTg2MDY0MzdkNWE0NDkyMThmMmY1Y2ZhZWFhNmJkMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsRGVsaXZlcnlBbW91bnRFbGVjdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzc2M2RmOGQ5YWFkOWYzYjA3NzI0MzVmNmE4ZmU0OTg4OWU0YjUwMmU2NjlkODI0MmY4OWQ4NDBjOTUwYTA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbERpc3RyaWJ1dGlvbkFuZEludGVyZXN0UGF5bWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5MTBjODI3MzUxZGY1NTU4OGEyY2ExNmI2ZjM3ZDc0MGNmYTFmNDE4YjZiNzcwZGJlOGI3ZTc1NTJmMThhODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsRG9tZXN0aWNDdXJyZW5jeUlzc3VlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzODUxNzNjOTFmZjZmMDUzYzU4MTgyNjIyZTA1YWYyZjhiMjFmY2ExMmZkM2IzN2VlYmMwZGY0YTI4MTJjNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsRWxpZ2liaWxpdHlRdWVyeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZWMwNzRlNjRjMDI5OGFmOTkyMWZmMjAyZGU1NGYyNzgzOTE0YWY5NzdjZmRkZjg3OGI1YjVhNzkzNTdkYjk0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEVsaWdpYmxlQ29sbGF0ZXJhbENyaXRlcmlhLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiMmY5NDgzOTdmOTY0YjU3OWMzOTg0NzJhNTZmZDU0MGM4MTI4ODdmMjIwYmQyYzg1Yzg5NWExZDNmNWU3OWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsRWxpZ2libGVDb2xsYXRlcmFsU3BlY2lmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYWYwMDM4OWYxZTg1OWZiMDVkYWFjNTcyZjE4MDIyMWQyNzZjMTk4OTNiNTI5YmJmMjAyOGY4NWI2NWJmODYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEVsaWdpYmxlQ29sbGF0ZXJhbFNwZWNpZmljYXRpb25JbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhOWQxNzQxYWU5ZWU2NDZlMzJkMjMzZWQ2NDZlOWUzZDJjZjJlN2RhOTg5NjQxMWU1NTJkODQ4Y2RkYTRmODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsRmllbGRXaXRoTWV0YUNyZWRpdFN1cHBvcnRBZ3JlZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5MzNkOGE0N2ZkMDM0ZWY0NWMxYjVmM2U3ODFiMGEyNGFiYzcyZDUwN2YxYTU3NjVjNTE4NWM5MDFkYmJmMWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsSW5kZXBlbmRlbnRBbW91bnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWYzYjkwNzU3MGUzZDA5MDk1NDE3MWRjNGRkY2YyOWE4ZTM5ODI5YjBjZjQ1ZGUwYjYyYzdlNTRmYzcxMTNiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxJbnRlcmVzdEFtb3VudEFwcGxpY2F0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjE2NDY5MzZlOTQ1ODNiMjcxOTc1ZGMyOGFhYjU1ZjQ0MzFhYTJhY2U3NDVhNDJmNDQ0NWQ2N2FhOTBlMjc0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxJc3N1ZXJBZ2VuY3lSYXRpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzkwMDkxOWVhYzAwZDM3M2Q1NjJjMjUzZmQ3ZjdkNjc0YWM4OGIxOGQ0MTMxMjJiNmJlNzgyZDdiMGRmMDIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbElzc3VlckNvdW50cnlPZk9yaWdpbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlOWY1MWE5Y2VhYzZjZmRlNWIzYmE0ZTgzNjA0MDQxYmU5MGVlODhiNDgyODhmOWNkNjdhOWNhZjg5NjVjMDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsSXNzdWVyTmFtZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzYjg3NTNkMTZiYWYxZDQ0MDU5MzAwM2MxYTY1NzBhOGFkNDE3MzU5MGQ1ZmM1ODliZDM0N2U1NTZlOGQzNmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsTGlzdGluZ0V4Y2hhbmdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTUzMzk5Y2IwM2NkN2U0NTJiNjEwZWRmNmIyZGZjNDQ1ZWViM2M0YTM4NDdlNzBlOTY1MDMwNTJiMDRmYWVlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxMaXN0aW5nU2VjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzM1NTg1OTMyYjgzMGJiNDUzNDhmZWUyNmU1MTAwNDQyYmYzNjY1YzZlYzVjYjhiNzJiNjNlMGJjOGI2ODZjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxOZWdhdGl2ZUNyaXRlcmlhLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjU1YmNkNWQxMzY1ZGRkMTk3NzQyOGU0MDAwNDhjNmEwNDA3ZmM4Njc0MWM1Njk1OThmYTlmNzU2M2JhOTZhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxSYXRpbmdQcmlvcml0eVJlc29sdXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5Yzk1MTA5ZDFlMmI0ZjM1MjBkNmQxMTY0NTU1NjE4NzAxNjg3NDRjYjcwMWUwYzIyZmYyNTcwODFlOGFiMjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsUmV0dXJuQW1vdW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWQwNGE5NWZlMWFkMTQzNDM1YzFmMDQyMGZmYTllNDRmZGNjZTdiOGQ5MTFmNDEzYmFjYjZmNjBmYWM0YTk0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxTb3ZlcmVpZ25BZ2VuY3lSYXRpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjJlYjE4OGI1NWYyMDFhMGFjNWZjZTY3OTQ3NGMwZjU1MTc5MmUxZDY2OWZiMTI2OTg3MzZhNzI5MzYxNGZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbFNwZWNpZmljQXNzZXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M0Zjg2MDE5YjkzNGRiZGVmOGJmNTk3MzgzYTg0Yjg0MzEyOTQyMTAzZDZlZDcwYjQxYTM4YWQ0ZjZmMzU4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxTdWJzdGl0dXRpb25Qcm92aXNpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ0OTJhZGMwMGY1ZTBmN2RlOTA2MTg3YWI3ZTE5NTI4ZTU5MzAzNTQ0NGY4YjZmNDY5OWFkNGI4ODZhYmY0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDb2xsYXRlcmFsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTliMDJjZDNhMGU1MTAxNDYxYzUyZDUyNjUyY2E1Y2FmZDkyZTFjMmQzZDBjMjk2Mjc3ZDJmNmExMDRlZGVhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbk5vdGlvbmFsQWRqdXN0bWVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDRlODdkMWExOTBmYmM3ZThhNGNkYTJlOTliMGIxZmVlYWM5OWRmYjU1ZWViNWUxMzRlOWNhMmU1Mjc0OTI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVBbW91bnRTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NDI0ZjkzODA1NmVlZWZhN2ZkY2YxNDdlYTIwYjQ4ZTFmNDRiNmUwODA3N2M2NWU0MjY0YTI2OWEwODM3Y2VjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVBdmVyYWdpbmdPYnNlcnZhdGlvbkxpc3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYTY0ODczMDA2MzFkYWYxZDhmNjQ4OWE3YzgyODI0NWMxNzdkOTQzZGVlYWM3MjUzZGU4NmVlYzE0YTY5N2MwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVBdmVyYWdpbmdQZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDJiNzEwN2IxYzczOTg4ZjI4NmVhMDZkNGRlZWI1YjVmMmIzMTg4YmY5ZDkyYmE3YTUxZGI4ODUxY2YzMTZhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQ2FsY3VsYXRpb25QZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDNhODg1Yjg2NWQ1ZTMxN2RjZTc0NzY2NTBjODUwODlkNTE4MzQzOTgwNWZiZTI2MDA3MTk2Nzg4Y2IzMjA5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQ2FsY3VsYXRpb25QZXJpb2RCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZkN2EzMzM0NmFhOGY0NDIxNWFkNGJkOTRlNDhmZmQwODQxNGMzOTE0ODJiMjgxNmE2NTkyZDBjYWZjZWEyNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQ2FsY3VsYXRpb25QZXJpb2REYXRhLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjJjMDQ0MDUzMmRmMGNhZjg3YjBhNjZkMGMyMGFjODc3Zjg2MDU2MTVmZjJjYTY1MDBmNjZhMTljN2NhOGU5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQ2FsY3VsYXRpb25QZXJpb2REYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYTMwMjhkM2FmNzVmNTMyZjUxMTMwZmRlN2M0Nzg0MzlmM2EwYzU3M2FlMmI5NTBiNWE3YzU3ODRiNmJiYjIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVEYXRlUmVsYXRpdmVUb0NhbGN1bGF0aW9uUGVyaW9kRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMGUwMmI4NTIyNjc4NTY5NWY2M2VjOTdmYjg3MDI5MzQ5ODQ5NzQyNjRjNzZjMDkxNGExNjM4ZDExNTU2NTBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVEYXRlUmVsYXRpdmVUb1BheW1lbnREYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmZWUwODNlMjRiZWRlOTBiNjZjOTc1YTM0OTAwMzUzOGM0YWM1MmExNTk0ZTVkNjU3NWRiZTg0MTcyNTkwNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZURhdGVSZWxhdGl2ZVRvVmFsdWF0aW9uRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYmQwNWFlN2Y0MzFmMWMyNGRjYmY5NTVjNWEzY2UyZmEwNzQzNzdhYzVkN2Q5Mzc4MTQyZDA4ZTUzZGM0OTA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVGaW5hbENhbGN1bGF0aW9uUGVyaW9kRGF0ZUFkanVzdG1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOGYwMzIzMjg1NDM2YTEzYjcwNGIxMjAyM2FjYzZjOTRlN2NhNTUxODllOGU3Mzk0M2UyMTY2MDM4ZGNhYTc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVGeExpbmtlZE5vdGlvbmFsQW1vdW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzZiZjViZGI4NjgxNzljMjNiMGNmNGEwN2ExMDIwNmE1ZjdhNDgxYzExMWYwMzM0ZDU3NTViNDdiNzNlMzk0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlRnhMaW5rZWROb3Rpb25hbFNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5MTViNmFjYjJkOWJlMDNkM2I0MTVkOGJjMjI5MWUyNTdkNDE2YWNiYzRiZTAzY2EyNmVlNTk1MGRhMDQ5MWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUluaXRpYWxGaXhpbmdEYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmU0MGJlYzU0MjI4MzMxNGNjMWFjOTlmYjUyN2JmYjE5MjU5YzViZjliOGZmMTM5ZjYzYmY1YmYzMjllMTk5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlTGFnLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTJhMTlhMTkxNTAxNTJjZTgxNWM4ZWQyYTQ3MWM5MWViOTk2NmU0Mjg5NjM2ZTczNmIwYmRmMDZiM2EyNzNmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlT2JzZXJ2YXRpb25EYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5MmQ2YzBkNjE0OThjYmQ4ODAwZjJjYmE2YjQyNGMzZjk2MmU3YzVjODNkYThhMTVkYTg0YjQ2Yzc5OGU3NTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZU9ic2VydmF0aW9uRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDkzMTJjNzA4NjYzMmI3YzAxNmNlMDAxNDI2MjcwYzZmMzAyNjQ1Y2NlOTUwNTczOTUzNjU5NTJlZTRhZjRlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlT2JzZXJ2YXRpb25TY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2MzIwMDgyNmM1NDdmMTE1ZTBmZmY3YmVlNmU1NTI4M2JiNDk4NzBkMzExODVkNTUyNTcwZGZjYjJmMjBjNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZU9ic2VydmF0aW9uVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTJhYmJiNWExMTdjZTQyMjYwYWRiMmYyZTQwN2MxZjJhZjllNDQ5ZWEyZGNmY2M2NmZjMDVjM2JhY2ZhY2IxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlUGFyYW1ldHJpY0RhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxZTE2MWFjNDVhN2Q0NDRjMGZjYzI1YjEwOGI2NmUwZGI2NzVjNTE3NDM3NzVkOGMzYjE1MzE0N2I0MmY4MjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVBheVJlbGF0aXZlVG9FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4OGQwMTNiMjZiZGYwZmQ2NTExYzZiMTMxZjgxN2RiZjdiYzU5YzYyZjU1YjNmZTcwODhiZmZiZTk4MzI1MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVBheW1lbnRDYWxjdWxhdGlvblBlcmlvZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZGExZTg0MTkxMzY0Yzk2NzAzMTY2OGVjMzNjNjRiNTZiZDI5NTdiN2RiOTgzNTYyMzQ3ZjVkZmI4YWNjMzdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVQYXltZW50RGF0ZVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQwZTA4NmViZjhmNDg3Mzc4MWM4YTAzMmUyZTBhNzFjNGFmYjI5NjA0Y2RmZTc1MjY3ODBmZWFlOWMzMDE4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlUGF5bWVudERhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhMGU2MjMwZTg2ZTBmOTdjNjMzMjk4ZjMxMWVjOTkwMmViNWYyNzIzNjRkYWU4NDViOGZkMzkzNjQ2YzFiZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVJhdGVTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0YWIyOWI0ZDA3NjQ2ZjQ5OGFmNDk5NzE0OTE1YmZhZTZmOTA2OTJlNGRiODljMDg1YTFmMDA4MjE5MDEyMzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVJlc2V0RGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDFmYzFmODRjZmNiMWMzOTJiZDEzZTdmNjkwYTg1YzkxNWM0NGE1ZDExODJiMGYwOGUwZTQzMDlkMWNkZmU2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlUmVzZXRGcmVxdWVuY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJhNGQyMTEwYjI1Y2QyNjg1NjhiNDNkMGQ5ODdkYzRmMzNhODk5OTA0Yzg0YjEzZTI2YzJmNGNhOWUxZmU0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlUmVzZXRSZWxhdGl2ZVRvRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImExNDkxMDYyMjE4ZDE1YzZhMzA2NTY0OTM3MTQyNDUwNGM1YjBiMGU3ZTc3YTQ2Y2MxMTZkY2E1YzliMWI5NGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVN0dWJDYWxjdWxhdGlvblBlcmlvZEFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYmQ1ZDNkYTViZTk2NjZkYjE4M2U4YjliYmFkMzYwOWUxOWNmNGVmODMyMzEzNDI2YTg2Mzg3NDA1NjNlYzgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVTdHViUGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmZDdjZjUyZDNhNzg0N2I4MzFjZGJlMTgxNThkOWFmYWYzOTAyMGFlZDM1MThjYjNjYWVmNjJiYmM3MGNjYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVN0dWJQZXJpb2RUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmZjhkZTZhNjdjNjVlNzViZDI4OGE5ZDM2MjFkNTFkOTlhYjQ3YzMxZmFjMDkxMzFmMDE4ZTc3ZGExYmM2NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVdlZWtseVJvbGxDb252ZW50aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NWEwNjc3OTQxMzllNGYyNDMwMWFhZTViYjU4MzA1MDlkNDFkNGZlZWFiMzgyZWNhYWY1YWZkNTJhMmI4MjE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVXZWlnaHRlZEF2ZXJhZ2luZ09ic2VydmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzBhYWYyMzc2NjhjZTNlY2Y4YWIyZGNjMzJmYWFhMmEyMjYzYjM5YWQyNzQxM2JjMWNlYzIxYzM2ZmM2ZmJlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlbWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ2FsY3VsYXRpb25QZXJpb2REYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzMWU3ZmJiNjI3ODk1YWQ5ZmY4MTE1NDgyYzIyNzViMjkxYTg2YjcwMGZjMWM2MWIxMmM3Y2YzNTRlMTRjNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBheW1lbnREYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMjNmOWU4NDY4NjI1M2NlNWIwYWMxYjVhMGY4Njg0M2I5Y2RjZWExZDIyZmExZDMwZWNiMzc3NzMwMWZiMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50QXNzZXRGbG93QmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYmJjMzdhYjBmYmNhNjVkOTllZmQ4ZDgyYzgwZGYzYTdlMjQ0YmQzZjI2MjcwNjM0NDM5Zjc5NjM1MzVlYzhjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudENhc2hTZXR0bGVtZW50TWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNzRkMDdlZjIwYWY0NTViYjU4OWQxYThkMzBhNmNlYWFlZTJmYjRhMDY2Y2Q3OTljYjk1NTgyNmNkM2NhMDA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudENhc2hTZXR0bGVtZW50VGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc2NjVjY2VhYTdmZGZjZDA1OTYxODA5MjBjZjFkM2NkMjI1MGM0NmQzNzQ3NDdmOGZlOGFlMmU4YjU0OWFjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRDYXNoZmxvdy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MjU1ODA5MjIyYTE3ZWY3MWYxYTViODM4NDU3ODMxNDFmMzg2YTJlY2ZlMmI4MjU4OWE3MDE0NzNhOGFhMjM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudENhc2hmbG93VHlwZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmZDcxMWVmNTJjYjY0MzQyODQ0NTE0NDIzNGZhMGVjODNmZDc2YzEwOWFmNmRhZmNjZTc4ZTIyNGM2NmRkNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50Q29tbW9kaXR5UHJpY2VSZXR1cm5UZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjg2OWQyMmNiZjQ1ZjI2NWZlNWNkNjJjM2M0ZDZjNzUyOWFiOTk2YTU0YzVmZmY3YzIxYmFlZGJlYzM4ZTg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudENvbXB1dGVkQW1vdW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGViZTE2YTY5MmY0MmYxNGQyOTUzZDM1ODgyYzg2NzAwMDFkYzZhZDQwZTgwNDdlNGI2ZDUwZTI4NDg5OTk5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnREZWxpdmVyYWJsZU9ibGlnYXRpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTM5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5ZGE0Y2ExYjE4MTNlNmQ5NzI1ZTJhYzhjNzE0NTlmNDdlYTc3N2I4ODVhMTk2M2FlMjRhMDk1MWQ5Zjc3ZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50RGVsaXZlcnlNZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQ3OWNhYTY1ZTMxZmU3OTYyMTY4MTMxYjc3NzQ5ZGMyNWRiZDU5NGM4YmM2M2IyZDllZjU0NGNhYTFlODc0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRGaXhlZFByaWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTJlYjU1YWVlYmNkMThlMDY5OWMzYzZlYWFiNzhkMzZhNzI0ZWIyNDAxOGY4MzMzZGU5NmI4M2IxODM2NGMzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRGeEZpeGluZ0RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjM4YjU3YTZiNzc1ZmU4YjhlMTU4MDg5MjQ5NjQxNTc1NGJmZWEwYzgwNWJlNmMwOGQ3NGVkOWRkMjBkMzg2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRMb2FuUGFydGljaXBhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWNhMzI4MWEyNWM4NzE1YTFjOTI1M2M0ODA2YjNhMmY3ZTQxYTkzZTAyMjZmMTUzM2M5ZGY1YmQ4MjAyNDA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFBDRGVsaXZlcmFibGVPYmxpZ2F0aW9uQ2hhcmFjLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4NDRjYTllN2JjZTVhODY5M2VjYzg3OTc2Y2UxNWEwNGUyNWJlOWZhZjM1ZGM2NmU3ZTQ3ZjYyYTEwMTYxNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UGF5bWVudERldGFpbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1NWY4YzA3NGU1Yzc2YzlhZDg1ZGJhOTUyNmM4ZWJjYzI4Njg1YzAwZGFiZTIxOGFlZWRmZDBjYjM0MjFkZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UGF5bWVudERpc2NvdW50aW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU4YTA4ZGE2NzBkOGUzZmNlZDRkOGQ4OGNhMzk0OTRkZWZiNGIxNDBjOGNiMGU2MDdlZTdkN2M3MjRiMzQ2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQYXltZW50UnVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmYTUzMDFiZDdiM2I3NjU0YjdkZGExNTVmNWY0NzMxYmZiMWMwYWNkOGMyNDNkNDNlY2Y3NDJmZmIyMTZhMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UGF5b3V0QmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhM2IwZjc0ZWZlNGI4MGFjNjFlOWQwZjQyYWMxYTQ4ZjBmZGY1NGI3N2RkODgyNDc1OWU3NjYxYTVjYjI0MmJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFBlcmNlbnRhZ2VSdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEzNzQzODVmYTcxNjY0NGRhZDYyYjM0ZGE5NWJhNWZhMmY5YTYzMWYzYzU1MDU3Mzc1NTU5Nzg0MjA4Njc2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQaHlzaWNhbFNldHRsZW1lbnRQZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTIxMzFjOGQ0NmM1YzQwOWVkZWQzZWZmMjdmNzRhMWMwYjZjNjk4YjE5ZDQ1NTMzNTZlNDI0OGRiZjIzMDI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFBoeXNpY2FsU2V0dGxlbWVudFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImMxZGQ2MTgyOWYzMDVhYjg3MTkzODBiMTIyZDllMTNhYjI4M2VkZWRhZGM4NzQ2ZGUyZGRmZjc3ZTdlMDM4ZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UHJpY2luZ0RhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNmMzM1OWMzYWEzYmMwNDcwODE2OTMyNTJmNDVmMjY2ZjEzNTVmOGI0NTE5ZjZlOGI0OWIxNjYzYjE3MDBhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQcmluY2lwYWxQYXltZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2YmQ3NjFiZDQxZTU3ODg0OGNlZTRhMDM3YTZkM2IwOWY3YzQ4ZDc0NTJiN2FhYmMyMmNlODBiN2VjM2ZiYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UHJpbmNpcGFsUGF5bWVudFNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY3Y2IwYzY3ZTdjYjdmYTBjMzIzMTJhZjlkNTg1NzM0MTQ4YjA0YzZmN2FhMTI0MjUxOGNjYWNjNjFjYjExNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQcmluY2lwYWxQYXltZW50cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzI2OTZmNzdiMDk2OGI3ZWEzMDBmY2U1ZjVlMGY1ZWFhMTIwZmQzMTlkMWZmZjI5YWVjYzY0ZWJlZWM0ODEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFF1YW50aXR5TXVsdGlwbGllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNTIxMTlkZTU4NTFjOGUxZTlkNzUwOTkzYjVlMTRkNjU2MzU2OGEwYmVmMzU2MmY1YjljMjk1NjU1YjU5NmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UmVzb2x2YWJsZVByaWNlUXVhbnRpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjVhYWQ4MzNhZmI0ZTQ5OTY1NjExZDcyMGVkNjIxNTdkNjJlM2U3MWIxOGI3ZWIyMTMxMThkMWZkYWQ3OWYwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRSb2xsRmVhdHVyZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTg5MmMxOTk4ZDhjNDcyZTM3OWU3ZDM3Zjg4N2M1N2JlNjZkNzM4YWU5Mzk0NDIwNTg5NWNmZDNmZjliMTEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNjaGVkdWxlZFRyYW5zZmVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MTFlM2E5YzdjMjUyYWY2MDNjNzU1NGI3OGU3YTk4ZDc0YzY0NjRiMGIxMjdkZDA4ZmZhODc5OGE3Y2U0OWVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNldHRsZW1lbnRCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3NGNlOGRlZGE4YmM1MDkxZjQ5NGVkMjk5NWYzNzA0Mzg4YjQxMzRlZGQwNmJmMGVkZDc0MGUyMmU4Nzg0MDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50U2V0dGxlbWVudENlbnRyZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTY1OGE3NGY3ZDRmMTQyMjUyNTU3MjA5Yjk0YWJlODg4NDAxN2ZkNDhmZjkyNjQ4NzQyZWU3MDE5MTgzMGNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNldHRsZW1lbnREYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlMDY1NTI1NDg2ZjBkMDE3M2E1ZDhhNTBiOWRmYzJjOTY1MTViNjMzMDRlMWZmNTE1ZjQzODJmYWMwOWQ5NzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50U2V0dGxlbWVudFByb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1N2RjYzAwZGQzYTU0NjY5ZjczNWFiM2EwZGMxYjkwNzZmNjY3NzhhZDE3ODJiYTg5NjI2YzA2MzI0MGIyYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50U2V0dGxlbWVudFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjExYzUzYTAzZjRiYjBkMGRkNWNlMjcwYWFkMTdlZDlhOGJlOTdjMDVjMTczMjg0ZjNjYjU4N2QzNjAzMWNhMDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50U2V0dGxlbWVudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY4ZDEzMDkyZTQxYzA1YWExYzc4NWExN2FkZmYzMzZhNzdhYTkwZDc4ZmNjYWFiMmNhMGI2ODE2YzkyMjJkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRTaGFwaW5nUHJvdmlzaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTY4NzU1NTkwMzQ0ODdlNzNlNDljZjEwN2FiMDA1OTg1YzA5YjgxMzA3ODIzYWI2ZTFkYTVkNzgzOGMzNzc3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRTdGFuZGFyZFNldHRsZW1lbnRTdHlsZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYjdmMGU2NDViN2JmODQzODYzMDQ0ZmExOWYxMWU0ZjllMDBiODNhMTdmZTY2NzM4NDNiOWQ3YWEzMDM2ODkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFRyYW5zZmVyU2V0dGxlbWVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Zjc1MGUxMTQyYTkzMWViNDNkZWJlOGY3ZWM5NmM2MmE1Mjk2ZDU5MjA0NzZhZWQwZDM5YTc0NjEzZWY1ZjZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFZhbHVhdGlvbkRhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2QxNWQ1ODhjMzA1ZWQ3NDRlMWE3YzdlNWY1ZjQxNDFiMWJiOTYyYTc3ODViMGE1MjQ0NjU4ODI1MzM2ODRkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDYXNoU2V0dGxlbWVudFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA5MzlmNWYzZjhiOGFmODI4NGZiNDQ2NTYzNjc5M2Y3NWM5NWEyOTJiMGZmNGJiZjU4NzcyZjI5NzIyODkyNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQaHlzaWNhbFNldHRsZW1lbnRUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhZDFmYzJlOTM4OWJhZjYyMzMxNTA3NTQ5NWY5NjQ2Y2U1NTA3OTE2NDI1ZGVmMjA1ODg5ZWQwZGRlMWViOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUmVzb2x2YWJsZVByaWNlUXVhbnRpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTk2M2UzZTJhMWVjZDFlOGNkYTNjNzFjNmIxMTY1MWRkYzUzYjhmYjQ0M2NhNDVlNjQzZTRhMDg1NzMyNzViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVBc2lhbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImNjMmRmMDE1YWNhMTQxNzQwZGI3NTY1YTNkODAzM2NkNThhODA3NzFiY2NhODljY2RhZjkyMzc1MDFhYjFhZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUFzc2V0TGVnLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTFkMzY2NzgyMjc2MmUxMjk4NDg3ZjQ3MGY4NGM1YTc3YTI1ZGUzYzU2N2Q3OWYzODk1ZDc2NmI4NGZjODliMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQXNzZXRQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODBiMzU3YmMyZTQyOTMwMzFkYjY1NmNjZDg0NDc0MmU5OGMzZTUwYzY3YzFkYzMxZGE3NjEzZWE4ZDIxZjI2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQXNzZXRQYXlvdXRUcmFkZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNjNTkwNWVkY2U1ZGJhMDg3OTdlYzBhN2IyNWVkN2M4NzllN2VjMjYzNWNhMTBhODcyYjE3OWFhMWYzZjQ2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQXV0b21hdGljRXhlcmNpc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmZiZGRkYTllZjc4MGY4YjVmZjI1YjM0OTE5M2QxNzI4NmUxYTBiMmJmZTRiYTdjMDA3NzRlMzA4OWRiMDRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVBdmVyYWdpbmdDYWxjdWxhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyYTg1Njc1YTM0Y2I3NWVmM2YzOWYzODc1N2RjYzQzYjM1ZWRlNTFjMDJkZTU0OGU0N2MwNGZjMDI1M2ZmNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUF2ZXJhZ2luZ0luT3V0RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmZDVhNTczNWMwN2ZiYTBjZmM4NTgxYTZlMjFmZDE5ZjkxNTQ4NTM2MTRkNWQ0MGM4ZmFhZWE1OGFmOGQzMGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUF2ZXJhZ2luZ1N0cmlrZUZlYXR1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzIxNGFhM2E3OTE4NDg2ODU4YTY3Mjk0ODU0YzRiOTQ3MDJkYTZlMDRlYTAyZDQzMTRhMjg5OWVjMTY3YzU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVCYXJyaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk3ZDQxMDU0ZDMwYmM3OTNjNGMwMTNlM2IxMmNlODQ4ZmI4YTg3MTJiZDIxZWI2MjExZWY2ZTk5YTVkNTEyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQ2FsY3VsYXRpb25TY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3ZGI0ZDNlZGFiMGE3ZDI2ZDMyZDUyY2EwOWZlOGIzOWIzNzhiMTM2N2IwOTFkNjY4NDk0NTQ5Y2NkNGJhOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUNhbGVuZGFyU3ByZWFkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWVjYjlmYTc1M2UxNWQ4YjY4NjljOWVlOWI2NmFlZDU2ZGU1MWY4MzY4YzI3YjBhZjMwZDZlNzFlMmQwNDg0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQ2FsbGluZ1BhcnR5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE4ZjcwN2NmMGFkNjI1NWVmOGYyY2MyY2EzZTljZmQ0NmZmYjQwY2I3NTJjZmRkMTA5NGFiYWIzNDU3MzBkMzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUNhbmNlbGFibGVQcm92aXNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjNmNDE0NzQ1NjJhMTUyYjAyMTliZGExMjlmM2MzZGE2MGMyMzU1NGZlMjM3NDIyOWFhNzA1YjFlZTNlM2JhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQ2FuY2VsYWJsZVByb3Zpc2lvbkFkanVzdGVkRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NjRmMWVmZTUzZTVkMTNiNTNmZmM5ZDI0M2RjMzczNzQ3YmY3NzQyYTliMTAyNmJmYTE0YmY2NTdhYmU5MzJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVDYW5jZWxsYXRpb25FdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkMTcwODg4ODZiM2M4NDg0MTc0MTJjNTc1NjQ2ZTJjZDk3MDk2MDlkNmZlYWNkOWI3YWE0MzY4MGNiMWM0MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUNvbXBvc2l0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YjY1NTNiNTQyNjdkM2E0M2JhMTM1ZWRlMzhiNDAwMzBkZWIxZWQzNTdmNGM5YTFjNDQ4YzEyNzIyNDMwNTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVDb25zdGl0dWVudFdlaWdodC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyMDlmNDNkNjczZjllNTcyZDUxNzBjOTkyNTJhNWJiYWY4Yzk3Zjg3MTRlOWZmYTdlZGJjOWMwYWIzNjQyODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZURpdmlkZW5kVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDc5MGU0YjdlNGMzYTJmOGZhZGIyZDIzNThjYjA0NzE4ZmI4MTVmYzE0YzRkMzg4NDMwYmJhYmRlMmM1MDY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFYXJseVRlcm1pbmF0aW9uRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTc2OWZlODhlYWRkMTllYmExZmQyZDRhMmVmY2ZmY2Y2YzUwZDIyYmFkNTkwODczYzE2NjM2ZjliYWI4MDgwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRWFybHlUZXJtaW5hdGlvblByb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOGM5NTBkMjMxMDYyNGNlNDQ3NmJiOWIyNjMwODg2YjFjMzJiODg2M2FjNjRkMTNmM2ViOGQ0MDhmMjE0YjcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFY29ub21pY1Rlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljOGZkNjNjNDM5ZTZhNGZhNmUyYjczNWFkOGFlYjk1ZDUyZDU5ZGM3ODVlZDFiNmIzOWQ3M2RjNDQ5YzlhNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV2ZXJncmVlblByb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDc2NWZjMmExMTAwMTNjY2RmYTU4MmZhNzNiODMxZWU1M2IxNjAzOTU5YjMwZjMzMzgxZmQwYjFlNDEzYjMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeGVyY2lzZUZlZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYWI1ZTM5MGNjNGY1OGQ0YzViNmEzYzUzN2E3ZjJiN2Q0ZTlkNjk0MTFiYmI3ZDk3M2Q2YzlmZTE2NjM5OTM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeGVyY2lzZUZlZVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxZDE4MmU5NzA1NWQ3YjM2Y2RjYzQ4ZTZiZWRkNzBkNzExNGU5OGRhMzJiNWYxNzA4YWM1Y2QyZmU4NGMxODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV4ZXJjaXNlTm90aWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUyOWVlZjBkMjM2NzBlMDUyMjY1Y2IyNWUwYTIxMjAzMmU5ZTIxYjRlZjM5YTFhMWQ2NzNjMWQwNmE3NmUyYWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV4ZXJjaXNlTm90aWNlR2l2ZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWU0MDA0MmU4ODVlYTY0NjM0NzYwMGUzM2Y3ZWVjZGY2Y2IwMTlkMjJiZTZhM2QyMjQzMmUwY2YyZmMwYmRkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXhlcmNpc2VQZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmM2NGRjNWZhYTVmMmE5YjdiNWRiMWNkZWFkMTIwNWIwMThkMTQ0NzRmMzRhMzI1NmM4MzQxZmE2Yzk1MGM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeGVyY2lzZVByb2NlZHVyZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjY3M2E4OGFiMjA4OGM4ZWNjODUyYzEyODhkZjMyYmYyZGE0OGVlZTEyMjBmZTI5MmE3ODY0NGFjNmM2ZWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeGVyY2lzZVRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjYTEyOGJjYjNmODMyZTFlY2E5NmFkMjQ0NmMwNTYxMTg4MTFlYTNlYjU1ODE1YTBlMzA2YzRmZjBjNTc2Y2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV4cGlyYXRpb25UaW1lVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGEzOGVhYzEzMzE0MzYxYzFiNDNkN2Q5ZWZhZjgyMDVhZWRhZTIzNmM1NmQ1MjMyYzgzODYxNTMyYWM2NmJhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXh0ZW5kaWJsZVByb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MmVkNWI1NWI0ZmFiNzdlYzEzNDc5YjlkNmI4NDM5Y2NhZDA3NWQzY2U1ZTI5YzBiZjZjODU3ZTM4ODMyYjdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeHRlbmRpYmxlUHJvdmlzaW9uQWRqdXN0ZWREYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRmNTBkMDg2ZTlhM2NjODMzZGIwYWNiMzMxZDVlMGRkOWFmMzdjNTMyNzI1NWZlM2E2YzVkMjhhZmRlNzBkOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV4dGVuc2lvbkV2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzYwMzljNmFlOTIzMDk1MTc2ZmFiOTNmMDg3MjY4MjM4NzM0YWQyN2VmNjg4YzRlNGJjYjI4NDIwN2FlMGFkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRml4ZWRQcmljZVBheW91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDczMzRhMzUzYjM0ZTdlOTQ0N2Q4MzUxNzZiYzcyNTkwNjMyZDc5MThjMTA2ZTdhYmRmOTQ5YjNlYzRlOWRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVGeEZlYXR1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjM3ZjhjZmIwZDFlNDNmN2EwNmM3NjZmYTU3MjE2MGJjM2FmNzYxODdiODgyOGZhZDE3MDVlNTU5MTY3OThhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlS25vY2suanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMWU5NTZlNDRhMDhkNTEwYjc4YzE1M2NiNGE1MzVlZGQ2ZGZhZjI1ZGRiNTUxOWE1Y2U2ODRkNDc1Zjc4YzM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVNYW5kYXRvcnlFYXJseVRlcm1pbmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2NDUzOGRhNTUzYzNlYTY1NjAyNjNmMDEwMzI1MTZlYTg0YjU5ZDIxYjA2ZWI1NjczN2JmZjJkNzEwMWUxYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU1hbmRhdG9yeUVhcmx5VGVybWluYXRpb25BZGp1c3RlZERhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllODEzMmQ5MjMyYTQ5M2YyZjM2ZjYzZTUyZGRjNzdkOTJjMmViODdkOTBhZTgxYzlmMDYxYzM2ZTE5ZDVmN2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU1hbnVhbEV4ZXJjaXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1OGM5NzBlMGNmNTBiNmI2MWUyNTI0Yzg1M2Q0MmNkNzBiNWJmZDYxY2E4MWIxOTdmYmNkYzk2ZmIwZDk4MjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU1hcmdpblR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTZkNmYxY2RhMmFmNzM1ZGI2Mjg1ZjM0MzFmYjc4YzRjNGExNmM1ODQ4MmRlNTRhZjU1MjY3NDY4ZDY5YmFkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlTXVsdGlwbGVFeGVyY2lzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGVhNDU2MzU3YmMzM2NlNTU4NDUwOGUwZmQzZDQ0ZDdhOGNlODExNmEzZmIzN2FjNmU4ZWFmODYzNDJkNWZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVOb25UcmFuc2ZlcmFibGVQcm9kdWN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1ZmE2MmZiMDYzZmY2YmU1MzViZTk2NjgyMDM3Y2ExYmM1NGRmYjcyYzhkMDU4MWYyZTIxZmM0N2RjNTU1MjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU9wdGlvbkV4ZXJjaXNlU3R5bGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjY1ZWUxOGJjNWZlY2MyZmYyMGIyMTdkZjUwMGJiYzc3OGU0NDE0YmJlM2NiN2RmYmVlNDE0MzVhZDFhYTUxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlT3B0aW9uRmVhdHVyZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNTY3NTc4NGFmMTI0ZDJkYzk5YTkzNTYxYzgxZGZhMmU3ODgxYjJjZDA2MzQ4ZjU1M2VkOGI1ZDViODI0OTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVPcHRpb25QYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjhkODE2NWM1NTg5YmU0YTcyM2M3ZTUxM2ZlNzAxZmM3NDI4OTRkOGI5ZTZkMzQzMGIxMDI4ZTgyNjQwOWFkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlT3B0aW9uU3RyaWtlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiZjdjYTg3NGEwYjEwYjI0NWE0MDliZmJhZDM1Nzg4YWE0NDdjM2VmNDMzNmNkNDI5M2QyNTAzNWM2ZDI4YTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU9wdGlvblR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWI0ZTc5Y2RkNDM2MmY5YjcwYjk3OWE5MzhiM2I5MzkwZWYwNDY3ZjRiM2I3ZjcxZWM2ZTljN2ZjODJhMDNlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlT3B0aW9uYWxFYXJseVRlcm1pbmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjliZGU0MDlhOWVhNzMzOTUyMWU3YjdkYzA4NDYzMzRmMTUzZWM2ODM0YjY3YTg0OWM4ODgyMmZkMGM5MDNhODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU9wdGlvbmFsRWFybHlUZXJtaW5hdGlvbkFkanVzdGVkRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZTBjN2U2N2IxNDI0MjFmNjZmMzFlMDM4ZTQzOTg4MWIwYzc4MWNkMzFmNTdlYThiMzYyOTkxMmNkZjM3ZmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVQYXJ0aWFsRXhlcmNpc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmY4NmY5ZDcwMzJiN2EwYzg2YWViMTQyMDI1M2NiNTg5ZjhmNjYzNzIzMWNlY2M1YTVlOGMzMDg1YTU2NWRjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUGFzc1Rocm91Z2guanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZGZmZDE4N2NjZjAwMWEzMWM0NzFhMWE4YzYwN2QwZjc1MmU3ZGM4MzI5NDBkNWUzMmQ4NDVhZTI5ZTc2ZDcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVQYXNzVGhyb3VnaEl0ZW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OTEzODgwNzFmMjNhMTk0NDlkMGI3NWU2ZTUzOTAzM2Q5NDI5NWUzZTY2MDE5MmM5YTNiOTBlOGVmMWEyNjRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTAyZTNjZjFkZTcwNjFmZWFmNmRkN2Q0YWZlZjRhZWZlODM3MjI4YzQ4Y2Y4MjU3ZGJlNjEzNTRiOWNjZDI3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUGVyZm9ybWFuY2VQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTI5MGNjMDk0MTZkODlhYTE0ZTNkNzYyZTYwNGU5OGI3NmM3OThmMzU5OWIwOGQ3YjBiOTlhNjJmOTUyNzc3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUG9ydGZvbGlvUmV0dXJuVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGYzNjQ3YjFjZWFmZWI5NGFjY2RlMWE2YWI0OTljMDEwMGYxMWE5MTcyMWY0NjI2ZDI4MzE1NDhjNzE4MGIxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUHJvZHVjdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxMzZhZjI3OTg2MjczNmVhZjJjNGQwYzhiNzY5YjQ5YmE0MGJlZDMzNTJkYzFmMWNhNzMyN2YwY2I3Nzc5NGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVF1YW50by5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzlkMjUyYmEwYjZiZWMyNGY0OTZiZDNhOTFmMTFiNjBlNGEwNTQ0YzFjZWVkM2QxZDY4ZmZkMjc5ZjAyMGUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVSZXBvRHVyYXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmMxMTU0YTBlZGRkMDhjZTQ2OTE3MmRkNzVjZTJjNjViNWYyZTlhNTAzMTVhYTEyNjZlNTM2NDA5ZWM2NDYwYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUmV0dXJuVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODM0NmZkNjQ3ZTNiZjU2ODU5M2I1NjgxOTg3ZTRiZjgzZjBlNDg0ZjFmNDJkMWVmNmQ5MjliZWRiNGNmYzFlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlU2NoZWR1bGVQZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzdmOWM1YTJhNDlhZDEyNjIzZTNhOTBiODQwOWU3NWRkODY5MzVmN2M5YWU5NWE4OTRhMjYyZDA5OTA3YzhmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlU2V0dGxlbWVudFBheW91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzE4OTBiNmYzYTZjYmY0N2M0MWEzZmE3ZGExYmU4MGY4Y2JlN2E4ODVmZGU3NDJjYzE4NDlkZWRkODY0MGY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVTdHJhdGVneUZlYXR1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2YwYmI4Njc4MGE0NTA5MzE2Y2EzMjczZjU2N2Q0MGQ3NDk0ZGYzOTYwYmUwYzU3N2ZlZWQ3NGU3MTZhNTVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVTdHJpa2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzNmYWI3OTJlNjQyOGVlMGE4NmU0MjRjZmQ2ZGVhOTk2YzgzZTAyZmViYjVjNTM1YmQ4MGVkZmVjYWZkNmJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVTdHJpa2VTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5MTkyZGM2MGJlNjAwYmM3ZWViMzYyYmE5N2NiMjJmMzMwZmE4OTEwN2EzMzQ0N2Q5OWFlMGQwYzVlOTEwYTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVN0cmlrZVNwcmVhZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4MjMwZjZmYjZmYTY2YTIzMGM5NzliYTAzMWQ5MjU4ZDFhMjkzNzJmZGI1ZmMzYWEwNDJiODZhMTBmNmM4MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVRlcm1pbmF0aW9uUHJvdmlzaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjYTE0NzY5Mzg1ZTNmYjJmMDMzYTliOWQzMzY3MTMxZTFlZjE4MmIzZDhkM2E3Zjk0MTNmNzhmYjliZTBmMzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVRyYWRhYmxlUHJvZHVjdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YzczNjA4YjE0MzhjOTc5YTllNWM5OWZiZmNlMWRlN2IzODE2MmFkMTA3N2EwZDFmYzY4NTQ2NmU3MDdlMTE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVUcmFkZUxvdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NGNlZjZjNGExNGQyMzY0ZTJkNmFhODllYjY2ZmVkMmE5NDRiYWFhYzVlMmE1YTVmMjMzY2E2OThmMmY3OWRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVUcmFuc2ZlcmFibGVQcm9kdWN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5ODBmMWM5YzM5ZWI5M2ZhYWZmODZjNzViMzE0NjJhNjJhMDU1MWM2OGMxZmIwN2JlYzQ3YTBhNjA3NmY5MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVVuZGVybGllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJlYjViMTNlYzkzYjU5ODcyZDM5MzAwYWY0NmMwOTIxNmE1ZjYwZWZmYTYyZTJjYjI3YjJjZTlmZjk0NGRlNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU9wdGlvblBheW91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlY2I2YjQyNTAwNjM3NDNmYjZlOWU2ZmY1Njg3YmQ5MTY3MjlkYTlhNmQ0Y2I4MTJmNDFiY2Q5YzMzZjRlMGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBheW91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImExNjQ3NmVkMTBlZDZhNWI4YTZjNGI4OGNlMGY3NzdjOTYyOTNiM2NhMmJkZmY0MzEzYjM1NzcwNzUzZjk2NTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25BY2N0T3duci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ZjVmNGE2NTU5YTFmMmMxZGRkOTI5ODc2Yjk3OWQ0NjRmNzAwN2I3YzgxZDU2Njc3MmUwYjI4NzAxNDA4MDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25BZGR0bEF0dHJidHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjM2NTJjYjViM2Y5M2JmOTIxNzhhNjkwMDdlYzAzNjlkYWY4OGE1NTQ0NzgzNWM0MGRiODhiNDZiY2MwMmI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uQnV5ci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzOGM5ZTExYjg3NjNhMTBkNTU4OTU4ZjYzNDdjMDZlYTE3ZTE4N2I0NzU2ZDk2ZTVlOWE2ZGEzYjgzOTYxNmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25EZXJpdkluc3RybUF0dHJidHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZGE1Y2VkMTZiYTg0MTI2YTljNTYzY2E4NzhjOTk4YzgxOWFmN2RkNTYzYTVkODFkNjUyZDVkNDM3NTlkOWRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uRG9jdW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzMzYmFiNzJiZWFkNzllNzFmMDI3NTM1MWE0ZjkzOGVjODM2Nzk3Y2YzNDljMTMzNWI0YmJlZDJjNjQyY2M3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uRXhjdGdQcnNuLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDgzMjczYjk5ZWRkNDQ4MjYwMDFlMjljMDIxNzcyYTEyM2Y0ZWEzZmU4MzlmYzhlOTJjOTM1NmMwZDEwZDRlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbkZpbkluc3RybS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhOGFkYjkyMWIwMjFhMmFlYWQyNDdlM2I5OTJhMDYxOTI5ZjMzNmVlNjNlYWFiYTlkYTJiN2I3NjY5YmI1MWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25GaW5JbnN0cm1HbmxBdHRyYnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDEwYmQwNzA5OWNmMTFiOTk3MDk5NDM4MDAxMGVjZWQ1MGRkMTViODUyNjlhNzkwYjU3ZTM1OTA3OGRmNzI5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbkZpbkluc3RybVJwdGdUeFJwdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNTE3NjFkNDQxMjFkZjYxM2U2ZDcwNzRiNWVlODMwYjEwZmQ1YWIxYzhkN2RlNjk3YWM0YTg5YmU3MWJlZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25JZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyNWY1NmZiYjMwNzMwMjI0NmVmZDZhZWMwMWFiZDFhOWZlZGQ2MjA5ZjRmMTQxYjAwNDY0MzhiMTYyYzU5MzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25JbmR4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZjYjExMjE5OWFmMzAwM2Q2NDA5MTk5NWU4ZmUwYWYxMGJkMjRmMzhhMjIxYjAyMWQyNzUzNGJlYjk4ODA0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbkludnN0bXREY3NuUHJzbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhNWExZGJmNjNjYjlkZWQ1OWE5M2VhZWJlMGFlODZmYWY1NDUxZTkwODQ5MGRmZTEyZjVkYjI1ODQ1NzM2M2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25OZXcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWE4MjliYjkzMGEyMzZhOGJkZTY0Mjk1YmZhNDY0MzczNzk0ZjY4NmMyMjI0OTdiMzFmOWIyYTJjOTIzM2U3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbk5tLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTk1ZTFlODg4YmI1ZDdiYjgwNmFiNjU1ODI5OGE5NDI5MWY0OWE0NDBkNzZjZWUyMTMwODk4NzY2YTJlZDg3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbk9yZHJUcm5zbXNzbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImNlNzY4ZTQ0NmY2Njc5MmMyOTZmN2E4MjI3NjIyMjQxZTFiOWMyNzNmNmNkNjVlZjNjMTk4OTBhNzFlYzkzYTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25PdGhyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc3YWJkNGNmODk2MTljMzFlYzhjMzBkODA5YzgwNGQzYzU0YmExZGFmN2NmZmM3MWRiNTc0ZmI0ZjJlY2NiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblByaWMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYjQzZDY3YzgxNDAzYTBjZjUyYmY3ZTBmYWQxZjM5OWQ2ZWE0ODFmYTEwOGE2YWI5MjJhNWFkMGY5YTJlNDgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uUHJzbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmZWM0MmY3ZjE5MjcwMWE3OTY4ZTcwM2MzNDMwOGFmMmIzOTEyMTUxZDRjMmNhNWU0YjUzMGE0OWQ4MmRmNWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25RdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjhmODI4MWM1MDg4NDQzODI3ZGNhYmE5ZmEyMmM1YzYxMWFiOTQzMjJiYjExM2JlNWEwZmY3ZjM3ZGFlZjY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uUmVmUmF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4ZGM2YmE1OWQ2YmY0OWJkNGQzOTYwY2E3ZTlmZWYzNTIxODcxZjEzNDUzMmUxYjcyOTJiYzMwMjZjODY0ZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25TY2htZU5tLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNkM2ZkNzc4YzM5NGY2MTI0NzMxMTMxNzdmZDA5MGVlMjI3YjhiNTE2NDRkODlkM2NiNTE0YmIzZDk1NWExMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblNlbGxyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY2MzQzMzA4MDU0YWE5MjRmN2IwZmU4ZjhmNDQ5ZGYyZDg4NGRkNjdhNTJmYWQxYzU2MjFhY2NiNWU3MGZkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblNuZ2wuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDk3NDFjNDU0ZjEzNWZlOTg0MGE2MzEyODBjMGZhYmVjMWQ5OWY1YmZkMmFkZTJmYjY1MmFiMmIyZTMwMTVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uU3dwLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODAwMzY5YzU2NjQzYzIwMzBmMWY0ZGY0ODc0NDMzNWVjZjYzZTgxNzAxMmFiODkyZWQ1OWExYTM1ZTNhODY3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblN3cEluLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjljZGMxZjZjYjZkMDUwYjg1NzJlYjAwZDEzMWJlM2QyODk5ODFiM2ZlNmNlYjU2MTJlZmVmMTFiYTcyOGZhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblN3cE91dC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0OWNjMWUxZDU0ODFhYWFjZjJkODE3YmFkNDk0MDAxMDU3MDgxNDZhMzU4NGRkYTA4MzIyMWMzNTJmM2NlMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25UZXJtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTljZDhjODMxZGZlZWNhZDYzNmJlYjYwMjMzY2MyYWQyYmRjZDE4NWEwOGJjODBmYTZkODBhZmE0NjE4YzI4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblR4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImE4YjRjZjcyYzFmZDg2OWI5ZjBlYTI2M2QyMjkzYjdkNWI1YThlOTJmYzE5MjYyOGI5NDljMDViNzY4MjFmODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25VbmRybHlnSW5zdHJtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDY0ZDQ2OGQ2MzU2N2M0MWNmODUzYzJkMTEwNDY0MzE2ZDlhNzk3ZDIxYjJjNGJkN2ViMjFiOTBiZjU4YzdkYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY29tcm9zZXR0YW1vZGVsRmllbGRXaXRoTWV0YVN0cmluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1MzliYmE1OWM4NzUyMTE0ZjMwZjMyOTg2ZTJjMDhkOWExMmFmNmFiMTk1M2UxNmVjZTZmNjYzZjM3MzVhNzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NvbXJvc2V0dGFtb2RlbGxpYm1ldGFLZXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTg1OTgxOWQ2YWE0MjgzNjRlMDQxODk2ZGJkZGQ3ZWZhNTVkOTUzYWYzOWQ2ZGI0NDlhODNkZTc3NGNkZThiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jb21yb3NldHRhbW9kZWxsaWJtZXRhUmVmZXJlbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjVmOTJmMDM1NDllNzYwOTdhOGEyMDZkNTM3NTQxY2ViMzUyMTU5NmZmZGZlOTNiN2I5M2E3MWVkMDA2NDRiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY29tcm9zZXR0YW1vZGVsbWV0YWZpZWxkc01ldGFGaWVsZHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZDQ1ZTAzOTQ1NjIxYzk4ZmM2NGU3NDBkZDI5YjY0MjNiODRkZDFhMzA4YzQ3NWE5YjRhYmQ2ZjJhMjE1NzU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jb21yb3NldHRhbW9kZWxtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFTdHJpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzhmZDE0ZmE1NTdmYjUwM2M5ODVhZGU4YzhjMjRmZGZkZTc0N2EwZDdlZTVjYzAyMDBhMWIzNzBjNGU4MmZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NYW5kYXRlL0RvY3VtZW50UmVzcG9uZGVyTWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNDQ2YjM2ZjRmYmY4M2FhYWM3MjAxOTk2YzExMDQzOWMyMTZhMjE3ODY3ZmExNWQyNTQxN2U2Y2VkZTA0ODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvTWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4ODI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmRmMzZlMzMwNDU3NmQ0MDFhOTUzODAyNmNjMDdlNTQ1YTk2Y2QyYmEwMGU4MzVlMWU1YWUyMTY4NGE2ODMxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9NYW5kYXRlQWN0aXZhdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTBhY2M2NzFiYzUzYzIyMGIwMGRlYWY2MDEyYjk4MTAzMjk4ZTM0ZWU4NGQyNGRiY2E0NWRhZDMxNGIzNTdiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9NYW5kYXRlQXV0aG9yaXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTk0Y2Q5ZDZiYjNjNzk4YTU5YWI3NWNhODYwYzdiZWEyM2NiNTFiNWY0YzgwNzMyNmJmNWIxZjJlMWE1MmRkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9NYW5kYXRlQXV0aG9yaXR5Q29uZmlybWVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2EzMzIxZDQ1MDQzYjNkMWFlMjRkOTVlNTI4NTIyYmNmNWZlYmNlNTcwZTk4NjVkMzM3NzViOTY5NDAwNTQ2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9NYW5kYXRlVGVybWluYXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTM0MDE1YWU5Nzk4NzU0ZDFjODQ5ZDVmNzQ3N2QzODRlYzQyZTRkZjhlNWUwNDVhMTE4ODhlZmY5YTVkZDA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NYW5kYXRlL01hbmRhdGVWYWxpZGF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwMjBjMjUzOWY1NzNjOTUwMWFlYjg4YmE0ZDM5NjY0OGNkNGUwMjVjYmIwODk1M2ViZjk2ZTNjYmQ1OWEwMTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvT3BlcmF0aW9uTWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzY4Mzk2ZTY1MGUwMDE0OWIzZmY0ZTI0OGJhMmRkZWJmOTljOGM3ZDM0ZjhhOTAyMzViMGZjMTk1N2Q4YTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NYW5kYXRlL1N0YXR1c0FjdGl2ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0ODhiYTFkYTBiNDdkZDliMmFjNGM5MzBjZmI2ZWM5MGNhYjNhYmQ1NjMyYTU4YWU1ZjBlMjI4OTQzMzFmNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvU3RhdHVzQXV0aG9yaXR5Q29uZmlybWVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2FmNzUyMDA2Mjk0NWJiNDZkYmRhNTQzMTA5M2FkOTA3MWY4ZDgzODcyNmQzODA2MGRjZTMxMzMxOWI3MTU0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9TdGF0dXNUZXJtaW5hdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjRiMzA0MTU0YTAyYTlkMGU4N2NjNThkMDUwMjZhODZlYmUyYjRkN2IwZjY5Y2ZkZDNhYmYxZDljZDdmMzI2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9BZGRpbmdQYXJ0aWNpcGFudFJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0MmMwNGQyNWIyOWI4Y2UxMjI1NWE3Nzg3M2Y3MzZjYTA1MTEzNDY4MWQ5MWVkY2RlMzliNGIxM2QzODViY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvQWRkaW5nUGFydGljaXBhbnRSZXNwb25kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MmIwMmJiMDQxYjBhY2QwM2QzYzI3ZDZiY2RkOGFkY2JlZTU0Y2IzYzlkYTNjOWEyMGEzOGNlN2YxZjI5YTgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0FnZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2YyNTllMDU0Mzc3ZjNkMjE1ODRjYjhhOGJiMDA0ZTc3NTVlYTVmMTFhNjY4ZTY4MDVhY2VhZjQ1ZjY0YTA3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9BbGxQYXJ0aWNpcGFudHNSZWFkeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1Y2M0NWY4NTY4MjM3MGFmMjVhN2E1NjI3MTMyNjQzMTZlYzQ5ZDdmYjFjNTE2ZTFlMTUzYjU1Njc4NjNmYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvQm9vdHN0cmFwRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDE4ZThkZWQ2Yjc2MmM4MGYzZWY2ZTZhYjFjNmRkZDEyOGMyZWU5ZDhmNmRkYWU5ZTgxZDllNzg4ZmRlZTI0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9DYWxsT3BlcmF0aW9uQWNjZXB0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTcxMzM0ZjZmNzFlNjY0ZmI1OTJkMmZkZjZiZGY3OWNlYTQ3NGY0ZTRjYmU1YzZkMTEwODU2MDkyYWQyOTQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0NhbGxPcGVyYXRpb25GYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Y2EzMWUzOGUyZGU5Nzc4MzNiMzlhNjI4MTIyZTg3ODc1NmY1M2NhYjQ4Y2I5Nzc3ZTg0OGIwODhiZmQ0ZGI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0NhbGxPcGVyYXRpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDEzZDMwYzE0N2QyMTUwYjY4MWI2ZTk5ZmMyMDljNWJhM2RmMjBhYzdlMzJjNTAwZTQ0OWZiNmRkZTVlZTdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0NhbGxPcGVyYXRpb25SZXNwb25kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjM1MGE4ZmQ5NTRmZTAyNzJjZmNlY2Y5ZDMzZjAxMDc1NTFhZDEyM2Q0NmI3Mjc3NjJhMWM3MDE2MjA2MDkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0RvY3VtZW50SW5pdGlhbFNuYXBzaG90UmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JmZDJiZGZlZjIyZDU5YmIyMDcyZDM0OTAyYjI0ZDczN2M0NDQxYWM1ZjdjNTgwZjZhZTNmYTNlMjQ2ODRlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9Eb2N1bWVudEluaXRpYWxTbmFwc2hvdFJlc29sdmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzcxZmMwNjAzOTFjYTY2NjY0NWUxMTU1ZjExZjAwYzQ3NDk3ZTVkZDljZWUyZGQ4MDRlMTQ4ZGMyODI5NDJiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9Eb2N1bWVudEluaXRpYWxTbmFwc2hvdFVucmVzb2x2ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODk3MjQxNThiNjE1OTdhMDgxMmQzYWQwNGY2YmIzNjI3YmY1NWZlOGFiZTRjOTY2ODQ3ZjMyYWM4ODI3Mjc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0RvY3VtZW50U2Vzc2lvbkJvb3RzdHJhcC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI4NzIzN2U3NzhhNGMyOTFmODM2ZjM0NDJmYjIyZmE2YmI2YTA1NWY0YWVmNmMyZDgwZWRjMDNkZGRjZDJkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9MTE1BZ2VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImJjOTk2ZDJiZTIwZGEzNzBmOGQyN2Y2OWZiMDRhZTcwN2FiMGYwY2IyOTQ5NGY4YTljMWNkMGNlY2JiM2RjMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0FkbWluQWN0b3IuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTUyZWE5YjQ0NjhmMWU1OWRjODQxMGI4MGI2MmFjZTRkYTBhZTkyZTQxNzJhNDhmZTUyODc1MmQ5MzdmMTI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NBZG1pbkJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDA0YjRlNDM4NWNlODg2Mjc1NTc1ZDUyMDU4OTI2MjE0NGRmMzllMDNmZDA2MWY4YTUyMWYwYTRhYjZhNjk1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TQWdlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTYxY2Y3YjJiMTNmYzVmMjBmMmI1N2Y0NDI3ZDQ4ZDU5YzE2ZTc1MTcxZTY3ZGQyMTJiZGY4ZmRjMDViNDFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NBZ2VudEFjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWM4ZjdmNGE2ZGE2Y2VhZWI3ZjQ4NWM4MmU0YzM0MjllOTk3ZjJhNzE3YzJmMWI4ZWM0ZmNlNWY4MDJmODk4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TQWdlbnRDaGFubmVsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGMzZjNkMjNjNWM3OTcyMzFmMzMzODdlODNmMDRkYzVjODdiYjdhYjY3MzFkZmU5NjI1NGI2MDI0MTYxOTZjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TQWdlbnRFdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0ZWZmMjRlNzY0ODk5ZTcyOTFkNTA2NDE4ODA2MzgwMjcwYWRlNTk5ZGRlNDViZmIxNWJiNzI2MjI2YmQ4ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0JhbGFuY2VBY2NvdW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M3OWQxNDhlYzhhOWFiMjM1ZDY1OWUzNmY5NTIwNzk2NTRiNDU2Njk5ZWE0MTU3OWVlODhiY2E5NjkxZTE1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TRG9jdW1lbnRCb290c3RyYXBNYW5kYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODg4ZWVkOTk1YmFiOGRjNjJhMWFhMTE0MDBhZmM4MzM3Yzc1YjBmZDRjNTk2NTNjMGI0YzYxOTdhNmYzNWRmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TRG9jdW1lbnRPcGVyYXRpb25NYW5kYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGM0ZDRjZTI2YmQ0NGUxZDIzODFkMWUxYjY3OWNhYWZjNjVmY2ZjMTY1ZWI2YmEwNTQxMjVhNzE2YTMyMDgwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TRG9jdW1lbnRTZXNzaW9uUmVmZXJlbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGNkNTk1YTUyZjMzNDAwZTJjYjJhOGExN2JkYmZmMzBkNjZkNjhhMTUzMTAwMTA1YWE4ZjJmNzg3NDgwZjMzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TT3BlcmF0aW9uQ2FsbFJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTljZDMwZTEzOTk0YTM4ZGJlMTA0NjgwYmY5NDE3YjE1MTRkNDNiZjg3MWZiZjc0YTNlYWI3MTYyODU5NDUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NQYXJ0aWNpcGFudHNPcmNoZXN0cmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYWIxMTA4ZTg0MGEzODBjNzM2YmZkYTM2NGVmZWI0NjM0MmUwNzY3MTc4ZWI2NmQ4M2NjNmY0NjFkMGQ5NjFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NTZXNzaW9uSW50ZXJhY3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMWIyNjI4MjIwMDY5NjkzMTYxYWJkMTg5ZTBjNTAzZmJmODc4NWQ4OTM5Y2M1MzMyYWMyYTk2ZWQ1ZWQ0ZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25FbmRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjFjZGM3ZTQwMTViYmM3YTY0NDJhYjUxMDc1OGM2OGQ5ZTIzZWMxYzZiZWIyZTIyZWM5MWYyODgyMThjZjFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uRmlsdGVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4NjM3Yzk0NjhjMDZjYTBlZGExN2I2YzhkMTA2YTIzMmRkYzkwMTE5ZmE1ZjRjZmQ5MmYwYjNjYjUyMzVjOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25NYW5kYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5Mjk0MDYwNGQxODUzZGFkOTE0NmY2YmRlNWYyMzM3NmM4ODUxNDExYTA0NzBkZWRhMGNmMWI3OWNhMmZlMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzNiMDAxMGMzODMwMjcyODgwNDY4MTk0YThmYTJiOGIwMDIxY2E3OGVjZjQxYjk4YWI2ODU1NDc5MDk0YWJkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TU2Vzc2lvblN1YnNjcmlwdGlvblN0YXJ0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2EyNmNlMDVkMjU2MTdmZTUzYWZlNjk4YjA5ZDY5NWY5M2UzNzc2YmE1YWM5MDMzZjRlYzA5MTdhMmM4NTI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uVXBkYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiZTM0MTZmMTkxYWEzMWEwZDkxMjRjMGUwYzlhZWIzNjRhNWRiYjgxMzI0YmIyOWIzNTEwOTFhYTM2MDMwM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1RpbWVsaW5lLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmQ0MDU2MDIyODhlOGFhYjY4YzUyYTkyNWIxMWVjMDc0YTA3ZWRlOGNjYzQ5YWJlNzA0ZDU3ZDM2MDBjYzBkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TVGltZWxpbmVDaGFubmVsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQ0YWI5MjA4MjYzODhkNjc3MjIzYzk5YjYyZTRiZTUzNTFkMDU0YjA4OWE5Yzk1OTg4ZmM1ZTg2OGQ1NGIxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TVXNlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmNzJlMWUwMGIzNzM1NmIyMzMzZGQxNTYyOWQ5ZTE1ZTFkNmEyMzI4MzA5NWE1YjU0YWRjZGYzMTIwMjMxMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGFydGljaXBhbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMWRiNzQ2YzM2NThkN2ZiM2FhNmQ2OGI5ZTdlN2I5OTUzYWUwOWVlZTE4MWIyODY4YzliYmVkMzMzODdlOTEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BhcnRpY2lwYW50QWN0aXZhdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjE4MDM1Yjg0YjllYjczYjBlMDM0ODMzZDQ2Mjk0ZDU0ZWYzMGNjMDYxNzU4MmZmY2RhN2VkYTVmZTNjOGQ2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9QYXJ0aWNpcGFudEFjdGl2YXRpb25TdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImIxMGE1ZTUxNmVkYzYxN2IwYjhmZmU3MzI0NmFkYjEyZGJjODI5MDc2Nzk3ZWJhZjk1ZTNiNDJhYjMxYjJkYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGFydGljaXBhbnRSZXNvbHZlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1YmJhOWI0NDRhOWMzMGViZjgzYjUzNWM2NjBjZjIyODcyNWE5MjEyMTlhNDNiMzZmMmE4N2E5NGMyMTQwNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGF5bWVudEluaXRpYXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiMGUwNjkwNjBlZDM4MzM3ZGZiNDcyYWM0Yzk2OGFlZmQzYTE4OWZhODBmMDY3NzhhODBhOGU4M2I4NjcyMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGF5bWVudEluaXRpYXRpb25BY2NlcHRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhMDE4NTZlNGM4OGEwZDk3MWM4NWYxMzc5YzkwNDA0YzlkN2Q0NGEwNGM0NDRmMDRmODAzM2FjOTZkYTc0NTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGF5bWVudEluaXRpYXRpb25SZWplY3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2YzVjM2I0MjRlOGExODczMTM3MjA1ZmI1YWYzNDBiMzUyZjA1OWVmMWMwZTVlZTE3ZDA5ZDQ2NjViNjI4OGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGF5bWVudEluaXRpYXRpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzgzYzcyOGRiMzgzY2JkY2NjYTVmZTk1MDQ3YTY1YjRlNzZhMGNmNjYzNWY5OWQ5ZWNlMDhlNzA4M2IxNjU0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9QYXltZW50VGFyZ2V0UHJlcGFyYXRpb25GYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNjJjOGViODNkMzBjNDJkMmMwZjZkYTcxYmI3NzViZDQxOWI4MTUyYWYwYzZhZTUxYzNlZjRmODM1MWE0Y2VhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BheW1lbnRUYXJnZXRQcmVwYXJhdGlvblJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZjVlZTNhODQ0NWE2YjkyZmZiZDJjNjkyODI0ZTY2YTBjYWEyODRjN2Q0ODc1MTI1YzYyMjc0NTJlYzE4ODNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BheW1lbnRUYXJnZXRQcmVwYXJlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNWRhNmE4N2JkZTM4OWIxMzU0YWU0YzNmMzFjNmMyNDQ2MGVjZDhjNGYwYTZkZDE0MTc5ZDRlODc5MDlhZDdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1ByaW5jaXBhbEFjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmFmYWU5NDE2ZDA3NWNmZjg1NGFiNjBkMDU3OGY2NGY3ZDMwOGJlNGFlZmI1MWFkMWExMTBkZTk3NjAyNGIwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9SZW1vdmluZ1BhcnRpY2lwYW50UmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmQyMWM1YTAwMGJlOGM0ZWVkMDE4YzE4MWZjMWY4YmNiNWM4YWQ1Zjk1M2RkN2NkYmQzZTk1ZGRiMGM1MGE4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9SZW1vdmluZ1BhcnRpY2lwYW50UmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzY4MjMzMDg4NGE4YmE5ZThiNTExN2YxZjExNGVlMzY3NzU4OTEwZTYyOWE0YjM2NWFhNmZiZTcxYjg2MmUyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9TZWFyY2hDb250cmFjdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmN2ZhODIzNThiMmI4MmQ2N2VmOTQ3YWEyYjMxNTAzOWJiNjRjMDlmYjBhNDBiNzhkZDhhYWY0NGNiMDNlMWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1Nlc3Npb25FcG9jaEFkdmFuY2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjJkOGMyNDEzNjMzZjFmZDAxOTEzMDljODlhYjRhNjJkNjRhMTY4NGMwNzhmMGZhZTg2YjEyOGVlYmRjYzg0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9TdWJzY3JpYmV0b1Nlc3Npb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZjhkMzdlNGE1MmI2N2MyMDNmOWMzMDU1YWZiZGYxYWUzNWEyMWIxNGI5MjU4MjY2OWNjMDZlYTM2MDYyYjAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1N1YnNjcmlwdGlvblVwZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg1MjVlZjdmMTE4MWJmYmRjMzVmN2YxMTgxYTIzMGY0MjlmY2RlNThhMjk3YzRkM2MwNzdjZjZkNTdlNGNhNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvU3Vic2NyaXB0aW9udG9TZXNzaW9uRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGRjNzg1MmEwZTliYjQzODc3Y2ZjMmRlMWM2NTVlNjYzYTQ4MTM4NmIzNmIwNjZiZGRkM2ZkYTQxOTUyZDA2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9TdWJzY3JpcHRpb250b1Nlc3Npb25Jbml0aWF0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTk2YjljMzJhMzA1NWI4OGFlODhmM2ZmOWE3MjIwNGIyNTRjNzBlMjc0Njc5ZTlmNGRlY2FlZWE5MmJlMTU5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9TdWJzY3JpcHRpb250b1Nlc3Npb25SZXZva2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjRkMGJiY2E0MmYxZGExMDAwZjQyZmJmOTZlNDdhMGY1OWU5MmJlZjc2OTU1NWZlNWZjMGQ1MTk3NTNjMTRhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9UYXJnZXREb2N1bWVudFNlc3Npb25TdGFydGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE2OTk0NDQwOGNiMDVmNWE2YjIxYmM4OWQ2NzYzNmU1ODgxYWJlYTQxNzEyOWU4Y2NhZTYyNmFmNTJkZGY0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYW5jZWxCZWZvcmVDb21wbGV0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA3NmZmZTE1NDViNzQ0NGI3YWVjOTYxODBjNWU0YmZjNTkwYTM5YmIzNmVhY2U4MGY1ZDQxNTYwNjdiMzkyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXB0dXJlRGVjbGluZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWFiZTE2MDZlNTEwNzk5NThjMzI5ODE0ZDZjZjFkMWI5OGE4ODhkNDYwYzBkY2U4ZjFhMDc5YzM1ZmI0MGQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcHR1cmVGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDY0M2IzNWU2YmZmYmRmMjhhYzEwMmU2ZjY1YzJhOTZjMWFkOTFjYjYwMjkwYWMwM2MwOTljZmNmM2ZhZmRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcHR1cmVGdW5kc1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjOGIzNjFiYzFjNWIxNmQzMDE2MmIzYTdhN2U3NmE0MDE4OWU4ZjhjMjczYWViY2NmYzViZDg4YTE5YmRmM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZENoYXJnZUNvbXBsZXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImUyNjZiN2RlYzA3MzgxNjA1NThmN2MwMzZhZWU0ODZkZTdjMDkxZDJjNDlkYjY0YjNhMTdjMGI5NTNmZmVhYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZENoYXJnZVJlc3BvbmRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5NjVhZWU1YzQ2ZDcxMmVmNjc2MmE5NThjMzU3MjE1YWVkYWYwNTMxODIyNzQ3MTFlNDA0YWJkODUzYzhjOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZUxvY2tDaGFuZ2VGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTk4ODI1ZDM0N2IyYWZhNzhmNzFkMmFjZjRlM2MzNjdhM2FhMGRjOTA1ZjQ3ZDg1OTg5ZjA4ZTEwNGE1YmRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvbkNhcHR1cmVMb2NrUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjhlOWQyMWRmYTg5ODVkZTNlYjMzMDcwOTU1OTY4ZTVhYmE0ZThhYWE2N2QyNDdlNmUzNjJkOGQyZDU4NGZiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25DYXB0dXJlTG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdiODFlZTRmM2U4MzlkZjYzZDk3NTZkZjE1ZjY1MTA1MDZhM2ViMDcwZjljYzY2N2M2OGExNzI2NmIwNjJlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25DYXB0dXJlVW5sb2NrUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODBlMjQxNjM1YmI0OGQwZTRiMTU0YTM2NGZmYTk0ZDMxMTI2NGFlZTc1MzYxNDE5YTg2YWE5ZWJmMjJhNDU5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25DYXB0dXJlVW5sb2NrZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZmE4MmRlYzM2MzIwM2Y5YzA4MGQ5ZGU5NGQwYWQ2NjExZTA0MWYxMmNmYzhkMDQ5OWIzNzk0OWVhMzgyZTc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvbkRldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOGZhY2I0MGU1NzgwNTMwNmJlNjRkMDM3NGVlZTU2YTdkNjYzNzYzNDg1YWQ3N2FlMTRhZTJmMTUwYTAzMjcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXF1ZXN0UmVqZWN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjAwODk5OTExZWUyMTg2YTVkOWYzZGM2ZWRmYjE1MTQyOTFiYzQ2YTI0ZDI4YWU5MDlmMzMyOTMzYzlhOWI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdTdGFydGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjJjMmExNGIyMDlkYjJjMTEwOGE4NjQ5NzEzZTgyNmEzMGY4Y2MzODRjOWIyZTcyZDQ2NDUwZGNkNDcwMTEyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25Nb25pdG9yaW5nU3RvcHBlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3N2I3YzFmZDMyMTU3YmNlZGUwMzBhNTU0ZTllMzY0YTQ4ZTcwZmVlNjdiMDI2MWNlNjAzM2NjOWQ3NzEzMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uUGF5Tm90ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkZWQ4MWU5MjE3OTA3NmY2NTFmZDA5NDc5ODIzODI0NWI2NTM1OTRlZDVlYjY1ZjQzOTVmNDRjM2E1Y2MyZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uUmVwb3J0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyMWVjMDZlZThlMTY0N2M3OTZjY2Y3MWUyN2ViYzI1ZDI5ZDcxMzBhMmRhYjk0NmNkYTNkMDNjNGRjZThkMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2hpbGRQYXlOb3RlSXNzdWFuY2VEZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjM2M1M2RjYjkxMzM2Zjc0YmYwOWZiNzU5YTRkOWMzYzg4ZGYwYmM4MjNiNGViZTVlYjg0ZTY0MzM5YmQwZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2hpbGRQYXlOb3RlSXNzdWVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk0ZjYyNGZiYjM1NDk1YjQ0MTQ5NjQ1ZTE0YzA1MTM1OTI5YmFjOTY1MDJkZGMzYjg4NTBmMThmZGU2OWVjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9Db21wbGV0ZVBheW1lbnRSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OGYwMTVjNzYyOTQ0NzgzOGFjYWIwZjBhNzc2ZjJhM2M3MzA4ZjUwOWNkMmYyMTYxMjMwZDcyMDljNmQ1NWFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0ZpbmFsQW1vdW50UmVzb2x1dGlvblJlamVjdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDMwNzQwNmEwNDliMTc3NmRkMjBiNmE5ODJmNGU2YWI5ZGZjNDhkN2IxZTJkMDBkMjBhZDM1NDQ3NTg3ZTJmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GaW5hbEFtb3VudFJlc29sdXRpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OWM0MDczNDdjOTY5ZDAzYzJhOTE1MTA5ODVmMGE2YzdhYzBiZjY5Y2Y4M2I4MzhkMGIwNTQ1MmEzOGQxNzI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0ZpbmFsQW1vdW50UmVzb2x2ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNDhiZjJmY2IzYzllODEwZmRkZGFmY2U3ZDI3ZmU3NTY2N2NjYjNmYjc4NTNiYTMwOGE4NWVmMmY1YzE5NjJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0Z1bmRzQ2FwdHVyZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWE0NTdhMjA0Y2NhZTljYzQyMTNlYWU2MjRlMjJhZTliNjExMTU2MDA3MmMzMGI1MGU3ZDY1MjY4ZWY3OGE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0Z1bmRzUmVzZXJ2ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYzViOWQ1MmE0Yjc5MWY2NjE4ZTgxNzZjZTFjYmJjNjA2NTAxNmI3NGU4MmYwY2NlMWNjMmJjMWUwODRmYjY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0Z1bmRzU2VjdXJlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImJlOWEwOTVhMjI3OGNhZjMzYzQ5YjBhZjA5ZjM1NTljYmRjYTlmZTUzZDc1YzM1ZjlkNGRmYTk5MmU0OWRhZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvRnVuZHNTZWN1cmluZ0RlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI1YjE0YTQ3NjE4ODUxMjAyZDY5MDE0ZmY3ZTI5NTA5ODdjNTQ0YTIzZGQ3ZDYzOTAxZWY3MDcxOWY1OWRkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GdW5kc1NlY3VyaW5nRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWYwMWFmMGM4YTY4ODY3YmYyYjA1YmM2ZWIyNGFiNWVlNGE0NTc0MmEzZWYxZTA3ODk4YTllOTU1MWIxZWIxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9Jc3N1ZUNoaWxkUGF5Tm90ZVJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2ZGE2YzljM2E2MjVhNzRhYzg1Yzg5MDZkN2M0OGViZmFlYWM1ZjJiY2YwYzQxNWEzYmNjYzA4NWViMzE4YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvTGlua2VkQ2FyZENoYXJnZVJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0NTdjNmFiZDA1OThjMDc1MWE3YTlhODg2YTE4NjVhMzgzZGNlMzlkODU5MzAwYTVmNDBmMjZhMDA4NTI5ZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvTGlua2VkQ2FyZENoYXJnZWFuZENhcHR1cmVJbW1lZGlhdGVseVJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzMjM1Mzc4Mjg0YTc3OGFmMmYwY2YzYjFmZmRlZDIwZDNlZjRlNzFmOGNjNmNkYzc5M2NiNzg3NTgxODY2NzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvTGlua2VkUGF5Tm90ZVN0YXJ0RmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDQzYWI4YWNhNjY4MTljODFjZTJhNTY0ZjAyMzQ2MjEyZjRkZGQwM2U1Y2ZjNTNjNmY0MWYxNjZhNGY4NTliMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9MaW5rZWRQYXlOb3RlU3RhcnRSZXNwb25kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZjJiNGVlOTk3YWMwYzlhNmU4ZWIxYTRlNDJkNGUzNjVmMjVhNTU2Y2QxMDQ5YTg2YjZiZTJmYjNmMTZkNjY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0xpbmtlZFBheU5vdGVTdGFydGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjAzNGQwYjdkNGFhMTQ5M2E3OWMyY2JmYmQ2ZThjZDVmYWQzMTg1Y2U0Nzg3OTBkOTI3MTc0ODY3MzMxNmYxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9NZXJjaGFudFRvQ3VzdG9tZXJQYXlOb3RlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzk0MTg5OTIyZDEzNzUyY2I1ZjA3YzY1ZWQ1YzczMWFmMTUwMjJhYTMyMThlZjI1ODE2YzhkMTI2NTkxYzA2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU1NTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZThiNWRjNjk0MzcxNzM3OTM5OWM0NTNhYzVjMWZmYjM5NDBiMWVjMGE1YTdmOWQxODQ2NmE2ZGVlZGE3ODFkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlQWNjZXB0YW5jZVJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjZGFmZjQ4ZjJmNzU4ZTdmN2U5N2UyMjc4Njk3ZGQ1ZmQxZjcyOTc2NjA4MThiODQxZmUyODI5ZjRjMThiZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZUFjY2VwdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M1ZGIxOGRhNTZiYWNlNDFlNmQzYmIzOGUxZWRmNTFmYjBiY2QwYmUxMTg0NGYwNWYwZDE0NjgyOTkxM2UwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlQWNjZXB0ZWRCeUNsaWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkYTJkMmRjYmQ0MjhhNTNhNjM2MTdhNjQ4M2FkNzNjNWZlNTFhMWFjNjRjYTY4YWRiMDI2Yjk5MTE4ZDhiMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZUFwcHJvdmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWYyYWQ2MTc0OTNlNDMyYTFlNjgwMmM3YzE2NjdjZGY0ZmJmM2IzMzMzYTQ1YWFmMzhhZTg3NzM2YzA3YjJjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlQ2FuY2VsbGF0aW9uUmVqZWN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YmY5ZDNmNDRjMTFiMTQ2NWJjNGI3MTAzNTZjNzM2MzgzNWVkNDIwYjI0MGFlMWE0NmU1MjZjYTYxZjYwNzNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVDYW5jZWxsYXRpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NGFhNmIwODcxMGU1MWNiOGRiZTFiMTU2NDMxMWU2ZTVmYzhlNzdhN2VlZWE5YmMwM2MyYjQ2NjUxMjA4MzMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVDYW5jZWxsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMmQwZmU5YTE5Njk0ZGQxZWY0MTc5MTRkZmQ1MWQ0MjIwYTZkNDE5ZmY3MDZjMmVlMjc5ZDI1ODI2OTU5MmNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVDbGllbnREZWNpc2lvbkRpc2NhcmRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0Mjc5MzdkYTQyOWUxYTFjYjk3M2IxMWM4ZDk5ZjQ0MjNiNTRkNmUwYmJiNmFiNWJlMTE5OGE5MDBiZmQxZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZURlbGl2ZXJ5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyOTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBlYTZmYjE3NzVhMTc1ZmU3NjdjNGUyNDgyMGYzMmI1NTk5Y2YwNjgxMDAxNDBmN2M3NWYyZGUyNmU3MTE4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlRGVsaXZlcnlGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2YwN2Y5NDZjMjIwZjI3ZTA4ODQzNWU2ZjFiYjk1MWNhOGI3ZTZjMzE2YzMyOGJhNjgzZDE5MjRkMTEzM2ZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVSZWplY3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkNTRhYzYwZThjNDBkYmFkNzA0MjE5Y2U4N2NmNjM2NjdjYWFkMmQzYTdiMmRkN2Y0Yzg0OTVjZjE4MjQwNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZVJlamVjdGVkQnlDbGllbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGM2YzM2MTU0OWVmMzUzYzRkN2JkYjhiNDMyMDI2M2EzYWJkZGNlYWFiMDZhOTc0ZjYxNTNkMDcyMmUyZDE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheWVlQXNzaWdubWVudENvbmZpcm1lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4MzI5MjE3ZmMzOGU4YzE3M2M5MWE5ZDY0ZTkzZDlkYmM1MDVkMzcyNTQzN2NmYzliZDE2ZWY4OTYwMjVkMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5ZWVBc3NpZ25tZW50UmVqZWN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2U3Y2RhMjliZDQxNTQ1YzIwNzZhZjk3OGY3M2Y4OTNkYTRiMjkyNmZmNmUzOTdmNTc2NzIwOWZkYWE4Y2QyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheWVlQXNzaWdubWVudFJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImIyZDRlNGY2Y2Y5MzY4ODMzNjM2MTI3YWYyODQwNTZkZmQwMzIzYTZiY2QxYTEwMDc5ODYzZWVhZTcxZWViMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENhbmNlbGxhdGlvbkRlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWU1NGViNzM1NmE4M2Q0NGYzY2M2YWU5MjljOTg0YzVjNjhmMDEwNTY0MjRiY2FmYzAxYzBjMWI0YjRmNjM5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50Q2FuY2VsbGF0aW9uRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmZjMmU3NjZhYjJkODk0OTk4ZjFmNTU3Y2U0ZjA0NWJiOWMwZTdkNmI1NzMwNjliMmI4MjFiZWFiYWVkYzA0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50Q2FuY2VsbGVkQmVmb3JlQ29tcGxldGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3MjRlOGEyNGZkMjQyOTdkZWIyODlkMTg1YjIwMzUwNjkwNzFjOTVhOTc4MDc4ZGE5OWM1NjJiMTRmNzAxMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENvbXBsZXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljZDM5ZGM2NTgzZmI1NzZkZDYzNjBkMTZmNWUzN2E2OTZhMjY0ZmIzZmFhNDk3N2FiZjM4NTI3NzM4YjdiMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENvbXBsZXRpb25EZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1OTU5NWQ3MThkNjRjM2RmZTM2MWUzODQ3NmQ3MTdkNThiNDQyMDlmNzAwZjY1OTRiZmY0YTQ5YTQwOTQwNzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENvbXBsZXRpb25GYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDYwM2YzNmU3YWEyNjM1YWUxMGRkZTA1MTcyOThhYmM3NWE3NGFiMGFiZThmYmIyZTk0YjVmN2Y5ZmI2NGMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0aW9uTG9ja0NoYW5nZUZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhZjQ4NTg5MTZjN2U0ZGM2MDQ4MGE0YTU0Mzk2ZDYxNDU5ZGUwZjA2ODBhYTM0OTY0ODFjNTFjOTc2ZDRkYTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENvbXBsZXRpb25Mb2NrUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGFmNzYzYmNhYmQzOGVlZmM0MWU4N2JlM2NlNzkwMDJjNDliMGI4MTBkYTk1OTZiZWNjZjUyMGU2YmU0Y2QwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50Q29tcGxldGlvbkxvY2tlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjMWRlM2FiMzA1NDMzYWE2ZWJiMGViYjk2NDUwMjM1YzI0YmY2ZTc1MzNmOGQ4Mjg3YTliYmQ3ODc0ZDcwMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENvbXBsZXRpb25VbmxvY2tSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZGZiOTlkODBiNzUxMDNmZjI1YTAxMzYxODc2MGE4YzQxOWY5MTJhOTQyNThiYjBkMmNkMWEzYTQxNzFmMzRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0aW9uVW5sb2NrZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDZlOTQ1NTc3ODEwYzliZDZjZTc0MTM3YzJlMDRhZDU4YTU5MzUxZWNlYzRiYTAwYmY4M2Q4NjQ5MzhkZmY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRNYW5kYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1Nzg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTg4YTIyYjA0NDJkYjg5NmNhOWFjNzVhMzc3ZWJjMzUyYzg2Yjc2MmU0NjI1MGE3ZDhjNTg4NWY5MTJiOWNiYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50TWFuZGF0ZUF0dGFjaGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjA5ODg2NDAyZTc5M2M0NTMxYWRhNzQwNjk0YTY2MTBiODNjNmZjYTU4YjQ0N2NmMmJmZGJkNGY1YWFjYmY0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50TWFuZGF0ZUF0dGFjaG1lbnRGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWRkNjU1MzVlMzA3MjUwMmZjOTI2NmM5NTUwMzEyZDU0YjY2NjFhNmEzNzRiNTUwZmIxZTkxMGYzNmFkZGE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRNYW5kYXRlU3BlbmRBdXRob3JpemF0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczZTdlZjg2YjdiNWY1OGE1YzRmNmJjMzQ5MTQ4MTAwZWEzYWJmZGE4NGU0MWFlOTg0NWJmZjcwZWEwNTJmYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudE1hbmRhdGVTcGVuZEF1dGhvcml6YXRpb25SZXNwb25kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDE1NDc2MTZlZjE5Njg1YzUwOWMyMTExODZjMjk2NGQ0NzI4YzJhYWU2ODg4NDE2ZWMzNGNjNDYwOTA0ZWFkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kU2V0dGxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzViZTFlMzM0YzkxMTQ0Y2U4YzNmOGQwMDc4OTFhNTMzZDQ0MzBmN2VmZTcxODUyOTdjZDVmNmJlYWI4Y2U1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRNYW5kYXRlU3BlbmRTZXR0bGVtZW50UmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwYTdiN2RiODQ3ZWU4NjVmMmNmN2Y0ZGM3OWU4NTIyNGE0NGYyNzYwNWI2YTE3NTA3MzIyM2FiMGY3MWQ5YWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudFJldmVyc2FsRGVjbGluZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMjVhMmIwMTkzZGUxYWQ0NGUzMTc5OTY1ODU1OTQ3YTcxMDAwYWFiNmU1ZTU5OTEyODhmM2FmMzhjNmQ3YWE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRSZXZlcnNhbEZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJlOGVmMzMxYWQ3Y2M0MDAwZTEyNGY1NDJiNWI0NzNjZTA1NjA0MWNhN2U5MjllNmUxMDNmYTRkN2IyNzg5NzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudFJldmVyc2FsTG9ja0NoYW5nZUZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNlYjMxODk4YzcxODkwMzJhZDdiY2ZlODY1MmQ0MjE0YzNhODM0OGY3MWE5Yjc5NjljYmU2NDY0MTUzNDljYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudFJldmVyc2FsTG9ja1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhOGZjOGQ4YjY1MjVkNzM0YTRjYzdiZWZkODZlYjM2ODI4MTUxN2M1MTNkMjVkMjFhNmZlMjc5ZGI3MjM5MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudFJldmVyc2FsTG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTg1M2EzNzc1NDhmMTIwY2I0ZTdmMzJmMTUzNmVlMGMxN2E4NTAyOTNhZWZkOTgyMTlhZTM5MDliMjEyMmNiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50UmV2ZXJzYWxVbmxvY2tSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTE4N2VmZGM2YzhmY2Q5OTg1MDdjYTNjOWNhNGQxNWY3MTBhMGYzN2Q2ZWE2NjM5MjhkOTY5Y2QyMTI4MGFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRSZXZlcnNhbFVubG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWEwZGZmYTRhODdlNmQxYjlmZGQ5NGM2NzMyZTQ1N2M2N2U3YzJjZGYzNTMyNjQwZWYwM2ExYmYzNWRhZGQ3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50UmV2ZXJzZWRBZnRlckNvbXBsZXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWZlOWQyOWY4OWJhNzFlMGRlMDQzNDgxYWI3NWIzNjJlOWJlYjI3NGY3MzYxMjEwZmNmYjFkOTZmYTMwZGVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1Jlc2VydmF0aW9uRGVjbGluZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNmJkMzA3NjI0Y2VhYTA4NGM3YzY1OWIzZjg5ZGJlNTIxZGFlYTRlZmI1YzUzZmYxOGE5YWM4NmRiODliMjRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1Jlc2VydmF0aW9uUmVsZWFzZURlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY2NGY0OTdmY2I4ZjdhNWFhMDU5MWY5MzdiOWUyMGUzZWVhZTRkYzY2NWIyYTQ4YzlmZDBjZTgwMDI2ZDJiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXNlcnZhdGlvblJlbGVhc2VSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjVlZDA5NWZkMTgxMWJkNWViMTE3NzY2NWQ2NGI3NzAzYzkyOWQ4MTU0M2QzMGI4OWE0YTkyMDRiOWVlOThiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1Jlc2VydmF0aW9uUmVsZWFzZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTFiMDNhOGI1MGJhYjhhOGM0ZmI4NmIwYWQ3NWQzMjM4OWY2NDRlODBkMzYyYWE1ZjNhNDNhNTJjMThlMTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1Jlc2VydmVGdW5kc1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwNTRjMGQxZGU2YzUwYjllZDQxY2NhNjgzYjdiNmQ5OGZmODM0MzJjZjIwM2E2ODRhNjY4NzFlZWE0NDdiYmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUmVzZXJ2ZUZ1bmRzYW5kQ2FwdHVyZUltbWVkaWF0ZWx5UmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGFmNGY5YWVmNWExMmEwNDNiMTE2MGUwN2IxMTA1N2U1NWM5MGE2ZTg5N2IxZmUzMzIxNTU2OTAwNWIwNDZmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXZlcnNlQWZ0ZXJDb21wbGV0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU3NTJiNjUwMTQ1OGM5ZDcxZTJlY2U5MDBlNzgzNWMwOWE5NjRjMjk0ZTg1ZmEyODUwODY0M2FhMWY3YzYwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXZlcnNlQ2FyZENoYXJnZVJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjYjYzMDY2NDIxOGQwMWEzZDZjMjU5NGNhYjAwOTk5Y2VlNjE4M2VlZjdkN2YzMmVjZGYzOGQxNDAzNDRlZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUmV2ZXJzZUNhcmRDaGFyZ2VhbmRDYXB0dXJlSW1tZWRpYXRlbHlSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMWFkNjUxY2FjMWY4OGUzNDY1MWQ4NjMxYTAwNTNmOWMyOWVmNmUxYTI0MzAxYTAyMzE2ZGQ4MzkyMjQ5NzJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1NlY3VyZUZ1bmRzUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDYyODgyMjBmMmMyODQwOGNiNzEyZWM5YzAyN2FlNzkxMTg1OThmZGRlMTZiZmUwNTM2ZWVhZTliMjZhZDEwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9TZXR0bGVtZW50QW1vdW50UmVqZWN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NGFjZjVhMmMxMjYyMzBhMjc1NmE0ZWI4NzNiMzU1MzhlZTk2YTNhYjQyM2M5MWZjMThkNDRkODI2Njc4YWNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1NldHRsZW1lbnRBbW91bnRTcGVjaWZpZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTMzN2Q3NDQzZjVhMzZlOWZmODk5NmFjM2RhZGM4NzY2ZmI0NzE0NjhiODNjMzMzMjVmOGJmOWFlMmRhZTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1N0YXJ0Q2FyZFRyYW5zYWN0aW9uTW9uaXRvcmluZ1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlZjE0YmY3ODgxNjA2NWU2MzRmMGYxNjExZTI5Zjk2NzhiMmEyZGZkMzExNjI1MzM0MjIwNjlkNjhmOGE4MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODc2ZmEyZmYyMzU0NDRlM2FlMWZiMmUwZDZiNGRlOGU5YWU3ZTlhZTAwOWIxZWNkM2M4NDdhZGNlYTM3YTcyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVMb2NrQ2hhbmdlRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDg4NzRjY2FjNGJkYzkwMGVmMjdjNmE5NTI2MThhZWYzYTY3OTZiNGJiNmQ4ZjJiZTg3NDM5Mzc3MmJhNjQzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVMb2NrUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTNlYmE2NzBhMmIzMDYxMzIzMmZlZjdiZWY3OTFiN2Y0OGEwYWZkNTgyOTRhZWQ3Mzk4OTE0NzViZDQ2YTQ4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVMb2NrZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMmNkYjg4M2IwNDZiMzc4NmVmZTQyNTM0NzAyMzU2NjE1ZTU3OTk1MzNmMDdkOTQ4YzgyZWY5NjdlMzZhNjlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZVJlamVjdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGQxYTA0YTU5Y2Q5MTVkOGMwYmUxMTJmNGVkNWQ0OGQ5NjcwNjk3ODZhOWZkM2U4MjQ0OGE5YTI4YTU3YjM4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjhhYzczODY1OTkwNjZhYzFhMDQ1OTcyMmMzM2RjMTNlZjU0M2YxYjVjMzMzZmQzNDE1YmQyNjE5MmY3MDI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZVVubG9ja1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlM2Y1MjY5MzQ1YmYzYTM5ODE1NGM5ZWQ5OGYxN2Q5M2UyZDhhZWRiZjA3OGJhYjk3YmQ0MzAwMDljZWJhMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlVW5sb2NrZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTE0NWE5ZjA3Mjk1M2JjMmEwNWYwNDIxYjA0NzRmOWViNDg2Zjg0Y2MwODdjODIxZmUxYzRhNDQ1Zjk2MWM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwM2RlNWI3NmJlMjY4ZmU2NjhjYmFmNDI5MmU1ZDM4MjFkYWQ5ZTVjNDZiNTAwNzBhYWIwMmIxY2I1MGVjYzFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uSWRlbnRpZmljYXRpb25GYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjk5MzNiN2FkMzUwY2I1NjljYTlkZmMzZDBlOWM3YmY4NGExZGNjNGM1MjM3MmY1ZDExZTc4OTI4MjBiMjkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uSWRlbnRpZmllZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiOTBlNzk2OTRkOWRjZWJiZmUwYWVhYTJhMzlmMjgyMmFiODIyNTRmMmFmYmJiNDE0N2UwMDZjNzFjNThhOGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25Jbml0aWF0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOGE1M2E0OThiNWEzOWQ0NTFhNWM2YWYxMGFiNjI3ZTY5ZTA1ZDc3Zjk2OGQ4YTFkNjNiNWJlYTQ3NDU0OThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uSW5pdGlhdGlvbkZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5NDRlNDM1OGQyODg2NGVkMjExZjkxNDE0MDAyYzM1YjZkNjhhZWM5NzQ2MTc4YWY1YTgxOTYyMDg1M2U1NGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25TdGF0dXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZjgzNjkxZmFhMGViMTBlMDdmOTljMjNjYmYwOTYzMDVjYzViOWE3YjgzNzBlMjA4ODUxM2ZlZjAyMmY3Y2YwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9TZXNzaW9uSW50ZXJhY3Rpb24vRG9jdW1lbnRTZXNzaW9uUmVmZXJlbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5ODljMmY2ZmM1YTczN2RmYmY1OWRmMGJjZjA2MjlkYTVmNTM1NWZkMjhiMWMwZjQwODYxNDViZDQ5MTYyMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9BY2NlcHRDaGFuZ2VPcGVyYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTljZTlmMmI4N2FkYjhhZmFhZTQ5YjMzNThjMGJiNGYxMTk1YTE0MzE1ZmE2YmRmOGVkYTcwZmQ3NTRjN2UyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvQWNjZXB0Q2hhbmdlV29ya2Zsb3cuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjQzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTU4YTUxYmU3NWNlMDY1MjlkMWMyOTk4NDVmNWRmNmM4ZDI2OTU4YTg3YTg4YTQwMmIxOTY5NGUyZTIxYmRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvQ2hhbmdlT3BlcmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjMyMWRmYWVmZjA2YWVkMWFkNmFkNmY5MGJmNjJmNTZmOTM2YjQ5NDA4MzhmOWNmYjA1YTA3MjNiMWViOTA3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0NoYW5nZVJlcXVlc3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWUyNjA3OGRlMTIxMDc4YTcxNjNmZTg3OWU1MGU0YmI0N2VlNjc2MTcyZmM0ODFhZjYyY2NjNmY1MDJiMmI1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0NoYW5nZVdvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyMDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGU2YzY2N2Y2ZmNlMDgyMDI0NzU2OGQxZmI4ZWRiNzM2MmQ2Mzg0NGQzNmI1MDI3ODNiOWFhZTA2M2YwNWU4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0NvbnRyYWN0c0NoYW5nZVBvbGljeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGIxNmZmY2IyMjQyMDUxMmM1OGMyMWFiNjYxZGExMGZiZmUzYjFhNGY5NjI2NDhjMmJmMTViYTAyYjIxN2MyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvQ3VzdG9tZXJDb25zZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNWQxOWZjNmRlMDVkNWQ3MjUyMTA3YWIyMThlMTk2YTE0NjllNzI4YTA5MDIwNTE4MjVhZGM1ZTk5MmJlNWY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvRG9jdW1lbnRTZWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiMzAwMzk0ZTQ2OWFkNmE1OTBhOTIxNWY5OTc3NjA4Y2VhYTA2YzI3MjNhNTU2MzY4ODNiNjQyZTk5ZWY5ZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9Eb2N1bWVudFNlY3Rpb25DaGFuZ2VFbnRyeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMGZiZDdkYTJhNjNlOGNlYjZmMTkwYmViYzZjMjEyZTEwMDQ1ZGRhZjMwYzFiYTY1NmFkZTEwOTczZjY0YTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvRG9jdW1lbnRTZWN0aW9uQ2hhbmdlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzNhOTdlM2UwMGU2MDE2NzdlMzk1ZTQzODY5N2JlN2Y5ZDE0Yzc2M2Q4MDRmOThjYWI3NDFjYmEzNWQ1MmJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvUHJvcG9zZUNoYW5nZU9wZXJhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzOWU3ODM2MTRiYzQ3YzEyNTEwNGFlMjA1NGMxNGZlNjk0OTg3MzBmNGZmZTExZmM1MzgwMmM0NDM0NGE3NWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9Qcm9wb3NlQ2hhbmdlV29ya2Zsb3cuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmM2ZTAzZmQ1OTU3NzhiOTk4YWVjMDA1NTE2MjM4OTU4NGFiODUyZWMxOTI0Mzk3NDdhODBmMDhkYzc5MzM3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL1Byb3Bvc2VkQ2hhbmdlSW52YWxpZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3YzIwNmFiMzVkY2I2OWE2MzYxOGQ0MzMyZjAwMWMwZDFiOWFiNjM5OWU5MGM0Yjc3OWJhNmJiMTJhMWQ1MjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9SZWplY3RDaGFuZ2VPcGVyYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYzQzZDFiZGJhYmZkMGIzNGIzMWFkZDU0NmIxYThlMGE5MjEyZWMyYzM5ZDdiMjNmZjgyMmYyYTU5OWRiMzU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvUmVqZWN0Q2hhbmdlV29ya2Zsb3cuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTJkOTU1YjQ3MmE4YTk1OWU4Y2Q3YjkzZTM2YTljMzI3ODY1Y2E0NzY4N2Y3YzNiN2VlYzg2ZjczNDlkNjczOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vbWFuaWZlc3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjIxNjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYzRkMTFmOWJhNmFmMGU5Yjc5MGRhZTZjZWVhNzBmM2M2ZmM1MTdhNGQ2YjAxNjZhODI1OWU0MTExNjQzOThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL3JlcG8vQmx1ZVJlcG9zaXRvcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUzNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWU5OTFmN2ZlZjU1YWQ3YjMwYjU4ZDhhMmRlNWYwOWZiYzlmYTBkMGUzNGM3ZTI1OTg4NWI0ZjM0OTAyNGYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL3JlcG8vQm9vdHN0cmFwUmVwb3NpdG9yeUNvbnRyYWN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYzdkZGNjMjQ0YmEzODkxMGFiYTllNjU4ZWNmYjNkNjEzMWIxMzUyNmQyYjZhYWM4ODkyOThkYzNkM2ZmZjM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL3JlcG8vQ29vcmRpbmF0aW9uVjJSZXBvc2l0b3J5Q29udHJhY3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk4NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYmE5N2E5OWFkNjZiZTI3NWNlMWI3MTdjODJlYzYwZDRlMjA3NzI2MzA4MWJkNjBhOTc5OTdiZDEyZmI0ZTI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL3JlcG8vUmVwb3NpdG9yeUxvY2FsVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjI0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhYzk3NDE5NzIxNDdhOTM3MGUzYzE5NmQ4YjU2YjY4MDMzMjE5MWM1ODFiMmFiZWU1ZWM4ZTRiY2YzZjdkNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvcmVwby9SZXBvc2l0b3J5VHlwZURpY3Rpb25hcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3ZmJlZDYxOGQ1NTQ5MGY2ZTc0ZTliYmUzM2ExNzZlODYxYTg5OGI3ZmExZGE5ZGQ0NGM3ZmIyNTEyYTQzN2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0KICAgICAgICAgIF0sCiAgICAgICAgICAic2hhMjU2IjogIjYwN2Y0NjBmMjhhYThlMDJiMmM0MmYxN2Q2ZmVjZjg2MjRiMWViNTRjMjQ2ZDZlYzgzMjVhN2IyOWUxMjY2NzEiCiAgICAgICAgfQogICAgICB9LAogICAgICB7CiAgICAgICAgIm5hbWUiOiAiYmx1ZS1sYW5ndWFnZS1qYXZhIiwKICAgICAgICAicGF0aCI6ICIvVXNlcnMvcGlvdHIvZGF0YS9ibHVlLWxhbmd1YWdlLWphdmEiLAogICAgICAgICJjb21taXQiOiAiYzNkNTg1NjEyMjBlNmRlNmJlNmUzMDJjYjE2Nzk5YzFhMWI1MTU5ZiIsCiAgICAgICAgImV4ZWN1dGlvblN1cmZhY2VNYW5pZmVzdCI6IHsKICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBLTI1NiIsCiAgICAgICAgICAiaW5jbHVkZU1vZGUiOiB0cnVlLAogICAgICAgICAgImZpbGVzIjogMTQ3MywKICAgICAgICAgICJlbnRyaWVzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmN6LnRvbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY3MTdmOWE5ZTM4ZGYwZGVhNGI1ZWVlYzVhMDI2NGMwNDkwODU2ZWY0YzI2MWMwNTNhMDY4ODNiYTNlNjlmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5naXRodWIvc2NyaXB0cy9wcmVwYXJlLXJjLXJlbGVhc2UuanMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNmYTY5MjkyZTI3OTc5YTY1ZWY1YjY1NjlmNTUwNGI3MDFhZGE0N2MxODk4MjNhZDIyZTZlMzVhYTBhMmY5OTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuZ2l0aHViL3NjcmlwdHMvdmVyaWZ5LXJlbGVhc2UtcmVhZGluZXNzLmpzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjgyMzhiZTVlNjlmYjNlY2RiOTA1NjgxMzQ3Y2VhMDUxYmJkYzhkYjk1ZjdmYWZkNWY3YWQ1NDZkNmI1MDE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmdpdGh1Yi9zY3JpcHRzL3ZlcmlmeS1yZWxlYXNlLXJlYWRpbmVzcy50ZXN0LmpzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlN2IyMDYwZWUxNzc3NjY3NDQzYzIyMDEzNjI2NTI2YjhmOWYxMDkzMjE2ZjEzNTBkMTNmZTRmNTE0MTBiNTc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQ1OWNjYzlhOGJkYTFjNTdhNjU5M2I5YTIxNjQ1NjQ5Y2FlZWZiYWFiNTIyYzhlNjg4ZDYyMWI2Nzc5MGI3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VGYWlsdXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhMmY0YzFkMzkxZjllOGY0OGZjNmFhZWJiMzQ1NTdjYjk1MmFhMTA1NDAxYWYyMTgyODliMmQwN2QxYzc0MTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbmZvcm1hbmNlRml4dHVyZUV4ZWN1dGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDBkYzM3MjNmNjI2ZTMyMjExZTBiNWU4NmZkNzllMjJiN2ZiMWViZjA4Mzc3ZjJiNGFlNDEzM2I4OGM2N2ZhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VGaXh0dXJlUGFja2FnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc5OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmM4MWVlYmYyZTM3NWE3MWEyNTIxYjBiZWJhMmEwMTg4MzE0YWE5MWJiNjcwNWU1MDAxMWNkZmIwN2VjMDU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZUZpeHR1cmVQcmltaXRpdmVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEwNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTU3NWQ1M2VkYzE2Yjk3MWRkOTIzZDcxMjllOWFhNjE1YTQzNjQzY2EwYWI3ZWU2ZTE0NTVmNGQzNjczYzc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZUZpeHR1cmVTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YWVhMjkyN2Q0MDFlNjJlOTZjZDRiNDhjYWQ2NTZkYmI4NzhmY2Q2Y2UzZTZiNjMxMTFjNmM3NDE0ZmZiMDk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZUZpeHR1cmVUcmFuc2Zvcm1hdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODU4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxZTkzNDIwYTIwM2Q3NTkwYjc1NGZiY2ExYWRjMTc2NWFkM2RhYjA3MWQ3NGVlMzg2NDg5OTAyZmQyNGVhNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbmZvcm1hbmNlR3JhcGhPcGVyYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ5OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OGQzNjRiNzA2NmRiYzYxMWIxZDAxOWI5MDcyZjFkZmI2NDU3ODA5NGFkOTkyZTQ3ZDNhZDI0ZDRkNWRhYzhlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZVByb3ZpZGVyRW52aXJvbm1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2YjNmYTg1MWRhNGZjOGExMjM2MjM3NzRkMDQxYjJmOWRjZWY2ZGZkYmM2MGYwZjUyNGY4MzcxNmVlNzljOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbmZvcm1hbmNlUmVwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MjUxNmQyMjJkZThiYTgxNDUxYzVlMDY2Zjk0MTExNjA0Y2M4ZjQ3MDg3NDY0ZDgwMjY2MGZmOTM3YjkxNzcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZVJlc29sdXRpb25PcGVyYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNGNhYzlkNjA4ZTUxNmEyOTdhNmI5MmY1NjhmZmRlYjUxOWVkMzcyYmE5MjcyY2RlMjhlZDAxZGNmNjlmMjgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZVN1aXRlUnVubmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlYWViMjdhNTk0ZDJmMzYxZmQ5ZWY0NzYxMzM0ZWYyZjkzYzM0ZDFlODM5ZmUyNmE1YWEyMzQxZjM0ZGI1OTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbnRyYWN0c0NvbmZvcm1hbmNlRmFpbHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTUzNDBjM2NmNWQ0ZDY3NzI0MWYyNTc4MTAzYjU1MWU5YzFiMTAyMzU4ZjY3ZWQwOTQyNzljZDE4MzgxZDhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb250cmFjdHNDb25mb3JtYW5jZVJlcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NDE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWFkOTU0OGM4YjJlNDU3Y2IyMDY2N2I3MjVmNTVhYzUwNzQ4YmYyNzBkMThiMDk3MzExMTZlNzRiNTkyNjhhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29udHJhY3RzRml4dHVyZUNhdGVnb3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkMTk0MWI4ZGUyM2E1OTVhZjcxMjg1N2M1NTkwYzg3MTkyOWZkMjY5YjQ2NWM3YmY5NjdlYWU5ODAyYjM1ZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbnRyYWN0c0ZpeHR1cmVQYWNrYWdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYzg5YmIyYTBlYWUxNjFkMjVlMGZiZDExMmEwMzRhNGRmZDJhMjg5MjVlNzg2MDY0NTFjMGM0NjVkOGIwYzA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb250cmFjdHNGaXh0dXJlUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0YWMwODI3MWRmZDI2ODJmOWFjMDBhY2Q5YWNkZjUwZjYzOGEwNTQ3NjVjODlkMzJiMDVhOTNiM2YwYzAxNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUZpeHR1cmVDYXRlZ29yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzlkYTEwOTkzMDk3MGE2ZjI1YTU0Zjg0YTJjMzBlOWNjMmY3YjQ4NWM3NmU5MzQyYjVjZGEzNTE1MWI3NzRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVSZWxlYXNlQ29uZm9ybWFuY2VSZXBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQ5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmNzQ0NzIwMjY1ZjQzMWNhYTE3NmRmYTUwYjc2MzAzMzg1MDNkMWM1YzM0OTQyNTIzM2YyMTQzNTQ2NDc4NWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQ29uZm9ybWFuY2VSZXBvcnRDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTUxOTE5MjE3NmE2MmQ0MmNhZmMyNmQ3MjRhNTQwZDZjZjNlNDEwNmFhMWQ3ZDQ4Y2JjMGQ5YjYxNDkzYmFhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9MYW5ndWFnZUZpeHR1cmVSdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTkzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhYmQ4MGM0MDUyNjE0OTExZjI0ODkzNmIxZDc0MTg0MGJiZDVkNWNmNjA4ZWRiZjAxZmMxM2I1ZDFiYmNkNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiOGFjYjNkN2RkNjk5OTcyMzE0ZWZkYzM3ZDliODAyYjY2MDcxODUxNDY3N2RkNjc1NTI5NTgyZDVkZWMzZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jbGkvUmVsZWFzZUNvbmZvcm1hbmNlQ2xpLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwYTljYWQ4Y2M0NDZmYWMwNmY1MGJiNjE1NjNlODM2MDE3Y2I4Y2Y3OTQ2OWViNjNlYjZiNzVmNmFkM2Y0NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jbGkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImNkNjkzYWZjZGUwMWM5ZDkxZmQ0Y2VjZmZkZDM1ZDc0ODQ5MWFlYjBmNWEyY2RiMGFlZGIwYWZhMzBhNDJmMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ2xvc2VkQ29udHJhY3RzRml4dHVyZVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMjQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWFiOTc4Y2UwMzg0MjExNDNmZDFhYTlhYTUwYzRiZmYyNTZhOGYzYTk5OWI0MzhkYTM0YTgzODUyMmIwN2RlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNBc3NlcnRpb25FdmFsdWF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzU4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxNTA2NDgwNTQzNDQ5N2VmZmIxYTBiMjk1Yjg2NGI2NTVmMjdmZWMzOTkxOGYyZTJmMjJmNDJjNGRlMzEyNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzQ29uZm9ybWFuY2VQcm9qZWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNGZmODk5NTU3N2MzZTU1ZGY5ZjgxM2M3NjEzYmNkNjczYmI4YWY2ZTFiNDViMmY3ODExMjliNTdhN2MxOTU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0NvbmZvcm1hbmNlU3VpdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk4ODNjMGM3ZDA1YTAxMjBiNzg0MzY5NTQwN2Y2MDQ3Mjc4ZDgyOGI2ZjQxYjdmY2NmOTdjNzE0YjdmY2VjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNGaXh0dXJlQ29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlY2UzODVmNmY2ZDUxOWVhNzZlNTU0ODlkYjY3ZTc0YzliZjBhYjA5OGYxNmUzNDYyZmNlZDMyMzY4NzQ4MDI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0ZpeHR1cmVFeGVjdXRpb25FbmdpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDIwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0NTA0Y2Q1MmE0MmFiZTY2Yzc3ZTUyMzNkZTFmZDZiZGRiMmIwNzU4NTIyM2EzMTUzM2RkN2Y5OTYxMGFkMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZUZlZWRlckVudmlyb25tZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Njk2MTUyYTdmYWM3OGY2N2Q5Njk4ZjJjN2NiMDU2N2I1ZjZiODg5NWRjZTUwMzNiMzk1MzA0YzJiNGY1MGNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0ZpeHR1cmVIYXJuZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzc2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhNjI1MWI3NWIzMDE3MjY0OGY2MjM5OTdmOGM1NGE3YTYyYWJiNDcwMTE0YTY4M2VhMGY4NjdjZmRkZjQ3YTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZUhhcm5lc3NEYXRhU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzhhYWY3MTE1ODk3MmNjOWVmZWI3YWI1ODU5NWNkMjM4ZDA3OTJhNmE1MDRjMTdmNjU0ZDlkMTkwODc0YWQwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNGaXh0dXJlSW5wdXRQcmVwYXJlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MzUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDA4M2E2NGU5NWE4MzA0M2ZlNDUwY2ZhM2MxN2FmMDYwNzVmYzhkN2IwYzg2ZmJkMmY3MTQwOWQ1MDRkM2VjZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNGaXh0dXJlUHJvamVjdGlvbkV4dHJhY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQ3ODA0NDM0YTAxODk3YzkyMGQ5ZjQyODViNGNiYzQ0NjFlMzI0YzhmM2Q5M2MxNWY4YWZhMGYyNDI2YzI0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNGaXh0dXJlUHJvamVjdGlvblN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODkwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlYjlkNjIzM2NjZDYzMDU1MDMwMDE1MmE0M2I1ZjFmOTBiMGE5NmI1YTYxODNkODFmMjc5ZWUxMzA1MDM0ZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZVNjcmlwdGVkRW52aXJvbm1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzMTk4NTkwMDYzODljZjQ5YjkzYWIwYzNlY2JhYzBmNTlmZTE0ZTcxOGFhMmFhNjUzMzRiZTdiZDM4M2VmOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzR2FzU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzU1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5ZTk5NDRjNDY4OWNjOTE4MDU3M2UwZmYzNGMyY2JjYTJiNDk5N2QwZWQ1ZTNkMGY1NWI0ZDEwYmZjMGQ5ZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzUHJvamVjdGlvbkNhdGFsb2cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDcwZGFmMDE2M2UyMDUxYzllODNhY2NmNzY4Mjc4ZjBiNzRjMzgyZWYyNTMzNjQzOWEyZWZhNTI0OWVmMjcxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9GaXh0dXJlTm9uQ2hhbm5lbENvbnRyYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhMGYyMzA1NDE4N2ZjNmNlZTE3MzczNGUwMjc0ZGIxNDdhMzZkYjMyMmFjYjQ3ZDJmOWJjOTc5MWY4MWQxNTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvRml4dHVyZVBhY2thZ2VDb250cmFkaWN0aW9uRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkNGRlNjRiMTdlYjI1ZGRhYjIxMjI5MDc2ZDUzYWI3M2IzNWNkODg4YTg2MzkyZWI3ZGYxYTZjOWZkNjg2MDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvTW9ja0V4dGVybmFsQ2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMWRmOWY4YzNlOThlZmE3YWNhN2NmZGMwYmI2MDI4MDk4ZmRjMzYzM2ZiNGE5MjMwYjE5NmMxNzE4YWZhMmQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL01vY2tFeHRlcm5hbENoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM0MywKICAgICAgICAgICAgICAic2hhMjU2IjogImEzNTkwNDVjZjVmZjkzODJlZDY4MTMyM2M5NjhiNDFlNTdhMjAyYzFkNmU5YzlmZTc1MTc4NGNlMzk1NGMxNDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvTW9ja0hhbmRsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDBhMTI5M2QyZGRiMDQxMzEwOTQ4YWViMWIzNWJmYjc5OTMxMzRjYWM3NGE0ZTQ2YWM0MWVkM2ZhMWU5OTQzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Nb2NrSGFuZGxlclByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YzMyNzdmY2RlYzMzNjgwYzYwM2E0YWE3ZWJlMjdiZDFjMWM1MmYxMzk2MDRiYmJlODIzYjNhYjVmNDAzODBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL01vY2tUeXBlQmx1ZUlkcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljZDIxNjcyMDM4MWQ3NDY5ODcwMWVmMmFkMjNmNjU0OTE4NGIxZjYzMzlmMzI2NDVhZjQxMmZkNmFlMGRlMWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvU2NyaXB0ZWRDb250cmFjdHNSdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMyNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTVjNjhhYjBkZGU2NWMxMjBlNWM4NWY4ZWIxNjQzMDVmMTVjZDU5Yzk1ODYzN2E3NzMzZWVkN2I0ZGJiZjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiN2NhNzIxYjRhOTNmY2EzMzZmZWQyMDQ4NmYxYzlmZDE3YWM2Mzc2ZTBhNDkyNzViZWU2ODE1NjAzOGYyYjA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvcnVubmVyL0JsdWVDb250cmFjdHNDb25mb3JtYW5jZVN1aXRlUnVubmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0YzUwN2M5Zjk5Njk4NzA1ZDU1N2EzNmI5Mzc2ZWFjNTk5ODZlNTk3OTFmODk1MDlhMjk5OTQwMjU2ZDM0ZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9ydW5uZXIvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkZWFkM2ZjOWViZGQyZmU4MTI5MWUwOTI1ZmM0MDBhOGZiMjExZDE2NjQwYzQxY2NlN2IwMjM0MTNmMWEzOTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvQ09OVFJPTC1MQU5HVUFHRS5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiMWVkYmJkNzkzMDdkM2IxMDkxOThiMDBjYjIyYjM2Nzc2Y2I0YTQ1OWRhYzI0NWJhZWFhNzA2ZDQzZjQzMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvSEFSTkVTUy5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4Nzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2NmZDJkN2FjZTU3YTFhZTFlYjhjMTBlNzM5MmQxYmI0MTJlYzhhN2Y3NzFmZTEyNWQzZDgzM2QzOGZjOTA1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9SRUFETUUubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDM1MGEzZTlhMzczM2JlNjFhODhjYzg4OGY3ODNmMDZmYzJjOTBjYTgwM2M0YzI4ZWRlNTJjMjRhMmMxY2JlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9UUkFDRS1TQ0hFTUEubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2Mjg2MDc5YWFiNzI1ZTQyZTMwMGM0ZTJjOGFhY2U2YmYyMTRkZWRiOWRhYTY4NmExYjY4NWNmNThiYTJjMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkyNzk0ZGYxMzFkZjZlMjZiNmZjY2EyYWVkNTQ4NDE4YTFkMmNlZWQzMmExNWU5NzE4Njk1MjYzZjU3YWJhZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjZjRmODkxOWU3MGUwOTQzZTA4ZTYwMWU4YjJhNWVkZDcwMTU0N2Y4ZDExNDQ4MDA2NGM2MTQ0MGRjMWYxNzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhYjk1OGUxNmZmOWI1Y2U4ZDZmZTFlMzEyNWE0OGI3ZDA4NTlhNjQ5OWUyODRlZmNlYzVlZDJmZjI2N2RjZmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlN2I5YjgxZmE5MzQ4NzUxMTgzOTliOTc4ZmZmYTdhZmU0MTgwZDI2MjFhNTM5NjIzMDFmZTY2MzkwM2U2ZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5YWQ0OWVkNmY5ZTdkNDQ4NjNiY2JjNmE5NzIzOTEyMTFiMmJlZTBhN2FiMjE5Mzg3ZjQ4NThhNTE3NzMwNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzYzI5OGFhNDdkOGE1NjgzYjkwYTAwOTBmN2FjNDgzYjgxMGEwNGJhODk4MmQ3ODNmZDM2MTA4MjJjYTg2ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvY2hrL2MtY2hrLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImRlYWYwNzkyNzYxZGNhNzkwNzNhZmExMmMwYzNiYzQ1NWQ4ZGRjYjdkZmJhOTNmOWZlMzk2YTFiOGE0YTBhYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZGlzYy9jLWRpc2MtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI2MzE4MWQ1YThjYzE1ZjNjOTQ3MGEwY2JmODFiZGRiNjA1NzdhMDk3NTc3NTBiZTE1MGUxOWRmMmYyZDBhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9kaXNjL2MtZGlzYy0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGFmMDA2OGM3MDFhMzlkYjNiMzdlOTU2YzMwNzdjNzJhYTA5MjZhNWM0ZWNlNjE2ODVhMzc5MzdlMDJhZTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Rpc2MvYy1kaXNjLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImVlMDBmMzMyZjhmZGVkZThmMGFiYmIwZDgwOWEyNDA2ZTJjMWY3NWU3NDhmZTlmMDYyMmEyODEwZWYxMmI1NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZGlzYy9jLWRpc2MtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWJkODE0YzU1NjczNWU3OWRlODkxYjdlMDg1YTI1NjEyZGEzMGFjMjRhYmIzMjkxZTgwYzJiNWZmOGNlYzBlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9kaXNjL2MtZGlzYy0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTNhMWMzNDg0MjBkNzhlZTI0ZGVjYjY4MzllMGFiNDJiMGJmMTM5ZGQ1ZmQ0MGEyNDUzZDhjZmQxNmFmOWNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Rpc2MvYy1kaXNjLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyMzYxMmQyNGQ0MzU0OGFlMzg1Zjk0ODQ4NzM3YTU1MjkyMGE4ZGFkMTdjZjE3NWI4YmY0ZTM0NjU4OTJhYzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZTJlL2MtZTJlLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ZDY1YmUwMTJlNGRkNzIyYzE3YTQyZmU2YjAyZWE0OWVkODJiNjQ1N2QwZjIzMjRkYWEwYzc2NDQxY2VhMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZTJlL2MtZTJlLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiMTE4OTZiNGM5MDk1YTM1N2JlMjU5ZmI4NzJmYWJmOTEwN2VlNTAxYWIzYjc1ODVmYWI3NzBhYTg2YzhlOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZTJlL2MtZTJlLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1MmZlNWJjYzliYjY4NDdmOTk4NzFjOGFkYjliZTg2NjAzZmYxZWM5ODJkOGNkMTU3ZjQwMDVjMjFiOTdkY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtY3ljLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkOGVhNjY4OTdlNmVlMDAxNTk0NzdhMDQ0MDU5YTZmZTQ2YTExZGUzNTA5MGY4NWU5NzhlODFiMzdiZjIzYWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwYzM4ZDM4ZmM2MDkyOTE5OGM2ZDMxMTZjZjhmOTJlYzI4MWJkMTcxYzQ4ODQ2NDQ1NjczN2UzNWFiZGNmMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxNTI1MjNlYTczMzljZmVkYmYxNmFmZDdiYmNjYjU3YjZiOWIzZTEyYWM3NGM2M2U0MDZhNmZkMGQ1MzNhNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4ZWNjNTE0MWQzNWI0ZDIyODU1OTM4MWY3Mjc0MzIwYmEwYjk2ZmIwYzliOWFjODFiNzU0MTRmMzY4MGMyMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1MWUyNDcxYmViM2QwMDQ0Mjk0ZGM4NGQyMzNlZmYxZTc3YmQ3MzJlYzc2ZjA4ZmVmM2FkMGJmZWU3NWQ0YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1ZGU5NjdhMDNkZGIxMmNiYWU5OWY3YmJiZmFjZTI4YjFlNjhlOTUxOTg2ZDU4M2YzY2E1YWZhM2Y1Njk3ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmMTk1MTg0NGZkYjA5Y2M2MTBkNDc2MzFkMDRjYTMyYzk3NjYzOTFjZjEzNzk0NTI4MmU5YzkzZjJjYjE3NjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3NjhlYzIwYmEzYWE0NTM1YjE0NGU1ZDJlYmE1ZGNlOGYxODljZmRjMjRiOWNmZWU1MmRiNjhmYWI3MjY0NWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA4LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3YTFkMTUzNGFlYzIwNmI4MjJjZTQzM2M3OGFjYTA0ZDA4YjAxMjEyMTViMTgwY2M3MmFiMjFlMTAwZjlmNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA5LWN5Y2xpYy1tZW1iZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTc5ZTdjMzI5ZTg5MWZiNTdkM2Q4YWMzNjA3Yzk2N2E5M2I5OWJlYjA0NjdmYTcxNWNjYjFjMTc1YzE5N2MyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMDktbGlzdC10YXJnZXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JlMzhhZjdhNGU1M2ZiNDFhNTVkYzRhYzQ3MTllMzgzNGExMGYwM2NkYWMwMmUwZDY0M2RmMzIxZWEyOGM2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMDktbm9ub2JqZWN0LW1lbWJlci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjkyNWU5NWM3NWIzYzQ5ZDYyYWJlYWUzNTcyM2NiYTY2NThjZDRmMzMwMTExMzU5NDYzZTcyNGYyZTc4YTEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wOS1yZXNlcnZlZC1maWVsZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1ODkwODcxZTM3ZWViOTM4NjIwMjM5ZmRlZjNmMzU5OGJjZDg2MjgwMWZmNjZjYWRiNjY3MTI4MzFkYTFkMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA5LXdpbGRjYXJkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjI5YTNiNDFmMTQ4NWY2NjAzYjcxNmQyNDNjMDM1YzhjOGFhZjBiZjVmY2ZkYTQxYTc2YmFlN2YxNTg2MDRjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTY2ZDIzNDFlMzlmYTMyZjAwNGNlMjBhZmJiZDg5YTNkMDIxOTQzODE1ODk5MjQ0ZGZjOTZkZTRkOTU0ZTlmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWM0MzM4ZjdlZTQ0ZmU4NTUyNTU0YWYyZmQ5YjEwNmQ3Nzk3OTg3NzA2MzkxMzUwYzViNmQ3NWExYjgzMTFlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjYxODUwNDJmNjdhOGM2YTg1OWNmZDM5NjljMzBmYzk5OTgxODYzM2YxYzFjYWJjNmQ5MWY5ZGE3MDNjZTQ3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDczMWYzOTdiNjMyYzJhNjU3YWU3ZWE4YmMzZjMwNThjOGM0OWNkZDA3N2RiMDA2NWJkNGRlYTE1NmQ0ODg3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmRmYjVkY2M5NDIzYWEwYmNmMzQxNWFjYWMzMGM3NGJiOTZkZDYwNTZlNGE5MGU2MGMwMjI4OTQyOWZlN2Y3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGVjOGM2MzZkMDNmNjNhNzRlYjQ5OWE0MWEzYmIzMDllZDNkMTgzOTEyNjk0NjY3ZWNmNGYxZTg5OWU2ZTYxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMTYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBiZGQ3NWQ4NWNlOWVkNzQzNzc4MTRkYzY1Y2M1MmUxM2JjMTBjN2Q1ZjljYjI4OWIxNTFhNzZmOTgzMTk4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9ldnQvYy1ldnQtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNjOTAyY2M0YWYzNWExMWU3NTdiMWNhNTY4NDU3MWNhMzQ1MGNiNzczMWM0NGY2NmNjYjg1YjFkNjNjODE0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9ldnQvYy1ldnQtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWUwYmQxNjFhNGZiYjdiZTFhNzFiZjdjMzdiMjBlMWZjZjhjNDVlY2Q5OTE4MTI3NzUyN2Q4NDE5N2FmZmU2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9ldnQvYy1ldnQtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzk4Y2E2ZTAwNzQ1N2FlZjg0NDM1MzFmMTBhMjk0NDI0NGVlYmEyZmJiZmRiM2EzZTVkYWQyNzNhODU4MDhmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9ldnQvYy1ldnQtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjcyNDZiNzcxZmU0Yzg5MGVlYWMyMjJkZjE4YTE5OGU2N2U4OGU5MjNlOWNhNzEzNWIwOGNhMWM4NmQ0ODMwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9ldnQvYy1ldnQtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmI3Mjg4YWE3ZDM0MmIwYTc1NzgwOGYyOTg0ODczMjBhMTE3ZmQ1YTQ3NzA3NjMyZmQ2NDJhNDljZGU3OWE0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mYWlsL2MtZmFpbC0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOGIyNTI0NzQ2ZjQwNGU0YWU0Y2E0MmRlZTc0YzRiMzI5MjM1MzdiNTVjNGM4M2ExZTFmYzA1MzA1NzMyYmVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZhaWwvYy1mYWlsLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkOTZlNzg5NDQxMDU1ZDY1OGY1MTBmYjlmNzhkMjY5YTcxNWU1YjQ5NDMyODgxYzRhMjY2NTQ2MDMxMDc4ZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmFpbC9jLWZhaWwtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmIxZjlmNDEzNDMxYmJjMWZkNzNiOGExNGQ1OTIzYWVkOTEzZDg2MWI0MzEzNWE4YWZkNjU5N2QwY2IwZTIyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mYWlsL2MtZmFpbC0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDE5NTJjZTFhMDI5OTlmZDYyNDc1YzM2MzQ3MmRkNzE3MDRjNjZlMmVmZGUwNTg3ZGQ2MGIyMDYyMDc1ZDM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZhaWwvYy1mYWlsLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxNjM3NjJiYTdmZjI0ZDk1YTMzYWFlYjRiZmU0OGU1YWZmOTE2OTA5MGE1YWI3ZDNiM2MzNzNkNmM2NDY2ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDJhZmRhZWJlYzJmMTVmZGYxYjUxMzU4MWQ0Yzc2NWE5ZjEzZWJmN2FmNjA4MmVlMmZjYzUyYTcwMjZmODNkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YmRiODRiYWM3OTM4YjRhODRlNDBhNjUzOWEyOTk0ZDhiNDgxNGI0MmU2ODNkN2Q0MmJkMjEwYTZjNThmOWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjYjk1NmQyNTE5NGU4YjhkY2E3MTIwOWY3YjgxODIwYTIwNTMxMTlmYjU0NmZlMDlmYTIwZTczYjZhYTI4ZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDVjYWNmMTUyOTQwMzg2NWVmYjg3YjgxNTRmYTkzMDg2Y2I3NDM0YmUyNWFkM2VkMzgwNzJkNjU4YzhmZjZiYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNWMwZWUzZTE1NmNlZGZjYjM1NTkyYWM1MmVhZDVkOWM5MTY5M2U2MWU5ZmE4N2Y1ZDFmOGUxZDYwNTNiMmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3ZWM1NmM3MzNmNThiZGQxYzczZDdjZmEyNWY1ZmQzZjg0N2RkZjUxZmQxNTJlYzVlMzAyNWNhMWM0YjA0ZjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWM5ZTk0NmM3NDZkNmVhMDM1MDc5MmM0MzQzZmI2YjI5NTc3ZGRlYjU5MTFkNTNkMGRmMDU2ZmE4MzcxNWQ3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0wOC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MGIyNzkwODc2Njc5MDJkMzE0YjI0MmY2ZjJkYTAyMzEwNmE2MzNlZWI4NGFmNzFhYjQ0ZTJjYjJmNTQ5MGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTA5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyZGEyZDA4YjE4MzNhYmU5YjA0YWVkMzgwMzdhOGNjNDcwNWE3YmMyMjIyYzgwNDBlODFlOGQwYWM0Yjk5OWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMTAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY1ODg0NGE2ZmNlN2NjN2IzZGIxYWJiZjQyNzFkMmExYjhiYjRjZDk4ZGMwMWQyMDU1OTJiMTgwZDU1OWU2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0xMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMDFiYjUzYmI1MWRkZDAzMzA3ZGY4MTJkNWE3YzU0OTc0NmIxN2E5OTM1OWNlZWRkY2UwNWY4M2Q0NDIwNjg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTEyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkOWFkM2MxOGM2ODI4MWYxZmYxNDVjNjIxNTBmNzJlM2RjNDJhOWQxYzU2MjZiOTAzODVhNTA3NDFiZTFiZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMTMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzNiODQ1ZmNlNGUxMmNiNzg4ZDllYmIwZThkMTc5MjUwZmYwZjdlMTMwODJhMTg2MTM2MGVmMTgxZjg3OGRhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0xNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDQwMDI0YmQ1NTUyMjlkYjJjYTZiMmQ3NmEzNmE3ZTVjYjRkMjU0NGQ2NDAyZWU2OWIzZTlkZGUwZWFhNzc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTE1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkMTI5YWIwYjVmMDMxN2U0NzQ3ODI4Y2ViMTU2ZGNiYThmZWMwNzg0NWMyNTcxODYzMDVmOGUzMTk4NTExZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMTYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzdjNWI3YjllNGY5ZDEyMGRkM2Y0MWJlYWU3YjAwNzMzM2NhYTBkYzllNmY3MTNkNWJkMDZmN2ViNjE2NGM3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0xNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTI0M2FkNzY4ZTdhM2MxZWQzOTk3OWU3MmQ3NjFmOTNjZjY4MTNjMWFkNDA5MGViZjkwM2MwNGY4NzNjZTVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTE4LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4MmMxYmFkNTViZTZhNWJiYmNhYWM3MDZhMzA3YzBjNTA4NTBlOTk0ZjY5NWI2OWY5Yjk5NGM5NTg2NzFmOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZml4dHVyZS1zY2hlbWEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTYxZDEyZWJhYzIyMGJiN2RjMWMxM2U0MjRkZTJjZjM0ZTdiODUzNmY1YTQxMDhlM2JlNGVmNzdlYTk0MzA4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vY29tcG9zaXRlLWdhcy1leGhhdXN0aW9uLXByZWZpeC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmZGZjMjE0MTJmNjhlNjIyZmI0MmY3NGQzN2Y3ZjhkZjFkNmExZjdjNGEwOWZkNzQxNzhiNmM5ZGVhOTk5NmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL2NvbXBvc2l0ZS1pZGVudGl0eS1ibG9ja3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZGI4MDhjMGRhNjEyOTE4ZGMwZWY1Nzg4NmZkNzcwMGM3NDE0ZWIwZTA5YmFkNjk1Njc5MWE1MTU0YmMxODE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9jb21wb3NpdGUtaW50ZWdlci1tdWx0aXBseS0zeDItbGltYnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYmRhZmI4ZWZhNDAxNWNhM2NkNDFjMWFhZTk5NDc4NDc5MGJjYTczYWI0OTc4N2VkNDk0ODBlODU4MzViMzg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9jb21wb3NpdGUtbGlzdC1hcHBlbmQtZGVsdGEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MTdjZjA2NDkxYTI1M2ZlZTRjNmRkMzI3OTk4N2ViODFlZmRlMmNlODRhNjM5NTZhOTY4MzMzN2RlNDcxMGZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9jb21wb3NpdGUtbGlzdC1yZXBsYWNlLWhlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWI4YTNiZTU1NDUwOWNjZDEzOTc4ZjY4M2QzYjQxYWE2MzFhYWFmNDcyOGEyZDBhZDU3NWE2NDEyZThjOTA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9jb21wb3NpdGUtdGV4dC02NS1jb2RlLXBvaW50cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4Mjc3NTg0YTM1YTk0OWY0M2Y2MmE3M2NkYmY4Y2Y5MGU2ZGE5OGUzNTQyZjY1ZWJiMGU0MDJhNzQ2ODA4MDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL2NvbXBvc2l0ZS12YWxpZGF0aW9uLXByb29mLXJldXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTY5NWE1YzZmNmExOWUyMzUzNjA2NzdmODFiZWU5ZjcyMjg1YzVkOTM1MjRkMjg3ODUxNTFiOTY0YTA0ZjBlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWNoYW5uZWxBY2NlcHRlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyOTRkYjRiMjhiNTA0ZGZlYmE4MjFjZDBlNDYwNmJlMDk0NjgyYjg3OWEyMGQzNjRlMDIxMDE5YzE4YjY2NmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1jaGFubmVsQ2FuZGlkYXRlVGVzdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjc5ZjQyM2Q0NmQwNDQwZWUwNWE2ZTMwNDlkM2QxMGUzZWQwMDNjMTIzMGU5Mzc2ZjIzNzZhYzkwMzVjMGRjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWNoZWNrcG9pbnRDb21wYXJlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiOTJhY2QzZGQ4MmJhYThjYWIxNjkzNmE2NzJlNDBhOTIzOTBmNmZhZjY4MTc1NzY4MTExZmY4Y2I3MDNlNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1jaGVja3BvaW50V3JpdHRlbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5MzNlODA5MzFiZGYxMDZiMjY0M2FhNDAwM2RlZDdkYWM2ODI3MjQ1N2RkZWM0YWNmNDYxYTQ4ZWViMTA1OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1jb250cmFjdEhlYWRlclJlY29nbml6ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTZhMzExYTAwMDJlMTk4NmVkODczYWYzYjhlZDkyM2FmZTQzZWI1NTlmNmI3ZTQwYThiZTE3YjJlYzYzZjU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItZGVsaXZlcnlTbmFwc2hvdEVudHJ5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTk4NWMzMzVmMGNlMTJhZmRjOTBmNmViZDQ4ZGFlNTJjOTMyYjgzM2E2ODMwZDc5NzQ1NTBjZTUwOGMyYzMxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWRvY3VtZW50VXBkYXRlRGVsaXZlcmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjg4ZDAyYzgxMDA4MTQ0NmRiYzUzNmJjYTNkMjgzZGM4YmM4MzMzODYwMmMyMzhhZDQ5NjUyMzZiM2RmNTg1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWVtYmVkZGVkRXZlbnREZWxpdmVyZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGM1ZjY4MjcyMTEzZTU3YjFjMDY4MjU2YTNjMTViOWNkMGY1MWQwZmFhYjc3NThmNGFlMGI5NzQ0ODY3NWVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItZW1iZWRkZWRQYXRoRW50cnlSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDExMTRkYThjMmFkMzQzMTJlNjM5M2ZmMzNjMmUzOWZlMDRiZThhZDYyMjE3OTAxMjEyM2MzYTMyOWM0YzZmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWVtYmVkZGVkUGF0aFNlZ21lbnRWYWxpZGF0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzhmZjg4MjcyZjgzODdjM2ExY2E3NDFmZTljYmU2NDg2MjNjZjlhYjE2MjlkYTBmNmRkMjUwY2MxYTA5NDhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItaGFuZGxlckNhbGwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZmFhMTRhMzkwYTk1YzdlNWYzYzg0MzM1Yzg3ZWJkNDk5YzlhODQxZmEwMDFjNmQ5ZTc2MDQ3MmZmMmY3ZmRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItaGFuZGxlckNhbmRpZGF0ZVRlc3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImExNWUzYWFiMDQ3YTZkMWUyNjM1NmVlYzgzMzI0MTIxZmM3OTEyMDYxMjMwZDUyMTcyYjNhYThjNWZlMzVjNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1pbnRlcm5hbEV2ZW50RGVxdWV1ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDhkZDY4MDk4YmRkNzk0YTBiYzliYzljNjc4NWJjOWI5Njg4ZWUxNGQ5MGU1YTM0ZmIxNzg3YmM3MmIwNGNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItaW50ZXJuYWxFdmVudEVucXVldWVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU0OGNkY2NmOTVlZDY1NzJjZDZiMzYzYWViZWQxMzY0YzE4ZDRiZmFiYjNjNGExOGFhYTk2OWVjNmE5YWRiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWxpZmVjeWNsZURlbGl2ZXJlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkNTVkMjU3Nzk0NzdiMWNjMjU2YjZiNzgxZGI1Mzc5MGFjZDQ2MzlkOTUxNDY2NTRlOTUyMGJlOWQ4MmU0MjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1wYXRjaEFkZE9yUmVwbGFjZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0NzIyOGE0NzUzOTdjY2Q2MGEzNmFjNzkzMjEwMzAwMjZmOTEzYzY2ODdmOTg4ZjljODM4ZjQ0YmIwN2M0ZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1wYXRjaEJvdW5kYXJ5Q2hlY2tlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjNDJkODA5ODUwMDUxZmUxNzU5OGFmNGIwNTg2OGFjNDdhNzlmMTdjZjE1MWZiODRkMTFiMzZlOGQwMTMwNmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1wYXRjaFJlbW92ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjYTYwYzczMDAzNDVjMTYzYjM0NGFkYjZlNDQyMWRjNDI1MjVjMWZhMzJlNjM0ZjFiNGEzMjI1N2IyZWUxOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1wb2ludGVyU2VnbWVudFRyYXZlcnNlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkN2Q5YTE5NDY2Zjg5NTE3ZmE2MjA2NzY5NmJlODYxMThmNzMwYWQ4YTg0YTE5ODFlNGIyOGQ4ODJkMDFlNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1wcm9jZXNzSW52b2NhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxNGMxYmZhMGU5ZjA3N2MzZDE3ZGQ3MDJmNjkyYjQ5MDBkOWNhYzc0N2I2YjdjNDc2MTUxNjlmMmJkOTEwNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1wcm9jZXNzb3JNYXJrZXJXcml0dGVuLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2I0ZWU2ZWM5N2ZmNjY2NmI5NTM1MzE4ODJhOTRlZDFjZGNlZTE5NWRjODgxNjViYmQyOWMzMDg0YWE0YWQxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLXJvb3RFdmVudFJlY29yZGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDgyZjZmODc4MWMxODYzN2Q4MGY0ZTM2OTVmMTI2Yzg2ODdhNWIxNmZlMWI2ODU0OTkxOTc3MGZkMmMxMDc0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLXNjb3BlSW5pdGlhbGl6YXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjYyODZlMzkyOTA2ZWM3NzBiZjM4MDBkZjBhMGEzNTFjYjBhZTJiN2ZkZGVlNmRjNTkwNmZmNjI0OTZmZTg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3Itc2NvcGVPcGVuZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjcwNWVkN2NiZDYwMTIxYTE4ZDg3MGQ5ZDE5ZTI0MTZlMzdlYzI3YjRiYTQzZDVkZmY5YWFmMmY4MTAwYjgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItdGVybWluYXRpb25SZXF1ZXN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMWE5NWNjM2MyYTFhYzhhZjlhYjNjMTdiMmZkZmNkZTFkOTM2NDU2ZGMwMjJiNmJiNTIxNTU1MjEwM2FmMzUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItdHJpZ2dlcmVkRXZlbnREZWxpdmVyZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2E2MTI3OWM1ZTIwYzIxYWU0NjhiMDE4Yjk0ZmFmZWQzYzRhODQzNzYyNzc5M2Q0ZDcyMWY2NTRjNGU0MmYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1kaXJlY3RJZGVudGl0eUhhc2hCbG9jay55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3NzliMzFiMWFhYmQwNGZkYmNkNDM1NmQ0YzNlODhlYjBhOTZkYmNhYjhiZjI5MmE1MjM5NjM3YzgwMDVhOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLWludGVnZXJMaW1iT3BlcmF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjEzYWU2NzlmZTgxNmMzN2Q5NDE3YmM4YzQ4Zjk3ZGE0ZmM1YzUyMTRmZmRjYmQwZjgyNzk3OWU1YzQxYzQwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtbGlzdEZvbGRTdGVwUmVjb21wdXRlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5Y2Y4YjA5NDQxNjIxZGMxOTY5NGE1ZDIxYjRlNTY2Y2JkMDY1ODNlMDY3ZTI3ZDQ2ZGM5NDUyZTg0OGViNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLWxpc3RJdGVtUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjNjkzYzczMTVmMzljZGY1YTdkZTYyNDdlMzJiZWFkOWFkMTE0OTRiNTAwYjQwZWQ4YzJmNWJhMzc5OWYxMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLW5vZGVJZGVudGl0eUVzdGFibGlzaGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDMwN2QwMmM5MjFiMDEzMzQzYWU1MWQ4NjA2ZGRjYzlkODJhOGQyZDRkOGYwOThkYjkyNDM2ZDg5MGU5NmZlNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtbm9kZU1hbmlmZXN0T3BlbmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzExNjQ0NmY4YjQ4NDU3YzIwZDA0NTcxOTZlMDYyN2RiYTU4OTAyZGI2NjQxYmRjZDNmMGVjMTliMGY5MmJkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtb2JqZWN0TWVtYmVyUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2NmU0Mzk1NzczMDZmNzhkYjU3MDUwMTBkZmY1MTlmZjFmNzEyMWI3YzdmOWNhMDZhMDNmMGQ1NTBkMDFhNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLW9iamVjdE1lbWJlclJlYnVpbHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjZjNTQ2ZWE4YTM5ZjUyYzQ2MjY1NzVlZDBmODI0YjEwMzdkODgzYWQ1YzU3MGFlYTk0MDEzZGVjYjYyNDExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1zY2FsYXJDb21wYXJpc29uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGIwYjI4NGQ4YzE1MzY0ZTA3ZmNkNmU3OGM1MTEzNWNiODA1NmIxNTIzOTQwZDg3NDJjM2EwOGM1MzdkNDYzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtc2NoZW1hUHJlZGljYXRlRXZhbHVhdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDY0N2FmYWM2ZTA5NGVhYjM3ZTU4OGQ2Zjg4MDkxNWY5YTAwMjYzYzA3ZThkMmE1ZDhkODg1Zjg5NDk4ZGY5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtc29ydENvbXBhcmlzb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTBmNjdhNTA0NzgxZTZhOGM1YjY4M2EzZDA5MzI0OTEwNDY5YTllZTgyZDg2NDVjMDg3ODM3ZThlYjAxZmI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1zdWJ0eXBlQ2FuZGlkYXRlVGVzdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTk2NDUyOGQzYzljYmYyMzkyNjY0MjMzMThiMjA5Yzk3YzYyYzQ5ZWEzNTRlNmY1NGJmYjhhNjMzMGEyZDY3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtdGV4dEJsb2NrQ29uc3RydWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODM2NmQ2MGFjNGI2ZWYwNjEyNTgzMGJiMmE3NDRjZjYzNmEwMzBmNTY5MWYyZDY2MzFkMzU2YmIwZDk0ZTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy10ZXh0QmxvY2tFeGFtaW5lZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmYTRmYjQwMjIzNGUzN2RiYjg1OWRiZWJkYzA5ZjJkNTM2YmEyYjA2YmQzOTY2MjhkNTZiYzg4MTA5MWY3OWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLXR5cGVFZGdlRm9sbG93ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTExMDQ1NjM4M2RjNjM4NGNkYjVjNTJjMzBjNjBiMWVjNTFmMmExYzNhMGY2YWMyMTkwMDQ0OWRjOTdkZjBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy12YWxpZGF0aW9uTWVtYmVyRXhhbWluZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5N2Q1YjRlNTQzZDQ3YmU3M2JmODI4Yjg1MzliMzAxYTFjODRiZmEwZDEyMWNjOGEwMDA5YjMwMTZiZDM4ZDQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy12YWxpZGF0aW9uUHJvb2ZSZXVzZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzkwNDc0ZWVkNDZkM2QyODc2NzI4ZTJhYTcxNmE3MWZiYjhlOWUwZTBmYTc2YmZiYmU3NjE4NDAxOTM4YWQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MmU2ZDE3MzZjNWI2OWQyYWE2OTE3ZTU1ZTI4YmQ2MDY3ZDA0MTU5ZjI5MDMyNDZlNDQ4Y2Y0MTVjNGI5MzBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDQwMGI1YjAyYmNiYzljYWFlNjhkYjExMDYyZTc1MTc4NTUzNGZmMGQ0OTA2ZGMxY2YyMGI1ZTMxMjUwZWQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNmJhNDJhMGZmYTg0MjkxMGU3YTFjZWZiOGUyZDE3NDZkZTRiOWZjNDczMDZmNzlmMjMxZDFhNjE5MWJmMzRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYWMwNjZkZmEzNDc5ZmVhZWE5NzE5OTZjZTQwMDMxZmI2M2QzYWNkMTMyZDMyYmZkY2YzMGYwNDAyNjE3NTliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMTNiMjZkY2NlMzgxYzYwZDFiZDQ1YzAyZTA3ZTQ1ZjY1Njc0ODk1Zjc1MTU3NTYxNjc5YTEwZmQxMTJlNGY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzliNTcxYTk2Y2M2OWFmMzk4ZDIwZTQyOWI2MWJlMDQ5ZDI3MWI4NTgzZTgwOWNmZTIxMGEyNDBkNDAyZGI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTJlYjIzMmM2YTJhZjBhMzRjNjY3MTE5N2UzNTVkZTdlYjRiM2RlM2EzMTdkM2IxYzkxODNkMmExMDE2NzE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy9jLWdhcy0wOC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzY3MjBjMDllOTRjYzVjMzQyZWY1NjUyZTRlMTM3NzgyZWMxZWI0ZjRlODcyZGY0YmM5OTZjZGM4MzQyMDIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2lkeC9jLWlkeC0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTgyZjg1MGZiMmFiODYxNDdhMTZlNDc4NmEzYTEyNGEyOWU5MTk2OTlmYzMzNTMzNWE4MDcxYTg0YjEwNzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2lkeC9jLWlkeC0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWE2YjJhODUwNWMzOTA0MGMyYTI5MTE2ZGRiOWI5NWQxNTQyMzFiYzU3YzhlYmM3MDA1ZWM5NWZhNDU4MzQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2luaXQvYy1pbml0LTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkNjQzYjFjZTc1NzZjYzlmM2Y4OWY2YWU4YzQxMzZmNjVmNmUzMDk3MDA5MTBhMTI4ZmIyNTdjN2VkNDY5YTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvaW5pdC9jLWluaXQtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWVhYjkyMTk1YzQ5NzZjMzBjZDlkMmNlMzc1M2JkMzczM2Q4MWYxMzkxNGVlOTNkMjQxNWNlMzI2YzkyNzVjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9pbml0L2MtaW5pdC0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2M0NTEyNTE4YTg1NzA5YThkZjkwNjZjY2I4ZDI1M2JkNGViOTMwNjZmYmU5ZWVjMzg1YTcxYzA0ZmEwNmU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2luaXQvYy1pbml0LTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVjNDg4ZTJhNmEzOGU3ZDJjMWFjZThiYjBjMDRhYTBhMjM5Y2YwMTJiNjM0Mzg4NjljODQ0NjhhNmJmOWI1NWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvaW5pdC9jLWluaXQtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjJlZTYzNTc1MGEyNWYwY2ZjODdjNTIyYmJiZDk4MDMzZDczMzllMzIwM2U0ZjQ2MDk2MGRiZGQ4YWQ3OTY3ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9pbml0L2MtaW5pdC0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODAxOTk5YjdlMzljZjZjYTkyYTg1ZTAwNjcxYmQzZTcyM2FjNzA5NTBiZjM4ZmE4YTFiZjliNmUyZWQ1OTljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2xpZmUvYy1saWZlLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhMGNlMzY2NjViZTExMjU0MTVmMDI3MmE1YThjYWViM2QyOWU0MzVmOTE5YWE0OGNjYWZmZDM4ZDVkNDE3ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvbGlmZS9jLWxpZmUtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTkyMWNkZWE1YWUxYTZkMjUyZjNlZTM3ZGZkNjkyOTIyOGRhYzljY2NiZTYyMjAyMzc0NDExMGVkMzMxNWMwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9saWZlL2MtbGlmZS0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYWMxYzE3ZjA5N2FiZTQ5MGYzNWY2OGUyNWE2Mzg2ODM0OTJkMzA0MWIyYjgzZDY5MGRkNjkyNDM1NDcwMzg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2xpZmUvYy1saWZlLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwYmVhYTRjZWU4NTFhMWVhNDU3ZDJlZjZkOTNkM2E2YTJjZTFjYTgxMjNmZTZmMzcyMjA4M2RkYzNmNDA4MjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvbWFuaWZlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDM4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiMjI1MTgyYjExMGEyYzgwOGQ1MzliNjE0MDU2YjcwYzFlZTQ0OTM5NmMwZDI5ZDFiMDdmMWQ0MDc2NDdjODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcHJvamVjdGlvbi1jYXRhbG9nLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjhhMzE1NDk1YTNiNDY2MzhiNzFlMDc3YTA4OWQ4MDcxODEyMDRjMzZjYzFlYmQ5ZjdlOWRmMGMyNWE1OTVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL3Byb3QvYy1wcm90LTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxYTNhNzdiN2M4YmQyYTJkNWJjOTNlOTdkOGZjNzFhNzEyNDg1ZGRmYjgzNmZlMDZlMDJjNzQ0ZDc4MzIxY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcHJvdC9jLXByb3QtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQ5NGY3NTBlMWU5YjA0NjRjNmVkZDYxMDE4ODk4MTMzZDgzZjNjZjU5NGE1MjFjNWNjNzA0NmM3NzQ1YTI4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2FjNmE3NzNlNWRjM2FjMzNmMmNmZGZhNzExNDc1ZmVhMDk5MzgwYmY1YTk1OGM5YzI1ZWEwNDE4NWUwNWQzMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzZjODU0YmU3MWYxNDU0ZGEyZjM1M2I5ZmM4MDM0ZDIyOGI2MTAxNzhmMDNlMDUyZDEzMjgyM2E1MGJmNzNkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFhYTQyYjNmOTI2OTE0MWNiNDkyMDI4ZmJiNTI4Yzc0ZWEzNDEwMjQxNjM1ZmFiYTZlNmFjNDY1Y2RkZmMyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQyZWI2YzAwYWE1ZjVjODhlMDc2ODZhOTdhODNkYTdkZGU5NTMyNDE4OGFmNWJiZmRkY2U0MmNmNjhkZDcyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNkOGQ0ZDgyZGNiNWQ5MWFmMWM0YWM4YmE4NDA0YWE5NDg2ODcwNjJiZmJlMzFlZWVlNDc1ZWI4Njc4ZjliMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzhmYTJhOTYwZTE1MDYxMDFiMzE3MDE0NTQ5Y2U1YmI3NjIwOGE5NDJhOGJiMjE3NDMyMmJiZGMxMWJhN2YzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9yZXAvYy1yZXAtMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTAxZWVlNmE5MTJlNDM5NjI0ZGM4YmFjZDU0MDEyYzhjYmYxZWU0MWRjNTRmOTYwNzE0Yjc5NDBmYzI1MGVlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1jeWMtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmJiYTJhZjIzYTQyOTY2MzZiZWE2M2E1YTg0MDY0ZWQ0MmU1NWY5ZWJjN2FkNzdiYzVlODE3NWFlZGFkOGQ1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1jeWMtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTEwZjM2NTQ0ODIyNDVjNjc0NWNmMTlmZmExMjc5YjhhMzMyOGQzNWM0NWQ4YWFlYzQ3NDI3ZmM2MjMwYjMwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1jeWMtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTYxZmIxZDEzM2VlNzVkZTQyNzk0MDliNzFlMzk3YWRiZTdmZDg4NDRiODM1ZWRjYjUxMmFiOGVlNjhlZTM2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1zbmQtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODBjNzVhN2NlMGZkYjkyY2ZiMmI3OGE1N2EyMGFmYjJlMzgyZWZiOTI2M2E5YmE3ZWJhODU5ODA1YTY2Y2U3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1zbmQtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmZmNTJiOGM5MzYwN2NiYzFlYmE0NDI3ZDllNmNmNzE0M2UyOTdmYzdiNjlmZTE5MWMyMTJlZGQ0MWMxOTNkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1zbmQtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTAyNjNiODEyODY5ZWRmMDgzODQ2NGJlODhmY2JhZTIwMzk4Y2E1NWNlYmExMjMwMGFmNmUxMDVkNzVmNDVhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9zbmQvYy1zbmQtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFmYmViM2ZlNDYzM2I0YzAxNThhNWM4ZTk1MzYwY2JkZTMxZDFiMjcwMTZlMTY2NzlkOGE3YzM3MjAxYTdjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy91cGQvYy11cGQtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzY4OWFiMzMwYzM2Y2Q0OGMzNDdkOGEwYWMzMzFmZGRjNWVmODYxYzExMDFmYWVlYTI2N2UzMGIyZmM4ZjY2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy91cGQvYy11cGQtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGFmNjM5MDdjNGQwYzZhMGFkYTc0OTE3OWZlZWUwNjQwM2EyMDI5OGZmNGIzYjBlMTAyMWE3MTRhYTVkZTQ3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy91cGQvYy11cGQtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE2ZjMwNDEzNDJkNTMzNTNiNDA0MzFlMjEzYzdlYTU0ZWZkYTdmMmVlYTA0OTJiMTE4MmNjNGFkZWYxZGM2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy92ZWN0b3ItY292ZXJhZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFiZDliYmZhODRiMDAwOGI2MzQwOTE4ZGNlYTUwMWM4ZGExNzk5NTMxODc1MGQ5YTIzMjYwMGJlOTdkYjZiNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL0hBUk5FU1MubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZjg3ZmI5Y2M1ZDg2YWIyYzMwNjc2NDBiZmI5NWI0ZGVkZTM5ZGQwMmE2ODc5NTA2OGRlYmEyZDdhOTg0MTYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvUkVBRE1FLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImExMTAwOTljOTRiNWRlZjQwZTk5OTU1MDBkZWUzNTkyZTliYzMxYWIwMTAwZjQwZjViYzlhZTRmZDg1YTJmMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9ibHVlX2RpcmVjdGl2ZV9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhOGVhYTJmOTZhY2VhMzNhNDc3YTVkODhkN2UxMThmN2YyMmRmZDQ3NzUyMWRkYzhiMGYwZjhlN2RiNTljYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9kb3VibGVfMWUwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODRjODBlMWZlZWUwYjc1YTg0MDRjNjkxYzkxY2Y5YzZjMzNmYTg2ZDNmMjMwNTE2ZDZkNjRkZmZjNmFhMWI1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2RvdWJsZV9uZWdhdGl2ZV96ZXJvLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjYzMjdjMmRkOWMwMTc5NzhjNDJlZjM0NDRkMjFkYzY0YjM4OGNjOTUwMGY4ZjczZWJhZjVhOTM4ZDg2OWIzMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2RvdWJsZV9vdmVyZmxvd19yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhZTkyZGVkN2Y2ZmUyNGViZmJiNGNkNjRlZjYwOTY5NTliOTlmYmRiNTQ2MDMzYzE4NWZmNzdlZDE0NGMwZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9lbXB0eV9saXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzgyNmQ0N2YxY2QxNTUyOWQ1N2RmZWYzMDIyNDk5YzcyNzRiYjI5NDVkZDVlMmZlMjFmZTZlMmQ1YTNiNDYwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2VtcHR5X29iamVjdF9saXN0X2VsZW1lbnRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODI3MWIzODMzYTJiMTU5NmY2YTM2ZjdiYjZlODEyMjVlNjk0MjNlMWMwN2RhM2VkMDI1MTE4MWI5MzcyZTdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfZW1wdHlfcGxhY2Vob2xkZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzljYWVjZjIwMjliODZmZjllZjQ5NjkyZWVmODZkYjhiNjFjYjc1ZDA5ZDFkYjg3NzEyYjYxZDkwMTM2ODkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfaW50ZWdlcl8xX3ZzX2RvdWJsZV8xXzAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzhiYzE5OTEyNDNmMWE1M2M5YjBiMmQ5OGI2NDE5YjM0ZTM5Yzg0ZDAwMTA3ZDllODBiZDNjMzNmYTYwMzRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfaW52YWxpZF90aGlzX3BsYWNlaG9sZGVyX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTNjYTYwNDg4NjM3OTU0MzU5MDU0YTVkNTJkZjkxZmNlMTczNjlmMGM2NmU2NzdkM2E2NmZiY2YxNTQ5MjcwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2xhcmdlX2ludGVnZXJfcXVvdGVkX2V4cGxpY2l0X2ludGVnZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTgzMGM5NjBjYjg2MzQ5MTM1MGRjMzNlMzk4ODcyY2Q3MmE4YTNjZmI1N2M3NTk1Y2RmM2ZkNjMwYThhMjIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfbGlzdF9zdWdhcl9lcXVpdmFsZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0MmNjNzY2ZWI1Yjg4MDFjYWU1MjQ4NmViMzEzNjk3NjljNjZlYjQ5ZWFlNzVhYTUyMTIzZmYyYmFhN2NlYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9tYWxmb3JtZWRfZW1wdHlfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzgxYjJmYmNkOWI3ZDUwMWFjMDM2YWE5YWM2NDg3OTY2NjY3ODM2NzgxNGEwODQ5NGZlODZkOTU3N2RkY2Y1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfbWl4ZWRfcmVmZXJlbmNlX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWY4MWRlZGQ1MWNkYjNmYzRlZTcxM2JlNGNkNTBiYzE2ZDA2Y2IzNWM4MDc4MmJkZDJlYjA2OTFiNmY2Y2JkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX25lc3RlZF9saXN0X25vdF9mbGF0dGVuZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjI2Zjc0NWQyYTMyNjI5YTZhYjA1MWVmNmViZjQ3ZjNhMzY5YTRkNjJiNmE5ZjQzNWNhN2IzOTZhNmJlNzcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfbnVsbF9saXN0X2VsZW1lbnRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjgzYjliNGFiZGVhYmM2NzBlYTI5MDEyNDVlOWJmYjgwYzkyNzQyOGM5YmE0ZWZmMGZjMjc0NTg5ZmNjZTFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0Jfb2JqZWN0X2ZpZWxkX251bGxfcmVtb3ZhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhODc4NzZjNjQ0NmZlNzNiMWM5YmQ1MTdlMWEyNGFkOWQyZWRkMzg2MTg0MTc4NDg0OTFjYmY0MzVlNDAzZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9wYXlsb2FkX29ubHlfc2NhbGFyX3R5cGVkX2lkZW50aXR5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjZiNjI2ZGM5NTg2ZGMyMmZkMWRmMTUxMTJiNjJjMGI5M2QxYmM2NjNiZWZhOTg1ZjU0ZGRjODg4NmZjOTYxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3BsYWNlaG9sZGVyX2NoYW5nZXNfbGlzdF9pZGVudGl0eS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3YjFlYTI3OTQwZTIzZjFkYmRjMmE1OTVlMGE4MDM2MTg3N2U1NjQ0ZTg4ZDAyNTRiZTU1ZDU2ZmMyMjM0YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9wbGFpbl9ibHVlaWRfdmFsaWRhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyMTM3N2I4MDJhYjIxMmIyM2U3MGY1MzA2ZjAxZmQ4ZDZmYWI3MTVhODc4NmIyMjFmNjkwNTc1NDA3OGFiODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9wb3NfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzgwZThmYjhiZmNkMDczN2Q1M2EwOGJiOWUwNTFmZDAwMWUyOWJkNDIyNGVlNTkwYzA4ZWEyMDIwZDJlOWNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfcHJldmlvdXNfaW52YWxpZF9ibHVlaWRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNDhmMGVlZGZiZmMwNzQ3YzFiYTEzOGUwMzlkNWZmMDUwMjJjNzY2NDNiZTA3ODYxOTRjZTE2Y2ZmMmJjNjhkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfcHJpbWl0aXZlX2luZmVyZW5jZV9hbGxfZm91ci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5N2E1NjE4Mzg5Nzg4NTgyMWRkYWY2OTZkODQwODU4ZTNhM2Q5ZjAxOTlmZWUzYWVhMGI5MGZkYjkyNGFiNWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9yZXBsYWNlX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGRiMGMwZmI4MTI3YzI5NTQyNGQxMGE5ZDc2ZTQwNDMyNTI0ZDg0YTk0ZDE1MWY1MTAzOGQ3ZjM4ODcxNTgwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3Jvb3RfZW1wdHlfb2JqZWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA0M2U4NDNlZDhlOThjMTJjMjcwMzNjMDRlNjQwZGJhM2ZkMzkzYjhkNWNhYWJjYWMyOTE3YmFlZGI0OTcwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3Jvb3RfbGlzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1MDhjZWJhOWJjYzNkMjUyOGIwNWVjZmE2YjBlZjMwYjRmYTUwY2E0MGFjY2MxM2UxNTYyY2JhMzllZWExMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9yb290X251bGxfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTc4ODUxNmM3M2RjYjAxMDM3MTJiNTQzNGUyNDI2ZmYxNDlmNDdiN2M0ZWRmOTQ5YjdlNzA4OWQ0MDgzNmY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0Jfcm9vdF9wdXJlX3JlZmVyZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImYyY2UyMzU5MWFhNWRhZWMwMTAwMzYyMGFhNWU1NWI3ZGUwN2EwYjJlZTY1Mzg0ZDZmYjBhMjEyYzhiZTQwOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9yb290X3NjYWxhci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1YTdmZTk0ZmQ4ODdiZmE1OTQzMDEwZDBlMjZjYWE2YmY5ZmE3ZDMyYTRlZDg5NDJkZGRkMmVmMzczMzRlY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9zY2FsYXJfc3VnYXJfZXF1aXZhbGVuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDI1YTRiYTBjODM4MzczNzM1MmQ5OTRlMjg4NGI4YmQ5NDY5MjI4MDIwZjIwZTMzODhmYTYwMzU2NDc5M2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfdHlwZV9hbGlhc19yZWplY3RlZF9pbl9kaXJlY3RfYmx1ZWlkX2lucHV0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBlODFiZGUxMjFmM2E4MzMyZTE1Mzc1NzMxMTI5NjNiYjVhN2U2ZmY3Y2Y1MjJiMmE3YWYwMmIxZGI2MGY0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3VucXVvdGVkX2xhcmdlX2ludGVnZXJfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YTA2NGMyOGQ5ZmIzYTVlOWU0MzhmZjBlMzU4YWVjNDY1ZjdkNTJjMGQ2ZTRlOTY3NGM1ZjBkMzNlNDllZmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvY2lyY3VsYXIvQ19jaXJjdWxhcl9yZWZlcmVuY2Vfc2V0X2lkcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiOGU0MDMyYjc0NTAyZWQzNjViM2YxZjJhOTRjMDJkMTcyNDQ3YjgzZDZmYTFkMzA3MTU2MzdiNmJjMmIxNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9jaXJjdWxhci9DX2R1cGxpY2F0ZV9wcmVsaW1pbmFyeV9pZHNfZGV0ZXJtaW5pc3RpY19vcl9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiM2IyMjllN2UyMmFhMTllYTk1NWEyNTU4Y2ZlYTM3YmMyNzdiOTc4ZjQ3M2U3ZDVlYjVlOWEwYTQxYTkwZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9jaXJjdWxhci9DX3RoaXNfcGxhY2Vob2xkZXJfcmVqZWN0ZWRfb3V0c2lkZV9jeWNsaWNfYXBpLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjMxNjczODI3ZDYxNWE4YWM5MTliMTkyOGViYTdhNGU5ZjdkNzliNGMzMzkyY2IxODQzMGJiODE4MDIzNjY2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2NpcmN1bGFyL0NfdGhyZWVfZG9jdW1lbnRfY3ljbGVfc3RhYmxlX29yZGVyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzExNjc4ZTFlMGU5ZDhjYjE1NTE2ODUwOTU0MjI1NTljZjAxMmI3MTYxNjQxMDM5M2JmOGZkMzE3MjU1OWU5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2NpcmN1bGFyL0NfemVyb19ibHVlaWRfcmVqZWN0ZWRfaW5fZmluYWxfaW5wdXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OTA1NTZmYjkyNzhkMmNhYjA1ZmY1ZjIxNzM5MmU0YzA5ZjE1YzkzODEzOGNlZTM3OWFhZTRmNTgzMDJmN2NiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvY2lyY3VsYXIvRl9vcGFxdWVfY3ljbGljX21lbWJlcl9mcmFnbWVudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiOGQ0ZmMzYTcyOWRiMzhhMzZlZjc4NzUxYmE3YjQ1ZmU0OTU5ODdmYWQxOGQ0MmJhYTIxZTY2ZjZjNzgyMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9maXh0dXJlLXNjaGVtYS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTdkYmI1Y2RkYWQ4MTJjZTdlMmEyMmMzZDMwMDIwN2RkMzI5N2Y4MjEzMzRhMTg0Yjg5YmEzNmI0MzZiNTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9GX2lubGluZV9yZWZlcmVuY2VfcGFydGlhbF9lcXVpdmFsZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2ZjM1NGZmMzM3NjRjZmZmYmUyMGYyMjc4MWUyMDI0ODFhM2FmNDljMjM0MzAzNTQ1OWNiZjQ0NDAyZmY5MmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL0ZfcHJlZmV0Y2hfZG9lc19ub3RfY2hhbmdlX3NlbWFudGljX3Jlc3VsdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxNTYxMTkzYmI3MTJhM2U2ODFkOTkxOWE2OTQzNzBmY2UxODI5MmNhYjUyZjBjOGJlZjM5MDBhNDQ1MzgzYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL0Zfcm9vdF9yZWZlcmVuY2VfZGVtYW5kZWRfcGF0aF9vbmx5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjljMzNlOGJkYzVhYjQzMWEwMmNiYjYzZjE3ZWM5YjQzZmExMGNjNWJiNzMzNjAyZjIyZjQ3MjgyNzdmOTlkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2xpbWl0ZWQvRl91bnJlbGF0ZWRfbWlzc2luZ19yZWZlcmVuY2VfZG9lc19ub3RfYmxvY2sueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMGIxMmQzN2UwZjc2OGVmODljMzI1ZjRiM2IwYjY0ZjlhM2EzY2M2ZGUzMDI5YzhlYmFhNDkwOWM3MGQ0MjE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9SX2luY29tcGxldGVfY2Fubm90X2Nhbm9uaWNhbGl6ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhZTc1M2I1Njc0YWFhMjIwZWEwZmRiMGYzZTFlZTRiNzMzYTI4ZjU4ZmI1OTk1NGU5YzRlNDc2NGZlNDRmNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL1JfbGltaXRfZG9lc19ub3RfcHJvdmVfYWJzZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5Y2I1M2FhMDE3NGRlZjQ4MjFjNDk2MDg3ZWYxMTMzZWUxYjY4YzgyYTNmY2VmZjA4YjBlNjJiY2JkYWJhMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL1JfbGltaXRlZF9yZXNvbHV0aW9uX2VxdWFsc19jb21wbGV0ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmOTRiZWQxOWZiZDM3MTYwYTdiNmI0OTMyNDExYjBlZmE4N2NmMjAxNzc5NmFkZDJmZTdhYWMyNWIxYzQ2N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL1JfcHJvdmlkZXJfdW5hdmFpbGFibGVfZG9lc19ub3RfcHJvdmVfYWJzZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwZDA2ZWU3YmMyMDU4NTNkNTViZGUxNzY3MjgwY2M5Y2NkNTlkMWY0ZTQzYzdhNjg5NGVjNWRhMjdhMGM1MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL1JfcmVmZXJlbmNlX2JhY2tlZF9jb250cmFjdHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzFmYTJhYmJhYjU3MDAyZjFmMjI2NTZkYjNiM2Q2N2RmZmE4MTNjMGQxZDY1MzI0ZjRiNzVjNmU3NTQ1NjVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9SX3JlZmVyZW5jZV9iYWNrZWRfc2NoZW1hLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzFjNTczZjRjYzc5ZTljMmIzOWI3ZWVhZGNhMjNiZjVlZWNmYmQyMTM5NzFkYzk1NjFjYTdhYWRhYzczMmFjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2xpbWl0ZWQvUl9yZWZlcmVuY2Vfd3JhcHBlcl9ub3Rfc2VtYW50aWNfY2hpbGQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTFjYmQ5MWViMjgxNzc2NmQzOGYwMTE4NTYxNGFmMTA0ZjAwZDJiMDM2YWQ3YTVmZGE2MmU5YWViNzkxMGQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGludC9MX25vX3Byb2ZpbGVfZXJhX2xhbmd1YWdlX2NvbmZvcm1hbmNlX3Rlcm1zLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzEzNjRjN2QwNDAxNmY1YWQzMTJhY2FmZDQyZmFiMGIzYzQ4ZDIwYzM3Njk0YzY0NDJmZjQyNDJkMWE2Zjk5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL21hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc3MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYzRiYWQ3ZWNiMDE2YjkyZDA0NmI1ZTFhZTk2MmVhMmVjYmM2M2RlOTIwODMyMjQyNmY5ZjBiMmNmODZmMzlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfYWJzZW50X2FwcGxpZXNfYmFzZWxpbmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2Y3NDkzOWIxZTUxYzI2MzdjZmIxM2NlOWVjNzgwMzRhYzkyY2Q3MmFhYzQ3OTcxZGM3MzBjNTdlNGExZjg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfYnVpbHRpbl9hbGlhc19vdmVycmlkZV9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiZDMyMzRhNzliNzEyN2I4ZDY2MzkwNTE2ZGQ1YjRjMmU3M2E0ZWUxZDFjNDgwNTE3MThmYjJlNmE1ZjFlZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9idWlsdGluX2FsaWFzX3NhbWVfYWxsb3dlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyMWY0YmFmY2EyZDczNzIzMWM5OGY2ODBkMTM3MmEwM2FiMDFmM2VhMTEzZWQzMzRhYTMzYTBiOWI4Y2ZjYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9lbXB0eV9kaXJlY3RpdmVfZXF1YWxzX2Fic2VudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjllZDhiOWM0NTZjZDliNmNjYzcwMGZlYTBiOTIxNDRmZDkyNjlhNGQyOTdlMTIyMjY0ZjBiZDY5ZTQ4MTIwYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9pbXBvcnRzX29ubHlfdHlwZV9wb3NpdGlvbnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzUxYmRhOGM2MjU1OTE5OTZkNTUzOTg2YmUyNGZkOTNiYWI2MDhjNjgxNmNiZTkxZmE3Yjk0Y2Q3MjU3MTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfaW5saW5lX2ltcG9ydHNfYW5kX3RyYW5zZm9ybWF0aW9ucy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzY2ZhOTkxY2ZjZWFhYTYwYTJlODdhNmJlMGQyNTIxYzk5ZTM4ODgxNTA2MGJlZGFjNGFmN2I0MjNjOWFjY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9sZWdhY3lfaXRlbXNfZmllbGRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMWRkYTZmOTRhNzUyMTQyZjJlMzVhM2ViODBjN2UyNjcyZDcwZmQ1MDY3ZGNhNDFjZjEwNTI4MDNlYzYxMzM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfbmVzdGVkX2RpcmVjdGl2ZV9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2YjY4MTM3Y2E2MDZiMGMyODdjYzg1ZmMxNWU4YTBhMTI5MjUzNGQxMDk1ZDM0NmY4NTZjZjc4N2M4YTY3NTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9wcmVwcm9jZXNzaW5nX2lkZW1wb3RlbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGU3Nzg0ZTg1OTI1YWYzZTBkY2IzZjNkMWZkODQ4OTY4ZmZlMGE0NTA4MWUyMmZiYTJlODIxNjZlNDNlZDk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfcHJvZmlsZV9maWVsZF9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmYTU4YjZiMTM2MjA4OGQxMjIzOWFmMTQzODllOWY3YjJmZTc1ZTRjNDgzNzUzNmI3ZDc3MzkxOTc1MDgxYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9yZWZlcmVuY2VfYmFja2VkX2NvbXBvbmVudHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNGQ0MzRhNmUwNTRmZTRlMzdjYTMzYWVlMmU1ZjE3M2QxYzNkOGMyMGI2ZmJkOTU1ZDEyOWFiMTJiZDg5MWJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfcmVmZXJlbmNlX2RpcmVjdGl2ZV9lcXVpdmFsZW50LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzgyNjUwNTNmYjZjYTk5MWY4MTkzYmU5NWUwYTYyMzg2MDk0NjkwYTEyYTNkYWM0MTdkOTQyMDUzNTIxMzQwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3JlZmVyZW5jZV9pbnZhbGlkX2V2aWRlbmNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVmNGMzMGI3MjNiMzRlYjVhNmY1ZmU0OGZkMmNkM2E4ODMyYTBkM2Q5ZTFjNTllMzM5NzQyNzM0YjM1YzIxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3N0cmluZ19hbGlhc19yZXNvbHZlc19leGFjdF9kaXJlY3RpdmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDQ2NWI2YmNkZmIxZTFiYWMwODIyMTg5MDNiMWJkNmFkNjI1MTRhMDk4YWRjY2IzNGQ0YTc2ZGVkNTk2MjExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdHJhbnNmb3JtX2ludHJvZHVjZXNfYmx1ZV9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImQzNjRhYTVlMDIyNTA1OTZkMzFlZTU5OTQyZWZiNzM5ZjVlMzRiZjE5ZTA5MTFiOTAzNjk1NGQ5ZGQ5ZmQ0MmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV90cmFuc2Zvcm1hdGlvbl9pbnN0YW5jZV9yZWZlcmVuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyN2NlMjM5N2UzMzUyZTAxMWYzMzMwNzc2OTM0OTc0MTY4ZGIwNmRiM2NiNDBlOGVhNjM5OWFmMzA0YTlmZmQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdHJhbnNmb3JtYXRpb25fdHlwZV9hbGlhc19yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkOWVmNTViYjMxMmQ2ODQ4YzM3NDQ1Yzc4OGZlYzNiOGU0NDUzOWU2Y2RkMDg2ZmQxMDdhNjYwZWJhZDdlNzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV90cmFuc2Zvcm1hdGlvbnNfZGVjbGFyZWRfb3JkZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTYxNzJmZjI0MDM3ZjI1MWNlYzBkYmQ3NTM3NmQ5MjJjYWRmOTg5OTJlZTQ3MmZkODgzNWI2MjVmZTg0M2NlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdHJhbnNmb3JtYXRpb25zX3JldmVyc2Vfb3JkZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNGVhMGZlZDE4ZWE3YzM4NTA3YjQ2ZjUyODdhOTM1ZTNjZjEzN2YzMjA0MjY0N2VmNDQxNGM2NzRiOTg3ZTMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdW5ib3VuZF9zdHJpbmdfYWxpYXNfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWViM2E3MjViOGU2N2FiNzE3MWZmMmRjOTNmODg5NTJiNTliYmI1MzVmMTlhOTJmYzJhNTA2Y2ZmYTUwMGJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdW5zdXBwb3J0ZWRfdHJhbnNmb3JtYXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzA2OWI2NDhkM2Y5YzRkMDU3OGJiZTFjNTQ5YmJiZDY4YTViOGNkNGE0NzVmMTg5MmFhYjhjNjhiNzU4ZWY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdW51c2VkX2ltcG9ydF9ub19lZmZlY3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZGI4Yzc2MDM2OTRkZTQ0NmMzYThiZWZhZjQ0OTYzZmNlMmRhNTc5OThjYTk1ZGI1ZTNjNDYyYzk2MWZhZmExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9yZWdpc3RyeS9BcHBlbmRSb290VGV4dFRyYW5zZm9ybWF0aW9uLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDhmMDJlYzMzNmEzNWU1NDM4MzhjNjlkZTk1YWE5NTQwNzkxNmM5NTNiMmNkNmMzNzRlYWIxNzBjMzdhYjkxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvcmVnaXN0cnkvSEFSTkVTUy5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQxMDRiNzA0Mzc0N2QzODE1ZThhMjExMzU4YjNiYjI1NjljNGZkMTI5NzIwZmE4MGJkNjRlYjIyZWE4NDI2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvcmVnaXN0cnkvUmVuYW1lUm9vdEZpZWxkVHJhbnNmb3JtYXRpb24uYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjN2EzZmM1ZWRhY2M0NWFiODQ1NmU0YTA0MTRhMTFmMjI0MzRkYThlOGQ4MDYzMjM1NGYzM2MxMDEwMTczZWFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9yZWdpc3RyeS9TZXRSb290RmllbGRUcmFuc2Zvcm1hdGlvbi5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5NzczM2E4NTgxMmE0ODQ1Y2Q3ZjY5OWNmNWY3OThiMTgzNTlmNDU5ODRkMDY0YzhhZjZlNWRmODQxMjFjMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL3JlZ2lzdHJ5L21hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTcyMjk1MDAxZGNlNTA4OTNkZTI4M2M4OGRmNGVkYjY4OGI0MGI2OTU4NzNkZDgxNDM4NTczYTVhYjdiYzRiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfYWxsX2xhbmd1YWdlX3ZlY3RvcnNfcGFzcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmYTliMWU3OGFkYTRjOTc4MWI5NDdmZDFhNTQ2ZDRhZDJkNjM1NTI2ODY1ZmVhY2RiMDc2OGQzM2UyYzU4ZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2NvbGxhcHNlX2RvZXNfbm90X3Byb2R1Y2VfbWl4ZWRfYmx1ZWlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JmYmY1ZjJmZWY4NTJjNmU0YTM5OGQ2NjAwY2M2N2I0Y2UzZjQwZTg5ZjhiOGZkYzM3MDVkNTVkMzA3ZjBjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfY29sbGFwc2VfbmVzdGVkX3N1YnRyZWVfcHJlc2VydmVzX25vZGVfYmx1ZWlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2QzMjU0ZWE3OTM3OWVlN2NhMmMxMWRiM2RiMmVlNDk4Njk0NmM0OTE3MjZhMDJlZGFhMmEyNjE0OWM0NWVmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfY29sbGFwc2VfcHJlc2VydmVzX25vZGVfYmx1ZWlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmI4Nzc0ZGIzN2U5ZmU5OGYzYmUwNDNlZjEyOTg1NzIyODA4MDcyYmMwOTk5OGZjMWQ0NWM3MjA3ZTJhNWRjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfY3ljbGljX21lbWJlcl9yZXF1aXJlc19zZXRfY29udGV4dC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlNWRjYTgzYjQ1MzYyZTA5NGQ2YTVkN2JjMjA3NDNmMDFhY2Q4YWM2MDE3MzI1NTE4ZDBmN2FhYmRlZmM0NDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2RpcmVjdF9saXN0X3ZlcmlmaWNhdGlvbl93aXRob3V0X2VsZW1lbnRzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjcyYThkNTM3NjFiMjllMjkxMzliN2FjNDliNmM0MTI4NzM2M2IwNWMzN2MwYjgxNDMwOTFlYzNjMjgzMDBkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfZXhhY3RfZ3JhcGhfZnJhZ21lbnRzX2Nhbm9uaWNhbF9vcmRlci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1MzRlYjY4MWQzZjEzZDJkZWY5M2I4NGVhYzJkMzRjYjBmODc5NWFjYmRlNDk3NjU4MTA1M2IzOWE0NjJjMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2V4YWN0X2dyYXBoX2ZyYWdtZW50c19yb3VuZHRyaXAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YjNlZTk1OTYzYTQ2YjI2YWViMGVjYTVhNTMwZTM5Yjk4OTVhOGMyNjM1ZjU4NWRkNzNlNmZjZjNlODQyNWZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9leHBhbmRfbWlzc2luZ19uZXN0ZWRfY29udGVudF9mYWlscy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0YzRjMGFiYWQzMmIzOWMzYzk4ZDFiZGU1OWY2NjhmNzhmMDNmZGI5OTg3ZjRmYmYxOGNmY2MxZWQ5NDlmMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2V4cGFuZF9uZXN0ZWRfcmVmZXJlbmNlX3ByZXNlcnZlc19ub2RlX2JsdWVpZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzMDdjZjAxNjc4ZWYzOTMxYjZhMzZhYTNkNjExYzY0ODE4ZjU2M2UzNzQyMGQwM2E2OGRkMmQyYWQ2NGRmZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2V4cGFuZF9wcmVzZXJ2ZXNfbm9kZV9ibHVlaWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDE1NGUzZWZmZThkYjFmYzc2YWY4ZjQwNDRiYmY5ZDAxOGJiYzc0OTRjM2Y1Y2E3ODI0YTI3Y2U3MjQzMDVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9leHBhbmRfd3JvbmdfbmVzdGVkX3Byb3ZpZGVyX2NvbnRlbnRfZmFpbHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzc4ZjMxNmFmMjZiMmM3MjZjYjVkYjI4Y2U0ZmM0NjY3MDM2YTY1OTg3MDcwMzJhMmI2YTBkOWFiNjBjN2E3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9saXN0X3ByZWZpeF9hbmNob3Jfbm90X2RpcmVjdF9tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1MWI2NDY5Y2Y4YTc4OGI0YTk0MDVhNjk5OWRiNTg2OTUwMjA4YWQwOGM2ZWQ1M2U0NGQ1ZDFlNDk1ZTU5YjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX29taXR0ZWRfZGlyZWN0X2tleV9jYW5ub3RfcHJvdmVfYWJzZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyYWVjNTc5NzdmMjc0NGMzY2IzMGVhMDY5YmJlNzc0ZDkwZjE5MmFhMDIwOTI1NzMyOWM1YWI3OTYzODU0MDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX3Byb3ZpZGVyX21pc3NpbmdfY29udGVudF9mYWlscy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4MGExZTA0OGM5NGNhY2ZlMzI2YTdkMDM2OTI5YjA4MjRlM2U5ZjY5ZjFkN2Y2ODdlNjBlMjViMmIwN2ZiMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX3Byb3ZpZGVyX3dyb25nX2JsdWVpZF9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImY5NjUzMjA4ODI5NGQxMjJkODU0ZDVjMWQxZjIxYTNkYzBlOTcwZDA2MzliOTliZTYxOWJjNzA4NGIxYzJjZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX3NlbGVjdGVkX2V4cGFuZF9jb2xsYXBzZV9yb3VuZF90cmlwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2U4Y2Q2ODY4ZTNkMDg3MjJmM2VkNWY1ZWU1MDEwMWY1ZDhkNGEzMjE0ZWJiNGM4NmZhZTBkMjcwY2E2NGJlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0Zfc291cmNlX3Byb3ZpZGVyX3JlcXVpcmVzX2RlY2xhcmVkX21vZGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNWZkNmU3YWEzZTE1YmNlOGVlZTQ1ODdlZTMwNTRkMGNhNGRmNjQyODcwZDIwNzU4ZjViZjlkYmYzYjIxYTEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVnaXN0cnkvY2hhbmdpbmdDb3JlVHlwZURlc2NyaXB0aW9uQ2hhbmdlc0JsdWVJZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhNTU4YjhmZTE1ZjI5YzQwOWU0MzE0ZjJjZjNhMDg2YTI1M2MzMjE2OTM5NmIyNjE1YWI4YzBlNWZiNWYyMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZWdpc3RyeS9jb3JlUmVnaXN0cnlCb29sZWFuTm9kZUhhc2hlc1RvUHVibGlzaGVkQmx1ZUlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTRhNTM5Y2FlYmY3Y2ViN2Q1YWI1YzIwNWM1ZmZjNWM2NDBlNDUyYjY3MTQ5NTdmOTJkOGFmZmFlOWU4ODZmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3JlZ2lzdHJ5L2NvcmVSZWdpc3RyeURpY3Rpb25hcnlOb2RlSGFzaGVzVG9QdWJsaXNoZWRCbHVlSWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDRmOWJjYWE0ZWViYWNiYTI2MzJjOGMzODc1ZGU1MGYxY2Q2NDA5YjM4OTUwZDJkZTYxYjVkMDMxNDUxMmExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVnaXN0cnkvY29yZVJlZ2lzdHJ5RG91YmxlTm9kZUhhc2hlc1RvUHVibGlzaGVkQmx1ZUlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDY5ZTNlYTNkZmU1ZGZkYzNmMmViYzRlMjhmZGVhYTI3Y2U2ZGQ3ZmM2NjE4ZWZmZDZhMWI3ODY4MzFkODViMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3JlZ2lzdHJ5L2NvcmVSZWdpc3RyeUludGVnZXJOb2RlSGFzaGVzVG9QdWJsaXNoZWRCbHVlSWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZGVjZjA0MDQ4ZDAyZjk5NTMxYzQwM2VmYTIwMzUzN2E1YzcxOTY1ZjYxZjdhZDk2MGRmM2E0OWYxNWUwM2E1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVnaXN0cnkvY29yZVJlZ2lzdHJ5TGlzdE5vZGVIYXNoZXNUb1B1Ymxpc2hlZEJsdWVJZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0MDc4NWNjNTU1NjY0NjUyYmM5MjgxOGUzNzhmNTk5MjQyODg2YjUzYWJlODRmZWZmMmZmZGYyMzk0YTczNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZWdpc3RyeS9jb3JlUmVnaXN0cnlUZXh0Tm9kZUhhc2hlc1RvUHVibGlzaGVkQmx1ZUlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY2Y2M2NmFkZjAxYzYzOWQzMTE4ZWJmZGFlZjgxYjgxZDYzMTVkOWVkMDJjMGYwZDVmYmYzZDdiMGZkOGE0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3JlcHJlc2VudGF0aW9uL0JfZGlyZWN0X2NoaWxkX3JlZmVyZW5jZV9lcXVpdmFsZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjN2NkMGU1ZjMzY2VjOGM5NzAxZDNjZDQ1OGRhMzMyMmU0NjcwMDRhMGRhMGM1NDhkYmFiNWMzMTZjZjBkYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXByZXNlbnRhdGlvbi9GX2RpcmVjdF9ub2RlX3ZlcmlmaWNhdGlvbl93aXRob3V0X2Rlc2NlbmRhbnRzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDliZTkwZmQ0ZDM5MDg3MDIxZDNhNTFmYmY1M2E5NjMwNDVmNjczYzBlNGE1NmM0YzBlZTI4Yzc0NmNkYmM0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfYXBwZW5kX2Nhbm9uaWNhbGl6YXRpb25fZmluYWxfcGF5bG9hZF90aHJlZV9pdGVtcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhYTAwYzA4N2VjZjQ4YjkzM2ZhNzRhNjJjNWU3ZjJiOWZjZDkxMDFjYTA2YTRhNTJmNjZlZDFlNWMxZGJhYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2FwcGVuZF9taW5pbWl6ZWRfcHJldmlvdXNfcm91bmRfdHJpcC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3Njg0ZjYxYTkxNzEwYWI3ZWJkMmJjNDIwOGYyYTUwZjMxNGRiYmZjZDc1YTNkZGI5N2JkMmQ5NzQ1ODZhNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2FwcGVuZF9vbmx5X3JlamVjdHNfcG9zLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQzYTk5MzU3ZDNkMmU2YTQ5NWQ1OTQ4MWFkNWMwMDE2Yzg4YjFhYjA4NmIwNjlkMDkyOWY1ZWQ1NjM2MGY0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfYmx1ZV9pbXBvcnRzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQwOTRlN2U0MjY0MDdjODEwNDhhODk2MjJhYzc1NTQ4Y2RhZGYzNzJiOWE5OTdjZjU3NDZlYjRmMmZjM2NmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfYmx1ZV9pbXBvcnRzX3R5cGVfaXRlbVR5cGVfa2V5VHlwZV92YWx1ZVR5cGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODk5ZDg2ODFiNDNjM2VjZDMyNTAyMDk3MzQ3ODlmNmFiMzQ2YzgzZWE1OWEzMmFjOTQxYjM2NmQxZTU3Y2YzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9jYW5vbmljYWxfb3ZlcmxheV9ub19wcmV2aW91c19ub19wb3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDJjNGEzOTEyMGIyZmFhNTg3ZjgyODYyNGM0ZjYxMmNiOGFiM2EwN2YyZTEzY2U4YzliYzVhYmNiNDJmZDE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9jYW5vbmljYWxpemF0aW9uX2RldGVybWluaXN0aWNfZm9yX3NhbWVfcmVzb2x2ZWRfdmlldy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5N2YxNzAxZDhhNDVhZTU5MDRmMGRhMzgyYTU4YzIwMjQ2MjM4YzIzNTAzMWQzNjdjNGU1OGJjZjc1OGM5ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2NoaWxkX2ZpZWxkX2xhYmVsc19tYXRlcmlhbGl6ZV91bnRpbF9vdmVycmlkZGVuLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDI3ZjM3MDBhMDBhNTBiNjM0NmIwNTVhMTMxMDFiNmZjNTcyMWM5OWE0NjAyMmRjZjI0YWI3Y2NlOGYzMWJkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfY29udGVudF9ibHVlaWRfaXNfY2Fub25pY2FsX25vZGVfYmx1ZWlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDQwYTg3NzdkNGY4MDBmODM3NTlkYWM1OTg0OTcwODUyNTE4ZWEwYzMwZTI3MjkwZjBiNzJmYmYyOGE0Y2FiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfY29udHJhY3RzX2Nhbm9uaWNhbGl6YXRpb25fZGV0ZXJtaW5pc3RpYy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2MmM4NWYyOGFjN2U2MjZkZjg0ZjNkOGY1MTIyNTQ5ZWIyYmU5ODQ3MDcwMjg3OWUzNGFhNWE5ZTZhOGU4YzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2NvbnRyYWN0c19tZXJnZV9hc19jb250ZW50LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODJmMzExZjdiY2U0YmIyOTNiM2VkNDFiNWQxZmMxNDg0MDNlNWI5NDM3Mzg4M2Q4ZDBiNTg2MDk4YjM2NWM3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfY29yZV90eXBlX2NvbXBhdGliaWxpdHlfbm9taW5hbF9ieV9ibHVlaWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYWQ3NTllZTIxZmRlNjYzMGE5MjkxMTlhMGMyM2QxYTYxNTI0NGE0ZjMyMTJkNWE4MmZkZTZmODljY2Q2YjRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9kZWZhdWx0X3Bvc2l0aW9uYWxfcG9saWN5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWJjMzgyNDZjNmIxNzYwMGY3ZDBhZGFjYzEzMmM5ZDZkMjY3NzM2MzExMTUxMDIwYzg0NzU4NzMxYjdjNmEyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfZGljdGlvbmFyeV9rZXlfY2Fub25pY2FsaXphdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyNjg5MTM1ZDQ2M2NkMDNiOGNhMjhjNzlkOGY4MDVhZjM0MmFkMDczMTc3ODg2ZDYxYjI1NDRhOTI4ZGE3OWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2VudW1faW50ZWdlcl92c19kb3VibGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MmM5NjVhMDU2MzlhMGFmMWMwNGM0ZTliNmE5NDFjZGIwOWM0MWNjN2NhNzQ4ZWQ1MTQ4ZDdhNzZkNjcxZjkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9maXhlZF92YWx1ZV9jb25mbGljdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxNmVlYzM2YjU3MDdlMDljYmMwNzUzYWI2MjE2MGE4NzVlYjA1MWI2YzQwZWY5YWRiZWMwOGJmNWE0YTQ1YzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2luaGVyaXRlZF9hcHBlbmRfb25seV9wb2xpY3kueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDBjYTFkY2QwODJjZWE5OTk3MzRhYjVjNjNiMGQ2MjZiOTg3M2NkZDAwZDBkOWUzMGIzZjM0ZmM5ODJjZDM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9pbmhlcml0ZWRfaW50ZWdlcl9sYXJnZV90ZXh0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzUxM2Q5NzczNjM5YmI0NTQ4MzBkODc0MmM5MzE0YTJlNGM3ZjcwOWE3NTQ2MTZhNmI4Y2EzMzdmZTlkMDIyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfaW5oZXJpdGVkX2l0ZW1fdHlwZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlMWEzOWYyZTRhZWVhZGVlZDFjYmI4MTk1MTkyZjlhYTY4YmU0MzI1Y2Y2NTk5NWFkMjhmMjgyMTcwNDc4MDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2luaGVyaXRlZF9rZXlUeXBlX3ZhbHVlVHlwZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjOThiZGM0ZTJkM2VkYzAwNjllYzVkNjYyMDA0OTk3ZThiNWUxZDNhZmNiNjgwMmM3OTY4NzY1NDExYzZjYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2luc3RhbmNlX2ZpZWxkX2tlcHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNWJmMjM5NGQxM2U0NzE2YTllOTcwMjQ0NzcxMDk3Zjc3NzYyY2ZmMTNmODI3OGZjYmQyZGM2YTEzMDQ5NzIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9sYWJlbF9vdmVycmlkZV9ydWxlcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhNmIxNTE0MzZmNGYzODc1ZDI1NDcxMzY5Yjc5YmQzYTA2M2MzMTg0MDlmNTE3MmQ4YjJkODVjY2RkM2NlYWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2xhYmVsc19tYXRjaGVyX25ldXRyYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNDMzYmFjNDc5MDJhZTJiNDVmOWY4N2E2OTc1M2E5NWNhYzA5Y2NjN2Y5OWE5NjE2Y2JkMmY5ZDc0ODY1YWE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9taW5maWVsZHNfY291bnRzX29yZGluYXJ5X2ZpZWxkcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlOWY0YmYyMjllZDJkNmFmMTA5ODJhODk1ZjhhMDJkODg2Y2Q4MGJmYjc2OGQ4MjhmMDAyOGY3YjA2ZjNmNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX21pbmltaXplZF9vdmVybGF5X3JvdW5kX3RyaXAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNjNiMTE4YWZlMTFiMTExZDJiNGRhNmZlZWMwOTQ1NzIyZGQyMGM2NzllYzIwYjlhOWE0NjM3ZWQxZDI3ZmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9ub25jYW5vbmljYWxfaW5oZXJpdGVkX2ludGVnZXJfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYzg2YWI1M2U2ODAzZDFmZDZjMDk2OWZmNzIyMDU5YmNlNjRkMTMyN2ZmMWZiNzQ1NjhkZjY2NWRhZTJjZWI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9wb3NpdGlvbmFsX2Nhbm9uaWNhbF9maW5hbF9wYXlsb2FkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQyNzkwNWRiOGIzNzE2ODFmM2U2YjRlYTg4Mzk5NWNiZjk3MmY3OTM4OWViNWI2YmQ4NzEwMjRmNTNjYzQxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcG9zaXRpb25hbF9taW5pbWl6ZWRfcm91bmRfdHJpcC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImE3Njg2MThmNWVlYjMyYzgwZDgxMDhiMzM5OTkwZDk5MGJiMTFlMDc0MTJkNTlkMDNkN2EyY2JiY2ZlZDUwMjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3Bvc2l0aW9uYWxfcmVvcmRlcl9vcl9yZW1vdmVfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZDQ3YmVhYmY5Y2FhYWJjNzk4OTc5ZWQxMGQyM2UzZjZlZjlkZTUxOGExMGZiMzFhYThiN2M0ZDQ3MTNhYTQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9wcmV2aW91c19hbmNob3JfbWlzbWF0Y2gueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzN2JmMDRlYTc0MDgwMzkyYTljMGM5ZWQ1ZjE1MjkwZTY4MjUyYjU3NzdiNDhlOGE4YTJiNDZjOTg5YWYzNGY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9wcm92aWRlcl9yZWZlcmVuY2VfY2Fub25pY2FsaXplc19iYWNrLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjJhOTA0ZTAwMmIwNjQ2OWYzZjViODdmNTE0MzI1NGI1YTAyNDdmODI1OGJiNmI2YzRiMmVkMGUzNjNjMzYwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcHJvdmlkZXJfcmVmZXJlbmNlX3dpdGhfb3ZlcmxheV9rZWVwc19vdmVybGF5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjc2OTQzN2E5ZjhlNjAyZGI0N2ViNGZlNjIzYTZmYjNiMmU0NGYzMzFjNGVkNTM5YjkwYjZmOWMyZDJlY2ExOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcXVvdGVkX2RlY2ltYWxfd2l0aG91dF9pbnRlZ2VyX2lzX3RleHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjVlYjEzYjMxMWE2YTM2OWE5MGY3MDFkOTgzNzg3ZWJlMDc3Y2FjODkxZmQ1NmQzODEyYWMwNmEzODIyYzY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9yZXF1aXJlZF9zZW1hbnRpY19wcmVzZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5MTU1YzdhOWFkOWJiZTlmNzE0ODc1YzM0NzQ5ZWNmYTc2ZjM1MjUwMjNmNDJkZGNlMmYxZjE3YzRjMzU0ZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3JlcXVpcmVtZW50X292ZXJsYXlfdmFsaWRfYW5kX2NvbmZsaWN0aW5nLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGRlMzMwMGU2ODE5OGE2YWY1ZjkxNTEwMWVmZjBjMWQxMzBiMTY5NzQwZDVlYTdjOWIwOTNkMWY0Zjk4NjliNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcmVzb2x2ZWRfZm9ybV9ub3RfZGlyZWN0X2NvbnRlbnRfaWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTg3MmZkZDI3MWY5MjkwZDU4MzVkZDdjMWM0NmVkOTE5MDFiZmFkM2E0ZGE4NTdlMDUzZTI3ZmI1MmMyOTRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfYWNjdW11bGF0aW9uX2NvbmZsaWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGNkMjczZTdkNmM2MjljZWZjNjg2YTc4NTk4MzNiNTNkNjk5MmZhYTk1ODFjNThmNDZjOGI4MjIzZGFjYjk3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX2RvdWJsZV9tdWx0aXBsZV9vZl9leGFjdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzMWUzY2E3ZTQxMGNhN2UyYmQ0YjcwYTZhNTg0NGM4NGM2MzIwZDA0MmYyOTRhMjc5ODc4MjY3YmJhN2ZhZTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3NjaGVtYV9kb3VibGVfbXVsdGlwbGVfb2ZfcmVqZWN0c19kZWNpbWFsX2FwcHJveGltYXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGNhZjJlZWU5ZGI5MWE4MTg1NmIxMDgxZWY4MTY5MmVlNzcxMjg5NTliMjUxNjRkNzRlOWY4NGU0ODU3OWY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfZW51bV9vcmRlcl9hbmRfZHVwbGljYXRlc19jYW5vbmljYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODI5OTJjMTY1OTRiYmJhNjA3ODk5MjM5NGY2MjE4YmEwYWNiMzIwMGQwMzY4NTk0MjI2ZTcwNWU3Y2UxYjdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfaW50ZWdlcl9tdWx0aXBsZV9vZl9sY21fbWVyZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNmNiZGM2ODFiMmQzYmU2NmNjYWM4MTE2NzBjZTk0ZmFmNGJhYmRmODI0YWM3ZjdjNmIzY2I4NjBkYmNjZGViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfbGFyZ2VfaW50ZWdlcl9taW5pbXVtX3dpdGhfdHlwZV9hbGlhcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzMTA0NWUyZGE2NDM5ZjJjMTRmZTFjNzQwMjg5MWU4ZDA2MzliMWQ5NjIxMGM1NmIzOGNlYTk0OTE2YzIyZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3NjaGVtYV91bmtub3duX2tleXdvcmRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OWMzM2VhZjE2YTBlN2ZjMjliZDllY2JiOWViZjQzYTQyMTQ3MTIxMmU2ZGRmYzZhOGRmNDFiZmYzOTliN2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfdmFsdWVfc2hhcGVzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDFkYTMwMzRhY2JlMGY3Y2U4MDk3NDQ4OTQyOGRmMGVkMWE3NWUzMjNhMmNkOGI3ZWI4NDdlMzkzODliM2YyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX3dyb25nX2tpbmRfa2V5d29yZHNfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OGRjYmRiM2YwZTNiY2U1NmUxZDhmNTE5NzFlNzIzNTNlMzVlZTYzNjViZWNmYmE2ODNlOGQ0NGFhZjc1YWYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zb3VyY2VfZW1wdHlfb2JqZWN0X2xpc3RfdG9fZW1wdHkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmI4NzIwZGUyYmQxM2Y3OTFhZmM2MTU4NDBiNzBhNzQ0ZWY3MGViMGUxNjM1MDFjYWEyMjY5ZWVkNzc2ZjY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zb3VyY2VfbnVsbF9saXN0X3RvX2VtcHR5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjAzODY5ZjU4MzA5ZjI1NzkwOWM5OWRjODlhYTA2Yjc5ZjBiY2ZiZTMwZjEzNmIzMWU3ZWEwNmIzMjk3OGIyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc291cmNlX3JlY3Vyc2l2ZV9lbXB0eV9vYmplY3RfbGlzdF90b19lbXB0eS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiOTE4ZWQ3NjY2MmUzOGRjZGIzOWM5YWRjYTU0MjNlMTVmNzMxZWUwZmNjMWU1MzE1OTM1Mjg0NzBmNmNiYWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3NwZWNpYWxpemF0aW9uX2NyZWF0ZXNfbmV3X25vZGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTk4MGZkOWQ4YzFhZWYzNWY4NTE5MWE3Mzg1YWEwNGFjNjNkOWM1YTMwZjQ2NWIyZDc5MTA4MmIzY2Q0YWU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl90b3BfbGV2ZWxfdHlwZV9uYW1lX2Rlc2NyaXB0aW9uX25vdF9pbmhlcml0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODQ1YmM0MGEzZTY2NTY0MTE4NzFmNTBlY2Y5MWM4MjgzNTk5YzI3ZDhjNmZmMzIzMWY4YTc4MWUyZmQxMzJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl90eXBlX2FsaWFzZXNfcmVtb3ZlZF9mcm9tX2Nhbm9uaWNhbF9vdmVybGF5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmY0YjUwZmY5Y2Y5NjI0ZjczNDExMjEyYzYxYTEyNTczM2Q0NWQwMDA3Y2M3Njg2ZDMzZTgwMGY3ZTJlMTFkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfdHlwZV9jaGFpbl9tZXJnZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3ODdhMGI4NWU2ZGZkMjYyNGQzMmY0N2Q2YTFmYWFhMTRlYjZkNTk5NGYyY2I0YzJlZTNlNGEzNTBmYzBlYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3R5cGVfY3ljbGVfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTg3OWZiYTI1ZGFkOGNjMjUwNGQzZjY0YjQwYzBkY2NlMjQxMzY3ZGJmMDBkNzljNjJhMmYxMDJiYjg1MTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl90eXBlX2Rlcml2ZWRfZmllbGRfcmVtb3ZlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI4YWY1YmUyMmE3ZjI2OGRlODcxYzc1ODZkYzIwODg5NTRhMmMzNDk1YmYwNGQ3MTFhMzcwMmE2Y2IxZTYyMTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3ZpZXdfcGF0aF9yb290X2lzX2VtcHR5X3N0cmluZy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwNzE1NGIyZTQ2MzUwZjU2MzNlOTllZTYxN2RhZGMyOTU4NTI1YjZiYmM2ODlhMWNkOWM5NDA3YzJkNmQ4YzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy92ZWN0b3ItY292ZXJhZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGNmNmEyNWM4M2M2YzFlZmMwZDExNDFhNzNlOWQ4ZmI1MzRjZjIzMWZiMGZmZmYyOGQ3MTI4YjIyYzliNGM1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2NvbnRyYWN0LzEuMC9zcGVjLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTE3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0MDYxNTM3OTFlZDk5Y2Y5NzE2MzcyNmI4ZDJhMjcyZTNmMGNhMTA3OGRjNmM5ZjY5YjgxODU1ZDgxZTVjODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9sYW5ndWFnZS8xLjAvc3BlYy5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg3OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjM0YjBiNDIxOTBhNzk4MjgwOTc4MWI1ZWZkYWEyZTVmMWFiNGI3ZjhkODcwZmJkMWZmZTcwMjBjYzdlODY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVsZWFzZS9ibHVlLWxhbmd1YWdlLWNvbnRyYWN0cy1lbWJlZGRlZC1tb2R1bGVzLWNvbGxlY3Rpb24tcGF0aHMtMS4wL1BBQ0tBR0UtTUFOSUZFU1QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTg1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlODMyNzBmYmFlODM2NmQxYzhjZjYwMDdhOTBiNDFhY2M3MjM5OTliMWZkNDllZmU1ZGU5ODQ0ODZkNzUwNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL2J1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEwNDQ1MmYxMzU1MDIwMWIwMGRhOTZiMDdlMjJmMWUwMzQwYmMxMjJjNzdlYzJlMmEyOWJlYTM2ZTUzY2M4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkQ29sbGVjdGlvbkJlbmNobWFya1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjk0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1NzhhZTgyYWRkYmI1ZGMwNDJkMzc1ZjJjNWNlYTI2NmQ0ZGZiNDMwMjE4ZTljNTQ1NzdlY2Q4NzBhMWMzMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZENvbGxlY3Rpb25NZXRyaWNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ZGZhN2JkYWNmZDUzNDlkODJlOGVjMDdiNTg1ZmRhYzkyNTZmZDI4YTY3NmM5ZTM3NjZhNjExNWVlMWI0OWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZENvbGxlY3Rpb25QYXRoc0JlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjM2MWFmMjdmYzhiZTIwMjMxY2E4MWZhYTg5MmIyNWFhYzEwZDkxNzVmZjJkNjk2NzVkODEzMzgyZmZhYTBhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkQ29sbGVjdGlvblByb2plY3Rpb25TdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZDBiNjVjYzg1M2NlN2U5NDg4NzM3MWRjMjlmZTBlMjQ4ZTYwM2ZlYjUyMjJmNjc2YjNmMzQzNGY5NjY2OGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRDb2xsZWN0aW9uU2VsZWN0ZWRQcm9jZXNzaW5nU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjkxYTcxYzViYmI0MDgxODU3YWRkNmM3MmFiZTlhMWViMWI4ZGY1OGMzOGRiZWJiNTI2YTUwNGVkZjllMzFlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoU2VxdWVuY2VCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ3MmNjNjdjMTZlNDBmZmFlMjk4YTBjMzk0ZGY0ZDExMzk5YTA0YjcyOTc0MzMxNDc5MjI3OGZlNmUyZGM0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9BY3RpdmF0aW9uSW50ZXJ2YWxWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTc0Yzk2NzBmOGNhZWZhMWY2YzgzNGNlZjViODI4MTliNjQ3MDQ4YjFjNWFmMDRkZTI1ZmMxZTViZmJlZTk1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9CYXRjaFBhdGNoUmVjb3JkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImExMmUyYTRlYjg1OWM4MThlZWJjOWUwZGEzMWJiMjIzOTQyNTg0OTAxMTZjYmNhYzM3M2FiZmJjNTllMTAzOGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQmF0Y2hQYXRjaFJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTlhYTI3YmM3YmIwNTEwM2M3NjljYjEzNDJhNGJhNWU1YWE0NTRjNGRmNzQxZmMzMzRmNjFhYzhkODNiOWYyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9CYXRjaFBhdGNoVHJhbnNhY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0Njk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JiZTliMDUxZWYwYmNlZmYyMjE1N2RiNTY0YTRjNWI5ODBjMDU4ZDQwOTUyY2JlNjA0ZGJlN2MwMWRhYzJlNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9CbHVlQ29udHJhY3RzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MWE1MThlMDhlZWExM2NkNmJlYTM3YTE1YThlZDZkZWQ0ZjVmZTlhODIzMDUzZjE0MzJiNzQ3OTQ2MGYxMGQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0J1ZmZlcmVkQ29udHJhY3RFZmZlY3RFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNGIxYWU4Y2VhNmY5ZWY2ZTI3YWM0MDE3MDlmYzk2MDA1YjNiYjQzYTU4M2IwMjBjZGQyOGQ5Y2QyNTkyOGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoYW5uZWxDaGVja3BvaW50Q29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjI3NWZiMWM4YzljMTZkZGQwYmI2OWJlYTBkM2NhNzBiNGU1Yjk0MGQ3NjRiMDA1MmYwZThiYTY2OTAwNGI4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsRXZhbHVhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzY5OWI1YWI4YWQ4ODQzNTdmNjlmODYwMzRlMzRmYTM2Y2FhNDNmNzY5MDMzMWFlNzJiYzFlODJlMmRkMzNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoYW5uZWxFdmFsdWF0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2I2NDJhYTg4NWYwZGVkMTQ5ZDMxMjJhZGIxZTdkYjZiZmY0OTU2NDgzMTI2Nzc0YzgxZmEwMGE0ZDJhZDk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoYW5uZWxMb29rdXBSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM0MjAzNzVkZThmMGRlYTFkYjY1NTE2NDlmNTc2M2NjYWJkN2QzMTlhZWE1ZmVkYzA1YWNlMzQxNzExOTkwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsTWVtYmVyU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE4MGUwNWIxMDA0MWM5MjQ5NjllODYxMjUwODczM2E2N2VmZTA2OTU2N2I4MzI0MTExYzg1M2VkYWY3NGM2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhNTVlOWJmMmVjMmI2ODkzYmJjMjk2YzI0MDQxZTg2Y2M2MjExNGI5ZGIyMDFhODNkYWQwOWQ1NmY5ZGNmMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbFJ1bm5lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmYzOGYyMWQxMzRjYWUwM2MyYTBjYTE3N2QyMDQ1MTc0NGQzMjM3OTdiODZiMDk5MDM3Mzk3MmM5NmE0ZDFjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGVja3BvaW50RG9tYWluLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFkNzczNjI1ODY4OWI1OTg0Y2YzNjAxY2M3ODA4OTIzNGY1ODAwMWYxN2VlNzlhZWYyY2YwNzQ2MTg2OWQxYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hlY2twb2ludElkZW50aXR5Q2FjaGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjBkOWJkNmI3MzNjODg4MDYyMzlmYzBiZGIwODI5ZDQ4YWQ2OGExNzRjYzI4MGNhYWYzN2RiMmI3ODEyMTI2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGVja3BvaW50SWRlbnRpdHlDYWxjdWxhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImExODM0Yjk2OTRjMzJmNTk4M2Q5NmVlZjg1NjcxNjEyYWNhOTQ0MmQyMTQ5YTgyZTIwODk3ODhiZWIyNmE5ODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hlY2twb2ludE1hbmFnZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiMjEyY2Q4ZmJhNDhjZDU2MjRmYjljZDM5YjJiMGJmZmU0ODZlNGZhZjU5NTg3YzRjNjRkMjY3Njc3ODBlZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29tcG9zaXRlUHJvY2Vzc2luZ09ic2VydmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2MDBmZTNjMmI4YzQ3MzJlNjg3NTU3YWRkYzkzZTQ2YzhiNDUyMDk0ZGE2Nzg2ODk5ZDg3ZDFkNmEzZDVlZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29uZm9ybWFuY2VDaGFuZ2VkUGF0aC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzQwZDdkZDcwYThkZjcwYmY5NWMzMzY3NTI5MDhhN2U2MzFkZGRiNTM1ZjY2MWIwODY2YmEwYmRjYzA3NzQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbmZvcm1hbmNlUGxhbm5lck92ZXJyaWRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyY2U1ZTkwMzM3M2Y2YzczZjlkZWFiMDg0ZWZkYjAxZTI4MzY3NTY1MTg4YjZiZjY4NjUxNmI1NTI5ZmY4ODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RCdW5kbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQ2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNzIyMmIxMTg1ZjY5YmJmOGM4M2U3ZGI4NjQwZjZlMDhlZTczOGI5YzVkOTYyMWRlNDFhMTE5ZjUwOTk2MzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RDb250cmlidXRpb25Db2xsZWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ4NWZjMmM3YjU2YmIyOTVlZjhjYWRlMmUyNWJjYWYxNzFjNTNhMDg4NzE0ZjE3YzE1MTAyYTg2NmQ4NGYwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdENvbnRyaWJ1dGlvblJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIzMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWMxY2YxZWZiNjVhMmZkN2Y0NjM5MGE2Y2JiYmNlYTQ3OTZmZTBjY2I4Mjg2ZGExYTExOTkwNzEyYmJkMDAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0RWZmZWN0QnVmZmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiNTA5NDEyZGRhMmNlZDEyODVjYzgzMDk2YWJjZmM5MDhhOTI5ZDcwNmM4OGJlOTY2NDE0ODFiNmJhNmNiNDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RIZWFkZXJMb2FkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxNjA5MzQzYmRjZGRlYjhkM2U5MmNlNzY5NDFmYmNkMmEzZGQ1MzEzYzE3NDJiNDAyZTBkMTMyN2RhNzQyOWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RMb2FkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1MmMzNDhmYjFkNDQ2M2EzZjk5ZjhkMzlhOGE2ODFiODNiZjYwNWZjZTA2ZjMzNzFkOGMxYzJlZjEzNmY5NWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RNYXRjaGluZ1NlcnZpY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzQxMmMzMDA4NWRkMDIzYWVmNjFmZDBmM2M1NDA3ODE0YjIzZWZkYTAxOTZiYzM5YzY2ZjlhZDJjMmEzMzc2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzYThiYTVjMmI0MGE4ZjNjZWQwODU4N2U1Mzk1ODU2M2ZiYWEyZGNjZWFhMDFhMTUzOGVjMzE4NGY5YjE1ZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RQcm9jZXNzb3JSZWdpc3RyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MDYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWRiY2U1Yzk4ZjdiMzkzNTg1OTdlZjdhZmM3MzJjZjM3NjNlNTdiMjRkYjZiMDk5NjJiNzY3ZjVkM2RiMDgyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdFByb2Nlc3NvclJlZ2lzdHJ5QnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMGFiMzIzYTAyZTg2OTQwOGI3NDVlMTVlODkxZWNmMDhkYWU4YjE4NmYzY2VmMTI3ZTQwN2U0MzU2NjM4M2YwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0UmVjb2duaXRpb25NZXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjdiOGQzMzk5NTg2YWY3OWI0OGY0ZDliNmE2NzRhM2MxODc1MzQ5YjVjZDA0OTIzNGI0OTgxMmNiNTUxMGZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0UmVmcmVzaFNlcnZpY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5MzJjNzg3MDMwZTA1NDhiYWRjNTNkYzFkMGJkMmI1ZDZmZDQxYzBkMzc4MjhkMjM0MWQzNGQ4OTVlMWIxMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RTbmFwc2hvdENhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOGIxZDc4OWY1NGM4ZTVjMDc5ZDVjNGQyZTAwZjNlYTU4YWI0NzE3YjJjOWYzMzIyMTMwMzQwNWQ5NTg5YWJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0U25hcHNob3RGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1MzZlNjFkZDM3MTM4Njc3MzE5ZjI5ZGRiNjcxYWI0MWNmMmMwMWI3OGEwYTI2ZjI2ZDJhM2U5MDY4NjM0N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGVjbGFyZWRUeXBlTGluZWFnZU1hdGNoZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTYwODY4YWNkZTQwNmRkN2QyNmZkZWVjZDk3ZjM3ZDdmNzFhMjhiOTJlYzI0ZDQ3ODI1ZDg1ZmRhM2Y2NDhlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9EaXJlY3RDb250cmFjdE11dGF0aW9uUHJlZmxpZ2h0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlNWUxZGY1ZDhmYWNhZmNmMDc3MWY1OWM4MmQ0MGE0OGY5ZmJhNjJhNmY4MmZlMjYwMWY1ZDA0MGY3YjQzNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGlyZWN0UHJvdGVjdGVkU3RhdGVNdXRhdGlvbkd1YXJkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQ1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxMzhhMGQ4OGZmYjZmNTNlNWNjYWMzNmY0NmIzZmM0ZjQyYzU1NTRiN2Q2MTZhZWU5OWU1MWZhNWQyY2Q5MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGlyZWN0U3Vic2NyaXB0aW9uU3VyZmFjZVByb2plY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWVjMDEzZWRkOTRmNTFlOWE1YWQ3ZjM0NjlkNzY1YmZmYmUwNTExMGY3ZDZjOWM2MGFiNzM4OGU1YWQ0MWNiYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9EaXJlY3RTdWJzY3JpcHRpb25TdXJmYWNlVmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmNWJlYzNkYTllNDJjNmYzZGU5ZTU2ZDY1YzQ2MGFiMTI0YTVmZjk2OWNjNjdkMWM2MzhhOTM5YjMwNGQzMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwYTlkNDlkMzFlNWIxOTY4YmNjMzRjNjVhYjg0MDg4YzhlZjQ0OTE5YWQ3NWE5NDU4YjU4MmU3YmNhNTdhNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUnVudGltZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmMyM2Y5NWU4NTAzMjFjZmU4NmYzOTYwZGQ2N2NhNWZmYjVjZmY0ZDc4OWNkNzI0NjZmMjAzOTlmY2U1ZWNhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGIzNzFiNGE2MmNlY2M0YTFmZDk1YWRjY2I1MzNiNjg0MzQ1NTM5Y2YzYzIyYTBlYTUyNTZhZTllZGI0OTM1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckFkbWluaXN0cmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTY0NDc0MjI3MzkzZGRlZjcyM2JkZmZmODU2ZWQ1ZGY1NDU0ODI0MDY4NTRlMzhmMWZjNzhlYzY2NzkwMWFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yQnVpbGRlclN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODE3ZDU4ZjQ5YTc3M2Y3ZDFlZmVkNDEwN2MyODM5MGU4ZmQ2NGZiNzdjMGNlMDk3NDQ2MGU2MGQyMjFiNjc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yQnVpbGRlclN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzU2Yzg0Zjk3OWI0MTY4NDQ3MzcyZGM1YmYyNDE2YzNkMTkxZjY2MmNiNDA4MWRiOTYwMWIxOTAzMDY1NjBjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckNvbXBvbmVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTc1ZmU0ZjY5MTJhNTQzOTZmMTY5MTUyZGIyMWNkOWJlZTVmYTkwMDIzMDMwNjRmMGZiZmFjMDYzYmU4YjVhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckNvbmZpZ3VyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODFhYmY0YTUxNjVjZjFmNzJiYWJiNzNkM2Q0NzhmNTQ5ZjIyOWFmZWRhMGZmNmY1YTZkMjI4YmEzNGQzMjM5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckNvbmZpZ3VyYXRpb25TdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmMjBlMmM4NDhjMDQ2MThhYzlkYzZhMjA1MGUxMjE0NjBjYzdlN2NlOWZkOTkzYWVjMGY1M2UyNTJmYzhlNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JMaWZlY3ljbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDJkNWI3MjEzN2NmNzliYjY4YzU2ZTA3NDkxOTFlZjExYWE3YzNjMjkyYmFlMjVhYTAwN2E5MjAzNzM2MjA5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3Nvck5vZGVPcGVyYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI0NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDU1NTk5MzdkNjhkYjZiNzAyOTliY2EzYTAwOTI2NjdiYjM1Njg0NzcwMTVlZDU5M2RjMmE1OTJiZjMxZjllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yUHJvY2Vzc2luZ1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwOTQ0ZTdiYjU0ZmQ3MjMwZGE4Mzg1MzlkNDhmNjUxYmUwMGYyMjdkZGY2NjhiMjk5NzgyNjM4ZTM1ODI3ZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JTbmFwc2hvdE9wZXJhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImExMDI4NzNkMTJkNzBkZGMxNTE2Yjg3MGRjZTQxMDFjY2NlMTYyMzE3ZmFmMzYxYWI0ZjkzNTkxOGY1NTc0ODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRVcGRhdGVEYXRhLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmZjMyYWZmM2E4YjdlZWQ5MDNiYzJmZjI5ZjJjNGY3YzM1YmZkNDIyNmIxMTU5ZjNhZmQxODYwNTQwZjliMGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRVcGRhdGVEYXRhQWRhcHRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYmJlZWNlNjQxYWM2NjkwZGU1MThlZTI2ZDAwNjBkOTFlOGNhNjc3MjY3ZDE4YTZiNTJhZmQyYWUyOGJkYzgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50VXBkYXRlT2NjdXJyZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2NmNTFlZTFlYzRlNDk1ZTI2YzU2YTYzMmMxN2M5M2U1MTk3MjE0NzY0ZDczMzhhN2ZkNGZjYjM0YTllOGI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50VXBkYXRlUm91dGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4NjgxZWU2YjQyNGFlODU0MTcwNTE1ZGIyZDhmNTNjMDI1NmQ4NmNlZGE3MjAxZmFiNjQ3MTM1ZjQxMjA0NzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlQ29udHJhY3RSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDkwMWE0YmUxYTllNjBiYWIzOTRkMmI5ZTQ3NTNmMzU0MzFiMzE4MDk4MzI5ZGNkOWNiZmFjYjI1YWJkNWFkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FZmZlY3RpdmVDb250cmFjdFNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2NlZTZkM2U1OTU0ZjRhOGM0NDNiMGUwMGI4YjhlZGY1YjE2MWE2ZDIyNDM1ZmZiNWIzNTJkYWFkMGE5YzY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VmZmVjdGl2ZUNvbnRyYWN0U25hcHNob3RDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGExMjRiNDdkNzZmYTNmM2ExMjBiOGFlYzc2OGM2OTJiYzIzNzdhM2M0MGIzMWQyNGFlYmY0MmIwYTE2NmJjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FZmZlY3RpdmVGcmFnbWVudGF0aW9uQ2F0YWxvZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOWMyZWRmMjI1ZmVlZTY3MTQyZTQ2Mzc5YmE1MDZjMzIzMjMyYmUzODQwMDVlZjUxZWU3NTgwODc1Mjk1ODIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VmZmVjdGl2ZUZyYWdtZW50YXRpb25DYXRhbG9nQnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY4MzA5NmM1NGRjZmUyZTM3YmJlMjJjZjA3ZmRmOWI3ODg2YTVkZjhiNmMwYWUzODNlNWQ1NDE0MWFmYzc1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FZmZlY3RpdmVTdWJzY3JpcHRpb25TdXJmYWNlUHJvamVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE2NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDJjYWJjMGQxOTk3NDY3NmU5NzJkNzFhMzRhNWMwOTEzYzhhNjViYTA0YTJlNWE0NTBlMzc0MGZkNzc1OWZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkQ29uY3JldGVQYXRoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwNjYwYzZlMmNjNjRjNzY3ZmNkOTZlMzI0NzZlMGY3NzdiNmIwZDY1OGEyMGM1ZWNmOWEzMDg4MjRiNzJhZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRQYXRoT3JpZ2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA2MGMyYzBjMGE0NGU5MmYwMzIzNjcwMTAzMjllNmZiYzU2OTQ1MjkyYzMzZjU3ZjFjNjRkOGYxOTMzNWNhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZFNjb3BlRGVjbGFyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2VlZmFiMzE4YWUzOTdiMGExMWJmZDIxZDQ4ZTc2NGE4YWRhNTMyNDljZTBiOGU3ZDQwODdjZjgzMjA2YTRjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZFNjb3BlRW50cnlQbGFucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Mjg0OWM5OTIyODAxYTI3ZWQyOThjNWVlZmVlZjkwNDllODlhNTFhNGIzOTc5MWNmYzJkMGI4NzdhODc3YzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkU2NvcGVQbGFuLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxMWJkNDdiZDU5MDQwYWI0YmUzNDlmMzk1Nzc4MWQ0MTM0NWQxNDAzMThkNTlkOGNhOTQyNTM3NzA2NWQwYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTY29wZVBsYW5WaWV3LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjM2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2M2QyMzdkNmFiODFkNDJhZWE2NDJjNzc5ODA3YzBlZDQ0YjBhMWE4YjM4MTdiNzEwOTVjN2E4ZGEwNGM2N2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTY29wZVBsYW5uZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDU1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5OWViMGI2ZGM3NGExNWY3MWU0YjA2MGNiMTMzMjU1ZTEzOGU1MzYzODI3ZjA1YWRmYjU1ZGJiMTJlNGE4MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTdWJzY3JpcHRpb25Sb3V0ZVByb2plY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTFkNTc0YzVjYTkwMDJkOGE4YjhiNTA0MWY1NGJhZjg2OGZjZTlhM2JlMmU2NWRlYjczNzAyNDg4YzQzNzNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V2ZW50T2NjdXJyZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMDcyNmNmZDlhYTIyMjY2N2RkZTQ5ZTU3MDBjYzJlMmI1YjA5Y2IxZmNmMjVhMDhlODgwNjY5NWE5NGUyZGRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V2aWRlbmNlQ2xhc3NpZmljYXRpb25UeXBlQ2F0YWxvZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTMxNGVkNjBmZGI0MjNmYTU3ZDU0MjEwOGQzNTExZTdkNzBmNTQxODg0MGFkZWI0MGRlYWY3ZWYxYmUxZTU3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FdmlkZW5jZUNsYXNzaWZpY2F0aW9uVmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJmMjlhODUxNDEwZmI4MTg3ODBhMmI1MDk3YTljMTAwYjE3OTEyY2UxZjI0Njc0Y2JmYTRhM2Y5NzgxNmUyNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FdmlkZW5jZURlbGl2ZXJ5T3JjaGVzdHJhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ODkwZGZiZWI1NTRiNTM2YTdlYjYzNGY2MTE5ZmVjYTI0MjUwMWFmMDk5ZTY5NmU0MzNkNjAzMjQyNmMyOGJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4YWN0Qmx1ZVZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkN2U0NWViNjg1NGZmZTUzYWI3NWI2Y2YyNjE1ZWJjYzZmODI0MjQ3MGIyNGI1MjA3NDcwNzUxYzgxMGFiNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXhlY3V0YWJsZUJvZHlMb2FkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWZiMzdjZGZkZDJkZTQwZDU0YmMyY2NkNTFhNTFiZjIxNzY2Yzc1YTA0YzU0Nzg5NGI5ZGFhMzRmNzlmN2E2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeGVjdXRhYmxlQm9keVBhdGhDYXRhbG9nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMxNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMThiM2QxZGNiYzdkMWUzNWE1YmQ3MjNhOGU0OTlhZjRiNDJlZDQ2YWRiOGZhZmNhMzA2MDliNzM1M2YzYjAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4ZWN1dGFibGVCb2R5U291cmNlRGVzY3JpcHRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDJiOTEwNmQ3MThlMjg0MWJhNzVjMDIxNmIxZWIxYWQxNDFhMGU2MGNhNTU1NGFmZDgzODMzMThjOGYyNDFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4ZWN1dGlvbkV2aWRlbmNlVW5hdmFpbGFibGVFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWQ0NzM4OTU4ZTBlNDJjZTQzYTcyZjNjOTYyYWZmY2E2MDIzMWIyYTA3MGJmNDY1NjA3M2YxOWYwYmExNjg2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeGVjdXRpb25MaWZlY3ljbGVDb29yZGluYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjliNzg1ZjVjNDhmYzgzM2RhZjg0OWQ3ZmI1NGI0ODUwMzNkMTRhODU2Yjg5ZDg0MmZiNWI0ZDkwOTY4YzM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2FuZGlkYXRlUHJvamVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwYjEyYTMyNjRhOThmMDYxOTQ2NWE5YjMzMzVlNGY2YTQyZTMxYWIxMDU1MGM2Y2UzZDc0MTgyNzkzYjU1MmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRGVwZW5kZW5jeUNhcHR1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQzOTJmYjFiNDgyMzZhYTVlMjQxZDFjYzZmYmJlNGM5MzEyOWY1NGNhN2Q2NzExMDRjZTBkMTY2ZTYwZjliOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxEZXBlbmRlbmN5SWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwNTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzg3YWUyYTkwNjVjZjZkN2JhYTAyNDJkOGY2N2QwY2I4NzdjNmZkN2EyMjczYzA3ZTQzZWRhNWM2OTRkNjJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbERlcGVuZGVuY3lTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjA5ZDFlOGNlNjI2YjNiMGU1ZDIzMjM1MzQyOGI0NjEyNGFiMDE0YTNmYWI2ZDM0MTYzZGU1NDFhZTVlNjZmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxEZXBlbmRlbmN5U3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzAzYzFkMWY1NTgzZWEyMjY5NTk0MjVhMTA1ZjFlYTUzYjIyMmViMDNjOTc3NDBiZDg3MDE0ZTBkMWZkN2I1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxEZXBlbmRlbmN5VmFsaWRhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMWZhYzYxNTU0MDU2YmZiZWYxMzYwZmMyMDlmZjEwZDE2OTI1ZjczNGRkNWEwMWI0ZDdiMDQ1OTRjOGE0N2FmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbEZ1bmN0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjA2NmQwZWJlMGM3MTA2YTY0YjcyODNhM2U0ZTIwNzJhNjgzYzBjODg3NDhhNjdhNjRkYTRlNDExNzE5YzdjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxGdW5jdGlvbkNvbnRleHRGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk1ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjJiYWFlOGIzNDA0NzYwNWMzNmNmY2M3ZDU3N2U3ZjllZjA5OTEwYTQzMzA5MWE4N2IxZjNlYTdlNWExMmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbEZ1bmN0aW9uRXZhbHVhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MDY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjJlNzI3NTExNGNmNTAwZDdhZmRkOGIyNWQ0NWYxMDM5ZWZkNTk2MDQ0MGExMWRlNzVhZjNkMDkyM2UzYmFmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxGdW5jdGlvblJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNjliODNlOWMyMDgyMDY5MWJlMzIyNjFkYmFhNDUxNjMzNjU2MjVhZmNkNmFkYzE0ZTA2NWU3OWU0NTljMzhjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbEZ1bmN0aW9uUnVsZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTViM2RmOTc5ZTEwNjM2ZGIyZGJmNDhjYmEwOGFlMTUwYjFhMjY1MjQ3YjZkMDNkYmQyNjE5NmFmYWZhMTFlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxNZW1iZXJFdmFsdWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDIwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImUyYzk3NWQ4NjdlOGRjNDNmYzRiMzUyZmM0MTFkYjI4NzgyZjVjNjkxZTkwMGMwNzBjOWZkMWFjMDI5NWY0OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsTWVtYmVyU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhlMWRlZWM1NGY4MDY1NmE1YzQwYzVhNDYwOWRlMGVkNGFiZTMzNGFhNDRhNDRkNjgyYjM3ZDdhODA2MDllNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxSZXNvbHV0aW9uQ3ljbGVHdWFyZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDIwOTM4MmM4YWVhYWEyOTZkMWIzMjM5MTAxNTQ0MmYzNjE4YzMxOTNmN2ZjYzBkZDdiN2IyYTVhNmM0ZWY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbFJlc29sdmVyQ2F0YWxvZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWUwYTRjMTUxZmMzNzQxMWEwMmUyNWRjYzUwODBkYjEyNzBjNmVjNDY4MjdmNTc5M2M1MTZiNGRmMGFjYzQ3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzI4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5ZTYxZjFlYTA3ZDJlOGZiYTRlNjZiYTlkN2RjNDUzNDJiOTMxODFiY2QxMDA1YThmYzE2ODI3YTUwMjU5YjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxEZWxpdmVyeUNsYXNzaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2QyNTg5OTNiMWQzM2VlYzE5N2M3ZTliODUzYTI1YTk0ODY2M2FmYTEyYmNkZTE0NTZkYTNlNWQxYjExOTcxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5RXZpZGVuY2VWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzQwNTkwNWQyMGI3YjZmNzgzZTk3YmM1ZTE0Mjg4ODRlZjU2NzJlNmE0MTJjODFiMDBmZTY1MjcxZjM0MmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTIxMDc4OGFmOTM0MTExOTBiODIxMDM2NTMyZDVmMDcxMDk2NWQ4NTljYjRiZDJmNmU1NzdiMGU3M2NkOTIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlQbGFuLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGZkMTMzNzUxZjQ1ZDczNjFmOWNmMzliM2RkODhkNTQyNmI3NjUyZDQwZWQwNmZiOTE1ZGI5MDdhYzIzOTJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlQbGFuRGVyaXZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDAyNjc2MDFiNjkyMzM2YmFiMDhjOGMzODBmMjBmODM3MGM2NGRhNTI3YTc5YTlhY2VjZTE0NzI1ZGEzZjA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlQbGFuVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGIzOTNiOWM1MDI1NDVhMzU4NGQ5ZTBhMWIzNDhmZWQyODUwM2Q5MjgwYTlhMWRjM2NhMWUwOWYyMGQ2NTRhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5UmVzb2x1dGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTZlZGQxNWVkOTRmMTNjM2JmMGU3YmI2OGQ3YjdmNjZhM2RkMDQ5NGQ4YzhhYjA4ODFlYjI5YWI3NjA4ODEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNiOWJiYmVmMjhkMDkzMjkwZWQ4NWNiYzllYTNkMDI2NzgyNzQ2NmVjM2Y0NzNlZWYxMDg0NGY2NDM5MDM1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbEV2aWRlbmNlVmVyaWZpY2F0aW9uU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTJmOWRiYzFiNzg4YTc4MDVhNWYyYjgxODE1MTNkOTBkZTdmODNkOGVhNTI2NDk4MDRiMWU0NTc5ZTczYTIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsT3JkZXJLZXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjQxMWFmMzdlYTdjY2FmMTBhMDY2YjFmMmY2NDllZGMyOWJmNTJkZmU0MGU4ZmYzNmU4YjVlYjQzZDE4NDNkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbFByZXNlbGVjdGlvblZlcmlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAwNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTA1OGIxZDQ5OGMzMmU1ODA0ZDIwODBiY2Q4NDFiZThiNGM4OWRlNDI2ZjM5YmY5YmRhYjc1MWRlNjllNzZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsU291cmNlRXZhbHVhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGM4YTc5OWY4ZjJlYjM2MGQ4NTRhN2NlYTBkNmJlZTk3YzA1MTQyZjVmYjVjZjlkMTBhMzFjYzk1YWQ2ODAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsU3Vic2NyaXB0aW9uT2NjdXJyZW5jZUtleS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZmFkOWFlOTdmZTU3OGM2N2FkOTI2M2ZjNGVhOGMzZTBlZWQ5YjY1NGIwODIyNDZmMGY3MDU0ZTRiNWYyNjRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsU3Vic2NyaXB0aW9uUHJvamVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MTQ4MzgwYjk0YjJlNDJkODE1NmM2Yzc4MWJjMDczOTIxNzczOGJjYTc0NjEyMTkwZjY1YWI0YjE2ZDRjYjYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsU3Vic2NyaXB0aW9uUHJvamVjdGlvbkJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTQ1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwOGM3YjU3NTA4OWI1YmQwZmY4OGQzNmUwZTZhNzA3NjkzYzZmNWVmOGIzZmQ3MDc4MjIxN2Y4MGFlYmJmYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxTdWJzY3JpcHRpb25TZWxlY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2YmFkMTA2YmUyZDE1NjRhZjA2YjQ1MjQyNjYyZDc0N2FkNjNkYmE1YmVhMzk3MjZhOWYzODQ4YmUyZWMzMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRmluYWxTb3VuZG5lc3NWYWxpZGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGEyYjYwM2MxYmRlMDZhYmZjYjE5Y2I0YTQwMDA0OWI0YzQ4YmZhNTAzNWViZDA1ZTZiNDM0NjY4ZWUwYjY3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Gcm96ZW5Kc29uUGF0Y2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzA1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlYWRmZTE1NDY1NzA1NzViN2ZmMzYxMTkwYTZjZDE0YTg1MzUwMjY4ZDU0NzVlMmQwNjcyN2RkMmRlNTMwMzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvR2FzQ2hhcmdlQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTAzYTE5MzcxMWJiOWMzZTk1ZmI2ZDBlYTE2MDU1MDJlMDQzOWZhMTJjMDUzODJjMjhlNTcxODA2YTc3MDY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0dhc0xpbWl0RXhjZWVkZWRFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzBhYWM1NGVjYTMxNDIyM2E2MzU4YjQ3NmM0ZmE1N2JiODRjMzBiOTk3NDA3MTMwOGZiYTI5YTExYTI2N2M4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNNZXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTQyNmZlMjAzYjAzNzdhZDdjNWQ4ZmI4YmU1MmQ3NGI4YmRiZDVlODQzMmNmZGU2NmMwOTFhNmI2YmE2MmEwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNTcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2U5NTFiNzM0YWJlNzFlOTVjYzk5MWI2ZWVjNjYzZDljMGNmNjBjY2MzNTQ2NGMzODA4MjkxN2MxZjgyODJkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNTY2hlZHVsZUNvbnN0YW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFhMmMxZjRjMzc2MDg1YzI4ZjlkNGE4MWI1M2RiMGMwZDQ1ZmE1ZTNjYzI0NDc5NDcyNDU5ZjliZjQ4ZDJjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNUcmFjZUVudHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhMjgzNzM5MjVjOTUxMWZhMDEwNDBlZjAzNWIwNWQ1OTM3YjM4YmQ0M2E5NGVkZGQ3MWY0Nzc4MTUzOWQzYmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSGFuZGxlckNoYW5uZWxTZWxlY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMWQ2MWM1MTNkMDBiYjFmNjY4ZDFiZDBjODhiYjUwYjNmOWExZTViYzI1MmVlNzRkYjA3NDA1MTQwMDlhNWY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0hhbmRsZXJNYXRjaENvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGM3MDU5NWNkN2EyMmNhZmZjMzFmZmU5YWFmNzAyOWJjOWFlMjY5MjEzZWM5YzIwOGQxYTgzY2FkOTA5N2ViNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9IYW5kbGVyUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwNmUxN2ZjYjYyMTAxZjUxYzgwYzNjZmExYTc3YjE3MjY3OWFlZjcwMTBlNGMxZDY4NDRkM2JjYzYxNGIzNzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSGFuZGxlclJlZ2lzdHJhdGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODRkMDZmODY3ZWI0NjM2NTgxN2U4NGEwYjMyNTVkNzAwN2QyY2Q2MjVkZGRlNzgzYTJkMTJiNjY2ZDQ1NGJlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbW11dGFibGVKc29uUGF0Y2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2ZDBmYTk4NWU5NTJhZWQ4NzM5YWI1YjJhNmJhM2U0Y2FhZTliNjJhNzhiNjRhNzAyOWMwNDMxOTU1MGI3Y2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW1tdXRhYmxlUGF0Y2hQbGFubmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDA4ZWU5MDBmMTcwYjViMjNjMTZkODIyMmJlM2Y3ZDdkYmM3NGUzNzVhZTAxN2M2ZjVkNzAzMjFmZmEzMThkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0luZGV4ZWREZWxpdmVyeURpYWdub3N0aWMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjA5NDJiMzE0OTQwMTM2Njk0MGM1ODE0YWRjMTNkNjg2ZTk4NzY1YjkxMmY5NjAwMzUzMDA5ZmM2MGVhOTAzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbmRleGVkRGVsaXZlcnlFdmFsdWF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTQ4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyZmMwMDdlYTE3NDg5OWNkZmYzMTU0YzIzMjlhMWMxNjcxZmE2NmMwMWEyMDkwOWMxMmVjNDhjMDA3Njg2YTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW5kZXhlZERlbGl2ZXJ5UHJlcGFyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTQyOTA2MDdiYjMxOTg5YWJhYTNhOWYzNzAyNmM4NGIyOGMwNmY2YzYwNTBhODdhODkwYzIzNjM2MDAyY2MxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbnRlcm5hbE9jY3VycmVuY2VEcmFpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkOWU5OWZhN2MzNjcwMmIxNzkyMDE3ODg2YzAyNzdhMDk5Y2YzN2M4NzE1YWM1YjMzN2Y1MGViZTZhMmU5MzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW52YWxpZEV4ZWN1dGlvbkV2aWRlbmNlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNmU2ZTk3OTMzNGM4OTExZmY5Zjc1ZDAxZDFhMTk3MjI0NjBlMWY1YWJlMTQwNGZjZDVkOWU0ZTM0NTNmYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSmZyUHJvY2Vzc2luZ09ic2VydmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlMjE2NmExMDIxMTRhN2EzMGYwMDEyNmUzZDVmNDljNTNjMjE5MzEzMTIwMjU2Mzc3NTAyOWVkNzgyNTY0OWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTGFuZ3VhZ2VQcm9jZXNzaW5nU25hcHNob3RNYW5hZ2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjMThiYzhiZTQxNWZjNzQ0ZDQxY2NjM2NmZmEzYTJlNjY0MTEwNmJlM2Q2ZGVkYjM3NDM5ZWUwOWFiYTkyY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTGlmZWN5Y2xlRXZlbnRGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUyMjhkNzcxOTA1NTEwYzM4NGJlYWZlZTM2NWRlODQwNmI1MTg4YmNkY2FhYmM1ZDc3YWI4N2YwYjI3OWM2YTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTG9naWNhbERlbGl2ZXJ5RXhlY3V0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNkZTA5YmEyZjY0ZGNiZmY1MDcyY2ZkNzE0NmQ4OWZlYjM2NzE0NmQ1NjI2YzQ2YjI3YWE3YTM1NTI5NGE5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Mb2dpY2FsRGVsaXZlcnlHcm91cGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjIxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjNWQ0YWNlY2FjMjBjZmEyYjIxYTczNjk1Y2VmMTMyMWRkZjBmMjgwYmVlYjYzMmQ5NDI0OGM5YmVmMGRlYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTWF0ZXJpYWxpemF0aW9uUHJvdmVuYW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2FkYjdiNzQ5NjdhZTA5NDg0MjFmMTk1YTBiOTFlNDdlNmE5Yzg4NzA4MjJmZTg1NDhjYTJmMGIzMWQzNDRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL01hdGVyaWFsaXplZERvY3VtZW50Vmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4M2NkMDJhZGFkN2YzNmE5ZWE0MjI4ZjlmMzljZDJlMjc1ZWI4NTRhMWNhZmQ3ZTljNDlkMzFiYmIwMDE4MDVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL011c3RVbmRlcnN0YW5kRmFpbHVyZUV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3M2ZlYzU3ZTUxZjQ1ZmU4MjE0YjdkZDlkMzEzZTYyNTBlMjM3MjQ3NDdlYzY2YjI2N2M5NjY1NjY5MGQ3Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTXV0YXRpb25Db21taXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmEzMTdkZGMxZWM0OWQ4YmU2MGE2ZDdhMWQ3YmY2N2M2NDc2MDU4OTU2NzFkMDQyYjhiYTQzNDZkZmNhYjI3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9NdXRhdGlvbkdhc0NoYXJnZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjgyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0ZmIyMzQyNzViOTAzMDVmYzhjZmFiMGFlYzVlZTU5NjIwY2M0YTA2NWYwNGI0YzFhMzU4NWY2NzRmYWVmZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTm9PcFByb2Nlc3NpbmdPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljMThkY2FiMDMyM2JkMDZkYWYxMGRhNDFhY2Q1ZjRlM2MxOWQyYzdmMWYyMDUxYTk1MDBjNWU3MTA0ODZkYTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvT2JzZXJ2YXRpb25LaW5kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTUzNGJhNDdkNGViNWVkMmUzMDljY2VhNzA1MDlmMGY3ZWU4MjViYzg4Zjc1YTYxMDlkNjBkYzQ4OTQwMDUyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXJ0aWNpcGF0aW5nQ2xvc3VyZVByZWZsaWdodC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViOTA1YjlkNzA2NjBkYjE3MGQwNzRiYjVkOTgyNWMzYjZlODgxMTllN2RiODdmZWEyNTlkOWFlOGZmYzI5N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hCb3VuZGFyeVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDczODQ1MDJiOTdlN2U5Zjk4ODMyYjQwODE5YWVkNDYxODk0YWRhMDMwZWY2ZGJlOTAyNzVjM2UyMDYyMWYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoSW1wYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxYWJmYWM2NzEyYmQ1YTBmMjNmNTY0Y2M1NDA2ZDVhYmExMWE3NzY5MjQ3NDI5ZDY5ZjFlOTlhNjU1MWFlZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hJbXBhY3RBbmFseXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDczNGUzOWVhMTY2NzExNmQ1YjBiOTQzNTE1ZGFjZTQwMGZhMWQzOTIzOWNlZTA3MWExN2UyZGE2MTE1YjIxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaElucHV0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3ODNkYWRlOGQ1NGRmNzJkZjAwNThiZWM2ZjM2OTc4NDJiMmVhNmMwYjMwNWZkZGJhNzYyMDI3ODhjNDhiMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hQbGFubmluZ0NvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzc2ZmFkM2M2YjAzZDE3ZjkxNjMwZTQxYmJhZjU4MzljODljNzE4NDQyNGUyODcwNDFmY2UwMTExZjJiMDQxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaFBsYW5uaW5nRW5naW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI1MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDQ3NTRiZDA5YzI0NDA4OTQ4ZWJhNDNkZWNiMGEwMThmN2I5YzIwYWM2N2QxYmY5MTcyYjEwODcyNTU2NDg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoUHJlZmxpZ2h0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3M2UwOGJjODk3NDI2MTNiMmY2NzAyNDNjZjk2ODRlNDI4OTQ3YjE4YjkwNmZiNTk1ZTVhZDdhMDAyZDY2MjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hTb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNDMwZmY1ZjI5ZGNkMDRjYjc3OTk0NGY2MGMwNWNjNzRhZGMxMjhmNDBkM2NjZjhmZDg1YzI3ZjNhYzMzMTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BsYXRmb3JtQ29tbWl0Q29tcGFuaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlZjk3MjQ0ZWE5MGE0M2JhYjYwZTE3MDgwMTBiY2NhOTVhNzZkNTA1MTdkYzgxYzMxYWVmM2MwMDc5NTA5YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGxhdGZvcm1Qcm9jZXNzSW52b2NhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNGQyMzA2ZjhkNmYxNmZhMDdiMWFlMzdkNDZlZDJkMzJkMzQxYjM1MDEyZWNhMzQ0MWIwNWE5OGJhMWZlY2IxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BsYXRmb3JtUHJvY2Vzc2luZ1Jlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOTMyODViMjUyMzZhZmI2ZjJhNDU3MmM2MjE3MDZlNjNhMGQ0ZWE4N2Y4NTUwZDc0M2RkNTkxMzE0YjY0YzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BvcnRhYmxlTGltaXRFeGNlZWRlZEV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2QzM2U2ZTBhYzQ3YjUzYTM0ZDY0MDg5NDcxZjEwYjMxY2YxYTIxY2NlMTg4YjFkZjIxMmI3ZDgwOWE3YTdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1ByZXBhcmVkUGF0Y2hUcmFuc2FjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4ODI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ0ZjIzMTgzZjQ3MTIyM2E3ZjI5OWJkZjAzOWIxM2EyMDkxODk2MzlkMmNlZDQ5YTZmMTVkMzhmNWU4MDA2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzQXR0ZW1wdFJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNDQ0NDcwYjZmZDE3MWZhZDE1ODY2NGI4ZjAxYzhlNGQ1MmNlZWQyMDE4MTY5MWJkMjIxZWIyM2MyMGI2ODViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NHYXNNZXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMWQ2NmFmZjJhODEyZWExMDBiZThkYTExZDkxMDhjNWI0ZGVjZGM4YjdlOWNhYzAzYmZkMTlmZjNmMzVlY2MwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NSZXN1bHRBc3NlbWJseS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5N2Y2YmRjMjU1M2Y5MTQzZTEzNTVhOWE4MzA3ODM2OWRkZDAxYzc0MGY2MmMyMWJlN2IyOTM2YjUzMjUzNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0NoZWNrcG9pbnRUcmFuc2FjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYTljNWYyYTA5ZDhhYWQ0NzA1ZGIxNTA5NTNlN2U0NzI3YmM1YjdlNTgwMjUyZGQ5OWMzMDA5NDJhMzRkMjhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdDb25mb3JtYW5jZVJlY29yZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0ZjcyODlhZTBlNDgxNmVlMjViNTQ2Y2NiNzY0NDMzZmUwY2YwY2ZjYWVkYzZhZTU1MWUyYTM1ZmZmM2YxMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0NvbmZvcm1hbmNlVHJhY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODkzMmEwNzExY2EwYWU3MTI4ZGQ3Y2Q1NWU0NDc1ODhiNTA3N2I2NTVmNGZmNGM3OTQzMmExNjFhMjQwNzFiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nQ3V0b2ZmVHJhY2tlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiZDAzYTAzMjg5YTY5ZGE2Y2ZlZTczYjQ2MzdiMDVkMTg5Y2IyOWQ5MmY4MzY5MDM3NzhmZGZlZTg0ODA1ZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0RlYnVnUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczZjA2ZGUwZWEzZmM3MjcwYmIxZDYyMWJmZWFkZGVkYzc1N2UzYWE5ZjhjM2ZiNTBiZGMxNTA5MDUzNjEzOGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0RvY3VtZW50VmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImExMmNkMDc0ZDk4YThjNTMyMTc5N2Y2N2RjNzg2M2Y0MjZjMTFhYmRmNjQzMzMwZTJjNTZiYzBjOGYzYjczNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0RvY3VtZW50Vmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4Nzg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQ0MTE0YThjNTdhMWQ4NTA5NjdlZDgwYWU0NmQxYzMyOTQxZTRjNjAyZDVmNTY0ZTZhMTUzMTQxYTA5YzM4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nRXZlbnRRdWV1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NDkzYjYyOGJhNzFjZTQwNmViMzRkNzdjZmJmZDUyOTA0ODNlOGZlYWIwZTkzYTY5Yjg2NTM5MWQxN2IyMjY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdFdmVudFNuYXBzaG90Qm91bmRhcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWFkYmQwMmJmMjY5ODE3MzExMzU3MjNhZjE1NTcxNjVhODQyMTRlMzM4ZTIyZDI3MDYwNjYzOTVjNTg5ODViMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nRXZpZGVuY2VWZXJpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMWFkZTdiYTI4ZGI2MWVjYjVlMmYzNThiMGI4NGExOTRjNmViYWU0OWFjZDAzMjYwMjJhOWVlZTQxZTgwZTlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdHYXNDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0OTc5OWNmY2YxNDZiZmYzOTRjNzQ0MGNjYTcxOWQ0NDZjNzYyOTE5ODFiMjM1NzM1ODAzYWE1ZjhiOGY1ZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0lucHV0QWRtaXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDkwNTIxOTFlZTgyZDE1ZjQwMTNhNDRlZTMyZmFlZWM3NWY1MDVlOTEwYTEyYzZkYjkzZmZlMjVkMjVkYjdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdMaWZlY3ljbGVTdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkMjU3NmUwOGY0N2E0MDc3MjM3ZDYzYjY3MzlkN2U1MjMzNTg0ZWRmOWQ1ZmRhOGEyMWYwMmUzZDFiZWQzODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ01ldHJpY0lkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc1OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYTk0OGVhNGJjNTRlNzJlZDE4NGEwMDJiOTc5YjBiMTczNTliZTM0Y2RmNjJiNWQ2MTJlNmFhZWE5ZWQ2MDFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdNZXRyaWNNYW5pZmVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjAxYjc2ZjNlNGRiNmVhYzNhMzhkZjc4YjIzYWE1NTkzMmMwNzM3NzE1MDU3NmM3YmViMThkZWEwMzc1NmM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdNZXRyaWNzU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmYxNDg3OTU3YThjYzY3MDZkN2I5NTUyYjRiN2RmODUzNWFjNGVlNTUxODlhYjI5NmQwYjVkMDc4MzQwYWZhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nTXV0YXRpb25TZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTY3MmUzNjhmY2I4ODc4ZTJmMDU0NWNkNDgyZTM3NjE5MWE2Y2ZkZTMwZTUwMGRhNTc2NThhMTY1N2Q1MmY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdPYnNlcnZhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTY5ZWQ1NWU4NmQwYTkxZmE0ODg3NGQ0OTg2NDQ1YTQ0MDE3OWNmZWE5M2IyYWFlZDg4ODZjNmJiODQxNmU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdPYnNlcnZhdGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmM4OTQzMjE4ZDU0M2U3ZTExNmE4MDQwZTNhNjZmNzZlNzM0YjRmN2I3MWM2Y2FkN2JjNzE3NWJkMzY1MmRjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nT2JzZXJ2YXRpb25EaW1lbnNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTJjZGRmMTQ3ODU4MTFjMzA1NDRkMDM5NDMwZmIxNmZhODM1OWEyZGIxZjk3ODQ0NzcwYzRkMzE3OWI3Nzg0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nT2JzZXJ2YXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU5YmRhZDkyM2EwZGNjMTZlZmQ1OGU1YzFkMmNiYzg1MWZkZTA0MWE1MzY4MWI4YmFjZTZjMDRmNjg4MDlhYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ09ic2VydmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmI2NDZiNGI1NTIyZjM5YjRjOTBlZWZlOWQ4MTY2MWMwODU2YzIyNDI5M2U5OThiZDU4N2VjZGUwYzBkYzM5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nT3V0cHV0Q29sbGVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTE0YjdiMDM4ZTAwZTE3NmEyMDU0YWFkNTFlZmNmZWE3MzBkMTdjOGNkNGMxNGMwZGRiYmNmMDExNGY2NmRmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nUGhhc2VDb250cmFjdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNGVkYmZmNTA5ZGI1Zjg4NmMzYmNjNzdiOTk2ODc5YzRhNjBlODE3Y2VhZjMwMTdkZWYyN2FmMzc4MDU1NTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdQaGFzZVBpcGVsaW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxMmFiZTgyM2M0YzI0MjA0NjE4ZTFlMTIwMWRhNWNjZDMzZmM0NmRlZjc1YmM3N2EyMTE5OGVmMTUzYjk0ZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1BoYXNlU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWYyY2U3Mzc1OWRkY2NhZWRkZGQxMTdkMjZkNDRmY2M5NmUzMmYwOWNkMjk4ZWYzM2ZmMTA0M2Y3ODMwMzgzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nUmVzdWx0Q29vcmRpbmF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjgyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzY2Y2NDI0YzdlZjgwMmY3MDUyNWI5ZWJiMTljZjcyYzE4YzhhNjMyOGI0ZjY1ODE4MDRjM2UxMDQzYjQ2NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1J1bnRpbWVDb3VudGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzJjYmUwZGVlZjUyMGU5YzFkYjVmNjk1YTEzNmZlYzQ1ZTM0OGQ4MWY0YTJhMzFlMWZjMGFmNDk4NTJlMGFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdTY29wZVJlZ2lzdHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmNTQ3ZmJlMmI2MjlmZDAyZDQzMzNjMzVmZjVhNjFmZTczZTRhMmI0Njk4MWFiOGE0ZDI4YWZiOTc3ODFmMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1Nlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWI2YWFlZWM4YzI2M2YxZWRlYTNhM2RmYWQ5ODJiYjNiYTdhYjE1NGMzNDk2NDk5ZjVjZDA2ZjA0OGY3NzUyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nU25hcHNob3RCb290c3RyYXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImUzMjZmNDYwMWFlOTgzOTc0ZmU1Y2ZjNTBlYjJmNGMwNzVmNjdmMGJjMWE5N2VlY2Q4MzkxYmNiYmFlMDVjYWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1NuYXBzaG90TWFuYWdlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2UyOGQ3ZTkxYWI5MGJiMjk2MjVkZjY2MjY4NWQ1ZGFhYmRhMTM3MWQxZGFhMTJmZWZiZTMyY2VjMzkzN2I0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nU25hcHNob3RUcmFuc2FjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDc1MmQ4MmI4NjM4N2FjMDU2ZmY4OGE2NGMxNTQwNGExMjk1ZjZiYmQ5NzdkOTc0MTQ3NGY0NzgyNmY1MTVjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nVHJhY2VDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGY3YmQ4ZWIxODZjNTEyY2FkM2ZkZjgyMGY1N2FhZmE5NDJlYzEzOTNlOTZjYzRmZDMyNTM4MmNkZGUyZjM0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nVHJhY2VSZWNvcmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY5MjdiZWMyYjI5NGQzNmYxMDBkNWM2Y2M0ZmRjMTAzZTRiMTNkMzdmMjM0NzJlMDVhODY0MDg3YTJlMzA2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JEaWFnbm9zdGljLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3YzliZTNiMzNlOTIxZDQ0NzFiMGFkYWM2NTg1NTQ4MDVmMjY1MzMzM2FjOGMyNDc0ODYzOWRlZDBmMDM5NDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRGlhZ25vc3RpY0NvbnN0YW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OGQ1Y2JjMTQ4MzQ4OWFkNjU5NjlmMDNjMWI2ZWUwZjYyZjQ4ZDYzYzI1OTI2N2I1OWQ2NGQ2ZGY5ZDJkZjg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvckVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzdkNTQ2OThjOTI1ZDc1ZTcxYjhlYTY3ZGU0Y2YxMDQ2NTVhM2VmMjEwYjQ1ODNjNDY5YTM4NDEyOWQ3NmE3MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JFcnJvckNhdGVnb3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhZTdkMTU0ZDUzMmEwMzY2ZDdiMTcyZmRiODQ3YTg2YzEyYjhkNmFlNWQ3ZTBjZTY2ZGNiYWJiYTUxYTVhZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NzAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQwMjIyYTlkNTQ4NTE2ZjllZTM0NTc2ZWYzYWUwY2MzMDk4ZjMzNWQ5NThlMDIxZTRmMDAwMWIwOTA0NDA1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JGYWlsdXJlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmNmNjNGE1NjJmZjY3ZDkzZDI3Njk5ZWI2NzI3M2Q5NmNlODYzYzBiNzEwMWE4MWEwOTNhOGIyOGNlMWJmYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRmF0YWxFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU2NTNkMmZlNzhjNmY2NTFiNWE5ZTU1MGNjNzk2NDMwMTcyNjM2NWU5Yjk3ZDJjYjI0OTAzNTljYzBhYmExOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JHYXNDaGFyZ2VzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiMGJmMGM5MDIzNDQxNjljNjI1MTRmMjc5ZTk0NTk5YzViZDcxMWY1MWFkODI5ZWVjZWM5OWI0ZTIxYmQ0NjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29ySWRlbnRpdHlDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDIwODQ4YjY2ZDg1YzUwYzlhZDA2YjhmMTU2OWY0ZjI1OTBmZmFlNWY0NDU4MzYxZDBjNjU4YmY2ODk4MDAyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JJbnZvY2F0aW9uT3JjaGVzdHJhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzY4MjE3ODYwMmQ1ZGIyYTVjNzQzMzM3ODJkZWNlOWEyMjU2Yzk1MDkyYTQ3MmZlMTA3ZjVjZThkMjMxMjRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3Nvckludm9jYXRpb25TZXJ2aWNlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWIyNjUwNTBiNGEwOGExY2YyYWNmY2YxODVhNjk4YmIxNTA3YmVmMTFlZThlM2M1MmU5NTU1MzAzYmUwZTMzYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JJbnZvY2F0aW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDIzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlZTdiZjE4Yjc1OGI0MjNiYzY3NThiY2VjMThhZTVkMDM4NDZiN2Y2YTAxNmY5ZmYwODQwNzY3NDIxZjQ1YmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yTWFuYWdlZENoYW5uZWxUeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZmU0MTBkMThhNDEwNDQ5MGVmYjk0ZDk5NjJmYzlhYzVmYjg2YWY4Njc5ZTUwNzhjY2QyNTk0NzI2MmMwYTlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3Nvck1hcmtlckZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjI0NDA2NDJmY2NmZDdiZGUwMTViY2M1ZDU1MTUxMjQ0NWY4M2I2MWUwOGRlNDJlNGRiNWJkM2VmYjVjZjVhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JNYXJrZXJTdG9yZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODhmOGM2M2E2OWY4NjYwNDgyMmNlZmI4YTM4OTBhNWY3Y2NkYzdhNzUxYjMxZWM5N2IxYzc2OTk5MTdmZDk2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JSdW50aW1lQWNjZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNWZmN2VmOWM5YzMxZmZjYjRhOGI3NjZjYzc3MjM1ZmIyNDZmZjZiODc4MDNlMDlkZmFiM2U1NWE4YzA5MjE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvclN0YXR1cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDg5MWFiOTRiOGY5MzZiM2Y0YTlhMGQ5ZDQyYWE2NGMzYzdhMzM3YmE2NjkyZWUyN2ZlNzEwNTc0NDFhY2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb3RlY3RlZFN0YXRlR3VhcmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlZWViMThlNzdlNDY4YWZlYzU1MDFlYzQ1YjkyYjY0YjUxYmNhMDllZDNmODVjY2ViMjU0ZTY1ZTc4ZDIyMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUmVjb3JkaW5nUHJvY2Vzc2luZ09ic2VydmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImZmMzhjY2RkMDY5YzljNTViMzM4NTUzNTU2MzZkNzNkODg5MjFkZTg2ZWMzMGQ4YTYwNDRmZWNiZTZlYmQ4NDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUmVnaXN0ZXJlZENvbnRyYWN0U2NvcGVJZGVudGl0eVNuYXBzaG90TWFuYWdlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTZiOGRjMDFlNDZkOTVmMmJhM2MzZGYwNTg4MTUzNzdiZGRiM2Q3NWFkZjIxOWU3ZGJhMDIzZDMyZDQ5YTU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Jvb3RFeHRlcm5hbERlbGl2ZXJ5RXZpZGVuY2VWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2U4ZmJjNjlmYWZlNzZkYTU1YTlkMTc0NmY1OTI4YTg0ZGJhNzk1YzZiNTEyOWMwN2JmMmNjMGY2NTI1Y2ZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1blRlcm1pbmF0aW9uRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTUwMmIyMTM4NzY5NTczMTU3YTJkNzNkMTYxNmUzZjY0MDg3NDg0MzVhYzFiZDZiNjIwZDQ5ZjY5ZWUxMzNiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SdW50aW1lR2FzRXhoYXVzdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMGJmZjNiMzQxMmVjOWI5NWVjYWZkMzdmMWRlMzJiNDYzMThmZjNhNDAwNDIzYmM2NTQ3MjgzNmQxNDY3YWQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVXb3JrQnVkZ2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1YWYxMjZlZDFjZjM1N2M5NzRhMWFlMjk0ZmU2MzE1YTNiYjI1MDY2MjJkY2JjOWIxYWI5YTVjMmYzNjI5NjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUnVudGltZVdvcmtTZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjczNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2JkZTVhMzUwNWQwODM1YzY1ODE1NDVjNjE2YzgzODA1OTMzMDk5MDNjNjNmYzAxOGZjZjlmYTIyNDI2YmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NhbWVTY29wZUNoYW5uZWxDYXRhbG9nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzOTczZTJkMGJhYTAzZjAxNzBlZTcxOWFjOGYzMWE3N2M1ZWVjNGZjYzNiYWMwOThjODM3YjM0ZjExNmViY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVDdXRvZmZUcmFja2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwNDg3ZjZlOWM1ZTdlYTg4NjFlYjU3MWI1YjNjZGFjMjdlNmI4MTRlOTMzMmRhZjc3YTA2ZGJlYmNmOWZhOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNDUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTNhMmI1OTI0MDlkMDFjZDIxYWE3OGQyZmQxMTc1YWNmOTI2ZmJjMDE0ZjgyYjM0Mjc0MDVkYzQ4YWY2NmUzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZUZyYW1lRmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjhmZDUwOWY5YTYyYTYzODQ3OTM4NTI4NzA4MTM1YzA2M2M3OWM1MDE3YjBmMGY2OTk0ZGZkZmFlMjBlMGIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlSGFuZGxlckRpc3BhdGNoZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjM5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJjYWYzYjhkNGM4N2I5ZDg0ZWU4YTUxNGFlYmJlZDY3MmY4N2UwNzcyMWMyNGYxMTAxODE4ZjI3OTBkMTM0MjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVJZGVudGl0eUVycm9yTWFwcGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlOTU1YzU5MTlmOTEzNzYwZjQ5OTc4ZDJkYzVjOWU5ODY2ZDA4OWQzNDRiZTM2MjMwMjZkM2Q1ZWE3MGEyYmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVJbml0aWFsaXphdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4ODU4MDZjMmVmNWU0NGY4MzQyMTA3MDMwYzcwNjhhOGYzMmU3YzNmY2Y4YWIyMGNiZGU0ZGFlZTU4MzM2MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVMaWZlY3ljbGVFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYmJkNjhhMTE1MTA0NjAyYTc3YTIyOTk3NGQxMWVmNWE5OTZlMGQ1MzhlN2Q1OWU4ZjRkM2JmOWU4NjhiYTdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlTXV0YXRpb25FeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzM2M2NTA3OTc0ZjFmZjFlZjkzNTJjMTEyN2M5NWI2NzViYjdlZWI4OWE5YWM4MmE0ODMwODViMGE0MDFkNzMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlUGFydGljaXBhdGlvblJlZ2lzdHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxZThlOWJlODMxNzIwNjA0OTY1NDI2NzhiY2Q2YzRmNGMxNGQyZjAwNDRiMjZlNjdmODk5OWFlOTQzYWMzNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVQcm9wYWdhdGlvbkNoYWluLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTBiZjlhZGYyOTZhODMwOGU5N2JjNzRhOGRiNGJjMzNiODQyYzkyNjU0MzU3ODllOTI0ZDkwODEzYzk4MDkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlUnVudGltZUNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjUxYWJkNDUzYzczMGQwYTEwMWJkODBjYzdkYjE2ZWY0ZWMxNjcwNjA1MDcyZjc2YmM4MzNkZmE4MTgxNDI5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZVNvdXJjZVByb2plY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDUzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzMzI4NWY0YTM2ZjQ2NGIwZWM3NDFmNWI5NTk2OGRhZGZjM2NlMGFkYmI3NjUwN2JmY2RjOWFlYzQ0MzZmY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VsZWN0ZWRFeGVjdXRhYmxlQm9keS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJlMDc1ZTEzODNlZjZhNmQ5ZTU3MzZhMmRiYjEwZjM1ZThlMGYxMDc5ZTg5MDFiOWYyODkwZDg1NjU2OWUwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZW1hbnRpY0dhc0Zvcm11bGFzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk3NjgyOTBmMjk1ZTA3ODI4MTI3YjIwZGE2YmQ1YzZmZmE0Mzk4MWI5NjcyMDI4Yzk5ZGNlNmM0NGI4N2QwZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VtYW50aWNHYXNNZXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNjAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzk1ZTIwMjRjY2UyNDExMzQ1ZjBkYTIzYjhmMDcwMmRhYmIxM2M2NzUzYTNhMWI5NWUzYmIyNWIzMzM1NWFjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZW1hbnRpY091dHB1dEJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTcxZDZkZTlhNzU4NzY0ZDI3OTBlMDg5ZjAxZDJkOGFkYTc2OWI3MDdkY2I4Yjk2MDAzMmU4MWFiZDcwNjcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlcXVlbnRpYWxQYXRjaFBsYW5uaW5nU2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYjI0MjBiNTIyOWY3NmIwYjVjNzlkMWZhMDE2YWIwYzA3OWViYTVlMmUxMDQ5NWY0ODRkZjA5Yzc1ZDJmMjg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvbkRlbHRhLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAzNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGU4MzIxNjFhY2YwYTRkNDM3YjNjNWY1ZGNhMjBjNDE4MjFlMjE0MjM2YzFiZDgyYTMzNGJjZmYyOTAyMmRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvbkRlbHRhQnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGM2ZTYxN2ViOTBiOGY1MmUzNTdjZDY2MGU3ZmU2OWEyZmVmMmVlMzVmY2Q5ZGE0NDA3YzhiYTU3NGQ5MTk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvbkRlbHRhVmFsaWRhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwYTVjNDNmYWJlZTliN2MyZjRlZWJiMjA1NjU4MmEzYWNiOWE1OTU5YThlMmM5ZGM0MWM2OGI4ZTkwMDc0NjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU3Vic2NyaXB0aW9uU3VyZmFjZUludmFsaWRFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmI4NDM3NmE0YTZhOGJjZDM5MTAwZjNkNWU5Y2U2Y2NjNTljOTE0ZmNiZmJjZjAwMjEyNDk1ODg0OTdhOWQ5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25TdXJmYWNlUHJvamVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU4NzM3ZTI2MTIwNjJlNDRiNDg5YWY2MWZmZDE3NTRhZmRhODAzMzk0YWQ3NTg1ZGNhZDAwNDQwZWVmMDk0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25TdXJmYWNlUHJvamVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5OGJkYTcyN2YzNmEwMjZhY2IxNzRkMzg5M2QxZWIxNGI1ZDliOWNhOTdkYTJiZmQyMGExOTg5OWVmOWEyNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU3Vic2NyaXB0aW9uU3VyZmFjZVJ1bGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MTE1OGY2YzFkMzhlNmFkOGI3ZDZmOGNlN2ZkZDEyMGM3OWMyNmVlMjdlYzM1ZTE2MmMwYTEzNzQ4OWJhYThkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvblN1cmZhY2VWYWxpZGF0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmU3NzlmMmYyM2RjZTBmYWYyODc2MDQ0MWZmMzEyZjU5YzA5MTU4NTkwZWNiNzMyOTNkYzY4NWJkMDQxMjQ5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25TdXJmYWNlVmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmZjNTk5NzdlZGJkM2ZkODZkY2QyZjhhZTZhMGExYjNjNGRiMDUyZDgzMTFkMThhOTkzZDMwMmRjODM5NmJkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9UZXJtaW5hdGlvblNlcnZpY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDA0ZjZhYzVlNzA2OTliMmJjNTgxYmY1ZmIyMzRkZjFjMzgxYzlkMzczYWQxOWI1ZTkyODY1ZjU1MjY3OTA1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9UeXBlR2VuZXJhbGl6YXRpb25Qb2xpY3lSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGE5YTUxMTVmYmY0YmNjYjAzODA0ODU0MTdlYjAwNzQ0M2RkNTE4NzdmNjVmNDdmMDRhN2I1ZDliMWMxYmVjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9VcGRhdGVNYXRlcmlhbGl6YXRpb25NZXRyaWNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjEwYWY2MTBhNDFjODEwOTRhYzNhOTZiMTA3NTdjY2ViNTU5MTQyNGU5YjQ3NjU5YjIyYTU3Yjk0ZGViZDBjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9WZXJpZmllZEV4ZWN1dGlvbkV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjBkZmYxNjliMTM3NjhhZWRlZDI5ZmRkNDc4OTQxM2I2ODBmOTQ0MWIzMTUxNjEzYmEyNzJiNGE1OTI3Y2U3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1dvcmtpbmdEb2N1bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmU3ZWYwMDY4M2ZjOGJlOGJlNWQyNTY4Zjc2NWZiMmJkOWZlZmYzMmVhYzY5Njc0NDhmNjg0N2RmZDdiZWM1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9DaGFubmVsQ29udHJhY3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmE1OTI5YTU2Y2YyYjc4MDJjZWI0MWM5MDVhNzg4MzNmNjYyOTU3Yjc1NTM5MDljYzZmNWFiYjJhYzQ0ODM0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9DaGFubmVsRXZlbnRDaGVja3BvaW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxOTgxOTVkZTJkYmYzZjhjZTk1NmQxNzIyYWNlYTI1MTBkZjI3NTM3YzM4NGM5MDI2OGNmNGQ1OWQ3OWU3NjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQ2hlY2twb2ludEVudHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxNDhlMTdiOTIyNTlmZjUyMmMzYzQwODEyZWE2YTBiZDcwNmI2ZjNjZmFiMGQzMjMyZjg4ZmRhM2M2M2Y2YjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQ29udHJhY3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzM3ZWE4MGUwOGMwOTlhZTEyYmU2MGJkZTU4OTZjNTFmNzM2ZDhiYmMyN2I0MDFhMzE3YmQ0MmUzZTUxYzBmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Eb2N1bWVudFVwZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MDFlOGIyNDA5ZjQ5NDM1OTY5MTNiNWM1OWJhYTdkNWMxZmNlMDNjNzg0MjMyZTI1YzkxYzBlMGU2NGNiNjcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0RvY3VtZW50VXBkYXRlQ2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZGQ5N2QwNDQ2YTgzMGU5MWFlNzA2YTBkNTY1NjBmNzRkYWEyZDdjZjAwYmU5ODc3YTU5Nzk5YTBlNjJhYjA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0VtYmVkZGVkRXZlbnREZWxpdmVyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiODEzZjRmMWRkZTI5ZWE2MjUyZDQzZjY1NTY0YmU5MzQzYTRhMGE3YzQwNmIwOGVmYWVhMzBkNGE1YzEyM2VlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0VtYmVkZGVkTm9kZUNoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDVjMDc3OGMxZTA4Y2RiYWZjMjE5NzVmNTE5Zjk5MTk5ZTgzNjdhZmY5ZjFmOTQ0OGYzZTdhZGEzMWQxMmQ4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9IYW5kbGVyQ29udHJhY3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjRjZTQ1MjAzY2RlZDUwNjFlNGIyOGQ0ZGQ1Y2ZlNDM5OTVkNTAwMDM4YTEyNjY2MTAwOGFlOTZkNTVjYmZiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Jbml0aWFsaXphdGlvbk1hcmtlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmU2N2U5NzdiOGNlMzhhNWNmOTgwNTc5NmNhYjJmZjkzM2E2NzBkMTdkNTJmZDE1ZGNkNzI3ZTdiYjdmYTk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0pzb25QYXRjaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzI0MTQ3NWUzNTE5Yjg2MjQ0ZDVlOGUxYWZiZDg2NGFjODQ2MzViNTAzZjk5ZTBhNzliYmY2NzNkMGI3ZjhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0xpZmVjeWNsZUNoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzc1MWYwOGIyN2YyMjM0MGJlMGM2NTlmMzBiMjhiNWM3ZjI0MjAzZjQ1YzhjZTEyNjZiYjFmMWY1MDViYWRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL01hcmtlckNvbnRyYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE4OWJlNDYwY2FjYjEwZWRhNmY5YTlmODM5ZGFlYzRhODE5YmM5OWE1N2JlOGJhN2IwYzYzNGYyNmI1ZTkzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Qcm9jZXNzRW1iZWRkZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTAwMzlmYTBkOGYzYWViNTAwMGM5NzFjYjAzNzFlZTg3MzU2ZGNjNTRkNmIxN2U5MjI0YTY0YTExNGEzMDEwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Qcm9jZXNzaW5nVGVybWluYXRlZE1hcmtlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjFmODVlYTVhYTYzMmMyMzA5Y2MwNTUwMDZhYzE2NmIzNWFjOTY4NTJjMjIzZTYwM2EzYjY1NWM1OWI1MTUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1RyaWdnZXJlZEV2ZW50Q2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTdjNzRmNDRmMmE1MzE1ZjdlMjljNjllYzJmMzRmYzQ1ODUyYmQwZDkyOWVjMTEzOTk5ZGQ4ZTdjMjI5ZDdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1R5cGVHZW5lcmFsaXphdGlvblBvbGljeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmMzNGIzYWYyMjVkMzQwNGJjZmFiZjgzNmRhYzc2MTk4YjNkZDhlZTk2OGZlZGQ3ZDZhOGM1NzdlOTU3MmY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1R5cGVHZW5lcmFsaXphdGlvblJ1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE5ZWEyNTEwNmU4ZmE3MWM0YjFhN2UyODQ4MWNmZjA5YjhkNmE5NWUwZDU1ZWRmZTYxNGVkMDhlMDdiNDNlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmEwMzgxZGE4YmI3MzY3NzZkNmEyMGM1MjVlYTRkNjM0NWEzOGJiMWViMDFkMTVhZjQ1NmYwZjU5NTAzYTk0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmNmZjI0MzNiODkxMTBmY2E0NjM5NGIzOTZmZmU3OTA0NmYyNTc2MzAxM2QzNTdiNzAzMzJjMDA0MzVjMmM1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9yZWdpc3RyeS9CbHVlUnVudGltZVR5cGVSZWdpc3RyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFiM2NjZjA0ZTgyZTllNjFlNzcxNDNiOWJiMWViZDg4N2ViZWY2Nzk5MGE4MGQ2ZDhlNmQ2NTVhYjkxMTRkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9yZWdpc3RyeS9SdW50aW1lQmx1ZUlkcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDViMmQ5YjE4Yjk4ZTUyNDE2Mjc5MDllMWYxMzNkM2ZjODFmZDY4MTllNjQ5YzQzNzRhMTFjOWUzYmFhZWM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3JlZ2lzdHJ5L1J1bnRpbWVUeXBlQWxpYXNlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMjg4MWNmNjU1OTNiMTlhMzQ3YmZiOGFmMmUxOTgyNDljZDdkOTVkMWY3ZjBhZjVmNmYxOWYwMDU1YWYzZTk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3JlZ2lzdHJ5L1J1bnRpbWVUeXBlS2V5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhNjc1MDc4MTFjNzIxODAwYTYzNzgyZjQzNDgzZWE5ZDVmMjM1MzFmNzBhMjkzYWU2MTk3MzliNzllODQwMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvcmVnaXN0cnkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxYjI1YWZkOTRmOTY3ODg3NGE0MmJlZjcxNzUyMWFjMzc2MDBmZWM5YjdhZDI0ZWFjYWE0NWQxYTQ5N2FhMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvdXRpbC9Ob2RlQ2Fub25pY2FsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMjdlMTZhN2U5YjRkNTQxYmE3NDUyMzBiY2JiYTY3N2QyZWYwZWQ4NzI4NzY2NzhjYzU2NTM1ZDY0YTAwMWVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3V0aWwvUG9pbnRlclV0aWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImU4YmUxZmRkY2E2ODQyYzYyOWQxMTY4NjM1YTk4ZTkyY2ViNDk2NDU4OWM3OWQxOGYwZDViYzdlMTYzNjkwZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvdXRpbC9Qcm9jZXNzb3JDb250cmFjdENvbnN0YW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTdmYzFjNzlkZWNkMzQ0YmYwNzY3OTNhNzViYzRjOGFhOWFmNTRhZGQwNmZiNWNhZDcyZTcwYzJkODc0ZDUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3V0aWwvUHJvY2Vzc29yUG9pbnRlckNvbnN0YW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjdiZTE3ZTdkNzU0MTU5N2FjMDYzYjgwZGQ2ZjY3OTZkNzJlZGE3NGExOWFlY2E3ZmYyZjI5Y2I3ZjZhYTUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3V0aWwvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5NTU3ODAyOTUxYTUyZTNiNzE3YmJmNjM0ZjY5ODg4MTY1MmNiNDNiM2Q4NGM5MGM4YzNmM2ZjOTJhN2VjMjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMtZ2FzLTEuMC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjQwNTRiNzdmYzdlZjAxYTNlNjJmNWIyOWQyMDllODRmMjZlODUxNDhjOTFiMDNmZTQ4ZGEyYzM1Nzk0MDhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0NoYW5uZWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTcyMGYzYTkwYWJmOTVkZTY1ZWZmY2U4Yzc0OWUzYjZiZWZmNTc2ZDEwMDA0OTUyMDY3OTUzMzU1NjVmODBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0NoYW5uZWxFdmVudENoZWNrcG9pbnQuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjQ4MDUyMzJmNmUyMmQyYTMyMDc5YWQxZGY2N2Q1MjYyODYzZDdjYzFlMjg3ZjNiOWNkNjQ2ODhkYmRmNGUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0NoZWNrcG9pbnRFbnRyeS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhY2U1OTJlNDU5N2FjNWQxYTMzMTA5ZDQ1NmU5YTg3NmM3NjY3ZmVmY2VkYTcyZDhiYTA0YjE1NGIxNzBjODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvQ29udHJhY3QuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2Y2NDBmYjgxMGNlNmNhOWQxOTRlMzM1OGFhMTE0MjM3MzNlZGJkZTBhY2JkMWU0NmQwZGFhYzhlMTM0Mzk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0NvbnRyYWN0RXhlY3V0aW9uUmVzdWx0LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmIzZmQ2NTUwN2M5ZGI1ODllZTRlM2I1YzE0ZjY4ZjNiYTY0YTBjOTk5OGE4MmI5ODYwNWJlZDZmYmYwZTljMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Eb2N1bWVudFByb2Nlc3NpbmdJbml0aWF0ZWQuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MGE2OGEyYTg2OWIwYTIzNGUwNmFhOTk3NDdiNmEzZGZmN2Y1MmFjMzRmZGMxMTlkYjAwYTNjYWRlZDZlZWM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0RvY3VtZW50UHJvY2Vzc2luZ1Rlcm1pbmF0ZWQuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNDI1NTNlODllZWZhNjg0ODc4NGMzYzRjOWExNTQ4Y2U2OWZhNjAxNTQ0MGM4YjExOWY4ZWUwYzZmY2JiMzBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0RvY3VtZW50VXBkYXRlLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTdjNTU5NjVkMDRkYjY2ZWU4OGJmMDNjZGFkNDExNTI5NjU0YmViOTRjNmJjOGQzZmIwM2IyZTliZWQ4ZGRjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Eb2N1bWVudFVwZGF0ZUNoYW5uZWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NWU5YmU4MTA0ZWExMDFiOWUyMjY1NzJlODVjMmM4M2YwNWJlNWZiNTBmMDM4MTZhYjdlZWZiYzBiMmJiN2I2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0VtYmVkZGVkRXZlbnREZWxpdmVyeS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2ZTUyMDc3YmFmN2Y3YTQ3M2Y0MDQ5NDQ2Y2Y2NDZjNzlmYWU1ZmEwMmQwZjZjMGQ0NWY0MTQzNGFmODQ1OWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvRW1iZWRkZWROb2RlQ2hhbm5lbC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImE0MWFmODY3MGExZmRjZjQ2MTNmYzRlYjc4NDA2MWI2MTQ1MDk0YzFiZGQzYzNhZTViOWIyYzc1YTg0MzU1OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvRXh0ZXJuYWxDaGFubmVsLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTRjM2M4ODhhYTU4YjhhMjI0ZTBmYWYyZmZmM2JkYzU5ZTUxZjRkMTM0ZjI1ODQ1ZWYxODM1NTk1YjQ0ZmYyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9GaXh0dXJlRXZlbnQuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDNhMTc3NzNkMjg0Y2I1NDRmNTZlNjE1YWY4NjFiMWY1NTU5MjBjZDliOTEyM2EzYjk4MjQ2NTZkNjYyMjBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0hhbmRsZXIuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZWZiODIwOWYwNmY5Y2FhZGJlNDEwMTU3MDRhMmY3ODdmOTRkYzVjNDUyYTVkMDg4ZTg5YmIxZjNmZTM5MjBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0pzb25QYXRjaEVudHJ5LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjNmNjk1NDdkYWI5YWRmMTE3NWFhOWJkZWViMjRjZWFjZDY3MzRkZGIxYzU4NDY4M2MyODQ2NGRhY2Q3YWY2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9MaWZlY3ljbGVFdmVudENoYW5uZWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYjUyZGUxOWNjY2RhNTZmZmU2ZDUyNTE1MWZmNjRhZjQ5N2YwZTE2YjRmM2Y2N2FlMTI5M2E3ZmRmYmYwMTIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL01hcmtlci5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiYTdiMWRhNzljYjEyMDFiMWNkNjMxOTNlYzljNzMzNTg4Y2M4Y2QyZjU3NDY2NGEzZWYzN2VjMmJmOTBiZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvUHJvY2Vzc0VtYmVkZGVkLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4YTcwYzMwMDgwZjBhZmExODdkMTJkMjlkY2NiMDhhYTVlYjRlMTlhZTg5MzhlYTUxN2I2ODlkZjViOWZhMWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvUHJvY2Vzc2luZ0luaXRpYWxpemVkTWFya2VyLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGZmNWE4ZDFiYzA2ZjVhNmJjOWE1YzRjZDFjMzQwZDA1YzgzYmUzOTY5N2YyZTk2NmE4NGE2N2E0ODliMzJjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Qcm9jZXNzaW5nVGVybWluYXRlZE1hcmtlci5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1ZGU0ZDA3Yjg4Y2JmZTk5NzllOWE0ZTA1ZjNiZjhmZjliODA4NmU3NGI0MDc0YTNkMzA2MWZiMWU4OGVmODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvUnVudGltZUNvdW50ZXJFbnRyeS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkN2U3ZTViNzVjYmJhZDM2NTU2YTRhNDhiN2QxN2RiNWY2MmExOWE1MzdjZmMyZmRkNjI0NzAyYTJkYTE0YjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvUnVudGltZUxlZGdlci5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4ODUxOGY2ZjZiYzg1NzBmZmVmNzE5ODIyYzMzNTliNDFjMTQwZTc5NWUzYjRmZjc0YTdmZDJjMjRmNGYzMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvU2NyaXB0ZWRFeHRlcm5hbENoYW5uZWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI0NmQ2MmQ3N2JjODhiYTQ1ZTk3ZTcwYzkyMTFlNmM2Mzc3ODkyYTVlNGZkMTcwYjRhZTAyZTg5YzIzMDZmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9TY3JpcHRlZEhhbmRsZXIuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZjBiZjU2NjI4ZDA4ZjZmZDMwMjBlZGVhMDg1MzgxYTczNjM5MzhmYWMyYTY3ZTQzMmZlYjRmMjZlY2Q5YmIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1RyaWdnZXJlZEV2ZW50Q2hhbm5lbC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzODIzM2E4YmM4Nzk5YjY2Y2FiMThlNzUzMmJlZTE4NTU3N2Y3NmI5OWMxNGMxNjlkMjU0MGQyOTgxNzJmYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvVHlwZUdlbmVyYWxpemF0aW9uUG9saWN5LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjVlYjUyMmFlN2VlNzQwNzQxNDhhMmFhMDY0NTJmOGRmMjZmYTIzNjRlZmY5MjA1ZDQ2Yzk0YmY4MmIxZjAyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9UeXBlR2VuZXJhbGl6YXRpb25SdWxlLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzFkNTMyZjM2M2JiMzNlMzQ3ZWRkZTZmNDJmYjg1ZGQ2NWUxZTM0ODkzNzcxNDk5ZmFjZmIwNTcyOWRkMTJlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNGM5NGYxMmQwMjczNGJhNTBmOGRjNmY4OTIxMGI3OWNlMTczNTU3ZTI5OWExMzZhZjJhNDViMGFhYmM4NjZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3BlY2lmaWNhdGlvbnMvYmx1ZS1jb250cmFjdHMtYW5kLXByb2Nlc3Nvci1zcGVjaWZpY2F0aW9uLTEuMC5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDkxNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDA2MTUzNzkxZWQ5OWNmOTcxNjM3MjZiOGQyYTI3MmUzZjBjYTEwNzhkYzZjOWY2OWI4MTg1NWQ4MWU1YzgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0JsdWVDb250cmFjdHNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUwNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNTBjYzgwOGQ4ZWZiZTQ1OGQ3MTY0OGU2YmUyZGVmYmJmNmZkODM5NDk1OWIyZWM3ZjNkNGQyMDQzNWQ1NGViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkU2NvcGVQbGFuVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGFjMzc0M2YyMzg2YzkxZTliNTkwYjU5YTJjZTAxZjZjODE2YThjZjAzNjdiZjg0MWZlYmExYmJmYTY2OGYwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZFNjb3BlUGxhbm5lclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjIwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5ODFkNDU4YTk0YTFlZDI2ZDNjODc2ZTRhYTM0ODQ4NjgxMzIzMjg0MjAzMzZiOGM4ODE0MTM2MTQ5OGFjMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxTdWJzY3JpcHRpb25Qcm9qZWN0aW9uQnVpbGRlclByb3ZpZGVyT3V0Y29tZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI1ZDExODgyMzNjYWMyYmUwNjE1ZmVjM2RiZDZiMjNkNDk4N2Y2YjM4NTE3OWI3MDIyOWUyMmJiZjc1YmMxNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGxhdGZvcm1Qcm9jZXNzSW52b2NhdGlvblBsYW5WZXJpZmljYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk2NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YWI3NmNhNzMxNWZmNmY2MzdiYjZhMmRjZTAxYmNkNjQzMjQwMjJlMDViMGI2MTI1ODFjMDU3OTUwMThhMmFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1Byb2Nlc3NFbWJlZGRlZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzU4NWQyYTc2MGRmMmE4YzFlZWQ3MmUzZjBhYWUzMTBlMDgxYzk1NDg1NTYyYzVjOWIxYzM2NGU1ZDdlZTVlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2VhYTM1YjI4OWRkYzliNjYwOTBlYzQzNWMzOWMzOGY3NTcwZWI4MGZhOTkzNmZkZTRkYWQ3ZGUwYjRiNDFhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CYXNlNThCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWExNjk0YWEzMWY1NjdmMTQ1MTk4NDEzMTZkY2VjMmM3NzhlOTM1ODliMGY1NDQ3NGU4Y2M3N2JmYjdlYTIyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9DYW5vbmljYWxIYXNoQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ZDc3M2ZjODlkZmIyNDk4MGM3YWQyMGE0M2JjMDczOGNlODkzMzAwYjFmNjBlN2EzYTk3NzM0ZWNlMjE5MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuQ2Fub25pY2FsRGlnZXN0QmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3M2RiY2M4NGQxOWIzNjVjMThhZGZkNmU4YWMxM2FiNWI0OWQ0ZGNiYzgwMzc3NGE5YjhjYWEwNGZlZTljZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZUlkZW50aXR5QmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxN2ExMDllM2IxZDM4MzMwYjJmOTliYTM0OGEzNjRlZjYzOGIxZjAzZDVmN2JjMjUwMjg0ZjViOTY5OWFkY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9CbHVlQ2FjaGVQb2xpY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlMjdhNTI0MGZmMzU0MmNjMjg0ZmI0NWExNzFiYmI2MTlmNjZkNTUzMDVmZjYxZjJlMmZiZTcyYTY0OWYyZTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9CbHVlQ2FjaGVTdGF0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzI5YWNkOTMxYThmMGY4ZWI0YjExYjM4M2NhNWY2Yzc0YjFkMmRhZmZjZjNjMzE5YzMyZGUxYjBlNDNiNDYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZUxhbmd1YWdlRXJyb3JDYXRlZ29yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmE2N2I1OTM4MGQyZmYzZTg3NWQ1MWQxNTc2Mzc3NTI0YTY0NDJhYzc3YTVhOWFhZDQ2ZjEwNjY0MzhiNzMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZUxhbmd1YWdlRXJyb3JDbGFzc2lmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODkxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkYjA1MzM4NDEzMzUyMDg4OWZmMzFmYTA2ZWVkZjg2MGM4MmQ2OGEwNWMzMmRiMmI3NzcyYzYyMDI4YjQwODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9CbHVlT3BlcmF0aW9uTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3ZWUwYjg4YjRiOTIzN2I1MjFmZjA3YWJhZjE2ZWQ4ZmZmOTVlNTUyYzUxMDQ4YmI1YzAwZGUwZDAxMTg4NTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9CbHVlT3BlcmF0aW9uT3V0Y29tZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjNzc5MzlmMjI1MTgzOTgxNDNiMmU1MTczNjUyZmY0OTU0OTg2OWQxY2Y0ZDA3YjRjYzA3OTVjYTI1MzZjYTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9CbHVlT3BlcmF0aW9uUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhMTQ3MGM2OWY1MmEyMWZkMmRlNWE5NDdlNzFmMWJmNmNlYThjZWE5Nzk0ZDA3MTJhZTllNDg4YzFiMzBiYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9CbHVlVmlld1BhdGguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2Nzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2E4Y2I5NWI0N2VjNmU4ZDQzM2Q3MmQxMjRjMzYzNTdkYTljYmE5OWI1YTg0ZmZkN2M5NTI3OGU4MDM0NTA4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvYXBpL05vZGVQcm92aWRlck91dGNvbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWYzODJjMTM1Zjg2OTNlOGNlZTBlMzM2ZDkyYzgzNzcyYzQyNmZhZGQ5YzNjYjViMjFmODA5YzZlYmIzZTQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljNDAwZWQ3Y2IxMDliZGYyNzIzMjMwMjJmOWExNmY5NmEwMDQ2MTZhODQzMzRmYTMyYWQ2MDdjMTgyMWEyNjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvZGVjL0JsdWVDb2RlYy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTdhYzBkNGM3ZmRkYzlmMzI3YzExODc1ZjliODQxZjc3MGNkMDg4NmQ1YmQ0ZTRkZTg4ZTU4YjRmM2MwMmM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb2RlYy9CbHVlRm9ybWF0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODkwMzg1MGNjOTg1MDhlYjM5YTg5Nzc5M2Y0ZTEwYzYwMTg3YWU1ZWE2YjA3M2FlMjNkYTY4YzIxZWY0ZmYzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29kZWMvU3RhbmRhcmRCbHVlQ29kZWMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjkyNDNhNTEzZWIwNzA5YmIyNmUzYjRiNzcyNGRmYjc1Y2Q1YTY3NWRkMWVkNzc5ZDg2MWMwNGM4N2JlNjM1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29kZWMvamFja3Nvbi9VbmNoZWNrZWRPYmplY3RNYXBwZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0YjZjNDhhMjRiZjM0Mjk3ZmY1ZDVjOTkxZWEyODA3MmRkMTBhZWI3YWUxOWY1MDMxOWI1MmIzNjU0ZjI0YjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvZGVjL2phY2tzb24vcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0ZGZkOGIxZjk1OWRlNzM5YjY1NDQ2YWJmZDc2OTE2YTI4MjI0MjNhNTY2M2FhODY1MGViZGU0ZGM4MmE3OGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvZGVjL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNTY0MmRkNzJiYjdmZTk0NzFhNzljZDc1ZTA4MzhhMjhmYmEzYWYzNmYzZWFiZWQ1MjEzNDlmNmIxOTZlNTFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9DYW5vbmljYWxHZW5lcmFsaXphdGlvblBhdGNoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyZGM4Mjc5ODMxMDEzMjY4NmM5MTc4ZGNmNWIwMDA2YjUxYzQ5OTdhMGE1OGM0M2RmZWQxMjFmOWRjNGFhMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlRW5naW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTk2NTg4M2RkZWJiYjgwNmUzMzk3YzMyNjgxYzI0OTE4NjFhODA1ZmFkNGRjMTZlZTI2YWYxNTVhNzVmNzA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9Db25mb3JtYW5jZVBsYW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2RiMmVlZWI0ZDNiMWJhMTlkYjUwYTFmNTZmMmJkMGMxMTJlODZmYzcyMDkyNmI1M2JkOWRiOWQ4M2JkMjgzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWIyOTI4MGNhMWM3YzI4ZTNlZGJkMDhkNGI5ZDA2ZTFhMjU4MzZmMTViNjc1MTQ5ZmYwMTNmNzJhZjA0Y2I0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvRnJvemVuQ29uZm9ybWFuY2VQbGFubmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWFlOGQyYzY5NTI0N2IzMmUxYzNkMTk5Yzc4MThhYzRhZjA2ZjA5MTA4YmJhNjdkYjI4MjA3ZGY5Y2RlMzM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTg0ODFiMWJkYjQyYzdiZmE0MTM0NWE2ZDg4MmExOGU3MjAyMWRmZTU4ZjdjODAwOTg3NzJlOTgyZjNiOTcxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZ3JhcGgvQmx1ZUdyYXBoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjMWE3OWUwMDk1MTExYzllOWNlYjFiNDgzYjA5ZDVmMTNiMGQyYTczNzc2NDdiMjNmODU5OWE1ZDE5Y2JiNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2dyYXBoL05vZGVFeHBhbmRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOTE0ZDVhMzFjNzNkZWMyMTMyZGM2NjE1MWIyMWM0YjdmYzc5OWE0YTI4ZWE2M2YzNTM3MzNiNGFhYzQxMTI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ncmFwaC9Ob2RlRXhwYW5zaW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg1MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZjVhOWE2MTA1ZGIxM2E0YmUyODY1NjAxYWU5NGQ0NTY5MTVjOGRlMmM5NDY1ZTUwNzNlZTVlYjJkMTRiNGJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ncmFwaC9TdGFuZGFyZEJsdWVHcmFwaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZjMwZTc5N2JmYjM3ZmI4NDI0ODExYTkxY2I2NDhmYjM4MWExN2MzZTEwYWQ2MDViOTA4YTk3ZjkwN2Y4NTFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ncmFwaC9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjMwMWQxNTI5NTU0ZTIyNzY0MzdjYjM0YmMxYWRhMzJhM2E5YjAzZDQ1MjgxYmI5N2Y0MWI2ODE1ZjgxMzQ3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmFzZTU4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5Njc3Mzg1NzU3NjdmZTZjOTE5OTY2MzEyYjQyZjk5OTYwZDIxYzRiNzU5YWZmZTNjMTNhMmRlNjE4YmFhNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Jhc2U1OFNoYTI1NlByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI0MmQ1NTAyZjBhYjIwNTU1ZWFjYzQyNDk1ZGYzYjk4YTU1Y2FhZWFkMzkzMDM5NGI3ZWM5ZDk5MThhMWRiZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0JsdWVJZElucHV0Tm9ybWFsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1M2RhM2E5ZTlhOGNhZjBiZDhmZTkzMzFiNmZiMGQxNTJiZjBhZWE5NDkyMTk3MTEzYmRhMGQyNmM3NjM3ZmE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CbHVlSWRSZWZlcmVuY2VWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5MjE3MmJhYTExZTE5YTJlYjFlYTY1M2Y1OGFhOWQxYTNjZTRlNzNkZjM3YzI5Mjc3ZjgwZTA5MGRlYjU4MWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0JsdWVJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2Q2MjI5NTg3MjFhNTYwODMzZDE0ODY1M2JlYzIxZmJhMWFlNDM5MTA3ODUwZGM5MDMzMDliM2I1NGI3NmM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CbHVlSWRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ4MzUzODMzOWNhOTM2Y2JhYjAyZGI5ZjdjYjRiOGY5NTlhM2MwMDBkZjA2MWM2N2MyZDFmM2IwMDRlOTg3MzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Nhbm9uaWNhbElkZW50aXR5Q29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzNWEwOTUzZmRjMzY3YzBhZmFkYzY0YTVhODI5YjhhNjBkYTNmYTVkMWU2ZTY1NTlmMGIyZTJiMzYxMTAwZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Nhbm9uaWNhbElkZW50aXR5SW5wdXRCdWlsZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhMjdjYjc0OGMwNzMxM2YxNzI4ZWEwYjAzMWI1MzZiNTMyYjk2YjA2NWE0OWVjNWU5ZDkxZjBjZWYyYjFiY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Nhbm9uaWNhbElkZW50aXR5SW5wdXRSZWNvbnN0cnVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzI3NjljZGQyMGNjMzJmNmFlZjA3ZDQzZWUzNGU3ZjBhMWU5NTZmMTQ0N2RhYjAyMjc1NGIyMjU5NzI0NDA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9DYW5vbmljYWxKc29uSGFzaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxZGY3ZjQ0Mzc1MGRmYWM1MjQwNjY1MjRiZDU0Mzg2YTBmZDRmMTQyZWYyYjhiZDk3OGY2ZWZkY2FlMDk1Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Nhbm9uaWNhbEpzb25WYWx1ZVdyaXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWVmNThjYjQ2ZWVkYjZlZjZlODA5NzU4NWZmZTdlMDhmOGNjY2E4NTM0ODM5MTEwZDE0ZDI1MmEwMWJlZDJiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQ2lyY3VsYXJTZXRJZGVudGl0eUNhbGN1bGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0NTBiODcyODBiMzU2M2U3YTkwNWFmOTQxYmY2OGVhZDFhMGNkNTU2NzI1ZjNmZjY0NzAyNWFlYTM3YmNhNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0RpcmVjdEJsdWVJZENhbGN1bGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTYxM2I5YzdhMjgzZGZmNTU1MThjMzgyNTdjYTJmNmRlMDk4ZDMxMDU3YWNmNzM4YzkzYWJkOTk4NjkxZDRmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvTGlzdEJsdWVJZEZvbGQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjRmYWUwZjkxZTQ4Yjc4YzgxYzM5NjA3MjYyY2UxYjYzNDU1Yjk0ZmM1NWYzZGQzNDg3NWQ4NTIxZGExMzk4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvTm9kZVRvQmx1ZUlkSW5wdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDg3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiYTJmMGFmNGE1YWM5MWQyZmM1ZjRjZDc2YmYxYjY2ZDc2MmQyZjI5YmMzMmUwODE5MjBhMTI4MDM0NjdjODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L09iamVjdEJsdWVJZEhhc2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODc2MTg5ZjE0N2NlM2NkZDAwOTJhMDA0MDk2OWMyNGJkNjk4NTRmNjQ3MTRiNDA4YzQ3OTcwZDMwNWRiYmZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9TY2FsYXJJZGVudGl0eUVuY29kZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWFjMDJiNzY2MjdiZjQ5NzMwODQzN2I0ZTc2NGFmYWI4YjkwZWYxMWI4NjhiOTQwNTNkYjI1MDQwZGRkMGFkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvU2NhbGFyTm9kZUlkZW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0YjU1Y2ViYjY4ZDdlMGU3NGVjODU1YzEyMWI2MmU3MWQwYmQ4OWY5MWE1MTQ1OWY4MjYzYWE3NGYwZDUwYWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L1NjaGVtYUVudW1DYW5vbmljYWxpemVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlNGJmYzdkNmRkZjY4ZDk2NDM2MTY1NzgzZTc1NWQwZjYyYjYzNDY3ZjgyMTU5Y2Q0MWUyMWVlZTRiM2I1ODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L1NvdXJjZURvY3VtZW50Qmx1ZUlkQ2FsY3VsYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMjcwMmEzNGM5OTZhZWNjZWEyNjA2M2VhYjEwYTZlYjgxMjRkNGFiM2E2NmUwOWJiM2NmOTJmMDg3YjdjYjU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9TdGFuZGFyZEJsdWVJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTRkNzMwM2VmZmY5MmRkMDhiNmRkMjJjNDA5OGExYzY1NDI4NTZiYjQzZjgwYzc2MjcyNzYyMzI2NDRmMThjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9TdGFuZGFyZE5vZGVJZGVudGl0eVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzU5NjJlZWU5NjNlMTdkNzIyNzRkMDJmZTZlMmYwMDU1YTUzMmJiYjBkOWQ2MjQwNmFhYWI0OGViOWQ0YTc3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4NmUwMGVkNzczZGRjOGFjZGY4ZWJhZmZmNGQwZDVmYWZjYTQ2NmEwYjk5YmZkNzVkNmE1ZjUxZmFiMWIzYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL0JsdWVNYXRjaGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMWM3YzM5YzhhOTIyYmMxZjFlMDZlMjk2Yjc4NzU3Y2NiMzAwMmFkMjI1NjM1MzAxODAwZDhiNGQyODcxMWZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9Gcm96ZW5TY2hlbWFNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMWFjNzY4MjRlZjgwYTM3YzczZDk3ZDkyYWQzZmZhY2Q1YmFmMGIyNzY0MDZkZjM1YTY3YTRiZGFjMjRiZmVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9Gcm96ZW5UeXBlTWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQ1ZWIxMDM5NGM0MzU4OGEwMDViZTIwN2FmNjhiMzY1ZWU3OTA5ZGFjZTVhMDliZTc1NTIxNjQ1YWE2MTBjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWF0Y2hpbmcvTGFiZWxOZXV0cmFsVHlwZUlkZW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2MGNkMjQ1M2ZjYzMzOTI0OWUyNWYyNjU3NjBlY2QxMzVkYmI0ZWEwYWE4YmRhZGMzOWFlMmU5ODhkNmQzYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL01hdGNoaW5nUGxhbkNhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjEyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImNmNWU4YzVhOTEyZGY3OWM4ODhhYTRkOWVmMjZiOWJhOThjMDE3NWNkMGY5NDZhMWJkOWFkZDljZTY3ODEzMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL01hdGNoaW5nUnVudGltZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOTc1Mjc4MDM2MzkyMDhhNmExMWNjNTE0ZTJiOWUwMDA4NjBmZWIxMmNlYTY2ZTA2NGM4MmNmNzc5MzA5YmVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9Ob2RlVHlwZU1hdGNoZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwYTdmOTQ3ODdkMjk4YThlYmFjYTVhZDk5NGI4ZDUwYWFiZDIxMzk5OTViYzkzZWMyOWZhOTk5NDgwYjAyZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZjRlZDIzY2ZlODhlMjAzOGFjNDBhZjZhM2Q2MmM5MzY4M2VkNzQ0YTFiZGY0NTNjYTVlMGY1YWVmYzY1Mjg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9BY3RpdmVUeXBlU3RhY2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhmMGIzZTFiYTcwNTBjMzE0NTkyYzM5MmUzNWU2ZTllNjFhMjE4ZmNhNTU4OTVjNjQ1NzI0ZjA3ZGZkYzUwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvQmx1ZVNuYXBzaG90cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjJjZGYyZDI0MzI4MDhjMjkwMmVkMzFlMTA5OTM0MTgyZDNhMTIxMWQ3Y2Y1ZGE4ZGNhMDQzZTNmZmJmZjM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9Db21wbGV0ZWRWYWx1ZVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWU4NGQ0NzJjYzIyMDM0NmJiM2EwMTdkNGRhNzNiMDQ0NDJkNTE0YmRlYmU5MmFjMjhjNGZhNzdmMDYwNWFiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvRml4ZWRDb250ZW50VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmY2U1NjYwMmMxNTdiM2ZkMmRmYzg2MjY4ODRkMmEzZmM2NzI4MWQ2ZDA4MDA0MDY2YmU3NDY0NmU0Y2ZjNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL0luY3JlbWVudGFsTWVyZ2luZ1Byb2Nlc3NvckNhcGFiaWxpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjhhMzg1OGQ5ODYzZWRhMDZmMDE1ZWJjZjQ3NGY4YTk5YzdkMTlkNDI0ZmY2NTExMzE2MWVlMGE1MmNhM2VlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvSW5jcmVtZW50YWxWYWx1ZVJlc29sdXRpb25SZXF1ZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlYWNmNzEyODM0ZDcyMjRkZTAzZDFkMGRmMTFkNWEzYmJmNTkwZjFmZTg5MGM3Njg2NDhiZmVjNjIxZGRiODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL0xhYmVsUGF0aC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDMxZTJjNmRiNzEzMjNkNzI5YTIwYjQ2NDI2YjU0N2U4YzM1M2Q1ZTdiYTRiMDk0MmNkZmY4YjgxZjEyZjc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9MYWJlbFByb3ZlbmFuY2VUcmFja2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMzMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODcwYTU2Yjk1NzNhOTMwZDNiMWZhNzE1YmQzYWY5NGY2ZWFlODdhN2QwZTA1ZTNlOTM4NjlhMWIzOTdjMThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9MaXN0T3ZlcmxheU1lcmdlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzFkMTc2MmU3ZDg0MGEwOWYxOGQ2ZjJiMjRhNGI4NmU2M2I1YTRjZmMxY2RjYWQyMTkxNThmOTZkNmJhOWM5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTWVyZ2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0NWY3MzI0OTA0OGY1NWRjMjQzMjE3YjE3ZmRlOTA5YmJlNTJjNTA0MzQ0ZjMwYzBhYjdiMTQwNzlkODFhYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL01lcmdpbmdQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTQ0NDBiZThmMDQ2ZWY3NTk4YmMyN2EzOWIwYzc3NmQ3NDQwY2RhZTc3MThjOWIwY2UwNjZhY2FhNmNmMmQ1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTm9kZVJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjllNGE4ZTA3NmEwYWFmMTQyM2RhZjU4ZGMwYmRhN2NjMDUyMGJhMmVjYWU4ODk3MDhjNDI1NzJhYjkxMDI1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTm9kZVNwZWNpYWxpemVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdjYmEyZGMwYWZjYWY1YTYwMDA1ZDE0NjI4Y2M4MzMwZDI1MDZiZWYwZTU0N2YzOTRjN2Q5NjJkNTJjZTEyYTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1JlZmVyZW5jZVJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZGEyMjE5MjdiY2I2NjZjMjBmYmIxMjk1OWY1NmQwZTJmN2M1YzdkOWYzYjdjNmI1NzNkMGExOWI1MzRmNjAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHV0aW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1N2RlNTIzY2RhOWFiNmQ0YTJjZjFmODJkMjAzZDQwOTliZGYxMTNhNDIxZDUxNjhhY2MzZDg1OTE0NzFiNTBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHV0aW9uUHJvdmVuYW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjFhNGM1YWYxZDY2NWVkNjU0Y2IzYTU5ZWE4ZjZjNTdiODc5ZTNlOTRmYWUwYTk5OTQzZGE5YjNiNWZiZTA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHV0aW9uU2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjRmM2Q0ZjI1NjIxNWQ3ZTE5M2M0Y2M3OTAwNWQ5ZGY2ZmVlOWQ2YzdjYzFhOTJjNzUyN2RlMTFjM2E1ZTdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHV0aW9uU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDM2NDM2NjhhZmE2NDgwM2JlOThiMzRiN2E0MGI3YTM2MWQ4MjA4NzU4Mzk0MDE2MGZmY2M5MDc1NTFiOWUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHV0aW9uU25hcHNob3RGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljOTZhMzdiNjBhYWI1NTU4NmFlZWE1NzFlOTNhZWQyOWYzMWQ3YzFlNGM1OWQ0MTA3ZjVhNzhjYTgwMDc3ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1Jlc29sdmVkUmVmZXJlbmNlQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzU4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2Yzc4NTVhY2VhNzQ1MzJmOTUzMmY5MzMyNGNhNzViMzQxNmEzYjliYTVhODZhZmI0NWJkMjhmNGNjYmNiNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1Jlc29sdmVkUmVmZXJlbmNlQ2FjaGVBY2NvdW50aW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZGQ2ZjIwZDY1NTliNTk2N2Y5OWMyNjRmMDcxMzI4YTU5MDViYWUyODk0ODdjZmEwYzk5MzA3MWRkMTUyMDk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUNhY2hlR2VuZXJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiODE4NjM1NTAzNjAyZjc4NDBhNTQ3ZmNhNTAwMTU0NWRiNzFmMTZkMGVlMjgxNzU4MmM1OTJkMjQzNjY5NDc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUNhY2hlTGlmZWN5Y2xlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OWRmZGVmNzI2ZTYyNjhhZDNhYzFhMmYwNzA3NGViNTcyYTA3MDY0Y2YwMzg0OTYzNGY2NjM0NGJlMDgzM2QyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUNhY2hlU3RhdGlzdGljcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYWZkOWYwYjNhOGU3ZjFjZDc2NDBlMDlkYTQxN2NiZmM1YzZiNTE1MjljMTJkNWYwNDI2YmQxYmQ0MmI2MWM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUdyYXBoSW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDEyNzM4N2ExOTk1OWE5N2UxOWVhZTBmMWQwM2I5ZDFhZDMzNTBmOTEyYjI1YmFmZTJlNWNkM2U3MzQzZWM4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x2ZWRTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODkwMDkwN2RmM2FmNTgxZDQzOTgwMzZkYmI1OTdiYTdlNDM3ZjMxNjI0ODhkNGM3OWQ1NDkyNmI3OWRhMmY4MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvU25hcHNob3RSZXNvbHV0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImMwYTk4YmNlOTk3ZjJlZDYxNWIwOTcxNDQ4NTA5MzNmZWYyZTk4YjdmMmY3MTc4ZWNiZjNhOGNjYWI1MTA1YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1ZlcmlmaWVkQ2Fub25pY2FsTG9hZENvb3JkaW5hdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyYzc4YTU0MjMzOTQyMzhkODRkMDMyZTI2NjUyYjI4MTM3YjUwMDk1ZjgzMGMyYTdlZjQ3OTc0ZDdkYzkyZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1ZlcmlmaWVkUmVmZXJlbmNlRW50cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZmI5ODIzNzg5YWVjMDQwZGMzZjMyOTEyZDhhZGZiOTg1MDY1ZGViYjA5ZDAzMmZkZTdmODE5YTcyMDY2NDg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9WZXJpZmllZFJlZmVyZW5jZVJlc29sdXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTQ1OGY5N2FmOTE1MWM2NTdlYjJiMTZmOTQyYmJjZjhjNWY3YmYxOWI0MGM0NzhkYjZmNDQ4YzJjZjUxYTNjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1N2VjNzNjMjRiMDJiYWZkY2ZjNjQxNjJhYmRkYThkYTQ3MzFjOThjZjdmZTI3YTQ2MDZjN2IxYTg0ZmY4MjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9CYXNpY1R5cGVzVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGVhODc0MDE4N2QzNWE5NmM0NTc2NjM1ZjcyYzkxNTlkYTliMDU3NTNlOWJiNWE0MTU4ODBlZWZmNTU1M2JjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL0RpY3Rpb25hcnlQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY5ZTJmZmIwYmIyNDkyMGE4YzI5MmIyYzQ5YzE2YmRkNTBlMTc0NmM2N2YzYzI0YmNhMjI5N2RhNThkYTIzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL0V4Y2x1c2l2ZUl0ZW1zT3JWYWx1ZUNoZWNrZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDM2MTlkNDFlMGVjY2UyZjBhMTk2OGJkNTVkYjcwMDU4ZGViZTBkYmI2OTA0ZTNhMDAwNGFiMTc4MzJhOWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9wcm9jZXNzb3IvTGVhc3RDb21tb25NdWx0aXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODhmZjAwMDk2NjY4ZGJjNjY3MDFjMTg0Y2RmODhkMWNlZmY1ZjUyZTE1ZTQ2OGJiZDY3YTNiNzczMjBlNzAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9wcm9jZXNzb3IvTGlzdEl0ZW1zVHlwZUNoZWNrZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjM2NTQ2OGRjOTJkMzhiMmE2ODNmOGNlMDNmZjE2MzIwM2MzMmQwZjMzN2VlNzhlZTg0NDc5OTBiYTRlODkwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL0xpc3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM1MmExMDgxZDBiZTZkNjVmMTM4MjFkMDQwZGUyNjUwYmZjYjQ5ZWY0NDM3NmU2YmI3NzU0MTZlMjc3YTVkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL1NjaGVtYVByb3BhZ2F0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImExZjU1MTM3NzMzOGRlOTJmODFlNmZiMjQ2MWM0N2VlYWMxYTcyNDMwMjkxNDI1M2ZkNDQwMWIwOGRlYzVmNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9TY2hlbWFWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTkxZjVlNTI0MzA1NTdhYjM4MDRkMTVjNWQ0ZmRlY2I4MmUwNjg3ODZkYjgyODI2ODAyNjVjNWUwNGViYzdjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL1NlcXVlbnRpYWxNZXJnaW5nUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1MGJkMWZkYzQ3MTE2OGE2NjUwN2Q1ODk4OTQ3YjNlOWNiMGQyYTE1YjYwYzY3YzU0NDQzNmZiZDE5ZDk5MWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9UeXBlQXNzaWduZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2UxMjI5MTA4NjM3MDM1YTM2ZDg2NWQwMjA4ODgyMzRkMTY2NzFlMDA1MTMwMTk0MjZlNjZiYjY2MjdiZDlkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL1ZhbHVlUHJvcGFnYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyN2JlOWI2ZWRjOGQ3OWZmM2M3NjJhNmVhNDNiNGI5OGZhNGE5ZmIwYzIyODQzMGU4MThkNDYyYTI5M2MwMzU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9wcm9jZXNzb3IvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkNDEzZjAyMTNkM2Q2NzQ2NWRkZTMwMzY1NGNmYTgxODAxYTljYTY5YWMzMjkzODIwNGYzYTdkNGRkNThlMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3BhdGNoaW5nL0JsdWVQYXRjaGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5MDA0ZjFmNTkwYjUyZTRiMTI5NzdhZWNkYTlmNDRiNDRiNGIyYzllN2ZmOGVkOWFiOGVmODJhMTdlZTc1NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3BhdGNoaW5nL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMmU5Njk1YTM5ZjMzMTgxODYzYTQ5NWM2ZDU5YTdhYjA5YzhiYTIwMDJmYmU4OTc2MmMzZGJlYWEzMGIwMjVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL0JsdWVQcmVwcm9jZXNzaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTM1NjA0M2ZkZGJmMmM4NmRiMzA1ZGQxOWQ1ZGNkYTExMzQwOWZjN2JiN2NmZDY4ODE5NjkwNDJhZGZlZGJjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9EaXJlY3RpdmVSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYWNhZTUyNzgxMjRiYjM0OWE0NjIxZWI0YjM3MTk5YjdhMjc4YjYzZDA3YzYwYTU0ODA4ZjMwOGU4YjRmZDM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL0RpcmVjdGl2ZVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzlkZTc1OGVlM2Y3ODBjZmFjMmMzNmJkNjZhMzI5MzFkNGE3NTc5YjFiNTBmMDI3ZGQyMjdlNTZjYjU1NzJlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9JbXBvcnRNYXBCdWlsZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwMTNjMGEwYTIxNjdlMjAwM2EyOTNkODhjMTY1MDE3MDJlOWUxZTdlOWY5YzNiZTUxM2Q2ZjU2ZWFmOTFhMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvSW5mZXJCYXNpY1R5cGVzRm9yVW50eXBlZFZhbHVlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NzBmY2Q0ZDA0MTI1MWNiNmQ4MDVkMWI1NjkyOTk3ZWVkZDFkYTk2OWFiMDQ1ODRiNDExNmQ2NDAwMGYxYWJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL05vZGVUcmFuc2Zvcm1lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjllMDlkOWUyYjM1MzllNzkyY2JmMmI4ODE0OTY2ODliOGRmNzI0OWQ0MDM0NWE5YTRmYjZjYzZiNzZkZjI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL05vcm1hbGl6ZUxpc3RQbGFjZWhvbGRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjk4Y2M1ZGVhMTIwMTY3YmI4ZWY1ZGY3NWY3ZmNmMTdlMWJiYTJkNDkzNTk5ODhmYTVhN2NiZGFiZTE2OGVmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9QcmVwcm9jZXNzaW5nQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDBhZmVlNmNmYzU1OTE1ZjlhN2RmYjY2YWE3ODcxYTRjOTBiNTFjNzM5OGEzYWY4NzdlMWE2YzFjNmRmNGQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1ByZXByb2Nlc3NpbmdEaXJlY3RpdmVSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYTQxYTM0NDliNTUwMmQ1YzU5YmExMzY3ZmY3YWFmYWI5ZjYwYzdiMjZjMzkzOWFkZTIxOWQwNzY2ZjkxZTg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1ByZXByb2Nlc3NpbmdMaW1pdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFkOGFhMmIyY2QwZWNlZDYwM2EwMWJhOGZjODc1Mjc0MDEwZmNlMzg4NWUxOTQ4NmI0ZmZlYjkyNDM3NTI2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9QcmVwcm9jZXNzaW5nUGxhbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MjYzZTBjNTQ0ODk4MzQxNzljZWU5MzBmNzYwZGZlODgxOWRjYTMxMGU5ZjBiZjAwYTgwYWI4MGZmZTEzOTk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1ByZXByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzM2E5ZGQ2ZjYxYmQ0NWFiMjhmZGQzOGZmZjE5ZDAzNDQ0MDM2YWYxODc0Y2UxMjA3MjQwYzdjMDNiM2QzYmE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1JlbGVhc2VkVHJhbnNmb3JtYXRpb25Db21wYXRpYmlsaXR5UmVnaXN0cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWFiMmUwNjU1NGNiOTIyOGExNWU0MTAwY2ZiNzFlNjgwZDY0MjI2ZjUzNDhhMzcyNzgxNWI5ODlkZWJhMDhkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9SZXBsYWNlSW5saW5lVmFsdWVzRm9yVHlwZUF0dHJpYnV0ZXNXaXRoSW1wb3J0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2M1MTZhYThhNWY1NjIwMzU0YjJlZDk4MTQwZTcwMmNmOGE5NWU3YTQyMTJlZmI1NmZiNjU1YTNiODEzNTkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1N0YW5kYXJkQmx1ZVByZXByb2Nlc3NpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmRhNzY3NWYzMzk1Y2IyZDcxMTlhMDY5ZTkwYmY2MDI0NTQwMjQ4ZjEzMThjZGEwYTI3NzcxNmUzZjYxMWY1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9TdGFuZGFyZFByZXByb2Nlc3NpbmdQaXBlbGluZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmI5Zjk0MzRjMjJlNjVkODFjYzNiNjdmZDZlZTBmNzBjOTA2MTEzMjhmOWI4OTk1MDgwMzU0YWE4NWIyNDAyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9UcmFuc2Zvcm1hdGlvbkV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyMjNjMzg2OTcwMTMzMDdmOWM4OGM4NzJhYmRiNjlmY2MwNDA4OTA2OTU4ZmM3ZjFmNzEwYTQ0NjgwZmJkMGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvVHJhbnNmb3JtYXRpb25QbGFuQnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NzhhZmIwYTMwZWEwMDQ3YzVhNGQ4NzQzN2MxN2Y4MWY1ZDA4MTU0MjMxMGFmNzNlNDQ5NzY5ZGM4YjZiNzU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1RyYW5zZm9ybWF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwYTI5NWE1YzQ2NDhmOWIyNTdjZTlkNTJmZWNhZGM3OTM1ZjhlYmNhNDU2MzU3YmNiYTZjN2VmZTY1MDQ4YzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvVHJhbnNmb3JtYXRpb25Qcm9jZXNzb3JQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMmJmNjViNzdiMjE3NDM4NDdiYmI0NjU4ZDc1NWRiMTk2NDVmZDZhM2E5ODZhMzg2MDJlODQ1YTRjNDhiMDc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1RyYW5zZm9ybWF0aW9uU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODg4OGNmMzY3N2M0ZTk3MDc1OTFlZmE1ZTI5NTNlMjc3M2M2MjljMjQ0ZWRlYmFmYTFjNjFiMmNjMjYzMWM4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA4YTNmMzY0ZDJkNDY1MjkyNGNmODk3NDFhMDc0YmI5NDkxMDMwMDlmZGI1NmExYzYxNWI4Zjk2MDQ1OTMxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9wcm92aWRlci9CYXNpY05vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzYwZWMyMTgwODhhYWI2ZmRjMDI2Yzc0NDc2Y2VjNzdlOWRhMzdiNzZmZjljNTE3YzVkMjU2MDkxNGY4NjUyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9wcm92aWRlci9EaXJlY3RvcnlCYXNlZE5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzU0Y2U2YzdkYzU1NTI4YzNmNjVmZWQ4Y2JlOWE2MjI2ZmU5ZmFlNWU3MmEzMjU2MjQ0MWFlNjYyYjE0YTg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL3Byb3ZpZGVyL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTFjYWQ5OWE0OTQzODU4OGEyN2Y5NGEwMzQxY2FlYzQ1ZmZjNDU2OWFkODE3MzU0ODQ1MzAyYzEwNzAyZGVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9BYnN0cmFjdE5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYjkwMzNiMjAwNTUyMDVjMjA1NjY0MjU3NzgyNGMzNjlhMzA0MDcwZmNlYzVlM2NkMjRjZjFiZGRjMDBhNDQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9DYWNoaW5nTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImUyZjY2OWEyZjU1MGIxOTcwMDY3OGVhYWJjODZmMTE3ZWI5ZDU5MzAzM2Y0Y2JmZjI2MTA0OWMzZjU2ODU4ODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0N5Y2xpY0F3YXJlTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxOGVlODI1Nzg1Zjg2Njk3Y2EwNmUzZmIxNjcwNjA5NjE3ZGE1OGUwNTQ4Nzc1Y2MyNzE3YWVlMmQzMTcyMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0N5Y2xpY1NldFByb29mLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzc0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjZTY4ZmE1NWU4OTI5OWU0YzJlNTdjY2JhNmRiMjY0Y2M5YzM0MTY3MDZiMWQyOWE3OWI3YWI0N2ViMDcxZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0N5Y2xpY1NldFByb29mUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhYWQxZTNhMDEyNDU0YjQ0ODZiNzI4MzI3NWZjNjAyNWFmMjAwNzYwOGViY2ZiZjRmMWM0ZTlhYmYxMDc0NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0RpcmVjdE5vZGVNYW5pZmVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OGRlNzZiMDdiMDFiNTlhNzNlODc4ZDRkYTM1NzhiNmYzYjE2NzMyMmExNDRkZWIzYzY5ZmY1ZjcxZTc3ODUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9FeGFjdEZyYWdtZW50QXNzZW1ibGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1M2IzNGUyYTE4ZGRlNzhlYjQ5MDMzNTVkZjViYmQyOThjZDZkZjk3ZWU0NjQxYmNiZjQwOWZkZTM3YTk1YjI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9FeGFjdEZyYWdtZW50R3JhcGhWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiYzJlNjI0MTI4OTcxOWNhNTg0MWM1NjQ3ZTY2ODI1NGIzNTIzODUwZGUzMWE5MjNjNjM2ZjEwM2Q4YjE1YmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0V4YWN0RnJhZ21lbnRQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDU2ZDBmNjI5MjQwNjhjNzFlOWY5ZGE2NTY0YTUyYWY4MjYwYmM5YmYwMmE2YmJlYjhiNDM1YzA4YTllM2JlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9FeGFjdEZyYWdtZW50U3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjNjZmFiOGNiZTJkNDg3YjEzMjI5NzM3Yzg1Nzc3YjJkMDU3MTNiNTBkZGY4MWM5Mjk4OTg5ZGYxZTc5NjNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvRXhhY3ROb2RlR3JhcGhGcmFnbWVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlZTJlY2VmMjA3NDJjMjZmYWFiNDljNjk1OGI0NDc1MjQxZjc5OWJkYmY0N2JhYTk5YWJiZTNjNGUzYWQzZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL05vZGVDb250ZW50SGFuZGxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGEwM2Q4OTllMTA5OTc0Njc1Mjc1YTM5MWZjNGVlZDA4YmE1YmNkMjU1NmExMDQyODc1ZTBhNmFjZmEyOGJlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmZGRiZmRhNWVjY2ExY2QzMGUwOWM0ODI1MDQ3ZGMwNzY4NWVmZTFkOWVmNzIzNzVjZTJhNmE2ODg1YzgzZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL05vZGVQcm92aWRlclJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MGNmM2IwMDNiYjMzNWI5MTQ5Y2Y3Yzk1YTRkYmY4ZGNlZDkxNjFmZGJmMzNhNDJhYTI2ODg5Zjg1MDk0ZDYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Qb3RlbnRpYWxCbHVlSWROb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY5M2ZkODA5NmNlOTlkZmVjMjVlN2E2ZWU4MTVhMThjM2U1M2I4YmY4MGFiYzcyNzJlY2Q4NjA0YzA4NGM1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvUHJlbG9hZGVkTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNlYzMzMDAyMGY3YWQ5NjhhOTI3NTdlODU2OGZlNzJjMDQyNDA0ZjE4N2E0YWIxYzA0NmJmMDE1YTQ2MGIzZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1Byb3ZpZGVyRXZpZGVuY2VWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMThhYmI0YmRjNDhjMDljODA2MzkzMjZlZTJlZDdhNzQyYmNlMTgzZmJmMGE3NTMyY2RjMzFmODQ2NGQ1ZDVmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvUHJvdmlkZXJNb2RlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzMTczOGEzZDYyNjdhY2FjYTQ4MTdlYTcwMWZlNDNiMTAzNmU0YTAxMzg3MGM4MDYzM2ZhNGViYzY4NGE1YjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1Byb3ZpZGVyVW5hdmFpbGFibGVFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDU3Mjk2YzBhNDhlYmM5MDUzZmI1OGNhZjEwZTJjYzc4YWUzYWJjMDIzNjAxNDQwYzgzNmNhZDlmOWM0OGVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9TZWxlY3RpdmVFeGFjdEZyYWdtZW50QXNzZW1ibGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkM2Q0ZDAzZDRhMTFmZmM5MzlmNDY4ZWZlYmRiMzIzNjcxZDBhZTNlYjU4YzFjNjY0NjFjZTYyM2YyYzFjOTkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9TZXF1ZW50aWFsTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzMTVlNTNkMGFjODFhM2EzOTU2ODI3MmM2M2Y0MjdmZGJmMjYxODgwOWJkYzdjMGNiNTU4MTRkZWY3M2E5ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1NvdXJjZUNvbnRlbnRWZXJpZmljYXRpb25SdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkyZGEyZjg2YTE1YzZhYzkwNjljMDExZWNhYzg3MDhmMThiZjc4NjgyNzhiNmMxNDRhZjIyOTlhY2I4ZmY3YWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1NvdXJjZVByb3ZpZGVyRW52aXJvbm1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWUxMzYxMGUwNjY1MzI3ZDI2ZGIxMmExYWJlNzRmZjNlYzI5ZmFjMjJiZDYzNmI4YTQ1ZGViZDlmZTE3Y2I3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxMWE0OTU0YTEzMjVjOTZhZWVhMmU2YjYxMjc5M2Y3MjRjMzEwYzk5MDJiMDMxZDU1ZTA1OWI1MDk2ZGFiZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1ZlcmlmaWVkTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGU3NWM1YzM5MmU3N2U0ZTUxYmJkZGRkZDlhYTdkMTkzNzEwYTlmNDAxZTczZDg2OGE5ZWJkOTNkYWYxMzIzOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvVmVyaWZ5aW5nTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODFkYmU2ZDAwYzI4ZmYwYzlmZGZmNmZhY2Y4MzAzNzlkOTE4ZDhjOTI0YzQ2ZTJmYWJhYjcyMTZjZDRhOGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTQyMTMzNzg5MjAwMGI2YjVhYjI3YTExNmFlZmUwZGZiMjBlNDc3ZWM5ZTdlODZjNTBiNzc1MjE2YjBjYzBhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVnaXN0cnkvQmx1ZUNvcmVUeXBlUmVnaXN0cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTcxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlMDFmODAyNDNkOTIwZGYyMWJkYjRjYzQ2MzJhZmY3YTA5YjJmYTc1NDc0YTA4ZjM3Y2FjODYyMmM5ZDg4MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L0Jvb3RzdHJhcFByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1MDM2NTgyNTExN2FhODQ1ZTkyYWRkNzBhOGU0ZWE0OTZhZWM1Yjc3YTY5NjZhMjRmOTU1YTkyODMyZDI3NGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L0J1bmRsZWRUcmFuc2Zvcm1hdGlvblByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyMTFlNzUzY2NhMGQ4MmFkYWU0NTg2Mzg4ZDkzMmViYjJjOTUyNGM1OTU2NGNhYjc4ZDU2MmVmNWVjMGU1ZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L05vZGVQcm92aWRlcldyYXBwZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNjA4NzVjOWEwNDUxYTJjNTJmMDZkMzM0NGVmMmY3OTA3MjYxYzY3NTA5MjQxNjZlYjY0OGJkZjhkM2QxYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L1JlZ2lzdHJ5TWFuaWZlc3RDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQwMmJmMDFlMmVlMDYxY2Y5ZWMzNTgyNjhhODUzZjFkOTA2YjM4NjFiMjRlODAzZDBmNmI4YzVkMWYxMDQ0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVnaXN0cnkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzOWU4ZDA1OWQ5YTlmN2FhODUxY2NiOWY5NDBiY2FlMWVkMWQ2YjQ1OWI5NDVkYmZkZTFmOTYyNzBkMjIxOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvQmx1ZVJlc29sdXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzZiNTI3ZDViMGYwYzMxOTI0MjY3MGJlYjE0Y2FiNWI2NDAwN2U0ZmMzYjUzOGFiMjQyNmZkYjhjZWUxNmZjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9Db21wb3NpdGVMaW1pdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWEwYWY0OTcwMjM2OTVlZGMzZWE0YjM4ZGY1MzgzMDkwMThlZjdlMzhjMWMyZDMzMGE3MTU2N2ZiYTY2YTY4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9EZWZlcnJlZFJlZmVyZW5jZVBhdGhMaW1pdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTJmOGEzZWYyZmM5YWUxYTFjMzg3YzMyNjUzNWJmNzMyZWIyNmM4NzQxYzQ2YWEzOTA0OTU2NWNhYTAwMmY1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9FeGNsdWRlZFBhdGhMaW1pdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2FmNzZjMThjMzRhZWVkMTdkZjhhY2YxM2JlMjMxMjBkOTlkYTA5MDcwY2I3YzU5ZmNhNjNiMzIxMWJhMDQyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9NaW5pbWl6ZWRPdmVybGF5QnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2M2ZhNGI3YmM5NTQxOTYxZWUxNTNjOWJhMTlhYjNlODg1OGFmYWMwMGI2ZjMzNjFiZGYyMjE3OWMzZTE0YzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvTWluaW1pemVkT3ZlcmxheVJlY29uc3RydWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUyMjQwNDkzZDFkNDhlY2VjMzE5OGM1YWFhODk4YWU3ZjNiODE1MjY0YmVlZWJmZjcyNWE0YTQ1N2E2YjRlNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvTm9MaW1pdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmViMjM4NDNmNjA5ZWYwODg5ZTczOTRkMTFlY2FkZWY0NjdkMGYyYmUwYjkxYTEwODgzODhlNjY4NDNiZjQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL05vZGVUb1BhdGhMaW1pdHNDb252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzUyZjQ2NmM3ODBkYzlhNWM5OWIyNWE1N2E1MDExMTYyMzMxNWRmYjE2N2VlOTEzZDE2MDFhM2Y1NGM0ZmVjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9QYXRoTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyOTJmOTNkMjYxNGQ1N2YxZDdkNDQ2NzUxYzhkYmVlZWIzY2I4ZTM1NmEwYjIyZGI1MmFmYjZlOTg1OGMwMDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvUmVmZXJlbmNlQ2FjaGVBZG1pc3Npb25Qb2xpY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDgzYWIzNmI5NDIyYmQ0MDBjNmZiZTdlNzI1YWJhYTQwOTIyMTZiYTIyMWJkMDg0ZDQ0NzU0MzRhYmY5ZjhlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL1Jlc29sdXRpb25MaW1pdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWY0MmJjNTZhZGFiY2Y4YjJiZmQwZGMzNWY4OTZiNGE3OGYxODc3OWVkYTAyNTdjZjFmODMxOGM0Yjc0OTc5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9UeXBlU3BlY2lmaWNQcm9wZXJ0eUZpbHRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjMyZWM4OWM5MDdkMGFiMTZjNmY1Y2U2OTg3NTAzNzYwMzFmMGI3MWU2Y2M5YzIyYThmYjczOTE4MzhhZDEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Zjk1M2UzNzcwZDc4YjJiYzlmZTA4MGI5MTljZDJlZTkzNjFhNzA2MzBhNDAwNWViNzRjMjM4NTE2ZTNhZTEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL0JsdWVMYW5ndWFnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmU5ZjZjYmM1ZjVlZGJiMjQ0NmI3YjhiNDY1MzYzYzUwZTU4ZmE2YjY0ZjU5YTA2YjgyZDQ5NjIzZTUwMzUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL0JsdWVMYW5ndWFnZVJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzI1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImU1NmFkMzYxZmY3NDE1N2RhMjFlMzMxNThiODgyYTllMTFmMmQ5MmNiODZmMTkwZjRhY2RiMDg4MDRiMGFmMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VNYXRjaGluZ1NlcnZpY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGVjMDBmNjQxMjQ5MDU1ODFmYzJmMTRmYzRlMjUwZTBkMDgyYjBmNzI0NGY1NzlmMzEwMGI4Zjk1Y2Y1NTFjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9MYW5ndWFnZVByb2Nlc3NpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImZkMDc2YTYyNDBjZWU5MDdmMzE3Y2RlOWY4MjZlM2I5MjM1NmI2NjI3MGQ4YzUyMzNiMjFmODVmYTA1NzU2YjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VSdW50aW1lQWNjZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY3OTQ5ZmMyNmM0ZTU3OWFmZGU2MjhjNTljYzE5MmY4NjY2NzdmZDFhNDBkM2VmOTY2YWY1OTc2NzgzMDhjODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VSdW50aW1lTGltaXRlZFJlc29sdXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5Mzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjRhMDZjMjNhNGRlOGM2ZTM1OWFlOWY0YzM5OGFiZDU1ZmNiZTgwNTdiMjhhMTg0MDMwMDVhYzA0YzlkMzA1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9MYW5ndWFnZVJ1bnRpbWVTZXJ2aWNlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjgzYzVmZDQ2YzlkNDA4YTJiZTY5MzVjZGYyNWNkOGMyNDU1MjcxYmNmZTZjYjRjNDU2YTNjMGNkNjIxYjQ0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9MYW5ndWFnZVJ1bnRpbWVTbmFwc2hvdFN0b3JlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWQxOTgwN2ZhMzlhNzAyYTY2MzE2ODNjMGI0YWNmMmNlNjhkZjNhY2FiZjM1YWMyOTg1M2YxYTQ3MGU3ZDM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL1Byb2Nlc3NpbmdTY29wZUxpZmVjeWNsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZWMzZTc1YjBmYzU3MWMxYjJhNGI2MTAyMWUxYjViZmUxMGZkNzYyZTQwMjczMjYwOWQ3MThlODExMGZiNDMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL1J1bnRpbWVMYW5ndWFnZVByb2Nlc3NpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTkxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0ZDg2NjQ4NmZhOWVjNjc4OTNlNjk2ZWNlYjc0ZjNmNGU4NDliYTUyMjhmMzg2OWE2ZmY3MGQwYjE4ZDBkZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvV2VpZ2h0ZWRMcnVDYWNoZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmRlOWNiNmYzMmM3N2EyYjMyNjQ4YjU5NmI0YTljYWM5M2RiMWE1ZDU2YzlmNDVlZTI0YTc5YmYxOGRmOGIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNWFlODNmOWE2YmY4ZjVkMTc2ODAzZTcxNDk2M2U2Y2I1MDNhNzg2MzU3NTIyYmFjNDFjMDc1YzdhYzEyMzRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9CbHVlUGF0Y2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzkxZGZmNmVkNDM2MzM1Njg1NGU0MDczNzcwNTFjZjZhYzk0NmMzYzMyODFjYzI4NWU3MzBhMTdjMjk1MDI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9CbHVlUGF0Y2hPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjYyYTRhYTFhYzYwZTQ3MjE5ZGYwYjFhNDA0OTU1ZTAyMWMyZjRlNGM2ZGIwMWRiMjk2MTI3MDE1MThhNDU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9DYW5vbmljYWxPdmVybGF5UGF0Y2hFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTc0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5M2FkZGZkNTM3MTY4N2VkYjA1ZjdjYTVjNDM1ZjY3YWNlNTMwNGQ0OWQwN2Y5YWZlZWZjYTViMTkyMGEzNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Nhbm9uaWNhbFBhdGNoUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiNDBhZDIyNTAxYmE5NjQxMzY4Y2JhYzVkYWEwNmFlMDg5NmM0NGYzOTgwZDY0YjdkNGM5OWRhYjdhODkzOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbkNhbm9uaWNhbERpZ2VzdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY2OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOTdjNmU1Y2M2MWE2YjRiODllNTAzODc2MmExM2FjNmU2ZTM3OTUyMTViMDYxY2NjZWUwMGU2M2FmZGE5MzAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5DYW5vbmljYWxXcml0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDAzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImYwMmVlZjFmMzY0MTZmYTgwNTRjNjdlMTlkY2E2NjQ2MTk3MDhjMGI4ZjUwNjNjMDkwZWI4NDgxZjA2YmIxM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0ZWI1MzQ1ZTU2ZmQ1MGI1MjM0Y2ZlZmRhNmJiYTU0MDg0YWI0ZTcyNTY3ZTg0YTE1YzZmOTBhZWYyMWYwMTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGVCdWlsZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODk4ZTUxZmQwNGVjNGFmZTI5NzM4M2RiZTUzOTNlZTA1NDAwYTk2Y2YwOTg3NzJiYjJkYzZkNWY0MmU1NDI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjgxMzI4M2YzZmVkYjVkY2MzZTQzOTk5MmM1YmFlYjMwNGQwMmMyOGY5MGE2ZGM2YzQ0YzMyMDVhNDAwODA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2ZjQwYTUzZjRlODg1ZDkxZTVlOThhYjgzYTIxZjliNmJhYzE5Y2JkYzI3Mzg5ODA4ODYxZTdlY2JiODE3MjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGVOYXZpZ2F0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjA1MmFlYTZmY2QxYzM5YjdlZDU0NGMyMmY1ZGM2ZjI2NWE1YzcyZGY1YTRhMTg0YzEwYzY4MWFjYmIyODVkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZVJldGFpbmVkV2VpZ2h0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNmNjYzJhZjYzOWYxM2ViMjUyOWNlYzAwMTk2MGZkODE3YTBiYjI1ZmZlZGMyN2M0MDhkNWIxZTE5NzRhYjI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlU3RydWN0dXJhbEtleS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZWZiNWJiYTFhYzVmZDQ5Y2M1OGM4MzcxYjk0NDFjZjJiYzViMGY1NDc5YWZkZjk2YTkwZDRiZjBhN2QxODMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlVG9CbHVlSWRJbnB1dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NlMjUzZDk0M2I0YjQ0OTRiNmYzYTU1NDkwYjI4NTM0NzYxZGU2YzViODFmYjY3ZDJlN2IzMmU0Y2QzMGQ5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvSW1tdXRhYmxlQmx1ZVBhdGNoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkZTkxNDNiMWM3YTAyYWZlZWYxZjE4Y2E0MDRhMmE1YTI3YTFhNmQyY2U1ZGM3MzA2NTgzM2UyZTQwZmExZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwM2JmMDFhYThlNWY0YjQ5YjllYTk1ZDc1YTMwY2MwMjAyM2FlYWJiNjA4NjMyODM2OWY3ZTM4NzgwZmNmNGM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9ibHVlLmxhbmd1YWdlLm1vZGVsLk5vZGVJZGVudGl0eVByb3ZpZGVyIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2UwMTExOTJjYmZiNGZkZmM4NjcwMWI4NzQwMjBhOGE0MzMzMzgzN2RhNGRhNTdmZDY1NzgxNmQwZDQ3MDE4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1sYW5ndWFnZS0xLjAvQm9vbGVhbi5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkyY2Y3ODg5OWFlNjdkY2ZjZGI3Y2I4MzcxOTBhMDQ1NDVlMzc5NjYyMzZlMTgwODg5NWJhNzBlZWRjNTMzMWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtbGFuZ3VhZ2UtMS4wL0RpY3Rpb25hcnkuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjVhZTJkMzYzOTM5ZjE2Njg1ZjNjMDdlNGExZjFmMTVhMmZhMGFjYmQ5MDRkMDM0NDY1MTNjZTkwNTZlYjlmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1sYW5ndWFnZS0xLjAvRG91YmxlLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGRiMjhiZTcyYzU1YjYwNmNjOGViY2JlMzU4ZGY0OTg5OTFjOGJlZjYwMTlmYjFmMzc1NDFkYmZjMzkyOWU5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1sYW5ndWFnZS0xLjAvSW50ZWdlci5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmZmU1Mjg2OWI3ZWU0ZDg1ODc0MDVjZTJiNzcwNjIyMjA0ZjQwNjMxZDYyNDY2MjAxMzlhNWE0OTBmYzZkZTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtbGFuZ3VhZ2UtMS4wL0xpc3QuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDhlODY2MjFiYzJhODRmZjI4ZWFjYzBjNGU1NzUwNDYwNWQwNTc1ZjcxNGY0NTZkM2FiYmRlNDMwZGUwYTA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWxhbmd1YWdlLTEuMC9UZXh0LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGI4YTRmZjQ1Y2NjZmJiOTJlMDExYWMzYzc5YTcwZTZhMTdlNTdmMmE4MDdlMTA3NDdlOWY0NDRjOGQxNWZlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1sYW5ndWFnZS0xLjAvbWFuaWZlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE5MTlhZTI1YjFjMjFjOWE1ZTYzMjEzYzA2N2Y4M2UwM2FkZWQzOWE1OTdhZGI4MDQzZDRhYWNkMGRhY2Y1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvc3BlY2lmaWNhdGlvbnMvYmx1ZS1sYW5ndWFnZS1zcGVjaWZpY2F0aW9uLTEuMC5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg3OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjM0YjBiNDIxOTBhNzk4MjgwOTc4MWI1ZWZkYWEyZTVmMWFiNGI3ZjhkODcwZmJkMWZmZTcwMjBjYzdlODY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy90cmFuc2Zvcm1hdGlvbi9JbmZlckJhc2ljVHlwZXNGb3JVbnR5cGVkVmFsdWVzLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmM2NTg0ODMyN2Q2MTNkOTA1ZDA3MzM0OGI3ZjZhMTc4ZTE5ZWE3ZTQ5NGU1YmUzYzI5YzFlNzQ4MDIwY2U1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvdHJhbnNmb3JtYXRpb24vUmVwbGFjZUlubGluZVR5cGVzV2l0aEJsdWVJZHMuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODE4ODBlYzYwM2Y1MDI0ZTUwMmE1MWRjMmFkNDc2ZTI5ODRiYjI0MjI0MzllZDBkMjdjOTA0NzIwOTNjYTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy90cmFuc2Zvcm1hdGlvbi9UcmFuc2Zvcm1hdGlvbi5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2RmMDAzNjE5MzJlYTg2MTgzN2IzZjg4ZWM1Njg2YjBiMWFhNzRmMjZhOTY0MzNkYWRkNzI4ZWE2OGM0MzJkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9MYW5ndWFnZVByb2Nlc3NpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY4NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MmZmYzkzYWZiM2U4ZDY1YjAyNTFmMDIyYWVmZjQ4MDVlZWU0MzNhYzY5MjMzYmZjNWNkMmI3ZGY4ZTUwNDFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1pcGZzL2J1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOWYxYThmODFkYmU1ZTZkMmQzMTY0MGMxZmE2NGYzODBlZDJmMjYyZjdjNzIzMDYzMWQ0OGI3ZjJkZDlkYzJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1pcGZzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9pcGZzL0JsdWVJZFRvQ2lkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzODRiMWVlZTA5NTM0YWMyODk0ZTMyNTQ1MGUxN2RlZGZiZWMwMWZkNzQ3OGM4ODllNzBlZTExYzIwYjc2MmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWlwZnMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL2lwZnMvSVBGU0NvbnRlbnRGZXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2OGEzYWYxMjVmZTJjN2Q3MDRlYWMxNTUzOTJiOTdmNmYzYTNiMDM4OGNjMDZmODdhNTc3MzdiOGVjODBhY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWlwZnMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL2lwZnMvSVBGU05vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NWIyNjM1YThhYTA5ZGMxMjkxNDZlNWY4YTI2YmMzNmVlYTU1MzgxMjZmYzVlODk4YTUwYTVhY2MxYmUwOWVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1pcGZzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9pcGZzL0lwZnNCYXNlNTguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjkxYWVlNGI2Njk2MGM0M2Q3YWI3YTgwYzU4NzUyOTk2ZGNlM2M2NDIwMjk4ZmZhNzc5OWRhZjBiYTQwNGNmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtaXBmcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvaXBmcy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTM5MjQ5ZWI3ZmMwYjlkMGJjZWUzNjJjNDhjOGZjZDZmN2Q3ZjdmMDVhMmNjNGEwYmMyMWZlNDM4MzUzMTFmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtamF2YS9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzAyNjBlMDYwYTU3ZTk4ZDJmODM5OTNmY2M4NDIxNjY1ZWFhN2NjNjI5OTM4NDE3MWU4YzU4MDg1MmI1N2VmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtamF2YS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVmMjNmZDVkZDJlZTA5MDhkMjMyMDUzZTlmMDkyZWJhYWI1MWRmNTM2YTkxZDRjODVmZTBiY2I4YzM5NmMzZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtamF2YS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZVJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTIyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkMzViZGI1MzkwNGM4NGNiODE2Njk2OTNhODk1NmViOTk1MTg5NjE5YWYwM2Q4MDIwMzAyZThhNzZkMWU2M2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWphdmEvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjVhYTU2MzMzOThlZWMyYWJkNTlmZTc2MDM3MGFkZDYwMDNiY2NkNWEzMDcyY2IxYjA1ODk2YmExN2Q3MjJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1qYXZhL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlUnVudGltZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzg0ZTQ3NjRkMDcyYTE3OGI1YmYyMjU0YWE1MzQ3YmNmODJkMDY1ZmI5ODQyNThiMGE5YmU1MWI1ZThkYmM0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtamF2YS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWVhZDU1ODIwOTZkYTE4ZjQ5ZGJlNmQxZmQwMjcwNmI4OGUyM2QzZTcwYjU0MjIyZGY0OTQwNWQyMzViNTY2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzVhN2U1YjcyN2NhMjI3NjcyOTE1ZjU3NGY1NjVjMjdkNjM0NjcxOGM0ZjAzMDMzMWI5Mzg4ZjQwNmY5ZTYxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZGljdGlvbmFyeS9EaWN0aW9uYXJ5QXdhcmVFeHBvcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgwOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YjAxZjgzODcxNDRlZWZhZjk1NjNlZjU5NTNjZTJhMjYzNDdiNzkyNDc4N2UyOTQ5MDUxNjNjNmY0NzdlZGUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9kaWN0aW9uYXJ5L0RpY3Rpb25hcnlSZWdpc3RyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjMwYjNiZDM3NzZiOGE4MWI3MWYyMTBkZTYzZjEyZmI5ZDUwOGFmY2NiNmJiOGNiYTUxODI0MDA1NjZhN2VlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9kaWN0aW9uYXJ5L0V4cG9ydENvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA3OGZlYjU1MzdjNjBmMDE1Zjk0MjJhMzM4NDkyMGM0YTA0NmNhNmIxNzBjY2RmMjZmNjE4N2JiZmRlOTI0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZGljdGlvbmFyeS9UeXBlRGljdGlvbmFyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5N2NkZjBkZDRkZDVkZjcxYTIyNTg1MmE5NDlhNjc3YmZjZjQ2NmZjNGY1MTFlNjk4ZmUwM2I4ZmFmYTljNzIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9kaWN0aW9uYXJ5L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDdhOGEzNGY5YzdmM2RkMmJkMDg2ZmQ0MTRkNDhkYjk1MmRlOTZiMjdjOTFiNzBjYmIyMTFmYmI0OWZhOTIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0JsdWVBbm5vdGF0aW9uc0JlYW5TZXJpYWxpemVyTW9kaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGU0Nzg5ODQ0OThiZTk2MjFiZDNmZGExZWViYmZmNmVkM2FmZWQ2MTU4MzgxNWU2NWI2YTRhMTBiMzVjOTBlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9CbHVlQW5ub3RhdGlvbnNTZXJpYWxpemVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjUwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhkYWEyNWI3YzBmYzQ2MWE5YzQ1NDU5NTA1YTc3MjU4ZjM3MmIxMDQwZjc3Y2QzZGM2OGQ2NzU4M2M4Yzk0OGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQmx1ZUlkUmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDA2ZmY2MWQ3NzgzMTA3ODMzOTUxZTBlNmRlOTY2MGRhZTRlZWNkMjg0N2NiM2EzODcyOWM3MzFkMzYwOGZkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9CbHVlTWFwcGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0MDM2NzM2ZDU2YjZmOWExMWVmNTlkMWI0YzlhNWVhZWY4OTY0MzUzZjAxNTM3YmY0OWI5N2M0YTNlZGI4MDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQ29sbGVjdGlvbkNvbnZlcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg4MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OGJhMWQ1MWEyZDQ2ZTJmNjk1OWY5MTMwZTFlNWEzZGJmNzM5OTE4YTMxZDAwMzg2YTk1NTU3M2I2YTQyYzk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0NvbXBsZXhPYmplY3RDb252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4OTU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWIxOTM1M2IxYjRjNTEzYzIxNTdiMGE2YjNlMWE0YjNiODYxMDM4OTM2ZmEzODJlYjgwMzVlMzUyMDQwMzljYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Db252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE2NzNjZjM0NWNkZDczNWM3MjQ2ZDUxMzQ1ODE1NTNjMDk2OTFjMzc0ZTQ0NTVlYWY1NDZmNzU1MWU0ZDI3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Db252ZXJ0ZXJGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3MTM0M2IwMmQ3NWVjMzYwODUyN2JjMTRmYWNlNzYwZDc4NzhlNjc4ZDJmZjNhYjljZDRhNDc1M2I3Y2Q0NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvRW51bUNvbnZlcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZmYmRlYjU1YjlkNjg4MmZjOTVjYzcyODYyZmI1ZmIxNThiOTZlYWNkODYxMmRiYmNmYTU1YWY3MmRlN2IxYmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvSmFja3NvblByb3BlcnR5TmFtZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQwNzllYmE1NTcwMThiZmVmMzRiOGJjYmI1NzNmNDNlNGY1MDZmMTcwNzRjNTUxYjEzNjk2YTc2YmRiNjZhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9NYXBDb252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWRlZWY5YzFmNzg0MzgzNjgxMjA2YzU2NzMxOGE4ZTcwZTgwODk0NjMxYjA5M2E1NDNiZmE3NjBjYmFiNGY2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9NYXBwaW5nT2JqZWN0TWFwcGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQxYmRiYmVlZTJmZWZjNzZjOWM4Yjc4YzcwZGEyNTU1YWQwOGMxZDEyYzc1NTBlZTNkNDU1NmRlZmI1MDUyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Ob2RlQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzg1NmI4MDgyZWFlNzk2M2M5NzhmYzlkYTRmNWQwZDA1ODZlZTdjNmVlY2U0ZDE1OWE2OTk3MmY1NzVkYzE1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Ob2RlVG9PYmplY3RDb252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2U4NGIxYWQwYWQ4NjhiM2Y3NmY5OTcxOWIyYWVhMTMwNGIwMDYxYTM3NDBiMDU4M2NlN2JlZjIxZWRiZjM3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9OdWxsQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGY4MDk2NDEwODAzZTJhYmJiMmYwNWM0YjExNWM2Mzg4MzgzNjYxN2ZiOTVkNzUzMTllNzUxNGMwNDYxYmQzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9PYmplY3RGYWN0b3J5UmVnaXN0cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVmM2M0YzE1MGUzOTYyNDJmYzIwNTcxMDM2NThiY2I3NDA4N2RjYjE2ODZhODg5MzUzMDM5ZmUyZjlhMTQ1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9QcmltaXRpdmVDb252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTU1M2M2Mjg2MGMzM2Q3ZTM0MTQ4NzQ4ZTZhYzk0YjQzZDQ4NTI0ZDA1NjNmNTdlNjY2MzU5MDY0NzU2MWM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL1R5cGVDbGFzc1Jlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyZmY0Y2Q5NDRhZjRiNDg5YzNiNmQ1MDVmZDI3NGVlY2E5ZmRjNjdjM2Q5NzU4NDJkMzRjNWQ5Y2JlNzExNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvVHlwZUNyZWF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZThhYmFkMzA0MjRiODcxMWE1NWU3ZWE3MTU1OTMzYWE4MWM3NjUzNjllMmNhMDg3OTYwMTljMGUxZWQ5MjYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL1ZhbHVlQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2NzNlYjQxYmE5NzE1NTZkYmFhMDI2MjE4ODFhZmMxYzkzN2E4NDM2YzNlYzlhYWVkZjEzMzE1NDU5OTkzZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5ZWVjMTllY2EyYjcxMTU2OGMxZGJjMjMzNTFkMjM1MjFhOGMwYmJlODdkZWJlNTBmMGE0Yjc4MmZmOGUyOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvcHJvdmlkZXIvQ2xhc3NwYXRoQmFzZWROb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQwNmQ5ZTNiZjAwOWVlNWM0OTk5ZjZlMmM4M2EwMTRlMzc0ZjA3ZDU4ODI0NGJlNGE0OTc1NmM4ZTZkZjM3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9wcm92aWRlci9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2M5NWE4YThjZDM4NDJiM2NmOWU2Yjk3MzQ4YTIxZWRlM2JhZTEyY2ZjNTQ2ZTc5M2JlOTU5ZTBhMWMwNjI3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlNjhmNTNjZDk3ODY0Mjc0ZWI1Njc3NmMzMzBiMzRlMGNjY2E3ZWIyN2UyNjAwZjEyNGZhMDljNzIzYzc0MWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9CbHVlRGVzY3JpcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzE4NjU2NmE1NTUxMTMzMDFjNDJjMGY4NmNiNGMzMmFjOWU0MzFkYzU5Y2Q4OWRkMmRiNWQyNGMyZDZmZTM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvQmx1ZUlkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFmODU1ZjRmOGUxYzQwY2RkODNkOGFiOTVmYWY1ZDg1ZTU4MDI4MGFhNzQzZTkyZGI3MGVkMDg5YmYxZDBjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL0JsdWVOYW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzNjMTQ3NWM1NTFiNmUzNmFlNmUxYzk5N2YzMzE5NzJlY2I1ZjFmMmJlMmJmNjg3MWY5NTVlNTFlODhjMWU3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjY5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5YWQ4NmZkNGEwYThiYzNlNThiMTQxY2UzZTQyNDM4NDEwYmY2MDgwZDM5MjE4MWMxMzdmZTQ0ZGMxNDZlNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlRGVzZXJpYWxpemVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYWZkYmFmMjczMzM1NDk3Mjk1ZTc2MTZmNWQyNTIzZDllOGI4MjI5NDgzZGEyY2E1MTdiYzRlYzdhODEzNzI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZUdyYXBoQ29waWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjQyZWRlNmEzMTcwMjA4N2U4ODIzOTI0ZjQwZWM4NDkwMWM5OGI2MTg0YjE4ZDI0ZTNmN2E1YTY0YzYxZGM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZUlkZW50aXRpZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTBjMDQzZDMyNDdlNzhkMjQyZjQ1MmRiM2E1ZjdkNDk4ODBhMTA2NmJiMTc5MTUxMzY1YzhmYjAwZTkwNjk5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVJZGVudGl0eVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI4ZTc1YTNjYTI2YjMyZDVlNDEzM2Y2ZTNmNTYzZTVmZGRiMDljZDM5ZmE2MWMzYTRhZmE5Yzk0ZTYzMzY5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVQYXRoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImNiNDU0ZTAzZjE4ZjFiYzE5MzYwZTMyYTI0MjUwOTVjN2U5MGQwOGI1M2ZhMGJjMDkyODNkMjQ1MmRiZDc5OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlUGF0aEVkaXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZDVmMjc4YjI1OWVmZDI4OTJkMzMxN2VjY2NlY2JkOGExNDYxNDk4MmMxNDA4OGU1ZTcyNWY4NDFkNGZmMjIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZVBhdGhTZWxlY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTYyNjM3ZWQwOTlkNGM5MDg3NmFjN2ZkYTZmNjdlMjhhNDJmY2VkYmI3ODY2YWQ1Y2Q0YTIxMDdlZGQxMWQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZVNlcmlhbGl6ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzQyYTZkNTIwYTRjYmY5NjVlNWJlOTVjOGJhYzQyZTljYTBlYmYwOTUwNjE2MTk2OGQ3OThiODJiODVmYjA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZVdpcmVGb3JtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTk5NmVlNjU0MzU3ODFmYjA1ZTc1OGM3MThiOWUyYzIyOGNhODg4MjQ4NGE1MmRlYWQzMzczMTUxNGQ0YTk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDY4OTQwZGJmYmFmN2JhZWNiYjYyNTNjNmE0OWU2NGU3MjAyNDQ3MTQ2MDJmNDE1NzczYzZlYTZhMGU4YmUxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL1NjaGVtYS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWIwZTMxOTJmODU5N2Q5MjVmN2VmM2M2NTYwNDZhNzMzNzYzNTdjZWYyZDNjMTFlYjYxOWM3YjUyZGZiZWVmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL1NjaGVtYVdpcmVGb3JtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkMWZiOTJiNGM0MWRiNmM1OTYzYmFkM2NmZjcwMDUwNDhiZjQwNzM0NDQ4OTVkNGQ1NmYwZjZjNDU1MWQxNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9UeXBlQmx1ZUlkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmODllYzdjNTlkNmI0ZTRiYTY1Y2JjMjg2ZmI5NDI1ZThkNjQwMjNhMjk2OWRmODkzMzJjYmY0YWIxNDhjZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmUyYzQ5MGM5ZmVlODk3NzFhNDRiYTY4NzUwMjlkNzkzYmRhZjg1ODMzYTE2ZjE2OWQ1ODkxNzQwNjI5ODg0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3ZhbHVlL0JsdWVOdW1iZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjU4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjExN2UwMzZmZmNiYmFjMTU4ZDYzYTM3NmJjY2Y3MTI3ZDYxOWY2OGE5MDc1YmI3NjA4YzFiMjg5NjU1Yjg0NTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC92YWx1ZS9TY2FsYXJWYWx1ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQ4NzY4ODgzZmM3OTQxODliMWY1OGI1M2RiMzczM2JhOTU0NWQ1MDBlZjE3ZGNmMjJkNmNmODgwNjYwYTRkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3ZhbHVlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDI4NTkxMzIzMzZiNmY0MzI0ZGM4ZjdhODQ1Y2FlYjk3YjVhNDU2ODc3NzVmYzhjYjYzZjkyNmFlNGY3ZWE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvd2lyZS9CbHVlTGFuZ3VhZ2VDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDEwNWRmNzRlODJjZmEzMTUwMzVhMDYzNmFjNzE1ZTgzMDQ2ZGJmMzMzNzc0YzMxNGRiMmU2MjZlN2RmNDVkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3dpcmUvSnNvblBvaW50ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTRkZDk5ODlkNmViMjFhMWYzNDAxNmFmMTZlNGVhOGVmNDg1MWJhYjQzZGQ3NTVmYjcyYTM1NzFiYzBkMWUxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3dpcmUvUGFyc2VkSnNvblBvaW50ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q4YjU4Yjg0ZDU5MWY4YzZhN2ZiYzc0ZTVjOGY0ZDJlN2M3Mjc0ZjgxMDVjYzU5ZTM4NWNhMzk3YTliODE1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3dpcmUvU2NoZW1hUHJvcGVydHlDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTFiZTQ3NjdiZTEyMDlmYzg5N2UxOTM4MzQzNGM0ZDQzZTMxMTZkYWY2NDNmMTJmMGUzN2MzNTc4NzU1Zjk4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3dpcmUvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE2ZjUwZmU5ZjdlMTJhZTYwODQ5YjQ5NDEwZWFlM2Q4MWZkNzU0MTllZjBkOGY3ZWIyMGMwOTkxOGFkNGM4ZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC93aXJlL0JsdWVMYW5ndWFnZUNvbnN0YW50c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWRhOTQ0MTE5NWIwOGMwNTM5MGE5ZWIwNWUzMTQzYjRkNDYyY2I4OWU1ZTQxNDE1YWIzZTZhYzAxMTY3OWQzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL2J1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTRiOTYyNjIwMDZlNDAxNzRiMDJkYjA1NzBmYjdmN2I3YjQ5NDgzMTMwYzZiOTJjZjE5ZTY1ZDZjMTU1NzU1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NldHRpbmdzLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTZjOGU0M2Y2NmVkMzUzNDg5YTEwY2Q4NWRiMmE2NjQzMzI2M2UxMzk0MTJkNzE2NTdjYTRiOGFkZDFiNDQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvQXBpQmFzZWxpbmVQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2RlYTJiNWQwOTc1M2E1OWM1Mjc4YTA1NzljYzFkZTA2MDA3NmRhYTU0YTE0ZDA4NjA5NjViZjUwOGVhMTNkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0J1aWxkTG9naWNDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzYyNWEyNTdjYzI0NzQ5YmQ1MmFkMmNjMzllNzRmM2Q3ZTI3M2IzZjNlMDFlNjAwNTZiN2MyNjJlZTdjMGM2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0NvbmZvcm1hbmNlUGFja2FnZVBsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTg3MjAwNDQ4MWY5NmE5M2U3MmM4YTdlOWIzNTQ4NTg1MTU4ZWFhMzRkMmU5NWFlZTBhZmY0ZDY1ZDQ3M2Y1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvRG9jdW1lbnRhdGlvblF1YWxpdHlPcmNoZXN0cmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzMDhjMmJkNzY1YjVmMmU5MjdiYjYwNzI4ZTBiYjFkNjk2OTZkMTE2YmFlYTUwYjVjOWRiODczZDY3NDY3MDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9GaW5hbFF1YWxpdHlPcmNoZXN0cmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYzY4NzJiNGQyNDQ1NjhkNjEzZDE0MTA2ZTk0MmUwYWI0YTUyZTZjNjVmYTY0MDc1YWIzMjViNWEzNTY1OTc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvSlJlbGVhc2VyUHVibGlzaGluZ1BsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYTM0OTlkM2FlOWYxMmI5MmZiNDY1YzVjYWM3YzRhMWI4YTNhYjBlOTk3MDk2NjYwNDVkOWI0ODdiNGYwNjBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvSmF2YThMaWJyYXJ5Q29udmVudGlvbnNQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjdmYWU2MjM0NjNjMTJhNDdmMjBhYTQzNWRmZTFjNGFkMWQ0MmZlYzY2ZDg2YWQ3ZDE4N2JjOGVjZjVmYWE3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0ptaENvbnZlbnRpb25zUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2NDRhNzRlNzRiNDdhYzYxMTRhNzA2MTIxMzdlYzZjOGUwYzk4MDY0ODM5OWQ3ZjQzMjI1ZTE5Njg5YTgyMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9SZWxlYXNlRXZpZGVuY2VQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3NDllNDUxOWM4YTQ4YzRiMGQzYzdkODI3NGE1NWQzNzgyODdmYTIwNGU1MGQ2OThjMzljOTY1ODk4NzM2ZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9SZXByb2R1Y2libGVBcmNoaXZlc1BsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDQ4MWFmZmJjODRmZjE3OTg2ZmIwZGMwYjhhNjJlYTk5ZmIzYmJlMmYzYjE1Mjk4MWYyYzEwOTlhMWU4MjgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvUm9vdE9yY2hlc3RyYXRpb25QbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODQzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhN2ZhNzg2YzJiZjcwODI4ZDM5YmNlZmU1ZDM1MzMxNTg0NmY4Yzg3Zjg5M2Q4ZjYwMzU4ZmFiYjBmNjA0YTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9TZW1hbnRpY0V2aWRlbmNlT3JjaGVzdHJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5ODA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVkYTA1ODY2OWU3M2VmOGU1MmJlM2NkZWM2ODE4MTUwZjQ3Njc1YTkxODgxODk1ZjE2NWYxNzNkNTE4NTRkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQWdncmVnYXRlUmVsZWFzZVJlY2VpcHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjgxMmJiNWFmOTk5MjEyODYwNjU2YjVjZjA2NWI0YjlkNDgzNGQ1MTExYWY4NmM4ZGMyYWFkMjQ5ODIyYmQ3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQXBpRGlmZi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDNiYmZiZGM0NjA1NzM2ODVhNDQ4ZTAxYWQ3NWI4NWMzZGE4YmM3ZjhkYzA2MDM0NzE2YzhlNDM1MWNlY2ZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9BcmNoaXZlUmVwbGljYUNvbXBhcmlzb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmExMWNhOTI2MWM4OWU3YWU1YmM1YmE0OTcwZWNhZGRiMjI4OWU2YmFhNWExZTg5MGEzYjU1MDg5MTA1OTE2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQ2xlYW5CdWlsZEV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM3MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDkwYjMwOWI3NDZkMGZiZWJkM2NhODYxNzU4MTg1MzcwY2ZiMDNmZmNiZmY0NmNmODNmZDdkZTY5YjdjOTVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9EZXRlcm1pbmlzdGljSGFzaGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYzgyNDQ5YjBjMWFlYzEyODk4ODhmYTBiZWQ1ZTgyMWJhOWNjMTU3MTI2N2QxOGU5Yjk1YmMxYWZkMmJlZDAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9EZXRlcm1pbmlzdGljSnNvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmM2ZDdlYzViNTJjNDIxNDViZGIzNWI0NjgyZjI5ZjE1ZmU2NGQwMzY0OGE3NWU5MTQ0YTYyMWQxNmRjZmM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Eb2N1bWVudGF0aW9uUmVmZXJlbmNlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNjAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjc0OGEyZWMwZGNkMWE2MmQxZjM5YjU2NzY3MDU0ZTdlN2JkODNhYTI5MmUwZjBiNjQ3ZjRjMDU0MzRkZTg4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRG9jdW1lbnRhdGlvblZlcmlmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU3MTE4ZWNiOGQ3MGVmZmVhOTU5ZDgyYzAwMDM1OWIzOWY0NjM2MTllN2MyY2EzNzE2MGZiMDE1MmZmY2U5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRmluYWxRdWFsaXR5RXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzk4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzOGVkNmY1ZmY3YWQ0MjM4MDlmMjg2NmIwMjU1ODAzY2IwMzVjMDQ4MmM4MmU5ZjQ4NTZmZjA5YTZkN2EyMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0pVbml0RXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzA3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1NzdmZjJmODhmMTVhYjg2NDA3YTJkNTI2NTQ4OGM1MWU3YjY2ZGRkNThlYTEyY2MxMzRiYjdjYjc0MDMwYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0phdmFNb2R1bGVJbnZlbnRvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjQ0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzZjA4M2JiODMzM2YyZWUzYWQwZmNkNGI0Y2JkNDU1YmRhZmE5ODY5NGZjNzcyODljYWE3YTRlZjhlYmM5ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0phdmFQYWNrYWdlQ3ljbGVBbmFseXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTUyMDMxZWM1ZjdiMDAyZDQ5N2NiZTVkYjJjZjcwN2FhNTIxYmQ3MDM1ZDRjNGVlYmM1YTYzMWJlNWFjOWM4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvSmF2YVB1YmxpY0FwaUludmVudG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRlNDMzYTVjZDMxZWQxZGRhOTI1ZjA0ZjFiMjViN2VmNTRmNjhlNmUzNjM5Mjg0Y2E2NzE5ZWEwOTVlMTM4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvSmF2YVNvdXJjZVF1YWxpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkNmQ0NjE5OGQ5YzdlMzk4ZTM0OTJkMmZmYTg2ZWJkOTJmYTNmZjJlNDc0ZDM1MTllMTFiYzZkOGU4Nzk2OTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L01vZHVsZVN0cnVjdHVyZVZlcmlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YzM0MDA1OGQ4OGIxZjA5MTQ4OWNmZTM0NThhZTUyNjBjZTRjOTQ5OTZkMDZlNWJlMDViYWE4YzgyMDAyNjMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9QbGF0Zm9ybUludm9jYXRpb25NYXRyaXhFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTNmZmNmYmM1NWNjNGNkMWNhZThkZjAwNDYwNWFmNjg4ODU3MzdlYTY1Mjg0OTY0OTQ5MWMyYmMyZGNmNDA3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvUmVsZWFzZUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjNjA1ODAwMWVmZjJhNmM5MTU1ZjQ0ZjQwNjgzNWRiMjRiN2EyZTNlOTc1NDhlYzU0MDZiYWUwNmI3MWM2NjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1JlcG9zaXRvcnlTb3VyY2VGaWxlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTgwNzUyZjcxNDg1NTA4YTM0NjMyZGZkMDMwYTVjNGQ3YmUwNmVjMTM3ODExMDQ5YzU2ZGJlOWEwNDE3MmI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9SZXByb2R1Y2libGVBcmNoaXZlSW5zcGVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImUxYjc1YTU5NzU0YmY1MzIyY2JmYTMxZmJkOTVhMzBlZTE4M2MwZjYxZTQ4ZWQ1ZGQ4YWMzZTlhNzlmYTI2Y2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1NvdXJjZURhdGVFcG9jaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YjkzODYwMjdjOGU2MmE1YmIzNTg0Y2FmYjYzOWZkODc1MmIyY2Y1ZmQxNjllYTk4OGUxYTUyOGZiOTVlZTZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Tb3VyY2VSZWxlYXNlQXJjaGl2ZVZlcmlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdjYThkNGNhMGM0ZDA3OGFiMjk3Nzc1N2NlODhiMGY1YWY0NDIxNzdmOTRmZTkxMGRhNGIyOTUwOWQ1NDQyN2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1NvdXJjZVNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1NjY2NzU0OTQxZjExODRmMDUxNDc1MTFiMjhlOTVhYjNmMDI4YTBiYzY3ZTc0ZTFjZjgzNmRmMzgyZTkwYTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1N0YWxlSW5wdXRWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDY1N2M3ZTQ3ODA5YjViZmVjZTE5OTAwZTYzNTBiMGJmMDU2YTFlZWI1Yzc2MGUyNGU4OTYzNDUyMzVhNzQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvQ29tcGFyZUFwaUJhc2VsaW5lVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTRmYjMwZWFlMDljZDBmOThjN2Y3ZWE2MjJmZGJiNzBhNzFkZDk4ZWY0OWMzYmFjMTQ0ZmY0M2U5ODRhM2IwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvQ29tcGFyZUFyY2hpdmVSZXBsaWNhc1Rhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTZiMzIzNmU0ODhkNjAzMmQ0N2NlYzMxMTM3NWJkODE4NGVlNmNlNzM4YTIzMWMyZjM3MmVmYjcwMzQ4NTZhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlQWdncmVnYXRlUmVsZWFzZVJlY2VpcHRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkZDA0OTExZDU3MDQzNjI4MzZlMDQwMzY3MTU1NGE4NGUwYjRlZjY3NmUyYmVhODgxMTFkZDZlZTNkYjdkYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUNoZWNrc3VtRmlsZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTMzYjIyYmYyODQ5MTkyOTcxNDdmZWNiN2E5MjU5NTc4ODhlNDU0Y2QzZWRhYzIzZWU1ZWNmY2NlNGZkMTdlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlQ2xlYW5CdWlsZEV2aWRlbmNlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjY2Y2Y2ZmMjk3NjAwYTkxY2ZlNjgxMjYzOTIyYmZjMjU5MmUzYjQ4MTE3YWE1NzMwODY4NzNhYmI2ZjA0MzQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVDbGVhblNvdXJjZUV2aWRlbmNlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODhlNTg4MThjNjFkMmM1MGNmYjRkYTZiMTE3NDZjYTZlYTYzMzI0OWJjNGNiOTY0NjZmMWYxZmE4OTBhYmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVEb2N1bWVudGF0aW9uUmVmZXJlbmNlc1Rhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGFmOTMwYWYxYzY5ZmM4NDk3ZTE0OWQzMGIyMjgwYjRmYWRjZDczMWVkZjAyYTI5Mjc5Njk2OWVkNmEwOGJhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlRG9jdW1lbnRhdGlvblZlcmlmaWNhdGlvblJlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzRjMTgxYzQ3ZGI5NmVmOGY5MTZjM2RkNDY4ZDUwYzI1MTBjYjI0MWEwYWE1NWNkYzkwMTg1YTM1MmU0Nzk5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlRmlsZUlkZW50aXR5VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYzUyOWY3MGNhYzA0ZWU0Yzc4NDJkY2UzOTBkMGMyZjZiMmFjMGIxNjBiN2I1YTI0ZDViYTQ2ZTc2MzE5ZjY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVGaW5hbFF1YWxpdHlSZXBvcnRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3NDYxM2VhYjI0YzY0NzU2Y2M2MjNhYjg1YjA2ODI4YjM2Y2RkN2RjNmRmMzUxYmZjMWQxMzYwNTBhM2E0NTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUZyYWdtZW50ZWRQcm9jZXNzaW5nUmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0Mzc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODUyMjY5ZmZjOWFhOTc5NzFjYmJlYmRjOWVjYzA0ZWEzMGE0NzQ4MzJmZGRjZGY5MzczYjgxOWYxYTRkY2ViYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlSmF2YUFwaUludmVudG9yeVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmU0OGI1MjkxYTc5MDA4OWUwZmJhMzBjM2I5ZmYxMzAzMDA2MzY4MDE5NzQzYmQ3NTQ5ZjMxNjZjYzM5NDU1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlSmF2YU1vZHVsZUludmVudG9yeVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTZhNmY3NGNhMWUyZjc4ZDVjYjNlMTZmZjkxYTcwOWI4NDZjMTVmNDY5ODc4N2NlMmY2NjM1MDhkMGI2ZTg2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlUmVsZWFzZUV2aWRlbmNlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTVhNGFmNDNiMzU5NGM1YmM0YjYyMTUxMGQ3NjU5OGZkNzBhMTFkZTIyNDNhZTAzNWYxMGE3MTkyN2Q4M2MxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVTb3VyY2VSZWxlYXNlTWV0YWRhdGFUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNzllNGRhODFjZDY0YjcxNWNhOWNlZWZkYmY4YmQzZGY4MTFmNTY5MWU0ZTJjYjM0NmJmYjVlYzE0MTJjYjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlBZ2dyZWdhdGVSZWxlYXNlUmVjZWlwdFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZThmMTVmMjA1ZjUwYjMxMzkzOTRhMjUzZjUzMWFkYjUyY2UyNjY3MjcyNmFhN2YyYTVlNjgwMTg0M2I1NDQ2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUJ1aWxkU2NyaXB0U2hhcGVUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzOGUxY2VlOTk0MzEwYjQ2NjAyZTRjNWU1MjIzMTMxMmMwMGMxMWU2ZGZlNDNjYmFhYjI1Njk4M2Y3MDhkODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlDbGVhbkJ1aWxkRXZpZGVuY2VUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlYmQ2MDUwYjk3MTE0Nzc5OTNlMDMxN2M5Mjc1ZWYxNGZkZDI2OTc0MGUyNDM3YzhhNWJhYjZlY2EyMWY1MzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlEb2N1bWVudGF0aW9uUmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTM4ODA0ZGZiNzk2MGI4MDE5MjNjMDRmMWZhM2ZiYzdhYmQzOWQyNjc4N2QxMzhiNjkwMTU0YWY5ZGMzNDYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5RmluYWxRdWFsaXR5UmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTc2ZmYzODE1OGYyODk3YWZmNjBhYmM2ZGUyNTBiNzVjNGIxZDIyMDVkMjMyNzMwNjlhM2JkOWM2NzMyZjJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5SW5wdXRJZGVudGl0eVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2U3ZDdiMDViNmVkMTZmZTg1ZmIxOTRkNmZiODA0ODAyMTNhMDQ2NjYwMzI4NDQ0MDUzNGZjN2I3NDYzMGQ2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUphdmFNb2R1bGVTdHJ1Y3R1cmVUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlZTVjMTM0MjdjYTQ2NDlmMDQ1N2VlOGJkNzZiNjAzZDRlMTY4M2U5MzYzMDRiNmNjOTJjYjg2MGU5M2Y4NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlKYXZhUGFja2FnZUN5Y2xlc1Rhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDU4MjZjOTMyMzBiYjczY2EzZGJkM2Y4ZDU5NzJlMjU2NTEzOTFkNWMyNTNhM2YwNTRmMGY2Njg4ODkxNTNkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeVB1Ymxpc2hlZFJlcG9zaXRvcnlUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTQ1ZjU4ZmFiNDEwNzg1YWQ2ODUxMGVmMGNlYmIxOTZmNTU0YmNhNzRiOTE4Y2VmOWNlMjYxMzlmZWUxMjg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5UmVsZWFzZUVudmlyb25tZW50VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDdmYzhlMmQ1Y2U2NzIwNDY0MmQ5MWRkYzJhODExZWVjYzEwZDRmZDM4ZmZkYTliZjQ2MjdhMTZiNWU0MzI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5UmVsZWFzZUV2aWRlbmNlUmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY2YTBjYTNhYTQ0ZTc3ZTZhYWFmMTk2NTY3Y2Q1M2UwMThkYWRlZDllNGM3M2RkY2M3ZTY1MjFlMjc1ZTVmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeVJlcHJvZHVjaWJsZUFyY2hpdmVzVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMjlhZTU2MmJmMTJjNjRjOTVlMWI0M2JiODJjYzQzMTRjMTRiNDdlMGZiZWJlYjZjMWJmM2ZjOWI1N2ZlMGQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5U291cmNlUmVsZWFzZUFyY2hpdmVUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyMThjYzQyODQxMjhmMGZkYjA2MThhNDU4OTRhYjE4MmI2NzVlZDU2OTY0NmU2ZmI3MjgyNTQ3ZTdmZTQ0MTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9Db252ZW50aW9uUGx1Z2luc0Z1bmN0aW9uYWxUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDI0MzUxMWM4Mjc4NTllNTdiNGNiZmI5ZjgwZmQ2MDNlYjQ1MjAyZmE5NGE0NzcyMWFkY2E4OTc5YzM1ZmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvQ29udmVudGlvblBsdWdpbnNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODhjMzcwMjUwYTMxNzFhNDY4OTY3YTc3ZDQzMmNhZjU2NGUyNmRlMjg5YjUyZjNjY2IyZWYwMDdiMDNhYmYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvUGx1Z2luRGVzY3JpcHRvcnNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2MzA0Mjc0NDQwZjkxNzZhNTU1YjljMTgwNTA0MzI1OTJhYWYwZjkzMzI3NWRmYjEzZWVhNzUxODI0YjYxNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9TZW1hbnRpY0V2aWRlbmNlT3JjaGVzdHJhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OGQyODk4MDRjZjA0N2Q0NGE4MWFkZWU4MDYxMGMwMzJlZmI2YTlkZTMzNjRjNzM2ODM1NDE2ODNiYmM3YzFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9BZ2dyZWdhdGVSZWxlYXNlUmVjZWlwdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDY0NGM1OWJlNDlmNTNkNzE0OTdlNTQ3Y2NiYjJiNGU5YTY4M2YwZGU3OWJhNTAyYjAwYWRlZWUxYTgyN2JlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQXBpRGlmZlRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTk1Nzc1Y2U2OGZmNTA5OGM1YzIzN2E2Mjc5NjEzNWIxZTJmNGUwOTk3MmQ5YmQ4YmYyYTc1YzhjZTg0MWFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9BcmNoaXZlUmVwbGljYUNvbXBhcmlzb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzMGNiNWNhMDVhNzA4NWNjZDVmYjEzNzA4ZmIxMjhmODIzNzY0Nzc2MGI0NTc2NzBiYTU4Y2I4ODYyMTM3NTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0NsZWFuQnVpbGRFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWY5YzkxZWY4NTkzOWY3ZWZlYjEyYzQ3YzBjNzVjZGEyMGM3NTU5NTNjYWFhZTkwNGVlYmZhYmQyOTg2NGU2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRGV0ZXJtaW5pc3RpY0hhc2hpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImMzNjc4MDc1ODY3YjM5MzgwNmE1OWNjNGY5MWY0OTFjZTExMTQ0OTkxODAxNWFmOWU0MmRhZjNlYjIzNDc3YmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0RldGVybWluaXN0aWNKc29uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDQ1M2UyZmViYzJmYjcyNDgyYTcxNmNkYWRkZGM2MTQ0ODczM2MyZmI3MDY1M2NmYmFlM2E0NzRkZDA5NGUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Eb2N1bWVudGF0aW9uUXVhbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4MjZiOWU3ODhkZmQ5MjQ1YzM2YTIyOTU1Y2Y2ZGE5ZjY1YTI2NTg1MjExMjJmNTMxMGNmOTBiZTdiZGYwMjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0ZpbmFsUXVhbGl0eUV2aWRlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNDk3MmM1YTk2ZTIxYjAwMWRlZDdiZmEwMDlkMjJmZjgwMzdlN2I5ODAxOGE5ZjkxNTUyNzhkMWZhZmYwOWRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KVW5pdEV2aWRlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDUwMzA5NjEyNzgwZGNkMWIyMDdlNjYyN2RjNGFiYzY2MzJmOTAyYjQ4YzY1MDlhYzIzZWVmMDM4NDhiMDY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KYXZhTW9kdWxlSW52ZW50b3J5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzRhNmQ4ZjM0NmVjYWE1M2ViNmNkZjkyYmI4ZTdmY2JiYWQzNzVhZGJjMDk3YjFjNGE0NTQ2MTMzNmM0ZWEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KYXZhUGFja2FnZUN5Y2xlQW5hbHl6ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YzE1MDFkOWEwZTA5MDA5ZGFkNDFiZTMxZmE4MWQwZmM0Y2Q5OWVjODhjYThlNzBjNzUyMTEwNTNhOGViYzQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KYXZhUHVibGljQXBpSW52ZW50b3J5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjQyZWQ5YjM1ZmI1ZjExMTI3ZWVkNmIxN2FhYjBiODIzOTkzMWYwOTJiMGEzZjBmYzhjOTNhY2IwN2EwZjEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9QbGF0Zm9ybUludm9jYXRpb25NYXRyaXhFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmFmOGY0OWJiN2QwNzQyNGI1MzQ4Yzg5ZjRkZmVmMTMyOTJlN2FkMThkNzdlMzUwYTk4NDZlMDFkNDkzODA3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvUmVsZWFzZUV2aWRlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDRjMDdlODEzOThkZTEzZmZiZTE4Mzc5NmU5Njg2OGM5ZGUwZmU1M2YwMzI1NTM4NDNjODU5NmY0ZDk3MzFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9SZXByb2R1Y2libGVBcmNoaXZlSW5zcGVjdG9yVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmUwMjZjOGJkNzA2MTAyMjgwYTE2ZDAwZDRhYjUzNGM4ZjMwNWQwYjBjOGU2NGM2ZjUwNWJkYzIwZjRjY2E0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Tb3VyY2VEYXRlRXBvY2hUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImRhMjE1MDc1NzFhNTgzOWUwZmViZWM2Y2Y0NDRhMzZhMTNkNmUyNmQ5NzcwMDVkMWRjYTg2YjQzYzQyMzA4NTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1NvdXJjZVJlbGVhc2VBcmNoaXZlVmVyaWZpZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5NTgxMTBkZmE5NzkyMjZiOTJhZTc1OGM3YTZhN2IxNDRkMDg0YTU3NmYxYzNlMTFiY2EzYzQwNDM0YjQ2ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1N0YWxlSW5wdXRWZXJpZmllclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBhZWJjOWVkN2JjYWUxMGQ1OGJhYTBlYmJkOTc3MzJjMzcwNTE3NzVjYjY5N2YyODJiNWYyN2ZlNzU1NjEzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvVGVzdEphdmFDb21waWxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODUwNjVhNmRhMjVmNWZmOGU4ZWQyYzllZWU5MmFhMDg1ODZhOGY0OTVhYjJmYzg3ZDJkNGZjYTZiOTU0ZGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvTW9kZXJuaXphdGlvblZlcmlmaWNhdGlvblRhc2tzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYWFjOTcxZGVmZjk0NzhmYjc2ODY0NmQxNzY3OWE3ZDUwZTU3OWRhMGI5YmY2MTQxYzVmNGZiZDE2MzMzZmMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvUmVsZWFzZUFydGlmYWN0VGFza3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImY5ZWMzZGUzOTM4MDYxZGRmYjM3ZGExMzY5ZmIxMGQ2NDAzY2Y2YTExMWE0MjY3MDczZDZjZjJiZDM5YWM4YTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9SZWxlYXNlRXZpZGVuY2VUYXNrc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDE4MzlkYzE3ZTE5MzRhNjQwZWJiYWNhYjlkMzU0Nzc2NTg1Y2Y4NDYzZWQ3N2YwOGFjOTAyY2EzY2FmMGQzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUphdmFQYWNrYWdlQ3ljbGVzVGFza1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY4ZDczNmFlYmZiNzRmOWJiNDlhN2U0Zjg4NmQ2ZWJiYjc1NmNhMjI0ZDExZDBiNTM5YmZiYzE4N2FkMjQ5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeVJlbGVhc2VFdmlkZW5jZVJlcG9ydFRhc2tUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyZjdmMzg0YzgwMjk4Mjg2NTNjMmIxN2FhZWY0N2MzNTk4NTEwODNlZjQ5NjJkYTFlZjY3YjAxYzU4NDM3MDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwMjk0MDcwOWVmNzVhMGZlOGI4MjFmYTYzZjZmNWU1MzAwZjEzNTllYjFiNWQxMmJhMTI2YTI5MWEyMWQ3MzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzFlZTNjNDRlNGRmYzVhNjM4Y2RkYjRmMmI5NzAyZDVlYTFlMWRhNjJmNGJhYTJmN2FmZjQ2NGNjYWRjNGMwYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9Db250cmFjdHNFeGFtcGxlU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MjIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdlZWQ3MjhhZDI2MDNhNjk5ODBmYThlMmMwYzIzZGYxNzM2NmM0MjI2MzFmMGI0N2Y3YzNlZDNlODVhMWQ1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9DdXN0b21FeHRlcm5hbENoYW5uZWxFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhZDk3MTRlMGViN2UxOGE4ZTM1MTUxY2EyZjY1Mjc2ODVmMzkwNDJiODY5N2VmMWQ5OTRlOTIzZDY1ODhiMzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvQ3ljbGljU2V0SWRlbnRpdHlFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImVkYWVkZjk4ZGUxOTI5ZTNlOTIwZmM5N2RmZDg2NmYzNmIxMmE0ZDVmODBiOWUzN2IxZjZiNmVmN2VmNGEwOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvRGlyZWN0Qmx1ZUlkRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWVjNWYxNzQ0OTdkZTg3MzlhOThiYzQ4YmQyMjM1OGVkYTMyMjcwZDZkZmEyYjAyYmIwZjJjMmI0ZTg3MmIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0VtYmVkZGVkQ29sbGVjdGlvbkFncmVlbWVudEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzMTdmNDI4ZWIyY2M5MzM2ZDMyNjM4ZmRmMzg2NzM0YWQxNDIxM2UxNjZhODUzNzJlMzRmNTlhZjk2ZTIyZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvRW1iZWRkZWRDb2xsZWN0aW9uQWdyZWVtZW50UmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3N2FkNjgzMGNjNjNmNjQ0NTUxZTE1NTcxNWMxNDVhNDU0M2UzMDIyZDA4MmE0MDM0YzRjZmEwMjM1ZjI0YzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvRXhhbXBsZVN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNmNWQxZTU4MTk1NTFhNjQ4Y2Q2OTNhMmRiOGQyZDFlYWRmYzIxOWI3MzVmYjhmNmM5OGQ3MjA5NDk1MWNjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9FeHBhbmRDb2xsYXBzZVByb3ZpZGVyRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZmIxNzA0NGM4MGI4Mjc0YWMxZjY0YjQxYTM5MzVlMTZkNTYzN2JlOTgzYTIzZTM4MjU0Zjg0NjNmZWFjN2Q0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0ltbXV0YWJsZVNuYXBzaG90RXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZjU1NDg2MzNiNDE5YzE0YWFiMmJhN2E3MDBiN2I1M2M3OGI0YTE1ODU0YjI0YzY3YjM3ZjU0ZmFkZTZiZmI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0luY3JlbWVudGFsTGlzdElkZW50aXR5RXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmQ4ZTNjYzRhNmJjMmU0M2M2M2ZjMWFiYzYwZWJlMTgyZTI1MWUyYTZiZTczY2VkNWZhMzg0NmIzZTNjYzE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1BhcnNlQW5kU2VyaWFsaXplRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MmUzMzY0YmU1OWRiYzM3ZjllNTdhZDkyOTcxYzIxOThiOWVlMDRjMjhjYTc3NzQ2YWJhZGU4ZDY5ZTk0N2Q1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1BlcnNpc3RlbnRQYXRjaGluZ0V4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0Nzg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTVmOTg2NDk2YmZlYTZhMzRkOWFmYzhhYjBlYTY4YzhjOWRmMjg0Y2YwMjlkMTMyNTVkZDkxNjEzNjRjMGNhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9QcmVwcm9jZXNzaW5nRGlyZWN0aXZlRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTVjZDk4NGE3ZjJkY2RiNDA2ZmE5ODExZTM4OTgwYjE5YTljNjhlNWUwZjA3ZTdjZmJkYTU4YjBiOWUwNWZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1B1cmVSZWZlcmVuY2VGcmFnbWVudHNFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxMTlhMTlmNzEyYWY5OTIwODRiMDY5MDlmZjc0MTg2NGE1MjRlYThlZTIyODVkY2JhNGM3M2QxNTU2OGVhNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvUm9vdE9ubHlFdmVudHNFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjNGYwMmNhNThhZTdiYzJlNDkzYzA0MDU5ZmU5MmIyODE2MzQwMzY4MTU5OTk4ODNlZWFlYjliNDBiNjZjMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvUnVudGltZUNoaWxkR2FzTGVkZ2VyRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYzYzNzVmMWI1NWRhYWIzZDI1M2NmNTYzZDkzY2I1ZTQ0NWM1MTk4ZDA3MjcwMjNhMzI2NzU4MzA5YzNlZDhkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1J1bnRpbWVQcm9qZWN0aW9uQW5kSW5kZXhlZERlbGl2ZXJ5RXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE0YmEwYmY0Y2M5MDkxMjQxODRmNzAzMzIwNDE2MGQ1NjAyYzhkYzQ5ZDBiYTdmNGVmN2I2ZjAxNzRmNzY4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9TZW1hbnRpY0Zvcm1zRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiODYxNDdhZDg4YzU0OGRiYjFmNGI1MTdiZDMzZDA4MTI5MTc1OWJhNWZhZmFkNTFkZjdkZTkxYmUzN2UyZWJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1NvdXJjZURvY3VtZW50Qmx1ZUlkRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiODBmODc2NTE3MmVkZTZjYTMwZmI1NGY0NGEzNGZlNzRmYmJlZDY1N2Q0ZjgwMTEyM2E3ZWM4OWQ3NWM3NWFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1NwZWNpYWxpemF0aW9uRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ODQ3MDIwZTIzZWRjYzIxZDkxNDUwYzVmOGNiMjIyNDU1MWVmZDc4MTUwOWRkMTM3MjAzMjM4NjBkZGQ2NTllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1VuY29uc3RyYWluZWRGaWVsZEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTcxYzdiNzU1N2E4OTZhNThiMDA2OGQ5YjcyZWU4YTQwZWFhMGUyZDAwZDIyMGRmNjdhZjNlMGEyOGQ2N2Y0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmY5Mzk0ZWJmYzBlOTNiNDhjZTJkMDEwZWZhZTllM2IxZjA0OTIwYzJjY2I0ZmE4OGEwYTUzODNmZjEwY2ZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0NvZGVjQW5kUHJlcHJvY2Vzc2luZ0V4YW1wbGVzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTVkNmRjY2QzNmUyNTlmYjU1NzE4MDVhNGI2M2ZjN2RmNjU3MmU2ZWJlMjE1N2UxMjZiNDZhMDNlMGVhMTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0NvbnRyYWN0c1Byb2Nlc3NpbmdFeGFtcGxlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzMxMjZlM2Q5MWU1YTYzYmEwNTEyOGVmMDYxNDRlMzk4MzA4YWQxZDk1ZDg3YTU0NDFlNTkwZDFkODhjZDZhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9HcmFwaEFuZElkZW50aXR5RXhhbXBsZXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2MWM1OTFhODJjNWJjZWU4ODYxZjc4NjM0NWQ1ZTNiZmNkODY5MDJiOTNhNGUzNzRlMWQ3M2ZiMTgyYWZhMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvU25hcHNob3RFeGFtcGxlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE4N2ZjNDk2NjNkZmI4NTk2OTMxZDZmMjU2MmFiOTBmMTlhOWM2YWY1NTkwOGViZWE1ZmNkMDM1M2M3ZjJkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3N2E2YzIwYTExOTZmYmM3YzQ5MzlkYjU1MGFkMDY2MGU1YjY1ZmI4MTNmMzA1ZDZiOWRmMmVhOWYzN2YxOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg0NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTdjOGMyYTdlNTAzMWY2YWE4NDdmODgxMDRhYTgwYTkzNTMyZWMzMmVlMTdiZGI4ZDFkMmY2N2ExOTRhOWM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYmQyNWVkMTYxY2M0ZGQyMDFkZjM3OTkwYjlkY2ZjNzE3M2VmZjZlYTkxNzRmZjU3ZDVhY2ZkZDk0NTVjYjFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTVhNWMxOTliYTAyMTg5YWU4YzQ2YTMzNDIyMzM3MWEyMDU5OWQ5YzI5OGVmNjVlNzU0MGVkZTRhM2Y3MmQ1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0OTMKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXcuYmF0IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTM5Njc2YzQ4YjU5NmFmZGE2NGM5NjNlYzhmN2VlNTZjN2IzZmU3ZTNiODFkMWRiZTJkMWExZTNkZDllOWY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic2V0dGluZ3MuZ3JhZGxlLmt0cyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTE0ZGYzYTYzNWE2NzdiZDQ4NzAxOGFiM2ExN2Y2NGQyYjY0NGVkZThlNjc5YTg5ZTJhN2JiY2E2MWI3ZTc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic21va2UtdGVzdHMvcHVibGlzaGVkL2J1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjU2M2Q0ZDQ1OTlmYjYzMmJhMzZmOTViYmI1M2MzNmE5ZmY1Njc4Zjk5MTE4NTY2MTg5NWQzY2IxMjVlOWQ2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNtb2tlLXRlc3RzL3B1Ymxpc2hlZC9zZXR0aW5ncy5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTIzMTMwNGNkNGEwY2MyZjJkOThiODgwMjJkYTUzYTZjY2RmNmNkNDEzZWQ4MzlkYzY4ZWIyZmU2YmVkNDI1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNtb2tlLXRlc3RzL3B1Ymxpc2hlZC9zcmMvbWFpbi9qYXZhL2JsdWUvc21va2UvUHVibGlzaGVkQXJ0aWZhY3RTbW9rZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYWI2MzA4YjdhNjZmNWVlMmQ0YmQ3ZjI1YTMxMDY2NjNjN2U3NjYwYmU5OTIxYTNjOTY5MTcxNTNlMmE4ZWE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2NvbXBhdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzkzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhYmE1ZDQzMjE4MzJhOTVlYjRlMDg4ZjkxZGJmZGY3NTJiZjg3NTk4MTQzNmFhZWY4ZmZmNWJhYTY2MGI0ZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9Qcm9jZXNzaW5nU2VsZWN0aW9uQ2FjaGVCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWM4NzZiZTgzMDA3Y2NjNDFiZTFmNTVkNzQ2MDNjY2NlNzY4MDNmMGI5MDNmMGE0Mjc2NjdiYTNhMzAzNzAxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL1Byb2Nlc3NpbmdTbmFwc2hvdFByb3ZpZGVyQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiY2RmNTYzZTBhZDNkYTQyNGEwNGZmMDRkZmM4MjI1Y2I0ZjFkNzRlNjQ5ZDQ2ZTNlZGIyYmVmZGZmYzNhYzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9SZWN1cnNpdmVUeXBlUmVzb2x1dGlvbkJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmRiNTg1Mjk1MzgwYWJiOWUzYjU4YjliZjRlZmE3ZDM2MjA2NGMxMzk4ZGI2ZGZlNWI2ODc3MGQxNzZkNGY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVmZXJlbmNlQmx1ZUlkVmFsaWRhdGlvbkJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjdjZjBhMDI5ZTBmMTgzODdiYzQ1NzkyOWJmNTI1ZmIxMGI4ZDliZGY5ZTFkNTJmNGY5MDA3OTI5MzUwMjg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU2NoZW1hVmFsaWRhdGlvblJlc29sdXRpb25CZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3MzQ2MTc4YzIwMzAxODRkOTdjODg2YjYxODE0ZTMwODZlYzc3NDg3ZjhmNzJhY2M0Njg2YzY1NjI0M2JhODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGVlcEdyYXBoUGh5c2ljYWxMb2NhbGl0eUJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTdiNTk5NDRjNGM1ZTM3M2NiODZmZDcxYTBiYzVlOGUzNTg5MTMyYWFiYzA2YWMxN2MzMGNlZmNhM2Y4NjA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvclByb2Nlc3NFdmVudENvbnRleHRCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGEzODA4NDBkMzVlYTQyZDQ4MWQwNjcxNmRjNzg0Njk5Zjk2NTM2ODJjNzFmZjYzZWE5MmFhM2Q0MTU1YzgxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlQ2FjaGVMaWZlY3ljbGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzM2MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMGM4NGNkZWE0NjI2NGY4MmM2NWJkMWE1NTk5Y2MxYWVlMTg3MzY2YmY3YzA2ODVjYmIzYWI0Mjc3OTA1ZDgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0JsdWVDYWNoZVBvbGljeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzUwYTE3MDlhNjA3YTg1MGJhMTIzNmVkODBmYjk0MzdkNzIzYmNmYzZmYjhkZjgwN2M1MjQ5MTZlZGI4MzIyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlSWRSZWZlcmVuY2VWYWxpZGF0b3JEZXB0aFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWFiZGVmMmU0ZWQzYjE4OGY5NDY3YmU3ZDFiM2RlZmFmYTkwMzg2YTY0NWZhMzA3ZTA3OTRhMGJlZWJmYjJiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlSWRlbnRpdHlBbmRTcGVjaWFsaXphdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWUzNDM0YWVhNzRlZGIzMmI0NzJkYzVlMTgxODc4MmYwMzJkNDlhZGUyNzI0NjdhYmFhYjk4NTZmNThjNzhlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlTGltaXRlZE9wZXJhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDI4YWRjZDdjOGIxZWFmNTQ3YTBjZTdmZjU2NmEyZDE4YmIwNzY4MjA4MDJkZmJlMGU1ODgyY2JiOGI3NDI3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlVmlld1BhdGhUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5NDk4MjM1YWNjMTc1YjMyNmMwYjZlZmM4NTEyYjA5MGZlNTE2ZWU3Y2IxMjVkZGVjNWZmZWJlMGE4NGNmN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQ3ljbGljUHJvdmlkZXJGYWxsYmFja1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNjNDQ2MDVkMjYxMDgzOTllMGM4NWI5MDBiNjAyODczZmMxMjU5YzA4NWMzZmFjNDBhMDdkNWMwMTdjMzAzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9EZWZlcnJlZFNuYXBzaG90Q2FjaGVJc29sYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzNzA1MTc2MTI1ODFkMDU1OWU1OWQzNzkzYmUwNTk5NGViYjU0NTFjZGM0M2I3NTNkZmI5MDIyMjk0NzVhNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvRGljdGlvbmFyeUV4cG9ydFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxZDU4YzJmZTYxN2Y2YjljNjJkMGUyNDAzMTIzMzA4OGZlOWQ5MGFhZTJhMDE2YzdkOTFjMGJlZWY4YzdmNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvRGljdGlvbmFyeVByb2Nlc3NvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1NmIyMjdkNGFmODAzMjRhNDNiMjA3ODliZTc4OWIzZDllMTQyNGRmZGQyYmZkYjc0NTUxZjMwM2UwNzgyOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvRXhjbHVzaXZlSXRlbXNPclZhbHVlQ2hlY2tlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWI4MDE3ZDFjZGM5NWU4ZGYxYjE0YjAxMGE4YWNlMDg4NzA1OGQ0YjQwODg5ZThlNGFlMGUyMDhmZmY4NzNiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9MYWJlbE92ZXJyaWRlUHJvdmVuYW5jZUVkZ2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYWRjNjJmY2IxMzg1NmM1MDBjYTc1YzlkNDNjOWEwMDQ2N2IzNzk2MTZmOTZhYjFlMzZmODc2YjI2MmFiZWZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0xpbWl0ZWRDYW5vbmljYWxQYXRjaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNkMGIyNDgyMzJmYTRmODljNTc3MjY0ZTUzYmZiNjY3OTFjZjMwM2Q3ZmFlMTdkZWQzNTNjODJhMjRlZTQwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9MaXN0Q29udHJvbEZvcm1zVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTAxN2Q2MDA4Yjk4ZGEzNjExOTA4Y2U2NjZmNWZjNWJhOWQwY2E1ZWUwZTEyMTUzY2QzMjc2MzEzOGZlOTdhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9MaXN0SXRlbXNUeXBlQ2hlY2tlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE0ZTFkMzdiZmVlODY5ODY5OTMxNGM1MzA5NzUwMzdkNWJlMTc1MTQzMTk1NTUwMjQ5M2JiYTZiN2UwMTAzYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9MaXN0UHJvY2Vzc29yVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWYwYTNjY2E1NWI5Zjk5YzRmNDJiYzVhMzQ4YWU5YjRkMWMxOWRmODA4ZGU2ZjkxYWUxY2JhZmNhMmM4MjIxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9MaXN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Mjc4NjBhMGU2Y2FiZGVlZDZkNzQ3MjZlNjM0YWY3MjNlN2I3MmFmMzNhMzU4OGI5Yjg4OTQ4Y2I5ZGQxOWQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL01hc2tlZFJlc29sdXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmNmNDhiMjM2NTVkY2MwZTYxZTZlYThmYzZiMjY0ZWQ3NDMzYzYxNDQzZGVhY2FjMjNhNzliZjQzZDE5ODU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL01hdGVyaWFsaXplZFNlbGVjdGVkUHJvY2Vzc2luZ0RvY3VtZW50RmFpbEZpcnN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjM1OWJlOThjYWE3ZjI0ZTk2ZTQyZTI4ZjZkODQ3Yzg4NDMyOTM1NjU3MWQyZWM2MDQwMTNmNDhiM2JlNjkxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9NaW5pbWl6ZWRPdmVybGF5SW5saW5lVHlwZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyM2JlZWE0OTVlYzFhMjhjY2Q3NTUwZjM5ODU4MWRlNDlmZDU5ZTUwYWRlNmFmOGQ5YTkxNGViYjQzM2NiYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTWluaW1pemVkT3ZlcmxheUpzb25PYmplY3RPcmRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxYWEzYzg4OTk1ZTg4ZGQwY2FlZjI1NDE0ZjllNjkyMjI2NjM1NWU5Y2YyMDI0MzdiYTdmYmNiOGY5YjJjOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTWluaW1pemVkT3ZlcmxheU5lc3RlZFR5cGVkTm9kZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1Yzc4Zjk3YzY2OTU3MTA4YzNiZjExOGI3NjY2NDEyODVlNmVjMzhjNjk2YzI2ZjM4ZWQ5MzQ1ODcxNzI2YTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTWluaW1pemVkT3ZlcmxheVB1cmVSZWZlcmVuY2VQcm92ZW5hbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YmZiYzMzM2ZjYzI1ZDI5MWM3NzU1NzU4MzVjZmU2MzRkMDI2ZDNlMTE1MmNlMTQ2ZjFiMGYyMWNmYTlmODczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL05vZGVDbG9uZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjk3NDAwOWNmYTMyM2ZjODNlNTM3MGJhMjdiZGU5Y2NhOTM4OTVkMGM4ZTc3YjI0YzFiNzIxNGJjN2YxZTQ5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Ob2RlRGVzZXJpYWxpemVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYyMWNiZDA3NzE0MzIzZDU2MTUzNWE0ZGUyOWU4YmQ1ZmFhZGEyMTkwOTgyMTg3NmRhZmUwZmI2YTEyNDdjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9PdmVybGF5QnVpbGRlcnNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOGVkMTI1NDA5OTU2N2E1ZjVjZTgxODVmNzk2ZjU4ODBjYTQ1YTdjZGFlYjJlN2U4ZDYwMDY0MmYyYmFhN2FhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1ByZXByb2Nlc3NvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzAwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjZjhmYTJiMWU0M2QzZjFiNDBkZmUxMzIwMDA1YTM5YzdjMTQxNTY1NTdmZWU1NWQ5NGEzODJmNmU2MDBlZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUHJvY2Vzc2luZ0RvY3VtZW50U3RhdGVJbnZhcmlhbnRGYWlsRmlyc3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODlhYzlmMzEyYTQyMzhkOTUxMjc0MjBlN2NlNTRhNDgzYzJlODM0NTY3ZmM5NmFhNmUyZjhkNWRjNTk5NzJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Byb2Nlc3NpbmdTbmFwc2hvdFByb3ZpZGVyUHJvdmVuYW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODQ0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzNDI0OTRmNGU1ZmE2MTY1MDQ3NmMyYTllODVmZDk1ZjhkMDM0NGRiMDVmMjRjOGMxYmZjNjY2MDk5ZWU0OGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVjdXJzaXZlVHlwZVJlc29sdXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNmNlYzhhNGFmOWMzYTFlNzhiOTk5Mjc0Mjg3ZWJmODUyOGY5YWFkMGQ3NDc4ZmUzM2M0ZGExNmFmMWRhNzJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1JlZmVyZW5jZUJsdWVJZFJlc29sdXRpb25WYWxpZGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JhMGRkODRhODJiMDlkZTgxNjMwNTVmNzgzN2EyMTUxMjk5Zjc0MDgzODE0MzFhZjhkYTkxYjIzYjYyM2M4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9SZXNvbHZlZEluc3RhbmNlU2NoZW1hVmFsaWRhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTg1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5MWU2ODEyNWU3ZjYwOTNmMGRlNGFhNTlmYmQwOWVjZjYwMGI5ZGMwOGIyZTBhZDJlOGZkYWY3NTllNGFkZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVzb2x2ZWRQcm9jZXNzaW5nU2VsZWN0aW9uQ29ycmVjdG5lc3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3YzM5MGI2NjU0M2RiM2U2YTQ1YmNlZjgxNDdiYmMxZTVmMTVhYjhmNDZhNDRkZWY4NWY0ZDE1NGY5NDBiOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVzb2x2ZWRTY2hlbWFWYWxpZGF0aW9uTGlmZWN5Y2xlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNzk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzY1MTU5NjkzYjM3OTYyMjIwYTJiMTIxMmUyMTM1OTdmY2Q3YjM1MmVlYzA3MWY1MWZmMDYyNDg4ZWI1NDMwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9SZXNvbHZlZFNuYXBzaG90U2VsZWN0aW9uQ2FjaGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNlNDQ1YjFmNmNmNjk4N2M1ZmRkNzViZWM5YjQ0Yjc2YjE5MWNkZWExOGFhZTgyMzI3NjBiNmFlMTIyNDIzYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVzb2x2ZWRUeXBlQ2FjaGVIaXN0b3J5UmVncmVzc2lvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRjZTcwYjBlNzYwYzcxZTBiYjBmYWNlMGY1NTkxZjk3ZDc1YmQzZDQxYjRiZDZmYTk5ZWEyOTk3M2FhMTA3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Sb290UmVmZXJlbmNlU25hcHNob3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzI1NzAyNGZjNmJlNmQxZGU1MzUyMWRmYjFlODcxMTAwNzczOWU0ZjBkMGVkNWE2ZWRjZTI4NDRlMWRhMWIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Jvb3RTY2hlbWFQYXlsb2FkS2luZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdlNzBlYWYzMzBmZWI4ZTRmZGM3ZTFlMGUyOTlkYWM5OGNlOTVkYjdiMDA4NDA1ZGQ5OTQ3NTczZTA0YzI5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9TY2hlbWFWZXJpZmllck1pbkxlbmd0aFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4OTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTFlYzUzZTRiZTRhNTRmZjE4ZjliZmVkMjhiYWQzODZlMzg4NzAxNWRhZDJkYjhlMTg1YzljNWM3NGNlMTM0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9TY2hlbWFWZXJpZmllclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjk1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2OWE1M2YyODI3NmY2M2I2MWZhNDkxMGZlMzMwZjhkNjY1NDE4YmQ1ZTg1YjNmOTJjMTY4OTI1NzUzYjQ4NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU2VsZWN0ZWRQcm9jZXNzaW5nU3RhdGVDYWNoZUlzb2xhdGlvbkZhaWxGaXJzdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWUyYjgwMjBkZjMzZGFhYjcxMjMyOGNlNmY3NmRiNjk3NGIyNTQwMTcyMDA0MzEyZmRmMGQyYzE5MGViODExZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9TZWxmUmVmZXJlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTJjNzI4ODBiY2E5YmRiMDBlM2FmZWFkNmM3NmMxYzRkYWY5OWQzMWI0YmI5ZDcxZmZkMzVlMDY4MjQxNTYwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9TZXJpYWxpemF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc5NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDNjOGQ1MGY1MDEzOTM0Nzc2YzFlYjhkMGQ2OTVkMmZkMGM2NjQxZWFiMTcxOWZiNDU2ZWJhNjA5ZjY0MWFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1NvdXJjZURvY3VtZW50Qmx1ZUlkVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzM2YWY1MzUyN2EyY2UxYzk2MTQwM2IzZDdmMjFlMmZhNGY5ODVlYTMxYmJlZDcxMjI2MDM0MjhmNjk5NjU0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Tb3VyY2VTdHlsZUNvbnZlbnRpb25zVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNlM2NiNmY3ODM2YjYzODNiZDUzMDY5NzZmM2M4MGJhNzU4NGJlM2E0ZDFlMzY3Y2M2NTI1YzVlNmQzYmJmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9TeW50aGV0aWNXb3JrZmxvd1Byb2Nlc3NpbmdGaXh0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1MmM0ZWUwZjI3YTkxZGFhZmY3Y2UxYTdlNGQ0OTNjYjljMmEyODQzZTRiZWI0ZTM5ZjgyM2ZjOWUxMzdmMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvVGVzdFV0aWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3YjIxYzFjZTYzNDM2NmU1NmFlZjQ0NGYxY2NkNmZlNzdiNDQ2ZWUxYjNmNGE0OTc1NmQwYTVjNDMzYzZjYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvVHJ1c3RlZFByb3ZpZGVyUmVzb2x1dGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkOTAzZmRhNTczYjUwNDU1ZTJmMDNiY2IxOGE1ZTgyNTE3YjJiNzkzMDQyOTNkMWU4MzU4M2JkNTY5YTQzYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvVHlwZUFzc2lnbmVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDAzNmQ5OTUyZDVlNzBjNmNkMDczMmIzYjgwMjg2MWQyNjU5NWFkYWM4OGI5MmQwYjZkNzBiNjMzMWY5ZjhiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1VuY29uc3RyYWluZWRGaWVsZERlY2xhcmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MGY4NmEwN2U4MTlmM2IxZmQ4OWExNDE1NWMxOGI5Y2IxMGJkNmI5MDBkNTRiOTk0MGMxM2VmY2ZmZTE1Mjg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1ZhbHVlUHJvcGFnYXRvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzIyZWM5Njg2ZTI4ZWY2ZjE3Yjg4ZWJlYTE4NmIxNGU1YWExNDU3MDE2YThmOGY3MWMzN2EwYTI4MDM3ODUyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9WZXJpZmllZFJlZmVyZW5jZU1hdGVyaWFsaXphdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4Mjg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJiYjc5YjMyNThlMjE4NjEwNmY1Mjk3OWM1MTE5YjQyZWFlYTFlMzc4ODZlNmI3ZGE2YzljM2UzYjNlMTQxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9hcmNoaXRlY3R1cmUvTGFuZ3VhZ2VDb3JlQXJjaGl0ZWN0dXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzRmMDI1ZjI2ZjBkMDllYjdmZmY2NGVkZGMyMjRkZTZmMzYwNDFlODkxZGI1ZjA5YjJjYmI0ZGRmOTJhN2E2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9hcmNoaXRlY3R1cmUvUGhhc2VGb3VyTW9kdWxlT3duZXJzaGlwQXJjaGl0ZWN0dXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmFmYmQ1M2EzNWJhYmVkM2M5YzI1ODBjMTk4NGY1NDY1NzRkZWNhNzI2NzAzMTgwOGIwODBkNGE3MDAxMDBhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb2RlYy9TdGFuZGFyZEJsdWVDb2RlY1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGMzODE1Yzk0MDllNWI3MzVhOGE4YjRlNmFkMWI0MmRkNDYzZWYwZWQ2ODc2MDgyYTAzZmRkZDU5ZGJiNjFjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9BcGlNaWdyYXRpb25MZWRnZXJWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjExODU0MWYyMzc2ODgyNmNmMzRjN2MxZGEzNjY4NjgyZGQ5YTE0MGEwMDBhNGZjNzg5NGE5ODkxOGM3NjM3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9BcGlNaWdyYXRpb25MZWRnZXJWZXJpZmllclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiZTJlZjhiOTY5NmUzNDU1NzA0OTA3MGJiMDgzNjg3ZmI2NTk2M2ViODI1ZDNmMGIxMTRhOGEwZWRjOTEzNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VFbmdpbmVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzQ5NmVkMDc4NTk3OTg5YmQ3MDhhNjVkMGEwMjcxY2E4N2JjMDMyNGZjYTdhNWFlMzRiZTliM2Y5YjVjOGZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL1NlbWFudGljQmFzZWxpbmVDYXB0dXJlQ2xpLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTA5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3N2ZjNzAzZDdlNDI0MzE2YzdiOGUwMDcwZTdjYjlhYmViZDNiNTJkOTEzYWMzMzFkNmU3YWU2NGYzZmQ1NmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvU2VtYW50aWNCYXNlbGluZVN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjc0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwNjFjYTRiMTQ0N2IwNDA0MGJjNjczZTYyZmViNzgwMmVkMThmOTlhOTA4ZWY0N2ZjNDA4ZmQ2YWFjNWE0M2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvU2VtYW50aWNCYXNlbGluZVN1cHBvcnRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhN2E5ODY2YjJiNjI5OTZlODI5N2JhOWYyY2E1NmEwYTQ5Y2VhNzM2ZmFkODE5NGY0ZDBiZGFlNGI2NTIzMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvU2VtYW50aWNCYXNlbGluZVZlcmlmaWVyQ2xpLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODA2YTc0ZDMwNDk3NjI2ZmE2NmFmNzM1NDFhMzdjNzgwZjBlMTU3OTJhMDBkMDAxMmNkZTViZjVlODMzZDRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VSZXBvcnRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE3ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGJkNmFmOTcyNzc4M2YzNjliOWNhNzVmZjk0YTc2NzkyMzM5ODc2YjAyYTM0ZTI5Y2EzNDFkZjljMDgwZWI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29udHJhY3RzUGFja2FnZUludGVncml0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2M2ZDZkZTRiMGRmZjgzZGU5Yzc3MDYwMGM3ZTgyZWQ5MTA5MDg2NzY3M2IxZTZlMDIxZjk0NzQwMzk0ZmZmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUxhbmd1YWdlQ29uZm9ybWFuY2VGaXh0dXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWE0YzM1NmE1NDY4MDEwZTZlYTBkOWQ1MDdiMWM4YmE0MzhiOWNmYTUxOGUyN2YwYTBhOGRmZDU1MzE4OTBjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQmx1ZUNvbnRyYWN0c0NvbmZvcm1hbmNlRml4dHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzYxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2ZmEzODhkNGI5Y2VkMTY5NmRlNjhlMmRiMjBlYjZiNDRkN2U1NTNiOGMxZGZiNDdlN2ZlNmM3ZGMwMGY2YjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0JsdWVDb250cmFjdHNDb25mb3JtYW5jZVJlcG9ydFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTE0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwOGY5NGNhMGU4YTFkYjk3ZmIxM2JhZGYwN2EwNmJkYTEzMTEyYTY3MDA4ZDMyOTI2ZjQxN2MyZWJiN2I4Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0Fzc2VydGlvbkV2YWx1YXRvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzI4NDM3MmU2ZDUxMjMzNmJmNDVhNTRlZTZhN2ViODIxOTEwMTRlM2UwZTc0ODExYzg0YTg5OGY0MDkxNWQ3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZUhhcm5lc3NDb250cm9sVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWMyMWY3ZGI0MGQ3YmJmYzVmN2Y2MDdhMzliZDc4MjhiZDUzYmFjNGE3MmMwOTQ3NmU0Nzk3MDkyNmM1MTc4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9kb2NzL0xhbmd1YWdlRG9jdW1lbnRhdGlvbkV4YW1wbGVzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjg0OTRiMTFmMzc2NzkwZmVjY2MzN2VlMzc4ZWQxZmVkMWI5ZWViMDIyODIwY2NlYzBkNmExYmE5ZWU0YTk2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9ncmFwaC9Ob2RlRXhwYW5kZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTVmZmZjN2MzMTEyZjk5MmY3N2E5YWU0ZDFmMGEzYzM3MmMyNTIxMWE0YmE4MGY4MmE1YzNiNzc1MjM5MThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2dyYXBoL1N0YW5kYXJkQmx1ZUdyYXBoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NzI2OWZkYzlkYjBmNDNmNjI2ZWQ4ZDVkYjlmYzAzMTJhZDljYWM1ZTc5NjRiYzM3Njc4YjM3ZGJmZjQ5MTI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Jhc2U1OFNoYTI1NlByb3ZpZGVyTWFwcGVyQ3VzdG9taXphdGlvblByb2JlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlNDA3ZDk3ZWVlZDQ0MjA1M2Y4NzI1YjViNmI2MTIxOThhY2MwYzY0NDk4NTAyNTQyZGVhZDIyZDc2MTM3ZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmFzZTU4U2hhMjU2UHJvdmlkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDFhM2Y5ZjFkMjUxZGM1NzU1MDg4Mzk0YzkzZDhlNjE0NTcxNDJlMzc3YmRhYjA4N2ZlZmM3YTY4MDRjMDg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Jhc2U1OFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjY3YzcxZjA0NzM4YjE4NzM0OTExOGMxM2I2N2ZkMTMwNzAyMmRmMGYxNTlkNzI4NjQ1ZjJiZmM1MGZhZTc5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CbHVlSWRlbnRpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5OWU0NDUyMjA2NDU1NDYzNTRmZWZjN2RlMGEwZjE1ZGNkMjIyNzA1Y2MwYTI0MTljZTQzMDU2ZmVlOTY5MzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmx1ZUlkc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGJmNGUzYzMwMTg3YmRiODI3OTJlYmM2ZDdlOTRhNjU1NTM5ZGIxOWI1Y2E5MGMyMjA4MGI1ODJiNjE4YWQ2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9EaXJlY3RCbHVlSWRDYWxjdWxhdG9yVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1NjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2MwYmIzNjU5ZWRmODZkNDE3YzgyNTY5NDJjZGQ4NTUyZmFlNWEzNmVmMDRkZjcyM2ZlZWFjN2RlODA2MjQ5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9MaXN0Qmx1ZUlkRm9sZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDRjNWU1OTFjZWQxMGRmYmJlYmNhMjJkNzBlOTZiMjI5MWEwNjU1MzQxNjliNTRjZTE1YmZmMzAyZmUwMTM0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9TY2hlbWFFbnVtQ2Fub25pY2FsaXplclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JkOGQ5OGM4MDBiMGFhOGEwYzJhN2VlMTU5ZTFjNWVjZWRlYWNjODRkNTBlM2Y3YmJlNjJmMjM0MWJjN2Y0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0JsdWVBbm5vdGF0aW9uc1NlcmlhbGl6ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkYTViMmE3NTM5YjIzZDc1MGYxM2RmZjFlOWU2YTViNWMyNTkzNjdlMmQwY2M3MmJlYjkwY2U4ODdlMGRkOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9CbHVlTWFwcGVySXNvbGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYjA2MmM3OTNiYjRmNDFkM2QwMTA2ZjkwN2VmZTA2YzJmMGMwZTQ2ODE4MTIzODJlNTA0YzBhOWVmNTQ4ODJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvSnNvblByb3BlcnR5TWFwcGluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NDMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQyMDNlMzUxNTVkOTlmOGIzZDU4OGNlZWNiZWQzNWVmNjkxZDk5NmM0ZTJiNmY2MDc4NTc4NjNkZDQxMTk4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL05vZGVUb09iamVjdENvbnZlcnRlck51bGxIYW5kbGluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzU3YzM2NTgyMzZmMTVjNjI5YjZkMDczMTgyMTM5N2JiZDRjYTliMjMwNWY4NzU0NDhkOWM2MmZmMTFjZmYyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL05vZGVUb09iamVjdENvbnZlcnRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzE3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlYjNlYWYyMGZiOGQ4MDU0YmM4ODA2ZDRmMjY2MTIyNDMxMTJkY2FkY2JlMGM0OWQzMmU4M2Y5YzhkOWUxNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9UeXBlQ2xhc3NSZXNvbHZlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGYxMmYwNzdjNWNlNmFhNzNlYWY0ZjMyNmFhYmMxZjViY2FjMDNkZmViNjQ4ZGViNDg5N2VkY2Y0NmZhM2RkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL0RvY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1ODRjOGQ3OGVjNmJjMWQ5NDhkMmQxN2Q3ZWY0NTlmZDc0Y2JiYzE3MjA3ZDVjNWNiZGQ2MTdiZmFkYjQ3YTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9OdXJzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiYTJjNTE4Njg2Y2U1MTM0ZGIzNzJkMWI5N2ZiMmJiYzA5MzNmZWRiYWJkYjljNGY5MWVmMDlmNDg2NzFjYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9QZXJzb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTAwN2ZjMTM3NjYwMjIxOTczMDM0MzRhOGMzYmQwM2I4ZjNkMzFhZDc0M2I4ZGRjNDEzYWE4MDkwODkwZjI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvUGVyc29uRGljdGlvbmFyeUV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTAwNWYyYzExZDE0OTFkOWY0OWM4M2M2MmQzNmJhZTM2YjFiNWE1ZDg3ODhhZmU2ZDFmZDNiYWQwMjg0ZjBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvUGVyc29uTGlzdEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NWMzZGMzOGJhNDY2NGE0NTA0MGZiNDgwYTdiZDFiMzBkYmE3OGM0OTUzODVhYjdhNmFlYWU2NTdkODQ5ZmY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvUGVyc29uT2JqZWN0RXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmYzhlNzhjYjAyMTEzZTlhNzM5MmI3NjU0NmJjNTc5ZDNiNzQxY2Q4MDBmOGNlODc3YWRmMmEyNDM4NjlkZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9QZXJzb25WYWx1ZUV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYTM3NjBiOTZmNWFmZjZkYTZmYjUwNjUzMDcyNDU5OTY1OWY1MjgwMGUyMjdhY2M0MjRjMGU0ZmQ4NTBjY2EwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImRmNmNhZmVjMTYzZWUwNzcwZmI5ZGRiN2U0NmRhM2MxMmRkNzQwYjQxOGFiOWY3NDQ0ODE1MzIzMTJjMjc4YjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9YMS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImQxZTc5N2U0ZjEwZWFmOGU1MGIzNWJiZGYwOWEyMTc3YjgxMmQ1OTM1NzRmNGRhMjgwODg0YzUxYWQ3MGVlZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9YMTEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOWUxNDg1ZmY2ODgyZDc2Mjc5NDJlYmQyNTRkMTAzNDM4NmMyOTQ2MTkyNmExZWEwZmRmZDM5YTNhM2MwYmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWDEyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTg3ZmY1MTBkOTM3N2M5MWY5OWUyMjYyM2RkOTk1MDFhMDFhODlmZTJkMjk2MjJmMmEwMmUzNzQ5ZDI2MWJhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1gyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjUzZDljYzkwMTQzZDYwMGUwYWQ1OWE3YmI2NzZhNjJlYTFiNGFiNzEyMGQyOWExM2FiMjAwOTcyMzJiYjkyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1gzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjNlMjMxZjM2ZmQ4Njg4ZmRhNWMxZjgzNzNkMzI4OTk5MjE0MTE5Nzc1NTlkMGMwNmQ2NWJiNDM2OTgxYzQwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1hTdWJzY3JpcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDc4MzhhZGE5YzVlN2RhOGQ5NThmZGJhN2VjZDYzOTMwMDY2MDA2ZGI5MDlmMGNhNmI5M2E0MTZiMWNjYjRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzOTVhZGFlOGNlYTg1Nzc0NzgwMDRkNjM5ZGJhMmZhNTA4ODQ1ZjYwNGIzNjFmNmYyMWNiMTUyNWVjMDZhYWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9ZMS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4Mzk0N2UxOGIxYmJiMzFhN2Y0YzQzOTI5MGNjZDcyNzc1ZTIwY2NlZWI2YWM0YmZkODg1ZjgzOTU5NDc0MGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9aLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjBiYThmYWRkMzczNGJkYTMzMzYzOTliNTRhMGE3MDNkZmFjNmVkNTAwMjUzNDdkYzZmOTQ1MmMxZjA5NDU0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1oxLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRhYjIxMDZjOGY5ODhmYjBjMjY0OWIwNGZhZmQ4MTc5YjgzY2I4MmM5MjBjYTJlZjRlMGYyZTMyYjY0N2M2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1pDb250YWluZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzQyMmExODNlNzE5MDY1NmNjOWFlMmUyMDQ1ZWNkY2QxODc3MDdiZDNiZDEzZTMyNDcwMmZkZDc0NmQ1NTVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvcHJvdmlkZXIvQ2xhc3NwYXRoQmFzZWROb2RlUHJvdmlkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkMWI5ZmE5ZDAwMzVjZmRkNzhhNDA4N2RmMDg1OGIzN2JiNTUxZTcxOGFhNDY0NjgzNzYwNDBmMjZkYjY2OTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWF0Y2hpbmcvRnJvemVuU2NoZW1hTWF0Y2hlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWEwNGI3NjgxYzhlZmQzMTUzNmNkYzJiNzhmNGUwMDdhMTNmMzAzNmM0ZGZlNjEwZmVhYmYxNTIzM2VlMGM5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9Gcm96ZW5UeXBlTWF0Y2hlckNhY2hlUG9saWN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMDYxYWU2ZjBjMWU5ZDY3ZjU4NzQ5ZGI2M2ExN2Y1ZmQxMTFjN2JhNjRhNzQyNzUyYWZiMGQ1MTNlYTUwYmExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL01hdGNoaW5nUnVudGltZUJvdW5kYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2FmYTBlYTkzYjkzZjZlODQwYjlhMjNjM2VmMTk3ZDNlMTk3ZWVkN2NmMzE4YjkzNWVlODE1MGYzNjdlZjNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL05vZGVUeXBlTWF0Y2hlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzU5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhOTNhZGMxZmJhMGEwNTg2MTc5MTExZmNiZTdjNzQwYzQ0YzUyMTcxY2ViOWM2MzcwY2RhODBmZjExZjFjNzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTWVyZ2VySW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5MmEyYzE5YjAwNWQwYjUxYjQ2NGFlOTA0M2I1MmYwODMxOGIxNmViNjdlYmY1Mjc4ZGEzYzQ5YzM5MTM3ODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTWVyZ2VyUmVzb2x1dGlvblNlc3Npb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2NTcwMmQ3ODUzYTlhNjNiNjUwODY4YTExMjZjZTJlOWE5NzJjODkzZDBlYWZmZTc1YTU3ZGRiZDhkMDVhNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTm9kZVNwZWNpYWxpemVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDQ2OTg1YzFiMTg2Y2M5N2QzOGFiMWRhYWFiZDFhMjUwNzgyNjFhYTgyODJkNmNkZDExMzQ1ZDViYzcwMmFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1Jlc29sdmVkUmVmZXJlbmNlQ2FjaGVDb250cmFjdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDk5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhZDU1ODRiZjRhMzVlZDFiZjUyYTEwOTYyNjlkZjU2MDJjNTk5Mzk5MGJlODlmYjZkZmZjNWRkMTU0YWEyODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x2ZWRTbmFwc2hvdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzAzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2NTc0MGM3NjdkYjZmMWQzMTFlMDMzNDdjNTNiODkyOWVjMzhjNWVhNjRkNGZkMWI2MjMyOGQ2NzU0YmI4YTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL0xlYXN0Q29tbW9uTXVsdGlwbGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1M2FlZjRlMzE0NDQyZTI3ZWRkOTJiMWQ2NDI0NDNhZTdmNmU0OWFjNzc5NmIwNDQzZjlkN2NjZDg2Y2ExMGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTW9kZWxEZXBlbmRlbmN5Qm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyN2IyNWIxMDQxNmU1ZTFiNDJkNTZhZTU2NDcwNWUwOGNkNmQ4MmI1ZjgyM2VjODRiNTJhYmFmNGQxMzg5OGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTW9kZWxXaXJlQ29tcGF0aWJpbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjg5Y2Q0NjVjYmViMTg3NzI3OTNlMGM2YTU4MjdlYzhlYWQyYjFkNzVkNGQzNzM5OGY5MWFlOWNkMTMzYzIxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlSWRlbnRpdHlQcm92aWRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWMyY2YwMGIyOWYyNGMyYjc3Y2JiMzg1YTlhOThkZTMxNzE1MzRlZGQyNDE4MWFkNWZjZGM3YjhkMDI5MjM2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlUGF0aFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4Njc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzlhMzhhYzdjMDc1MTJkZmM1YjVjOThlNDM0ZTczZmEzMDBiYjdmODllOGIyYTQ1ZWE0NmI3MjVlMjYyOTA1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlV2lyZUZvcm1UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY2MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWJhYzYzMDRlMjA2OThmYzEwYWIzZjYzZDdiMDY4ZTVjMGUyNGZmYzIxZjQyMTE1YjBmZTE4NDM1NDg4NmI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3dpcmUvUGFyc2VkSnNvblBvaW50ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDExNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY3NjBkYzNlOWUxN2IxOWU0Mjg2MWRkNTA2NGZlYjQ3NTFhMDZiZGVhZWQxZTU2MzZiNzM3Nzk0OWMzYTU5OTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9QcmVwcm9jZXNzaW5nRXhlY3V0aW9uT3JkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkNTIyOWFhYmY1MmViNWYwM2NiZDdlZGMxMWFkODZiZWUyOWU1NGNmODU0ZTgzZTczNmQ4ZTAxZGM0Zjk2OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9TdGFuZGFyZEJsdWVQcmVwcm9jZXNzaW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTM5MDI5Zjk2ZTY3ZDNlNGVkOTUwODNiYzQ5MmI2YTU5Y2QzYTc4ZjRiYmQ3NDg2YmM3Y2QyZjczMDUzMGFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9BY3RpdmVTY29wZUN1dE9mZkJvdW5kYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NzkzZTUyMTBiMzk5ZjNiNGI2YzUxYzYxYzcyYjRjNTkyOGQ5NGZlNjIwZWI1MDRmZjg2NzcyZmY4Y2EwMjFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsQ2hlY2twb2ludENvbnRleHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTQ0YTA0MTJkMDI1NjY4MzE2MWFiNmY2NTYwOTVhODgyZjgwZGRkY2VlMzM1MTc3YjQ0MmI5Y2FkMWQxYjBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsQ2hlY2twb2ludFN1YmplY3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjA0YWJhNWEwZjQwNWE2MjU4Zjc2ZjkyNmNjZmE5MTg5ZGQ2N2E4MzAxZGU0YzM3YTlhNTc3ZWY1ZTcwY2ZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsRXZhbHVhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmYxZDVlNzYyYTk1YzdmMWQ2ZmM4NTgxNWExMmMwNzNhMWM1NWFjNzY1M2FhNWEwZmZhOThhYmQxZjQwYWVlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbE1lbWJlclNuYXBzaG90VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzE4ODkzODkwM2FiYjIzMGQ4NmJjMGUxZGFhNzJiMDYyOWZiMGIwZDEzNDAyOGI3NDE0MTk0NmQ5ZjlhOTExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsUnVubmVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmYyNzYxZTBjZjJiNzNlYjhhNzI0ODRiZmM0NDc0YzBkOTZmMzZmOGQ0OWRjZGU5MDRhNmRkNTM4MmE5MmM3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hlY2twb2ludElkZW50aXR5Q2FsY3VsYXRvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTg4MDU3ZjFiOTE0ZDc0MjAxNGYzNjc1ZDQ3NTIzMzI5YTU5NWZhYmQwODY5YmI5MWY4MTEyMmYzMWMwNzRhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hlY2twb2ludE1hbmFnZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNDM4Y2Q4MTA1YzM0YzE4NTZhZWNlYTNlNWU2YjkxYTI5NDFlYjBjY2NhMjdhNTZjY2VkZWZmMzhmODJmMDZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdEJ1bmRsZUNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTUwMTk0ODMxZWEwZmI4NzJiMDNlNmJkYjJkOWVmNDI0MjQ4ZTJkNjAxY2E5ZTc5MGZlYzVkY2ExZWNmMmQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdENvbnRyaWJ1dGlvblJlc29sdmVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTI1ODY1MTExNzA0NjM2N2ZmODEzNGFkNWNlYWE5YThhNjQxMzM1YTVjMTlkMmQ1MmRjMzViZmRjYzQ2YThiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3REaXNjb3ZlcnlTZXJ2aWNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDdiNDI4NTI5ODY1MmI2ZWJmYzQ3MDBmYzEzNTJlYjY4MmMxNWQ3MzRhYmMzYmVmOWI3M2IyNmFmZjVmYTVmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RFeGVjdXRpb25SZXN1bHRQb3J0YWJsZUxpbWl0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU4NDIwZWNlMzJlMzY2YjljOGMwY2FiZjFiYzkwMDRlMWE4ZDA4Yjk2ZjI2OGMxOTJhYzg0YzI1ZGVmYWUzMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RNYXBwaW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImRmNTg3NGU0ZDBmMGZlYzlkOTY1NGU1M2JiYzY5NGUwNDljMTZiZmY4YjdlYzg4NzQ4ZmFhYWE3NTg2ZDM4MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0UmVjb2duaXRpb25NZXRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTYwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0N2Q4ZmE2NTM1N2JjOWQwYTQxOWY3YWYyOTU5NDFmOWFmMWM0ZDExYTg5MzRjMjE3M2IxMThhNDNlZDQ3NGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0czEwS2VybmVsSW52YXJpYW50VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NzczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODc4YTk5YjllYTlmMTBmMWFkMDcyNmM3Y2FiYWZlZTkzNTk5M2JhODFjYjY1ZjI2ZjRkNDg2MzcyYjU0MjY1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RzS2VybmVsQXJjaGl0ZWN0dXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOWIzNzljYWFjNjE5ZWNhY2IwZWNiNTc4OTIxZjQzNmQyZmY2NDE2NTVlOTI0MzcwODdiNzExOTU1NWE4MjM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DeWNsaWNQcm9jZXNzaW5nQm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MmFhOTM5Y2NiNGYwZThmNWNkNGQxZWMzNmI0YWNkNDdjNmEzNmU5ODBhYzk1NTNjYjFmNWU0MGZhODczM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RlZXBHcmFwaFBoeXNpY2FsTG9jYWxpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTkxMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMmFjNDE1ZmUxZWMzN2EwNmFjZDQzZmE0ZGE4YjY3ZmY5NTM2N2YzZDJhOGZkODEwN2NkNmM2MTc4NTkyMGM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9EZWZlcnJlZFNuYXBzaG90UHJvdmVuYW5jZVByb3BhZ2F0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzRlMTU5MWYxOWFhZTViNGM1ZDkxNzZkODdjYmZmNzU1YzZhNWJjNzk3M2EyMGUwYWY5NDA3NzUzMDk0NGI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NpbmdSZXN1bHRUZXN0U3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MmJmNjM1Y2EyNzBlZjMwMjY2MTM1OWQzYjVkNTZmNDRmNTRjNDg0Mjg0ZDVlOTQ5MDQ0NGJlYTZlNTdiMDU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NpbmdSdW50aW1lQmF0Y2hQYXRjaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEzMGY4Nzc4Y2VmMzgyNzhiMTI4YTAyOTY2YjBmODc3MTZiYWFiYTkxODk0ZjRmZTRiZWFkYmZiN2ZjMTczNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc2luZ1J1bnRpbWVDb21wb3NpdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDZmZDEzYzE3MGVjOGVkYTE2NzE3MDJjNjRhMDBkNTEyOTJiNDE1ZTY1YzUzZjg5OWMwMmYyNTIzYWY4OWY1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUnVudGltZURlZmVycmVkUHVibGljYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzFmZjU4YzlkNmQzNzYzNGZhMGEyNmJjZjc3NzI4ZWMwYWE3N2QxOTRiNTYzMmFlNTFkMmI2ZGM2ZjVkM2VmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NpbmdSdW50aW1lSnNvblBhdGNoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDZiNDBhZjU4MTQ5MzFlNGQ0ZDFiMjhhZGM3MmE4YzZkYzM2NDhlMGI3ZDEwZDVmZGMwMjM2OGIzOTliZTNmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUnVudGltZU93bmVyc2hpcFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2U3OGYyYThkM2FlYmVkZjk4MTZmNjQ3YzdiNTBhOThiOTI2ZDEwOTc0NWFlYzQwYmMwODg2MjdiMWE1ZDk1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUnVudGltZVRlc3RBY2Nlc3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmM3NDFjOWNmNTc4NzlkYTA3MTljYmExNmQ4NjkyMTAyNTQwMzAwODIxODkyYzk2ZjZiZDExOTcyZGJkZjcxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JCYXRjaFBhdGNoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWI4ODRiMWI2NDFkY2RlZmQyYTkzN2U5ZjZiOWQyZTNiZWNkZGJjNTdmOTRhY2Q3NWJiY2ExNDczZWVkNjMzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjk0MywKICAgICAgICAgICAgICAic2hhMjU2IjogImUwMzJjMWUxN2I1NzI2NzMyZDlkZTRhN2UwZDMyNjQwY2NkYTg4MjJhNjE0MjAyNzkwYmEyNDU3Y2VmMDk2NDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yQ2FwYWJpbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTIwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5ZGZjMDZkNGQ4MTNjNjgyOTdiOWJiOTBkNTZlZjc4NGYwMzZlN2U2MGNlMmE0MDg0YjlkZWFmZGQ4MTNhNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yQ29uZmlndXJhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjY3NDY1NzZjN2FjOTRkOGYwOTc2Y2Q4MDcxZGE2MGY5OTQ1NGViNmY3ZWY2MTFjZmFhMTk3ZjhhMWE1ODRhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JEZWZhdWx0VHlwZVJlc29sdmVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYWYwNTMyN2QwMGUxYTczMTZiMzBkZWZkYjcyOGZlODc0YmQ1NWQ0MzExNTY0OTgwYTFiYWVjMGYxMTBjZmMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckV2ZW50SW1tdXRhYmlsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjEyZGVkNmUyNjYxNjFhZDk1YmJhMDhhMjM2YWZkNjk0NTM3OGU5YzZkZGU0OTBlMDA1MzI1MGMxN2VlZTI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3Nvckdhc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTE5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1OGUzODFhNzIyNmNiNDNiYjk2YjA0NTdiYWVjN2E3MmVmMDMxMjljZDVmNmVkODg2ZDIwYTQ1ZDA3MWM2NjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yR2VuZXJhbGl6YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhN2YzYWNlYjBhYjE1YmZmMDUyOWU1MWNjYmE3NjUwNjRlYWI0NzgxNjY2YTdmYjYzYzQzNmM0OGNmNGZhYWRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckhhbmRsZXJGYWlsdXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMjM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjM3ODJmM2NkNDRiMzRkYTE1NzA4OGRkMGQyNzQ1YjFkYzVmNmYzNDgxOTMxYjg0ZDkzNmUyNjk5ODU2ZmI2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JJbml0aWFsaXphdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjgzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiNzVhNjM3Y2VlZjBmODNlMGJhMzk5ZjEwM2M2OTljNDU3NjA2ZGZkMjgxYzQyZDU4NGM5ZWQ0NGRlYTM2MmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yUmVzb2x2ZWRTbmFwc2hvdFBhcml0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzE2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2YzdiNjY3MzA1NTFjMTk4MDU3OWJjODViZGRjNmI5MDBiYjg5MjkyZGVkOGQ1ZGIxZWM5NzdhYzFmYWI2MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yU25hcHNob3RUcmFuc2FjdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhMDI3OTFiMDY3OGRlMGM1NGNiMTcwYjQzODM5MWNmNmE4MDhjOTczNjNiNWMyMjBlNjgyYmE3NmE3NTg0N2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yVGVybWluYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzgxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiMjMwMjY5YzA5ZmQ5MzBmYWMwOGJlOGRmNDQ0MzkyMDk5NzYzMWU5ZjliMjkxOTRjNjIyMGI3OGMxYzg1N2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yVGVzdEZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBiZWQxNDFmMWJlMzdiODc5YjhmMDY0ZjNiMTRhZTJlMTJjYzFlM2Q5YWQwMTViMjVhMTEyNDdkZDQ2YTlkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRVcGRhdGVDaGFubmVsVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTc2ZjRjMjAwNjgzZmMwYWQzMGJiOWMzZTczNTM2ODYwZTIxMTgyYjk1MDQ2ZDU2OWI2NmUxNWRlYWVkMDBmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRVcGRhdGVPY2N1cnJlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzA0NDg5NTgyZThlNzZjOWZlM2FiOWI5OTFhZmMxM2E2ZWQ1M2NiYjU1Y2NlYmQ5ZTUxMmM4OGMyMjUyY2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFVwZGF0ZVJvdXRlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDhkNmE1Yjg0Yjk0Y2Y1YzlhYzMyMTVjMzlmOTIxYjEwYmUwNDQ5OGY5OTVmOGJhZjYyNjM3NjhiZDllODQyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlQ29udHJhY3RSZWZyZXNoQW5kUmVmZXJlbmNlUmVzdWx0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMDY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQ0MjA3MGNmMWVkY2EyZGVlZDgwNzMzZTk2N2IyNWMzYzdhMTIwNmRjNGI2NDliMjRmYTdkOGNlYzY2N2Q1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlRnJhZ21lbnRhdGlvbkNhdGFsb2dUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE3NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODU0MDhkMDY5MjhmYWU4N2ZiYmFhMTJmYzMxYjUyZmNhODZhZmY5NTQzMTUzZjM2MzY3YzE0Mjg1OWM4OGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FZmZlY3RpdmVTdWJzY3JpcHRpb25TdXJmYWNlVmFsaWRhdG9yVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVjNWFiNTEyOWE2OWRmY2M2ODA1NmUzYmUwOGFlMTk0MTE0YWM2MDAzZDk3YjdkZDMzM2U1NGYyYWNhMzU0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRDb2xsZWN0aW9uTGlmZWN5Y2xlSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkM2FhZjZiM2IwMDU5MjI3MmZhOWQ2N2E2NWUwOTdkODhlMDkzOTQwYTU0ZTFiYTEzN2QzM2FhNTYyZmU3MzIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZFN1cmZhY2VQcmVmbGlnaHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1OGEwNDRhNDE0NTcxNGE2Nzg2ZjEzNmJmZDNmNjk3YTU1ZDE3NzgxOWE1NDBjZDlmMTExNjEwNWEwOGY3YWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V2aWRlbmNlQ2xhc3NpZmljYXRpb25WaWV3VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NjAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzNlNjQ0NGE4OWI2NWEwMjAwMjViOTU5ZmQ0MGMwNzVkYmM4NWUzZGE4MGM4ZTMwZGRmYThmM2ZlNmU0ZjZhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXhlY3V0YWJsZUJvZHlGaWVsZE1ldGFkYXRhVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MTA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQ1OWMyYmMzYjBkYzk3OTAzNGRiYzBlNzdiYmQ1ZjZjMmEzYzVhZGM1M2ZmNThjMWJhYzdhNDBhZjMxYjExOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXhlY3V0YWJsZUJvZHlQYXRoQ2F0YWxvZ1N0cmljdExvY2FsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODJhY2RlMzc5YTE5YWJiZjZhNzFhNjdhZjYxNzA4MGY3NDBjNjI0Nzg5MjQ4ZTM2MDkzMzhmMzE1OGJmOTMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxDYXRhbG9nQ29udGV4dFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTk0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3YjJhNDAyZTk2ZjMzMmNjNWI5NTg2YTFiNGQ1MzhhNjRkN2FiNTI1YWQ3MmI0Yjc2OWNkZTU0NjQ0YWEwYTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbERlcGVuZGVuY3lDb250ZXh0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0NDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTY3YTk5MTUxOGRiYzE1YjdiZjBhM2I3Y2QwNjc1YWM1YTZjM2VhZWU1Yzc0Mjc3ZjU5Y2JlY2Q1ZGRkYmU0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRGVwZW5kZW5jeVNuYXBzaG90VmFsdWVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5ZmZiOWE4MTYwYmYwYzUxOWE2MWIxZjE3MWE3NWE4ODc2NDhkMDE3MjU1NmU0ZDBiZTRkNjJhYzgyNjI4MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbEhvc3RlZE91dHB1dEFkbWlzc2lvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxYzc5ZTE3MjIwZWYyMzE3Mjg4MDAyZDNmM2M3NDE1OTk0Zjg2YmQzNGExZWUzMDVhMTBiNzIyZjU1YzdhOGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbFBhdHRlcm5NYXRjaGluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzgyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkNzRkOWEyYjJjMTVhOGU0MzlkMzhiOWU2ZmJjYTEwYTI3MzY5ZjY5MWY1Zjc4MTZmMWU2NDczMWQ2NTdlZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlQbGFuVHJ1c3RCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDMwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImE3NDEzZmZjYjRiNjIyMTJkN2NiYTY3MGEzYTdkODk5M2Y3NDU2ZWQ4ZmY5MTUwMTc2NWFhNGI3MTY3NTY3NzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ZhaWx1cmVDYXB0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmZmU2MzRlNWQ5NjBkOWZiY2FkYmM3NmVlNzMzZmY4MTg0MDBhMTRhNDBjNjc3MTk3NGQ4YmZiYWNjYjRkMTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ZyYWdtZW50ZWRQcm9jZXNzaW5nRmFpbHVyZU1hdHJpeFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDI4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5ZjNlNGUwMDllZjA5Yzg1ODJmYzM3MDZjZTEyNjAyM2RkOTIyOGRhZTQ0YTA0M2QyMzk2NzY4YjAwMmJmMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ZyYWdtZW50ZWRQcm9jZXNzaW5nTG9jYWxpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDE2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlOTk2N2Q3ZDQ4MjlhMjIzNzNkOWZhYWEwNTRiNzkwMmM4MzQwMmMyNjEyNDIwYWQyYWI0MGE2MWZkN2JjOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0Zyb3plbkpzb25QYXRjaEFwaVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTk4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0NjJkOGZhOTMzYTU1NjU2MzBmYTg1MjcxZDY1NjI3YzI3MmE4MjY4MzU5NzAyZGQyNDYzZTAwMjQzMmU0MTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0dhc1JlYWN0aW9uQm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMGU1YTA1ZGQyYmI3OWRiNzVhNDNjOWQwYjRhYzhlNDc2NjdmNDEwODc4YWY0MWY4MzBkNjhkMjgwNTI0YzU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNTY2hlZHVsZVRlc3RGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzZjYjJkZTYzY2FlOTI2OTlmODQxYzAxZjFiMzMxMTg4YmU3ZTA0MzdlZWU0ZTYwY2QxZGVjODY1ZGExY2VlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9IYW5kbGVyTWF0Y2hDb250ZXh0RGVjbGFyZWRUeXBlTGluZWFnZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTUzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxNTBlNzUwMmRhNmM2YjhjNzJjMWZhMGE5ZTFiM2QzMzVkNzNkMzQ3OTI2MDJhYmM0M2I3NWRiNzQ2ZjcyZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0hhbmRsZXJNYXRjaENvbnRleHRFeGFjdFJlZmVyZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzcyZDk5ZjA1YTA4MDRiMzg5NTE0OWExZTU0MmM2M2RmZGVmZTk2NWNjYmNlMmI0YjNlOTQwMDAwMmViMzY5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW1tdXRhYmxlSnNvblBhdGNoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4M2FlYzUxMzJjMjcwY2JlZjJlYzA5ZjI3NTY4NWY1OWMwM2U0ZDA5MTFhYTdmMWU0MzU2YmEzZDI1YzJlNjFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbW11dGFibGVQYXRjaFBsYW5uZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOWE0Y2VkNWJkYmU2YmMyMjY3ODhlMzhkN2YxNDI2N2UwMzUzZWRlODU2ZWFjZmEwMmU3NDM2YWQzOThiZTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbmRleGVkRGVsaXZlcnlFdmFsdWF0b3JUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYwODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Y2EyMTRjYzMwNWMxNWI5YjY2ZThiNzU0YjM2ZDNhNzljNDkyMGY0NWI1MjNiMjlhZmU1MjQzMDM0ZjZjMjk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbnRlcm5hbEV2ZW50T2NjdXJyZW5jZUZpZm9UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2NjN2M2NTAyNmMyYmY4ZTQ5NzcxMDYzYjA3NTMwN2ZmMmE4NDVjOTUyODlmN2E5OTBmNzdkZTFmYjlmZjEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9MYW5ndWFnZVJ1bnRpbWVBY2Nlc3NDb250cmFjdEludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzkzYTg5MjZiMmU5YmJmOTM5ZDFhZjVjMTY2OGFmMDU4ODJhZGFmZWJlMjM4ZTEzYzZlNzNmNzVjNTc1YzViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Mb2dpY2FsRGVsaXZlcnlSb3V0aW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxMjQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGE3ZGFlNTQ5OWY1M2M4NTk0NjIyYjU1ZjUyODZmMjhiNzE0MzZkMGU4YTZiZDUxYWRiZTY4MWE1ODcwMDFkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hJbXBhY3RJbmNyZW1lbnRhbFJlc29sdXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk4OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNWRjZGNiNjQ0MmFkNTZkOWI4NTM1MzU3MzhjMDk4MzZjOTc5MjM1NmM4NGZkOWNlYWEwZTQ3NDY3MWE3NWFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaFBsYW5uaW5nRW5naW5lQ29sbGVjdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdhODQ0Y2EzMzhjYjBkZGMwZTk4ODQxZjBlOWY4Njk5N2ZjYWNjZjAyZDVmM2UzMTZlMzJiYmUwZTc3M2E5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hTZXF1ZW5jZVJhbmRvbWl6ZWREaWZmZXJlbnRpYWxUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTM2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2MGIzYWFiZTVlYmJhZDMyNDhmZWJlYzRkYjUyNDA1ZDJkZDRlNmJlOTNiMjNlYzhlZTkzNjUxMTI1MTAzNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoU2VxdWVuY2VSZXRlbnRpb25TdHJlc3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5YTZkMDg1YzdjOTUxMTE1MjdkZTdiMGEwZjhhNmU5Njc0MmRhZmEzODA3NjU3ZDVjNDVhNzRjMjE0ZjY4YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BlcnNpc3RlbnRNdXRhdGlvblBvcnRhYmxlTGltaXRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyZDU2YWQ5YzdjNjdiZDQ2NjIzYjFmZDU0M2Q2MDU3NWQ5OGIyMWJmZTU0Nzk0ZTM3NTM4OTllNzgwMjk2ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BsYXRmb3JtQ29tbWl0Q29tcGFuaW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWZjMjA4YmZiOTI0ZWM5N2MyYTQ2M2U4YmI4NTU2ZDc2NmYyMGEzOGY2ZTIwMWViNmQxZDcwNzc1ZWQxMjhlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qb3J0YWJsZUxpbWl0R2FzUHJlY2VkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGZkMmRmNWVlYmE0MDRlODFkYWI3ZGIzMzIxOGY2NDU2M2ZiNTQxYjdhOTVkNDExNTA5ZmFjNTNkOWI0MmUwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUG9zdEFkbWlzc2lvblBoYXNlRXhlY3V0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzc1Yjc2MmYzNDI4OWIwNjkxZGJhZjQ2OTU2Y2IyMWY0NDJkN2ZhNGU2MjQ5MTBmMzQxOGU5NTJhMGFlNjRhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJlcGFyZWRQYXRjaFNlcXVlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2MwMDkwZjVhOGFlNzFjNzQwYmFiZWM3NjQ4ZWUzYjRmZTU4ODg5ZTJhMWJjMGM0MmY3N2VlMmEyNjc2OTk5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc0VtYmVkZGVkVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5OTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjJlOGU4NTUyMDllNTZhY2JjZGJmZjMxOGNlM2RiZjQ5ZWQ4NDgxZmM2YzEyZmQ4OWM3MWUxM2M2YTk4MzJiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0lucHV0QWRtaXNzaW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGVkNWYxM2EyNGZmMGFiOTVlYzAwNGQ5MGI2NWE3NjA2MzRmNTk0YWVkNzQxM2JlODc4NWVmY2RiNjNkOTE2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ01ldHJpY1JlZmVyZW5jZUNsaS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5M2FiMDg0ZjIzMDkxMjJiNGNmYTE1YWUwMjE5ZWE0ZGRiMjRlYjVkOTlhMDI1NjU1NmQ4ZDk5NzBiYzU5MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdNZXRyaWNSZWZlcmVuY2VEb2N1bWVudGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Yjc4ZmIwZTcxOWJjMzk1ODMyMDQ5ZWFhOGVhMWY4MzQ0MzAwNmY3OTdjOTkzMDM3YzkyYTZmYzA0OTU1ZTM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nT2JzZXJ2ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMDlmYjVmMmIzM2MxMDBiZDBmZTA5ODE5ZWQwODhiNzkzYjRiNzAzZDk2MzE1MTdmYzlmMzE3NWUzYTg0YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdQaGFzZVBpcGVsaW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDBiMmQ5NDlkOWNlMjZlZThlNWFkZWQ5MzU1MTYwNGQ1YTU4ZTAyMWUxNWUyYTA5ZTM2NzQ4MDczZTNkZWE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nU25hcHNob3RCb290c3RyYXBUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOGZkZTRjYzBjNGI4OWFmZDQ2ZTA2NTUxNTMzMmNhNWFiZmVkOWY1ZDg5OWFmYmZlZGFhZTkzM2IwZGQzMjE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nU25hcHNob3RNYW5hZ2VyUHJlc2VydmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NGNmNWMxMTJhYzBmZjFjNDQ1NGIzYjE4NDU0YTczYmYxMTg2ZTUzYTE5NDk0ZjNlNzlkMmMwZDYzZDBiZTI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nU25hcHNob3RQcm92aWRlclBhdGNoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOTIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGU1MTZmZGJhZTUyYmM2MjJmZTEzMjk3Yzg1YWJkMWJmMmRiOThhZjFiNzBkMzlmZjI3Y2Q2NzYyNzZjMGRlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODE2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3MTU2ZjFkNWI4NThhOGFiYjIwMzg2Njk0YTE3YzQ0MWFjODM5YjA1ZGQ2YmIwZWZlNjg3MWQ3MTA1M2YwNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvckxpZmVjeWNsZVNlcnZpY2VzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZjZkYTA2M2Y1OWUwZWRmY2NkNDhiZGYwODMwODcyMDZiZTgzYTY0NTcwZjhkY2FmM2RhZGM4MmI0NTg1YjFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JPd25lZENhY2hlTGlmZWN5Y2xlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjMyNjFhNTdhZDE0YTUyYTFlMzRmMzQxMGY4ZjQ4NzYzYmNjNzUxNTQ5NjQyZjY4MGEzOWUyZGY1NDA1ZTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JQaGFzZVByZWNlZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MWNjMTI2YzBlMjI3ZjU2ODI5NTQ3M2FiNDFhNzkwNmRmODY2NTk4YTRhY2MxZDg5MDgxYWZjOWY5ZmIyOWEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JQcmV2aWV3T3duZXJzaGlwVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1Mjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTZjYzcyMGQ0NDNhZDY1YmM3NGIzMDM4YzU2NTUwMzBkODZiNTU1MWZmYzEwYjY5NWEyNDI5YjQ5Yjc5N2U5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yUHJvY2Vzc0V2ZW50Q29udGV4dFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDA0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmNjIxNjgxNWQzZTBiODhmMjI2M2ZlNzMzZDczMzQ3YjY0OGMxOGI2YjZjYjAwNjFjNWRlMTNmOTNjNDA0MDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvclJ1bnRpbWVBY2Nlc3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg5ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzBkMTdjNjM3MDRjZTJmMDczZTQ5ZjcwYTJkMjdkZDk5YzVhYmY3NGJkNzJkNDBjZWJkMWU1ZTU0YzljZjIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JTdGF0aWNTYWZldHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjdlNzMzZWRmZWVmNzAzNTBmYTg1MDlhMTYzNjQ0YWJlNmEwZTM4NDJjOGQxNWVhN2I2NDJlZDAyZGJhOWM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0U3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhN2VkMmNjN2JkZjA2M2M3ZDM3OTJiZGU3MjBhMGZlMTMyMjI0ZDc5NTRkZmVlYmQ0ZDJiYTRhZjRiNjM3MDBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm90ZWN0ZWRTdGF0ZUd1YXJkVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NDczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmI2YWNhZDFmMWU1NTQ1OTMwMmMwNWVhMjJiODEyYjFlMThkOTc5MGQ2MDhlNjNlNzczMzNkZTFlMDE0MjMzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHVibGlzaGVkU25hcHNob3RSb3VuZFRyaXBUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzU2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllYjYzMmRhNTdmNWQ3ODBkYzJhZDI2NTJlNTIwOTdjMmIxNjYxYjM4ZDI2N2E1ZTNjZGNmNzlmODI2Y2VmZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1JlY29yZGluZ1Byb2Nlc3NpbmdNZXRyaWNzU2lua1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjk1NjRhNjdkNTgyYzc5MDBjMjM4OTJlZmU1MmM4YTE2YTA1OTZkNjc1YjA3MDc5N2FhMmM4ZGIwNmRlZjIxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUmVnaXN0ZXJlZENvbnRyYWN0UHJvdmlkZXJFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDUyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImYxMmYxYjBjOWVmZWI5Njc2YTVhM2E2YjYwMWM0Mzg2Yzc3NjQwNDhlMzM1M2IzYjAzYTc0Mjk0YjU5MjAyODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Jlc29sdmVkU25hcHNob3RQYXRjaFRyYW5zYWN0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NDI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTg5ODJhOTliOWVkODMwZmViNWQxMjYyNjcxMzJjMjk2Mjg1MDNjMGVjNDAwNGJjYjAzNDM1YjdjZjMyZjU4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUmV2aXNpb25Cb3VuZE5vTWF0Y2hQcm9ncmVzc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNiMzkyNzk3NjcwYTFjNzI1MDA3MDg5MGExMmM1ZDk1ZWM3ZWZjZThiNWFmZjY0M2Q1YjVhMThjMGY3YWQwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUm91dGluZ0RlY29tcG9zaXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1M2M0ZDU0MDZmZWRiNWFjNDYzNTBkZmRkMTJhOWJjOGY5ZTkzNTM4NGQzNjU1MjZlNGZhZWZjYzhiNWYzNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVUcmFjZUV2aWRlbmNlQ2xpLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzExNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZGYxOWUwZmRlZjFkMjA5MDNkZjkxODIzNzNiMmI4ZjY2NGJhNWIyYjgxNmE5ODllODhhZDM4N2Q1ZTlmNzU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SdW50aW1lV29ya1Nlc3Npb25Qcm9jZXNzb3JQaGFzZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNlZGNiNjBjOTA4YmEyYTY1MGMwNGVkODY1YTkxNWMwODY4MzkwYTg4NDc0OWFlMTNmYzEyYjAzMjI0YTY1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUnVudGltZVdvcmtTZXNzaW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0OTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjE1YjVhN2RiODAwOTY3ZDM5M2FiOTgxMDI2YzAyYWUzZmZhZjk2OTAyZDBlNjAwNGJjNmYxYzdhOTkwZDgwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUnVudGltZVdvcmtTaGFyZWRCdWRnZXRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJlMzZiNDM5Y2UxYmYxZGU1ZDkyYmQzMjM3MDcyNjNmMzc3NzQwOGI3NTJjNDJkYzE5ZTZlYjhkNjA3ODk1ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlSWRlbnRpdHlFcnJvck1hcHBlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTM2ZGY3MjFjNjA4NDUyNTI1Mjk1YTlmZjE0MDViNzQ1ZTQxOTJiZjhiMDYzOWMwYjk4NzQ3ZWQwNDdkOWM5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVNdXRhdGlvblNlcnZpY2VzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOTZlMWFjYzhhODE2NWE3Mjk4ZGU3OWRhYWExODY1NzNlNGQ0NDE0YTJhYmUyOTkxZTk3ZWFjZmYyNWY4NGU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZVNvdXJjZVByb2plY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg0MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMjUyZTYwODA2OGYyMjQyMmU4ZTA5MTY2MjYwZjY3NDkzMzBjZWYzYTU2OWIxNzdjNGJmYWM1YzgyNDFiNGJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZWxlY3RlZEV4ZWN1dGFibGVCb2R5Q2FwYWJpbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTA4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwODlmNGRkZWEyOGQxM2Y4ZWMzOGQyYjU3ZmE2YTE1MDFmMjRkZWRhODI5ZDZmMTVkMTExZTdiNDBlNzc2YTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlbGVjdGVkRXhlY3V0YWJsZUJvZHlEZW1hbmRHYXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3ZDVmN2U4NmFiZmE5OGNlZmY2ZDg4ZTg5N2E4ZWQzYzgwNTA1MjlkNGFiMWE3MGQyZDE3ZWU1NjBlZjRiNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlbGVjdGVkRXhlY3V0YWJsZUJvZHlQcm92aWRlclByb3ZlbmFuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTZiMmQxMmM4ZGVmZmFmN2NkYjlmYzY3ODIzODA4NjJhN2U4ZDdiNTNjOGRiYmM1OWI4MzFjMDY4YzlhOTE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZWxlY3RlZFNjb3BlQ29udGVudEJsdWVJZEZhaWxGaXJzdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDg1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3Mjk1NGI0ZWYwMGQ4NjZkNWYzMzJiMTY2ZGQ4NmQ3NTUxMzUxOWIwNmI0MTRiNzcwYzg0MDhlYjYxYzBiNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlbWFudGljTG9jYWxpdHlFdmlkZW5jZVdyaXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NDgxZjRhZGM1MTE3NWU3MmE3NjM4NjgwYjVlZjVhZGMzNzJkZDU5NzVmYmQ4NzRjZWIxOThlMGNjZmY5NGEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZW1hbnRpY091dHB1dEJvdW5kYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRjYjIyNGI1YzM2N2QzMjBjZjYwY2Q3MGE4ZjQ5ZjIzM2Q2Y2FiODc0ZTYzMWMzNWQxODNlNjMwMjc3NjZlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VxdWVudGlhbFBhdGNoUGxhbm5pbmdTZXNzaW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTlmN2JlMDQ2NzVmYjkzN2MzM2E4ZGMwMjA2NGNiZjU2MzYzZWQ4OGE1Yzk1YmE3YWFmMWY2NTc2MDYwZTZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25TdXJmYWNlUHJvamVjdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTUyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0OTZjNDhmODgwOGI4ZWZlY2M2ZDk1MWIxN2E0ZjIwMzU2Y2Y2OGRmN2E0Y2NhOTA2OGQzY2I5YWUwNDkxMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvblZhbGlkYXRpb25TZXJ2aWNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjE0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0YTNiNjQzZmZhZGFiMzEzZDhlY2FhMzAwMjk4ZTk1OTM4Nzk0YjI1OGU4ODQxNmNhYTRkYTA3NDNiNTFhYTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnR5cGVBc3NpZ25hYmxlUHJlZGljYXRlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjBhODI5MWQ1ZDBhODNiNTYwYzg3NjUyNGNmZTM3OWM4ZDU5ZWUyNDhhNTQxMjM3MjA0MzM5MTQ1ZTk4N2IzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9UZXJtaW5hdGlvbkNvbmZvcm1hbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzNjU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmRkNTk2Njc5MzA2Yzk3OTk5MThiNzNjYTJiMDNkZGVkZWFiMzg2ZjY1ZThhMDhiNDVmODg4MWI5NWVhNDM5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvVGVzdEV2ZW50Q2hhbm5lbFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzYxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwNTZhODk0Yzk1OTYwNWU2NjRkYmZlNzllZjc3OWNlZTAwOGI5MzFhYzBhNzhlYmVhZjliMjRjMjU1MGU5MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbmZvcm1hbmNlL0NvbnRyYWN0c0ZpeHR1cmVDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjMzIyOTAxMDA5YTNhOWUxYmQwNTI3NzgyZGQ1ZThmYThmNWI2OGM0NTVhOTY0M2FjZTM3NmUyYjQ3NTk3NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbmZvcm1hbmNlL01vY2tFeHRlcm5hbENoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzgxYzg3ZDY5YTFjM2NmMDZmNDA1ZTRhOTAzNGZhYzBkNGUxM2FmOWQ2YzVlNmZkZjYwMDc5YWY1NzE2YTYwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29uZm9ybWFuY2UvTW9ja0V4dGVybmFsQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q4ZGM4N2FiNTI5MTRiYWFlNGQ1Y2I3MDI2Mzk3MzM2M2RlNDVjMDQ2MDAwMDViZDgyNzkxNjNiMzQ0YzUzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29uZm9ybWFuY2UvTW9ja0hhbmRsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmN2NjZjExMmI4NWM5OGJmZDE2ZGZmODdjZDhkNjRhOGUyYzg3OWRlY2Y2ODA0N2FiMDRhYTk1NTE4ZWFmZTY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb25mb3JtYW5jZS9Nb2NrSGFuZGxlclByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjczNTdiNGUwODJiYjMxYjVjYTRlNGYyYmUwN2ZkYjNhNDY3MDU4N2VkMzA3YjAzMDZhMTkzZjhkODM4NTUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb25mb3JtYW5jZS9Nb2NrVHlwZUJsdWVJZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OGNkMDk0YTRjZWI1ZWQxYjRlYjM4YTBhZjgzNWFkOWRiYTE2YmZmOTdkNGE1N2ZiOTJkYTM2MTg0NDJhZDE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb25mb3JtYW5jZS9TY3JpcHRlZENvbnRyYWN0c1J1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjY3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllNDVkMWMxYTYxNGFkOTEyNzU3MmUwODZjNTMxOGVmNDNiNzQ3NGM4OWMxODM2ODlmYzkxYWYwNGJmMDA4MGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9BcHBseUJhdGNoUGF0Y2hDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MGU1MDg2NGIxODUyYTc3YmNjNzlhYmEzYTlhOWQ1YmQ2ZmI5OWJiMzgxMjc5ODhjZjU1YTE1ZmMxN2U0NjAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvQXNzZXJ0RG9jdW1lbnRVcGRhdGVDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNTU5NTFhZTUyZDQ3NmJjMzk0YTcxZjU0YzY2YzU0ZjZiZmIwNTYzOTg2Y2IzZGRiZGMxMDNlNTVkZDYxYzg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvQ3V0T2ZmUHJvYmVDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZmZjOGIxM2EwMDc3ZjY3ZWMxODliNTZlNGJkMzQ2ZWMzZWM5NGM0YWVmZjc2NjI2M2FkMjlhZGM2MGIwNTQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvRW1pdEV2ZW50c0NvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhNTk5YjEyYmFmNzdkZDljZWVjYjk2ZWU3NDAxMjIxMWI2ODEyZjE2ODA2ODkyOWQ3NzBkNTIzMDk5ZTZhNWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9JbmNyZW1lbnRQcm9wZXJ0eUNvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI1NmZlMDMwYTY4OGRjYTM5ZGU2NzYyYWY5NzI2MmM0OTg3ODFjNzdiMWQ0YTE3ZDA4OTA1N2I1ZWI5NTA2YjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9NdXRhdGVFbWJlZGRlZFBhdGhzQ29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzVjNGQ3YzZmZDQyMzdlMWU5NDVjNGQzM2I4M2VkMzU3YTk2MWRiZmIxZGZlMWNhNDQ4YTM1NDllMTc5NDkzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL011dGF0ZUV2ZW50Q29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODg2OTk3YTJjY2I5MDllNDdjN2QxY2M5ZjQ0OTg2YWQ3YTkzMTk4OTFkODNiMzdlNmQ0MzkxNGNiNjJmYzJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvTm9ybWFsaXppbmdUZXN0RXZlbnRDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxYTlmZmQwMGU5Y2FjMmRlNTAzMjRhZTY1YTBhNDA0OWE1YjA2MzI3MjVhZjljYTBhMWQ5NGFhZGZiMzFhM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9SZWNvcmREb2N1bWVudFVwZGF0ZUNvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA5N2M4YzE3OTRiNmJlYWQxMzM3ZWY0ZWFmZDc3MTMyNTAyYmMyNDBiYjE4NzQxMzJiNTBhOTY5ZWM1ODcxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL1JlbW92ZUlmUHJlc2VudENvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZkZTIyNjQwMWFmMTY0MGE4YjkwMjFlMDUzM2U2ZTQ3ZmVhOGIxOGQ3YTYxMjAwNzQ0YWMyZjdmZDBiNWQ2MDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9SZW1vdmVQcm9wZXJ0eUNvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxZTBhMWVjM2UxZDFjN2JiMWNkODc1ZTQwOTkzNDZlMjFmZmZkZTIwNDA1ODI1MmNjMjBjOTVhZTZiNWUxNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9TZXRQcm9wZXJ0eUNvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzNmQ4MmY2NTdmOTI2ZGMwZjMxNWY0MmNkOWZiNWM4NTc0ZDYyYmZkMmEzMzU2NDAwNGZmMzJkZTViYzViNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9TZXRQcm9wZXJ0eU9uRXZlbnRDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTA2OWY3YWE0NWVkN2YyODIyNGYyMGUwYTIwYTRhNmE2M2NkYTUxOGU3MjAxNjVkOTQ1ZjUwMmE0NWFiMjZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvVGVybWluYXRlU2NvcGVDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODYyZmI0MTZjNGM5Yzk1NTM2YWUzMzgxYWU4YjkzNzM1ZDgxZjczYmE0OTY4ZjcyZjdiZGY5MGVlZjFlOGUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvVGVzdEV2ZW50Q2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTYzOTA2Nzc3OTdjYjk5YWMwNDZiOGE4MWViZTkyZTNkNmJlMWYzMWU4OTI4MWNhYjQyOWI2ODc0NWYxODI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDViYmQzYjI5MDI0YmVkZTVkZDg0N2Y1NzI1ODA3Y2U0MDk3NTk2ZTk1YmJmZDg5MjZhYjViMDIzZDFmMTNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9BcHBseUJhdGNoUGF0Y2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOWM3Y2I0YzdjZWE0NmUzZDlhMjUxMTY4NTRhZTUyZWVmNWRiYmJlMjJmNWJkMTA1OTRkMDRlZDk2M2RkN2IwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Bc3NlcnREb2N1bWVudFVwZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYTA5YmZjMDVmMWMzNjAwYjljOGRkNmZlN2IwZmU3ZjcyN2UwMzQ0YjJlMmE2YjIxNTFlYTYzNWY4NmFiZjZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9DdXRPZmZQcm9iZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDFmZDkxYjgxZWVlNmEyMWEwNmNjNjMyZDQwOGIzZTQwMzk3OWIwNmYzYjc5ZWZiMzEyODBmZjczMjQzOTY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9FbWl0RXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTZhZTUxODUzMTI1ODhmY2M3YTk0MWVkNmQ4MWQxYWVlMzhlMTJlYTc0Njg2MGRhMjYwY2Q4OTRiZDFlMDRkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvSW5jcmVtZW50UHJvcGVydHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDkxY2UzZjlhY2I5ZDQxZDEyOTc0ODI1ZGY3YjhlNjk4NzNkMDhjZGQ0NGNlMDM0MDM4NDc0MTBmYTg5YTg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9NdXRhdGVFbWJlZGRlZFBhdGhzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJiNzZhNjQ5YTE0NzczNWU0NTM1NTE3ZjAyODA4YmY3NGQ2NTAyMDQyNzdiOWEzZjg5N2M3OTUxZWIzYjMxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvTXV0YXRlRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NDhiMmEwZmNkZDJiZTY5YmM5NmNjYzQ3Zjk4MmQxNjVlZGFjMjA2NDQ0OTY4OWE5ZDIzZTVlM2NiMjgzMTE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Qcm9jZXNzaW5nRmFpbHVyZU1hcmtlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkYjUxYThlZTk1MmE0Y2E5OWJjMjQ5N2I2MjYzNDFhZDIzOWUyMzY0MTkxYjg4ZWJhY2Q3Y2Q4YTgyZTg3YmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1Byb2Nlc3NvclRlc3RUeXBlQmx1ZUlkcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmE0NTlkNzU3ODQ3ZDUxNjZkNmQ0ODg4MmUzZDgxYmU5ZGQ1MWJjYzExYjNmZWIwOGQ2MWRiOTQ0MDAzMGE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9SZWNvcmREb2N1bWVudFVwZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImY2ODQ2MmNhZTkyMGFmODgwMjE1MWQ1NzQ3M2Q5MjEyYWI2MWJlMGEwNDQxNTZjYzhiMDI5ZTA1OGUxZmZiYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1JlbW92ZUlmUHJlc2VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY5MWE5NTY2OTVlOTRjZmUzYTc1Y2VjNDRjYjZjZTE2MDE5MzNiYjRjM2U4ZDkyZDEyNGEyZjc4ZTI1MzE0ZTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1JlbW92ZVByb3BlcnR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTc1MDU4NzIwMTgzNGRmOTZjOGZkMjdlZjRkNDRlZmRiMWQ4MDE5M2Q4YzBiMWQ3NmFmZTA0MDk5MzlhNWIyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvU2V0UHJvcGVydHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOTZiZTIwNjkxMGZlMTBmZTM2M2E1OGQ2Njk3OWExY2QzODQ4NzgyYjkyMTk2YmZjZTI2OTkzZDY3ZGQyZGMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9TZXRQcm9wZXJ0eU9uRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDNlOTlkYTY4MTFiODlkZmFjYWQwNGUwZmY5Mzg4NmFhMDRlM2ZhNDhhZmYzOWI1Y2I4YjAzMzdkM2YwNzZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9UZXJtaW5hdGVTY29wZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjZGNmZDM2YjIzOTlmOGJmNjgwMTRlZjUyOTQ5MWE4ZDYzNTExMzA1YzUxN2I0ZTAyYTI1NzdiNjY5OTU0YmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1Rlc3RFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzFmZjY0OWU2MzMzOGEzOTBhZTFkZDk0N2FiMGZmZjJkNmQyZDczZmMwOWYyNmI2OTRhYjRmYjhlODc2Njg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9UZXN0RXZlbnRDaGFubmVsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjY5ZmYzNjFkNTQ0Y2EzOTg2M2U3ZGMwZWM5ZGE5ZWQwMTlkNzI5NWJkNWVhZmFlZTNkN2UyOTQzZDNhZTRjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvcmVnaXN0cnkvQmx1ZVJ1bnRpbWVUeXBlUmVnaXN0cnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzM4YWRhODRhYThlMjgzMjBkMjg3YWZiZDNiNDg5YTUyMWVlOTE3ZTkzZjI4YjIzMDRhODBkMjY0NzI4YjE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci91dGlsL1BvaW50ZXJVdGlsc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDU3OWJiMjg2OTc0OWEwZDBlMmM4YjhkMmNhODQ3NzIyOTJiNWI1YTg2YmU0YTZhZmIzYTcyYzdjYjEwMTdjNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvdXRpbC9Qcm9jZXNzb3JQb2ludGVyQ29uc3RhbnRzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDg3ZmI2NmVjMjM0YzU5ZDFiZDhmM2U2YmEwN2U3NWNhZjUxNjYyZTQzN2RjYjZhODJmOWRhYTE1MGY0ZGMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0Jvb3RzdHJhcFByb3ZpZGVyVmVyaWZpY2F0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNDJkZTY3NjcyMWRmMWJjMTQ3MTRlNzc0OTNhMmJiOGQxZTU2MDViMzYxZGE1YTYyOGU0M2MzZTZkNTMyMzg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0NhY2hpbmdOb2RlUHJvdmlkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTE4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzMjBiMjRiNDQ2ZThlMTQyNWQ4MmNiMzViMGFkYjEwZWQwMTY4MzQ1ZjZjOWRlZGZlMDMyNTAzNDFhMzY1MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvRGlyZWN0Tm9kZU1hbmlmZXN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDQ1NTVlOTBmNzIzZDk1ZjdkZjNhMDk1NDc2ZGUyNzQ5NzIyYTkyMzhjMzY4MWJmZTdlNDExODhjMDIwNWRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0V4YWN0Tm9kZUdyYXBoRnJhZ21lbnRzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MzUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmMwODk5MDIwNTQ3OThmNzZlNmNiYWEyYmFiNDYzYWFhMTc2YmVlZjE1ZjEyYzBlODI4ZGNhMjRjNDA2ZjMwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Ob2RlUHJvdmlkZXJXcmFwcGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYTZmNjIwY2UxY2RlZTRkNzE5MzUzMGFiYWEyMmYzYzY5ZTYzMDFjODc0NjA5MjVjYjEyYmEwYzdlOTFhMTRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1Byb3ZpZGVyQ2Fub25pY2FsSW5nZXN0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE5MjI1ZDE1MDNhNTI3NWVlNTczMDY0ZmNjNDNmOGZmMTY1NTUzMjFkYzYwZWVhMDQ3ZDE5ZmM2YTc0OWVmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Qcm92aWRlckV2aWRlbmNlVmVyaWZpZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3M2UxMzNiNDNmNTY3NzQyMmVjMGQwZmE5OTRjMDllNjBlMzZhNTBmNjYwNTIyM2E1MWRhMmZkNjU0ZGVmZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvVHlwZXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTEwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmZWVmMGE3ZDBkYjBlMWZjNzFjNzg1YmNmNmMyYWVhZDYwODcyNTE2NWFjNmU4ZjAzNWRjMGI4ODhmMWRmMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvVmVyaWZ5aW5nTm9kZVByb3ZpZGVyUmVzdWx0U2VtYW50aWNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTczNmM0NTZiOWYyNTllZWMwMzllOGYzZDE0OGI5MjljZDU2MmIxZDYwYzY5MGY1ZmI2ZWE4YzZkMDJkMGU5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9pcGZzL0JsdWVJZFRvQ2lkVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmYxYTE5N2Y0YmQ0NDlkODIxZDNkZWEwMDRmNWQ4ZGIzYmY3OTJhMjczMzNiN2UzZTM1NzA0MGMyMGRmY2NiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L0JsdWVDb3JlVHlwZVJlZ2lzdHJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZTkzNmRlYjA4NGQ0OTI0MjE3NmVhNzJmOGFlY2ExMmEzYjUwMDM3NWY2NTVlMGU3Yjg3YzJmNWYxYjE1YjYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvTm9kZVRvUmVzb2x1dGlvbkxpbWl0c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzFhYTgxNDFkMmMzMzBmYmU4Y2ZlMDRlMGFiZTJiZGZjYTc5NDI4ZTdhNDQ1NTNkYWEwMThiYWQ1N2JkMDliNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL1Jlc29sdXRpb25MaW1pdHNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODE1OTNkODFhZGQ0NjA1Y2RmMTMwNTA0NjEwOTQyNTcwZWMxMDI0NGMwODA0Y2VlOWNlNmI2NTAyOGU0MzZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvVHlwZVNwZWNpZmljUHJvcGVydHlGaWx0ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzUwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImFjNGY5YTU5ODc0NzRiZDUzYzdjMjFlNjNmNDY1MTA0MDcwMWEzZTk0NWVkYjlkYjUxYzY0ZjY4ZmM0MTI5ODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9CbHVlTGFuZ3VhZ2VDb21wb3NpdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDIyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVjOWE1YjRkMzFmNjkyMjU4MjE3NzllODcwMWMxM2Y5NWNlYWVlOGYxMmI1ZmRkNjYwZWRiNzhmNjkyOGY2ZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9XZWlnaHRlZExydUNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZGVhNzVjOTBkMDI4OTJiYTY2NjY2ZmEyNWE4ZWQ1OGYxZTU3NDMyMDMyZTdiNDUxNTAzZmE5MDRjYzMwYjNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NhbXBsZXMvaXBmcy9QcmludEFsbEJsdWVJZHNBbmRDYW5vbmljYWxKc29ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWY2OThjZTQ2Y2Q3MzE0NWVjMTI4MTA2NGY2YjczNWE5MzQ5M2U1NmZkMDAxZjNmYTUyNTBiZjNlZDRjMGFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NhbXBsZXMvaXBmcy9SRUFETUUubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlMjI1YjVmZWJhMmQ1NGY0OTU1MDkxZmM1YTdlNTU1NjI1ZDY1NjA4OTI5ZDBhOGNiNmMzMzlhYTNmMjY1N2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc2FtcGxlcy9pcGZzL1NhbXBsZTFQcmludC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjMTdmZjQyYTkyOTExYTU4OWVlYWQwMmZmNGY2NDI3MDFlYTBmYTMxMmJjZDdhNDAxMTkxNTIwMWVmODlhYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc2FtcGxlcy9pcGZzL1NhbXBsZTJSZXNvbHZlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2U1M2M1NTFhNDQyNGQyZjU0M2ZlYjhkYzA0OGY5ZGFiOTFiOWIwOTlhM2I1ZDYwZGNkZWQyYjUzZTZjZDQzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zYW1wbGVzL2lwZnMvYWRkLXRvLWlwZnMuc2giLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzZjYTQwZDI0ZTI5NjdiZWNlNDQxMDljZWQyZTkwYWRkNWU0OWZjNGU3NjEwOTEwOWY4ZmRmMTMxZGNkZTUxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zYW1wbGVzL2lwZnMvaW5wdXQudHh0IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiMmU0ODNhOTRjMDFhN2QwNmI2NGFjMzg5NDQyYzRhYjNhZTliN2JmMzI4YmIxNTc0NzczM2QyNTA4ZGFjZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc2FtcGxlcy9pcGZzL3NhbXBsZS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTMwODllZTU3ZWZmYTQ3YWRiMWRiNmFiYTVhNzBiZWUyYzU1MjFmYjRiYjdkNzVjYmJjZjIxYTQzNGQxMDMwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9DYW5vbmljYWxPdmVybGF5UGF0Y2hFbmdpbmVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWMwYzZhYWU0MjI4ZDk0M2EyNTg4ODI5YTFlMjExNjAzNzNjZTExYTUxYzhmZjFlNWRkYTdmMjhlYWZmNGRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbkNhbm9uaWNhbERpZ2VzdGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NDc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWZjNzUwMThmNTdmMDY0NDA2MjQxNjdmOTY3YzFlYjg0NGI4Y2NmMWY2ZGE1ZmYzY2NmODUyZDkwZTFhOGIxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlRGVjb21wb3NpdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNlNTg2ZDgyZDBkNWI3ZjU5M2YwYTI3ZWQ5YzM2NmM0MjdiYmFmMzdhMDRlZjQ3M2UzNGZjZWRjMDYzOTc1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlUmV0YWluZWRXZWlnaHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1OGE2MzhkOWY5ZWI3MmNhMjAxYTYyZDYzZDkzN2RhN2Q5NWMyNWY3YzZkYzZjNzQ3MDAwYTE4Y2VkYTJhYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZVN0cnVjdHVyYWxJbnRlcm5lclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjg3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5NWZhYTI0NDU4OTFlODFmMzEwZTBmOGQxMTgwN2I2YzVmNWFkYmRkZDQxMWIzN2RjNzgyNDZlMTBiYTgwZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzkxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjMzE5NjkxMGY1MWM0YmI3YTJkZTExNzgxNjAxYzIyMmMwMThmYzIzNTk4MTAzY2ZiMTU0OTU0Zjk2YTIwMDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvdGVzdGluZy9SZXBvc2l0b3J5TGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk3ODU4YjdjMmE2YjkxZDk5YjExZjllMzE1ZWViMzIzNDVmYmFjZDE4MzZlNWUyOWE3YjQyMDQ5OTgwM2FlMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvdXRpbHMvUHJvcGVydHlOYW1lTm9ybWFsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOWU1NzQyMDRkNTgxNjEyNzQwMmU4ZDE5YjUxNjZkYmE0M2Y0Yjk5NDc3YmVlN2QzYzk2NDQyM2QzYmVkNTQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3V0aWxzL1JhbmRvbU1lcmdlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhYWZiYTEzYmQ3MzkwNzc1YmZmODIzY2MxNmY0OTc3ODNmZjFhYmJlYjBhMWQzYjM3YzA5ZWE2ZGMxM2RhNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcHJvY2Vzc29yL2NvbnRyYWN0cy9hbGwtY29udHJhY3RzLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzZTI5OTY5YmMzNGFkNWViNGJlOWJmNGQzODNkODI2MzU5NmZmNGU0Yzk1ZmMxOGUyMWM4NWY0NDMxZmNiMzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjkwNjYxNjJjY2M1MWE4YWFlNGNjMmI1ZjhlNWJjZTMyNGUyZTY3YWY4MmVjMGMxYzFmYjhiN2I4ZDM1OTcwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzLzEuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlN2QzNTQxYTZiYzAwYTMxNmJhZjcwZTFiYWE1NGI0MTAwMjM3ZjkxODk2ODY4MjNiMjJlZmVhMjY2NDJiYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy8yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NTRiNDI4MzI3YWI5ZWM5NGVlMzgyY2Q5YWQwYmJiMjA5NjY3NzllMTZhMDdlZGIxNTNiNDk0OTJkYmRmZjE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDgxMWFkZmMyMjUyYmQ0ZGEwNWNiM2JjOGM1ZGI1ZTVkNTg4NjhhY2RlZTU2NTlhOGI2N2Q2MGViNWZkYWRhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL0RldGFpbC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWViOWRjOWY3MGExMmMxNjUyYjE0YTQ3ZDBkMjc2MWFjNzFiM2IzOGI5MzAyZGQ2YjJlZTAxYzA5NzhjZjVhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL0hhdHRvcmkxLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmJiMDgzZjA2MjQ0NGFlMjNjOGIzMmZjMjdkMTNhN2U1NWM5Y2Y5MjJjZGI1Zjg5NzYxMTMyOWU2NDc2N2NiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL0hhdHRvcmkyLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxZTAyMDExNDZhZGQ2ZDg2ZDAxYmI0MzExZTFjZDRmNTQ0ZGViY2Y5MjI1OTU5ZWZjM2Y0ODFkZGU5ZTVkYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9IYXR0b3JpMy5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1MjQyOWEyMzYyOWM4MWQxMWNhYzY4ZGU5ZTg1NGVhMzUxZjM5MDA5ZGJlNjU0MjRiYTNmNDA1MTc5ZTdkNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9JbmdyZWRpZW50LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjMwZDhiYTE5MWU1Nzc4YTQzNTUxYjMyMTFkZjE0NDIyZGQxNjVmNWU3NWRmZTFlNmRjZjlhNmUzMDg4MzM2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL0xpbWl0cy5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjMTk5NGQ5YTFiYTEwMGVkMDA3MTkyODNiYjQyYzc5NTkyN2Y5ZmQ5ZTMzNTcwYjEwN2M1NDhiNTA3MmUwNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9QZXJzb24uYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MmY3ZjcwZjllOTBjNDE1OTFjNDY3NTc0YzEzZDUyZjM1MDBiNmE5NWUwMTk0MWNhYjMyYjdmZDBkNWNlN2E4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvUGV0LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI0ZTc3YmYxMDMwNGExZWI3MDg5NTJkNmRkMDNjYjA5ZTllNzczMTZmZmRhMjBiMGE5YzNjODFlYzllMjk1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL1ByaWNlLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNjg5NThhMDMxMjUwOTg1OTM4YjcwMWNiMTQ3YmUxMjlmYjBkMjg0NmNjYjEzODZiZmRjYTEyYjgzMDRmZGZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvUHJvZHVjdC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1OTM3ZTA3ZjkyMmM3NDk2NTgzNzQxZjcxMGY2YTA1NTMyYjQ0OGU2MTUzYzkxNzBkN2ExNDVmZDk3MTZmZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9Ub3kuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNWIwNTc2OGJjM2NiYjgyZDljNGIzZjg1NWE4NmY1ZjI4YzVhNzY5MDBiZmQ4ZjExZjI0NmQ0Mzc4YjMxMzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgInNoYTI1NiI6ICIzMGI2NzM3OTMwODRkZWQ4MWY4YWJmNzMzMTVkNmIwZDk4YzhmMDAxMzk5ZmJiNjY4ZDYwNTQ2YWRlOWU3MjE2IgogICAgICAgIH0KICAgICAgfQogICAgXQogIH0sCiAgImJpbmRpbmdzU2hhMjU2IjogIjA4MWVkN2Y5NTY5NmFjYTc2ZTZiZjQ0ZjY5N2M4MzIzYTgxZjZlNWU2OGE3OWIzMGRlNjI4MmQ1NjUzN2ZhNzciCn0K", + "completionLedgerBase64": "eyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjEsInBhaXIiOjEsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDI6MDYuMzQwWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjAyOjMwLjg2MloiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMS5qc29uIiwicmF3U2hhMjU2IjoiY2JlZDg4MDhhNTFmOTk4OTYwNTQzM2RhNTlkYWFiNWZlMTQ4NGRhMTYyYmZjZGY0OTkyN2I2OTgyM2Q3ODc2ZSIsImNhbm9uaWNhbFNoYTI1NiI6IjRhMWUxZjBmMjcwMjNhZTE5NjcwY2U3MWJmZjFjYzgwZjA1Mjc3MjNjZGRlMmU1YmRlYTU0ODczOWM5ZTVlNzciLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6bnVsbCwiZW50cnlTaGEyNTYiOiIzODhmNGFmMjc3NjAyOTlmYzE4YTQ1ODE4OTg2ZmZmZGU3MTczZGI1NGNjOTg3YWViZWFhNzljYmIyYmZlOWI2In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjIsInBhaXIiOjEsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjAyOjMwLjkzMFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowMjo1My40NjNaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8xLmpzb24iLCJyYXdTaGEyNTYiOiJhOGYzNWQ0MjQ4NTc2NGE0MDBmODUzMzI5ZjgxZjM0NWNjYzAxMjA3MWNhZTI3YTllMGQxNGFhZDVkM2VlZjczIiwiY2Fub25pY2FsU2hhMjU2IjoiY2MyNTFlODJiZWM1M2NhN2ExYzRmMmE3NmMyZDJhNDJhMTc0OWU0ZDZmNTNiYzgwM2IzYjEwZmE4NDcyZDQyMCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiMzg4ZjRhZjI3NzYwMjk5ZmMxOGE0NTgxODk4NmZmZmRlNzE3M2RiNTRjYzk4N2FlYmVhYTc5Y2JiMmJmZTliNiIsImVudHJ5U2hhMjU2IjoiYTc2ZTAxODAxODQ1OGI5MjdiMjZjYWFhN2U2ODVkOGViMmIxNjQ1N2YwZDg2YzZlYzM1MzhlZWU1NDIzMDNiNiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjozLCJwYWlyIjoyLCJ2YXJpYW50IjoiY2FuZGlkYXRlIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowMjo1My41MjhaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDM6MTUuODkzWiIsInJhd1BhdGgiOiJjYW5kaWRhdGUvMi5qc29uIiwicmF3U2hhMjU2IjoiNmEyMGIwMjViNmU2NTdlMjM3MTk4MDIwOGI4MWJhZjNmM2RiYWNjM2E5MTE5YzY5NWRjYjFlNzBjYjhmOWI5NiIsImNhbm9uaWNhbFNoYTI1NiI6IjQxYTEyNmJkYzk3OGJhMDM1OTgzMTEyOTE2ZWI1NWI4N2E4NzY2ZGY3YTI0ZjI0ZWMxN2RmNmU3ZDZiYzM3YmQiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6ImE3NmUwMTgwMTg0NThiOTI3YjI2Y2FhYTdlNjg1ZDhlYjJiMTY0NTdmMGQ4NmM2ZWMzNTM4ZWVlNTQyMzAzYjYiLCJlbnRyeVNoYTI1NiI6IjUxY2MxNjBhMGRlZGJkYzFlZTVmYTk4NmYyOGU2MjhiZGFiNGEwYmJlYThjMmQ0YWJlMDJhZDE0NmZiMTRlNjEifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NCwicGFpciI6MiwidmFyaWFudCI6ImJhc2VsaW5lIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowMzoxNS45NjBaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDM6MzguMzc0WiIsInJhd1BhdGgiOiJiYXNlbGluZS8yLmpzb24iLCJyYXdTaGEyNTYiOiIyZDcxMGUxOWNkYzY2YjZiZmE2MTEyODZjNDg2NTAwYTdmZmZkMTJjOTNjNjEzYjY1YmRkNjk4NGUyZDEwOWVkIiwiY2Fub25pY2FsU2hhMjU2IjoiZjg4OTA5NTlmMDYzMjJkZDhmZjA3NTIyZmM4MGI5ZWFlN2RhYzNlZjgxNzAwY2E2OWU5NTkyNDc5ZWU5YzJmOSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNTFjYzE2MGEwZGVkYmRjMWVlNWZhOTg2ZjI4ZTYyOGJkYWI0YTBiYmVhOGMyZDRhYmUwMmFkMTQ2ZmIxNGU2MSIsImVudHJ5U2hhMjU2IjoiNjkzMTBiMGI5NjgwM2M2MTAzMGEyMjk3OGFjNDI3N2ZhMzNkYzg4MzlmNGEwMTExZDJmNzkxODU2OGU3ZGU0NSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo1LCJwYWlyIjozLCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjAzOjM4LjQ0M1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNDowMC42NjhaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzMuanNvbiIsInJhd1NoYTI1NiI6ImFhYmIyZmM5NTRmNjcwOWQ2ZWMzODI5MWQ1ZTg2ZGIzYzk4MDE2MDA1OTJmOTMzNTllMjA1OWM3M2M0M2E5M2EiLCJjYW5vbmljYWxTaGEyNTYiOiJhZGJhN2NjYjUzYzdiNTVhMjgxNDZhOGZmNzEzMjk1NzUyNTRjMzYxMTg3NDdkM2UwZGNlODVkNWJiYzJlNDgxIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI2OTMxMGIwYjk2ODAzYzYxMDMwYTIyOTc4YWM0Mjc3ZmEzM2RjODgzOWY0YTAxMTFkMmY3OTE4NTY4ZTdkZTQ1IiwiZW50cnlTaGEyNTYiOiI5ZjNmYmViMjBkZWExZGRlNmQ1NzE3ZjFkNGU5NDQ4MjI0YTYyMzcyMzRiYzZhZDdhMmJmYmU5NGQ4N2ViMzZhIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjYsInBhaXIiOjMsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjA0OjAwLjczMloiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNDoyMy40MjZaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8zLmpzb24iLCJyYXdTaGEyNTYiOiJlMGY0NDVkOWNlNTdmZjE2NGRjNDIxMThlNDMwZWZlZGU2MzYxZGYxNDQ2ZjdiZTViNTFjNjE1YjhiOWQ3YWYzIiwiY2Fub25pY2FsU2hhMjU2IjoiMWIwZGU5OTQyMDQ0NDkzM2Y1MDc5MDEzMzg2NmRjNGU0MWI0Y2Y3NGI2YjkxNDAyYTlhOTBjMzM3NmI1OGE5NSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiOWYzZmJlYjIwZGVhMWRkZTZkNTcxN2YxZDRlOTQ0ODIyNGE2MjM3MjM0YmM2YWQ3YTJiZmJlOTRkODdlYjM2YSIsImVudHJ5U2hhMjU2IjoiNDdkNzI5NWMyNTg3MDY1Mjc0NzU0ZDgxMWQxOThlOWY0OGE3NjY5MTA0ZTljY2JjMjU3NmNlY2VjZjU2OTc4MyJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo3LCJwYWlyIjo0LCJ2YXJpYW50IjoiY2FuZGlkYXRlIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNDoyMy40OTNaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDQ6NDYuMDE1WiIsInJhd1BhdGgiOiJjYW5kaWRhdGUvNC5qc29uIiwicmF3U2hhMjU2IjoiM2FmNWVkOThhZGQ2NzU3ZGRjMGNiMWVmZWFmMTRlMTZkNmEzM2RhZmNiZmI4M2U1ODgxYzU5OTgyYWU0MDgwNiIsImNhbm9uaWNhbFNoYTI1NiI6IjM0MDYzNjliYjBkOTBkZWZhNjU3YmU5NWU5NmUxYmEwOTE0MTcwNTFjNDI0YThjYTE5ZjAzMTM2ZDg2NTliZTUiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjQ3ZDcyOTVjMjU4NzA2NTI3NDc1NGQ4MTFkMTk4ZTlmNDhhNzY2OTEwNGU5Y2NiYzI1NzZjZWNlY2Y1Njk3ODMiLCJlbnRyeVNoYTI1NiI6IjU3NTJhMzMwMmNkYTI5NWZjYTYyZDZkMDA2ZDIxM2YwMzY4Y2U3MDcyMjU2ODE3MjBhNjA2ODRlMzE0ODE2MDcifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6OCwicGFpciI6NCwidmFyaWFudCI6ImJhc2VsaW5lIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNDo0Ni4wODFaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDU6MDguNTMxWiIsInJhd1BhdGgiOiJiYXNlbGluZS80Lmpzb24iLCJyYXdTaGEyNTYiOiJjZjlhMzY4MDEzYjM1OWExNjY5NTI0NDQxMWQzOWRmMjM3Yzg5YTJhMTNlZDk3MjRlNmI5NWNlM2Y5NmU3OGUzIiwiY2Fub25pY2FsU2hhMjU2IjoiNzM0NzNmZWEyNDQwODI4YmMyYjQyMjAwNTQ5NzU2NTcwMmE4ZDEwMjY3YjEyODA1NzMxYmUwYmQ3NWNmODAwYyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNTc1MmEzMzAyY2RhMjk1ZmNhNjJkNmQwMDZkMjEzZjAzNjhjZTcwNzIyNTY4MTcyMGE2MDY4NGUzMTQ4MTYwNyIsImVudHJ5U2hhMjU2IjoiMjVmMDJiM2JmNmNiZDk2NWFhNDM2OTBjYzNkMGJlMGU0YzdiZGQ1ZTg0YTBmM2NjOGQwYzllZDM1MjYxMGI2MyJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo5LCJwYWlyIjo1LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjA1OjA4LjYwM1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNTozMS4yNjBaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzUuanNvbiIsInJhd1NoYTI1NiI6IjE2ZTcwMWQwMDg2YmNiYjA0NjhmZTE2YmQ1ZGNhZDhlOGI4YzZkZjdmZGJkMmY3ZTYwYjM5ZjlkYWVmMzgxNjciLCJjYW5vbmljYWxTaGEyNTYiOiJmMTJlZjkzMGUyNmQ1NTFlZWQ4MzJkYzIzMzAwMzIxYjhiYTIyMjRhZTE0NTEwMDUzMTI2NjI3ZmYzZTI3YjU1Iiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiIyNWYwMmIzYmY2Y2JkOTY1YWE0MzY5MGNjM2QwYmUwZTRjN2JkZDVlODRhMGYzY2M4ZDBjOWVkMzUyNjEwYjYzIiwiZW50cnlTaGEyNTYiOiJlZWM1ZWZiZmI3MjY3ODg4OGNhYWRlMDQyMTkyYzllNjU0YWIyYTgzNjgxNGY2NWY3MjA0NmEwYzI4NWE4YmYxIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjEwLCJwYWlyIjo1LCJ2YXJpYW50IjoiY2FuZGlkYXRlIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNTozMS4zMjhaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDU6NTQuNDM4WiIsInJhd1BhdGgiOiJjYW5kaWRhdGUvNS5qc29uIiwicmF3U2hhMjU2IjoiOWE0MGQyMWU1Njk3MjYyYTZkMDhmOThlM2EwMWUzMTlmZWYzNTc3YWYzMzIxZWQwODYzMGQ3N2M0ZmZjYTc2NiIsImNhbm9uaWNhbFNoYTI1NiI6Ijk1Yjg3NGE4NTk2Mzg1OGUzOGU3ZjdlZWQ0ZWE1Y2U5MzRiZGMxNjBkODZmMTIzYjQzMWNiNmNjYzNmZWQ0ODEiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6ImVlYzVlZmJmYjcyNjc4ODg4Y2FhZGUwNDIxOTJjOWU2NTRhYjJhODM2ODE0ZjY1ZjcyMDQ2YTBjMjg1YThiZjEiLCJlbnRyeVNoYTI1NiI6Ijk1NmIyMDc0OGU4NjE4NzU1OTI2MDFlYjM1MzkxYmIyM2EwMWNhNjRkMzU3M2M3YjY2ZjEyZGJkNDRhMjE2ZGMifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MTEsInBhaXIiOjYsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjA1OjU0LjUwNVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNjoxNy4zNzNaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS82Lmpzb24iLCJyYXdTaGEyNTYiOiJkMDRjZTAyNmRiZmZlMDQwOTkyMWRjZmEwOWU3YzJlYzA1MzdiMmNhYzhjNTAwYWE4MTVjNmZhMGE0NWRhMjBmIiwiY2Fub25pY2FsU2hhMjU2IjoiY2JjMzYwMmIwNWYwNGVkYWJkZDI4NjUzNmEwYmZkOWZjZGZmYWJlMGU2Njc3YWY1MjcxMTBmYWE3MzVlNjA5MCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiOTU2YjIwNzQ4ZTg2MTg3NTU5MjYwMWViMzUzOTFiYjIzYTAxY2E2NGQzNTczYzdiNjZmMTJkYmQ0NGEyMTZkYyIsImVudHJ5U2hhMjU2IjoiMDkwMTZiYmUzYjQ5MTkyZGJmN2VlNzRkMzU5MTliZTkwMWJmMzg5NjZkZTY5ZmUzYjNlZThmOGZmZmZlYzJhNCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoxMiwicGFpciI6NiwidmFyaWFudCI6ImJhc2VsaW5lIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNjoxNy40NDRaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDY6NDAuMzQ4WiIsInJhd1BhdGgiOiJiYXNlbGluZS82Lmpzb24iLCJyYXdTaGEyNTYiOiI4ZTNmMTRiMTM4MzNkOTcxOTA5NmZkODRlZjRlZThjMmJjNmY3ZDBkNTAxNWJiMTg4ZmI1NWNjMzA0YWE3YWM0IiwiY2Fub25pY2FsU2hhMjU2IjoiMDgxNDEwYWI0MWJlNzI4ZDk4ZWVlMmYzMjQ4MDM3ZGU3NGVjZWQxNzczZTlhMTE5NGJjMWIwN2FiY2NkOTQ0NSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiMDkwMTZiYmUzYjQ5MTkyZGJmN2VlNzRkMzU5MTliZTkwMWJmMzg5NjZkZTY5ZmUzYjNlZThmOGZmZmZlYzJhNCIsImVudHJ5U2hhMjU2IjoiOGM4MjFlZDQyYjc2MTRlZTM2NWYxMGQyZDQyMjgxM2Q5YzUzOWI4MDM2OWU1ZTg5OWJkOWI0OTJhZGM2N2E2ZSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoxMywicGFpciI6NywidmFyaWFudCI6ImJhc2VsaW5lIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNjo0MC40MTVaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDc6MDMuMDY1WiIsInJhd1BhdGgiOiJiYXNlbGluZS83Lmpzb24iLCJyYXdTaGEyNTYiOiIyNWE4OTdiZmVkZjExMzY4MTY4OTg4NGIzN2NjNTlhOGJjOWY0YWIyYzM4ZDAyZDlkNGExMjgxOGI1MzJhNDYwIiwiY2Fub25pY2FsU2hhMjU2IjoiMTNkMWQxMGM3YTc2ODJkYTZiMGQ0ZDc0MTZjODQxNmM0ZTI3MzdhOWZlNTRhNTM5MTJjNjY4ZmJiNmFhMmNiMSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiOGM4MjFlZDQyYjc2MTRlZTM2NWYxMGQyZDQyMjgxM2Q5YzUzOWI4MDM2OWU1ZTg5OWJkOWI0OTJhZGM2N2E2ZSIsImVudHJ5U2hhMjU2IjoiOGIxMWExZjYzNDYxMDJjMjY5ZjUxNjNkY2U2MDc0MDc5NDE2YjU4YzRkMWQ2OWRmN2E1ODc2YjQyZWQ3YjhiYiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoxNCwicGFpciI6NywidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDc6MDMuMTMwWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjA3OjI2LjIwOFoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzcuanNvbiIsInJhd1NoYTI1NiI6IjA5OTViYmM3NzFiYTA0OWYyNWRhOGYyZTMwZmJkYzUzZDBhZWNlOTJkMzMxZDJmZjJkMDhhMmZjM2ZkOWIwMDkiLCJjYW5vbmljYWxTaGEyNTYiOiJiNDZlZGJlNGY5MTU0MWUwMDc0OWRkMTA5MWZjOGE4YmZmY2YzMDk0NjYyMDk4Y2IzYTk0YjY5NzdmOWE3YjdkIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI4YjExYTFmNjM0NjEwMmMyNjlmNTE2M2RjZTYwNzQwNzk0MTZiNThjNGQxZDY5ZGY3YTU4NzZiNDJlZDdiOGJiIiwiZW50cnlTaGEyNTYiOiIwMTEwZmUwZTU4ODBkMzRlMTc3ZDAxZWRjNmM0ZWNkMWY3YzMwYjc5MzFjMzYwMjUzNmY0YzAyN2Q5NjFiNTk4In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjE1LCJwYWlyIjo4LCJ2YXJpYW50IjoiY2FuZGlkYXRlIiwic3RhcnRlZEF0IjoiMjAyNi0wOC0xMVQxMjowNzoyNi4yNzRaIiwiZW5kZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDc6NDguNzYzWiIsInJhd1BhdGgiOiJjYW5kaWRhdGUvOC5qc29uIiwicmF3U2hhMjU2IjoiOTQ4NTRmYjFkMjFkNjUxZjg0ZDg3NGIzMjY0ZWY3OTNmOTc1YmNhNGZhYzNiZTQ4NWZmNmVhZGM0M2I2ODlkNSIsImNhbm9uaWNhbFNoYTI1NiI6Ijc3MmYwNWViZTZhZDFmMTExZjYyMGZhNDM4YjI3M2YxYWFlNDk5MmJiMjg3MTIzYTJhMWY0MWFmM2Y3ZmNiOWEiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjAxMTBmZTBlNTg4MGQzNGUxNzdkMDFlZGM2YzRlY2QxZjdjMzBiNzkzMWMzNjAyNTM2ZjRjMDI3ZDk2MWI1OTgiLCJlbnRyeVNoYTI1NiI6IjQ0Zjc3MGM3OTdkODU2YzA4MTkzOTEyODBmYjhjNzkxZDA4MzA4NzBjNThjZjgyYzVjNDU0MDQwZjQ2NWU3OGQifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MTYsInBhaXIiOjgsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDc6NDguODM3WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjA4OjExLjA5NFoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvOC5qc29uIiwicmF3U2hhMjU2IjoiOTdlZTQ5Njg3YmZmMWEyN2M0OGY5ZWI0OWFlMGVmOWE1MDA4Y2EzNzI0YmRlMzBjNTM3ZTAwNDc4NWFkNmFiNyIsImNhbm9uaWNhbFNoYTI1NiI6IjVkMjA4YzcyNTRmZjk3OTkzYWQ5Y2NhNDFmOTlhZDQ2MmJiMDRhOGMxMjhmMTY0M2ZiYzIwNzQ5N2QzNzA2YzAiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjQ0Zjc3MGM3OTdkODU2YzA4MTkzOTEyODBmYjhjNzkxZDA4MzA4NzBjNThjZjgyYzVjNDU0MDQwZjQ2NWU3OGQiLCJlbnRyeVNoYTI1NiI6IjZkMzI4Njg1OWIwMTQ2ZmI1YjI2NDcxN2IzZDc3NTQxNzZhM2Q1MmY2MmE5ZjYxNDU2YzNkOTE0MzkyODkyYTkifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MTcsInBhaXIiOjksInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDg6MTEuMTYyWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjA4OjMzLjY3MFoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvOS5qc29uIiwicmF3U2hhMjU2IjoiYmZkNzViNjllMjBhY2ZlZjY3NGQ5MjdiMzE2MGU3MGRmMjE2ZDc1YjYxMDFiODQ2YzI0YWFiNDNkZjE3ZjJkMCIsImNhbm9uaWNhbFNoYTI1NiI6IjJkM2Q3ZGFiOWRiNjEwOGQ3MDc2ZmI5OGYyMzUzMjE3Zjc4ZWNhYmMwNDhiN2ZhOGJjMTMyYWE5M2UzZTIyOTQiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjZkMzI4Njg1OWIwMTQ2ZmI1YjI2NDcxN2IzZDc3NTQxNzZhM2Q1MmY2MmE5ZjYxNDU2YzNkOTE0MzkyODkyYTkiLCJlbnRyeVNoYTI1NiI6IjU0ODhiYTBjMGU1MmRlNmFlOWIyYTkyNTgzNTIzOTZlNWI5M2EyZWM1NjlkNDI2MDgwMDYyZjliOTMyNWI3YzEifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MTgsInBhaXIiOjksInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjA4OjMzLjczNloiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowODo1Ni4yMzFaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS85Lmpzb24iLCJyYXdTaGEyNTYiOiIxMTMxMWIwODU4Njk4OWJlYTBhN2I0ZmUzZDY5ODgzNDQ4M2RhYWM2ZDJmZGMwZDRkNTQ3MTIxODFkNzc1YTE4IiwiY2Fub25pY2FsU2hhMjU2IjoiNWFjZDViZWE1NmI5OTcwMGRkMzk2NGVhMjM4Y2UwZGQ0NWQ1ZWFiZmM3Y2UzMmY5OTViNjJmYTY5YzE4ZmI2YyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNTQ4OGJhMGMwZTUyZGU2YWU5YjJhOTI1ODM1MjM5NmU1YjkzYTJlYzU2OWQ0MjYwODAwNjJmOWI5MzI1YjdjMSIsImVudHJ5U2hhMjU2IjoiMWFkNDcwMTYxOWE5NTM3ZGI2ODk3NjMzNGI3NjRmNjZlY2ExMGJlNmQ4YmQyM2E3Mzg2MThkNjQzYjkyMzcwZSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoxOSwicGFpciI6MTAsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjA4OjU2LjI5NloiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowOToxOC44MzlaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8xMC5qc29uIiwicmF3U2hhMjU2IjoiNTYxN2Y5OGY2ZWVkZWFmZDA3ZWZiZDRjYzQwOGJhOWM5ZjI2YjZlN2YyZTdhOGNiZDEyN2VkZjkyZGI2YmI4MCIsImNhbm9uaWNhbFNoYTI1NiI6IjQwMGZiYzliMTU1NDQzZjM2NjFiNDZlZTNlZDEyMDZlNDJiMDBkZGZlYzk4NWRjMTFkNzkzZWMwMTc0NThhODQiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjFhZDQ3MDE2MTlhOTUzN2RiNjg5NzYzMzRiNzY0ZjY2ZWNhMTBiZTZkOGJkMjNhNzM4NjE4ZDY0M2I5MjM3MGUiLCJlbnRyeVNoYTI1NiI6ImEyZTg4YmNlNDc3ZGJhMjY4ODJhODQ1ZjYwNTYwYWEwZjg2YzIyNjhkY2ZkYTg3YWIwOGMzMmZhNmZjNzY0NmEifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MjAsInBhaXIiOjEwLCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjA5OjE4LjkwNVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjowOTo0MC45ODdaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzEwLmpzb24iLCJyYXdTaGEyNTYiOiI3ZTYwMjNmODBkM2ZlZWJkZmYwNWU4YzUzZjk2YzUxMWU4NjVjOTE5ZWE0NmI5Y2UxODBmNGRmMWIyMzkyZjA0IiwiY2Fub25pY2FsU2hhMjU2IjoiMjY5OTEyYTY4NWM4ODE2YjMxNjZmZjQ0NGI5MzdmMzA3NzlkZDI0MDk3YTQ3YWZiODI0N2QxNzc3ZDEwYjgzZiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYTJlODhiY2U0NzdkYmEyNjg4MmE4NDVmNjA1NjBhYTBmODZjMjI2OGRjZmRhODdhYjA4YzMyZmE2ZmM3NjQ2YSIsImVudHJ5U2hhMjU2IjoiMjIyYjEwZTZkYzNhZWYyZTc5NDY0YmU5MWFhZDJjMDg5MTZhYmMwMDBhNDc4NzJiNTEyMzA0NmViZGU5MTA4NiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoyMSwicGFpciI6MTEsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MDk6NDEuMDU3WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjEwOjAzLjk0M1oiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMTEuanNvbiIsInJhd1NoYTI1NiI6ImUxMjA4NTJiNjYwM2RkNDc1MGE0Y2MzNTYxNGNlMDYxNDUyNDUwMWFkYzVmZmZlNjIzNDQ3NzkwZjY0YTEwZTgiLCJjYW5vbmljYWxTaGEyNTYiOiI2NzU1MWVlZGIxMDBiMDg2NTc0MWM2NzQwZGNiMjY5NjdhOGRjYTMzMWRkOGJmNTNmZmMwZWUwZTc0ZWQ1ZGRlIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiIyMjJiMTBlNmRjM2FlZjJlNzk0NjRiZTkxYWFkMmMwODkxNmFiYzAwMGE0Nzg3MmI1MTIzMDQ2ZWJkZTkxMDg2IiwiZW50cnlTaGEyNTYiOiJiMjU0NzdkYmExNDQ1NDM5ZmU3ZjM4NzY4YWY5YWY3OTllZTUxNzljYzk0N2ZmMjg2YTdhZDhiNTQzMDU4NmVhIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjIyLCJwYWlyIjoxMSwidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTA6MDQuMDEwWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjEwOjI2LjgzOFoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzExLmpzb24iLCJyYXdTaGEyNTYiOiIxOGViNjI5ZWUyZDAxOTE5MDk2MDliOWI2MDE0YmQ4NWY3ODAyZGFkYjhmYWY1MmNjZWMwM2JiYzdmOWIzZDJlIiwiY2Fub25pY2FsU2hhMjU2IjoiYWFmZjA1ZmEzYzQ2YTcwYmMwMDNmMjUzZTVmNDg4OGU0OTU5MjAzNWIwOGFjNzVjMDNhNjI0ZTc4ZDg3ZDQyNiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYjI1NDc3ZGJhMTQ0NTQzOWZlN2YzODc2OGFmOWFmNzk5ZWU1MTc5Y2M5NDdmZjI4NmE3YWQ4YjU0MzA1ODZlYSIsImVudHJ5U2hhMjU2IjoiMjUwMjVjZWEwNjFjZDQ3MzA1ZjI1NTBhZWQzODRjNTJhMDNjM2I5OTQ4NmNmNTExN2I4MmM1MTY1ZGIwN2YzOSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoyMywicGFpciI6MTIsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjEwOjI2LjkwM1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxMDo0OS40NzFaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8xMi5qc29uIiwicmF3U2hhMjU2IjoiOWE1MTcwZjk4M2I5MzBhMzBlZGU0NmJhYzU2OTNmZGNhNTkzMzQ4ODUwODE4MmVlYTA1OGU5ZmQyNjczOGFlYyIsImNhbm9uaWNhbFNoYTI1NiI6IjIzZjAxMGRlY2M4YzlkMjlmOGE4NjRjN2VmYTM3ZjQ2MTM4ZGJjZmMyYThmYjQwNmRiMjk4Y2FhZTVlYWE5OGUiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjI1MDI1Y2VhMDYxY2Q0NzMwNWYyNTUwYWVkMzg0YzUyYTAzYzNiOTk0ODZjZjUxMTdiODJjNTE2NWRiMDdmMzkiLCJlbnRyeVNoYTI1NiI6ImE1YWU4YWVhMGIxNmRkOTZhNWI4ODgzODg3ZGZlMzQ2OGMxYjAzM2YxYTk1YjA4MzhjMjNhOGVjYTA0NDQ2NTkifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MjQsInBhaXIiOjEyLCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjEwOjQ5LjUzOFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxMToxMS45MThaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzEyLmpzb24iLCJyYXdTaGEyNTYiOiIzMGZjMzg4ZDZkMGVlZDlmZmQ4YmE2YjVhZGRjNjJlYTIwMDVmZTUyN2YwMzEyNGI2NTk2YmJmNWRjZGYxZjFlIiwiY2Fub25pY2FsU2hhMjU2IjoiOGI4ODYyOTVhYWViZTBhMzcwNjhmMjZlMTFmMTAxMGZjMzJmOTdkZDFmZjZhNmY5YmFiMjY1MjZiMTZkZWEyZSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYTVhZThhZWEwYjE2ZGQ5NmE1Yjg4ODM4ODdkZmUzNDY4YzFiMDMzZjFhOTViMDgzOGMyM2E4ZWNhMDQ0NDY1OSIsImVudHJ5U2hhMjU2IjoiNGUyNTQ1ZTFiN2Q0MWNhYzJlNmUwMTY0YTE5ZjJhYWY5Nzg0N2E5OTU0M2IxMTU5MjhhZmE4ZjM0MGFiMzkyMSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoyNSwicGFpciI6MTMsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTE6MTEuOTg2WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjExOjM0LjY1OVoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMTMuanNvbiIsInJhd1NoYTI1NiI6ImQxMWYyM2M4NWQ1MTk3MjFkZjViNzU2NDA1NTM1NWZjM2JhMzU1NjUxODUzMTYzZmVlMTQ4ZjMwNzhhNWZkOTYiLCJjYW5vbmljYWxTaGEyNTYiOiIwM2JjOTlhNTFlNzVkM2I5MTkyMjg0MzZkOGZmNDJkMThlMWZkZjc4NTUwYmI0YjA1NzU5NjlmNDk5ODExNDlhIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI0ZTI1NDVlMWI3ZDQxY2FjMmU2ZTAxNjRhMTlmMmFhZjk3ODQ3YTk5NTQzYjExNTkyOGFmYThmMzQwYWIzOTIxIiwiZW50cnlTaGEyNTYiOiJkMWE0M2NmMzA0OWRhN2FmOGVhZTdmNzVmOTMzZjYxOGJhN2EzNGIyNjNiZWI5MDM0ZjI2Zjc2OTFiOTU0ZGJiIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjI2LCJwYWlyIjoxMywidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTE6MzQuNzMwWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjExOjU4LjE0NVoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzEzLmpzb24iLCJyYXdTaGEyNTYiOiJiMDAyNzM5MDFhOWYyMzBjOWJjYzlmYzJkZmY2ZmRlMmNhN2Q1NjI3ZWE1NTY5MjhlNjE5NTAxMGRhYTg0Mjk4IiwiY2Fub25pY2FsU2hhMjU2IjoiZjliZDgwNTYyYTRkNGY4Mzk3ZmM1NTAwMzc1YjAyNzE1ODYzNDI1NzNiM2NkZDRlZTliYzRlNzgzNDBjNGU5NiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiZDFhNDNjZjMwNDlkYTdhZjhlYWU3Zjc1ZjkzM2Y2MThiYTdhMzRiMjYzYmViOTAzNGYyNmY3NjkxYjk1NGRiYiIsImVudHJ5U2hhMjU2IjoiNzc0Mzg5OGZjOTY3OWNjMTk4NzRhYzAyODU4NWIyZjg5YjJmOGEyZDkxY2U3ZjhjMTViZjg0MDNmMGVlN2ViMSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoyNywicGFpciI6MTQsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjExOjU4LjIxMVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxMjoyMC42ODZaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8xNC5qc29uIiwicmF3U2hhMjU2IjoiYzYyY2JiNjg0YjBlYWZlYjdjYTk3YzM3ZjQ5ZWNiZGRhNWYxODY4MmNiN2RmOGJlYjBhNjMxZmNlNzNiYzA1MSIsImNhbm9uaWNhbFNoYTI1NiI6ImE0YjExM2RhZGRlOTExZjJhYTE0OTgwNDRmODIwZmY4MmEyODI5Y2M0ODAyYzkxYzcwOWZlMDc1NTBkMmQ0YTgiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6Ijc3NDM4OThmYzk2NzljYzE5ODc0YWMwMjg1ODViMmY4OWIyZjhhMmQ5MWNlN2Y4YzE1YmY4NDAzZjBlZTdlYjEiLCJlbnRyeVNoYTI1NiI6IjNiY2QyNTVhNTdjZjY3ZmE4Zjc1NzFlZThhZDBkZDg2NmM1ZWQ0ODFiMzQ0NGQ2ZTVkNGE1MTEyNzkxMGM3Y2EifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MjgsInBhaXIiOjE0LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjEyOjIwLjc1MFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxMjo0Mi42ODlaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzE0Lmpzb24iLCJyYXdTaGEyNTYiOiI5ODQ1NzU5YzI1ZjY2YTc3YTk0NzM4ZTQyNmE1OTQyMDM0MzgwY2E1OTUyZTUzZGRiNDhhMWYxMDMzYjNmZjllIiwiY2Fub25pY2FsU2hhMjU2IjoiYWUzOTFiNDhkOWY0MDVlM2UxNjc0OTVkNTI4OGU1MGQ1ZTIzMjY4ZGEwNWM5NjVlMmNkY2YyZDVjNGMxYmIzZiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiM2JjZDI1NWE1N2NmNjdmYThmNzU3MWVlOGFkMGRkODY2YzVlZDQ4MWIzNDQ0ZDZlNWQ0YTUxMTI3OTEwYzdjYSIsImVudHJ5U2hhMjU2IjoiZWExM2JmYzZmMWE0MmNhYjU3ZTZhYjBmOWEyM2YyYTE5OTIxMzVjMmUxNWMyNWJkMWZmMTI2ZjQzYTc5YWI3MiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjoyOSwicGFpciI6MTUsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTI6NDIuNzU0WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjEzOjA0Ljc0NFoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMTUuanNvbiIsInJhd1NoYTI1NiI6IjAyYTdkMDgyMDQ2NTE0YmIyODIzZWFmYmI2NzE5NDUyNTYwNDA5MzQzN2M3ZDQ5MjA5OWY5MTEzZWZlMGI4MjIiLCJjYW5vbmljYWxTaGEyNTYiOiI1MTQzMjJiY2RlZmNlYjcwMmI4NmQ0ODU0NmRkZGMzNDUzMGYxZDJiZjJlNTI0ZDkwM2Q4YTk2YmFmYmQ2MzIxIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiJlYTEzYmZjNmYxYTQyY2FiNTdlNmFiMGY5YTIzZjJhMTk5MjEzNWMyZTE1YzI1YmQxZmYxMjZmNDNhNzlhYjcyIiwiZW50cnlTaGEyNTYiOiJhN2U4YjY5ZjAwOTFmNDY3YTZjODk3N2IxMzJiYzg3YjdjM2RhMzc2YTllOTEwYmNlN2FiNDYzZDMxMTQ2OTNmIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjMwLCJwYWlyIjoxNSwidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTM6MDQuODEwWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjEzOjI3LjIyOVoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzE1Lmpzb24iLCJyYXdTaGEyNTYiOiI2ZmIyYWZlYzg1NjM2ZDE1NWFmN2ZlMTM0ODc3ZWM5NDMxOWUyODgxZmU2NWExYmYyNzM2N2Q2YWRmNGVjZDdmIiwiY2Fub25pY2FsU2hhMjU2IjoiNTIzMjQ3MzJlMDNkYTE3MTRlODdmNzkyOTFiNWE5ZWJiMmE2N2E2YjMwNjQ5MWRhZmZmOTY1ZDhlOTNkNzMwMCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYTdlOGI2OWYwMDkxZjQ2N2E2Yzg5NzdiMTMyYmM4N2I3YzNkYTM3NmE5ZTkxMGJjZTdhYjQ2M2QzMTE0NjkzZiIsImVudHJ5U2hhMjU2IjoiM2QyZDFhYjk5ZTRjMjFjOTBiMDk1OGYwYjJhMWMzZDIwMTU3ZTRkNDk4NGVhNGMwYWRiMzhiZGIxYTJmZDk0OCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjozMSwicGFpciI6MTYsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjEzOjI3LjI5NloiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxMzo0OS44OTJaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8xNi5qc29uIiwicmF3U2hhMjU2IjoiNTJiYjYzZWIxMmYxMDEwNTgxYjAwYzFiOGZjNzk0MWM4N2RjYmZmNjE2Yjk3Y2I2YmI2YTkyNGY3MTNmZWY5NyIsImNhbm9uaWNhbFNoYTI1NiI6IjkzNTdjMmI2N2ViODJlYWIxOGFjODUyNWZiN2UyZWY0MDg2MzM0MmQyZjdmYTNlMzA4M2ExM2Y3NjgxZDBmMTgiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjNkMmQxYWI5OWU0YzIxYzkwYjA5NThmMGIyYTFjM2QyMDE1N2U0ZDQ5ODRlYTRjMGFkYjM4YmRiMWEyZmQ5NDgiLCJlbnRyeVNoYTI1NiI6Ijk4ODQ0MDg2MjY2ZjE4Y2QzMzFjNDYwM2M0MWU0NDExNzA2YjFhMWVlZDAzNDg2NGNjMjI3YTdkZDE4OTU3MmEifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MzIsInBhaXIiOjE2LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjEzOjQ5Ljk2MFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxNDoxMi41MjFaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzE2Lmpzb24iLCJyYXdTaGEyNTYiOiJiMDQ1NTk5MjIyMmRhMWFkYzM0NjY3ZGI5M2RjNTZhZjQ4ZTRmMTVmNWYwMjdjNzA3ZDJkNmE0Nzk4OGE4ZDBmIiwiY2Fub25pY2FsU2hhMjU2IjoiZGZkZGNiMDgyNjRkYTRhMGEwYTk5YmQ5ZTRkNTEwMWE0NTYxMjVjNzU0M2I2YTAzODg4NzA1ZDQyZWI2ZDRjNyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiOTg4NDQwODYyNjZmMThjZDMzMWM0NjAzYzQxZTQ0MTE3MDZiMWExZWVkMDM0ODY0Y2MyMjdhN2RkMTg5NTcyYSIsImVudHJ5U2hhMjU2IjoiNTQxZDg3ZjdjN2E2ZTI0ZTBkYTg1NjBiNTBlYzRmOGZjOWU4MmU2Yzc5YWE3NDYzMzc0ZjlkOGQ2NGNhMzQxZSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjozMywicGFpciI6MTcsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTQ6MTIuNTk1WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE0OjM1LjA5OVoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMTcuanNvbiIsInJhd1NoYTI1NiI6ImE1MDJhYmY5MWI0YjhiMzI1Y2RmN2I5NjE1YjFkNDg4ODJlMTYyZDdmY2NmNWQ1ZmQxNmZkNGZmZDQ0ZWYyZGYiLCJjYW5vbmljYWxTaGEyNTYiOiJkY2VmMTAyYTAwOTdhZWQ5MDY0OTA0N2Q4ZmQwZTkxNGQ5ZTJlYzdlMDU1ZDkzZDI1NzQ0NGZhODg0ZGE2Y2EyIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI1NDFkODdmN2M3YTZlMjRlMGRhODU2MGI1MGVjNGY4ZmM5ZTgyZTZjNzlhYTc0NjMzNzRmOWQ4ZDY0Y2EzNDFlIiwiZW50cnlTaGEyNTYiOiI1N2I4N2ZhOTA4ZDU1OWY3MjgwZjdmMDhkMGE4OWI2OWNlNTU0OWQzM2U0N2Q2Nzk0ZTJhMzNmYWNmMjY1Mzg1In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjM0LCJwYWlyIjoxNywidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTQ6MzUuMTY2WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE0OjU3LjYyNFoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzE3Lmpzb24iLCJyYXdTaGEyNTYiOiIzMjc5ZTFjMzQyNTAxM2Q3YzRlNTBhZGFlMDJmY2I2ODYzMWZjMjRhNDA4MWMwMDZhOWFjYTBkODc4YjkxMDkwIiwiY2Fub25pY2FsU2hhMjU2IjoiNWY2NmQ5NTVjNTMyZjYxMzVhMTcyZjEwNDIzZmYxMDdjOTI5YTg5NTcxNjdiMDg4NjZlYjg5Mjk3NGQ0YjJmZSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNTdiODdmYTkwOGQ1NTlmNzI4MGY3ZjA4ZDBhODliNjljZTU1NDlkMzNlNDdkNjc5NGUyYTMzZmFjZjI2NTM4NSIsImVudHJ5U2hhMjU2IjoiNzk5NzM2ZmQ3ZDlhMmMwOGQzYjVlMjcwNjczNmMxMGMzZjhiYjljNTBiMTY2MDE5MGNiOTFjOTEyZDhiOTcxNSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjozNSwicGFpciI6MTgsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE0OjU3LjY5M1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxNToyMC4yOTRaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8xOC5qc29uIiwicmF3U2hhMjU2IjoiZWI0YjM0OWZjODU5MDU3NzNmYjgyZmJkOWRmNjU5N2UyYTg1MmQyM2UzMDRmOTNlMjU4ZDFjMWFiYjEzZWFmZCIsImNhbm9uaWNhbFNoYTI1NiI6ImU3ZGNhODM1MDcxNjgzYjI0ZDUwOTI4YmFiYjY4YTVjYzYxZjFiNDUyMTI0OTRjMDQyZjkwZTBlZjdkNTRhMzEiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6Ijc5OTczNmZkN2Q5YTJjMDhkM2I1ZTI3MDY3MzZjMTBjM2Y4YmI5YzUwYjE2NjAxOTBjYjkxYzkxMmQ4Yjk3MTUiLCJlbnRyeVNoYTI1NiI6ImMzMjI2ZGY3NDVhMWZhOWIzZDBiMzM1ZmJlY2IzMGEyOTJmMjEyMjllNzBmNTY4ZDI4NGZiMTUzM2E5YzFkMTgifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6MzYsInBhaXIiOjE4LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE1OjIwLjM2MVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxNTo0Mi44MDRaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzE4Lmpzb24iLCJyYXdTaGEyNTYiOiI5Y2E0MjhlYzQ4Y2M2ZWJkZTEyMWNhYWNhYmYyNWNiM2FlZGFhYTg1MmE4ZDM1NTM0YzZhOGNlZTUxMmIxMWE4IiwiY2Fub25pY2FsU2hhMjU2IjoiMjNhODM2OWU4MmMxODIyNjJiMzFkYjQzMmQxYjA0NDFlYjhlZGQ4MjcxOGE0OTFkNDc5YTBlZDg0YWNkNjRlOSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYzMyMjZkZjc0NWExZmE5YjNkMGIzMzVmYmVjYjMwYTI5MmYyMTIyOWU3MGY1NjhkMjg0ZmIxNTMzYTljMWQxOCIsImVudHJ5U2hhMjU2IjoiZTY2M2EyMzA5YmFkZWM0NGQzNTY4N2FhMTZiNjVjODMyNzdlNWFkYjEwZjVlYzFhZjBmZDJlNzc4ZjVhN2NjYiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjozNywicGFpciI6MTksInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTU6NDIuODc0WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE2OjA1LjU1OVoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMTkuanNvbiIsInJhd1NoYTI1NiI6IjJmNjBlYWZlNDVhMDE5MGNhOTVhZTIyMzE0ZWYzN2U2MTdiY2MwYTk1YjBiMDAxOGI0NmVmYmY3NmQ1MTk4MmQiLCJjYW5vbmljYWxTaGEyNTYiOiJjNGYzYjUwZWE3ZjM5Yjk2NTNmNzIyNjRjOGJiYjJlYzUwNzdmN2ZlNzg4ZDlkNDQ2ZWM1OTZkZTkzZjVlNDc4Iiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiJlNjYzYTIzMDliYWRlYzQ0ZDM1Njg3YWExNmI2NWM4MzI3N2U1YWRiMTBmNWVjMWFmMGZkMmU3NzhmNWE3Y2NiIiwiZW50cnlTaGEyNTYiOiIxZDhjNGY5ZDJkOGIyZmM2OWM3OTgwYjQxMjQwNTIzYjc3MDlmYWM0NjAxMWQyOThlNDcwNjA1YmI3ZTJiYzRhIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjM4LCJwYWlyIjoxOSwidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTY6MDUuNjI3WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE2OjI4LjY2OFoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzE5Lmpzb24iLCJyYXdTaGEyNTYiOiI3MjlhYTQzYWUzNzYyODZkNDIyZWFlNDNlZDYwZjI5ZDkwNmM1ZDgzZGRkNjdlZmQwZDlmZmExZTBmMTI3NTNiIiwiY2Fub25pY2FsU2hhMjU2IjoiMTEwYWJkZjljYjQ3ZmMzY2M5MmVhNTg2MjRjM2I5MGUzNWU0MTFmM2U1M2Y4MTA0ZDhkZjhkYzM3MWFjNjZlMyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiMWQ4YzRmOWQyZDhiMmZjNjljNzk4MGI0MTI0MDUyM2I3NzA5ZmFjNDYwMTFkMjk4ZTQ3MDYwNWJiN2UyYmM0YSIsImVudHJ5U2hhMjU2IjoiNjU0ZWUzMzI1ZWJkZjVmYzJkODY0Y2JkN2MyNGVjYmUwOTYwNjNhMDZkYzVmNmQzZGY0MWQ1ZWRkMWI2NzVhZCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjozOSwicGFpciI6MjAsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE2OjI4LjczNloiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxNjo1MS40ODNaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8yMC5qc29uIiwicmF3U2hhMjU2IjoiNmQwOTdmZTYyZDdlNDAwNjgyOWMyZjg5MjRiMjAyMjliMzA1MzU4OThjZjI5Nzc1MDQ5MzAxNTIzOGRmNmZhYSIsImNhbm9uaWNhbFNoYTI1NiI6ImFjMTIzZTEwMmExMWRiZTdmMWE1MjRiYjdmMzIyYzAxNTFmMTU4ZjU2ZmUxODBhOTI1MjUwYWNjZDRhMWIwNjMiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjY1NGVlMzMyNWViZGY1ZmMyZDg2NGNiZDdjMjRlY2JlMDk2MDYzYTA2ZGM1ZjZkM2RmNDFkNWVkZDFiNjc1YWQiLCJlbnRyeVNoYTI1NiI6IjQ2MTBkMmU1MTQwMzY4ZDM1NDllMzQ1MmE0ODk1YjlkMzJjOGYxMTAyYWZlZjU2MTg1YTA0ZmIwNTk3NWNjODQifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NDAsInBhaXIiOjIwLCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE2OjUxLjU1MFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxNzoxMy45ODRaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzIwLmpzb24iLCJyYXdTaGEyNTYiOiJmYzExYWUwMTk4NDk0YjhjZGJkN2RlZmFkMTRiZTIyNjdhY2EyMDkzZTYxOWRmZDE0NzkzODE2NGNiNGE3MjQyIiwiY2Fub25pY2FsU2hhMjU2IjoiMDRjNDc2Y2NhYzEzNzFiYTZiNjVkZTdkZTQ3NjFjMzAzNGNhZTMwNGFkNjY5MWVkOTBhMTIzN2RlM2FiN2UyZCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNDYxMGQyZTUxNDAzNjhkMzU0OWUzNDUyYTQ4OTViOWQzMmM4ZjExMDJhZmVmNTYxODVhMDRmYjA1OTc1Y2M4NCIsImVudHJ5U2hhMjU2IjoiMmE0MTZkOTVmODU0ZmI2ZmY3NzM0NWRiNTI3NDJmMjU3YTIyNDIyOWRjMmQ0YTk5MGYxZThkY2ZlMWMyZDUyZCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo0MSwicGFpciI6MjEsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTc6MTQuMDU1WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE3OjM2LjY5N1oiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMjEuanNvbiIsInJhd1NoYTI1NiI6IjgwMjY4ZWNlOGViNTUzOTNkMGI0YjY2MDNhMWMyMjJlYmM2ZmNmYjMyOGQ3ZGRjMTg1ZTA3ODQ4MTQzNjM0M2MiLCJjYW5vbmljYWxTaGEyNTYiOiJiYTFhNmM0NDRjMjBmZWUzOWYzMWNjMTI5NTY4MWIxOGZjNWMxMDhkYjg5YWNlOTRiNDU3OWQxM2Q2MGE3OGEyIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiIyYTQxNmQ5NWY4NTRmYjZmZjc3MzQ1ZGI1Mjc0MmYyNTdhMjI0MjI5ZGMyZDRhOTkwZjFlOGRjZmUxYzJkNTJkIiwiZW50cnlTaGEyNTYiOiJiYTcxMGU1OGRmMjlhNmE2NjRiYzYwMjJlODY2M2VmZDIwMTM0YzllZDNmNzcxODc1OTFiY2E5ZTk0OTUxYjE4In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjQyLCJwYWlyIjoyMSwidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTc6MzYuNzY0WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE3OjU5LjUzNVoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzIxLmpzb24iLCJyYXdTaGEyNTYiOiIzOTg1MTM1OTFjMzBlODcwOGMxM2YxYmI2NmM3Nzg1ZmI5MWRiN2JiNjFkMjViODJlNzhiZjNjN2JhY2EwMDVjIiwiY2Fub25pY2FsU2hhMjU2IjoiMTA2ZmEyMTZjNGViNTM0MmRlZWE3ZDUzMGViYzhiZmZlYmUxMDQ3OWVjOWY2MzU2ZGE3NGEzYWRkODBlZjRlYyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYmE3MTBlNThkZjI5YTZhNjY0YmM2MDIyZTg2NjNlZmQyMDEzNGM5ZWQzZjc3MTg3NTkxYmNhOWU5NDk1MWIxOCIsImVudHJ5U2hhMjU2IjoiODI0YzA5OGU2ODBkZjEzMDRlYjFlODQzMjU5YTZlYTJkOTY5YTZmZTMyNDJlMTlmYzU4OGM4MmJjN2I5MDhiMiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo0MywicGFpciI6MjIsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE3OjU5LjYwN1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxODoyMi4xOTBaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8yMi5qc29uIiwicmF3U2hhMjU2IjoiNWNjMTkyYzUzN2I4M2E2MjIyOTExMzgxODIyZjdkMjQ4MzhlZTJiMDNmZjQ3YjQ4NmQ4Mzk0MzUwYWE2MWJjMyIsImNhbm9uaWNhbFNoYTI1NiI6ImUwYTkyMWQ5Y2RkMjk3YmExMTNjYmNhYTdiMzA5MzkzNWFiNjYwNDMwZTBmNDhiZTNmYTkyZmQ3OTU3NGQ5MjciLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjgyNGMwOThlNjgwZGYxMzA0ZWIxZTg0MzI1OWE2ZWEyZDk2OWE2ZmUzMjQyZTE5ZmM1ODhjODJiYzdiOTA4YjIiLCJlbnRyeVNoYTI1NiI6IjUwZDg1NjU3NjVlZjI2YjhjNWIwNjc0NGFjM2I0YTc3ZjA2NGE0ZmYxYmQxYjk4ODY2OWM5ZjY0NjEyMTNjNTgifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NDQsInBhaXIiOjIyLCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE4OjIyLjI2M1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxODo0NC45NjdaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzIyLmpzb24iLCJyYXdTaGEyNTYiOiI0ZTExOWUxYzE1MGIwOGZjZjAwNWQ1OGIxY2VkYzcwZWNhYWZhZmM1M2E0YzZmZTVkMjRlMzlkZWUxYTRhODQxIiwiY2Fub25pY2FsU2hhMjU2IjoiZDNlYjQ5NGEyM2M2MzY3Y2UxMjZkYjY1YThmY2E2ZDhmOTVmNTRmZGEyOGU0ZTMzZTEwOWM2MzI2M2UzN2ViZCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNTBkODU2NTc2NWVmMjZiOGM1YjA2NzQ0YWMzYjRhNzdmMDY0YTRmZjFiZDFiOTg4NjY5YzlmNjQ2MTIxM2M1OCIsImVudHJ5U2hhMjU2IjoiNzE4N2UyNGZmNmExNGQ1NTljMDhjMTJhN2IyMzg4NmFiZWQxMzY4NTFjNGY3ZWRlODk5NTg2ZDkwY2E3MmNkNSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo0NSwicGFpciI6MjMsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTg6NDUuMDM4WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE5OjA3LjY1NFoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMjMuanNvbiIsInJhd1NoYTI1NiI6IjBiZDdkZmNmMzA3ZGMwMjNmMzY2MWI2NWQ4OGFmYTllYzNiZjFlY2YyOGY3NDE3MjE5MWJmOWFlNmM2ZmNjMjAiLCJjYW5vbmljYWxTaGEyNTYiOiIwM2EyYTE1NDVjYzQ3NzgwYjcxMmExMTc4ZWViNzcyNTIyYzc1ZWZjNTNjMGY5MWEzNjY4NzI3MGIxMzllYmYzIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI3MTg3ZTI0ZmY2YTE0ZDU1OWMwOGMxMmE3YjIzODg2YWJlZDEzNjg1MWM0ZjdlZGU4OTk1ODZkOTBjYTcyY2Q1IiwiZW50cnlTaGEyNTYiOiI3NjVkZDI1ZDE3OTEyNjI0ZGM1Y2MwYjlmNWRiMTY1ZGMyNjNkYjQ0ZmVjYmFjMzk2MTYzMGFmMjA5Y2E4MGM5In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjQ2LCJwYWlyIjoyMywidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MTk6MDcuNzI3WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjE5OjMwLjQ1M1oiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzIzLmpzb24iLCJyYXdTaGEyNTYiOiI4OGVmZTRhYjgwZGIyMjhjMzdiNjUzYjViNWEyNjYyNjFiNjhmOTg0MWIxMWY0NjAzMThjMDgxY2Q1NmRjZWVjIiwiY2Fub25pY2FsU2hhMjU2IjoiZThmODhhMWVkZTdlNThjYWUwMmIxNzIzNjBhNTY2ZDJlOTMzZTIzMDViMjY3MWU3MzlkN2Y1NGU5ODMyMjM5NCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNzY1ZGQyNWQxNzkxMjYyNGRjNWNjMGI5ZjVkYjE2NWRjMjYzZGI0NGZlY2JhYzM5NjE2MzBhZjIwOWNhODBjOSIsImVudHJ5U2hhMjU2IjoiOTMyZjliMzgwZTk2MTdmNDQwNDdjNzMyYjE3NTcyNmVlNGE3ODBjYmU4ZGU4NTM5YWRkNjdhNzk3ZGRiN2RiZCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo0NywicGFpciI6MjQsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE5OjMwLjUyMVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoxOTo1My4xMTJaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8yNC5qc29uIiwicmF3U2hhMjU2IjoiNDc3MWYzNzZkNGNjNDUzM2FjMTFkNDU0ZmJiODY1N2RkMzBkNDEyN2E2N2RjMWJlYmZiMGUxY2NiYjgyYmZhYSIsImNhbm9uaWNhbFNoYTI1NiI6IjRkODQ4NGM2MjhjM2IzNTdlM2QwNDI2NzRjODI0MTcyMjM0NjkwNDQwMThhYTY4MGQyNTVhMGE1MzFhNWM1MzIiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjkzMmY5YjM4MGU5NjE3ZjQ0MDQ3YzczMmIxNzU3MjZlZTRhNzgwY2JlOGRlODUzOWFkZDY3YTc5N2RkYjdkYmQiLCJlbnRyeVNoYTI1NiI6ImI4MWZkMjRlNzQwMzA3YzI5NTcxMDFkZWM0Mjc5M2UwMDYzNzFhMTVlYzFhOGFlNDA5ODdmYzc0YmI2MTI4MTQifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NDgsInBhaXIiOjI0LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjE5OjUzLjE3OVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyMDoxNS43MzNaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzI0Lmpzb24iLCJyYXdTaGEyNTYiOiI5YjdmY2FjNWJmMzFlNjAzMWYzMDBlMjZkY2RlZjc3ODYwZjQzMTQ0OTM3YTkyZTY2MTJiMTdiNTU1NjcwZGUxIiwiY2Fub25pY2FsU2hhMjU2IjoiYzU3ODNkNzlmYjMyODVkNjFmMjJkOTUwMTU2Y2JlNWExMjg2ZGI4YzBjZjYzMGRlYmU5MDg4NDczNjJiNDA4NiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiYjgxZmQyNGU3NDAzMDdjMjk1NzEwMWRlYzQyNzkzZTAwNjM3MWExNWVjMWE4YWU0MDk4N2ZjNzRiYjYxMjgxNCIsImVudHJ5U2hhMjU2IjoiNjZmY2RmNGVmYmE4ZWRjZTE3ZGYxMzhhYWVhZTc4NmU1Y2M5NWIzYjNiZTUzMDU5ZGNhMGNiZTU4NTczOTZiMCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo0OSwicGFpciI6MjUsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MjA6MTUuODAzWiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjIwOjM4LjM5NFoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMjUuanNvbiIsInJhd1NoYTI1NiI6IjY5ZDdhYmZmY2Y3YWNiNDAxYzRiMGRlZTBkMmM4MGY1MTg1ZjNiNmU2YzUyMjc1ZDJlNzE0MDhhYmRiNWI1YjMiLCJjYW5vbmljYWxTaGEyNTYiOiI5YmMxMjE0MGUyODJhODUwMWRkM2Y1MDE4MzIzNTUxYzBlODY5OTY4NTU1OGYyMDVhMWMzNTAzYTYxNzE3YzFmIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI2NmZjZGY0ZWZiYThlZGNlMTdkZjEzOGFhZWFlNzg2ZTVjYzk1YjNiM2JlNTMwNTlkY2EwY2JlNTg1NzM5NmIwIiwiZW50cnlTaGEyNTYiOiI0YzFiYjM4OWEwODFmY2Q3Yjc4ODRmZTNiZjIzNzFkYTMwMmU1ZDE5ZGVkOTZkY2E5YmQ1MGRiNjI5ZGZjYjQ5In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjUwLCJwYWlyIjoyNSwidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MjA6MzguNDY3WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjIxOjAxLjE3N1oiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzI1Lmpzb24iLCJyYXdTaGEyNTYiOiIzOTM2MmY1ZWMyOTAwNTE4ZDU0Y2MwMWJlM2VjNTJkMGQ5ZGIxYjczNWViNzE1N2ZjZmRjOWVlMDViNDhkZDM4IiwiY2Fub25pY2FsU2hhMjU2IjoiYzcyMWU2ZGQzZjBiMGE0NmM5N2RjNzYzNTc2YjgxNjllY2ZjMGQ2ZDhhNGM2YTMzNGNhYmZmMTZhM2U2YjdmOSIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiNGMxYmIzODlhMDgxZmNkN2I3ODg0ZmUzYmYyMzcxZGEzMDJlNWQxOWRlZDk2ZGNhOWJkNTBkYjYyOWRmY2I0OSIsImVudHJ5U2hhMjU2IjoiMjQxMjAzY2RlMWRjNjYwNWNjYzA2MzRlYTAyZTI2NjQzNmE1MmRhOWVlMTBjYWJkY2Y1YzBiZjYwZDFhZDY3OSJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo1MSwicGFpciI6MjYsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjIxOjAxLjI0NVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyMToyMy43OTVaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8yNi5qc29uIiwicmF3U2hhMjU2IjoiZmUyY2FjMmMyMDNhM2JmZDRhZTYwZWVlNjc0NDcxZDUxNzljNjgwMjhiYTZkM2IwYjdjNWExN2NkNWU0NmMzOCIsImNhbm9uaWNhbFNoYTI1NiI6IjQ0YjliMGJmNzkyZjVlNGUyOTg1MTIxYTE5NTcyYjgyNmVjZjI2ZGVjNGNiOTk1YjY0ZWMxNDA3NDM5ZTU3OTUiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjI0MTIwM2NkZTFkYzY2MDVjY2MwNjM0ZWEwMmUyNjY0MzZhNTJkYTllZTEwY2FiZGNmNWMwYmY2MGQxYWQ2NzkiLCJlbnRyeVNoYTI1NiI6IjljM2ViNTc4NTRkN2Q5NThlODY0OTU4ZGIxZWRmNzY1MWYzNmRjMGFlOTEyYTExMTVlMThiOTc5MGE2MTE5YjQifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NTIsInBhaXIiOjI2LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjIxOjIzLjg2NFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyMTo0Ni40MTdaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzI2Lmpzb24iLCJyYXdTaGEyNTYiOiJkMDZlZjhjYWMzN2QyMmRhNzYwNDFjNjAzZTdjMzExMTM4Y2Q2NTg1MjI2OTE1MWUyYTQ3NmJiY2JkOGQ4YWI5IiwiY2Fub25pY2FsU2hhMjU2IjoiMTU4M2U5OTllYTUwN2Y5MTg3MTQ4MzE5MTBkZDk0Y2I0YTEzMGI4NWQzNzg0YTlkYmY1NjBkOTAxMTM0YWYzZiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiOWMzZWI1Nzg1NGQ3ZDk1OGU4NjQ5NThkYjFlZGY3NjUxZjM2ZGMwYWU5MTJhMTExNWUxOGI5NzkwYTYxMTliNCIsImVudHJ5U2hhMjU2IjoiYThmZWNhMzNkOTIyMmViZjE3MmFiZjlhNzc5N2NmN2NhNDU0OGQwZTA3NGUzNjdjNDBkMDBlMWIyMDczODBjYiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo1MywicGFpciI6MjcsInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MjE6NDYuNDg1WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjIyOjA5LjA2N1oiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMjcuanNvbiIsInJhd1NoYTI1NiI6IjdlZmMxZWNlOTZmMDQwM2E0Mzc4ZjE1MzI4Zjk2ZGQ1YTM0NDc2NTNmYzc3YWRkMGEyM2UwNWMzOTAzY2I5YTkiLCJjYW5vbmljYWxTaGEyNTYiOiI1OTU2NDM2OThiZjJkZjdkY2RmODY5NjYwZWYwODJhZjhiOGVmZDI1ZjlmNjk1YmYyOGNiMzM0ZDY1NzI0OTQxIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiJhOGZlY2EzM2Q5MjIyZWJmMTcyYWJmOWE3Nzk3Y2Y3Y2E0NTQ4ZDBlMDc0ZTM2N2M0MGQwMGUxYjIwNzM4MGNiIiwiZW50cnlTaGEyNTYiOiIwMGZiZGJmNTIzZmYyOGM3ZmY3ODRhNDFmOWI5YWY0OTllY2ZmZmJhNTYzOGZmZTdlOTRlY2VmMWE0OTQwZDhkIn0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjU0LCJwYWlyIjoyNywidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MjI6MDkuMTM5WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjIyOjMxLjQ4OVoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzI3Lmpzb24iLCJyYXdTaGEyNTYiOiI3NjJkY2EwYmM0YmZiMzk2ZTQ5M2NjMGQ4MTVjMzdjMjM0YWNmYzk2MmI3NTJlMWQ2OGE5NjFhYWI1Y2IyM2Y1IiwiY2Fub25pY2FsU2hhMjU2IjoiZDgyOTc5MzgxOWY2NzNjMGJlM2MwZjNjMjAxMDkwYjNlOTA4YzRjZjcwYWFmODNkZTkwZjFiY2UwYjNmMzBjMCIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiMDBmYmRiZjUyM2ZmMjhjN2ZmNzg0YTQxZjliOWFmNDk5ZWNmZmZiYTU2MzhmZmU3ZTk0ZWNlZjFhNDk0MGQ4ZCIsImVudHJ5U2hhMjU2IjoiMzljY2RmMTRlZWZlMGNlMDYwNjk1NjY4MGI0ODdiMjllODZjYmFiNmZmOTAzNzE5Yzk2ZjY1YzE4ODk3N2E0NCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo1NSwicGFpciI6MjgsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjIyOjMxLjU2MloiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyMjo1NC4wNjlaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8yOC5qc29uIiwicmF3U2hhMjU2IjoiNDdmNzg3NzBiZGVhMTkzMzgzOWNkODJhNjBkOTM5OTU0ZjA3NGY2NjUxNWQ2YWM1NDU0OWYzNmQ0ODk3MDk2NyIsImNhbm9uaWNhbFNoYTI1NiI6ImIwZDUwNjI4YWU3M2QxZjY5MmFmNTE0MTZlNjE1OTg4OWQ3ZDUzYzc3M2QzODZiZGY2Mzk3Njc0ZjdiMzBlYWIiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjM5Y2NkZjE0ZWVmZTBjZTA2MDY5NTY2ODBiNDg3YjI5ZTg2Y2JhYjZmZjkwMzcxOWM5NmY2NWMxODg5NzdhNDQiLCJlbnRyeVNoYTI1NiI6ImQ5ZDZjYzhjN2EzMzliNjVmZGRkNjRkYjhmYzYxOWI0ZmQ1ZTczMjQzNGIyY2RiNWE1MWM5MGY5Njc2ZDc5OWIifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NTYsInBhaXIiOjI4LCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjIyOjU0LjEzOVoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyMzoxNi42MzRaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzI4Lmpzb24iLCJyYXdTaGEyNTYiOiJmN2JhN2U0NDgwMjlmZDY3NGZiOGZkMTM4NDQ1MmRmMDA4NGQwZTYxY2JiZTlhMmY5ZGMyMGNjYzdmZTNhNjhiIiwiY2Fub25pY2FsU2hhMjU2IjoiYzA1NTk5ODI0MzA3MGU2ODExZDAwMzAzNDY4YjExMGM1MDg1ZThkZmVmNTYyYjI0NTMwOTcwNGI5ZmNlNmUyNiIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiZDlkNmNjOGM3YTMzOWI2NWZkZGQ2NGRiOGZjNjE5YjRmZDVlNzMyNDM0YjJjZGI1YTUxYzkwZjk2NzZkNzk5YiIsImVudHJ5U2hhMjU2IjoiOTI0MjE5ZmRkM2E4OWM3YzhhMDJlNDZmZDRiZjVmNGEyMTQ0OTAwOWQ1MDc2NGJjMDdiZDFjNTE5MjU3YmUxMCJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo1NywicGFpciI6MjksInZhcmlhbnQiOiJiYXNlbGluZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MjM6MTYuNzA2WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjIzOjM5LjI3OFoiLCJyYXdQYXRoIjoiYmFzZWxpbmUvMjkuanNvbiIsInJhd1NoYTI1NiI6ImZiZjRlYzFiZmEyNTMyYjBjMGRlNTA2ODAzNmI3ODAxZWY2ODczNTNmOGEyYzExOGQ1OTlkMDZkNTVhNTFjNzUiLCJjYW5vbmljYWxTaGEyNTYiOiI3MWZkNmU0MWU4ZmQwMGJlZWJmNzNmN2RjN2I4ODE3YmE4ZDNkNjM5MjZiYmE2YzBhYWU0YWE0M2ZkZGYxMTJkIiwic2FtcGxlU2NoZW1hIjoicm91bmQxMy1wbGF5Z3JvdW5kLXNhbXBsZS12MyIsImVudHJ5Qmx1ZUlkIjoiRU5lWm9DQ290Tm9IVXZKQlRwZzZKWXU5ODU0SFA3ckFiRE5FR1VKdWJlTFciLCJydW5uZXJTaGEyNTYiOiI5OTYyMTA1NzA3MDRiMzJjYWYzYTM4ODYwNDRmOGYxYjM0YzY5ODI0YzdiYTRhMGY0NTE4ZmVhMjM1MmM3YjVkIiwiaW1wb3J0ZXJTaGEyNTYiOiJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwicHJlZmxpZ2h0U2hhMjU2IjoiZmI3N2FjYTEyNWMzMjQzODJkMTEwMTI3YzljMTI1ZjZiZGIxMWIzNDhjZjE3YmU1NDExM2I4OGVhYjRhMGExZSIsInByZXZpb3VzRW50cnlTaGEyNTYiOiI5MjQyMTlmZGQzYTg5YzdjOGEwMmU0NmZkNGJmNWY0YTIxNDQ5MDA5ZDUwNzY0YmMwN2JkMWM1MTkyNTdiZTEwIiwiZW50cnlTaGEyNTYiOiJlY2I3OTViYzQ2YWZmMGRhMDIwZDVlYmI1OWE0YmUyNTJlNjdhZjY0NDk1ODk5YjEzZDVjYjJjZjdlMGQ1NzQ3In0KeyJzY2hlbWFJZCI6ImJsdWUtY29vcmRpbmF0aW9uLXJvdW5kMTMtYWItbGVkZ2VyLWVudHJ5LXYxIiwiY2FtcGFpZ25JZCI6Ijg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsIm9yZGluYWwiOjU4LCJwYWlyIjoyOSwidmFyaWFudCI6ImNhbmRpZGF0ZSIsInN0YXJ0ZWRBdCI6IjIwMjYtMDgtMTFUMTI6MjM6MzkuMzQ1WiIsImVuZGVkQXQiOiIyMDI2LTA4LTExVDEyOjI0OjAyLjAyMFoiLCJyYXdQYXRoIjoiY2FuZGlkYXRlLzI5Lmpzb24iLCJyYXdTaGEyNTYiOiJkNDI0NmU0OWEzZTUxZDVlZWExNzgzODNhNTRjYjUzZmFlMzRiOTIyYjE1OTZiMGY4MWIwNmU2YWQ5MDQ0YmMyIiwiY2Fub25pY2FsU2hhMjU2IjoiMDA1Yzc2N2NjYTU3OTQ4OWMxMWI0NGQxMzEyNjYzMGY5YTRjYmYwMjg1NzFlNTMzMzZmZWM5MjM3M2MzYTQyNyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiZWNiNzk1YmM0NmFmZjBkYTAyMGQ1ZWJiNTlhNGJlMjUyZTY3YWY2NDQ5NTg5OWIxM2Q1Y2IyY2Y3ZTBkNTc0NyIsImVudHJ5U2hhMjU2IjoiMTJkMWU5YTAwZjhmNzM5N2IwNDY3NGNiMTkxOTcyY2Q2NWZkZmJkZGM2OGI4MGQ4MDA5MjdhNjRmYTg3NTQ3MiJ9Cnsic2NoZW1hSWQiOiJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLWxlZGdlci1lbnRyeS12MSIsImNhbXBhaWduSWQiOiI4NWZkMTI0Zi0zMjM1LTQ4NzQtOTE0My1mYzM3OWIzN2I5MjQiLCJvcmRpbmFsIjo1OSwicGFpciI6MzAsInZhcmlhbnQiOiJjYW5kaWRhdGUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjI0OjAyLjA4N1oiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyNDoyNS4zMDlaIiwicmF3UGF0aCI6ImNhbmRpZGF0ZS8zMC5qc29uIiwicmF3U2hhMjU2IjoiY2NjN2E0NDllZDg2MDc5MjVhZmEyZDRmOTBjOGM4MWRhNzdiZDJmNjU1NDg4MzFkYjAyZWU1YmZkZDMzNzIzMiIsImNhbm9uaWNhbFNoYTI1NiI6IjIyZTIwYmM2MjUyNGRiOTdmYTI1NGM2MmUxMDQzYzc2MDliODVlYjlkNWYxMzZmZDhhY2U3NjEwMWVhZDJhZjMiLCJzYW1wbGVTY2hlbWEiOiJyb3VuZDEzLXBsYXlncm91bmQtc2FtcGxlLXYzIiwiZW50cnlCbHVlSWQiOiJFTmVab0NDb3ROb0hVdkpCVHBnNkpZdTk4NTRIUDdyQWJETkVHVUp1YmVMVyIsInJ1bm5lclNoYTI1NiI6Ijk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLCJpbXBvcnRlclNoYTI1NiI6ImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLCJwcmVmbGlnaHRTaGEyNTYiOiJmYjc3YWNhMTI1YzMyNDM4MmQxMTAxMjdjOWMxMjVmNmJkYjExYjM0OGNmMTdiZTU0MTEzYjg4ZWFiNGEwYTFlIiwicHJldmlvdXNFbnRyeVNoYTI1NiI6IjEyZDFlOWEwMGY4ZjczOTdiMDQ2NzRjYjE5MTk3MmNkNjVmZGZiZGRjNjhiODBkODAwOTI3YTY0ZmE4NzU0NzIiLCJlbnRyeVNoYTI1NiI6ImVmMjNiMWQzMGY0YWVhYzc1YTM3ZWFjNjU0M2Q2MzNiZjE3YTk0OWE1OGE4Njk2ZDMxZDk5OWEzNjI5ZDFiZjAifQp7InNjaGVtYUlkIjoiYmx1ZS1jb29yZGluYXRpb24tcm91bmQxMy1hYi1sZWRnZXItZW50cnktdjEiLCJjYW1wYWlnbklkIjoiODVmZDEyNGYtMzIzNS00ODc0LTkxNDMtZmMzNzliMzdiOTI0Iiwib3JkaW5hbCI6NjAsInBhaXIiOjMwLCJ2YXJpYW50IjoiYmFzZWxpbmUiLCJzdGFydGVkQXQiOiIyMDI2LTA4LTExVDEyOjI0OjI1LjM3OFoiLCJlbmRlZEF0IjoiMjAyNi0wOC0xMVQxMjoyNDo0OC4yMDVaIiwicmF3UGF0aCI6ImJhc2VsaW5lLzMwLmpzb24iLCJyYXdTaGEyNTYiOiJjNGFiNDYwODM3NzdmNzJhZjViMzhmYzc0ZmM2MGY2MmRmZjc1NzBkMzdjMjhlYTYxZjZlYjhiNjkxMWU1MjA3IiwiY2Fub25pY2FsU2hhMjU2IjoiMTM2YTIyZGE3ZmYzMTk5MjZkMmMyM2E0OTNiMDczMGM0MTM0M2E5MmUwZjUyMzRhNTllZGQwNTJmMzcyMGE1MyIsInNhbXBsZVNjaGVtYSI6InJvdW5kMTMtcGxheWdyb3VuZC1zYW1wbGUtdjMiLCJlbnRyeUJsdWVJZCI6IkVOZVpvQ0NvdE5vSFV2SkJUcGc2Sll1OTg1NEhQN3JBYkRORUdVSnViZUxXIiwicnVubmVyU2hhMjU2IjoiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsImltcG9ydGVyU2hhMjU2IjoiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsInByZWZsaWdodFNoYTI1NiI6ImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLCJwcmV2aW91c0VudHJ5U2hhMjU2IjoiZWYyM2IxZDMwZjRhZWFjNzVhMzdlYWM2NTQzZDYzM2JmMTdhOTQ5YTU4YTg2OTZkMzFkOTk5YTM2MjlkMWJmMCIsImVudHJ5U2hhMjU2IjoiNzJkZDg3NDgwYjFmMmUyNTExM2QxOGRiYmM3MzIxYzZlZDU3MjcxMTE3NjkyZjBlNjNlYTdjNjg1MTJkYTE5ZCJ9Cg==", + "postflightBase64": "ewogICJzY2hlbWFJZCI6ICJibHVlLWNvb3JkaW5hdGlvbi1yb3VuZDEzLWFiLXBvc3RmbGlnaHQtdjIiLAogICJjYW1wYWlnbklkIjogIjg1ZmQxMjRmLTMyMzUtNDg3NC05MTQzLWZjMzc5YjM3YjkyNCIsCiAgImNhcHR1cmVkQXQiOiAiMjAyNi0wOC0xMVQxMjoyNDo1MC4xNDBaIiwKICAiYmluZGluZ3MiOiB7CiAgICAiaW50ZWdyaXR5TW9kZSI6ICJGVUxMX0NPTlRFTlRfTUFOSUZFU1RTX0FORF9PQlNFUlZFRF9DT01QTEVUSU9OX0xFREdFUiIsCiAgICAicmF3Um9vdCI6ICIvcHJpdmF0ZS90bXAvcm91bmQxMy1hYi1maW5hbC12NCIsCiAgICAic2FtcGxlc1BlclZhcmlhbnQiOiAzMCwKICAgICJ3YXJtdXBzIjogMywKICAgICJvcmRlciI6ICJPRERfQkFTRUxJTkVfQ0FORElEQVRFX0VWRU5fQ0FORElEQVRFX0JBU0VMSU5FIiwKICAgICJydW5uZXIiOiB7CiAgICAgICJwYXRoIjogIi9Vc2Vycy9waW90ci9kYXRhL2JsdWUtY29udHJhY3QtamF2YS9zY3JpcHRzL3J1bi1yb3VuZDEzLXNhbWUtbWFjaGluZS1hYi5zaCIsCiAgICAgICJzaGEyNTYiOiAiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsCiAgICAgICJkZXBlbmRlbmN5TW9kZSI6ICJsb2NhbC1jb21wb3NpdGUiLAogICAgICAidGVzdEphdmFWZXJzaW9uIjogMTcKICAgIH0sCiAgICAiaW1wb3J0ZXIiOiB7CiAgICAgICJwYXRoIjogIi9Vc2Vycy9waW90ci9kYXRhL2JsdWUtY29udHJhY3QtamF2YS9zY3JpcHRzL3JvdW5kMTMtYWItZXZpZGVuY2UubWpzIiwKICAgICAgInNoYTI1NiI6ICJlMzNjMTdjOTRmOGNlYzc2Mjk4MDM3NTAwNWU3NjMyZTFhN2NkMDViMzc4YWRiZmQzODM3NmQyZmU3MjFiZjUwIiwKICAgICAgInNpemUiOiA2NTg5NywKICAgICAgIm1vZGUiOiA0OTMsCiAgICAgICJub2RlVmVyc2lvbiI6ICJ2MjIuMTkuMCIsCiAgICAgICJub2RlRXhlY3V0YWJsZSI6ICIvVXNlcnMvcGlvdHIvLm52bS92ZXJzaW9ucy9ub2RlL3YyMi4xOS4wL2Jpbi9ub2RlIgogICAgfSwKICAgICJydW50aW1lUHJlZmxpZ2h0IjogewogICAgICAiaWRlbnRpdHkiOiB7CiAgICAgICAgImphdmFWZXJzaW9uIjogIjE3LjAuMTAiLAogICAgICAgICJqYXZhVmVuZG9yIjogIk9yYWNsZSBDb3Jwb3JhdGlvbiIsCiAgICAgICAgImphdmFIb21lIjogIi9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUiLAogICAgICAgICJvc05hbWUiOiAiTWFjIE9TIFgiLAogICAgICAgICJvc1ZlcnNpb24iOiAiMjYuNS4yIiwKICAgICAgICAib3NBcmNoIjogImFhcmNoNjQiLAogICAgICAgICJhdmFpbGFibGVQcm9jZXNzb3JzIjogMTYKICAgICAgfSwKICAgICAgInNldHRpbmdzU2hhMjU2IjogImY2MDI4MWYyNGZhNjQzMTljMDJlNjMzMDljOWIzNTQxZGU3NWY0ZmQ0NThhY2MyMzc4NzBiOGE2OWNiYTJjMTAiCiAgICB9LAogICAgImhvc3RJZGVudGl0eSI6IHsKICAgICAgImhvc3RuYW1lIjogIk1hY0Jvb2stUHJvLTUubG9jYWwiLAogICAgICAicGxhdGZvcm0iOiAiZGFyd2luIiwKICAgICAgImtlcm5lbFJlbGVhc2UiOiAiMjUuNS4wIiwKICAgICAgImFyY2hpdGVjdHVyZSI6ICJhcm02NCIsCiAgICAgICJjcHVNb2RlbCI6ICJBcHBsZSBNMyBNYXgiLAogICAgICAicGh5c2ljYWxDcHVDb3VudCI6IDE2LAogICAgICAicGh5c2ljYWxDcHVDb3VudFNvdXJjZSI6ICJEQVJXSU5fU1lTVEVNX1BST0ZJTEVSIiwKICAgICAgImxvZ2ljYWxDcHVDb3VudCI6IDE2LAogICAgICAidG90YWxNZW1vcnlCeXRlcyI6IDY4NzE5NDc2NzM2LAogICAgICAic2hhMjU2IjogIjYwYTkyN2RhMjE2NTUxODhkNDRmMTg2M2E2Zjc5MThlOTNiZjJjOTcyODY1N2MxMmE1M2IzY2Y1NzE5ZDE3ODMiCiAgICB9LAogICAgImdyYWRsZVByZWZsaWdodCI6IHsKICAgICAgImJhc2VsaW5lIjogewogICAgICAgICJvdXRwdXQiOiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5HcmFkbGUgOS42LjBcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5CdWlsZCB0aW1lOiAgICAyMDI2LTA2LTE4IDIzOjE5OjAzIFVUQ1xuUmV2aXNpb246ICAgICAgM2Y3NTBmMDNkNzdlNDIzMjdjNWY5ZmNiOTk5MjExMDA4ODMzMGEzMlxuXG5Lb3RsaW46ICAgICAgICAyLjMuMjFcbkdyb292eTogICAgICAgIDQuMC4zMlxuQW50OiAgICAgICAgICAgQXBhY2hlIEFudChUTSkgdmVyc2lvbiAxLjEwLjE3IGNvbXBpbGVkIG9uIEFwcmlsIDYgMjAyNlxuTGF1bmNoZXIgSlZNOiAgMTcuMC4xMCAoT3JhY2xlIENvcnBvcmF0aW9uIDE3LjAuMTArMTEtTFRTLTI0MClcbkRhZW1vbiBKVk06ICAgIC9MaWJyYXJ5L0phdmEvSmF2YVZpcnR1YWxNYWNoaW5lcy9qZGstMTcuamRrL0NvbnRlbnRzL0hvbWUgKG5vIERhZW1vbiBKVk0gc3BlY2lmaWVkLCB1c2luZyBjdXJyZW50IEphdmEgaG9tZSlcbk9TOiAgICAgICAgICAgIE1hYyBPUyBYIDI2LjUuMiBhYXJjaDY0IiwKICAgICAgICAic2hhMjU2IjogIjU0NDNlY2NhMjBiN2U3ZjliNDYxODNlMDBjZWMzMWIyZjhjMGRiMmZjMGQwYzVhOGIxYWNmODlhNzllOGQ4NTAiCiAgICAgIH0sCiAgICAgICJjYW5kaWRhdGUiOiB7CiAgICAgICAgIm91dHB1dCI6ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkdyYWRsZSA5LjYuMFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkJ1aWxkIHRpbWU6ICAgIDIwMjYtMDYtMTggMjM6MTk6MDMgVVRDXG5SZXZpc2lvbjogICAgICAzZjc1MGYwM2Q3N2U0MjMyN2M1ZjlmY2I5OTkyMTEwMDg4MzMwYTMyXG5cbktvdGxpbjogICAgICAgIDIuMy4yMVxuR3Jvb3Z5OiAgICAgICAgNC4wLjMyXG5BbnQ6ICAgICAgICAgICBBcGFjaGUgQW50KFRNKSB2ZXJzaW9uIDEuMTAuMTcgY29tcGlsZWQgb24gQXByaWwgNiAyMDI2XG5MYXVuY2hlciBKVk06ICAxNy4wLjEwIChPcmFjbGUgQ29ycG9yYXRpb24gMTcuMC4xMCsxMS1MVFMtMjQwKVxuRGFlbW9uIEpWTTogICAgL0xpYnJhcnkvSmF2YS9KYXZhVmlydHVhbE1hY2hpbmVzL2pkay0xNy5qZGsvQ29udGVudHMvSG9tZSAobm8gRGFlbW9uIEpWTSBzcGVjaWZpZWQsIHVzaW5nIGN1cnJlbnQgSmF2YSBob21lKVxuT1M6ICAgICAgICAgICAgTWFjIE9TIFggMjYuNS4yIGFhcmNoNjQiLAogICAgICAgICJzaGEyNTYiOiAiNTQ0M2VjY2EyMGI3ZTdmOWI0NjE4M2UwMGNlYzMxYjJmOGMwZGIyZmMwZDBjNWE4YjFhY2Y4OWE3OWU4ZDg1MCIKICAgICAgfSwKICAgICAgInNhbWVXcmFwcGVyIjogdHJ1ZQogICAgfSwKICAgICJ3cmFwcGVyIjogewogICAgICAiYmFzZWxpbmUiOiBbCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyIsCiAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJjYW5kaWRhdGUiOiBbCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyIsCiAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJiaW5kaW5nU2hhMjU2IjogIjAxNTMxYjY1MTM2NTUyM2Q3NjUyMTNiZTcwMTE1YmE3MDI0NTZlMjU2OTg1MmY1NTZiYTJlOTk3ZDFlNTI4YTUiCiAgICB9LAogICAgImxvY2tzIjogewogICAgICAiYmFzZWxpbmUiOiBbCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL2JleC1zb3VyY2UubG9jayIsCiAgICAgICAgICAic2l6ZSI6IDE1MywKICAgICAgICAgICJzaGEyNTYiOiAiMDFjOTZjN2U3NmMxYTc1ZGQ2YTBkZmQwOTY1NmQ2NDQ5OTU3ZmIxNDRkZDM2M2Y3ODc1NmZjNTU2ODVkYjQxNCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogImdyYWRsZS9yZXBvc2l0b3J5LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgInNoYTI1NiI6ICJmZDNiMDU1MTA4ZWY2NWE3ZDU0ZTA5YzlkOWM2MTljMjA4YTNlMWY3NTE4YjZlMWY1MTRiNzVkNDE2MzdmZmY4IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3B1Ymxpc2hlZC1hcnRpZmFjdC5sb2NrZmlsZSIsCiAgICAgICAgICAic2l6ZSI6IDc5MjksCiAgICAgICAgICAic2hhMjU2IjogImI0ZTdiNzhiY2Q3YWU5Mjk1OWI2MWY4ODJhMGM3NjJhNTY0ODRhNTdkOGQ2YTEzODhjMWZmYWJiOTYyYmIxNTciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUubG9ja2ZpbGUiLAogICAgICAgICAgInNpemUiOiA2MzY0LAogICAgICAgICAgInNoYTI1NiI6ICIyOWE2ZTE5OTZmODhmMDdhZTU2ZTRjNzIwNDA5YzA5MjQ0MGJjNmFkYTE5NzEyNWEwZGZlZjAxNzIyYzNlOTRjIgogICAgICAgIH0KICAgICAgXSwKICAgICAgImNhbmRpZGF0ZSI6IFsKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvYmV4LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICJzaXplIjogMTUzLAogICAgICAgICAgInNoYTI1NiI6ICIwMWM5NmM3ZTc2YzFhNzVkZDZhMGRmZDA5NjU2ZDY0NDk5NTdmYjE0NGRkMzYzZjc4NzU2ZmM1NTY4NWRiNDE0IgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3JlcG9zaXRvcnktc291cmNlLmxvY2siLAogICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAic2hhMjU2IjogImZkM2IwNTUxMDhlZjY1YTdkNTRlMDljOWQ5YzYxOWMyMDhhM2UxZjc1MThiNmUxZjUxNGI3NWQ0MTYzN2ZmZjgiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcHVibGlzaGVkLWFydGlmYWN0LmxvY2tmaWxlIiwKICAgICAgICAgICJzaXplIjogNzkyOSwKICAgICAgICAgICJzaGEyNTYiOiAiYjRlN2I3OGJjZDdhZTkyOTU5YjYxZjg4MmEwYzc2MmE1NjQ4NGE1N2Q4ZDZhMTM4OGMxZmZhYmI5NjJiYjE1NyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogImdyYWRsZS5sb2NrZmlsZSIsCiAgICAgICAgICAic2l6ZSI6IDYzNjQsCiAgICAgICAgICAic2hhMjU2IjogIjI5YTZlMTk5NmY4OGYwN2FlNTZlNGM3MjA0MDljMDkyNDQwYmM2YWRhMTk3MTI1YTBkZmVmMDE3MjJjM2U5NGMiCiAgICAgICAgfQogICAgICBdLAogICAgICAiYmluZGluZ1NoYTI1NiI6ICI5MDIzY2ZiMjMyOGZiYmZkZGZlYzViMGVmZmM3YTBmNjkyZTdkODNjMTIyNTVhMWIxY2Y5YzEzZThkNmUxYWJlIgogICAgfSwKICAgICJmaXh0dXJlIjogewogICAgICAiYmFzZWxpbmUiOiBbCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgInNpemUiOiA1NzcxLAogICAgICAgICAgInNoYTI1NiI6ICJmMTJlODkyYzIxM2JiY2Y3NGQwOWUyYjcxYmExZmU4ZjczMzI3ZWVhZDA3YWQzZmZkYTNkMzE5N2E3NGI1MmYxIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICJzaXplIjogNDI4NSwKICAgICAgICAgICJzaGEyNTYiOiAiMjk0ZTIwOTBiNWI2YTFjZjI2OGQwMDIzZDc1ZGZjMTRkNGY2ZTUwZWQwNWMxYTdhOTFlZjE2MDE1MzZjMmNjMyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3BsYXlncm91bmQvZml2ZS1vY2N1cnJlbmNlLWluaXRpYWxpemF0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAic2l6ZSI6IDY3OTgsCiAgICAgICAgICAic2hhMjU2IjogImIxZTk0YzAzOWQwZmQwZGY3MGIwYzgwM2ViZTkyMWEyOTBkMTU5MGJhYzY5YTkwNzNmZTQ5MTBjYTg5MzliNmIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtZ2FtZS55YW1sIiwKICAgICAgICAgICJzaXplIjogMzM4NiwKICAgICAgICAgICJzaGEyNTYiOiAiYmYxYjc5OThkZDkwNjRmMzJmMDRkMmJhMjg1YjVhZmQ0NDk2NDNhYmY3N2YzZTM1NjNiNjBmNDcyZTNlOTEyMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJjYW5kaWRhdGUiOiBbCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgInNpemUiOiA1NzcxLAogICAgICAgICAgInNoYTI1NiI6ICJmMTJlODkyYzIxM2JiY2Y3NGQwOWUyYjcxYmExZmU4ZjczMzI3ZWVhZDA3YWQzZmZkYTNkMzE5N2E3NGI1MmYxIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICJzaXplIjogNDI4NSwKICAgICAgICAgICJzaGEyNTYiOiAiMjk0ZTIwOTBiNWI2YTFjZjI2OGQwMDIzZDc1ZGZjMTRkNGY2ZTUwZWQwNWMxYTdhOTFlZjE2MDE1MzZjMmNjMyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3BsYXlncm91bmQvZml2ZS1vY2N1cnJlbmNlLWluaXRpYWxpemF0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAic2l6ZSI6IDY3OTgsCiAgICAgICAgICAic2hhMjU2IjogImIxZTk0YzAzOWQwZmQwZGY3MGIwYzgwM2ViZTkyMWEyOTBkMTU5MGJhYzY5YTkwNzNmZTQ5MTBjYTg5MzliNmIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtZ2FtZS55YW1sIiwKICAgICAgICAgICJzaXplIjogMzM4NiwKICAgICAgICAgICJzaGEyNTYiOiAiYmYxYjc5OThkZDkwNjRmMzJmMDRkMmJhMjg1YjVhZmQ0NDk2NDNhYmY3N2YzZTM1NjNiNjBmNDcyZTNlOTEyMSIKICAgICAgICB9CiAgICAgIF0sCiAgICAgICJiaW5kaW5nU2hhMjU2IjogImIzNGMwZWExMjMwZGZmMGRlMDZhNTQxNWVkNzYyNDAyNTlhMzczMTg3ZmMyMzg4MTQyOGFmMDY4ZTg4ZDA1YWQiCiAgICB9LAogICAgImJhc2VsaW5lIjogewogICAgICAicHJvamVjdFBhdGgiOiAiL3ByaXZhdGUvdG1wL3JvdW5kMTMtYmFzZWxpbmUtcHJvamVjdCIsCiAgICAgICJhcmNoaXZlUGF0aCI6ICIvVXNlcnMvcGlvdHIvZGF0YS9ibHVlLWNvbnRyYWN0LWphdmEvQXJjaGl2ZS56aXAiLAogICAgICAiYXJjaGl2ZVNoYTI1NiI6ICIyZjMwM2FmZDk0MzU5MzcxNDVjZTdmZTA5ZWI2NTVmZjFhMDVlZTZlZDc0ODRmYWVhNjJkOTM1NDRhM2NjZjNlIiwKICAgICAgIm1haW5Tb3VyY2VNYW5pZmVzdCI6IHsKICAgICAgICAiZmlsZXMiOiAxMDgsCiAgICAgICAgInNoYTI1NiI6ICJiM2E3OGY1NTE4MDlkMzc3ZGIzYTdjNTAwMDJjYzk0MjQ3MGRhZGUyNmI1YjRiZDE0ZTM2MTA4NTg2MmU5MmFjIgogICAgICB9LAogICAgICAiYXJjaGl2ZU1hbmlmZXN0IjogewogICAgICAgICJhbGdvcml0aG0iOiAiU0hBLTI1NiIsCiAgICAgICAgImluY2x1ZGVNb2RlIjogZmFsc2UsCiAgICAgICAgImZpbGVzIjogMjg5LAogICAgICAgICJlbnRyaWVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJidWlsZC5ncmFkbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjU5MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZThkYmFkYmQzYWI4YzMyYWY5NjA5Y2Y5N2IyNzdjMzllNzNiM2UzYjQxNzY2MDQwYTc2ZDNiOTUzODM3Y2E3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiQ0hBTkdFTE9HLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlOWUzNmI2OGVmOTRhZTQ5ZTYwYjBjNmI4ZmE4ZDZmZTRmMWNlZDIxYmE5NGZiODZkMGQ2OWVmMjEzZmZiZDMzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiQ09OVFJJQlVUSU5HLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyMjNiYmFhMzE2N2VmMjc5ZjhmNzdkZTM1ZmUwODQ5YmQwYTdjNTc1ZDdkNDVjMzI2ODFmMzczMDM1M2Y1YjNkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9hcmNoaXRlY3R1cmUvY29tcGFjdC1lbmdpbmUubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDk5LAogICAgICAgICAgICAic2hhMjU2IjogIjBiYzZlZTc5ZTMzZDg4MDBmNjFiZmU1ZjQzNTk1YjU2YTIyYTQ1NmUxOWFhNGFmZGQwYmMyMmE2ZTY0ODk1YjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2RldmVsb3BtZW50L2J1aWxkLWFuZC10ZXN0Lm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUzOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmODY0NzdkN2NkYzIxNGIzOGVkYTgwMzIzMTIyNDE3YzE4MTRmYjIxMTQ5NzM3NDBlZGQyZmM5ZTdjM2U2YTIwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9kZXZlbG9wbWVudC9pbnRlcm5hbHMubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjA0LAogICAgICAgICAgICAic2hhMjU2IjogImQ5YWRiZjhiYTRiY2VhY2VjMWY1YjcwNzc0ZmE0YmMzZjk0MjU0YWFkNTIzM2ZhZTdiYWRhOTFkMTE0MGRmYTUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2RldmVsb3BtZW50L3JlbGVhc2luZy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4MDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDY3NDk4OWYyMjQ0ZGY1OGY5YjViMjY5NzNjMTlhZWY1MGE1ZmM5YmIxYjc4MTgxYWI0YTMxYzBmMjMwYTM5NSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZGV2ZWxvcG1lbnQvdGVzdC1zdHJhdGVneS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1MDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzc0OGVkZTgyMTFkMGU2NjkwN2RkZDEzNzExY2FiNTY0NDBjZTdhNmJkYmVkZjkxOGYzYWUyZGRjNDU3YmJmNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZXhhbXBsZXMvY291bnRlci5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc5MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NGZlMGVlYjRlNmQ1Y2Q4Y2I1N2M4M2FmMTU4NDY5ZWZiY2VhMGRkNjJkNDZhMjM0YjQ2NmM0NDM5NjQ4YTZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9leGFtcGxlcy9sYXJnZS1ob3N0LXBheW5vdGUubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzFjOWJkMGRjYTc4YjNmMTE5OTNkOGZjZGQyOTM0ZTk4YjVlZTM1ZGM1ZTJmNGU0ZDU4OTU3ZjY1ODg3NGQ5NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZXhhbXBsZXMvbmJhLWNhdGNoLXVwLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTMzLAogICAgICAgICAgICAic2hhMjU2IjogIjY4MDcxZGIxODg0YTRjYmJiNzcyYTUxZjc3M2ZiODY0NWUwNDk0YWQyZWY3MTE4MjkwNTc3MDZkODc1MTgxOTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2V4YW1wbGVzL25iYS1zaGFyZWQtZ2FtZS1saWZlY3ljbGUubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjExLAogICAgICAgICAgICAic2hhMjU2IjogImI1MjI1MDgyMTMyODc0OWE5NjE2NzVjMDg5YzRkNmYwNWQyMWZmYzQxMmEwMmI2NWI2NzM2MWMzMTkwYWMyZmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2xpbWl0YXRpb25zLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzEwNywKICAgICAgICAgICAgInNoYTI1NiI6ICIwOTc2NjU5MDM2N2Y1NjUyZWNiODIwMzVjOGE2YTMzNTZmM2UwYTQxM2Q4YWJjZDA5MmNlYTZiNmQyYTJlYjA1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9taWdyYXRpb24tZnJvbS0yLngubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTM0LAogICAgICAgICAgICAic2hhMjU2IjogImZmNmM1ZDM2NDg1OWFhMWUzYjc0NGVmZWJjMGQ5NmQ3MTRkZjk5M2IzNTA0MzMzY2JkNjZkY2U3ODYwZTIwMDMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL29wZXJhdGlvbnMvZmFpbHVyZS1tb2RlbC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5MDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzJkNTU1Y2EzNmVhNzkxMmRhMzY1MDdhYjc0MGE2NjJhZTE1NDllMzhmZmQyOTYxYmYzZWRkOWQ2ODg4OThjZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcGVyZm9ybWFuY2UvaG9zdC12cy1mcm96ZW4tdGltZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwNjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGI5OWU3MmI4YzM3NmIwZTY1ZmQwMDZkMTg3NmQxMGJhMmIwZGVmMTI4NDM2MDcxODgzYTkyNWU1ZWFmZGRmNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVmZXJlbmNlL21ldHJpY3MubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MjUzLAogICAgICAgICAgICAic2hhMjU2IjogImFkMWU4ZTdhMGJmNjY0YjU0NmEyY2QzOTliZjYxNzQ1M2Q0ZTc4MDJiNjZjMzZhOGM3ZmE4NDMyMjMxNThhMGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlZmVyZW5jZS9wdWJsaWMtYXBpLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjA0NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3YmY1ZTZjYjI4YjRmOGJmNDg5YzYyZDdjMmI1MjgyMjFlMjJlYTg2MDcwM2M2MTNkNjFmZDQxYjUyODgwZDNlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy8zLjAuMC1yYy4xLWV2aWRlbmNlLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTkxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2QxMGQ2YmFhODlkNzY0ZDE5ZmI3MTk4MzQyMTYzNmYxZmEwNzNmYTllYmUwZDY3NzA1NDY4ODIxY2U3MzA4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy8zLjAuMC1yYy4xLXRlc3QtcmVwb3J0Lm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODcwNywKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTk0YzBmMTMyNGVkN2YwMTU2YzQ1NWYyNTRjOTZmMmRmN2U4YmUyMTM2YWRjMGI0OGZlMDk0ZTMyNjQ3YmRlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy8zLjAuMC1yYy4xLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTA3NywKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZGIwOTg3OWFkOThmNTg3OTE0ZGMwZWJmMTQ3ZWNkN2M1MWEwM2MyY2FkOTgyNDM3NzFkNmJkYTA0NTBhODA4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2Jhc2VsaW5lLWxhcmdlLWhvc3QtdGltaW5ncy5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk2NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjIzMGFlZTdmNmRiNGUzZDI5Yzg4MzFkMWM3NjU0MjM2YWY2YjhlNGFmM2NiYjYyNTNkYWEyZTU0NWMyM2NhMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9iYXNlbGluZS1ydW50aW1lLWNvbXBhcmlzb24uanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNTk0LAogICAgICAgICAgICAic2hhMjU2IjogIjVjZDNiYTM0NDM3ZjkyZGU5YTVlZmQ0ZTEyOTU0YWNhM2I5NGM4MjcxMDE2NGFhZjUwN2MyMjU3ZmJjZWUyMTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvYmFzZWxpbmUtcnVudGltZS1wcm92ZW5hbmNlLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM3LAogICAgICAgICAgICAic2hhMjU2IjogImQ5YTgxOWI2OWM0ZmE1MjkyOTlmODBiYTI5ZjBkZjYxNDU4ZDFkY2YxOWM0ZGMxZmU2YWI3OTViZTJhZmFiZWYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvZmluYWwtbGFyZ2UtaG9zdC10aW1pbmdzLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTY1OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2M4ZWVjMmYyYzUxYjQzYWQ3NzZkNmM0YjY1ZWU4NjExNGM2NmY2MTE2YmNmNjg4MGNkMGRkZGEyZjhiZTk0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2ZpbmFsLXJ1bnRpbWUtY29tcGFyaXNvbi5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA1OTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTA1ZjQwYjQ0YzY5MGZhM2E5NjRjNWEwMWM0NzAwNTY1OWYxYzJhY2Y1OTBhNDI0M2FkNWFjMzYzZDI0YmM2NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9maW5hbC1ydW50aW1lLXByb3ZlbmFuY2UuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjY3MjU5Zjc0Y2JlOTQxYjIzYWE4MWRiZTg1MGE1NjAwNGQwNzUyMmJlZDFlNTRmOWEyZjIxM2VkMDE5MjViMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMi9uYmEtc2hhcmVkLWdhbWUtbGlmZWN5Y2xlLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NTQ3LAogICAgICAgICAgICAic2hhMjU2IjogIjQzM2I2OWEwMTA4NjZjYzAwNGY5MmM3MDFiZDZmMzM4YTc3MGNmMDFhMmVmYTg0NWRmMjRlOTA3Nzc5ZGUzOGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTIvdGhyZWUtc2NlbmFyaW8tcDk1LXByb3ZlbmFuY2UuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3Nzc2LAogICAgICAgICAgICAic2hhMjU2IjogIjc1NGZjNTBmYjkyOTg1ZjM1YjJlNTYzYTQ2MDU0ZDg1YjIxZjA4MjM0OTUzN2E5NDA3OWQ4ZjhlZTNjZjA2YTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL3JvdW5kMTEtdmVyaWZpY2F0aW9uLnNjaGVtYS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA4ODQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTM5ZDBlM2Y5MTI4YTAxNTZiOTBmMjM3ZjcxY2ZlMjhiMzA3NDEyMWY4NmQ0MzY4YTA1MWQ3NGRhMGQ5YWU2MiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvcm91bmQxMi12ZXJpZmljYXRpb24uc2NoZW1hLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTI4MiwKICAgICAgICAgICAgInNoYTI1NiI6ICIwMDRkMWRiNTI4MWE3NmYzODgwNTFhM2RiN2JjMmIwZTIzMmZjNzgzOWQ1ZGJkZjM5YjI2ZDVmZWNjYjlkMTE3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9zZW1hbnRpY3MvaGlzdG9yaWNhbC1jYXRjaC11cC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQwNjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDNhNTlmMzViY2FjOWViYmMzMTZjYTBiNzVkZmI4YjdlYzk0YmQ2YjFjN2RhN2IzOWJkOWIyOTE4ZTRlNThkYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvc2VtYW50aWNzL2lkZW50aXR5LWFuZC1yZXZpc2lvbnMubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzYxLAogICAgICAgICAgICAic2hhMjU2IjogIjZjZWRhNWZmODg2YmY1MjZkZmNiNTMyNDc3MmZmM2U1NWZhNWJmMDFkYTQxNDc1NTI5MTYwM2JjZjVkYzNjOTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3NlbWFudGljcy9pbml0aWFsaXphdGlvbi1jYXVzYWxpdHkubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzgyLAogICAgICAgICAgICAic2hhMjU2IjogIjE3MDI3YmExODUyN2U1ZWY2ODJmYjIyYmJkZDQ5YTRiNWM3NGFmNWJiYWNmNDk0MTQyZjYyNjEyY2M5NTdhMTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3NlbWFudGljcy9wcm9jZXNzLWVtYmVkZGVkLWRvY3VtZW50cy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1ODYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzc0YjUyNWUxYWQ3OWE4NTA1NWExNmIyY2Q0MzYzZGY5ZTMzM2MxNWJiYmRiMjFiMThlZDlkZTQwNzQ0ZTQ2ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5sb2NrZmlsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYzNjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjlhNmUxOTk2Zjg4ZjA3YWU1NmU0YzcyMDQwOWMwOTI0NDBiYzZhZGExOTcxMjVhMGRmZWYwMTcyMmMzZTk0YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ5LAogICAgICAgICAgICAic2hhMjU2IjogImZkNzNlOTEzMTdhNTc2YmU5ZmQ3MDdhZDM2Y2VmMmVlYjVmZjVkZDBjYmE3MTE2M2Q4Y2MzMDhmYTY1ODI3YzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvYmV4LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTUzLAogICAgICAgICAgICAic2hhMjU2IjogIjAxYzk2YzdlNzZjMWE3NWRkNmEwZGZkMDk2NTZkNjQ0OTk1N2ZiMTQ0ZGQzNjNmNzg3NTZmYzU1Njg1ZGI0MTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcHVibGlzaGVkLWFydGlmYWN0LmxvY2tmaWxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkyOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiNGU3Yjc4YmNkN2FlOTI5NTliNjFmODgyYTBjNzYyYTU2NDg0YTU3ZDhkNmExMzg4YzFmZmFiYjk2MmJiMTU3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3JlcG9zaXRvcnktc291cmNlLmxvY2siLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmQzYjA1NTEwOGVmNjVhN2Q1NGUwOWM5ZDljNjE5YzIwOGEzZTFmNzUxOGI2ZTFmNTE0Yjc1ZDQxNjM3ZmZmOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ4NDYyLAogICAgICAgICAgICAic2hhMjU2IjogIjQ5N2M4YzJhN2U1MDMxZjZhYTg0N2Y4ODEwNGFhODBhOTM1MzJlYzMyZWUxN2JkYjhkMWQyZjY3YTE5NGE5YzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAic2hhMjU2IjogImU3NGQ0ZjEwN2QyZmVhYjk4OWI5YTA0MWEwMmUyZDJiODU1NjdmZjQ4NDE1YzljN2FkZDVlY2MxOWFiZDE5ZjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3IiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODY1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhNWE1YzE5OWJhMDIxODlhZThjNDZhMzM0MjIzMzcxYTIwNTk5ZDljMjk4ZWY2NWU3NTQwZWRlNGEzZjcyZDU5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldy5iYXQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODQ4LAogICAgICAgICAgICAic2hhMjU2IjogImQ1Mzk2NzZjNDhiNTk2YWZkYTY0Yzk2M2VjOGY3ZWU1NmM3YjNmZTdlM2I4MWQxZGJlMmQxYTFlM2RkOWU5ZjgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJMSUNFTlNFIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA2OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ODMxMzdmNzJkNWRkN2EzMWJkMGU4YTBjNjkzMTQ0M2IzZjM3OGY2YjJmMWZmMGQ5YWZhNzIxZGEzYmM3YzE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiUkVBRE1FLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDM4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YWE1NjVjMzNiYTFmMWQzMDRmZWM3MGQ2MWE4ODJiYTYyMDZkZTZmOWJiY2QwOTk1NDJjY2NjY2EyOWRhZTUyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiU0VDVVJJVFkubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAic2hhMjU2IjogIjFiOGVmZWE5ZmIyZmRlZjA3MjdhOTBiYjA2YzcxODI1OTljNGE2NTg3YWZkYjMyN2YxMGM3YWRhZWY3ZTlkNTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzZXR0aW5ncy5ncmFkbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDAxLAogICAgICAgICAgICAic2hhMjU2IjogImE3Y2E1ODUxZjlmNjYzMjA3MWNlMTJjZjBmNjIwOThkOTk1ZWM5YWMyNDYyZWUwMDNhMTg3YzIzYjYyZGQ2Y2IiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvY29uc3VtZXJUZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vY29uc3VtZXIvUHVibGlzaGVkQXJ0aWZhY3RDb25zdW1lclRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNDQwLAogICAgICAgICAgICAic2hhMjU2IjogIjc4NDk2YzljNjM5ZmYxMDQ2NzNiZTZjNmJiNzkwZmE1NjcxODcwMjdhN2QwOWI1YjQwNzU4M2M0MmMzNjVkNjQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQXBwZW5kQWRtaXNzaW9uQXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNmYxN2Y3M2U4NTE4NDgwMGMxMTYzNGE3ZTYwYjA1MjhjNDU4NWNkN2I0YzQ0MjIwYjRiN2NlY2U4YmY5NDE5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NhY2hlU2VtYW50aWNQYXJpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWMxZTk2NWRlMzc3NDllZjdmMzY2MDdjZGFhZWI0OTYyYzJjMjllZjAyZmRkMGY3OGY1ZGFiOWE0ZDEyOGI2MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9DYXRjaFVwUGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE0LAogICAgICAgICAgICAic2hhMjU2IjogIjM4MGI0MzEyODk3NTJmNjY2NWNhNTlmZGExZjMyNTQyOTczMGI1YmI2ODRmZmY5NDRiYTJkZjc0NTQzZTRkZWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ29uY3VycmVudEVtYmVkZGVkQ2hpbGRDcmVhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDBhMjczYWRiYzk5YzBjMThhNGZjN2ZmM2E2NDAyNmNiNDNjMzg3OTk4YjRhZDEwODhjM2YyMjg2NjM4ZjIwMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db3JlQmVoYXZpb3JJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjIxLAogICAgICAgICAgICAic2hhMjU2IjogIjJjOTQyZDBhNmJkODRkM2ExOTg3ZTM1MjY0MmU3YjQ0NDI3OTg4OTliZjRiNmUyMDI3ZTZiMzk3YmI0MDdiMWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRGVlcFNhbWVFbnRyeU9yZGVyaW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5ODcwLAogICAgICAgICAgICAic2hhMjU2IjogImUyMzgyNmE5NmU3YjU5OWJiN2Y5ZmVlZjhlODA3MTI1ZTA4NDE3YWRkODBiNDg2Y2Q5ZWNjMjM2M2Q2MThlMjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY0hpc3RvcmljYWxTb3VyY2VTdXJmYWNlSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NzA2LAogICAgICAgICAgICAic2hhMjU2IjogIjMxMDQ0MjlhNzNjM2EzYjIzMjUxYmM3OTQ3MmYyMDM1NTBhYWUyOGQwZTg4NDcxNWIyM2EyOTBhZGE0NmM5M2IiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZEhpc3RvcmljYWxQYXRoQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjAxLAogICAgICAgICAgICAic2hhMjU2IjogIjMyOGI2OWZjNzg3NzJiZmUwODhjNzRjYjY1MTJhNTY0YWNkNzZhNzM1MzAwMzAzYjk0MGViNTZmNWMwMmExMGEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZFBhdGhBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDU5MywKICAgICAgICAgICAgInNoYTI1NiI6ICJlMmJmYjMyOGEyMTU2OTBiZDQ2ZDJlMGJlMDBhYThhYTVlZTI1MDgzMDlmYTNhZTBlNTM3NjExZDNiZjhkMmE3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkRXBvY2hFdmVudE9jY3VycmVuY2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2NzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjgyODcwZTM3OWJlY2VjOGQ5N2M5YWFiZDhlNjRlZDE2MWQ5ODk1NWY3MWMzYzEzOWQ3OTQ3OGRmZjdlMjgxYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZE9ubHlMYXlvdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJmNTM5ZjdmN2FiYjY1Njg0NjM4ZWRmMmYyNzQ1NGMwMzk0MmQxYmU5MjZiZmIxMjUxNjA5YTVmMmMwNWJlMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZE9ubHlTdG9yYWdlUG9saWN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE5MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMGFiZGJhNDA4OThjN2IzMmQ2YTZlMTQ0NjcxNDY1ZDUwYTRmNTU2MTZmZjAwZmE4MGRiZGU1MTI2NjIwNzUwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZU1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlNmUyOWRiODNjNzYyYmIzZTNmOGQzMWNkODEzNTgyOTE2MjA5MzQ0Mjc5MGRlMDA5OWQ5OWQyOTFiZDNjMGZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZVRlc3RTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NDMwLAogICAgICAgICAgICAic2hhMjU2IjogImZmYjZkNjU3ZGE0NmYxYzQwMDAyZGI4NmE0YzhkNmQwOGYzOTM1Y2I3NGQyYjVkOTViZWJiMDdkNDViNDNjNmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRXhpc3RpbmdFbWJlZGRlZFN0YXRlT25seUNhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mzc1LAogICAgICAgICAgICAic2hhMjU2IjogImJkZDk2NmVlMzQ0YjI0MDhmMzkyOGUzNmFlYWY0NjhhMDhkMDRmZmNiMWYzZGVkMDgwZjY5NTc0ODk3NTA4N2IiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRmFpbHVyZVJldHJ5QXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjIyMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjcwNzMwYTdjMDFmYTA5NTQ1NDIwOTZkOWE4NzFiYmZlMjdhNDM0NWYyMGUzZDdiMWZlZWIwMjgyMzQ3ZDMxOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9IaXN0b3JpY2FsU291cmNlU3VyZmFjZUludGVydmFsSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzg5LAogICAgICAgICAgICAic2hhMjU2IjogImNjZmYzODVhYjY3MjVhNDY0Mjc1YmQwOTFmNDQ3M2FkMTEyOTk1NDU3ZTk2YzVjMTUzODZkZGJmYTJkYTBlNWUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSW5pdGlhbGl6YXRpb25MaWZlY3ljbGVFdmVudE9yZGVyaW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NzEwLAogICAgICAgICAgICAic2hhMjU2IjogIjE3ZmJkYmE0M2FlY2QzOGJkN2JiOTYyZWM3MmUzNDMwZGNiOTQxMDQ0ODRkMDIyNGY4ZGVhZGQ0NTY2YjI2M2EiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSW5pdGlhbGl6YXRpb25SZXRyeUlkZW1wb3RlbmN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk5OTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiODNhNmYyYmQxNzNjMzQ1YWIwMmEyYmQzZDc1MzQyZmMxMzA5OWFhNTliMjc5MTNiNzk0ZTIxZDJiNjM0NjAyZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9MYXRlQWRtaXNzaW9uRW1iZWRkZWRIaXN0b3J5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTg5MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxZTZmZWMwNGQ1ZTE1YTMyYzg3ZTczZGM0ZWRlYWMzOGFiNTUyNzE4MWI4ODkyYzdmMTRlYWYzZWM5ZWQ3NzUyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWRDaGlsZENvbGxlY3Rpb25NZW1iZXJzaGlwTXV0YXRpb25JbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcwNDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTg1YmQ5NTlkYWRkZTMwYjY3NjQ2NWZlNjMyYmEyNzhiMTk3MTVjOWM0ODIyNjQ0NWJhOGJkYmJiZjljYWM2NSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NYW5hZ2VkQ2hpbGRPd25lcnNoaXBHdWFyZFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1MzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGE5NDhlY2VjNGM2ZjYwNTVhYWE5MDRkNjkxZGM0NjNhZDUzNDg4NTllOTAwZWYzY2MzZTE3Y2ZlYzU3YzkxZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NYW5hZ2VkRG9jdW1lbnRJc29sYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NDE0LAogICAgICAgICAgICAic2hhMjU2IjogImE0ZmViMWUyNGEyNmJiZjllMjdiNDdkZTdlZTNiNTQzZTllMGY5NTcyNTUzMTllODczYjI3MWViYjIzZWYxNzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTXVsdGlDaGlsZFN5bmNocm9uaXplZENhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDQ4NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNzdkNTExNTJhZjc3YWM4YWM1OTZlZDlhMDVlZDcxNjg0NzYzN2EwMjYxNjNiMDIzYzI1ZGIwNzVlYTZjOTU5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZEVtYmVkZGVkQ2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2JkYWUwZjc1ZWJiZTZmNjAyNWY5OWI5NGFjYzdiODI5YWQ0ZjYxOGEwZWRlODIwMDJjMzQxMjZiMmMyODIwOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRPd25lZFNjb3BlUGxhbkludmFsaWRhdGlvbkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDhlMzEzZWQ3MzAxMjcxYzc3ZDA1ZjAzMDlmMzdkYjBkMjNlMzBmYjlmYzBlNTUzODIwY2U5NWQ0Y2Q1ZDJiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZFNpYmxpbmdHbG9iYWxDYXRjaFVwT3JkZXJpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTYxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMThkZTgwZWM0MGQyMWYzNTZhOTBmYzM1ZDM4NTNiNzM3MzlkZmI1Nzc2YWYzZTYyZjJiNThjMjNlN2I3ZjkwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05vblNjYWxhclJvdXRpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzFmODNhNGQyN2Y1YjFmM2Y2ZTVlODgzODcyYTFhODU2YmEwZDVjOGFkMTE4NDU3MTkxZWJmMzNiZTQ4ZjQ3YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Qcm9jZXNzRW1iZWRkZWRDb2xsZWN0aW9uUGF0aHNJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU1MTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGZhYTY5MTE4ZWU1Y2EwZTcwMmU2NWJmNGYwODJjM2MxNjU4ODdlZDdjOTdlN2E4MjBiYWMxYjg1OTU4Yzk3YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QdWJsaWNUZW1wb3JhbEZlZWRlckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU0MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTg1ZTI2MTc3N2E2NmQ1NWU0ODQ1ODhkZTkzYmRkZTY5M2I1MjBkOTIyNDZlMTY3OTFmMWJjYTY5ZDAwNDY5MSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9SZW1vdmFsQ3ljbGVBbmRSZWF0dGFjaG1lbnRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NDE4LAogICAgICAgICAgICAic2hhMjU2IjogImJhM2VkMzE4NWVhODM0ZjI5ZDgyMTQ2YjY0N2ZlNTQyZWE3MjQzZjI3ZGMwNjc3N2QwYWU3ZjUzM2U1ZmQ5MDIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMEluaXRpYWxpemF0aW9uSWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzOTk2LAogICAgICAgICAgICAic2hhMjU2IjogIjQwZWQ2NzYwZDAxNTRjMjM1NDZkOGNkZDU2YzU1ZmMxMGViYjllNGEyMzhkYmJlNjQyYTk1ZDhiNmU1Mjg0NjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mjg1LAogICAgICAgICAgICAic2hhMjU2IjogIjI5NGUyMDkwYjViNmExY2YyNjhkMDAyM2Q3NWRmYzE0ZDRmNmU1MGVkMDVjMWE3YTkxZWYxNjAxNTM2YzJjYzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2FtZURvY3VtZW50SW5pdGlhbElkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjUwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYWYxMDZjMmYwMDFmOGExY2EzNzE4Y2VlZWFiYjdiMGNlZDAyZGM4OWQ3YWU1YTI3MjkwN2E0NDg5NjFkZWViIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NoYXJlZE1hbmFnZWRDaGlsZFR3b09jY3VycmVuY2VzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTQ2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJmYTcwYjA1ZDJhNDFkMWMzZDRhMmVjNzViM2YxNGYxYTQ2ZjVhYTI0YmZjNGE5ZTkyMmRmODg4NmE1OTMyZDc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NoYXJlZE1hbmFnZWRDaGlsZFR3b1BhcmVudHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDAwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOTEzNDlkMDhiMGRlODQxYzEzYTMwMDYwZWU3NDQwMzQxOTBiMTkxZmIyMTljN2FiYTZkMTY5ZGVkN2M3M2I1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NvdXJjZVN1cmZhY2VJZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjkzOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZmNlMzE1Y2YzZmM3M2ZkNjFmMjBlNjc4MmRiZjI3ZDUzM2JkNzZlMWU2NjkwOWIyMGM5YmNlNjE0ZmYzODEyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1N0YXJ0QWRtaXNzaW9uQXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYjJjY2I1MmYyMDIyYjQ1ZWFkODc5ZDQzODAwYmUzOGQ1OTk5ZTg0Zjg5MmYzYjY1OTA0MTZjMjY0MjdmNDZkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1RlbXBvcmFsQWRtaXNzaW9uUG9saWN5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzkxNywKICAgICAgICAgICAgInNoYTI1NiI6ICIxZDUzMzQxZWU0ZTEwZmI0MjEyMDcxYjBkZjUwYTFlZjNhZTI4NWUxNzFlOGEwZmViNjQ0OTllNDFkYTQxNTUwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjc1LAogICAgICAgICAgICAic2hhMjU2IjogImU3MzI4ZjVmNzQ0ZDVjOTk2MWE5ZjdmMzA2ODIwMDMxM2NjNWRkNzc0YTE4ZjY3NWFmODEyMzRjOGU0YjIyOWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVzdFJlc291cmNlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjIzLAogICAgICAgICAgICAic2hhMjU2IjogImYwMDllMWYxZjA2ZWU3NzUzMmRkMGQ0ZWM2YTAwNjBkNzg4ZTZjYzI2OTMzMmM1N2M5NzY0YmQ0YjEyY2JkY2IiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vV2hvbGVPYmplY3RGYWlsdXJlSHlnaWVuZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzc4Y2UxOTdkOTJlNmMxODhhMWYyZTVjZWNjYjZiOTg5ZjViOGI3ZTU2OGVkOTU3ODRlZTYwOWU0Y2U1NjM2MSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9BcHBsaWNhdGlvblJlYWRpbmVzc1Byb29mSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NjY4LAogICAgICAgICAgICAic2hhMjU2IjogImU5ODc3MTEyNmJlZmVkY2Y4YmRjZTJiYmM0OGRiYTQwMTQ5MzMzMWFmMGMyZDgzMDViYTMzMmE2MmFmMzU4MzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9hbGwtdGltZWxpbmVzLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTc0MjQxOGQ2NzcwNTE4NjY2YzczZTVkZjczZWU5OTdiNjQ1N2Q2NTI0Yjg5NzQyZmVlOGQwOWFmYzRkZTE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vY29tcG9zaXRlLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNDU5ZGIyY2I4OGZhY2U4ZjNkMGI1OWI5NjhhYWI1NTIxZjM3ODUwNmI5N2FhZDBiY2VmN2Y4ZDllMmY5OGEwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc4MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMWZhOWZjNzU1NzZhZWQ0NjQ2OTMyNWIwMjc3ODMzY2Q5MDZjMzdlZDJjNjUwNjVjM2E4Yjk1YTUzZTdiYzJiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDczLAogICAgICAgICAgICAic2hhMjU2IjogImI1NGNjZGUxNDEzYzM5Y2JmNGQxZjViMzQ0M2UyZTM1OGJjNDRkZWI5Y2Q4N2M2N2M0M2IyNTdkMTc5ZTAyZDUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktYTExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTNjYTc0YmVlNjU4ZDA1MTMzZTRhZWI1OGJmYzdkOWFiYjRiOTM3YjZjMDMxZDJlYmM4MWM0N2E1ZDE1Y2FkZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODU4LAogICAgICAgICAgICAic2hhMjU2IjogIjBkNDZlNTRiNTllM2UwNjZlNTFjMTMzZWMzN2RhMTAxMjAxYzgwODQ3NDZkYTNmNDIxNmJkZWJmMWNiNzU1ZmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kdXBsaWNhdGUtZXZlbnQtZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODE1LAogICAgICAgICAgICAic2hhMjU2IjogIjBkOGQ2ZThkY2Q0ZTkzMzZhZjBjMjY2NWNlMDA3YmY0OWIzMjE1ZGQxYzNiZmY4YmE0MGZlZTFmNDhlNWFhYjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9keW5hbWljLXNvdXJjZS1zdXJmYWNlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzg3LAogICAgICAgICAgICAic2hhMjU2IjogImE2ZWUzMWUwNWEwMzE1ZDViNzZjMzMxN2VlYjg3ZmIyMDAxYmIzNTEyNzRkMTJhMmYxMDBjMTkzNjRkNzliOWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb2xsZWN0aW9uLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjIzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NWI0MDM5YTA2YzUxMjJhZjI2NzNhOGRmMGZhNGNlMjQ5OTlhMjcyY2EwYzhkOTdkOTcxMTMwMTdlNTEzNzk0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY291bnRlci1CLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzI3OTA5NGRiYzUxZTY4MDhiNTdkZjMyOTAwZDMwOTEyOGM0YTIwOGVkMWNmNGVhZDE4ZDNlNDI5ZTU3M2I3NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMzE2YWZiNmNmYjg5MTZkMzlhN2ZkNzIzODk0OWU0YjBhNThiNGQ3MmEwYjRiNDg0MTQ1OWVlNDA4OTUwMTNlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtbWlkZGxlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2LAogICAgICAgICAgICAic2hhMjU2IjogImY4ZmYwMmJhNGI5NmVjZDE1ZTZhMzdhOTdjOGIwYmQ4MjNkZGViNzU5ZWE5ODAwOTc1MmMzM2ZiYjQ1M2RlOWUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmI1OWNjMmVjMGNhYTk0MjUxOWQ4ZGQzYWNjODU1MWYyY2NkMzA0ZTBiZDYyNTQ2ZDMxNjY5NDE2ODQ5NGJmMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjg2NzY2MTMzOGE4YWFkNTcyYTE3NWNkMmMxNzU4MzIzMjYzOGQ2MzBlOGYxZWQ3Nzc4MjI5ODU5YzgyYTdjMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXN0YXRlLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTcyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxZmRiMDQyY2EwNzYzNzBhNzI4ZmZmOWY4NWQxN2Q0OTQzZTBhMDJiOWVmNjlhMmVkNDlmNGMzMGZkOTgwZjhiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vaW5pdGlhbC1lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyOTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTVkZjIzMGQ2YmY5MmQyYmRiZmE2YjE4M2JjNGMyNTFmNmI5NzM0MDVmYjdkMGU2NjNmNGIwZjI5ZjdiNWJmZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2xhcmdlLW9yZGVyLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYxMjMzLAogICAgICAgICAgICAic2hhMjU2IjogImZlZjQxYzUzNGE3ZDE3ODU3ZTlkMTZiOTY0MzFjYWFjYjhiZmViZGE0OGM5ZjBkNDMxOWJjZWE2ZTI3ZGUxMmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9sYXJnZS1wYXlub3RlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjgyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3MTdiYmI2ZWIwM2MwYTkxNTJhMDJiYmNlYTFmYzdkN2JhOGM4Y2FmZGJkZjg5MWVmMmQyM2E3YTBlMmNhMGFkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0YjVkZGU1MGMwZjRjMjA3ZGYxNTY1YTIxZjIzMjM2Y2NhN2ZjMjM1YmUwZmJlYmFiNTE4Njc2ZDEyM2M4MjIzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjE0Mjc2ZTlkYzZhNGI0NjZmNmM4YjU3NjhhZGVhOTA4ZGViZTVjZjBlODI0NTA1ZmRkMDQ0YzNiNjBkMzM2NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1yb3VuZDEwLXNsYXRlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTQzLAogICAgICAgICAgICAic2hhMjU2IjogImNkOTAxYzZlYTAxY2Q4OGQwNzZiZjZlODA1OWU4ZDljYWIwNzcxYWViZjhhOWYxN2U4NjliNGIzZjE2Njc4ZjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtc3RhdGlzdGljcy55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OTVkOTBhMDhmOGUyYWE0NGE1OTA5Yzk2ZTdmM2NjNTUyNTFmOTZiYTlhZDY1ODk2NmZmM2QxZmZlOGEwZTJiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmVzdGVkLW93bmVkLWR5bmFtaWMtc3VyZmFjZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYzc0OTk5ZDQ3NzNhN2IyYjI5NWU0MjgzZmU0NmI2NzM2YWFmOWVkYmYyODYxMDY5MGUyMDgzMDM1YjNjZGVjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmVzdGVkLXNpYmxpbmctaGlzdG9yeS1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjg4LAogICAgICAgICAgICAic2hhMjU2IjogIjY4ZWVlYzNhNzM1MDg4Nzg3ZjJkNTE5NzVmYzUzMDJjZWYyM2I2YWNkOTM4ODFhZWU5ZjgwNTEzNGI2MjdhNWYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9vd25lcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMTMxLAogICAgICAgICAgICAic2hhMjU2IjogIjg5NTUzZGI2N2IyM2MzZjhjYjFiMGFmYmY4NThhNTA4YzY3YWU3NTQwMDU4ZjZjZTJkMWFiZjExNDNjMmU2ZDQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9wYWNrYWdlLXBheW5vdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM1ODIwLAogICAgICAgICAgICAic2hhMjU2IjogImJiOGMwZTFiYWE2NTc1YzM5YjYwZDk0Nzk2ODQ2NjFlNjZhODQ5OWM0MDhkNzcwZGJlZTNjY2FkZmNiNGQ5NjQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjM0LAogICAgICAgICAgICAic2hhMjU2IjogIjQyYzIwY2E5Mzg2MzFjMjllNDliYTAwZTUwYTMwN2ZmNTA2OTllMTlmMzU0OTNiMTA2ODU1ZjZiYzU0NTc1NTUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmZmNjdmMGRlM2EyMDYyZjM5NDRhMWI5ZjAxZGIyNWM5MmVkNzFlZjc4NDk2ZTk4NGE0Y2VmZTk5MDUxMGIyZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3NoYXJlZC1jaGlsZC10d28tb2NjdXJyZW5jZXMtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjYzLAogICAgICAgICAgICAic2hhMjU2IjogIjdiMGEyYjdkZjRhNWIxMmMzZGRjNzkwM2ExYTM3ZDUzMDBkYTQwODU3MDMyOTc4N2QwZDY2ZjA0ZjQ4ZmFhYzkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi90aHJlZS1jaGlsZC1oaXN0b3J5LXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkZTQwZDA5NjUzMzc4YWFjMjQwNDc4MzNkYjAwMjE5OGEzNzIxYTNmNDRhMjIwMzhmYTM0NGJlZjJmN2JiMzA3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vd2hvbGUtcmVxdWVzdC1zaW5rLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1LAogICAgICAgICAgICAic2hhMjU2IjogIjA5OTg3NjAxZDM5YTI3OTdkY2ZkMzQ5OGM3MDI1YjUzNzMxZDljMjE4MGU5MzE3YjY0NjVhMTZiZTIwMmQ4ZjEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtY29sbGVjdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mjc4LAogICAgICAgICAgICAic2hhMjU2IjogImJiM2NlNDA3YTYwMGU4YWJkNDE1N2IzM2E4Mjk1ODA3NmE2MDQyOWRjMmY5YjE0YTkwZTRjYTQyNmYzMWE5YTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtcGF0aC1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyOTEyLAogICAgICAgICAgICAic2hhMjU2IjogImFjZWQ3MzRlYzVhZjFiYzIzMjgwNzRhZTkzZDMwNGJmOTU0MDBlN2RlMjZlMmVmYzFkZTg2NGFmNjQwYmE4MzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLWR1cGxpY2F0ZS1ldmVudHMtY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTA3ZTk4ZmQ3NDZiYzIzYjQyZTM5OGQ5MDI2YWNkZWMyOTdhNWE5YWRjODYxMzE0YTY0ZjllNzc5M2U5NjY5NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tZXZlbnQtb2JzZXJ2ZXItcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjI4NzU2YmM0YmIzMzkxODIxOWZiYjcxOTZhZTY0ODMwMWE0ODBhZjE5ZjFmNDAzNWFiMTgxNjEyZDM3MmVkZDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLW9yZGVyZWQtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDM5NDRjYTkzMzI4NzljZTY1ZjliNDA3ZDA3MTFhNjRkOTQzZTJmODExMDBkZGYwODdhODU1MjYwZDdlOGIzYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbWFuYWdlZC1jaGlsZC1jb2xsZWN0aW9uLW1lbWJlcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDk4LAogICAgICAgICAgICAic2hhMjU2IjogIjk3NWVjYTM4Mjg4OTI5ZDczNDAxOTBlNzMxMGJiNDVmNzJlYzJlYTJiZDU1NTM5NzZjNGFlYzcxNjVjMzFkZjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtZ2FtZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzM4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZjFiNzk5OGRkOTA2NGYzMmYwNGQyYmEyODViNWFmZDQ0OTY0M2FiZjc3ZjNlMzU2M2I2MGY0NzJlM2U5MTIxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uYmEtbGlmZWN5Y2xlLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJjZTQ1NWM2NDMwOThjMjhhZjRiYWY5MzU2YTRkMWQ2ODkzODA5YTJmODM4YzdiYjgyNzA0NDg1NjE0MzkwMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmVzdGVkLWR5bmFtaWMtY29sbGVjdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTg1LAogICAgICAgICAgICAic2hhMjU2IjogImEwZjUyNzliOTM0MTk3ZmRmMjYwYjNlMGQwOGIwNmI2ZDI0YWJmODAwNGUwMmMzYjA5YzZlMzgxN2FlMTA0OWMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9BY3RpdmF0aW9uTW9kZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjY2LAogICAgICAgICAgICAic2hhMjU2IjogIjc5Y2U2Zjc2NjJmYzQ2NzFhNGFjMWE3YTE4ZDg0ZDdjYjc2OTZhNjM2ODdlNWNlYWVjZmZkNmU2OGM4ZDg4OTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDZlYzFkYWZhMmU0YzU4ZTdhODM2ZjQxMmY5MWRhZGNmYjQ5YmU2YTU3Mjc0MGY5YWZmYjg1YTg4YWE3NzUwYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbkVycm9yQ29kZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNDQ5Yjk1MWQ4ZTk5M2RiZmFmYjU1MTRlZDVlMTM2MTE3MmM1ZDAxYTFhYTI3MDZjODRjOTk1NmVlMTljM2UxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDcwLAogICAgICAgICAgICAic2hhMjU2IjogIjI3NjYwMTIyNzhmNzI5Mzg5NzY3MzhhMDE1OWI0NGMyNzY0NDEzMDUyZTgzZTk2MTMxNDE0ZTc1N2VmN2IzNmYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25NZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1OTY4LAogICAgICAgICAgICAic2hhMjU2IjogImUzMjdmZjIyM2FiNTM2ZmZlODQ4OTIwODQxZTQ3ZWYxNjAwYjNmZDU2OGJhN2ZmZDUzMmQ0NzFjYzQ2ZDQ0OGIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudERpc3BhdGNoT3V0Y29tZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjYzLAogICAgICAgICAgICAic2hhMjU2IjogIjEwZmZiZjA5MTAzMDQ5NjJmNWIxNzNhNmU2YTllYzM0OTM5NGI0ODMwMTc2NWQzNzNiZTVmY2M3YmYwZmZlMmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudElkLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcxLAogICAgICAgICAgICAic2hhMjU2IjogIjYwZjg1ODViNzQ2ODBjYjc2ZjU2ZDU1MWY4MDQ2YzdhZWUzODI5NmI2NTA1ODlkMjY4MTMwOGJjNzVhOTViZDEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudFJldmlzaW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MjAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ5OGU2ODdmMzQ3OTk0YzFiMzk2Yjc2ZDkwYjVlNDk3ZjU1ZjMwZmQ3NjVmZTYwZmVmZjUyMzUzZTJkZWUwYmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudFNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODUwLAogICAgICAgICAgICAic2hhMjU2IjogImRmNmRmMTVlMmQ4NzM0OGVmYjY2ZjEwY2Y1NTIzOWU3NWMzOTc2MGY5ZmExNmUyODAxOGE4ZDM1MWZhYTQwZGEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9FeGFjdFZhbHVlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTU2LAogICAgICAgICAgICAic2hhMjU2IjogImQzNjA5MWRlYzg1ZGYyODhlOGQ0N2FhNTU5NTcwNjA3M2Q2MWY3NjUwMGI0OThiZWQ1MGExM2NmOGQ1MmRhZmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9PcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3MTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzhmYTY2OGY5NDg3MTU5NzdkOWQyNGI0YmVlZGM3YjgxMTQ0MDZkOTJjMTUwNTJhNzJjNTRhOGIwZDMzZDE4MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1Byb2Nlc3NpbmdEcmFpblJlY2VpcHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5MjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjI5MWY5OThjYTJlNDA4YjgyZGMzMzM5MThmMDMyNjNhOGIyNGQ4ZGJjNGFlY2I1N2UyZTlkNzNjMGQwMzllMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1Nlc3Npb25TdGF0dXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NWMwNjFlYmVhYjFjZTFkNDgyMGU3MTE3ZDIzOWM0ZDAxOWQ5MGE3Y2M2MjVlZmQ5NjQ1MWQ4NGRkZTQ5NWU0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3NywKICAgICAgICAgICAgInNoYTI1NiI6ICJmOTIwMTFiZWIyOTk5Y2UzNmRiNTczM2U4ZjZhZjljODk4ZmFiZTc4MmRhOGU1ZDgxNjQwZDdhNTViNmZlMTViIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvVGltZWxpbmVBcHBlbmRSZWNlaXB0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWMwMDExNjI5ZTUyZDU0YWU4NTcwMGU2YmY5Nzk3OGEyMWIyYWQ3NGIwMWI0MGIwZWNjNmZhNTQ4MTY2NzQ0MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lRW50cnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzU0MWE4MzQwZGM5YzdkNTY4NDY3Yjc2ODUzYWJjNGE3MGZlYWRmMWM0Mzc4NGY2Yzc2ZWNhOTc5MjIwZWMxMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQmx1ZVJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzY1LAogICAgICAgICAgICAic2hhMjU2IjogIjA2YmEyYTA0MTI0YTBjOWYyMmU0NDIxMTBiZGQ0NTdhNTRlY2Q3YmQ4NjE3ZGM3ZmRmMzY5YTA5OWExN2U5Y2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NhdGNoVXBCYXJyaWVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODg5LAogICAgICAgICAgICAic2hhMjU2IjogIjcyNTg2YWU3MDk1ZGE3MTM2NDVmZWJhNWE0NDE1ZmMxZjFlMGI0OGYxNjEyYmJjMDVmNGE3MzNmNTA3ZTI2OWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NoZWNrcG9pbnREb21haW5FdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhYWIzYjEyY2VlYzE4ZWYyYTI2Mzg4YmE2ZmZiZmRmZTlhODIwZTI1ZTRhNGRhYzk2NzRmNjg0MTRlNGVmNDlmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Db21wbGV0ZW5lc3NFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTk5MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwY2E4ZjdkYmFhMzBhZTIyM2E5YmFlNmExNDc2Mzk0MTcwN2VmODQxZWY0ZjE5Yjk4ODlmNGJmZWIxNDNlNTllIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9EZWZhdWx0Q29vcmRpbmF0aW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMjExNywKICAgICAgICAgICAgInNoYTI1NiI6ICI4MTY1Y2I4ZjhmOWZiYmJjYzFmZjdiYTBkZDEwZjk2M2RiNGE0MmVmYzk4ZDkxMzE2YjRiMWJkNjA0MzU4YTgxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudElkZW50aXR5UmVhZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODE3LAogICAgICAgICAgICAic2hhMjU2IjogIjVjYmY5ZGQ0N2IwYjc2MzdjZWYzNzA3MjFhNzY1MzZhMGNjZTg0ZmFmMDU1MWQ1NjY3NTc3MDEzZWRjYmI4NzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50U2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI5MDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDk2ODZhOTZiNThjZGE1OWQxYmIzNjE3ODU2MDNiYTcyZTI3YjRmMmZhZjYxMGNiZDMyMWVjMzgzM2I0OTY1OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRUcmFuc2l0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjU0MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NWE4MGZlMTdkZTliZWY4ZGU1ZTkwMGE2YWJhZWRjODA5ZGUwYWFlZjdlODBlMTRiNGQxMDY5NTY5MWMwZTlkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE0LAogICAgICAgICAgICAic2hhMjU2IjogIjY2YjAzNTc0MzVkMWU4ZTRmMWY4NjYzMzU1ODFkZTgwZmU3NGRkYzFiNzI0MmJjOTZhMTAwZTk3Y2FlMzk5YTMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hDdXJzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjZkNTVlM2FmMmExMzZmYmUzOGY4ZDk3NTc0ZWJiMTUzNDM2YTk0YjA0MzY3OTQ1NWRlYjk5MDY4NjAxMDQ4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEVwb2NoSW5wdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk5NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWIyOThjNzdlYTBlNzYyYjExMTczNWQ0M2E4ZjAyOGE4YmRkOGRlNzhjOTU1YzNkYzk5ZjllOGIwZjJiY2M0YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRMYXlvdXRQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3ODY0LAogICAgICAgICAgICAic2hhMjU2IjogIjc1YWUwNTVmMDI3MzIyZTIwOTNlY2JiZDhjNDg1ZDM5MzhlMDRlZDVkM2M0MDUyNGNkZmQyYjUxNGFhNDkzM2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT2NjdXJyZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTE5LAogICAgICAgICAgICAic2hhMjU2IjogIjI1NzEwYWVlMGNlOTI2YWRmMGExYmEzZGIwNzkwMmU2N2E0YzFmOTQ3N2RiMTNkMTJhY2FmM2Q2NWI2ZTE2ZTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkT25seUxheW91dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc0NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZDAzZWU2ZjFjYWMwMWY0MmM5NDhmZmEyMWVmZWQ0Y2Y0M2IyMGZiMGI4YjU1NDliMjY5NGJiMGIxMjg5YTZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9ubHlMYXlvdXRCdWlsZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjY2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNGY2ZTNhODg1MDI5MTYwMTJiNzQ4NWM0ZjEwNTczNGVlNGZjY2IwYzBiZTBmMzIyZWY1Y2EzZWM3MzI3MzdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRpbmdCaW5kaW5nLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTg1LAogICAgICAgICAgICAic2hhMjU2IjogImU5MTFmNmRhMWYxMTRjN2EyMTllZjQ5MmU4NGVkNTYxYTU4NmNhNTk0N2MzMzI5OTM3MTRjMzlhNmM4NGFjMmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VuZ2luZU1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc4NjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjQ3MTU0ODQyNjdhYmZlOTdmNThkZDIzYjkyN2VlNTg2ZWVlNmJlZDEwM2FjNTI5ZDdjY2NhYmZlNGU5NWNkOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSGlzdG9yaWNhbEF2YWlsYWJpbGl0eUNvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4MywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YmFjZjEwZjA2ZWZjY2RmY2Q2NGU0YTk0OTJlMzU3YTJlNmMzNWU3YTg5ODgxNjg4OWE5MjFjNDMwYzNjM2UwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9IaXN0b3JpY2FsU3RlcC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQyMywKICAgICAgICAgICAgInNoYTI1NiI6ICI4OTQ3ZjE1YTYxMjE0ZjkyZmQ2ZjQzMDY3Mzk5NjFhNDZiODZjOWMwN2EwMzhhZTdkY2M1N2Q5YjNkZDUxNDdkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Jbk1lbW9yeURvY3VtZW50U3RvcmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjIyODY0MGFmNzI5MzgzOTU3ZTViZmM1YWY4ZTM4MzY1YzU5MTE3Mzg0YTFiZjIzNjc1NWI4NmM3YmY0NzNhYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW5NZW1vcnlUaW1lbGluZUpvdXJuYWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1MzE5LAogICAgICAgICAgICAic2hhMjU2IjogImIxODg4ZjE2ZDUzOTM0ZDc5NTBhMTZjMjdiOTQ1MjcwNDBlZWZlMmM3YjM0MmQzYzY0NTIwMWRmNWM0NTJmYjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0ludGVybmFsUHJvY2Vzc091dGNvbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2MiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ODNkYTQyOGRjZWYxZTg3OTYzN2E0MGIxZDVjZWIxYjNhMDAwZDNjMDU5NTVhMTlhZGI0NGM5OWY2MTM1MDdhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9PcGVyYXRpb25Sb3V0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzQ0NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2MGIyNDAzNWYyNjBiODc2NjJiNDFkNzQ3MjVkNmRlODM2ODhiNWI5M2EyZDViOWU3Yjg0OWZiYWNkM2FlMWJjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Qcm9jZXNzRW1iZWRkZWRHcmFwaFNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjUxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYTlkODhiOTI1MDk4ZTlmY2U3NmUyMGNhZWJiOWI5MGM3Y2YyOWUwMzJiMGI1MjRmZjY4YWNjMGYwNDI5NWUxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Sb3V0aW5nU3VyZmFjZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI3NzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGUwMGRkZDY2OTE5NmViZjIwMzYyNjQ4NjFkZjgzZDUyZmY3ODE0Zjc3ZThmYWJjZmQ0OTYyMmEwNjc4ZTBmNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU2VxdWVudGlhbERyYWluQ29vcmRpbmF0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExMDI2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNTYwOGViMjUzZGI2OTJiYjhjMzdlY2FjNmVhZGRmZTE2ZjdlZmFkY2UzM2QwZTFjNzkyYWYyOGZiN2M1NDU5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Tb3VyY2VTdXJmYWNlSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWEyM2IzMDU0NTVmYmUyMzgxZjNmOThlZmYwNDk0ZWQ0YmEwYjBmZTVhY2M1MDNmMWNiNTlhYWQ1YTc0YmFlNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVPYmplY3RTdG9yZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGU1ZGFjMmViYTFmYWZkYmIwNzFlYzE3ZDcyOWFlMzI3NDE4MGQ3ZTQyYzIwMWQ0ZTBhZGIxMTE4MDMzNDQ1ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVSZXF1ZXN0RW50cnlGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDgxMmE2MjM4NTU1Zjk2MmIyZTQ5ZDMwNjdjNjBjMGUxNjFiZmIwYTM4MTRjZWRkYTg4Mzk5YWM5ZGI0MzE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQWxsVGltZWxpbmVzQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTI1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMDM2ODhjMmQyNTQyOWU5ZWEyNmUyOWQwNDJjY2NmNTFhNjJlYTM0MDJjOTFiM2ZlMmVkYjI2M2JlZjYxNzNjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQWxsVGltZWxpbmVzRXh0ZXJuYWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg1NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTNkZTI3OGViNzZlZmJhZGEzMjY3MzllMzMwNjJmM2RlMmViZDE3ZGUyZGI0OWI1NGY4YmQyZjM4YTdiMzNiZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhQcm9jZXNzaW5nTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzM1MjksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTdiY2Q3M2VkZDdjNGY3MmMwODlmM2NiMjdiMmEyYTlkYTVkY2JmOTc2NzAyNjUzN2EyM2EyN2Q4NDVhYzY4YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhXb3JrZmxvd0NvbnRleHRGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDMxLAogICAgICAgICAgICAic2hhMjU2IjogIjgyOTE2YjE4NzQ5YjNmZGYzMmE1NzlmZjk3YzAyNDdmNTI4Zjc2YWI4OTBmNjg2ZjE2ZWE2NDg1OTIyZDc2YWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvQmV4V29ya2Zsb3dTdGVwQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMywKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTNiMDA3ZDE4NGI0ZThjYjVjZGM2MWUzMThmMDcyZTgzNTViNjAxNmI0MTc4NzFjMThhNDZiZDE1MjhlYTc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Byb2Nlc3NpbmdFdmVudElkZW50aXR5T2JzZXJ2ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzc0ODQyM2M0YmFjMTg1NDk4NTYwOTM3ZDdiOWZhZGEzOTEzYzdmYTk0ZmU3ZTc5YjExOTBkYWNiYjAwNTJmZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9TY29wZWRQcm9jZXNzb3JFeGVjdXRpb25Db250ZXh0QmV4RG9jdW1lbnRWaWV3LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjI1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1M2Q3ZmU3MDU5OGIzYzliMTIxNGVjOTViNzJiMDU5ZGVjODQ2YjljMDliNDU5MzI0MDE2MzlmZDgxMjU2OWQ4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQmx1ZVNlbWFudGljSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU0MjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmY3NzY5NTdlNmE3OGJmMTJlYWY2MGUxNjdiYmEzYmViNzUxNTFiNjg0NWI2ZDk4OTkyYzU5OGJhNjE5NDk3NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0NoYXRXb3JrZmxvd09wZXJhdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjM4OSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxZThiNjBlMTA1YzQ4MTEyZjQ1MzM1YTMzNzc0Yzg3MDMxMDA0MWYzMTcyNTIzNmIyZmY3YTY1OTQzOTYzNjlkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29tcG9zaXRlVGltZWxpbmVDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODM0LAogICAgICAgICAgICAic2hhMjU2IjogIjBjYjYwOGNmNmY3YTdmMWY3NDI3MGFjYzcwNzMyZWFlODNmNDFhYWRlN2NjZmVlNjYxM2Q5OGU1YmMyNjA2MDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db21wb3NpdGVUaW1lbGluZUV4dGVybmFsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4Mjc4LAogICAgICAgICAgICAic2hhMjU2IjogIjNlY2IwYWIxZDNlZjllN2RhODJmYWMxZjZkOWQ4NzNlMmE5NmI3MmUwZjk2MjI1NGUxYmYyMmRhZDQ2NmRiMzYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25CZXhJbnRyaW5zaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzQ1LAogICAgICAgICAgICAic2hhMjU2IjogIjZmMzMwNDE0NTBiMmI0Y2U0MGI0ZmRiMmRjZDFjMWNkOWE2ZmJhYzJlNjAyNWZiOThmODdhZGVmNTE3MmJjN2QiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25DdXJyZW50UmVwb3NpdG9yeUlkZW50aXRpZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYxOTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzUyOThjYTJiOTljN2NkNDU4ZTBhOTY5ZmI0ZjJhZTMwYjQzZTQwOTRhZGJjY2NkOTc4ZWNlMThhZWFiNmU1OSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkV2ZW50Tm9kZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3MzA3LAogICAgICAgICAgICAic2hhMjU2IjogIjVlZmYxNTY3Y2VmNmQxMWJhYmExNmZkZGM1OGYwYTgwZDdmMTMyYjVlZjIwMjIxMzE0ZTI3ZWMzMzUwMjhmYzYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzSGVhZGVyQnJpZGdlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDEwLAogICAgICAgICAgICAic2hhMjU2IjogImI5N2JjZmFhNzk2YjkxZTgyNDBiYzQwMGU0YzJmYzc4NTg0MTFlMDNjODk4ZGZkMDU5YzU1ZTc5ZDdiY2E4YmYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzb3JPcHRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzQyLAogICAgICAgICAgICAic2hhMjU2IjogIjdmZmUyNTU3NjUwYWQ5ODE3ZjI0NzExNGJlODEwYzk0ZDU3YTQ4ZjdmOWMwZjgwN2RlZGM5NDY0OWVlNGYzZmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzb3JzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDgyMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTQ3OWJlMjllOTA5NDI2MzI3NDhmNTY2MjM5YjlhMDI2OTNhZjc3ODg3ZTExZjI3ZDc2YmQzZGI5Y2ZhM2QyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZUdhcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzU2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJiNDdiODQ5NzIzZDFmZDQ2NTlkYzM3ZTVhOTZmZWMyYTgwYTI5YWU3NjAzN2VmZjU4NGYwZWQyMjAyZWRiYzczIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZUxpbWl0cy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI0OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNWI1N2JmNjg2Mzk5Mzg3NTkxNTkxNmM2MzgwZGUyYmQwZTgwNzU1YjM5YjQ5MDBmNWJlMjRlOTFlODhmMmFiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZVJlZ2lzdHJhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTA0ZTM0ZDgwYzNlOWRhNzNkZDBiMzRhM2M0YjU0Yjk4M2I3ODNkMGM0OTg1YTdmMTA1YzNlZTE1YTkxZDk3YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblNlbWFudGljVHlwZUlkZW50aXRpZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc5MjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjVkNjJhN2ZmZjNjNTc4Y2RlMzYxYTcwNzkwNjNjNGIzY2M5YTIwZjU0NzA0ZDQ0YTlkODc2NWIwNzJkNjVkOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0N1cnJlbnRSZXBvc2l0b3J5TWFya2VyUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MDUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiM2RjYTQ1OWY5MWE5YjRjNTE5NGZkYTM0MDYxN2Q4MmViMjEyOTk0MDY5ODAxMjJiYzRiNzQ1Y2RiMzY3OWFkMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0hhbmRsZXJDaGFubmVsUmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjNhOWQ4MzgyMTYwYWU1NGFiMjE2ZmVjZWEyNGQ0OTM2NTgxYmJlNDJhNzk2ODQ1NjI4NzkzZmI5NjY4YjVjZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL09wZXJhdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI5MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJhNzZhMzFjOWNhNDQ1YzhiYTNmZDdhMmRmZDM5NmFlODY3MjMwZjA5MTJmZGExZWY4Y2VhZjhjZDM1OTYzMjAwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUmVxdWVzdE1hdGNoZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTA2MDVjMWI2NzAwZTNiZGZjZDYwN2MyMDY1YjlkYmUyMTFiYjcyYmYzZGUzMDc0ZWE0NjM0YWZkNGJlYmM4NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL09wZXJhdGlvblJlcXVlc3RSb3V0aW5nRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODUzLAogICAgICAgICAgICAic2hhMjU2IjogIjA1NjNjNjM2ZGUzMzk3OTY5NzNlNzRkZGE2YTE3MjcyZjUzOGVjZWMxMjVkYTBiM2Y3ZGYwNWRmMzI3NTZhMTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9TZXF1ZW50aWFsV29ya2Zsb3dFdmVudE1hdGNoZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjMyMmMyZmRkMmJjODBiODU5YjI2N2NhZTExMzlhMDNlMGVkZjJjMGMzMmQyOGI3Mzg0ZGYwYThmODZmYTY0NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd09wZXJhdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjc4MywKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDFmNWU4YmM3YTg0ZjQwNzA2Y2U0ODk1MmNjYjZjOTViMDU3YWVlZDljODE2MzQ1MDViMjdjZTdiNGM2ZjZhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzA5LAogICAgICAgICAgICAic2hhMjU2IjogIjExYzk3Mzc5YjcyZDQ3MDgxMWQyMDFlZTEzOGNhMWI2ZjU0MTY1NzNhN2U4MzZkNjg3MjgzZjUyMWVmMzVhMmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvbkJleEludHJpbnNpY3NTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTE4LAogICAgICAgICAgICAic2hhMjU2IjogIjViMjhhNWVkNGE4YTkwZTY0MmViZjYzNWMzODQ5MTJiMDQ0OTY0ZjVmMzI4Y2EzMjEzNjVjNjI0ZjJlMWYwMDciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblByb2Nlc3NIZWFkZXJTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NTY2LAogICAgICAgICAgICAic2hhMjU2IjogImY1N2FkN2FhYzY0OWQ5MzJlMTQ5MTZiODBjMDVlN2YxNzlhZThmOWMyYzI3MWVkZGFlOGM0N2M3MTMwZWI2YTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvblJ1bnRpbWVHYXNTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzUzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyN2EyODdmMWQ1OTZjM2VjOTAwMjJkMjg0ZjM0ZDFiZjBiZTU0NDcyNTgxMDE3MzIwZDcxNDFhM2ZiZDA3MWM3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25SdW50aW1lTGltaXRzU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjZkMzc5Zjk2YzVkODBlOTNlYjU4YjNmMTRkNDk1ZTIxNGRjNjAyYzNmZWU1YjI1NzZlMTIxYjAyOGIwZWNhOGUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZUNoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0NjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGExNjYxY2YzNTdhZDU4NTgwNGIzMzFkMWExOTU0YTFhYjc5OWQ1NzZkN2IwZjg4MzRkM2E5OGNkYmY2NDJiZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lQ2hhbm5lbFN1YnR5cGVQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwNzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2ZGY1NWQ0ZGYzZWE3NTAwMzg1NDBkNWU0ZGE1MzMxNzc0OWEyZmE0NGE1OTgwNzc5NzBlOTMxNTM1ZjQ1NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lRXh0ZXJuYWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk2OTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWZmMjkxYjBkNTI3OTllNjA3ZjYzODJhMzRjMmY1MTk5Yjk4NjVmYTFiNTYyZGJjYjc1MGNlMmVjMTU2MWIwYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lTWVtYmVyU3Vic2NyaXB0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjQxNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYzNiNGVjNjM3MzUwNWRhOGE2YmUzMjAyNzRjODViYzczZGJkOTg0M2Y2MGJjNWNkNmU4MDc4MGRiOTU4NGJkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVQcm92aWRlclN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMjM3LAogICAgICAgICAgICAic2hhMjU2IjogIjRkODYwMjU4ZTQ3NTU5Nzk3MzAzYTQ2NGJkYzY0ZDRjM2JmZDU0NTNiYWM4YTQyYmUzZWM0ZmI3YjIzODAxYmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVN1YnNjcmlwdGlvblByb2plY3Rpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwMjg0LAogICAgICAgICAgICAic2hhMjU2IjogIjViODkzODJmYTI2MjRkZWFhZWIzODUxOGRhYjAzNGI5NTg0MGJhYTkyNDliYTUzNDUyYzI4MDM5MDM0YzZkZTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlRGVmaW5pdGlvblJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDM1LAogICAgICAgICAgICAic2hhMjU2IjogIjNjZjc1NzkxZjQ1Mzk2YzQ4ODE3OWE3MTE1Y2EwMjY0OGUyZGFiMmU3MWRlMTdhY2E4ZWZhNmJkZDZkZmRmYzkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlRWZmZWN0UGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MWE1MzA0NDQ2NDk0MjhjZjU5ZDEwMjE5NGE1YmE0ZmVkMWVkMzdjNjA5MGE0MDg0MjI0NTNhMDgyNDU0YzFkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1Ob3JtYWxpemVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ZDJhNDI2NTJlYThkMDRiYTRlMjk2MDBiN2FiZWI2ODNkZGViNWYwNGY4NWRlMmY4OTY1ZjA0MGI2YTM4NWE0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1QbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjc0MTE5NDNjNzMyNTBhNTVmMmUxODg3MGJlYjliOWNiOGFhMzk2NmY0M2FkYTRkNjM5MTliOWI5YTczYjM5ZDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUHJvZ3JhbVBsYW5DYWNoZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODA4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlYzM0ZWY3NmI3MTU2NDNlNjFlYzdjNmQxODM5YmIwODE5ZWE4MTkyNmM2NTA1NDY3OWMzZTAyMzA4OGJmN2FjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVJlc3VsdEVtaXR0ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMzU1LAogICAgICAgICAgICAic2hhMjU2IjogIjM4Njk2OWE4YmI4ZThhZDZkYjYwZjZjNTQyMDBlNGY4MTU0NTA3NTg1ZTk5MzgwZTU5MjY1YTVjOGM1M2M3MzIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUmVzdWx0VmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI0LAogICAgICAgICAgICAic2hhMjU2IjogImUwYjlkOTljZDBmOGYyMjcwMDMxNjc3YWI1NTgzMWVlNGY3YjVhZmYyYTRmNTYzYmYzNTA1YzM4YzcyZmUzMTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlU3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDUwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMmRjZjYzOWVmZWU2NTJlMmJhYWRkNTQzMjY4MDlhOTM3N2U0ZWI0NDYyNzZkZWI5YWMxMWZkZTk0NWFlYmY4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvRnJvemVuTm9kZVV0aWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM2NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjJiYjgzMzZiNTU5NDY3MDEwMTRmNDNkNTBjNzRjZmQxNWI2NTEzODlmNmE2ZmJiMmMyNjg3MzMzYjdjN2E3NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L05vZGVVdGlsLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzM4LAogICAgICAgICAgICAic2hhMjU2IjogImQ1N2QxOGNhYzFlYmM5NTM1NjJjYjcyZTY3ZTZhYzU5MjI0ZjA0NGQ5MWIwMzk1NTU1OGYwZDRkNzIyNTgzNTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODQ3NywKICAgICAgICAgICAgInNoYTI1NiI6ICIxZmJhOTZmNGJkZTFmY2RjNzIzMjlhNjUyOTg5NTI3MGM0YjMzNjBlZTRiNjc2ZDFiN2Q3YTNlZjllOTEyOGRkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbkNhY2hlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Mjg4LAogICAgICAgICAgICAic2hhMjU2IjogIjRmYmI5OWQyYjI5NTA0N2Y1NWE1OTFkZWVkOWZkODIwYjg1Nzk5NDE2ZGM4MjM1OTNmOTFiNjgwMzkzYjU3YjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TZXF1ZW50aWFsV29ya2Zsb3dSdW5uZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMTM3LAogICAgICAgICAgICAic2hhMjU2IjogIjg4ODIwNWMyZmI4ZDBmYjlkMjk0NWM4ZDgxODVhYmJlY2NmYmQ1NzdiNGEwZDhlMmRjMDIxODc2NjlmZmFkMTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TdGF0aWNVcGRhdGVQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5ODU1LAogICAgICAgICAgICAic2hhMjU2IjogIjU3MzlkZDRlNWQ2ZWY0NjYxNzk0MjQyYWZjNmUyMjkxNzA4ZGMwYTYxY2IxNDYzMGExNjQyNzUwZTc4MjlhZTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TdGVwRXhlY3V0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM4NDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDZkZjQ5OWUwOTBiN2MwNzU4ZDNhODAyYzg1YWUyMWZhZGU0ZWYyYWRkOWY5MWI4ZjBkZjM0YTM3ZjA0YzU4ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1Rlcm1pbmF0ZVByb2Nlc3NpbmdTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2M2NTI1ZGRlNTViYzU4MThiNzcyNTU1NTM3YjgwNWRkNWUzZmE4NDc3YjRhZmFhMDExNTNmZjI4NDhlMWYyYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1RyaWdnZXJFdmVudFN0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDAwOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNGYwN2FiMGMwYmEyZjM5ZTdhOGM2ZjQ1ZTM4NjY0NjY3MWRmYTg2YWI4ZTI0MDVmODFlZDRmYmMxMDQ4YjkzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvVXBkYXRlRG9jdW1lbnRTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNzAwLAogICAgICAgICAgICAic2hhMjU2IjogImU3YjVhMjI0ZGIyOGYyMThjYjM0NTM3YzI3MTM2MWQwZmJjNzAxNDI5YjdmMDc2MWYxNjMzMGQzMDA0ZjYxOTYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0JleEdhc0xlZGdlckhvc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MjA4LAogICAgICAgICAgICAic2hhMjU2IjogImFiZWU2NDA1ZjhkOWI2YTAzOTQzNjYwZmZkMDY0NzY5NGUyNDJmOTA4NmFjZjRhYjNjOGQxNmIwMzE5MDdiNWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0V4ZWN1dGlvblN0YXRlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MTA3LAogICAgICAgICAgICAic2hhMjU2IjogImJiN2MzMDM4N2UyZTEwMzU1OWQwMTBhZGZhZTgwNTg1NDE3ODk5ZmY2MjQ3ZmRjNWUwZmM2YjRmOTI2YTFhY2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1BhdGNoRW50cnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyMjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDlmYWUwYjMyZDIyMDkzYmMyM2U1M2FkMGIzNzkxYzkxMzBkYjdmMzcxNzUwYjdhNzcyYmVlOGY5OGRhYTEzYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93U3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDk5NWY1NGExYjg1Njk2OThjZWM3MjY4NDBiMGZlYjkzMDcwNGJlNDY5OTg2YzA2OTc2YzM1ODdlMDIyMTNiOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93U3RlcFJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNywKICAgICAgICAgICAgInNoYTI1NiI6ICIxMGUyOWJkZjZmOTA0NTVhNmNlZTVlMGMzZDNhNjJjYTBmNTJkYjI4ZDQyZWFhMGI5ZTMyYTAzYWYzOGVkNTBkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dTdGVwVHlwZVByb2ZpbGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyODIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWYxNzg1NjY3YjAwOGFkMDQ2OTkyNTBlNTBjYTgyYzc0NGVjM2VhZDlkNGNlMzE1MmIyNmZkMzExZDljNTQyMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvY29vcmRpbmF0aW9uLWdhcy0xLjAueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzNTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWZjZGMyMjU2MzE1MmNkZDhjYjM3ZjllYTczOTQ3N2NlZDVmN2E5ZTMwODhhZWNhZjI0NjgxMmMzYTNjNmJhYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkQ29sbGVjdGlvbkFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NjczLAogICAgICAgICAgICAic2hhMjU2IjogIjlhZmNhZWJjYzJhOGE4NGIzODBjNjVkMWI5YWQzYTRhOWVjZjczM2I2MTY0NDE4ZjFmYjllNzUyNzEyNzE0ZmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTGFyZ2VIb3N0UGF5Tm90ZVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTAyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOGUwYzY5ZjUwZDE2MmRhNDZiMWM5NjE5M2ZiY2YwZmNmOGQ2OTI4MmNmODNkYzc4MjI1Yjc1NTA3NWM0ZGYxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05iYUhvc3RMaWZlY3ljbGVDb252ZXJnZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNzA2LAogICAgICAgICAgICAic2hhMjU2IjogIjZjOGQ0ZjZjZGI1ZGQ1YzBkODNiMDRiMWQ4MmJjYWIzNDc4Njc3NWFhNDY0NThkZjVlMWRmZWI0MjBjMTc3NmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmJhU2hhcmVkR2FtZUxpZmVjeWNsZUFjcm9zc0hvc3RzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ1ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjEyYTUxMzliYjk3YjRjZGE3MzhjNGU0ZTNmMzk1OTYxNzI3Njk0OWRkZmJkM2M5NjczMzg5MDgxZDg0MzJhOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWREeW5hbWljUHJvY2Vzc0VtYmVkZGVkQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2JlMjk3MTVjZGJjMjZjNjI5YzNkZGEzMzgzNDA1YmUwZmNiNGNjZmE5MDdkN2VkMjM0MDk1ZTUwMzBmODU0YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEwMU5iYUZsYWdzaGlwU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NzUzZmFlNDJkZDM4MmQyMTU1NjA1NzExM2JiYTU4YmE3NjJmZTVkMjRjZDMzMTA2NDA0NGIxNTg5YjM5NjgxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjMyMDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGYwY2FhOTQ1ODI1NGIxZWI0YWRhMmJlNjVhY2JhZGMwYWI3ZWEyNzYyYzY0YTEyODg4MzI0YjdjMjVjZjNjZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UaG91c2FuZERvY3VtZW50TG9jYWxpdHlTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1MzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTI1MTlmYjY5MTA4ZGEzMTlhOGFkYWNhOTE1MjU3YmNlNjRiYzA1ZGI5NGE5NzA0NmUzYTQyZjQ4OTcwMzQzZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XYWRvd2ljZVBheU5vdGVBY2NlcHRhbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE2NzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2YjhlZTUzYzZjMzI4YzU5ZGMwMDkyZjM3NmJhNWQxNjY2MmRkOGE0MjA4YThiOTQxNWRkN2E0YmRhMmEyOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbkVuZ2luZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU2MjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTQ3MWI0NTEyZTk5MDFlYzYyNDMwMzEwMzE1MmJmOGZmOTBjMzBhNjg4YzhmMWI0YzU2YWUzNzI1N2UzZTJmNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50UmV2aXNpb25Jbml0aWFsaXphdGlvbkNhdXNhbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ3NTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGI5MmQzOWYyMzNmNjc1ZDRhMTQzMDM5YTRlZmIxM2E5MzUzYmJlZTk4ODQ1MDIwNmYyMTA2ZmM4Y2FmMTdmMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1B1YmxpY1ZhbHVlQ29udHJhY3RUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MjYxLAogICAgICAgICAgICAic2hhMjU2IjogImFhYmNiODViZDdlMDZiMmJhOWUzMzM5ODgyZmI2YmRiMDQ4MmE5MDhkNzQyNWJlYTMyZTg0ZTM2N2UzNzI0MGYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NhdGNoVXBCYXJyaWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNDEwMzA1MTk4ZDM5NWE1MWRhMGM0MTZkZDk4OGMwZjhjZTdjNzgxMDAwYWEzMDNmOTM5ODE2YmRkMWU0YjJmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudEFkbWlzc2lvbkNhdXNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzcwNCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0N2RiMmQzZmNmNTAxYzgzMWVmYjQ5MGIwMWU2MWEzYzc2MTM3NWM2MGJiZTUyOGFkOGQ4Yzc2NzJhYzNkNmZiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFNlc3Npb25TdGF0ZUVwb2Noc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg0NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjg2YzY5NDBmZmI0NjY1OWIwNjc4MzIyYWQ5ZmNlMjE5ZDViZTgyZTM5NWE4NmZlNGQ4ZjgxYWFjYWU4ZWY1NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRUcmFuc2l0aW9uUHJvY2Vzc29yU3Vic2NyaXB0aW9uRGVsdGFUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MTM5LAogICAgICAgICAgICAic2hhMjU2IjogIjBmODBmZWRjNmQxYjdiY2RhYzY4NjE4ZGNlNDVjOTAwNTFjMWUwZmFlYjZkZWMxZTIwNDBlYTNhYmE5NmJlODgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hJbnB1dEV2ZW50RXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTI1LAogICAgICAgICAgICAic2hhMjU2IjogIjVlMzk0MGI3OTk2ZmQ5OWQxY2IwMTNiMmMwNzBjN2M1MGQ2YzMxNzcwMGU1YTEwNmFlOTVkMWQ4MzhhNjkyMWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hJbnB1dEluaXRpYWxpemF0aW9uQ2F1c2FsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzI2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjOTBhYmUzNjk4OTQ4MzA3OWQ3ZTk3NGQ0MzAxNzljOGIzM2E5YTVkNTlhMmZmMGUxMDAwNjBmNDMwZGI3NGE2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRpbmdCaW5kaW5nQ2Fub25pY2FsT3JkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjQ5LAogICAgICAgICAgICAic2hhMjU2IjogIjA4MTljNjc4NzkzZmY3ODY5NjZjNDhkNzg2MGNhMmJiMTdlOWVhMTcxYjMwMDBkODljNmE1ZTBhYmY1ODU4YzgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VuZ2luZU1ldHJpY3NUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NjA2LAogICAgICAgICAgICAic2hhMjU2IjogIjA1MDM1NmRmNDYyOTUwZWExYmRhOTRiY2RlZjhlZGRmZWQxOTM2ODBmMjMwYmUwODUyMDNhNjA0YjE0YzQ5YjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0luTWVtb3J5VGltZWxpbmVKb3VybmFsSGlzdG9yaWNhbFN0ZXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjY0MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyZmY5MDY3ZGQzMzk5Yzk5MzZlZjQ5ZGU5YjMyM2RiZDY1ZGZiMzJjYjIwOGM2NWNiMjRkMTE3MDY0OTA0MWEzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9PcGVyYXRpb25Sb3V0ZUluZGV4VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA4ODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ0NDliMzViZDE1NTcxZmI4ZDRhYzI1YmQ0NThhZmFhMjMxYTYzYWRkMDQ4YjdhYTA0OWI5ODg1YzU4MjQ0ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0VtYmVkZGVkR3JhcGhTbmFwc2hvdFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY0NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTBhZDdiNjc4OGMzZDFkNzQwNmQ5N2M2ZGVhMDlhYTZkYjFiNTEyYzA0NjFlZTQ4NTRhYjZlNmQ2MzEyYzcwMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU291cmNlU3VyZmFjZUlkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg4MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDhiZGFhNTkyODViODE0MTA0NjUzN2RjOTg2OTBkMTk4MWJhMTYxZWE4MGNlZmFjNmQ5NjJkYThjODM5M2JmYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVPYmplY3RTdG9yZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUwMDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmI2Y2IzNTk5YTI5YmZhY2UzY2M3YjYwN2UwOWQ5YTRlOWE0OGExM2NiMjI0YmUwYmVjMmZiZjk0NTcyYzQ0OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhQcm9jZXNzaW5nTWV0cmljc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4Mzc1LAogICAgICAgICAgICAic2hhMjU2IjogIjAyNDgwODIxYWYzOTEzMDM1NTVmYTdmZjcxZDI1YmUwZWFhNzdlNTVjYWY4M2NlMmYzZTcwZWNhNTg4N2I2NTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzk1NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjMxZDhiOTBlM2I2ODRlMTM3M2RmNWQ0MTAyMGE2MmQ5NzcxMmE1YWVmYzVhMTBkNjAwMmI4YjRmOWIzYzM0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Byb2Nlc3NpbmdFdmVudElkZW50aXR5RXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTU4LAogICAgICAgICAgICAic2hhMjU2IjogIjI3MjA2ZWJkNzViNzI2M2EzNTZmMWJhZDM0YjczY2JjZGYyN2UwNjM0YjFkMzVlNDZjMGQ3OTA3M2VlNDc1ZDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvU2NvcGVkUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dEJleERvY3VtZW50Vmlld1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NDgwLAogICAgICAgICAgICAic2hhMjU2IjogIjQ3YTE2NDc4YTNlNzk1ZjgxN2NlYmZjZDhjZjk1ZTUyZDhlZDYxMmFmODFlZDA1NDNhZGM5OWM0ODBjYWRhYmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzb3JzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA3NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTA5NTYyYTIxZWYxMTcwMjJjOGE1N2MxMmI0NDhkZDk3NjBhYTJjOWJiMDFmMDI3ZjVjNmNhOGRiMjNkNDhmNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVSZWdpc3RyYXRpb25zVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzYyNywKICAgICAgICAgICAgInNoYTI1NiI6ICIyNjJhZDQ5NzU5ZDQyNTIzNDQzNWEyZTlmMDc0N2FjYmE2MjViNWRmYjRjNzZmZGQ4MTE0MTRjODljYjQzMTg2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uVGVzdFJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3ODk5LAogICAgICAgICAgICAic2hhMjU2IjogIjhiZjRmZTdmMTViYzY3ZGE5M2Y2NzE5MjEzYjJmNzRhMTZhYTI4MTE0MmQyMTA0MzNlMTAzOTNlOWY0NWMwZmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9DdXJyZW50UmVwb3NpdG9yeUV4YWN0Tm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NTYyLAogICAgICAgICAgICAic2hhMjU2IjogImFmODk3MzIwZDliNTdjNmI1OTkwOTA3MDJkN2U0Njc5NDYyNmYxMWE0MGQ1MTEyNWYyZDM3MjhkY2EyMmI5ZTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9TZWxlY3RlZFdvcmtmbG93Qm9keUxvY2FsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzAxMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMGEzNDk3NzRiZTQ5NjUwMWNkM2Y2YTRlZGJhMjQwNWE0YTFmMTI5YTExYTM5N2VhY2I0M2MyZWIwMzM0MWIyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGVja3BvaW50U3ViamVjdFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk3MTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDFiNDI3MjM3NzJmYTEyNDZiNzAzYTViMDljODgyMDM0MTIxZGNiNmQwOGY1MzAwZWU0OTAyZDE4ZTVjOGUzNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lUHJvdmlkZXJTdXBwb3J0RmluYWxTZW1hbnRpY3NUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjQxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTUwN2M5NjQ0ODMwODdmOTZmYTNjYTQ1MjI5ZWY5NDdmZmI2YTVjMTZkOTA4MTQxOTFlZTU0YTFhNDAwZmM4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVTdWJzY3JpcHRpb25Qcm9qZWN0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzcxNTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmM1NDY4NjJmMzQ2NmQ1Nzg0MTc0MTFlZWQzODZlN2M0NzRmNzBlZmJkYzgxOTA3M2IzZGE4M2U2NWRmYmMxYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVFZmZlY3RQbGFuVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc5OTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTljYmFhYTE2YzUwZThiY2RiMjhmZTlhZDYwYWQwOTZhMTBiOTZiNTlmNmQ2MzAwYTQ2NzQ4YzMyOGU0MTYyNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtUGxhbkNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg0MjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGZiMGE3ZDNmZDdhMjQzNzc3ZGJkNzFhMThiMzUyNmFjODAyNTBhNTY1ZjM5ZTViZWZkOGUyMDg3OTY1M2U3NiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L05vZGVVdGlsVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU1OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlNTNjYTY1NDE0OWFiYWY0NmYwYWExOWE5YjEwZjdmNjFlZGU3ZWY4OGE1MDNlNTA3MTJhYzU0OWFjYTA2NzNhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbkNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY1MjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOThmNTIyNDQ4ZTQ3YmViNTY5MjgyYTAzNjJhMGIxMzk4MDgxOGY0YmE2MTI2MWQxM2FkODU5NTM1ODExNTc3OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1N0YXRpY1VwZGF0ZVBsYW5UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDMwMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYzg3ZTMyYmIxYjhkNGE3ZmViMGRjOTJmOTY3YzkzZWVmYzgyMGU5MTcxN2IxYmRjYzc2OTZlOWJjMmU5M2RjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dCZXhHYXNMZWRnZXJIb3N0VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ0YmM1Y2YyYzFhN2NiZWZkMTI3MTI1MDg4NDJkYzFhNjI3M2Y4MGEyODY5MjAzN2YyYzJlZWM2M2M4MjRkNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93RXhlY3V0aW9uU3RhdGVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NDI4LAogICAgICAgICAgICAic2hhMjU2IjogImJkZDNkNmQ1Y2E2N2U5ZjhiZTQ0MTU3N2E1NzY3MDNlMDQ0MWI3ZWM0ODQ1NDMyZjlhMjM0MWY3MmQ2ZmU0ZTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1BhdGNoRW50cnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDAwLAogICAgICAgICAgICAic2hhMjU2IjogImEyMWM3ZTI5MzQ0YjJhMzZjMzhmNzkxYWY0MDM1ZDk2YTMyMDcwZGQ1OWJkMWZjZWY2YmIwZjYwZWJkOTY3MzQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVXb3JrU2Vzc2lvblRlc3RTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmRkZTMzMDIzNzZlZWQwZTg3MmQzMWY3ZjkyMDQwYjc5ZjUzZmFiMjkyZDMwNTBmNzY4MTFkYmQ3ZmQ3NDVmMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0Rml4dHVyZXMvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Db29yZGluYXRpb25UZXN0Q29udHJvbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzAxOCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MTM1ZDdlNjMzNTA5MTI0MmFiYTQ0ZTYyNGZlZmViMWJkMDdlYTBmZDkwMjMxMTFlNjAyZTM0OWI3OTBkYmE4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiU1RBUlQtSEVSRS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDc0ZDcyOWNkYjUyZjkyMTg2YzQ5NjRkMGFhZmI2OGEzNzZmY2UyMTRkMjU1NGFiMjg2OTcxYTgyZDg2ZTAwYSIKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJzaGEyNTYiOiAiNDNhODE0ZTI2NzgwY2NmODcwZGVhMjY5ZWExMTg3YjAzNzJjYThjZTE4M2ZkNWQwOWU1N2NkNjM5Y2ZjZGJlNSIKICAgICAgfSwKICAgICAgInByb2plY3RNYW5pZmVzdCI6IHsKICAgICAgICAiYWxnb3JpdGhtIjogIlNIQS0yNTYiLAogICAgICAgICJpbmNsdWRlTW9kZSI6IGZhbHNlLAogICAgICAgICJmaWxlcyI6IDI5MywKICAgICAgICAiZW50cmllcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiLmN6LnRvbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYTRkYzU0NjQ3NjBiYTQyOWU5OTAxMjk5OGJlMjA2ODM4NGFlZmJkMWQ5MjY1NzFmNDVlOWYyNGMxZGNhNDE3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiQ0hBTkdFTE9HLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY2NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlOWUzNmI2OGVmOTRhZTQ5ZTYwYjBjNmI4ZmE4ZDZmZTRmMWNlZDIxYmE5NGZiODZkMGQ2OWVmMjEzZmZiZDMzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiQ09OVFJJQlVUSU5HLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyMjNiYmFhMzE2N2VmMjc5ZjhmNzdkZTM1ZmUwODQ5YmQwYTdjNTc1ZDdkNDVjMzI2ODFmMzczMDM1M2Y1YjNkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiTElDRU5TRSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNjksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDgzMTM3ZjcyZDVkZDdhMzFiZDBlOGEwYzY5MzE0NDNiM2YzNzhmNmIyZjFmZjBkOWFmYTcyMWRhM2JjN2MxNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogIlJFQURNRS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWFhNTY1YzMzYmExZjFkMzA0ZmVjNzBkNjFhODgyYmE2MjA2ZGU2ZjliYmNkMDk5NTQyY2NjY2NhMjlkYWU1MiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogIlNFQ1VSSVRZLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICIxYjhlZmVhOWZiMmZkZWYwNzI3YTkwYmIwNmM3MTgyNTk5YzRhNjU4N2FmZGIzMjdmMTBjN2FkYWVmN2U5ZDU0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiU1RBUlQtSEVSRS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDc0ZDcyOWNkYjUyZjkyMTg2YzQ5NjRkMGFhZmI2OGEzNzZmY2UyMTRkMjU1NGFiMjg2OTcxYTgyZDg2ZTAwYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg4MDMzLAogICAgICAgICAgICAic2hhMjU2IjogIjM1NThmMTIzYTFjODNjZDUwNDQxZjk0YWYzMTY4MmM2OTMxYzFkNDQwNzRiMjBlNjkxYzljNzRjMjFjMzJmMWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2FyY2hpdGVjdHVyZS9jb21wYWN0LWVuZ2luZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0OTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGJjNmVlNzllMzNkODgwMGY2MWJmZTVmNDM1OTViNTZhMjJhNDU2ZTE5YWE0YWZkZDBiYzIyYTZlNjQ4OTViNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZGV2ZWxvcG1lbnQvYnVpbGQtYW5kLXRlc3QubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTM5LAogICAgICAgICAgICAic2hhMjU2IjogImY4NjQ3N2Q3Y2RjMjE0YjM4ZWRhODAzMjMxMjI0MTdjMTgxNGZiMjExNDk3Mzc0MGVkZDJmYzllN2MzZTZhMjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2RldmVsb3BtZW50L2ludGVybmFscy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2MDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDlhZGJmOGJhNGJjZWFjZWMxZjViNzA3NzRmYTRiYzNmOTQyNTRhYWQ1MjMzZmFlN2JhZGE5MWQxMTQwZGZhNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZGV2ZWxvcG1lbnQvcmVsZWFzaW5nLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjgwOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNjc0OTg5ZjIyNDRkZjU4ZjliNWIyNjk3M2MxOWFlZjUwYTVmYzliYjFiNzgxODFhYjRhMzFjMGYyMzBhMzk1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9kZXZlbG9wbWVudC90ZXN0LXN0cmF0ZWd5Lm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUwNywKICAgICAgICAgICAgInNoYTI1NiI6ICIzNzQ4ZWRlODIxMWQwZTY2OTA3ZGRkMTM3MTFjYWI1NjQ0MGNlN2E2YmRiZWRmOTE4ZjNhZTJkZGM0NTdiYmY1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9leGFtcGxlcy9jb3VudGVyLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkxLAogICAgICAgICAgICAic2hhMjU2IjogIjk0ZmUwZWViNGU2ZDVjZDhjYjU3YzgzYWYxNTg0NjllZmJjZWEwZGQ2MmQ0NmEyMzRiNDY2YzQ0Mzk2NDhhNmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL2V4YW1wbGVzL2xhcmdlLWhvc3QtcGF5bm90ZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMWM5YmQwZGNhNzhiM2YxMTk5M2Q4ZmNkZDI5MzRlOThiNWVlMzVkYzVlMmY0ZTRkNTg5NTdmNjU4ODc0ZDk2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9leGFtcGxlcy9uYmEtY2F0Y2gtdXAubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjgwNzFkYjE4ODRhNGNiYmI3NzJhNTFmNzczZmI4NjQ1ZTA0OTRhZDJlZjcxMTgyOTA1NzcwNmQ4NzUxODE5MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvZXhhbXBsZXMvbmJhLXNoYXJlZC1nYW1lLWxpZmVjeWNsZS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2MTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjUyMjUwODIxMzI4NzQ5YTk2MTY3NWMwODljNGQ2ZjA1ZDIxZmZjNDEyYTAyYjY1YjY3MzYxYzMxOTBhYzJmYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvbGltaXRhdGlvbnMubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTA3LAogICAgICAgICAgICAic2hhMjU2IjogIjA5NzY2NTkwMzY3ZjU2NTJlY2I4MjAzNWM4YTZhMzM1NmYzZTBhNDEzZDhhYmNkMDkyY2VhNmI2ZDJhMmViMDUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL21pZ3JhdGlvbi1mcm9tLTIueC5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExMzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmY2YzVkMzY0ODU5YWExZTNiNzQ0ZWZlYmMwZDk2ZDcxNGRmOTkzYjM1MDQzMzNjYmQ2NmRjZTc4NjBlMjAwMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvb3BlcmF0aW9ucy9mYWlsdXJlLW1vZGVsLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzkwNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjMmQ1NTVjYTM2ZWE3OTEyZGEzNjUwN2FiNzQwYTY2MmFlMTU0OWUzOGZmZDI5NjFiZjNlZGQ5ZDY4ODg5OGNlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9wZXJmb3JtYW5jZS9ob3N0LXZzLWZyb3plbi10aW1lLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODA2MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0Yjk5ZTcyYjhjMzc2YjBlNjVmZDAwNmQxODc2ZDEwYmEyYjBkZWYxMjg0MzYwNzE4ODNhOTI1ZTVlYWZkZGY3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWZlcmVuY2UvbWV0cmljcy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWQxZThlN2EwYmY2NjRiNTQ2YTJjZDM5OWJmNjE3NDUzZDRlNzgwMmI2NmMzNmE4YzdmYTg0MzIyMzE1OGEwYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVmZXJlbmNlL3B1YmxpYy1hcGkubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MDQ1LAogICAgICAgICAgICAic2hhMjU2IjogIjdiZjVlNmNiMjhiNGY4YmY0ODljNjJkN2MyYjUyODIyMWUyMmVhODYwNzAzYzYxM2Q2MWZkNDFiNTI4ODBkM2UiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzLzMuMC4wLXJjLjEtZXZpZGVuY2UuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1OTExLAogICAgICAgICAgICAic2hhMjU2IjogIjljZDEwZDZiYWE4OWQ3NjRkMTlmYjcxOTgzNDIxNjM2ZjFmYTA3M2ZhOWViZTBkNjc3MDU0Njg4MjFjZTczMDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzLzMuMC4wLXJjLjEtdGVzdC1yZXBvcnQubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NzA3LAogICAgICAgICAgICAic2hhMjU2IjogIjZlOTRjMGYxMzI0ZWQ3ZjAxNTZjNDU1ZjI1NGM5NmYyZGY3ZThiZTIxMzZhZGMwYjQ4ZmUwOTRlMzI2NDdiZGUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzLzMuMC4wLXJjLjEubWQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjRkYjA5ODc5YWQ5OGY1ODc5MTRkYzBlYmYxNDdlY2Q3YzUxYTAzYzJjYWQ5ODI0Mzc3MWQ2YmRhMDQ1MGE4MDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvYmFzZWxpbmUtbGFyZ2UtaG9zdC10aW1pbmdzLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTY1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJmMjMwYWVlN2Y2ZGI0ZTNkMjljODgzMWQxYzc2NTQyMzZhZjZiOGU0YWYzY2JiNjI1M2RhYTJlNTQ1YzIzY2EyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2Jhc2VsaW5lLXJ1bnRpbWUtY29tcGFyaXNvbi5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA1OTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWNkM2JhMzQ0MzdmOTJkZTlhNWVmZDRlMTI5NTRhY2EzYjk0YzgyNzEwMTY0YWFmNTA3YzIyNTdmYmNlZTIxMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9iYXNlbGluZS1ydW50aW1lLXByb3ZlbmFuY2UuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDlhODE5YjY5YzRmYTUyOTI5OWY4MGJhMjlmMGRmNjE0NThkMWRjZjE5YzRkYzFmZTZhYjc5NWJlMmFmYWJlZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMS9maW5hbC1sYXJnZS1ob3N0LXRpbWluZ3MuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5NjU5LAogICAgICAgICAgICAic2hhMjU2IjogIjljYzhlZWMyZjJjNTFiNDNhZDc3NmQ2YzRiNjVlZTg2MTE0YzY2ZjYxMTZiY2Y2ODgwY2QwZGRkYTJmOGJlOTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3JlbGVhc2VzL2V2aWRlbmNlL3JvdW5kMTEvZmluYWwtcnVudGltZS1jb21wYXJpc29uLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDU5MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MDVmNDBiNDRjNjkwZmEzYTk2NGM1YTAxYzQ3MDA1NjU5ZjFjMmFjZjU5MGE0MjQzYWQ1YWMzNjNkMjRiYzY0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDExL2ZpbmFsLXJ1bnRpbWUtcHJvdmVuYW5jZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNywKICAgICAgICAgICAgInNoYTI1NiI6ICIyNjcyNTlmNzRjYmU5NDFiMjNhYTgxZGJlODUwYTU2MDA0ZDA3NTIyYmVkMWU1NGY5YTJmMjEzZWQwMTkyNWIyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9ldmlkZW5jZS9yb3VuZDEyL25iYS1zaGFyZWQtZ2FtZS1saWZlY3ljbGUuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk1NDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDMzYjY5YTAxMDg2NmNjMDA0ZjkyYzcwMWJkNmYzMzhhNzcwY2YwMWEyZWZhODQ1ZGYyNGU5MDc3NzlkZTM4YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvZXZpZGVuY2Uvcm91bmQxMi90aHJlZS1zY2VuYXJpby1wOTUtcHJvdmVuYW5jZS5qc29uIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjc3NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzU0ZmM1MGZiOTI5ODVmMzViMmU1NjNhNDYwNTRkODViMjFmMDgyMzQ5NTM3YTk0MDc5ZDhmOGVlM2NmMDZhMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3MvcmVsZWFzZXMvcm91bmQxMS12ZXJpZmljYXRpb24uc2NoZW1hLmpzb24iLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDg4NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMzlkMGUzZjkxMjhhMDE1NmI5MGYyMzdmNzFjZmUyOGIzMDc0MTIxZjg2ZDQzNjhhMDUxZDc0ZGEwZDlhZTYyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9yZWxlYXNlcy9yb3VuZDEyLXZlcmlmaWNhdGlvbi5zY2hlbWEuanNvbiIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MjgyLAogICAgICAgICAgICAic2hhMjU2IjogIjAwNGQxZGI1MjgxYTc2ZjM4ODA1MWEzZGI3YmMyYjBlMjMyZmM3ODM5ZDVkYmRmMzliMjZkNWZlY2NiOWQxMTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJkb2NzL3NlbWFudGljcy9oaXN0b3JpY2FsLWNhdGNoLXVwLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDA2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJkM2E1OWYzNWJjYWM5ZWJiYzMxNmNhMGI3NWRmYjhiN2VjOTRiZDZiMWM3ZGE3YjM5YmQ5YjI5MThlNGU1OGRhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZG9jcy9zZW1hbnRpY3MvaWRlbnRpdHktYW5kLXJldmlzaW9ucy5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmNlZGE1ZmY4ODZiZjUyNmRmY2I1MzI0NzcyZmYzZTU1ZmE1YmYwMWRhNDE0NzU1MjkxNjAzYmNmNWRjM2M5NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvc2VtYW50aWNzL2luaXRpYWxpemF0aW9uLWNhdXNhbGl0eS5tZCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzODIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTcwMjdiYTE4NTI3ZTVlZjY4MmZiMjJiYmRkNDlhNGI1Yzc0YWY1YmJhY2Y0OTQxNDJmNjI2MTJjYzk1N2ExOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImRvY3Mvc2VtYW50aWNzL3Byb2Nlc3MtZW1iZWRkZWQtZG9jdW1lbnRzLm1kIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NzRiNTI1ZTFhZDc5YTg1MDU1YTE2YjJjZDQzNjNkZjllMzMzYzE1YmJiZGIyMWIxOGVkOWRlNDA3NDRlNDZkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLmxvY2tmaWxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjM2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICIyOWE2ZTE5OTZmODhmMDdhZTU2ZTRjNzIwNDA5YzA5MjQ0MGJjNmFkYTE5NzEyNWEwZGZlZjAxNzIyYzNlOTRjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLnByb3BlcnRpZXMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmQ3M2U5MTMxN2E1NzZiZTlmZDcwN2FkMzZjZWYyZWViNWZmNWRkMGNiYTcxMTYzZDhjYzMwOGZhNjU4MjdjMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9iZXgtc291cmNlLmxvY2siLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDFjOTZjN2U3NmMxYTc1ZGQ2YTBkZmQwOTY1NmQ2NDQ5OTU3ZmIxNDRkZDM2M2Y3ODc1NmZjNTU2ODVkYjQxNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9wdWJsaXNoZWQtYXJ0aWZhY3QubG9ja2ZpbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTI5LAogICAgICAgICAgICAic2hhMjU2IjogImI0ZTdiNzhiY2Q3YWU5Mjk1OWI2MWY4ODJhMGM3NjJhNTY0ODRhNTdkOGQ2YTEzODhjMWZmYWJiOTYyYmIxNTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcmVwb3NpdG9yeS1zb3VyY2UubG9jayIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZDNiMDU1MTA4ZWY2NWE3ZDU0ZTA5YzlkOWM2MTljMjA4YTNlMWY3NTE4YjZlMWY1MTRiNzVkNDE2MzdmZmY4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDg0NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTc0ZDRmMTA3ZDJmZWFiOTg5YjlhMDQxYTAyZTJkMmI4NTU2N2ZmNDg0MTVjOWM3YWRkNWVjYzE5YWJkMTlmOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXciLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjU2LAogICAgICAgICAgICAic2hhMjU2IjogImE1YTVjMTk5YmEwMjE4OWFlOGM0NmEzMzQyMjMzNzFhMjA1OTlkOWMyOThlZjY1ZTc1NDBlZGU0YTNmNzJkNTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNldHRpbmdzLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTdjYTU4NTFmOWY2NjMyMDcxY2UxMmNmMGY2MjA5OGQ5OTVlYzlhYzI0NjJlZTAwM2ExODdjMjNiNjJkZDZjYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9jb25zdW1lclRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9jb25zdW1lci9QdWJsaXNoZWRBcnRpZmFjdENvbnN1bWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI0NDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzg0OTZjOWM2MzlmZjEwNDY3M2JlNmM2YmI3OTBmYTU2NzE4NzAyN2E3ZDA5YjViNDA3NTgzYzQyYzM2NWQ2NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9BcHBlbmRBZG1pc3Npb25BdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDExLAogICAgICAgICAgICAic2hhMjU2IjogImY2ZjE3ZjczZTg1MTg0ODAwYzExNjM0YTdlNjBiMDUyOGM0NTg1Y2Q3YjRjNDQyMjBiNGI3Y2VjZThiZjk0MTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ2FjaGVTZW1hbnRpY1Bhcml0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDk3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YzFlOTY1ZGUzNzc0OWVmN2YzNjYwN2NkYWFlYjQ5NjJjMmMyOWVmMDJmZGQwZjc4ZjVkYWI5YTRkMTI4YjYwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NhdGNoVXBQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzgwYjQzMTI4OTc1MmY2NjY1Y2E1OWZkYTFmMzI1NDI5NzMwYjViYjY4NGZmZjk0NGJhMmRmNzQ1NDNlNGRlZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db25jdXJyZW50RW1iZWRkZWRDaGlsZENyZWF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMGEyNzNhZGJjOTljMGMxOGE0ZmM3ZmYzYTY0MDI2Y2I0M2MzODc5OThiNGFkMTA4OGMzZjIyODY2MzhmMjAxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NvcmVCZWhhdmlvckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmM5NDJkMGE2YmQ4NGQzYTE5ODdlMzUyNjQyZTdiNDQ0Mjc5ODg5OWJmNGI2ZTIwMjdlNmIzOTdiYjQwN2IxYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EZWVwU2FtZUVudHJ5T3JkZXJpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTIzODI2YTk2ZTdiNTk5YmI3ZjlmZWVmOGU4MDcxMjVlMDg0MTdhZGQ4MGI0ODZjZDllY2MyMzYzZDYxOGUyOSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljSGlzdG9yaWNhbFNvdXJjZVN1cmZhY2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzEwNDQyOWE3M2MzYTNiMjMyNTFiYzc5NDcyZjIwMzU1MGFhZTI4ZDBlODg0NzE1YjIzYTI5MGFkYTQ2YzkzYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkSGlzdG9yaWNhbFBhdGhBY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzI4YjY5ZmM3ODc3MmJmZTA4OGM3NGNiNjUxMmE1NjRhY2Q3NmE3MzUzMDAzMDNiOTQwZWI1NmY1YzAyYTEwYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkUGF0aEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTkzLAogICAgICAgICAgICAic2hhMjU2IjogImUyYmZiMzI4YTIxNTY5MGJkNDZkMmUwYmUwMGFhOGFhNWVlMjUwODMwOWZhM2FlMGU1Mzc2MTFkM2JmOGQyYTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRFcG9jaEV2ZW50T2NjdXJyZW5jZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmODI4NzBlMzc5YmVjZWM4ZDk3YzlhYWJkOGU2NGVkMTYxZDk4OTU1ZjcxYzNjMTM5ZDc5NDc4ZGZmN2UyODFiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkT25seUxheW91dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ0MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMmY1MzlmN2Y3YWJiNjU2ODQ2MzhlZGYyZjI3NDU0YzAzOTQyZDFiZTkyNmJmYjEyNTE2MDlhNWYyYzA1YmUzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkT25seVN0b3JhZ2VQb2xpY3lUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTkyLAogICAgICAgICAgICAic2hhMjU2IjogImUwYWJkYmE0MDg5OGM3YjMyZDZhNmUxNDQ2NzE0NjVkNTBhNGY1NTYxNmZmMDBmYTgwZGJkZTUxMjY2MjA3NTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDUxLAogICAgICAgICAgICAic2hhMjU2IjogImU2ZTI5ZGI4M2M3NjJiYjNlM2Y4ZDMxY2Q4MTM1ODI5MTYyMDkzNDQyNzkwZGUwMDk5ZDk5ZDI5MWJkM2MwZmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lVGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmZiNmQ2NTdkYTQ2ZjFjNDAwMDJkYjg2YTRjOGQ2ZDA4ZjM5MzVjYjc0ZDJiNWQ5NWJlYmIwN2Q0NWI0M2M2YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FeGlzdGluZ0VtYmVkZGVkU3RhdGVPbmx5Q2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmRkOTY2ZWUzNDRiMjQwOGYzOTI4ZTM2YWVhZjQ2OGEwOGQwNGZmY2IxZjNkZWQwODBmNjk1NzQ4OTc1MDg3YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9GYWlsdXJlUmV0cnlBdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjIwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2NzA3MzBhN2MwMWZhMDk1NDU0MjA5NmQ5YTg3MWJiZmUyN2E0MzQ1ZjIwZTNkN2IxZmVlYjAyODIzNDdkMzE4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0hpc3RvcmljYWxTb3VyY2VTdXJmYWNlSW50ZXJ2YWxJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3ODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2NmZjM4NWFiNjcyNWE0NjQyNzViZDA5MWY0NDczYWQxMTI5OTU0NTdlOTZjNWMxNTM4NmRkYmZhMmRhMGU1ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Jbml0aWFsaXphdGlvbkxpZmVjeWNsZUV2ZW50T3JkZXJpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc3MTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTdmYmRiYTQzYWVjZDM4YmQ3YmI5NjJlYzcyZTM0MzBkY2I5NDEwNDQ4NGQwMjI0ZjhkZWFkZDQ1NjZiMjYzYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Jbml0aWFsaXphdGlvblJldHJ5SWRlbXBvdGVuY3lUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTk5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4M2E2ZjJiZDE3M2MzNDVhYjAyYTJiZDNkNzUzNDJmYzEzMDk5YWE1OWIyNzkxM2I3OTRlMjFkMmI2MzQ2MDJlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0xhdGVBZG1pc3Npb25FbWJlZGRlZEhpc3RvcnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODkxLAogICAgICAgICAgICAic2hhMjU2IjogIjFlNmZlYzA0ZDVlMTVhMzJjODdlNzNkYzRlZGVhYzM4YWI1NTI3MTgxYjg4OTJjN2YxNGVhZjNlYzllZDc3NTIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZENoaWxkQ29sbGVjdGlvbk1lbWJlcnNoaXBNdXRhdGlvbkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzA0NywKICAgICAgICAgICAgInNoYTI1NiI6ICI5ODViZDk1OWRhZGRlMzBiNjc2NDY1ZmU2MzJiYTI3OGIxOTcxNWM5YzQ4MjI2NDQ1YmE4YmRiYmJmOWNhYzY1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWRDaGlsZE93bmVyc2hpcEd1YXJkVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICIwYTk0OGVjZWM0YzZmNjA1NWFhYTkwNGQ2OTFkYzQ2M2FkNTM0ODg1OWU5MDBlZjNjYzNlMTdjZmVjNTdjOTFkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWREb2N1bWVudElzb2xhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTRmZWIxZTI0YTI2YmJmOWUyN2I0N2RlN2VlM2I1NDNlOWUwZjk1NzI1NTMxOWU4NzNiMjcxZWJiMjNlZjE3NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NdWx0aUNoaWxkU3luY2hyb25pemVkQ2F0Y2hVcFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNDg3LAogICAgICAgICAgICAic2hhMjU2IjogImU3N2Q1MTE1MmFmNzdhYzhhYzU5NmVkOWEwNWVkNzE2ODQ3NjM3YTAyNjE2M2IwMjNjMjVkYjA3NWVhNmM5NTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkRW1iZWRkZWRDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc1OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYmRhZTBmNzVlYmJlNmY2MDI1Zjk5Yjk0YWNjN2I4MjlhZDRmNjE4YTBlZGU4MjAwMmMzNDEyNmIyYzI4MjA5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZE93bmVkU2NvcGVQbGFuSW52YWxpZGF0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjcwLAogICAgICAgICAgICAic2hhMjU2IjogIjUwOGUzMTNlZDczMDEyNzFjNzdkMDVmMDMwOWYzN2RiMGQyM2UzMGZiOWZjMGU1NTM4MjBjZTk1ZDRjZDVkMmIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkU2libGluZ0dsb2JhbENhdGNoVXBPcmRlcmluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDExNjE5LAogICAgICAgICAgICAic2hhMjU2IjogImQxOGRlODBlYzQwZDIxZjM1NmE5MGZjMzVkMzg1M2I3MzczOWRmYjU3NzZhZjNlNjJmMmI1OGMyM2U3YjdmOTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTm9uU2NhbGFyUm91dGluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMWY4M2E0ZDI3ZjViMWYzZjZlNWU4ODM4NzJhMWE4NTZiYTBkNWM4YWQxMTg0NTcxOTFlYmYzM2JlNDhmNDdjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzcxLAogICAgICAgICAgICAic2hhMjU2IjogImYxMmU4OTJjMjEzYmJjZjc0ZDA5ZTJiNzFiYTFmZThmNzMzMjdlZWFkMDdhZDNmZmRhM2QzMTk3YTc0YjUyZjEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUHJvY2Vzc0VtYmVkZGVkQ29sbGVjdGlvblBhdGhzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NTExLAogICAgICAgICAgICAic2hhMjU2IjogIjRmYWE2OTExOGVlNWNhMGU3MDJlNjViZjRmMDgyYzNjMTY1ODg3ZWQ3Yzk3ZTdhODIwYmFjMWI4NTk1OGM5N2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUHVibGljVGVtcG9yYWxGZWVkZXJJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1NDM3LAogICAgICAgICAgICAic2hhMjU2IjogIjU4NWUyNjE3NzdhNjZkNTVlNDg0NTg4ZGU5M2JkZGU2OTNiNTIwZDkyMjQ2ZTE2NzkxZjFiY2E2OWQwMDQ2OTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUmVtb3ZhbEN5Y2xlQW5kUmVhdHRhY2htZW50VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODQxOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYTNlZDMxODVlYTgzNGYyOWQ4MjE0NmI2NDdmZTU0MmVhNzI0M2YyN2RjMDY3NzdkMGFlN2Y1MzNlNWZkOTAyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTBJbml0aWFsaXphdGlvbklkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzk5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MGVkNjc2MGQwMTU0YzIzNTQ2ZDhjZGQ1NmM1NWZjMTBlYmI5ZTRhMjM4ZGJiZTY0MmE5NWQ4YjZlNTI4NDY3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTJOYmFGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyOTRlMjA5MGI1YjZhMWNmMjY4ZDAwMjNkNzVkZmMxNGQ0ZjZlNTBlZDA1YzFhN2E5MWVmMTYwMTUzNmMyY2MzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NhbWVEb2N1bWVudEluaXRpYWxJZGVudGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY1MDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmFmMTA2YzJmMDAxZjhhMWNhMzcxOGNlZWVhYmI3YjBjZWQwMmRjODlkN2FlNWEyNzI5MDdhNDQ4OTYxZGVlYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TaGFyZWRNYW5hZ2VkQ2hpbGRUd29PY2N1cnJlbmNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU0NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmE3MGIwNWQyYTQxZDFjM2Q0YTJlYzc1YjNmMTRmMWE0NmY1YWEyNGJmYzRhOWU5MjJkZjg4ODZhNTkzMmQ3NyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TaGFyZWRNYW5hZ2VkQ2hpbGRUd29QYXJlbnRzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQwMDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDkxMzQ5ZDA4YjBkZTg0MWMxM2EzMDA2MGVlNzQ0MDM0MTkwYjE5MWZiMjE5YzdhYmE2ZDE2OWRlZDdjNzNiNSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Tb3VyY2VTdXJmYWNlSWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY5MzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWZjZTMxNWNmM2ZjNzNmZDYxZjIwZTY3ODJkYmYyN2Q1MzNiZDc2ZTFlNjY5MDliMjBjOWJjZTYxNGZmMzgxMiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TdGFydEFkbWlzc2lvbkF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmIyY2NiNTJmMjAyMmI0NWVhZDg3OWQ0MzgwMGJlMzhkNTk5OWU4NGY4OTJmM2I2NTkwNDE2YzI2NDI3ZjQ2ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZW1wb3JhbEFkbWlzc2lvblBvbGljeUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM5MTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWQ1MzM0MWVlNGUxMGZiNDIxMjA3MWIwZGY1MGExZWYzYWUyODVlMTcxZThhMGZlYjY0NDk5ZTQxZGE0MTU1MCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZXN0RW5naW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDM3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZjI4MmU5MmIwZjg2MWQ5MzUyZWIyYWM3ZTA1MTgzYzI1MzM3YmIzNDYyY2Q1NTE1MWMxZjA0NWViZDlkNGMwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RSZXNvdXJjZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyMywKICAgICAgICAgICAgInNoYTI1NiI6ICJmMDA5ZTFmMWYwNmVlNzc1MzJkZDBkNGVjNmEwMDYwZDc4OGU2Y2MyNjkzMzJjNTdjOTc2NGJkNGIxMmNiZGNiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1dob2xlT2JqZWN0RmFpbHVyZUh5Z2llbmVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODAwLAogICAgICAgICAgICAic2hhMjU2IjogImM3OGNlMTk3ZDkyZTZjMTg4YTFmMmU1Y2VjY2I2Yjk4OWY1YjhiN2U1NjhlZDk1Nzg0ZWU2MDllNGNlNTYzNjEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQXBwbGljYXRpb25SZWFkaW5lc3NQcm9vZkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTY2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOTg3NzExMjZiZWZlZGNmOGJkY2UyYmJjNDhkYmE0MDE0OTMzMzFhZjBjMmQ4MzA1YmEzMzJhNjJhZjM1ODM0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vYWxsLXRpbWVsaW5lcy1yb3V0aW5nLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGU3NDI0MThkNjc3MDUxODY2NmM3M2U1ZGY3M2VlOTk3YjY0NTdkNjUyNGI4OTc0MmZlZThkMDlhZmM0ZGUxNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2NvbXBvc2l0ZS1yb3V0aW5nLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTQ1OWRiMmNiODhmYWNlOGYzZDBiNTliOTY4YWFiNTUyMWYzNzg1MDZiOTdhYWQwYmNlZjdmOGQ5ZTJmOThhMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2NvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3ODEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTFmYTlmYzc1NTc2YWVkNDY0NjkzMjViMDI3NzgzM2NkOTA2YzM3ZWQyYzY1MDY1YzNhOGI5NWE1M2U3YmMyYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1hMS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ3MywKICAgICAgICAgICAgInNoYTI1NiI6ICJiNTRjY2RlMTQxM2MzOWNiZjRkMWY1YjM0NDNlMmUzNThiYzQ0ZGViOWNkODdjNjdjNDNiMjU3ZDE3OWUwMmQ1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExMS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzEyLAogICAgICAgICAgICAic2hhMjU2IjogIjUzY2E3NGJlZTY1OGQwNTEzM2U0YWViNThiZmM3ZDlhYmI0YjkzN2I2YzAzMWQyZWJjODFjNDdhNWQxNWNhZGYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kZWVwLXNhbWUtZW50cnktcm9vdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjg1OCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwZDQ2ZTU0YjU5ZTNlMDY2ZTUxYzEzM2VjMzdkYTEwMTIwMWM4MDg0NzQ2ZGEzZjQyMTZiZGViZjFjYjc1NWZiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZHVwbGljYXRlLWV2ZW50LWVtYmVkZGVkLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzgxNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwZDhkNmU4ZGNkNGU5MzM2YWYwYzI2NjVjZTAwN2JmNDliMzIxNWRkMWMzYmZmOGJhNDBmZWUxZjQ4ZTVhYWIyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZHluYW1pYy1zb3VyY2Utc3VyZmFjZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM4NywKICAgICAgICAgICAgInNoYTI1NiI6ICJhNmVlMzFlMDVhMDMxNWQ1Yjc2YzMzMTdlZWI4N2ZiMjAwMWJiMzUxMjc0ZDEyYTJmMTAwYzE5MzY0ZDc5YjlhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY29sbGVjdGlvbi1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyMzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTViNDAzOWEwNmM1MTIyYWYyNjczYThkZjBmYTRjZTI0OTk5YTI3MmNhMGM4ZDk3ZDk3MTEzMDE3ZTUxMzc5NCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvdW50ZXItQi55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjg1LAogICAgICAgICAgICAic2hhMjU2IjogImMyNzkwOTRkYmM1MWU2ODA4YjU3ZGYzMjkwMGQzMDkxMjhjNGEyMDhlZDFjZjRlYWQxOGQzZTQyOWU1NzNiNzYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjMxNmFmYjZjZmI4OTE2ZDM5YTdmZDcyMzg5NDllNGIwYTU4YjRkNzJhMGI0YjQ4NDE0NTllZTQwODk1MDEzZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLW1pZGRsZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTYzNiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmOGZmMDJiYTRiOTZlY2QxNWU2YTM3YTk3YzhiMGJkODIzZGRlYjc1OWVhOTgwMDk3NTJjMzNmYmI0NTNkZTllIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODA2LAogICAgICAgICAgICAic2hhMjU2IjogIjZiNTljYzJlYzBjYWE5NDI1MTlkOGRkM2FjYzg1NTFmMmNjZDMwNGUwYmQ2MjU0NmQzMTY2OTQxNjg0OTRiZjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjY3LAogICAgICAgICAgICAic2hhMjU2IjogIjY4Njc2NjEzMzhhOGFhZDU3MmExNzVjZDJjMTc1ODMyMzI2MzhkNjMwZThmMWVkNzc3ODIyOTg1OWM4MmE3YzAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1zdGF0ZS1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3MjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWZkYjA0MmNhMDc2MzcwYTcyOGZmZjlmODVkMTdkNDk0M2UwYTAyYjllZjY5YTJlZDQ5ZjRjMzBmZDk4MGY4YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2luaXRpYWwtZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjk4LAogICAgICAgICAgICAic2hhMjU2IjogIjU1ZGYyMzBkNmJmOTJkMmJkYmZhNmIxODNiYzRjMjUxZjZiOTczNDA1ZmI3ZDBlNjYzZjRiMGYyOWY3YjViZmYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9sYXJnZS1vcmRlci1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MTIzMywKICAgICAgICAgICAgInNoYTI1NiI6ICJmZWY0MWM1MzRhN2QxNzg1N2U5ZDE2Yjk2NDMxY2FhY2I4YmZlYmRhNDhjOWYwZDQzMTliY2VhNmUyN2RlMTJkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbGFyZ2UtcGF5bm90ZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY4MjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzE3YmJiNmViMDNjMGE5MTUyYTAyYmJjZWExZmM3ZDdiYThjOGNhZmRiZGY4OTFlZjJkMjNhN2EwZTJjYTBhZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1nYW1lLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGI1ZGRlNTBjMGY0YzIwN2RmMTU2NWEyMWYyMzIzNmNjYTdmYzIzNWJlMGZiZWJhYjUxODY3NmQxMjNjODIyMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1nYW1lLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzQzLAogICAgICAgICAgICAic2hhMjU2IjogImIxNDI3NmU5ZGM2YTRiNDY2ZjZjOGI1NzY4YWRlYTkwOGRlYmU1Y2YwZTgyNDUwNWZkZDA0NGMzYjYwZDMzNjQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtcm91bmQxMC1zbGF0ZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDU0MywKICAgICAgICAgICAgInNoYTI1NiI6ICJjZDkwMWM2ZWEwMWNkODhkMDc2YmY2ZTgwNTllOGQ5Y2FiMDc3MWFlYmY4YTlmMTdlODY5YjRiM2YxNjY3OGY5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLXN0YXRpc3RpY3MueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTk1ZDkwYTA4ZjhlMmFhNDRhNTkwOWM5NmU3ZjNjYzU1MjUxZjk2YmE5YWQ2NTg5NjZmZjNkMWZmZThhMGUyYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25lc3RlZC1vd25lZC1keW5hbWljLXN1cmZhY2UueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWM3NDk5OWQ0NzczYTdiMmIyOTVlNDI4M2ZlNDZiNjczNmFhZjllZGJmMjg2MTA2OTBlMjA4MzAzNWIzY2RlYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25lc3RlZC1zaWJsaW5nLWhpc3Rvcnktcm9vdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI2OGVlZWMzYTczNTA4ODc4N2YyZDUxOTc1ZmM1MzAyY2VmMjNiNmFjZDkzODgxYWVlOWY4MDUxMzRiNjI3YTVmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vb3duZXJzaGlwLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjEzMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4OTU1M2RiNjdiMjNjM2Y4Y2IxYjBhZmJmODU4YTUwOGM2N2FlNzU0MDA1OGY2Y2UyZDFhYmYxMTQzYzJlNmQ0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcGFja2FnZS1wYXlub3RlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTgyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjhjMGUxYmFhNjU3NWMzOWI2MGQ5NDc5Njg0NjYxZTY2YTg0OTljNDA4ZDc3MGRiZWUzY2NhZGZjYjRkOTY0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcm9vdC1pc29sYXRpb24tY2hpbGQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYzNCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MmMyMGNhOTM4NjMxYzI5ZTQ5YmEwMGU1MGEzMDdmZjUwNjk5ZTE5ZjM1NDkzYjEwNjg1NWY2YmM1NDU3NTU1IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcm9vdC1pc29sYXRpb24tcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDI1LAogICAgICAgICAgICAic2hhMjU2IjogIjJmZjY3ZjBkZTNhMjA2MmYzOTQ0YTFiOWYwMWRiMjVjOTJlZDcxZWY3ODQ5NmU5ODRhNGNlZmU5OTA1MTBiMmUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9zaGFyZWQtY2hpbGQtdHdvLW9jY3VycmVuY2VzLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YjBhMmI3ZGY0YTViMTJjM2RkYzc5MDNhMWEzN2Q1MzAwZGE0MDg1NzAzMjk3ODdkMGQ2NmYwNGY0OGZhYWM5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vdGhyZWUtY2hpbGQtaGlzdG9yeS1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZGU0MGQwOTY1MzM3OGFhYzI0MDQ3ODMzZGIwMDIxOThhMzcyMWEzZjQ0YTIyMDM4ZmEzNDRiZWYyZjdiYjMwNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3dob2xlLXJlcXVlc3Qtc2luay55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTE5NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwOTk4NzYwMWQzOWEyNzk3ZGNmZDM0OThjNzAyNWI1MzczMWQ5YzIxODBlOTMxN2I2NDY1YTE2YmUyMDJkOGYxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcGxheWdyb3VuZC9maXZlLW9jY3VycmVuY2UtaW5pdGlhbGl6YXRpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMWU5NGMwMzlkMGZkMGRmNzBiMGM4MDNlYmU5MjFhMjkwZDE1OTBiYWM2OWE5MDczZmU0OTEwY2E4OTM5YjZiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9keW5hbWljLWNvbGxlY3Rpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDI3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjNjZTQwN2E2MDBlOGFiZDQxNTdiMzNhODI5NTgwNzZhNjA0MjlkYzJmOWIxNGE5MGU0Y2E0MjZmMzFhOWE3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9keW5hbWljLXBhdGgtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjkxMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhY2VkNzM0ZWM1YWYxYmMyMzI4MDc0YWU5M2QzMDRiZjk1NDAwZTdkZTI2ZTJlZmMxZGU4NjRhZjY0MGJhODM3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1kdXBsaWNhdGUtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDAwLAogICAgICAgICAgICAic2hhMjU2IjogImUwN2U5OGZkNzQ2YmMyM2I0MmUzOThkOTAyNmFjZGVjMjk3YTVhOWFkYzg2MTMxNGE2NGY5ZTc3OTNlOTY2OTQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLWV2ZW50LW9ic2VydmVyLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzM3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyODc1NmJjNGJiMzM5MTgyMTlmYmI3MTk2YWU2NDgzMDFhNDgwYWYxOWYxZjQwMzVhYjE4MTYxMmQzNzJlZGQwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1vcmRlcmVkLWV2ZW50cy1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTAwLAogICAgICAgICAgICAic2hhMjU2IjogIjAzOTQ0Y2E5MzMyODc5Y2U2NWY5YjQwN2QwNzExYTY0ZDk0M2UyZjgxMTAwZGRmMDg3YTg1NTI2MGQ3ZThiM2MiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL21hbmFnZWQtY2hpbGQtY29sbGVjdGlvbi1tZW1iZXJzaGlwLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NzVlY2EzODI4ODkyOWQ3MzQwMTkwZTczMTBiYjQ1ZjcyZWMyZWEyYmQ1NTUzOTc2YzRhZWM3MTY1YzMxZGY3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uYmEtbGlmZWN5Y2xlLWdhbWUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMzODYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmYxYjc5OThkZDkwNjRmMzJmMDRkMmJhMjg1YjVhZmQ0NDk2NDNhYmY3N2YzZTM1NjNiNjBmNDcyZTNlOTEyMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MzE0LAogICAgICAgICAgICAic2hhMjU2IjogIjEyY2U0NTVjNjQzMDk4YzI4YWY0YmFmOTM1NmE0ZDFkNjg5MzgwOWEyZjgzOGM3YmI4MjcwNDQ4NTYxNDM5MDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25lc3RlZC1keW5hbWljLWNvbGxlY3Rpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJhMGY1Mjc5YjkzNDE5N2ZkZjI2MGIzZTBkMDhiMDZiNmQyNGFiZjgwMDRlMDJjM2IwOWM2ZTM4MTdhZTEwNDljIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQWN0aXZhdGlvbk1vZGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI3OWNlNmY3NjYyZmM0NjcxYTRhYzFhN2ExOGQ4NGQ3Y2I3Njk2YTYzNjg3ZTVjZWFlY2ZmZDZlNjhjOGQ4ODkzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NDUwLAogICAgICAgICAgICAic2hhMjU2IjogIjQ2ZWMxZGFmYTJlNGM1OGU3YTgzNmY0MTJmOTFkYWRjZmI0OWJlNmE1NzI3NDBmOWFmZmI4NWE4OGFhNzc1MGIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FcnJvckNvZGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzQ0OWI5NTFkOGU5OTNkYmZhZmI1NTE0ZWQ1ZTEzNjExNzJjNWQwMWExYWEyNzA2Yzg0Yzk5NTZlZTE5YzNlMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0Nvb3JkaW5hdGlvbkV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNzY2MDEyMjc4ZjcyOTM4OTc2NzM4YTAxNTliNDRjMjc2NDQxMzA1MmU4M2U5NjEzMTQxNGU3NTdlZjdiMzZmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTk2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMzI3ZmYyMjNhYjUzNmZmZTg0ODkyMDg0MWU0N2VmMTYwMGIzZmQ1NjhiYTdmZmQ1MzJkNDcxY2M0NmQ0NDhiIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnREaXNwYXRjaE91dGNvbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICIxMGZmYmYwOTEwMzA0OTYyZjViMTczYTZlNmE5ZWMzNDkzOTRiNDgzMDE3NjVkMzczYmU1ZmNjN2JmMGZmZTJkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnRJZC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2MGY4NTg1Yjc0NjgwY2I3NmY1NmQ1NTFmODA0NmM3YWVlMzgyOTZiNjUwNTg5ZDI2ODEzMDhiYzc1YTk1YmQxIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnRSZXZpc2lvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODIwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOThlNjg3ZjM0Nzk5NGMxYjM5NmI3NmQ5MGI1ZTQ5N2Y1NWYzMGZkNzY1ZmU2MGZlZmY1MjM1M2UyZGVlMGJkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnRTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzg1MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkZjZkZjE1ZTJkODczNDhlZmI2NmYxMGNmNTUyMzllNzVjMzk3NjBmOWZhMTZlMjgwMThhOGQzNTFmYWE0MGRhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRXhhY3RWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDk1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMzYwOTFkZWM4NWRmMjg4ZThkNDdhYTU1OTU3MDYwNzNkNjFmNzY1MDBiNDk4YmVkNTBhMTNjZjhkNTJkYWZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzE1LAogICAgICAgICAgICAic2hhMjU2IjogImM4ZmE2NjhmOTQ4NzE1OTc3ZDlkMjRiNGJlZWRjN2I4MTE0NDA2ZDkyYzE1MDUyYTcyYzU0YThiMGQzM2QxODAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Qcm9jZXNzaW5nRHJhaW5SZWNlaXB0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTIwLAogICAgICAgICAgICAic2hhMjU2IjogImIyOTFmOTk4Y2EyZTQwOGI4MmRjMzMzOTE4ZjAzMjYzYThiMjRkOGRiYzRhZWNiNTdlMmU5ZDczYzBkMDM5ZTEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9TZXNzaW9uU3RhdHVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzVjMDYxZWJlYWIxY2UxZDQ4MjBlNzExN2QyMzljNGQwMTlkOTBhN2NjNjI1ZWZkOTY0NTFkODRkZGU0OTVlNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjkyMDExYmViMjk5OWNlMzZkYjU3MzNlOGY2YWY5Yzg5OGZhYmU3ODJkYThlNWQ4MTY0MGQ3YTU1YjZmZTE1YiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lQXBwZW5kUmVjZWlwdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzQzLAogICAgICAgICAgICAic2hhMjU2IjogIjljMDAxMTYyOWU1MmQ1NGFlODU3MDBlNmJmOTc5NzhhMjFiMmFkNzRiMDFiNDBiMGVjYzZmYTU0ODE2Njc0NDMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9UaW1lbGluZUVudHJ5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODYyLAogICAgICAgICAgICAic2hhMjU2IjogIjM1NDFhODM0MGRjOWM3ZDU2ODQ2N2I3Njg1M2FiYzRhNzBmZWFkZjFjNDM3ODRmNmM3NmVjYTk3OTIyMGVjMTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0JsdWVSdW50aW1lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwNmJhMmEwNDEyNGEwYzlmMjJlNDQyMTEwYmRkNDU3YTU0ZWNkN2JkODYxN2RjN2ZkZjM2OWEwOTlhMTdlOWNjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9DYXRjaFVwQmFycmllci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjg4OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3MjU4NmFlNzA5NWRhNzEzNjQ1ZmViYTVhNDQxNWZjMWYxZTBiNDhmMTYxMmJiYzA1ZjRhNzMzZjUwN2UyNjlhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9DaGVja3BvaW50RG9tYWluRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMxOTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYWFiM2IxMmNlZWMxOGVmMmEyNjM4OGJhNmZmYmZkZmU5YTgyMGUyNWU0YTRkYWM5Njc0ZjY4NDE0ZTRlZjQ5ZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ29tcGxldGVuZXNzRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5OTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGNhOGY3ZGJhYTMwYWUyMjNhOWJhZTZhMTQ3NjM5NDE3MDdlZjg0MWVmNGYxOWI5ODg5ZjRiZmViMTQzZTU5ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRGVmYXVsdENvb3JkaW5hdGlvbkVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzIxMTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODE2NWNiOGY4ZjlmYmJiY2MxZmY3YmEwZGQxMGY5NjNkYjRhNDJlZmM5OGQ5MTMxNmI0YjFiZDYwNDM1OGE4MSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRJZGVudGl0eVJlYWRlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgxNywKICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2JmOWRkNDdiMGI3NjM3Y2VmMzcwNzIxYTc2NTM2YTBjY2U4NGZhZjA1NTFkNTY2NzU3NzAxM2VkY2JiODc0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFNlc3Npb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyOTAzLAogICAgICAgICAgICAic2hhMjU2IjogImQ5Njg2YTk2YjU4Y2RhNTlkMWJiMzYxNzg1NjAzYmE3MmUyN2I0ZjJmYWY2MTBjYmQzMjFlYzM4MzNiNDk2NTgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50VHJhbnNpdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY1NDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTVhODBmZTE3ZGU5YmVmOGRlNWU5MDBhNmFiYWVkYzgwOWRlMGFhZWY3ZTgwZTE0YjRkMTA2OTU2OTFjMGU5ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRCb3VuZGFyeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICI2NmIwMzU3NDM1ZDFlOGU0ZjFmODY2MzM1NTgxZGU4MGZlNzRkZGMxYjcyNDJiYzk2YTEwMGU5N2NhZTM5OWEzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEVwb2NoQ3Vyc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmI2ZDU1ZTNhZjJhMTM2ZmJlMzhmOGQ5NzU3NGViYjE1MzQzNmE5NGIwNDM2Nzk0NTVkZWI5OTA2ODYwMTA0OCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRFcG9jaElucHV0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5OTUwLAogICAgICAgICAgICAic2hhMjU2IjogIjliMjk4Yzc3ZWEwZTc2MmIxMTE3MzVkNDNhOGYwMjhhOGJkZDhkZTc4Yzk1NWMzZGM5OWY5ZThiMGYyYmNjNGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkTGF5b3V0UGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzg2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NWFlMDU1ZjAyNzMyMmUyMDkzZWNiYmQ4YzQ4NWQzOTM4ZTA0ZWQ1ZDNjNDA1MjRjZGZkMmI1MTRhYTQ5MzNkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9jY3VycmVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNTcxMGFlZTBjZTkyNmFkZjBhMWJhM2RiMDc5MDJlNjdhNGMxZjk0NzdkYjEzZDEyYWNhZjNkNjViNmUxNmU2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9ubHlMYXlvdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3NDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWQwM2VlNmYxY2FjMDFmNDJjOTQ4ZmZhMjFlZmVkNGNmNDNiMjBmYjBiOGI1NTQ5YjI2OTRiYjBiMTI4OWE2ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRPbmx5TGF5b3V0QnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjY2NjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjRmNmUzYTg4NTAyOTE2MDEyYjc0ODVjNGYxMDU3MzRlZTRmY2NiMGMwYmUwZjMyMmVmNWNhM2VjNzMyNzM3ZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkaW5nQmluZGluZy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzk4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOTExZjZkYTFmMTE0YzdhMjE5ZWY0OTJlODRlZDU2MWE1ODZjYTU5NDdjMzMyOTkzNzE0YzM5YTZjODRhYzJlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbmdpbmVNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3ODY0LAogICAgICAgICAgICAic2hhMjU2IjogImY0NzE1NDg0MjY3YWJmZTk3ZjU4ZGQyM2I5MjdlZTU4NmVlZTZiZWQxMDNhYzUyOWQ3Y2NjYWJmZTRlOTVjZDkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0hpc3RvcmljYWxBdmFpbGFiaWxpdHlDb250cm9sLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2JhY2YxMGYwNmVmY2NkZmNkNjRlNGE5NDkyZTM1N2EyZTZjMzVlN2E4OTg4MTY4ODlhOTIxYzQzMGMzYzNlMCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSGlzdG9yaWNhbFN0ZXAuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODk0N2YxNWE2MTIxNGY5MmZkNmY0MzA2NzM5OTYxYTQ2Yjg2YzljMDdhMDM4YWU3ZGNjNTdkOWIzZGQ1MTQ3ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW5NZW1vcnlEb2N1bWVudFN0b3JlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2LAogICAgICAgICAgICAic2hhMjU2IjogImYyMjg2NDBhZjcyOTM4Mzk1N2U1YmZjNWFmOGUzODM2NWM1OTExNzM4NGExYmYyMzY3NTViODZjN2JmNDczYWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0luTWVtb3J5VGltZWxpbmVKb3VybmFsLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTMxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMTg4OGYxNmQ1MzkzNGQ3OTUwYTE2YzI3Yjk0NTI3MDQwZWVmZTJjN2IzNDJkM2M2NDUyMDFkZjVjNDUyZmIwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9JbnRlcm5hbFByb2Nlc3NPdXRjb21lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTgzZGE0MjhkY2VmMWU4Nzk2MzdhNDBiMWQ1Y2ViMWIzYTAwMGQzYzA1OTU1YTE5YWRiNDRjOTlmNjEzNTA3YSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvT3BlcmF0aW9uUm91dGVJbmRleC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM0NDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjBiMjQwMzVmMjYwYjg3NjYyYjQxZDc0NzI1ZDZkZTgzNjg4YjViOTNhMmQ1YjllN2I4NDlmYmFjZDNhZTFiYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0VtYmVkZGVkR3JhcGhTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI1MTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWE5ZDg4YjkyNTA5OGU5ZmNlNzZlMjBjYWViYjliOTBjN2NmMjllMDMyYjBiNTI0ZmY2OGFjYzBmMDQyOTVlMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvUm91dGluZ1N1cmZhY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNzc0LAogICAgICAgICAgICAic2hhMjU2IjogIjRlMDBkZGQ2NjkxOTZlYmYyMDM2MjY0ODYxZGY4M2Q1MmZmNzgxNGY3N2U4ZmFiY2ZkNDk2MjJhMDY3OGUwZjQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1NlcXVlbnRpYWxEcmFpbkNvb3JkaW5hdG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTAyNjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjU2MDhlYjI1M2RiNjkyYmI4YzM3ZWNhYzZlYWRkZmUxNmY3ZWZhZGNlMzNkMGUxYzc5MmFmMjhmYjdjNTQ1OSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU291cmNlU3VyZmFjZUlkZW50aXR5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MzgwLAogICAgICAgICAgICAic2hhMjU2IjogIjFhMjNiMzA1NDU1ZmJlMjM4MWYzZjk4ZWZmMDQ5NGVkNGJhMGIwZmU1YWNjNTAzZjFjYjU5YWFkNWE3NGJhZTUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1dob2xlT2JqZWN0U3RvcmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTYxLAogICAgICAgICAgICAic2hhMjU2IjogIjRlNWRhYzJlYmExZmFmZGJiMDcxZWMxN2Q3MjlhZTMyNzQxODBkN2U0MmMyMDFkNGUwYWRiMTExODAzMzQ0NWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1dob2xlUmVxdWVzdEVudHJ5RmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTE5NTEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTA4MTJhNjIzODU1NWY5NjJiMmU0OWQzMDY3YzYwYzBlMTYxYmZiMGEzODE0Y2VkZGE4ODM5OWFjOWRiNDMxNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0FsbFRpbWVsaW5lc0NoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUyNTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzAzNjg4YzJkMjU0MjllOWVhMjZlMjlkMDQyY2NjZjUxYTYyZWEzNDAyYzkxYjNmZTJlZGIyNjNiZWY2MTczYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0FsbFRpbWVsaW5lc0V4dGVybmFsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NTc2LAogICAgICAgICAgICAic2hhMjU2IjogIjkzZGUyNzhlYjc2ZWZiYWRhMzI2NzM5ZTMzMDYyZjNkZTJlYmQxN2RlMmRiNDliNTRmOGJkMmYzOGE3YjMzYmYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9CbHVlU2VtYW50aWNJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTQyMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZjc3Njk1N2U2YTc4YmYxMmVhZjYwZTE2N2JiYTNiZWI3NTE1MWI2ODQ1YjZkOTg5OTJjNTk4YmE2MTk0OTc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ2hhdFdvcmtmbG93T3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzg5LAogICAgICAgICAgICAic2hhMjU2IjogIjFlOGI2MGUxMDVjNDgxMTJmNDUzMzVhMzM3NzRjODcwMzEwMDQxZjMxNzI1MjM2YjJmZjdhNjU5NDM5NjM2OWQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db21wb3NpdGVUaW1lbGluZUNoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4MzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGNiNjA4Y2Y2ZjdhN2YxZjc0MjcwYWNjNzA3MzJlYWU4M2Y0MWFhZGU3Y2NmZWU2NjEzZDk4ZTViYzI2MDYwOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0NvbXBvc2l0ZVRpbWVsaW5lRXh0ZXJuYWxTdWJzY3JpcHRpb25GdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgyNzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiM2VjYjBhYjFkM2VmOWU3ZGE4MmZhYzFmNmQ5ZDg3M2UyYTk2YjcyZTBmOTYyMjU0ZTFiZjIyZGFkNDY2ZGIzNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkJleEludHJpbnNpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNDUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmYzMzA0MTQ1MGIyYjRjZTQwYjRmZGIyZGNkMWMxY2Q5YTZmYmFjMmU2MDI1ZmI5OGY4N2FkZWY1MTcyYmM3ZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkN1cnJlbnRSZXBvc2l0b3J5SWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjE5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NTI5OGNhMmI5OWM3Y2Q0NThlMGE5NjlmYjRmMmFlMzBiNDNlNDA5NGFkYmNjY2Q5NzhlY2UxOGFlYWI2ZTU5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uRXZlbnROb2Rlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzczMDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWVmZjE1NjdjZWY2ZDExYmFiYTE2ZmRkYzU4ZjBhODBkN2YxMzJiNWVmMjAyMjEzMTRlMjdlYzMzNTAyOGZjNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NIZWFkZXJCcmlkZ2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjk3YmNmYWE3OTZiOTFlODI0MGJjNDAwZTRjMmZjNzg1ODQxMWUwM2M4OThkZmQwNTljNTVlNzlkN2JjYThiZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3Nvck9wdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NDIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2ZmZTI1NTc2NTBhZDk4MTdmMjQ3MTE0YmU4MTBjOTRkNTdhNDhmN2Y5YzBmODA3ZGVkYzk0NjQ5ZWU0ZjNmYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NvcnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0ODIyLAogICAgICAgICAgICAic2hhMjU2IjogImQ1NDc5YmUyOWU5MDk0MjYzMjc0OGY1NjYyMzliOWEwMjY5M2FmNzc4ODdlMTFmMjdkNzZiZDNkYjljZmEzZDIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lR2FzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTY3LAogICAgICAgICAgICAic2hhMjU2IjogImI0N2I4NDk3MjNkMWZkNDY1OWRjMzdlNWE5NmZlYzJhODBhMjlhZTc2MDM3ZWZmNTg0ZjBlZDIyMDJlZGJjNzMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lTGltaXRzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjQ5LAogICAgICAgICAgICAic2hhMjU2IjogImM1YjU3YmY2ODYzOTkzODc1OTE1OTE2YzYzODBkZTJiZDBlODA3NTViMzliNDkwMGY1YmUyNGU5MWU4OGYyYWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lUmVnaXN0cmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDRlMzRkODBjM2U5ZGE3M2RkMGIzNGEzYzRiNTRiOTgzYjc4M2QwYzQ5ODVhN2YxMDVjM2VlMTVhOTFkOTdjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uU2VtYW50aWNUeXBlSWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkyNywKICAgICAgICAgICAgInNoYTI1NiI6ICJiNWQ2MmE3ZmZmM2M1NzhjZGUzNjFhNzA3OTA2M2M0YjNjYzlhMjBmNTQ3MDRkNDRhOWQ4NzY1YjA3MmQ2NWQ5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ3VycmVudFJlcG9zaXRvcnlNYXJrZXJQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkwNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZGNhNDU5ZjkxYTliNGM1MTk0ZmRhMzQwNjE3ZDgyZWIyMTI5OTQwNjk4MDEyMmJjNGI3NDVjZGIzNjc5YWQzIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvSGFuZGxlckNoYW5uZWxSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjAxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiM2E5ZDgzODIxNjBhZTU0YWIyMTZmZWNlYTI0ZDQ5MzY1ODFiYmU0MmE3OTY4NDU2Mjg3OTNmYjk2NjhiNWNkIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjkwLAogICAgICAgICAgICAic2hhMjU2IjogImE3NmEzMWM5Y2E0NDVjOGJhM2ZkN2EyZGZkMzk2YWU4NjcyMzBmMDkxMmZkYTFlZjhjZWFmOGNkMzU5NjMyMDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25SZXF1ZXN0TWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MDYwNWMxYjY3MDBlM2JkZmNkNjA3YzIwNjViOWRiZTIxMWJiNzJiZjNkZTMwNzRlYTQ2MzRhZmQ0YmViYzg3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUmVxdWVzdFJvdXRpbmdGdW5jdGlvbnMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU4NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDU2M2M2MzZkZTMzOTc5Njk3M2U3NGRkYTZhMTcyNzJmNTM4ZWNlYzEyNWRhMGIzZjdkZjA1ZGYzMjc1NmExMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd0V2ZW50TWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyMzIyYzJmZGQyYmM4MGI4NTliMjY3Y2FlMTEzOWEwM2UwZWRmMmMwYzMyZDI4YjczODRkZjBhOGY4NmZhNjQ2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvU2VxdWVudGlhbFdvcmtmbG93T3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzgzLAogICAgICAgICAgICAic2hhMjU2IjogIjUwMWY1ZThiYzdhODRmNDA3MDZjZTQ4OTUyY2NiNmM5NWIwNTdhZWVkOWM4MTYzNDUwNWIyN2NlN2I0YzZmNmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9TZXF1ZW50aWFsV29ya2Zsb3dQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI3MDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTFjOTczNzliNzJkNDcwODExZDIwMWVlMTM4Y2ExYjZmNTQxNjU3M2E3ZTgzNmQ2ODcyODNmNTIxZWYzNWEyZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ2NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4YTE2NjFjZjM1N2FkNTg1ODA0YjMzMWQxYTE5NTRhMWFiNzk5ZDU3NmQ3YjBmODgzNGQzYTk4Y2RiZjY0MmJlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGFubmVsU3VidHlwZVByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYTZkZjU1ZDRkZjNlYTc1MDAzODU0MGQ1ZTRkYTUzMzE3NzQ5YTJmYTQ0YTU5ODA3Nzk3MGU5MzE1MzVmNDU0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVFeHRlcm5hbFN1YnNjcmlwdGlvbkZ1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTY5MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZmYyOTFiMGQ1Mjc5OWU2MDdmNjM4MmEzNGMyZjUxOTliOTg2NWZhMWI1NjJkYmNiNzUwY2UyZWMxNTYxYjBjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVNZW1iZXJTdWJzY3JpcHRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NDE1LAogICAgICAgICAgICAic2hhMjU2IjogImJjM2I0ZWM2MzczNTA1ZGE4YTZiZTMyMDI3NGM4NWJjNzNkYmQ5ODQzZjYwYmM1Y2Q2ZTgwNzgwZGI5NTg0YmQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZVByb3ZpZGVyU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ4NjAyNThlNDc1NTk3OTczMDNhNDY0YmRjNjRkNGMzYmZkNTQ1M2JhYzhhNDJiZTNlYzRmYjdiMjM4MDFiYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lU3Vic2NyaXB0aW9uUHJvamVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjAyODQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWI4OTM4MmZhMjYyNGRlYWFlYjM4NTE4ZGFiMDM0Yjk1ODQwYmFhOTI0OWJhNTM0NTJjMjgwMzkwMzRjNmRlNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhQcm9jZXNzaW5nTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzM1MjksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTdiY2Q3M2VkZDdjNGY3MmMwODlmM2NiMjdiMmEyYTlkYTVkY2JmOTc2NzAyNjUzN2EyM2EyN2Q4NDVhYzY4YyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhXb3JrZmxvd0NvbnRleHRGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDMxLAogICAgICAgICAgICAic2hhMjU2IjogIjgyOTE2YjE4NzQ5YjNmZGYzMmE1NzlmZjk3YzAyNDdmNTI4Zjc2YWI4OTBmNjg2ZjE2ZWE2NDg1OTIyZDc2YWEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvQmV4V29ya2Zsb3dTdGVwQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAyMywKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTNiMDA3ZDE4NGI0ZThjYjVjZGM2MWUzMThmMDcyZTgzNTViNjAxNmI0MTc4NzFjMThhNDZiZDE1MjhlYTc3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Byb2Nlc3NpbmdFdmVudElkZW50aXR5T2JzZXJ2ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzc0ODQyM2M0YmFjMTg1NDk4NTYwOTM3ZDdiOWZhZGEzOTEzYzdmYTk0ZmU3ZTc5YjExOTBkYWNiYjAwNTJmZSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9TY29wZWRQcm9jZXNzb3JFeGVjdXRpb25Db250ZXh0QmV4RG9jdW1lbnRWaWV3LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjI1NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1M2Q3ZmU3MDU5OGIzYzliMTIxNGVjOTViNzJiMDU5ZGVjODQ2YjljMDliNDU5MzI0MDE2MzlmZDgxMjU2OWQ4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25CZXhJbnRyaW5zaWNzU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDUxOCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1YjI4YTVlZDRhOGE5MGU2NDJlYmY2MzVjMzg0OTEyYjA0NDk2NGY1ZjMyOGNhMzIxMzY1YzYyNGYyZTFmMDA3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25Qcm9jZXNzSGVhZGVyU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzU2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNTdhZDdhYWM2NDlkOTMyZTE0OTE2YjgwYzA1ZTdmMTc5YWU4ZjljMmMyNzFlZGRhZThjNDdjNzEzMGViNmEwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25SdW50aW1lR2FzU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc1MzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjdhMjg3ZjFkNTk2YzNlYzkwMDIyZDI4NGYzNGQxYmYwYmU1NDQ3MjU4MTAxNzMyMGQ3MTQxYTNmYmQwNzFjNyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3N1cHBvcnQvQ29vcmRpbmF0aW9uUnVudGltZUxpbWl0c1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDM3OWY5NmM1ZDgwZTkzZWI1OGIzZjE0ZDQ5NWUyMTRkYzYwMmMzZmVlNWIyNTc2ZTEyMWIwMjhiMGVjYThlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZURlZmluaXRpb25SZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzAzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzY2Y3NTc5MWY0NTM5NmM0ODgxNzlhNzExNWNhMDI2NDhlMmRhYjJlNzFkZTE3YWNhOGVmYTZiZGQ2ZGZkZmM5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZUVmZmVjdFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3ODYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTFhNTMwNDQ0NjQ5NDI4Y2Y1OWQxMDIxOTRhNWJhNGZlZDFlZDM3YzYwOTBhNDA4NDIyNDUzYTA4MjQ1NGMxZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtTm9ybWFsaXplci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI4NTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNWQyYTQyNjUyZWE4ZDA0YmE0ZTI5NjAwYjdhYmViNjgzZGRlYjVmMDRmODVkZTJmODk2NWYwNDBiNmEzODVhNCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtUGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTQ3NywKICAgICAgICAgICAgInNoYTI1NiI6ICI3NDExOTQzYzczMjUwYTU1ZjJlMTg4NzBiZWI5YjljYjhhYTM5NjZmNDNhZGE0ZDYzOTE5YjliOWE3M2IzOWQ4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1QbGFuQ2FjaGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDgwODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWMzNGVmNzZiNzE1NjQzZTYxZWM3YzZkMTgzOWJiMDgxOWVhODE5MjZjNjUwNTQ2NzljM2UwMjMwODhiZjdhYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVSZXN1bHRFbWl0dGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDM1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzODY5NjlhOGJiOGU4YWQ2ZGI2MGY2YzU0MjAwZTRmODE1NDUwNzU4NWU5OTM4MGU1OTI2NWE1YzhjNTNjNzMyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVJlc3VsdFZhbGlkYXRpb25FeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMGI5ZDk5Y2QwZjhmMjI3MDAzMTY3N2FiNTU4MzFlZTRmN2I1YWZmMmE0ZjU2M2JmMzUwNWMzOGM3MmZlMzEyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVN0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ1MDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTJkY2Y2MzllZmVlNjUyZTJiYWFkZDU0MzI2ODA5YTkzNzdlNGViNDQ2Mjc2ZGViOWFjMTFmZGU5NDVhZWJmOCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0Zyb3plbk5vZGVVdGlsLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNjUzLAogICAgICAgICAgICAic2hhMjU2IjogImIyYmI4MzM2YjU1OTQ2NzAxMDE0ZjQzZDUwYzc0Y2ZkMTViNjUxMzg5ZjZhNmZiYjJjMjY4NzMzM2I3YzdhNzciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Ob2RlVXRpbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjczOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTdkMThjYWMxZWJjOTUzNTYyY2I3MmU2N2U2YWM1OTIyNGYwNDRkOTFiMDM5NTU1NThmMGQ0ZDcyMjU4MzU2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg0NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMWZiYTk2ZjRiZGUxZmNkYzcyMzI5YTY1Mjk4OTUyNzBjNGIzMzYwZWU0YjY3NmQxYjdkN2EzZWY5ZTkxMjhkZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1NlcXVlbnRpYWxXb3JrZmxvd1BsYW5DYWNoZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjI4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZmJiOTlkMmIyOTUwNDdmNTVhNTkxZGVlZDlmZDgyMGI4NTc5OTQxNmRjODIzNTkzZjkxYjY4MDM5M2I1N2I5IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UnVubmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDEzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI4ODgyMDVjMmZiOGQwZmI5ZDI5NDVjOGQ4MTg1YWJiZWNjZmJkNTc3YjRhMGQ4ZTJkYzAyMTg3NjY5ZmZhZDExIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU3RhdGljVXBkYXRlUGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NzM5ZGQ0ZTVkNmVmNDY2MTc5NDI0MmFmYzZlMjI5MTcwOGRjMGE2MWNiMTQ2MzBhMTY0Mjc1MGU3ODI5YWU3IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU3RlcEV4ZWN1dGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzODQ0LAogICAgICAgICAgICAic2hhMjU2IjogIjA2ZGY0OTllMDkwYjdjMDc1OGQzYTgwMmM4NWFlMjFmYWRlNGVmMmFkZDlmOTFiOGYwZGYzNGEzN2YwNGM1OGQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9UZXJtaW5hdGVQcm9jZXNzaW5nU3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzgwLAogICAgICAgICAgICAic2hhMjU2IjogIjdjNjUyNWRkZTU1YmM1ODE4Yjc3MjU1NTUzN2I4MDVkZDVlM2ZhODQ3N2I0YWZhYTAxMTUzZmYyODQ4ZTFmMmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9UcmlnZ2VyRXZlbnRTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQwMDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzRmMDdhYjBjMGJhMmYzOWU3YThjNmY0NWUzODY2NDY2NzFkZmE4NmFiOGUyNDA1ZjgxZWQ0ZmJjMTA0OGI5MyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1VwZGF0ZURvY3VtZW50U3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjcwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlN2I1YTIyNGRiMjhmMjE4Y2IzNDUzN2MyNzEzNjFkMGZiYzcwMTQyOWI3ZjA3NjFmMTYzMzBkMzAwNGY2MTk2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dCZXhHYXNMZWRnZXJIb3N0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDIwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJhYmVlNjQwNWY4ZDliNmEwMzk0MzY2MGZmZDA2NDc2OTRlMjQyZjkwODZhY2Y0YWIzYzhkMTZiMDMxOTA3YjViIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dFeGVjdXRpb25TdGF0ZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzEwNywKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjdjMzAzODdlMmUxMDM1NTlkMDEwYWRmYWU4MDU4NTQxNzg5OWZmNjI0N2ZkYzVlMGZjNmI0ZjkyNmExYWNjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dQYXRjaEVudHJ5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjIwLAogICAgICAgICAgICAic2hhMjU2IjogIjQ5ZmFlMGIzMmQyMjA5M2JjMjNlNTNhZDBiMzc5MWM5MTMwZGI3ZjM3MTc1MGI3YTc3MmJlZThmOThkYWExM2IiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1N0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDMzLAogICAgICAgICAgICAic2hhMjU2IjogIjA5OTVmNTRhMWI4NTY5Njk4Y2VjNzI2ODQwYjBmZWI5MzA3MDRiZTQ2OTk4NmMwNjk3NmMzNTg3ZTAyMjEzYjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1N0ZXBSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTBlMjliZGY2ZjkwNDU1YTZjZWU1ZTBjM2QzYTYyY2EwZjUyZGIyOGQ0MmVhYTBiOWUzMmEwM2FmMzhlZDUwZCIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93U3RlcFR5cGVQcm9maWxlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjgyLAogICAgICAgICAgICAic2hhMjU2IjogImVmMTc4NTY2N2IwMDhhZDA0Njk5MjUwZTUwY2E4MmM3NDRlYzNlYWQ5ZDRjZTMxNTJiMjZmZDMxMWQ5YzU0MjAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2Nvb3JkaW5hdGlvbi1nYXMtMS4wLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzUyLAogICAgICAgICAgICAic2hhMjU2IjogIjlmY2RjMjI1NjMxNTJjZGQ4Y2IzN2Y5ZWE3Mzk0NzdjZWQ1ZjdhOWUzMDg4YWVjYWYyNDY4MTJjM2EzYzZiYWIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZENvbGxlY3Rpb25BY3RpdmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTY3MywKICAgICAgICAgICAgInNoYTI1NiI6ICI5YWZjYWViY2MyYThhODRiMzgwYzY1ZDFiOWFkM2E0YTllY2Y3MzNiNjE2NDQxOGYxZmI5ZTc1MjcxMjcxNGZjIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0xhcmdlSG9zdFBheU5vdGVTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUwMjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZThlMGM2OWY1MGQxNjJkYTQ2YjFjOTYxOTNmYmNmMGZjZjhkNjkyODJjZjgzZGM3ODIyNWI3NTUwNzVjNGRmMSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OYmFIb3N0TGlmZWN5Y2xlQ29udmVyZ2VuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2YzhkNGY2Y2RiNWRkNWMwZDgzYjA0YjFkODJiY2FiMzQ3ODY3NzVhYTQ2NDU4ZGY1ZTFkZmViNDIwYzE3NzZlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05iYVNoYXJlZEdhbWVMaWZlY3ljbGVBY3Jvc3NIb3N0c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NTgwLAogICAgICAgICAgICAic2hhMjU2IjogImYxMmE1MTM5YmI5N2I0Y2RhNzM4YzRlNGUzZjM5NTk2MTcyNzY5NDlkZGZiZDNjOTY3MzM4OTA4MWQ4NDMyYTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkRHluYW1pY1Byb2Nlc3NFbWJlZGRlZEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MjM3LAogICAgICAgICAgICAic2hhMjU2IjogIjdiZTI5NzE1Y2RiYzI2YzYyOWMzZGRhMzM4MzQwNWJlMGZjYjRjY2ZhOTA3ZDdlZDIzNDA5NWU1MDMwZjg1NGMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM0ODQxLAogICAgICAgICAgICAic2hhMjU2IjogImNiYjkzNjQzNWQxM2M0YmY1Njc4ZmM2YWRkZWRiZjYyNTgwMWE0ZWRjNTJjNDUzYzhhNDQxY2FhMWEyYmY4ZDMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMDFOYmFGbGFnc2hpcFNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNjgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzc1M2ZhZTQyZGQzODJkMjE1NTYwNTcxMTNiYmE1OGJhNzYyZmU1ZDI0Y2QzMzEwNjQwNDRiMTU4OWIzOTY4MSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIzMjAzLAogICAgICAgICAgICAic2hhMjU2IjogIjhmMGNhYTk0NTgyNTRiMWViNGFkYTJiZTY1YWNiYWRjMGFiN2VhMjc2MmM2NGExMjg4ODMyNGI3YzI1Y2YzY2UiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGhvdXNhbmREb2N1bWVudExvY2FsaXR5U2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTMyLAogICAgICAgICAgICAic2hhMjU2IjogIjkyNTE5ZmI2OTEwOGRhMzE5YThhZGFjYTkxNTI1N2JjZTY0YmMwNWRiOTRhOTcwNDZlM2E0MmY0ODk3MDM0M2YiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vV2Fkb3dpY2VQYXlOb3RlQWNjZXB0YW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMxNjc1LAogICAgICAgICAgICAic2hhMjU2IjogImNhNmI4ZWU1M2M2YzMyOGM1OWRjMDA5MmYzNzZiYTVkMTY2NjJkZDhhNDIwOGE4Yjk0MTVkZDdhNGJkYTJhMjkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Db29yZGluYXRpb25FbmdpbmVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NjIzLAogICAgICAgICAgICAic2hhMjU2IjogIjE0NzFiNDUxMmU5OTAxZWM2MjQzMDMxMDMxNTJiZjhmZjkwYzMwYTY4OGM4ZjFiNGM1NmFlMzcyNTdlM2UyZjciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudFJldmlzaW9uSW5pdGlhbGl6YXRpb25DYXVzYWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NzU3LAogICAgICAgICAgICAic2hhMjU2IjogIjhiOTJkMzlmMjMzZjY3NWQ0YTE0MzAzOWE0ZWZiMTNhOTM1M2JiZWU5ODg0NTAyMDZmMjEwNmZjOGNhZjE3ZjIiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9QdWJsaWNWYWx1ZUNvbnRyYWN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODI2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJhYWJjYjg1YmQ3ZTA2YjJiYTllMzMzOTg4MmZiNmJkYjA0ODJhOTA4ZDc0MjViZWEzMmU4NGUzNjdlMzcyNDBmIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9DYXRjaFVwQmFycmllclRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTQxMDMwNTE5OGQzOTVhNTFkYTBjNDE2ZGQ5ODhjMGY4Y2U3Yzc4MTAwMGFhMzAzZjkzOTgxNmJkZDFlNGIyZiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRBZG1pc3Npb25DYXVzZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3MDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDdkYjJkM2ZjZjUwMWM4MzFlZmI0OTBiMDFlNjFhM2M3NjEzNzVjNjBiYmU1MjhhZDhkOGM3NjcyYWMzZDZmYiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRG9jdW1lbnRTZXNzaW9uU3RhdGVFcG9jaHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NDc3LAogICAgICAgICAgICAic2hhMjU2IjogImI4NmM2OTQwZmZiNDY2NTliMDY3ODMyMmFkOWZjZTIxOWQ1YmU4MmUzOTVhODZmZTRkOGY4MWFhY2FlOGVmNTciCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RvY3VtZW50VHJhbnNpdGlvblByb2Nlc3NvclN1YnNjcmlwdGlvbkRlbHRhVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODEzOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwZjgwZmVkYzZkMWI3YmNkYWM2ODYxOGRjZTQ1YzkwMDUxYzFlMGZhZWI2ZGVjMWUyMDQwZWEzYWJhOTZiZTg4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEVwb2NoSW5wdXRFdmVudEV2aWRlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTM5NDBiNzk5NmZkOTlkMWNiMDEzYjJjMDcwYzdjNTBkNmMzMTc3MDBlNWExMDZhZTk1ZDFkODM4YTY5MjFhIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEVwb2NoSW5wdXRJbml0aWFsaXphdGlvbkNhdXNhbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMyNjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzkwYWJlMzY5ODk0ODMwNzlkN2U5NzRkNDMwMTc5YzhiMzNhOWE1ZDU5YTJmZjBlMTAwMDYwZjQzMGRiNzRhNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkaW5nQmluZGluZ0Nhbm9uaWNhbE9yZGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjI0OSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwODE5YzY3ODc5M2ZmNzg2OTY2YzQ4ZDc4NjBjYTJiYjE3ZTllYTE3MWIzMDAwZDg5YzZhNWUwYWJmNTg1OGM4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbmdpbmVNZXRyaWNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzYwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICIwNTAzNTZkZjQ2Mjk1MGVhMWJkYTk0YmNkZWY4ZWRkZmVkMTkzNjgwZjIzMGJlMDg1MjAzYTYwNGIxNGM0OWIwIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Jbk1lbW9yeVRpbWVsaW5lSm91cm5hbEhpc3RvcmljYWxTdGVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI2NDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmZmOTA2N2RkMzM5OWM5OTM2ZWY0OWRlOWIzMjNkYmQ2NWRmYjMyY2IyMDhjNjVjYjI0ZDExNzA2NDkwNDFhMyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvT3BlcmF0aW9uUm91dGVJbmRleFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwODgxLAogICAgICAgICAgICAic2hhMjU2IjogIjI0NDQ5YjM1YmQxNTU3MWZiOGQ0YWMyNWJkNDU4YWZhYTIzMWE2M2FkZDA0OGI3YWEwNDliOTg4NWM1ODI0NGQiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1Byb2Nlc3NFbWJlZGRlZEdyYXBoU25hcHNob3RUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NDUzLAogICAgICAgICAgICAic2hhMjU2IjogImEwYWQ3YjY3ODhjM2QxZDc0MDZkOTdjNmRlYTA5YWE2ZGIxYjUxMmMwNDYxZWU0ODU0YWI2ZTZkNjMxMmM3MDEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1NvdXJjZVN1cmZhY2VJZGVudGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4ODAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ4YmRhYTU5Mjg1YjgxNDEwNDY1MzdkYzk4NjkwZDE5ODFiYTE2MWVhODBjZWZhYzZkOTYyZGE4YzgzOTNiZmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1dob2xlT2JqZWN0U3RvcmVUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MDA0LAogICAgICAgICAgICAic2hhMjU2IjogImZiNmNiMzU5OWEyOWJmYWNlM2NjN2I2MDdlMDlkOWE0ZTlhNDhhMTNjYjIyNGJlMGJlYzJmYmY5NDU3MmM0NDgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzb3JzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA3NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTA5NTYyYTIxZWYxMTcwMjJjOGE1N2MxMmI0NDhkZDk3NjBhYTJjOWJiMDFmMDI3ZjVjNmNhOGRiMjNkNDhmNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVSZWdpc3RyYXRpb25zVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzYyNywKICAgICAgICAgICAgInNoYTI1NiI6ICIyNjJhZDQ5NzU5ZDQyNTIzNDQzNWEyZTlmMDc0N2FjYmE2MjViNWRmYjRjNzZmZGQ4MTE0MTRjODljYjQzMTg2IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uVGVzdFJ1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3ODk5LAogICAgICAgICAgICAic2hhMjU2IjogIjhiZjRmZTdmMTViYzY3ZGE5M2Y2NzE5MjEzYjJmNzRhMTZhYTI4MTE0MmQyMTA0MzNlMTAzOTNlOWY0NWMwZmEiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9DdXJyZW50UmVwb3NpdG9yeUV4YWN0Tm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NTYyLAogICAgICAgICAgICAic2hhMjU2IjogImFmODk3MzIwZDliNTdjNmI1OTkwOTA3MDJkN2U0Njc5NDYyNmYxMWE0MGQ1MTEyNWYyZDM3MjhkY2EyMmI5ZTkiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9TZWxlY3RlZFdvcmtmbG93Qm9keUxvY2FsaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzAxMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMGEzNDk3NzRiZTQ5NjUwMWNkM2Y2YTRlZGJhMjQwNWE0YTFmMTI5YTExYTM5N2VhY2I0M2MyZWIwMzM0MWIyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVDaGVja3BvaW50U3ViamVjdFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk3MTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDFiNDI3MjM3NzJmYTEyNDZiNzAzYTViMDljODgyMDM0MTIxZGNiNmQwOGY1MzAwZWU0OTAyZDE4ZTVjOGUzNiIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lUHJvdmlkZXJTdXBwb3J0RmluYWxTZW1hbnRpY3NUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjQxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTUwN2M5NjQ0ODMwODdmOTZmYTNjYTQ1MjI5ZWY5NDdmZmI2YTVjMTZkOTA4MTQxOTFlZTU0YTFhNDAwZmM4IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVTdWJzY3JpcHRpb25Qcm9qZWN0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzcxNTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmM1NDY4NjJmMzQ2NmQ1Nzg0MTc0MTFlZWQzODZlN2M0NzRmNzBlZmJkYzgxOTA3M2IzZGE4M2U2NWRmYmMxYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhQcm9jZXNzaW5nTWV0cmljc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4Mzc1LAogICAgICAgICAgICAic2hhMjU2IjogIjAyNDgwODIxYWYzOTEzMDM1NTVmYTdmZjcxZDI1YmUwZWFhNzdlNTVjYWY4M2NlMmYzZTcwZWNhNTg4N2I2NTAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvUHJvY2Vzc2luZ0V2ZW50SWRlbnRpdHlFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzk1NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjMxZDhiOTBlM2I2ODRlMTM3M2RmNWQ0MTAyMGE2MmQ5NzcxMmE1YWVmYzVhMTBkNjAwMmI4YjRmOWIzYzM0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Byb2Nlc3NpbmdFdmVudElkZW50aXR5RXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzOTU4LAogICAgICAgICAgICAic2hhMjU2IjogIjI3MjA2ZWJkNzViNzI2M2EzNTZmMWJhZDM0YjczY2JjZGYyN2UwNjM0YjFkMzVlNDZjMGQ3OTA3M2VlNDc1ZDAiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvU2NvcGVkUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dEJleERvY3VtZW50Vmlld1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NDgwLAogICAgICAgICAgICAic2hhMjU2IjogIjQ3YTE2NDc4YTNlNzk1ZjgxN2NlYmZjZDhjZjk1ZTUyZDhlZDYxMmFmODFlZDA1NDNhZGM5OWM0ODBjYWRhYmMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlRWZmZWN0UGxhblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM3OTkwLAogICAgICAgICAgICAic2hhMjU2IjogIjk5Y2JhYWExNmM1MGU4YmNkYjI4ZmU5YWQ2MGFkMDk2YTEwYjk2YjU5ZjZkNjMwMGE0Njc0OGMzMjhlNDE2MjUiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Db21wdXRlUHJvZ3JhbVBsYW5DYWNoZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NDIyLAogICAgICAgICAgICAic2hhMjU2IjogIjhmYjBhN2QzZmQ3YTI0Mzc3N2RiZDcxYTE4YjM1MjZhYzgwMjUwYTU2NWYzOWU1YmVmZDhlMjA4Nzk2NTNlNzYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Ob2RlVXRpbFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1NTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTUzY2E2NTQxNDlhYmFmNDZmMGFhMTlhOWIxMGY3ZjYxZWRlN2VmODhhNTAzZTUwNzEyYWM1NDlhY2EwNjczYSIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1NlcXVlbnRpYWxXb3JrZmxvd1BsYW5DYWNoZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NTI0LAogICAgICAgICAgICAic2hhMjU2IjogIjk4ZjUyMjQ0OGU0N2JlYjU2OTI4MmEwMzYyYTBiMTM5ODA4MThmNGJhNjEyNjFkMTNhZDg1OTUzNTgxMTU3NzgiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TdGF0aWNVcGRhdGVQbGFuVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAzMDIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmM4N2UzMmJiMWI4ZDRhN2ZlYjBkYzkyZjk2N2M5M2VlZmM4MjBlOTE3MTdiMWJkY2M3Njk2ZTliYzJlOTNkYyIKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93QmV4R2FzTGVkZ2VySG9zdFRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTAxLAogICAgICAgICAgICAic2hhMjU2IjogIjI0NGJjNWNmMmMxYTdjYmVmZDEyNzEyNTA4ODQyZGMxYTYyNzNmODBhMjg2OTIwMzdmMmMyZWVjNjNjODI0ZDYiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd0V4ZWN1dGlvblN0YXRlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDQyOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZGQzZDZkNWNhNjdlOWY4YmU0NDE1NzdhNTc2NzAzZTA0NDFiN2VjNDg0NTQzMmY5YTIzNDFmNzJkNmZlNGUyIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dQYXRjaEVudHJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJhMjFjN2UyOTM0NGIyYTM2YzM4Zjc5MWFmNDAzNWQ5NmEzMjA3MGRkNTliZDFmY2VmNmJiMGY2MGViZDk2NzM0IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SdW50aW1lV29ya1Nlc3Npb25UZXN0U3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjYxLAogICAgICAgICAgICAic2hhMjU2IjogIjZkZGUzMzAyMzc2ZWVkMGU4NzJkMzFmN2Y5MjA0MGI3OWY1M2ZhYjI5MmQzMDUwZjc2ODExZGJkN2ZkNzQ1ZjMiCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdEZpeHR1cmVzL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ29vcmRpbmF0aW9uVGVzdENvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcwMTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDEzNWQ3ZTYzMzUwOTEyNDJhYmE0NGU2MjRmZWZlYjFiZDA3ZWEwZmQ5MDIzMTExZTYwMmUzNDliNzkwZGJhOCIKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJzaGEyNTYiOiAiNzI1YWEwYzM5NzQ5M2U1NWI5NWExNGNkNzQxNzlkYWUzOWQ4YWQ0M2IxMzEwODQxY2E3YWMyNTA1N2Y5OTgwOSIKICAgICAgfSwKICAgICAgImRpZmZlcmVuY2VzIjogWwogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogIi5jei50b21sIiwKICAgICAgICAgICJraW5kIjogIkFEREVEIiwKICAgICAgICAgICJhcmNoaXZlU2hhMjU2IjogbnVsbCwKICAgICAgICAgICJwcm9qZWN0U2hhMjU2IjogIjJhNGRjNTQ2NDc2MGJhNDI5ZTk5MDEyOTk4YmUyMDY4Mzg0YWVmYmQxZDkyNjU3MWY0NWU5ZjI0YzFkY2E0MTciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJidWlsZC5ncmFkbGUiLAogICAgICAgICAgImtpbmQiOiAiTU9ESUZJRUQiLAogICAgICAgICAgImFyY2hpdmVTaGEyNTYiOiAiYmU4ZGJhZGJkM2FiOGMzMmFmOTYwOWNmOTdiMjc3YzM5ZTczYjNlM2I0MTc2NjA0MGE3NmQzYjk1MzgzN2NhNyIsCiAgICAgICAgICAicHJvamVjdFNoYTI1NiI6ICIzNTU4ZjEyM2ExYzgzY2Q1MDQ0MWY5NGFmMzE2ODJjNjkzMWMxZDQ0MDc0YjIwZTY5MWM5Yzc0YzIxYzMyZjFiIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgImtpbmQiOiAiQURERUQiLAogICAgICAgICAgImFyY2hpdmVTaGEyNTYiOiBudWxsLAogICAgICAgICAgInByb2plY3RTaGEyNTYiOiAiZjEyZTg5MmMyMTNiYmNmNzRkMDllMmI3MWJhMWZlOGY3MzMyN2VlYWQwN2FkM2ZmZGEzZDMxOTdhNzRiNTJmMSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZXN0RW5naW5lLmphdmEiLAogICAgICAgICAgImtpbmQiOiAiTU9ESUZJRUQiLAogICAgICAgICAgImFyY2hpdmVTaGEyNTYiOiAiZTczMjhmNWY3NDRkNWM5OTYxYTlmN2YzMDY4MjAwMzEzY2M1ZGQ3NzRhMThmNjc1YWY4MTIzNGM4ZTRiMjI5YiIsCiAgICAgICAgICAicHJvamVjdFNoYTI1NiI6ICJiZjI4MmU5MmIwZjg2MWQ5MzUyZWIyYWM3ZTA1MTgzYzI1MzM3YmIzNDYyY2Q1NTE1MWMxZjA0NWViZDlkNGMwIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcGxheWdyb3VuZC9maXZlLW9jY3VycmVuY2UtaW5pdGlhbGl6YXRpb24taG9zdC55YW1sIiwKICAgICAgICAgICJraW5kIjogIkFEREVEIiwKICAgICAgICAgICJhcmNoaXZlU2hhMjU2IjogbnVsbCwKICAgICAgICAgICJwcm9qZWN0U2hhMjU2IjogImIxZTk0YzAzOWQwZmQwZGY3MGIwYzgwM2ViZTkyMWEyOTBkMTU5MGJhYzY5YTkwNzNmZTQ5MTBjYTg5MzliNmIiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAia2luZCI6ICJBRERFRCIsCiAgICAgICAgICAiYXJjaGl2ZVNoYTI1NiI6IG51bGwsCiAgICAgICAgICAicHJvamVjdFNoYTI1NiI6ICJjYmI5MzY0MzVkMTNjNGJmNTY3OGZjNmFkZGVkYmY2MjU4MDFhNGVkYzUyYzQ1M2M4YTQ0MWNhYTFhMmJmOGQzIgogICAgICAgIH0KICAgICAgXQogICAgfSwKICAgICJjYW5kaWRhdGUiOiB7CiAgICAgICJwcm9qZWN0UGF0aCI6ICIvVXNlcnMvcGlvdHIvZGF0YS9ibHVlLWNvbnRyYWN0LWphdmEiLAogICAgICAiaW1wbGVtZW50YXRpb25IZWFkIjogIjY5OWYwMTljYjlmYTFkNDg0YTA3MGE1ZDQ2YTIzMzVmZDFjZDJkY2UiLAogICAgICAibWFpblNvdXJjZU1hbmlmZXN0IjogewogICAgICAgICJmaWxlcyI6IDEwOSwKICAgICAgICAic2hhMjU2IjogImQwZGFkOTFmZTNjMmQ1NjI3YzNiMTkwMDU0M2IyYTgyY2M5ZWEzMjNhZmJiODVhZDA2MjU2ZGE0ZTJjZjMxMjQiCiAgICAgIH0sCiAgICAgICJleGVjdXRpb25TdXJmYWNlTWFuaWZlc3QiOiB7CiAgICAgICAgImFsZ29yaXRobSI6ICJTSEEtMjU2IiwKICAgICAgICAiaW5jbHVkZU1vZGUiOiB0cnVlLAogICAgICAgICJmaWxlcyI6IDIyOCwKICAgICAgICAiZW50cmllcyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiLmN6LnRvbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWE0ZDY4YTY5OWU3OGZmNjA0YzJlOTA5YmY2ZDdlY2Q4MmJkMjBiNGYzNjVlYTg1YWQ2NjZkODhiYjFhMDYxMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJidWlsZC5ncmFkbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzEzNzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiM2YzZTQ5NGI5ZjNkODUxMGQwNDAwYjdjMzg4MTEzYTViNDRlN2E4NDg2NmQxZjI1NDVmNGYwYjhlZDU1MTM0ZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUubG9ja2ZpbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MzY0LAogICAgICAgICAgICAic2hhMjU2IjogIjI5YTZlMTk5NmY4OGYwN2FlNTZlNGM3MjA0MDljMDkyNDQwYmM2YWRhMTk3MTI1YTBkZmVmMDE3MjJjM2U5NGMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLnByb3BlcnRpZXMiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmQ3M2U5MTMxN2E1NzZiZTlmZDcwN2FkMzZjZWYyZWViNWZmNWRkMGNiYTcxMTYzZDhjYzMwOGZhNjU4MjdjMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvYmV4LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTUzLAogICAgICAgICAgICAic2hhMjU2IjogIjAxYzk2YzdlNzZjMWE3NWRkNmEwZGZkMDk2NTZkNjQ0OTk1N2ZiMTQ0ZGQzNjNmNzg3NTZmYzU1Njg1ZGI0MTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3B1Ymxpc2hlZC1hcnRpZmFjdC5sb2NrZmlsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc5MjksCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjRlN2I3OGJjZDdhZTkyOTU5YjYxZjg4MmEwYzc2MmE1NjQ4NGE1N2Q4ZDZhMTM4OGMxZmZhYmI5NjJiYjE1NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcmVwb3NpdG9yeS1zb3VyY2UubG9jayIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZDNiMDU1MTA4ZWY2NWE3ZDU0ZTA5YzlkOWM2MTljMjA4YTNlMWY3NTE4YjZlMWY1MTRiNzVkNDE2MzdmZmY4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ4NDYyLAogICAgICAgICAgICAic2hhMjU2IjogIjQ5N2M4YzJhN2U1MDMxZjZhYTg0N2Y4ODEwNGFhODBhOTM1MzJlYzMyZWUxN2JkYjhkMWQyZjY3YTE5NGE5YzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlNzRkNGYxMDdkMmZlYWI5ODliOWEwNDFhMDJlMmQyYjg1NTY3ZmY0ODQxNWM5YzdhZGQ1ZWNjMTlhYmQxOWY5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXciLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjU2LAogICAgICAgICAgICAic2hhMjU2IjogImE1YTVjMTk5YmEwMjE4OWFlOGM0NmEzMzQyMjMzNzFhMjA1OTlkOWMyOThlZjY1ZTc1NDBlZGU0YTNmNzJkNTkiLAogICAgICAgICAgICAibW9kZSI6IDQ5MwogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldy5iYXQiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODQ4LAogICAgICAgICAgICAic2hhMjU2IjogImQ1Mzk2NzZjNDhiNTk2YWZkYTY0Yzk2M2VjOGY3ZWU1NmM3YjNmZTdlM2I4MWQxZGJlMmQxYTFlM2RkOWU5ZjgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic2NyaXB0cy9yb3VuZDEzLWFiLWV2aWRlbmNlLm1qcyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY1ODk3LAogICAgICAgICAgICAic2hhMjU2IjogImUzM2MxN2M5NGY4Y2VjNzYyOTgwMzc1MDA1ZTc2MzJlMWE3Y2QwNWIzNzhhZGJmZDM4Mzc2ZDJmZTcyMWJmNTAiLAogICAgICAgICAgICAibW9kZSI6IDQ5MwogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic2NyaXB0cy9ydW4tcm91bmQxMy1zYW1lLW1hY2hpbmUtYWIuc2giLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMTk2LAogICAgICAgICAgICAic2hhMjU2IjogIjk5NjIxMDU3MDcwNGIzMmNhZjNhMzg4NjA0NGY4ZjFiMzRjNjk4MjRjN2JhNGEwZjQ1MThmZWEyMzUyYzdiNWQiLAogICAgICAgICAgICAibW9kZSI6IDQ5MwogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic2V0dGluZ3MuZ3JhZGxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICJhN2NhNTg1MWY5ZjY2MzIwNzFjZTEyY2YwZjYyMDk4ZDk5NWVjOWFjMjQ2MmVlMDAzYTE4N2MyM2I2MmRkNmNiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9jb25zdW1lclRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9jb25zdW1lci9QdWJsaXNoZWRBcnRpZmFjdENvbnN1bWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY4NDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTRlZTc3ZWI0OGFkM2M0NjkzYWU1N2U4MGQxYWQyNWUyNmU0N2Y3MWVjODJhNDk3MDM0MzhkNmRiMmU4ZjQ5OCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQXBwZW5kQWRtaXNzaW9uQXRvbWljaXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzAxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNmYxN2Y3M2U4NTE4NDgwMGMxMTYzNGE3ZTYwYjA1MjhjNDU4NWNkN2I0YzQ0MjIwYjRiN2NlY2U4YmY5NDE5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9DYWNoZVNlbWFudGljUGFyaXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTc2LAogICAgICAgICAgICAic2hhMjU2IjogIjljMWU5NjVkZTM3NzQ5ZWY3ZjM2NjA3Y2RhYWViNDk2MmMyYzI5ZWYwMmZkZDBmNzhmNWRhYjlhNGQxMjhiNjAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NhdGNoVXBQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzgwYjQzMTI4OTc1MmY2NjY1Y2E1OWZkYTFmMzI1NDI5NzMwYjViYjY4NGZmZjk0NGJhMmRmNzQ1NDNlNGRlZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ29uY3VycmVudEVtYmVkZGVkQ2hpbGRDcmVhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDBhMjczYWRiYzk5YzBjMThhNGZjN2ZmM2E2NDAyNmNiNDNjMzg3OTk4YjRhZDEwODhjM2YyMjg2NjM4ZjIwMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ29yZUJlaGF2aW9ySW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyYzk0MmQwYTZiZDg0ZDNhMTk4N2UzNTI2NDJlN2I0NDQyNzk4ODk5YmY0YjZlMjAyN2U2YjM5N2JiNDA3YjFiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EZWVwU2FtZUVudHJ5T3JkZXJpbmdJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTIzODI2YTk2ZTdiNTk5YmI3ZjlmZWVmOGU4MDcxMjVlMDg0MTdhZGQ4MGI0ODZjZDllY2MyMzYzZDYxOGUyOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY0hpc3RvcmljYWxTb3VyY2VTdXJmYWNlSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NzA2LAogICAgICAgICAgICAic2hhMjU2IjogIjMxMDQ0MjlhNzNjM2EzYjIzMjUxYmM3OTQ3MmYyMDM1NTBhYWUyOGQwZTg4NDcxNWIyM2EyOTBhZGE0NmM5M2IiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRIaXN0b3JpY2FsUGF0aEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMjhiNjlmYzc4NzcyYmZlMDg4Yzc0Y2I2NTEyYTU2NGFjZDc2YTczNTMwMDMwM2I5NDBlYjU2ZjVjMDJhMTBhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkUGF0aEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTkzLAogICAgICAgICAgICAic2hhMjU2IjogImUyYmZiMzI4YTIxNTY5MGJkNDZkMmUwYmUwMGFhOGFhNWVlMjUwODMwOWZhM2FlMGU1Mzc2MTFkM2JmOGQyYTciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkRXBvY2hFdmVudE9jY3VycmVuY2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2NzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjgyODcwZTM3OWJlY2VjOGQ5N2M5YWFiZDhlNjRlZDE2MWQ5ODk1NWY3MWMzYzEzOWQ3OTQ3OGRmZjdlMjgxYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRPbmx5TGF5b3V0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDQxLAogICAgICAgICAgICAic2hhMjU2IjogIjEyZjUzOWY3ZjdhYmI2NTY4NDYzOGVkZjJmMjc0NTRjMDM5NDJkMWJlOTI2YmZiMTI1MTYwOWE1ZjJjMDViZTMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VtYmVkZGVkT25seVN0b3JhZ2VQb2xpY3lUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1MTkyLAogICAgICAgICAgICAic2hhMjU2IjogImUwYWJkYmE0MDg5OGM3YjMyZDZhNmUxNDQ2NzE0NjVkNTBhNGY1NTYxNmZmMDBmYTgwZGJkZTUxMjY2MjA3NTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZU1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlNmUyOWRiODNjNzYyYmIzZTNmOGQzMWNkODEzNTgyOTE2MjA5MzQ0Mjc5MGRlMDA5OWQ5OWQyOTFiZDNjMGZlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbmdpbmVUZXN0U3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjI0MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NDdmNjQ3NWI1YmVlM2FjODU3ZTYxMDZiZTRlNDkyYjU4OTdjNjU0ZjhmMDk4Yzg5MGUxZjRlNzExM2RkZGMwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbmdpbmVUZXN0U3VwcG9ydE1ldHJpY1ZvY2FidWxhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjcxLAogICAgICAgICAgICAic2hhMjU2IjogIjhlZThlNjJiZjFiZGIwN2FiNzI4YTYxMTQ3ZDNiMjM5OWMzODA1ZjliMzk0MDBlNGMwN2I1NTdhZWI3ZTU5ODAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0V4aXN0aW5nRW1iZWRkZWRTdGF0ZU9ubHlDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDM3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZGQ5NjZlZTM0NGIyNDA4ZjM5MjhlMzZhZWFmNDY4YTA4ZDA0ZmZjYjFmM2RlZDA4MGY2OTU3NDg5NzUwODdiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9GYWlsdXJlUmV0cnlBdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjIwMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI2NzA3MzBhN2MwMWZhMDk1NDU0MjA5NmQ5YTg3MWJiZmUyN2E0MzQ1ZjIwZTNkN2IxZmVlYjAyODIzNDdkMzE4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9IaXN0b3JpY2FsU291cmNlU3VyZmFjZUludGVydmFsSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzg5LAogICAgICAgICAgICAic2hhMjU2IjogImNjZmYzODVhYjY3MjVhNDY0Mjc1YmQwOTFmNDQ3M2FkMTEyOTk1NDU3ZTk2YzVjMTUzODZkZGJmYTJkYTBlNWUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0luaXRpYWxpemF0aW9uTGlmZWN5Y2xlRXZlbnRPcmRlcmluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzcxMCwKICAgICAgICAgICAgInNoYTI1NiI6ICIxN2ZiZGJhNDNhZWNkMzhiZDdiYjk2MmVjNzJlMzQzMGRjYjk0MTA0NDg0ZDAyMjRmOGRlYWRkNDU2NmIyNjNhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Jbml0aWFsaXphdGlvblJldHJ5SWRlbXBvdGVuY3lUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTk5OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4M2E2ZjJiZDE3M2MzNDVhYjAyYTJiZDNkNzUzNDJmYzEzMDk5YWE1OWIyNzkxM2I3OTRlMjFkMmI2MzQ2MDJlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9MYXRlQWRtaXNzaW9uRW1iZWRkZWRIaXN0b3J5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTg5MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxZTZmZWMwNGQ1ZTE1YTMyYzg3ZTczZGM0ZWRlYWMzOGFiNTUyNzE4MWI4ODkyYzdmMTRlYWYzZWM5ZWQ3NzUyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NYW5hZ2VkQ2hpbGRDb2xsZWN0aW9uTWVtYmVyc2hpcE11dGF0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3MDQ3LAogICAgICAgICAgICAic2hhMjU2IjogIjk4NWJkOTU5ZGFkZGUzMGI2NzY0NjVmZTYzMmJhMjc4YjE5NzE1YzljNDgyMjY0NDViYThiZGJiYmY5Y2FjNjUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWRDaGlsZE93bmVyc2hpcEd1YXJkVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzUzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICIwYTk0OGVjZWM0YzZmNjA1NWFhYTkwNGQ2OTFkYzQ2M2FkNTM0ODg1OWU5MDBlZjNjYzNlMTdjZmVjNTdjOTFkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9NYW5hZ2VkRG9jdW1lbnRJc29sYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NDE0LAogICAgICAgICAgICAic2hhMjU2IjogImE0ZmViMWUyNGEyNmJiZjllMjdiNDdkZTdlZTNiNTQzZTllMGY5NTcyNTUzMTllODczYjI3MWViYjIzZWYxNzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL011bHRpQ2hpbGRTeW5jaHJvbml6ZWRDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA0ODcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTc3ZDUxMTUyYWY3N2FjOGFjNTk2ZWQ5YTA1ZWQ3MTY4NDc2MzdhMDI2MTYzYjAyM2MyNWRiMDc1ZWE2Yzk1OSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkRW1iZWRkZWRDYXRjaFVwVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc1OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjYmRhZTBmNzVlYmJlNmY2MDI1Zjk5Yjk0YWNjN2I4MjlhZDRmNjE4YTBlZGU4MjAwMmMzNDEyNmIyYzI4MjA5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRPd25lZFNjb3BlUGxhbkludmFsaWRhdGlvbkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDhlMzEzZWQ3MzAxMjcxYzc3ZDA1ZjAzMDlmMzdkYjBkMjNlMzBmYjlmYzBlNTUzODIwY2U5NWQ0Y2Q1ZDJiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRTaWJsaW5nR2xvYmFsQ2F0Y2hVcE9yZGVyaW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTE2MTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDE4ZGU4MGVjNDBkMjFmMzU2YTkwZmMzNWQzODUzYjczNzM5ZGZiNTc3NmFmM2U2MmYyYjU4YzIzZTdiN2Y5MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTm9uU2NhbGFyUm91dGluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICIzMWY4M2E0ZDI3ZjViMWYzZjZlNWU4ODM4NzJhMWE4NTZiYTBkNWM4YWQxMTg0NTcxOTFlYmYzM2JlNDhmNDdjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VDb3JyZWN0bmVzc0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ4NzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDQ0ZTg0Nzk0YjQ4MzIyNGE1YjllZDI3MjA1OGY1OTcwOWY5NDkyZWFmNzY1ODhhMDk1M2RmZDQ3ZmUzMWNkZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3NzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjEyZTg5MmMyMTNiYmNmNzRkMDllMmI3MWJhMWZlOGY3MzMyN2VlYWQwN2FkM2ZmZGEzZDMxOTdhNzRiNTJmMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlUmV0cnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MDE1LAogICAgICAgICAgICAic2hhMjU2IjogImI3MDBlM2Q3NDczYmIzOTU5ZGRiNDdhM2ViMjcxOTVhNzU4N2FlY2MwZDM1NDVjZTc2MjIxN2MwOWE3MjA0YmMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Byb2Nlc3NFbWJlZGRlZENvbGxlY3Rpb25QYXRoc0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTUxMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZmFhNjkxMThlZTVjYTBlNzAyZTY1YmY0ZjA4MmMzYzE2NTg4N2VkN2M5N2U3YTgyMGJhYzFiODU5NThjOTdjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QdWJsaWNUZW1wb3JhbEZlZWRlckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjU0MzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTg1ZTI2MTc3N2E2NmQ1NWU0ODQ1ODhkZTkzYmRkZTY5M2I1MjBkOTIyNDZlMTY3OTFmMWJjYTY5ZDAwNDY5MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUmVtb3ZhbEN5Y2xlQW5kUmVhdHRhY2htZW50VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODQxOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYTNlZDMxODVlYTgzNGYyOWQ4MjE0NmI2NDdmZTU0MmVhNzI0M2YyN2RjMDY3NzdkMGFlN2Y1MzNlNWZkOTAyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9SZXRyeVN0cnVjdHVyYWxDb3VudGVyc0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTczMywKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjI5YjY2YzcwYmE5ZTlkY2RlMDcyNzEyYWI3NWQ3MzI0ZjY2YjQ3OTQ1OTNjMGMxZGZhY2IyZDc4OWM0MGU0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEwSW5pdGlhbGl6YXRpb25JZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjM5OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDBlZDY3NjBkMDE1NGMyMzU0NmQ4Y2RkNTZjNTVmYzEwZWJiOWU0YTIzOGRiYmU2NDJhOTVkOGI2ZTUyODQ2NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUZpeHR1cmVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mjg1LAogICAgICAgICAgICAic2hhMjU2IjogIjI5NGUyMDkwYjViNmExY2YyNjhkMDAyM2Q3NWRmYzE0ZDRmNmU1MGVkMDVjMWE3YTkxZWYxNjAxNTM2YzJjYzMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NhbWVEb2N1bWVudEluaXRpYWxJZGVudGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY1MDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmFmMTA2YzJmMDAxZjhhMWNhMzcxOGNlZWVhYmI3YjBjZWQwMmRjODlkN2FlNWEyNzI5MDdhNDQ4OTYxZGVlYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2hhcmVkTWFuYWdlZENoaWxkVHdvT2NjdXJyZW5jZXNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NDY3LAogICAgICAgICAgICAic2hhMjU2IjogImZhNzBiMDVkMmE0MWQxYzNkNGEyZWM3NWIzZjE0ZjFhNDZmNWFhMjRiZmM0YTllOTIyZGY4ODg2YTU5MzJkNzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NoYXJlZE1hbmFnZWRDaGlsZFR3b1BhcmVudHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDAwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOTEzNDlkMDhiMGRlODQxYzEzYTMwMDYwZWU3NDQwMzQxOTBiMTkxZmIyMTljN2FiYTZkMTY5ZGVkN2M3M2I1IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Tb3VyY2VTdXJmYWNlSWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY5MzksCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWZjZTMxNWNmM2ZjNzNmZDYxZjIwZTY3ODJkYmYyN2Q1MzNiZDc2ZTFlNjY5MDliMjBjOWJjZTYxNGZmMzgxMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU3RhcnRBZG1pc3Npb25BdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODk2LAogICAgICAgICAgICAic2hhMjU2IjogIjJiMmNjYjUyZjIwMjJiNDVlYWQ4NzlkNDM4MDBiZTM4ZDU5OTllODRmODkyZjNiNjU5MDQxNmMyNjQyN2Y0NmQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1RlbXBvcmFsQWRtaXNzaW9uUG9saWN5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzkxNywKICAgICAgICAgICAgInNoYTI1NiI6ICIxZDUzMzQxZWU0ZTEwZmI0MjEyMDcxYjBkZjUwYTFlZjNhZTI4NWUxNzFlOGEwZmViNjQ0OTllNDFkYTQxNTUwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZXN0RW5naW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDY1NywKICAgICAgICAgICAgInNoYTI1NiI6ICJkYjg5YjhiOTI3Zjg2MmZjNWQxYTUwYTdkZjIyYmQzZTk1YjMwNTQyYjM2YTUxMjYyYTY5MDBlMzdkMDE5ZTBhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UZXN0UmVzb3VyY2VzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjAwOWUxZjFmMDZlZTc3NTMyZGQwZDRlYzZhMDA2MGQ3ODhlNmNjMjY5MzMyYzU3Yzk3NjRiZDRiMTJjYmRjYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vV2hvbGVPYmplY3RGYWlsdXJlSHlnaWVuZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzc4Y2UxOTdkOTJlNmMxODhhMWYyZTVjZWNjYjZiOTg5ZjViOGI3ZTU2OGVkOTU3ODRlZTYwOWU0Y2U1NjM2MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQXBwbGljYXRpb25SZWFkaW5lc3NQcm9vZkludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTY2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOTg3NzExMjZiZWZlZGNmOGJkY2UyYmJjNDhkYmE0MDE0OTMzMzFhZjBjMmQ4MzA1YmEzMzJhNjJhZjM1ODM0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZFJlY2VpcHRSZXRyeUlkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3OTQ3LAogICAgICAgICAgICAic2hhMjU2IjogIjI5ZDEzOWI2NWEzNjZhMDk1ZjU2MTZjZmM0Mjc0MzBlYmFjOTcxOTA1Yzk4NDU2MWYzZGVlYzFiNTk4MjE2N2UiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vYWxsLXRpbWVsaW5lcy1yb3V0aW5nLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGU3NDI0MThkNjc3MDUxODY2NmM3M2U1ZGY3M2VlOTk3YjY0NTdkNjUyNGI4OTc0MmZlZThkMDlhZmM0ZGUxNCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9jb21wb3NpdGUtcm91dGluZy1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDY3LAogICAgICAgICAgICAic2hhMjU2IjogImU0NTlkYjJjYjg4ZmFjZThmM2QwYjU5Yjk2OGFhYjU1MjFmMzc4NTA2Yjk3YWFkMGJjZWY3ZjhkOWUyZjk4YTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTc4MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMWZhOWZjNzU1NzZhZWQ0NjQ2OTMyNWIwMjc3ODMzY2Q5MDZjMzdlZDJjNjUwNjVjM2E4Yjk1YTUzZTdiYzJiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1hMS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ3MywKICAgICAgICAgICAgInNoYTI1NiI6ICJiNTRjY2RlMTQxM2MzOWNiZjRkMWY1YjM0NDNlMmUzNThiYzQ0ZGViOWNkODdjNjdjNDNiMjU3ZDE3OWUwMmQ1IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1hMTEueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcxMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1M2NhNzRiZWU2NThkMDUxMzNlNGFlYjU4YmZjN2Q5YWJiNGI5MzdiNmMwMzFkMmViYzgxYzQ3YTVkMTVjYWRmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2RlZXAtc2FtZS1lbnRyeS1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyODU4LAogICAgICAgICAgICAic2hhMjU2IjogIjBkNDZlNTRiNTllM2UwNjZlNTFjMTMzZWMzN2RhMTAxMjAxYzgwODQ3NDZkYTNmNDIxNmJkZWJmMWNiNzU1ZmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZHVwbGljYXRlLWV2ZW50LWVtYmVkZGVkLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzgxNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwZDhkNmU4ZGNkNGU5MzM2YWYwYzI2NjVjZTAwN2JmNDliMzIxNWRkMWMzYmZmOGJhNDBmZWUxZjQ4ZTVhYWIyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2R5bmFtaWMtc291cmNlLXN1cmZhY2UueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzODcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTZlZTMxZTA1YTAzMTVkNWI3NmMzMzE3ZWViODdmYjIwMDFiYjM1MTI3NGQxMmEyZjEwMGMxOTM2NGQ3OWI5YSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb2xsZWN0aW9uLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjIzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI1NWI0MDM5YTA2YzUxMjJhZjI2NzNhOGRmMGZhNGNlMjQ5OTlhMjcyY2EwYzhkOTdkOTcxMTMwMTdlNTEzNzk0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvdW50ZXItQi55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjg1LAogICAgICAgICAgICAic2hhMjU2IjogImMyNzkwOTRkYmM1MWU2ODA4YjU3ZGYzMjkwMGQzMDkxMjhjNGEyMDhlZDFjZjRlYWQxOGQzZTQyOWU1NzNiNzYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODYxLAogICAgICAgICAgICAic2hhMjU2IjogImIzMTZhZmI2Y2ZiODkxNmQzOWE3ZmQ3MjM4OTQ5ZTRiMGE1OGI0ZDcyYTBiNGI0ODQxNDU5ZWU0MDg5NTAxM2UiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtbWlkZGxlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2LAogICAgICAgICAgICAic2hhMjU2IjogImY4ZmYwMmJhNGI5NmVjZDE1ZTZhMzdhOTdjOGIwYmQ4MjNkZGViNzU5ZWE5ODAwOTc1MmMzM2ZiYjQ1M2RlOWUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODA2LAogICAgICAgICAgICAic2hhMjU2IjogIjZiNTljYzJlYzBjYWE5NDI1MTlkOGRkM2FjYzg1NTFmMmNjZDMwNGUwYmQ2MjU0NmQzMTY2OTQxNjg0OTRiZjIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtcm9vdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY2NywKICAgICAgICAgICAgInNoYTI1NiI6ICI2ODY3NjYxMzM4YThhYWQ1NzJhMTc1Y2QyYzE3NTgzMjMyNjM4ZDYzMGU4ZjFlZDc3NzgyMjk4NTljODJhN2MwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLXN0YXRlLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTcyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxZmRiMDQyY2EwNzYzNzBhNzI4ZmZmOWY4NWQxN2Q0OTQzZTBhMDJiOWVmNjlhMmVkNDlmNGMzMGZkOTgwZjhiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2luaXRpYWwtZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjk4LAogICAgICAgICAgICAic2hhMjU2IjogIjU1ZGYyMzBkNmJmOTJkMmJkYmZhNmIxODNiYzRjMjUxZjZiOTczNDA1ZmI3ZDBlNjYzZjRiMGYyOWY3YjViZmYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbGFyZ2Utb3JkZXItaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjEyMzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmVmNDFjNTM0YTdkMTc4NTdlOWQxNmI5NjQzMWNhYWNiOGJmZWJkYTQ4YzlmMGQ0MzE5YmNlYTZlMjdkZTEyZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9sYXJnZS1wYXlub3RlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjgyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3MTdiYmI2ZWIwM2MwYTkxNTJhMDJiYmNlYTFmYzdkN2JhOGM4Y2FmZGJkZjg5MWVmMmQyM2E3YTBlMmNhMGFkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1nYW1lLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNGI1ZGRlNTBjMGY0YzIwN2RmMTU2NWEyMWYyMzIzNmNjYTdmYzIzNWJlMGZiZWJhYjUxODY3NmQxMjNjODIyMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtZ2FtZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjc0MywKICAgICAgICAgICAgInNoYTI1NiI6ICJiMTQyNzZlOWRjNmE0YjQ2NmY2YzhiNTc2OGFkZWE5MDhkZWJlNWNmMGU4MjQ1MDVmZGQwNDRjM2I2MGQzMzY0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1yb3VuZDEwLXNsYXRlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTQzLAogICAgICAgICAgICAic2hhMjU2IjogImNkOTAxYzZlYTAxY2Q4OGQwNzZiZjZlODA1OWU4ZDljYWIwNzcxYWViZjhhOWYxN2U4NjliNGIzZjE2Njc4ZjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLXN0YXRpc3RpY3MueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIwNzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTk1ZDkwYTA4ZjhlMmFhNDRhNTkwOWM5NmU3ZjNjYzU1MjUxZjk2YmE5YWQ2NTg5NjZmZjNkMWZmZThhMGUyYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uZXN0ZWQtb3duZWQtZHluYW1pYy1zdXJmYWNlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTYyLAogICAgICAgICAgICAic2hhMjU2IjogImVjNzQ5OTlkNDc3M2E3YjJiMjk1ZTQyODNmZTQ2YjY3MzZhYWY5ZWRiZjI4NjEwNjkwZTIwODMwMzViM2NkZWMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmVzdGVkLXNpYmxpbmctaGlzdG9yeS1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjg4LAogICAgICAgICAgICAic2hhMjU2IjogIjY4ZWVlYzNhNzM1MDg4Nzg3ZjJkNTE5NzVmYzUzMDJjZWYyM2I2YWNkOTM4ODFhZWU5ZjgwNTEzNGI2MjdhNWYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vb3duZXJzaGlwLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjEzMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4OTU1M2RiNjdiMjNjM2Y4Y2IxYjBhZmJmODU4YTUwOGM2N2FlNzU0MDA1OGY2Y2UyZDFhYmYxMTQzYzJlNmQ0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3BhY2thZ2UtcGF5bm90ZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzU4MjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmI4YzBlMWJhYTY1NzVjMzliNjBkOTQ3OTY4NDY2MWU2NmE4NDk5YzQwOGQ3NzBkYmVlM2NjYWRmY2I0ZDk2NCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjM0LAogICAgICAgICAgICAic2hhMjU2IjogIjQyYzIwY2E5Mzg2MzFjMjllNDliYTAwZTUwYTMwN2ZmNTA2OTllMTlmMzU0OTNiMTA2ODU1ZjZiYzU0NTc1NTUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcm9vdC1pc29sYXRpb24tcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDI1LAogICAgICAgICAgICAic2hhMjU2IjogIjJmZjY3ZjBkZTNhMjA2MmYzOTQ0YTFiOWYwMWRiMjVjOTJlZDcxZWY3ODQ5NmU5ODRhNGNlZmU5OTA1MTBiMmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vc2hhcmVkLWNoaWxkLXR3by1vY2N1cnJlbmNlcy1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2NjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2IwYTJiN2RmNGE1YjEyYzNkZGM3OTAzYTFhMzdkNTMwMGRhNDA4NTcwMzI5Nzg3ZDBkNjZmMDRmNDhmYWFjOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi90aHJlZS1jaGlsZC1oaXN0b3J5LXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTgzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkZTQwZDA5NjUzMzc4YWFjMjQwNDc4MzNkYjAwMjE5OGEzNzIxYTNmNDRhMjIwMzhmYTM0NGJlZjJmN2JiMzA3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3dob2xlLXJlcXVlc3Qtc2luay55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTE5NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwOTk4NzYwMWQzOWEyNzk3ZGNmZDM0OThjNzAyNWI1MzczMWQ5YzIxODBlOTMxN2I2NDY1YTE2YmUyMDJkOGYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3BsYXlncm91bmQvZml2ZS1vY2N1cnJlbmNlLWluaXRpYWxpemF0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3OTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjFlOTRjMDM5ZDBmZDBkZjcwYjBjODAzZWJlOTIxYTI5MGQxNTkwYmFjNjlhOTA3M2ZlNDkxMGNhODkzOWI2YiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtY29sbGVjdGlvbi1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mjc4LAogICAgICAgICAgICAic2hhMjU2IjogImJiM2NlNDA3YTYwMGU4YWJkNDE1N2IzM2E4Mjk1ODA3NmE2MDQyOWRjMmY5YjE0YTkwZTRjYTQyNmYzMWE5YTciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9keW5hbWljLXBhdGgtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjkxMiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhY2VkNzM0ZWM1YWYxYmMyMzI4MDc0YWU5M2QzMDRiZjk1NDAwZTdkZTI2ZTJlZmMxZGU4NjRhZjY0MGJhODM3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tZHVwbGljYXRlLWV2ZW50cy1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMDdlOThmZDc0NmJjMjNiNDJlMzk4ZDkwMjZhY2RlYzI5N2E1YTlhZGM4NjEzMTRhNjRmOWU3NzkzZTk2Njk0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvaW5pdGlhbGl6YXRpb24tZXZlbnQtb2JzZXJ2ZXItcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjI4NzU2YmM0YmIzMzkxODIxOWZiYjcxOTZhZTY0ODMwMWE0ODBhZjE5ZjFmNDAzNWFiMTgxNjEyZDM3MmVkZDAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1vcmRlcmVkLWV2ZW50cy1jaGlsZC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTAwLAogICAgICAgICAgICAic2hhMjU2IjogIjAzOTQ0Y2E5MzMyODc5Y2U2NWY5YjQwN2QwNzExYTY0ZDk0M2UyZjgxMTAwZGRmMDg3YTg1NTI2MGQ3ZThiM2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9tYW5hZ2VkLWNoaWxkLWNvbGxlY3Rpb24tbWVtYmVyc2hpcC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0OTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTc1ZWNhMzgyODg5MjlkNzM0MDE5MGU3MzEwYmI0NWY3MmVjMmVhMmJkNTU1Mzk3NmM0YWVjNzE2NWMzMWRmNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25iYS1saWZlY3ljbGUtZ2FtZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzM4NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJiZjFiNzk5OGRkOTA2NGYzMmYwNGQyYmEyODViNWFmZDQ0OTY0M2FiZjc3ZjNlMzU2M2I2MGY0NzJlM2U5MTIxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MzE0LAogICAgICAgICAgICAic2hhMjU2IjogIjEyY2U0NTVjNjQzMDk4YzI4YWY0YmFmOTM1NmE0ZDFkNjg5MzgwOWEyZjgzOGM3YmI4MjcwNDQ4NTYxNDM5MDAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uZXN0ZWQtZHluYW1pYy1jb2xsZWN0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTBmNTI3OWI5MzQxOTdmZGYyNjBiM2UwZDA4YjA2YjZkMjRhYmY4MDA0ZTAyYzNiMDljNmUzODE3YWUxMDQ5YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9BY3RpdmF0aW9uTW9kZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjY2LAogICAgICAgICAgICAic2hhMjU2IjogIjc5Y2U2Zjc2NjJmYzQ2NzFhNGFjMWE3YTE4ZDg0ZDdjYjc2OTZhNjM2ODdlNWNlYWVjZmZkNmU2OGM4ZDg4OTMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NDUwLAogICAgICAgICAgICAic2hhMjU2IjogIjQ2ZWMxZGFmYTJlNGM1OGU3YTgzNmY0MTJmOTFkYWRjZmI0OWJlNmE1NzI3NDBmOWFmZmI4NWE4OGFhNzc1MGIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRXJyb3JDb2RlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzcwLAogICAgICAgICAgICAic2hhMjU2IjogImM0NDliOTUxZDhlOTkzZGJmYWZiNTUxNGVkNWUxMzYxMTcyYzVkMDFhMWFhMjcwNmM4NGM5OTU2ZWUxOWMzZTEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDcwLAogICAgICAgICAgICAic2hhMjU2IjogIjI3NjYwMTIyNzhmNzI5Mzg5NzY3MzhhMDE1OWI0NGMyNzY0NDEzMDUyZTgzZTk2MTMxNDE0ZTc1N2VmN2IzNmYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvQ29vcmRpbmF0aW9uTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjA2MCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwZTBlYjllOTQ1OTZlOWFhNDNjNzE3NTI4MjE5YTliNzY4N2MwYTQ2MDc3YTI0OTNmNjYwNjAzZTNkN2UyMmMxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50RGlzcGF0Y2hPdXRjb21lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTBmZmJmMDkxMDMwNDk2MmY1YjE3M2E2ZTZhOWVjMzQ5Mzk0YjQ4MzAxNzY1ZDM3M2JlNWZjYzdiZjBmZmUyZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9Eb2N1bWVudElkLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcxLAogICAgICAgICAgICAic2hhMjU2IjogIjYwZjg1ODViNzQ2ODBjYjc2ZjU2ZDU1MWY4MDQ2YzdhZWUzODI5NmI2NTA1ODlkMjY4MTMwOGJjNzVhOTViZDEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvRG9jdW1lbnRSZXZpc2lvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODIwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkOThlNjg3ZjM0Nzk5NGMxYjM5NmI3NmQ5MGI1ZTQ5N2Y1NWYzMGZkNzY1ZmU2MGZlZmY1MjM1M2UyZGVlMGJkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL0RvY3VtZW50U25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4NTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZGY2ZGYxNWUyZDg3MzQ4ZWZiNjZmMTBjZjU1MjM5ZTc1YzM5NzYwZjlmYTE2ZTI4MDE4YThkMzUxZmFhNDBkYSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9FeGFjdFZhbHVlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0OTU2LAogICAgICAgICAgICAic2hhMjU2IjogImQzNjA5MWRlYzg1ZGYyODhlOGQ0N2FhNTU5NTcwNjA3M2Q2MWY3NjUwMGI0OThiZWQ1MGExM2NmOGQ1MmRhZmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzE1LAogICAgICAgICAgICAic2hhMjU2IjogImM4ZmE2NjhmOTQ4NzE1OTc3ZDlkMjRiNGJlZWRjN2I4MTE0NDA2ZDkyYzE1MDUyYTcyYzU0YThiMGQzM2QxODAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9hcGkvUHJvY2Vzc2luZ0RyYWluUmVjZWlwdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDkyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMjkxZjk5OGNhMmU0MDhiODJkYzMzMzkxOGYwMzI2M2E4YjI0ZDhkYmM0YWVjYjU3ZTJlOWQ3M2MwZDAzOWUxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1Nlc3Npb25TdGF0dXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU3OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NWMwNjFlYmVhYjFjZTFkNDgyMGU3MTE3ZDIzOWM0ZDAxOWQ5MGE3Y2M2MjVlZmQ5NjQ1MWQ4NGRkZTQ5NWU0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjkyMDExYmViMjk5OWNlMzZkYjU3MzNlOGY2YWY5Yzg5OGZhYmU3ODJkYThlNWQ4MTY0MGQ3YTU1YjZmZTE1YiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2FwaS9UaW1lbGluZUFwcGVuZFJlY2VpcHQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc0MywKICAgICAgICAgICAgInNoYTI1NiI6ICI5YzAwMTE2MjllNTJkNTRhZTg1NzAwZTZiZjk3OTc4YTIxYjJhZDc0YjAxYjQwYjBlY2M2ZmE1NDgxNjY3NDQzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vYXBpL1RpbWVsaW5lRW50cnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzU0MWE4MzQwZGM5YzdkNTY4NDY3Yjc2ODUzYWJjNGE3MGZlYWRmMWM0Mzc4NGY2Yzc2ZWNhOTc5MjIwZWMxMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0JsdWVSdW50aW1lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjM2NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIwNmJhMmEwNDEyNGEwYzlmMjJlNDQyMTEwYmRkNDU3YTU0ZWNkN2JkODYxN2RjN2ZkZjM2OWEwOTlhMTdlOWNjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ2F0Y2hVcEJhcnJpZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4ODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzI1ODZhZTcwOTVkYTcxMzY0NWZlYmE1YTQ0MTVmYzFmMWUwYjQ4ZjE2MTJiYmMwNWY0YTczM2Y1MDdlMjY5YSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0NoZWNrcG9pbnREb21haW5FdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhYWIzYjEyY2VlYzE4ZWYyYTI2Mzg4YmE2ZmZiZmRmZTlhODIwZTI1ZTRhNGRhYzk2NzRmNjg0MTRlNGVmNDlmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ29tcGxldGVuZXNzRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5OTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGNhOGY3ZGJhYTMwYWUyMjNhOWJhZTZhMTQ3NjM5NDE3MDdlZjg0MWVmNGYxOWI5ODg5ZjRiZmViMTQzZTU5ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0RlZmF1bHRDb29yZGluYXRpb25FbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMyMTE3LAogICAgICAgICAgICAic2hhMjU2IjogIjgxNjVjYjhmOGY5ZmJiYmNjMWZmN2JhMGRkMTBmOTYzZGI0YTQyZWZjOThkOTEzMTZiNGIxYmQ2MDQzNThhODEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudElkZW50aXR5UmVhZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODE3LAogICAgICAgICAgICAic2hhMjU2IjogIjVjYmY5ZGQ0N2IwYjc2MzdjZWYzNzA3MjFhNzY1MzZhMGNjZTg0ZmFmMDU1MWQ1NjY3NTc3MDEzZWRjYmI4NzQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFNlc3Npb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyODkwLAogICAgICAgICAgICAic2hhMjU2IjogIjMxMzExMzU3M2VmYTA5NGJhYjY1Njg4N2VlOTRhN2U5MjNjYWI5MzNmYzFmMDRkZWE1MmFiODYwZjJlZmQxZGUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9Eb2N1bWVudFRyYW5zaXRpb25Qcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2OTM2LAogICAgICAgICAgICAic2hhMjU2IjogIjFkZmZjYTE1MTI3N2I2MWNhZjhlZjM4NjBlYzY3YWFhMzc2N2ZkZDRiNDlmZDMwNDBhMDYyNjU5ZmNhMmQ3Y2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE0LAogICAgICAgICAgICAic2hhMjU2IjogIjY2YjAzNTc0MzVkMWU4ZTRmMWY4NjYzMzU1ODFkZTgwZmU3NGRkYzFiNzI0MmJjOTZhMTAwZTk3Y2FlMzk5YTMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZEVwb2NoQ3Vyc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmI2ZDU1ZTNhZjJhMTM2ZmJlMzhmOGQ5NzU3NGViYjE1MzQzNmE5NGIwNDM2Nzk0NTVkZWI5OTA2ODYwMTA0OCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkRXBvY2hJbnB1dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTk1MCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5YjI5OGM3N2VhMGU3NjJiMTExNzM1ZDQzYThmMDI4YThiZGQ4ZGU3OGM5NTVjM2RjOTlmOWU4YjBmMmJjYzRjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRMYXlvdXRQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3ODY0LAogICAgICAgICAgICAic2hhMjU2IjogIjc1YWUwNTVmMDI3MzIyZTIwOTNlY2JiZDhjNDg1ZDM5MzhlMDRlZDVkM2M0MDUyNGNkZmQyYjUxNGFhNDkzM2QiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9jY3VycmVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNTcxMGFlZTBjZTkyNmFkZjBhMWJhM2RiMDc5MDJlNjdhNGMxZjk0NzdkYjEzZDEyYWNhZjNkNjViNmUxNmU2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkZWRPbmx5TGF5b3V0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzQ0LAogICAgICAgICAgICAic2hhMjU2IjogImVkMDNlZTZmMWNhYzAxZjQyYzk0OGZmYTIxZWZlZDRjZjQzYjIwZmIwYjhiNTU0OWIyNjk0YmIwYjEyODlhNmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9FbWJlZGRlZE9ubHlMYXlvdXRCdWlsZGVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNjY2NCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNGY2ZTNhODg1MDI5MTYwMTJiNzQ4NWM0ZjEwNTczNGVlNGZjY2IwYzBiZTBmMzIyZWY1Y2EzZWM3MzI3MzdlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW1iZWRkaW5nQmluZGluZy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDQyMywKICAgICAgICAgICAgInNoYTI1NiI6ICI3MjQ5Njk3YzhlOGMzMzkzZjI4MTVmNTM3Mzk4ZTU1MzYyMGZlZGJkMTFiMmM2NzdhYTJlN2EyYzgzMTQ1YjU5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvRW5naW5lTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODIyNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIwYTUzZjU1Y2M0NDI5OWFhMDQ3MmFhZDBiNGU3MjFlYmIzNTQ3Y2I4YmQ1ZWI2ZDQzNjUzMTE2NDhmNjVjMGY5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSGlzdG9yaWNhbEF2YWlsYWJpbGl0eUNvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY4MywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YmFjZjEwZjA2ZWZjY2RmY2Q2NGU0YTk0OTJlMzU3YTJlNmMzNWU3YTg5ODgxNjg4OWE5MjFjNDMwYzNjM2UwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSGlzdG9yaWNhbFN0ZXAuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MjMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiODk0N2YxNWE2MTIxNGY5MmZkNmY0MzA2NzM5OTYxYTQ2Yjg2YzljMDdhMDM4YWU3ZGNjNTdkOWIzZGQ1MTQ3ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0luTWVtb3J5RG9jdW1lbnRTdG9yZS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTYzNiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMjI4NjQwYWY3MjkzODM5NTdlNWJmYzVhZjhlMzgzNjVjNTkxMTczODRhMWJmMjM2NzU1Yjg2YzdiZjQ3M2FhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvSW5NZW1vcnlUaW1lbGluZUpvdXJuYWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1MzE5LAogICAgICAgICAgICAic2hhMjU2IjogImIxODg4ZjE2ZDUzOTM0ZDc5NTBhMTZjMjdiOTQ1MjcwNDBlZWZlMmM3YjM0MmQzYzY0NTIwMWRmNWM0NTJmYjAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9JbnRlcm5hbFByb2Nlc3NPdXRjb21lLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTgzZGE0MjhkY2VmMWU4Nzk2MzdhNDBiMWQ1Y2ViMWIzYTAwMGQzYzA1OTU1YTE5YWRiNDRjOTlmNjEzNTA3YSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0ludmFsaWRBZG1pc3Npb25FdmlkZW5jZUV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzc5LAogICAgICAgICAgICAic2hhMjU2IjogImY3MWQ2ZTZhYjMwODllMzY2Y2ZhYmFiNzBmNjFmZGRhYjZlOTlmMjg5ZDhjYjdmZjRmODEzNjU1YTNlN2FhZWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9PcGVyYXRpb25Sb3V0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMzQ0NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2MGIyNDAzNWYyNjBiODc2NjJiNDFkNzQ3MjVkNmRlODM2ODhiNWI5M2EyZDViOWU3Yjg0OWZiYWNkM2FlMWJjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0VtYmVkZGVkR3JhcGhTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI1MTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWE5ZDg4YjkyNTA5OGU5ZmNlNzZlMjBjYWViYjliOTBjN2NmMjllMDMyYjBiNTI0ZmY2OGFjYzBmMDQyOTVlMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL1JvdXRpbmdTdXJmYWNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjc3NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTAwZGRkNjY5MTk2ZWJmMjAzNjI2NDg2MWRmODNkNTJmZjc4MTRmNzdlOGZhYmNmZDQ5NjIyYTA2NzhlMGY0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU2VxdWVudGlhbERyYWluQ29vcmRpbmF0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyMDM0NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJhNDg5NmY3MjkxN2M5Yzc2OTA0YTg2ZTc5OWNjYzNhYTM2N2YyYTlhYWE0MjYxYzQyNmVhNDkzZTA0MTA1YmYwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvU291cmNlU3VyZmFjZUlkZW50aXR5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MzgwLAogICAgICAgICAgICAic2hhMjU2IjogIjFhMjNiMzA1NDU1ZmJlMjM4MWYzZjk4ZWZmMDQ5NGVkNGJhMGIwZmU1YWNjNTAzZjFjYjU5YWFkNWE3NGJhZTUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9XaG9sZU9iamVjdFN0b3JlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDE2MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTVkYWMyZWJhMWZhZmRiYjA3MWVjMTdkNzI5YWUzMjc0MTgwZDdlNDJjMjAxZDRlMGFkYjExMTgwMzM0NDVkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvV2hvbGVSZXF1ZXN0RW50cnlGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1MSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDgxMmE2MjM4NTU1Zjk2MmIyZTQ5ZDMwNjdjNjBjMGUxNjFiZmIwYTM4MTRjZWRkYTg4Mzk5YWM5ZGI0MzE0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0FsbFRpbWVsaW5lc0NoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUyNTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzAzNjg4YzJkMjU0MjllOWVhMjZlMjlkMDQyY2NjZjUxYTYyZWEzNDAyYzkxYjNmZTJlZGIyNjNiZWY2MTczYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9BbGxUaW1lbGluZXNFeHRlcm5hbFN1YnNjcmlwdGlvbkZ1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODU3NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5M2RlMjc4ZWI3NmVmYmFkYTMyNjczOWUzMzA2MmYzZGUyZWJkMTdkZTJkYjQ5YjU0ZjhiZDJmMzhhN2IzM2JmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0JsdWVTZW1hbnRpY0lkZW50aXR5LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NDIyLAogICAgICAgICAgICAic2hhMjU2IjogImJmNzc2OTU3ZTZhNzhiZjEyZWFmNjBlMTY3YmJhM2JlYjc1MTUxYjY4NDViNmQ5ODk5MmM1OThiYTYxOTQ5NzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ2hhdFdvcmtmbG93T3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzg5LAogICAgICAgICAgICAic2hhMjU2IjogIjFlOGI2MGUxMDVjNDgxMTJmNDUzMzVhMzM3NzRjODcwMzEwMDQxZjMxNzI1MjM2YjJmZjdhNjU5NDM5NjM2OWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29tcG9zaXRlVGltZWxpbmVDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODM0LAogICAgICAgICAgICAic2hhMjU2IjogIjBjYjYwOGNmNmY3YTdmMWY3NDI3MGFjYzcwNzMyZWFlODNmNDFhYWRlN2NjZmVlNjYxM2Q5OGU1YmMyNjA2MDgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29tcG9zaXRlVGltZWxpbmVFeHRlcm5hbFN1YnNjcmlwdGlvbkZ1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODI3OCwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZWNiMGFiMWQzZWY5ZTdkYTgyZmFjMWY2ZDlkODczZTJhOTZiNzJlMGY5NjIyNTRlMWJmMjJkYWQ0NjZkYjM2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvbkJleEludHJpbnNpY3MuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNDUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmYzMzA0MTQ1MGIyYjRjZTQwYjRmZGIyZGNkMWMxY2Q5YTZmYmFjMmU2MDI1ZmI5OGY4N2FkZWY1MTcyYmM3ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25DdXJyZW50UmVwb3NpdG9yeUlkZW50aXRpZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYxOTksCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzUyOThjYTJiOTljN2NkNDU4ZTBhOTY5ZmI0ZjJhZTMwYjQzZTQwOTRhZGJjY2NkOTc4ZWNlMThhZWFiNmU1OSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25FdmVudE5vZGVzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzMwNywKICAgICAgICAgICAgInNoYTI1NiI6ICI1ZWZmMTU2N2NlZjZkMTFiYWJhMTZmZGRjNThmMGE4MGQ3ZjEzMmI1ZWYyMDIyMTMxNGUyN2VjMzM1MDI4ZmM2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblByb2Nlc3NIZWFkZXJCcmlkZ2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMTAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjk3YmNmYWE3OTZiOTFlODI0MGJjNDAwZTRjMmZjNzg1ODQxMWUwM2M4OThkZmQwNTljNTVlNzlkN2JjYThiZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25Qcm9jZXNzb3JPcHRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzQyLAogICAgICAgICAgICAic2hhMjU2IjogIjdmZmUyNTU3NjUwYWQ5ODE3ZjI0NzExNGJlODEwYzk0ZDU3YTQ4ZjdmOWMwZjgwN2RlZGM5NDY0OWVlNGYzZmEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUHJvY2Vzc29ycy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ4MjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDU0NzliZTI5ZTkwOTQyNjMyNzQ4ZjU2NjIzOWI5YTAyNjkzYWY3Nzg4N2UxMWYyN2Q3NmJkM2RiOWNmYTNkMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9Db29yZGluYXRpb25SdW50aW1lR2FzLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTY3LAogICAgICAgICAgICAic2hhMjU2IjogImI0N2I4NDk3MjNkMWZkNDY1OWRjMzdlNWE5NmZlYzJhODBhMjlhZTc2MDM3ZWZmNTg0ZjBlZDIyMDJlZGJjNzMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uUnVudGltZUxpbWl0cy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTI0OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNWI1N2JmNjg2Mzk5Mzg3NTkxNTkxNmM2MzgwZGUyYmQwZTgwNzU1YjM5YjQ5MDBmNWJlMjRlOTFlODhmMmFiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0Nvb3JkaW5hdGlvblJ1bnRpbWVSZWdpc3RyYXRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODcwLAogICAgICAgICAgICAic2hhMjU2IjogIjUwNGUzNGQ4MGMzZTlkYTczZGQwYjM0YTNjNGI1NGI5ODNiNzgzZDBjNDk4NWE3ZjEwNWMzZWUxNWE5MWQ5N2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvQ29vcmRpbmF0aW9uU2VtYW50aWNUeXBlSWRlbnRpdGllcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkyNywKICAgICAgICAgICAgInNoYTI1NiI6ICJiNWQ2MmE3ZmZmM2M1NzhjZGUzNjFhNzA3OTA2M2M0YjNjYzlhMjBmNTQ3MDRkNDRhOWQ4NzY1YjA3MmQ2NWQ5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL0N1cnJlbnRSZXBvc2l0b3J5TWFya2VyUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MDUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiM2RjYTQ1OWY5MWE5YjRjNTE5NGZkYTM0MDYxN2Q4MmViMjEyOTk0MDY5ODAxMjJiYzRiNzQ1Y2RiMzY3OWFkMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9IYW5kbGVyQ2hhbm5lbFJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDE0LAogICAgICAgICAgICAic2hhMjU2IjogImIzYTlkODM4MjE2MGFlNTRhYjIxNmZlY2VhMjRkNDkzNjU4MWJiZTQyYTc5Njg0NTYyODc5M2ZiOTY2OGI1Y2QiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjkwLAogICAgICAgICAgICAic2hhMjU2IjogImE3NmEzMWM5Y2E0NDVjOGJhM2ZkN2EyZGZkMzk2YWU4NjcyMzBmMDkxMmZkYTFlZjhjZWFmOGNkMzU5NjMyMDAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvT3BlcmF0aW9uUmVxdWVzdE1hdGNoZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM4NzAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTA2MDVjMWI2NzAwZTNiZGZjZDYwN2MyMDY1YjlkYmUyMTFiYjcyYmYzZGUzMDc0ZWE0NjM0YWZkNGJlYmM4NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9PcGVyYXRpb25SZXF1ZXN0Um91dGluZ0Z1bmN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTg1MywKICAgICAgICAgICAgInNoYTI1NiI6ICIwNTYzYzYzNmRlMzM5Nzk2OTczZTc0ZGRhNmExNzI3MmY1MzhlY2VjMTI1ZGEwYjNmN2RmMDVkZjMyNzU2YTExIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd0V2ZW50TWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyMzIyYzJmZGQyYmM4MGI4NTliMjY3Y2FlMTEzOWEwM2UwZWRmMmMwYzMyZDI4YjczODRkZjBhOGY4NmZhNjQ2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd09wZXJhdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjc4MywKICAgICAgICAgICAgInNoYTI1NiI6ICI1MDFmNWU4YmM3YTg0ZjQwNzA2Y2U0ODk1MmNjYjZjOTViMDU3YWVlZDljODE2MzQ1MDViMjdjZTdiNGM2ZjZhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1NlcXVlbnRpYWxXb3JrZmxvd1Byb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjcwOSwKICAgICAgICAgICAgInNoYTI1NiI6ICIxMWM5NzM3OWI3MmQ0NzA4MTFkMjAxZWUxMzhjYTFiNmY1NDE2NTczYTdlODM2ZDY4NzI4M2Y1MjFlZjM1YTJkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ2NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4YTE2NjFjZjM1N2FkNTg1ODA0YjMzMWQxYTE5NTRhMWFiNzk5ZDU3NmQ3YjBmODgzNGQzYTk4Y2RiZjY0MmJlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL1RpbWVsaW5lQ2hhbm5lbFN1YnR5cGVQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwNzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2ZGY1NWQ0ZGYzZWE3NTAwMzg1NDBkNWU0ZGE1MzMxNzc0OWEyZmE0NGE1OTgwNzc5NzBlOTMxNTM1ZjQ1NCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9UaW1lbGluZUV4dGVybmFsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NjkxLAogICAgICAgICAgICAic2hhMjU2IjogImVmZjI5MWIwZDUyNzk5ZTYwN2Y2MzgyYTM0YzJmNTE5OWI5ODY1ZmExYjU2MmRiY2I3NTBjZTJlYzE1NjFiMGMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVNZW1iZXJTdWJzY3JpcHRpb25zLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2NDE1LAogICAgICAgICAgICAic2hhMjU2IjogImJjM2I0ZWM2MzczNTA1ZGE4YTZiZTMyMDI3NGM4NWJjNzNkYmQ5ODQzZjYwYmM1Y2Q2ZTgwNzgwZGI5NTg0YmQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVQcm92aWRlclN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMjM3LAogICAgICAgICAgICAic2hhMjU2IjogIjRkODYwMjU4ZTQ3NTU5Nzk3MzAzYTQ2NGJkYzY0ZDRjM2JmZDU0NTNiYWM4YTQyYmUzZWM0ZmI3YjIzODAxYmEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvVGltZWxpbmVTdWJzY3JpcHRpb25Qcm9qZWN0aW9uLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMDI4NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI1Yjg5MzgyZmEyNjI0ZGVhYWViMzg1MThkYWIwMzRiOTU4NDBiYWE5MjQ5YmE1MzQ1MmMyODAzOTAzNGM2ZGU2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhQcm9jZXNzaW5nTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzM1MjksCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTdiY2Q3M2VkZDdjNGY3MmMwODlmM2NiMjdiMmEyYTlkYTVkY2JmOTc2NzAyNjUzN2EyM2EyN2Q4NDVhYzY4YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvQmV4V29ya2Zsb3dDb250ZXh0RmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogODAzMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI4MjkxNmIxODc0OWIzZmRmMzJhNTc5ZmY5N2MwMjQ3ZjUyOGY3NmFiODkwZjY4NmYxNmVhNjQ4NTkyMmQ3NmFhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2JleC9CZXhXb3JrZmxvd1N0ZXBDb250ZXh0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDIzLAogICAgICAgICAgICAic2hhMjU2IjogImQ1M2IwMDdkMTg0YjRlOGNiNWNkYzYxZTMxOGYwNzJlODM1NWI2MDE2YjQxNzg3MWMxOGE0NmJkMTUyOGVhNzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3IvYmV4L1Byb2Nlc3NpbmdFdmVudElkZW50aXR5T2JzZXJ2ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzNjYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzc0ODQyM2M0YmFjMTg1NDk4NTYwOTM3ZDdiOWZhZGEzOTEzYzdmYTk0ZmU3ZTc5YjExOTBkYWNiYjAwNTJmZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9iZXgvU2NvcGVkUHJvY2Vzc29yRXhlY3V0aW9uQ29udGV4dEJleERvY3VtZW50Vmlldy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTYyNTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTNkN2ZlNzA1OThiM2M5YjEyMTRlYzk1YjcyYjA1OWRlYzg0NmI5YzA5YjQ1OTMyNDAxNjM5ZmQ4MTI1NjlkOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci9zdXBwb3J0L0Nvb3JkaW5hdGlvbkJleEludHJpbnNpY3NTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NTE4LAogICAgICAgICAgICAic2hhMjU2IjogIjViMjhhNWVkNGE4YTkwZTY0MmViZjYzNWMzODQ5MTJiMDQ0OTY0ZjVmMzI4Y2EzMjEzNjVjNjI0ZjJlMWYwMDciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25Qcm9jZXNzSGVhZGVyU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzU2NiwKICAgICAgICAgICAgInNoYTI1NiI6ICJmNTdhZDdhYWM2NDlkOTMyZTE0OTE2YjgwYzA1ZTdmMTc5YWU4ZjljMmMyNzFlZGRhZThjNDdjNzEzMGViNmEwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3N1cHBvcnQvQ29vcmRpbmF0aW9uUnVudGltZUdhc1N1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE3NTM1LAogICAgICAgICAgICAic2hhMjU2IjogIjI3YTI4N2YxZDU5NmMzZWM5MDAyMmQyODRmMzRkMWJmMGJlNTQ0NzI1ODEwMTczMjBkNzE0MWEzZmJkMDcxYzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivc3VwcG9ydC9Db29yZGluYXRpb25SdW50aW1lTGltaXRzU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzcxLAogICAgICAgICAgICAic2hhMjU2IjogIjZkMzc5Zjk2YzVkODBlOTNlYjU4YjNmMTRkNDk1ZTIxNGRjNjAyYzNmZWU1YjI1NzZlMTIxYjAyOGIwZWNhOGUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZURlZmluaXRpb25SZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzAzNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzY2Y3NTc5MWY0NTM5NmM0ODgxNzlhNzExNWNhMDI2NDhlMmRhYjJlNzFkZTE3YWNhOGVmYTZiZGQ2ZGZkZmM5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVFZmZlY3RQbGFuLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNzg2LAogICAgICAgICAgICAic2hhMjU2IjogIjkxYTUzMDQ0NDY0OTQyOGNmNTlkMTAyMTk0YTViYTRmZWQxZWQzN2M2MDkwYTQwODQyMjQ1M2EwODI0NTRjMWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVByb2dyYW1Ob3JtYWxpemVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMjg1NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI1ZDJhNDI2NTJlYThkMDRiYTRlMjk2MDBiN2FiZWI2ODNkZGViNWYwNGY4NWRlMmY4OTY1ZjA0MGI2YTM4NWE0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtUGxhbi5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTQ3NywKICAgICAgICAgICAgInNoYTI1NiI6ICI3NDExOTQzYzczMjUwYTU1ZjJlMTg4NzBiZWI5YjljYjhhYTM5NjZmNDNhZGE0ZDYzOTE5YjliOWE3M2IzOWQ4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVQcm9ncmFtUGxhbkNhY2hlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4MDgwLAogICAgICAgICAgICAic2hhMjU2IjogImVjMzRlZjc2YjcxNTY0M2U2MWVjN2M2ZDE4MzliYjA4MTllYTgxOTI2YzY1MDU0Njc5YzNlMDIzMDg4YmY3YWMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVJlc3VsdEVtaXR0ZXIuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMwMzU1LAogICAgICAgICAgICAic2hhMjU2IjogIjM4Njk2OWE4YmI4ZThhZDZkYjYwZjZjNTQyMDBlNGY4MTU0NTA3NTg1ZTk5MzgwZTU5MjY1YTVjOGM1M2M3MzIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvQ29tcHV0ZVJlc3VsdFZhbGlkYXRpb25FeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMGI5ZDk5Y2QwZjhmMjI3MDAzMTY3N2FiNTU4MzFlZTRmN2I1YWZmMmE0ZjU2M2JmMzUwNWMzOGM3MmZlMzEyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L0NvbXB1dGVTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NTA4LAogICAgICAgICAgICAic2hhMjU2IjogImUyZGNmNjM5ZWZlZTY1MmUyYmFhZGQ1NDMyNjgwOWE5Mzc3ZTRlYjQ0NjI3NmRlYjlhYzExZmRlOTQ1YWViZjgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvRnJvemVuTm9kZVV0aWwuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM2NTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjJiYjgzMzZiNTU5NDY3MDEwMTRmNDNkNTBjNzRjZmQxNWI2NTEzODlmNmE2ZmJiMmMyNjg3MzMzYjdjN2E3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Ob2RlVXRpbC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjczOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkNTdkMThjYWMxZWJjOTUzNTYyY2I3MmU2N2U2YWM1OTIyNGYwNDRkOTFiMDM5NTU1NThmMGQ0ZDcyMjU4MzU2IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1NlcXVlbnRpYWxXb3JrZmxvd1BsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4NDc3LAogICAgICAgICAgICAic2hhMjU2IjogIjFmYmE5NmY0YmRlMWZjZGM3MjMyOWE2NTI5ODk1MjcwYzRiMzM2MGVlNGI2NzZkMWI3ZDdhM2VmOWU5MTI4ZGQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UGxhbkNhY2hlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Mjg4LAogICAgICAgICAgICAic2hhMjU2IjogIjRmYmI5OWQyYjI5NTA0N2Y1NWE1OTFkZWVkOWZkODIwYjg1Nzk5NDE2ZGM4MjM1OTNmOTFiNjgwMzkzYjU3YjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvU2VxdWVudGlhbFdvcmtmbG93UnVubmVyLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDEzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI4ODgyMDVjMmZiOGQwZmI5ZDI5NDVjOGQ4MTg1YWJiZWNjZmJkNTc3YjRhMGQ4ZTJkYzAyMTg3NjY5ZmZhZDExIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1N0YXRpY1VwZGF0ZVBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDk4NTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTczOWRkNGU1ZDZlZjQ2NjE3OTQyNDJhZmM2ZTIyOTE3MDhkYzBhNjFjYjE0NjMwYTE2NDI3NTBlNzgyOWFlNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9TdGVwRXhlY3V0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM4NDQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDZkZjQ5OWUwOTBiN2MwNzU4ZDNhODAyYzg1YWUyMWZhZGU0ZWYyYWRkOWY5MWI4ZjBkZjM0YTM3ZjA0YzU4ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9UZXJtaW5hdGVQcm9jZXNzaW5nU3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzgwLAogICAgICAgICAgICAic2hhMjU2IjogIjdjNjUyNWRkZTU1YmM1ODE4Yjc3MjU1NTUzN2I4MDVkZDVlM2ZhODQ3N2I0YWZhYTAxMTUzZmYyODQ4ZTFmMmMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvVHJpZ2dlckV2ZW50U3RlcEV4ZWN1dG9yLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0MDA5LAogICAgICAgICAgICAic2hhMjU2IjogImM0ZjA3YWIwYzBiYTJmMzllN2E4YzZmNDVlMzg2NjQ2NjcxZGZhODZhYjhlMjQwNWY4MWVkNGZiYzEwNDhiOTMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvVXBkYXRlRG9jdW1lbnRTdGVwRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyNzAwLAogICAgICAgICAgICAic2hhMjU2IjogImU3YjVhMjI0ZGIyOGYyMThjYjM0NTM3YzI3MTM2MWQwZmJjNzAxNDI5YjdmMDc2MWYxNjMzMGQzMDA0ZjYxOTYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dCZXhHYXNMZWRnZXJIb3N0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDIwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJhYmVlNjQwNWY4ZDliNmEwMzk0MzY2MGZmZDA2NDc2OTRlMjQyZjkwODZhY2Y0YWIzYzhkMTZiMDMxOTA3YjViIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL3dvcmtmbG93L1dvcmtmbG93RXhlY3V0aW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcxMDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmI3YzMwMzg3ZTJlMTAzNTU5ZDAxMGFkZmFlODA1ODU0MTc4OTlmZjYyNDdmZGM1ZTBmYzZiNGY5MjZhMWFjYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1BhdGNoRW50cnkuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEyMjAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDlmYWUwYjMyZDIyMDkzYmMyM2U1M2FkMGIzNzkxYzkxMzBkYjdmMzcxNzUwYjdhNzcyYmVlOGY5OGRhYTEzYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL3Byb2Nlc3Nvci93b3JrZmxvdy9Xb3JrZmxvd1N0ZXBFeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDMzLAogICAgICAgICAgICAic2hhMjU2IjogIjA5OTVmNTRhMWI4NTY5Njk4Y2VjNzI2ODQwYjBmZWI5MzA3MDRiZTQ2OTk4NmMwNjk3NmMzNTg3ZTAyMjEzYjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dTdGVwUmVzdWx0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM3LAogICAgICAgICAgICAic2hhMjU2IjogIjEwZTI5YmRmNmY5MDQ1NWE2Y2VlNWUwYzNkM2E2MmNhMGY1MmRiMjhkNDJlYWEwYjllMzJhMDNhZjM4ZWQ1MGQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9wcm9jZXNzb3Ivd29ya2Zsb3cvV29ya2Zsb3dTdGVwVHlwZVByb2ZpbGUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyODIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWYxNzg1NjY3YjAwOGFkMDQ2OTkyNTBlNTBjYTgyYzc0NGVjM2VhZDlkNGNlMzE1MmIyNmZkMzExZDljNTQyMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9jb29yZGluYXRpb24vcHJvY2Vzc29yL2Nvb3JkaW5hdGlvbi1nYXMtMS4wLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzUyLAogICAgICAgICAgICAic2hhMjU2IjogIjlmY2RjMjI1NjMxNTJjZGQ4Y2IzN2Y5ZWE3Mzk0NzdjZWQ1ZjdhOWUzMDg4YWVjYWYyNDY4MTJjM2EzYzZiYWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRDb2xsZWN0aW9uQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU2NzMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWFmY2FlYmNjMmE4YTg0YjM4MGM2NWQxYjlhZDNhNGE5ZWNmNzMzYjYxNjQ0MThmMWZiOWU3NTI3MTI3MTRmYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTGFyZ2VIb3N0UGF5Tm90ZVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTAyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlOGUwYzY5ZjUwZDE2MmRhNDZiMWM5NjE5M2ZiY2YwZmNmOGQ2OTI4MmNmODNkYzc4MjI1Yjc1NTA3NWM0ZGYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OYmFIb3N0TGlmZWN5Y2xlQ29udmVyZ2VuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDcwNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI2YzhkNGY2Y2RiNWRkNWMwZDgzYjA0YjFkODJiY2FiMzQ3ODY3NzVhYTQ2NDU4ZGY1ZTFkZmViNDIwYzE3NzZlIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OYmFTaGFyZWRHYW1lTGlmZWN5Y2xlQWNyb3NzSG9zdHNUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDU4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMTJhNTEzOWJiOTdiNGNkYTczOGM0ZTRlM2YzOTU5NjE3Mjc2OTQ5ZGRmYmQzYzk2NzMzODkwODFkODQzMmE5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWREeW5hbWljUHJvY2Vzc0VtYmVkZGVkQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDkyMzcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiN2JlMjk3MTVjZGJjMjZjNjI5YzNkZGEzMzgzNDA1YmUwZmNiNGNjZmE5MDdkN2VkMjM0MDk1ZTUwMzBmODU0YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRGV0ZXJtaW5pc21TY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg3NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjJjZmE2N2IyOGExN2IxZjhiMjRjYmM0Mjc2OTljN2ZjMTUxYzZjZGU4NThhNGMyYTgxOTQ0MTc1ZGU0OTg1MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUGxheWdyb3VuZEZpdmVPY2N1cnJlbmNlRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDM0OTUzLAogICAgICAgICAgICAic2hhMjU2IjogImUwYWQ2NWM3ZjFlN2NkMWU1OGVlZTFjNmNkMzFkNDkzMmFlMGI5MzM2ZDI5MTc3ZjZlMTNjZGMyNTRmNTk4MmMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUluaXRpYWxpemF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTI0OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NDE4MzZlM2ZlMjJjYmY0ZGY4MTRmNmRmOTljOTIwYWY1ZGE2YTRmMDhkYzUzZGQxNzJmN2FhODA1YTIxNDgxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEwMU5iYUZsYWdzaGlwU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxOTM2OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI3NzUzZmFlNDJkZDM4MmQyMTU1NjA1NzExM2JiYTU4YmE3NjJmZTVkMjRjZDMzMTA2NDA0NGIxNTg5YjM5NjgxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MzIxLAogICAgICAgICAgICAic2hhMjU2IjogIjk4ODg3ZTdiNDJiN2YxYzE1ZjU1MGRmZjcxNzhlZDI0MWJkNTNlNDRjODViNDcwMmEyYWJlMjEwNmY0NWMwN2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rob3VzYW5kRG9jdW1lbnRMb2NhbGl0eVNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjUzMiwKICAgICAgICAgICAgInNoYTI1NiI6ICI5MjUxOWZiNjkxMDhkYTMxOWE4YWRhY2E5MTUyNTdiY2U2NGJjMDVkYjk0YTk3MDQ2ZTNhNDJmNDg5NzAzNDNmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XYWRvd2ljZVBheU5vdGVBY2NlcHRhbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzE2NzUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2YjhlZTUzYzZjMzI4YzU5ZGMwMDkyZjM3NmJhNWQxNjY2MmRkOGE0MjA4YThiOTQxNWRkN2E0YmRhMmEyOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdEZpeHR1cmVzL2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZXJuYWwvQ29vcmRpbmF0aW9uVGVzdENvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMDI1LAogICAgICAgICAgICAic2hhMjU2IjogIjI3M2ViYzQ1ZDViNTNlNzIyNjVkNDRmOTllNTA4MTBmZmE2MjdlZDdiOWRiZGQzZmI1MmEzNGVjNmFjYjQ2YzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInNoYTI1NiI6ICIxNjkwZmVhZDM2M2E5ZmNmYWIwOTUxZDY4ZWI4MDc1NGRkNDM0ZjNjMGUzZTk2MDU5NzIyMjExODQwY2VlMDRlIgogICAgICB9LAogICAgICAiaGFybmVzc1N1cmZhY2VNYW5pZmVzdCI6IHsKICAgICAgICAiYWxnb3JpdGhtIjogIlNIQS0yNTYiLAogICAgICAgICJpbmNsdWRlTW9kZSI6IHRydWUsCiAgICAgICAgImZpbGVzIjogMTE4LAogICAgICAgICJlbnRyaWVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICIuY3oudG9tbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE1NywKICAgICAgICAgICAgInNoYTI1NiI6ICI5YTRkNjhhNjk5ZTc4ZmY2MDRjMmU5MDliZjZkN2VjZDgyYmQyMGI0ZjM2NWVhODVhZDY2NmQ4OGJiMWEwNjEwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzMTM3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICIzZjNlNDk0YjlmM2Q4NTEwZDA0MDBiN2MzODgxMTNhNWI0NGU3YTg0ODY2ZDFmMjU0NWY0ZjBiOGVkNTUxMzRmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5sb2NrZmlsZSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYzNjQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjlhNmUxOTk2Zjg4ZjA3YWU1NmU0YzcyMDQwOWMwOTI0NDBiYzZhZGExOTcxMjVhMGRmZWYwMTcyMmMzZTk0YyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUucHJvcGVydGllcyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0OSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmZDczZTkxMzE3YTU3NmJlOWZkNzA3YWQzNmNlZjJlZWI1ZmY1ZGQwY2JhNzExNjNkOGNjMzA4ZmE2NTgyN2MzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9iZXgtc291cmNlLmxvY2siLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDFjOTZjN2U3NmMxYTc1ZGQ2YTBkZmQwOTY1NmQ2NDQ5OTU3ZmIxNDRkZDM2M2Y3ODc1NmZjNTU2ODVkYjQxNCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvcHVibGlzaGVkLWFydGlmYWN0LmxvY2tmaWxlIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzkyOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJiNGU3Yjc4YmNkN2FlOTI5NTliNjFmODgyYTBjNzYyYTU2NDg0YTU3ZDhkNmExMzg4YzFmZmFiYjk2MmJiMTU3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS9yZXBvc2l0b3J5LXNvdXJjZS5sb2NrIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgICAic2hhMjU2IjogImZkM2IwNTUxMDhlZjY1YTdkNTRlMDljOWQ5YzYxOWMyMDhhM2UxZjc1MThiNmUxZjUxNGI3NWQ0MTYzN2ZmZjgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDg0NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAic2hhMjU2IjogImU3NGQ0ZjEwN2QyZmVhYjk4OWI5YTA0MWEwMmUyZDJiODU1NjdmZjQ4NDE1YzljN2FkZDVlY2MxOWFiZDE5ZjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldyIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDg2NTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTVhNWMxOTliYTAyMTg5YWU4YzQ2YTMzNDIyMzM3MWEyMDU5OWQ5YzI5OGVmNjVlNzU0MGVkZTRhM2Y3MmQ1OSIsCiAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzY3JpcHRzL3JvdW5kMTMtYWItZXZpZGVuY2UubWpzIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjU4OTcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTMzYzE3Yzk0ZjhjZWM3NjI5ODAzNzUwMDVlNzYzMmUxYTdjZDA1YjM3OGFkYmZkMzgzNzZkMmZlNzIxYmY1MCIsCiAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzY3JpcHRzL3J1bi1yb3VuZDEzLXNhbWUtbWFjaGluZS1hYi5zaCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMxOTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTk2MjEwNTcwNzA0YjMyY2FmM2EzODg2MDQ0ZjhmMWIzNGM2OTgyNGM3YmE0YTBmNDUxOGZlYTIzNTJjN2I1ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzZXR0aW5ncy5ncmFkbGUiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDAxLAogICAgICAgICAgICAic2hhMjU2IjogImE3Y2E1ODUxZjlmNjYzMjA3MWNlMTJjZjBmNjIwOThkOTk1ZWM5YWMyNDYyZWUwMDNhMTg3YzIzYjYyZGQ2Y2IiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2NvbnN1bWVyVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2NvbnN1bWVyL1B1Ymxpc2hlZEFydGlmYWN0Q29uc3VtZXJUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjg0NCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NGVlNzdlYjQ4YWQzYzQ2OTNhZTU3ZTgwZDFhZDI1ZTI2ZTQ3ZjcxZWM4MmE0OTcwMzQzOGQ2ZGIyZThmNDk4IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9BcHBlbmRBZG1pc3Npb25BdG9taWNpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMDExLAogICAgICAgICAgICAic2hhMjU2IjogImY2ZjE3ZjczZTg1MTg0ODAwYzExNjM0YTdlNjBiMDUyOGM0NTg1Y2Q3YjRjNDQyMjBiNGI3Y2VjZThiZjk0MTkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0NhY2hlU2VtYW50aWNQYXJpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ5NzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOWMxZTk2NWRlMzc3NDllZjdmMzY2MDdjZGFhZWI0OTYyYzJjMjllZjAyZmRkMGY3OGY1ZGFiOWE0ZDEyOGI2MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vQ2F0Y2hVcFBsYW4uamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxNCwKICAgICAgICAgICAgInNoYTI1NiI6ICIzODBiNDMxMjg5NzUyZjY2NjVjYTU5ZmRhMWYzMjU0Mjk3MzBiNWJiNjg0ZmZmOTQ0YmEyZGY3NDU0M2U0ZGVkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db25jdXJyZW50RW1iZWRkZWRDaGlsZENyZWF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY4MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMGEyNzNhZGJjOTljMGMxOGE0ZmM3ZmYzYTY0MDI2Y2I0M2MzODc5OThiNGFkMTA4OGMzZjIyODY2MzhmMjAxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Db3JlQmVoYXZpb3JJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjIxLAogICAgICAgICAgICAic2hhMjU2IjogIjJjOTQyZDBhNmJkODRkM2ExOTg3ZTM1MjY0MmU3YjQ0NDI3OTg4OTliZjRiNmUyMDI3ZTZiMzk3YmI0MDdiMWIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0RlZXBTYW1lRW50cnlPcmRlcmluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogOTg3MCwKICAgICAgICAgICAgInNoYTI1NiI6ICJlMjM4MjZhOTZlN2I1OTliYjdmOWZlZWY4ZTgwNzEyNWUwODQxN2FkZDgwYjQ4NmNkOWVjYzIzNjNkNjE4ZTI5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljSGlzdG9yaWNhbFNvdXJjZVN1cmZhY2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMzEwNDQyOWE3M2MzYTNiMjMyNTFiYzc5NDcyZjIwMzU1MGFhZTI4ZDBlODg0NzE1YjIzYTI5MGFkYTQ2YzkzYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRHluYW1pY1Byb2Nlc3NFbWJlZGRlZEhpc3RvcmljYWxQYXRoQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwMjAxLAogICAgICAgICAgICAic2hhMjU2IjogIjMyOGI2OWZjNzg3NzJiZmUwODhjNzRjYjY1MTJhNTY0YWNkNzZhNzM1MzAwMzAzYjk0MGViNTZmNWMwMmExMGEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0R5bmFtaWNQcm9jZXNzRW1iZWRkZWRQYXRoQWN0aXZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1OTMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTJiZmIzMjhhMjE1NjkwYmQ0NmQyZTBiZTAwYWE4YWE1ZWUyNTA4MzA5ZmEzYWUwZTUzNzYxMWQzYmY4ZDJhNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRFcG9jaEV2ZW50T2NjdXJyZW5jZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDY3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmODI4NzBlMzc5YmVjZWM4ZDk3YzlhYWJkOGU2NGVkMTYxZDk4OTU1ZjcxYzNjMTM5ZDc5NDc4ZGZmN2UyODFiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9FbWJlZGRlZE9ubHlMYXlvdXQuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0NDEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJmNTM5ZjdmN2FiYjY1Njg0NjM4ZWRmMmYyNzQ1NGMwMzk0MmQxYmU5MjZiZmIxMjUxNjA5YTVmMmMwNWJlMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW1iZWRkZWRPbmx5U3RvcmFnZVBvbGljeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUxOTIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTBhYmRiYTQwODk4YzdiMzJkNmE2ZTE0NDY3MTQ2NWQ1MGE0ZjU1NjE2ZmYwMGZhODBkYmRlNTEyNjYyMDc1MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRW5naW5lTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNDUxLAogICAgICAgICAgICAic2hhMjU2IjogImU2ZTI5ZGI4M2M3NjJiYjNlM2Y4ZDMxY2Q4MTM1ODI5MTYyMDkzNDQyNzkwZGUwMDk5ZDk5ZDI5MWJkM2MwZmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZVRlc3RTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MjQwLAogICAgICAgICAgICAic2hhMjU2IjogIjc0N2Y2NDc1YjViZWUzYWM4NTdlNjEwNmJlNGU0OTJiNTg5N2M2NTRmOGYwOThjODkwZTFmNGU3MTEzZGRkYzAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0VuZ2luZVRlc3RTdXBwb3J0TWV0cmljVm9jYWJ1bGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI2NzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOGVlOGU2MmJmMWJkYjA3YWI3MjhhNjExNDdkM2IyMzk5YzM4MDVmOWIzOTQwMGU0YzA3YjU1N2FlYjdlNTk4MCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vRXhpc3RpbmdFbWJlZGRlZFN0YXRlT25seUNhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0Mzc1LAogICAgICAgICAgICAic2hhMjU2IjogImJkZDk2NmVlMzQ0YjI0MDhmMzkyOGUzNmFlYWY0NjhhMDhkMDRmZmNiMWYzZGVkMDgwZjY5NTc0ODk3NTA4N2IiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0ZhaWx1cmVSZXRyeUF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyMjAxLAogICAgICAgICAgICAic2hhMjU2IjogIjY3MDczMGE3YzAxZmEwOTU0NTQyMDk2ZDlhODcxYmJmZTI3YTQzNDVmMjBlM2Q3YjFmZWViMDI4MjM0N2QzMTgiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0hpc3RvcmljYWxTb3VyY2VTdXJmYWNlSW50ZXJ2YWxJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDY3ODksCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2NmZjM4NWFiNjcyNWE0NjQyNzViZDA5MWY0NDczYWQxMTI5OTU0NTdlOTZjNWMxNTM4NmRkYmZhMmRhMGU1ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vSW5pdGlhbGl6YXRpb25MaWZlY3ljbGVFdmVudE9yZGVyaW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA3NzEwLAogICAgICAgICAgICAic2hhMjU2IjogIjE3ZmJkYmE0M2FlY2QzOGJkN2JiOTYyZWM3MmUzNDMwZGNiOTQxMDQ0ODRkMDIyNGY4ZGVhZGQ0NTY2YjI2M2EiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0luaXRpYWxpemF0aW9uUmV0cnlJZGVtcG90ZW5jeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5OTk5LAogICAgICAgICAgICAic2hhMjU2IjogIjgzYTZmMmJkMTczYzM0NWFiMDJhMmJkM2Q3NTM0MmZjMTMwOTlhYTU5YjI3OTEzYjc5NGUyMWQyYjYzNDYwMmUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0xhdGVBZG1pc3Npb25FbWJlZGRlZEhpc3RvcnlUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1ODkxLAogICAgICAgICAgICAic2hhMjU2IjogIjFlNmZlYzA0ZDVlMTVhMzJjODdlNzNkYzRlZGVhYzM4YWI1NTI3MTgxYjg4OTJjN2YxNGVhZjNlYzllZDc3NTIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWRDaGlsZENvbGxlY3Rpb25NZW1iZXJzaGlwTXV0YXRpb25JbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDcwNDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTg1YmQ5NTlkYWRkZTMwYjY3NjQ2NWZlNjMyYmEyNzhiMTk3MTVjOWM0ODIyNjQ0NWJhOGJkYmJiZjljYWM2NSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTWFuYWdlZENoaWxkT3duZXJzaGlwR3VhcmRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTMyLAogICAgICAgICAgICAic2hhMjU2IjogIjBhOTQ4ZWNlYzRjNmY2MDU1YWFhOTA0ZDY5MWRjNDYzYWQ1MzQ4ODU5ZTkwMGVmM2NjM2UxN2NmZWM1N2M5MWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL01hbmFnZWREb2N1bWVudElzb2xhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ0MTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYTRmZWIxZTI0YTI2YmJmOWUyN2I0N2RlN2VlM2I1NDNlOWUwZjk1NzI1NTMxOWU4NzNiMjcxZWJiMjNlZjE3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTXVsdGlDaGlsZFN5bmNocm9uaXplZENhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDQ4NywKICAgICAgICAgICAgInNoYTI1NiI6ICJlNzdkNTExNTJhZjc3YWM4YWM1OTZlZDlhMDVlZDcxNjg0NzYzN2EwMjYxNjNiMDIzYzI1ZGIwNzVlYTZjOTU5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9OZXN0ZWRFbWJlZGRlZENhdGNoVXBUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzU5LAogICAgICAgICAgICAic2hhMjU2IjogImNiZGFlMGY3NWViYmU2ZjYwMjVmOTliOTRhY2M3YjgyOWFkNGY2MThhMGVkZTgyMDAyYzM0MTI2YjJjMjgyMDkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZE93bmVkU2NvcGVQbGFuSW52YWxpZGF0aW9uSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA0NjcwLAogICAgICAgICAgICAic2hhMjU2IjogIjUwOGUzMTNlZDczMDEyNzFjNzdkMDVmMDMwOWYzN2RiMGQyM2UzMGZiOWZjMGU1NTM4MjBjZTk1ZDRjZDVkMmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL05lc3RlZFNpYmxpbmdHbG9iYWxDYXRjaFVwT3JkZXJpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTYxOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJkMThkZTgwZWM0MGQyMWYzNTZhOTBmYzM1ZDM4NTNiNzM3MzlkZmI1Nzc2YWYzZTYyZjJiNThjMjNlN2I3ZjkwIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Ob25TY2FsYXJSb3V0aW5nSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2Nzk2LAogICAgICAgICAgICAic2hhMjU2IjogIjMxZjgzYTRkMjdmNWIxZjNmNmU1ZTg4Mzg3MmExYTg1NmJhMGQ1YzhhZDExODQ1NzE5MWViZjMzYmU0OGY0N2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUNvcnJlY3RuZXNzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNDg3OSwKICAgICAgICAgICAgInNoYTI1NiI6ICI0NDRlODQ3OTRiNDgzMjI0YTViOWVkMjcyMDU4ZjU5NzA5Zjk0OTJlYWY3NjU4OGEwOTUzZGZkNDdmZTMxY2RmIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTc3MSwKICAgICAgICAgICAgInNoYTI1NiI6ICJmMTJlODkyYzIxM2JiY2Y3NGQwOWUyYjcxYmExZmU4ZjczMzI3ZWVhZDA3YWQzZmZkYTNkMzE5N2E3NGI1MmYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VSZXRyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYwMTUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjcwMGUzZDc0NzNiYjM5NTlkZGI0N2EzZWIyNzE5NWE3NTg3YWVjYzBkMzU0NWNlNzYyMjE3YzA5YTcyMDRiYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUHJvY2Vzc0VtYmVkZGVkQ29sbGVjdGlvblBhdGhzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NTExLAogICAgICAgICAgICAic2hhMjU2IjogIjRmYWE2OTExOGVlNWNhMGU3MDJlNjViZjRmMDgyYzNjMTY1ODg3ZWQ3Yzk3ZTdhODIwYmFjMWI4NTk1OGM5N2MiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1B1YmxpY1RlbXBvcmFsRmVlZGVySW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNTQzNywKICAgICAgICAgICAgInNoYTI1NiI6ICI1ODVlMjYxNzc3YTY2ZDU1ZTQ4NDU4OGRlOTNiZGRlNjkzYjUyMGQ5MjI0NmUxNjc5MWYxYmNhNjlkMDA0NjkxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9SZW1vdmFsQ3ljbGVBbmRSZWF0dGFjaG1lbnRUZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NDE4LAogICAgICAgICAgICAic2hhMjU2IjogImJhM2VkMzE4NWVhODM0ZjI5ZDgyMTQ2YjY0N2ZlNTQyZWE3MjQzZjI3ZGMwNjc3N2QwYWU3ZjUzM2U1ZmQ5MDIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JldHJ5U3RydWN0dXJhbENvdW50ZXJzSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NzMzLAogICAgICAgICAgICAic2hhMjU2IjogImJiMjliNjZjNzBiYTllOWRjZGUwNzI3MTJhYjc1ZDczMjRmNjZiNDc5NDU5M2MwYzFkZmFjYjJkNzg5YzQwZTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1JvdW5kMTBJbml0aWFsaXphdGlvbklkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMzk5NiwKICAgICAgICAgICAgInNoYTI1NiI6ICI0MGVkNjc2MGQwMTU0YzIzNTQ2ZDhjZGQ1NmM1NWZjMTBlYmI5ZTRhMjM4ZGJiZTY0MmE5NWQ4YjZlNTI4NDY3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9Sb3VuZDEyTmJhRml4dHVyZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjk0ZTIwOTBiNWI2YTFjZjI2OGQwMDIzZDc1ZGZjMTRkNGY2ZTUwZWQwNWMxYTdhOTFlZjE2MDE1MzZjMmNjMyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2FtZURvY3VtZW50SW5pdGlhbElkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjUwOCwKICAgICAgICAgICAgInNoYTI1NiI6ICJmYWYxMDZjMmYwMDFmOGExY2EzNzE4Y2VlZWFiYjdiMGNlZDAyZGM4OWQ3YWU1YTI3MjkwN2E0NDg5NjFkZWViIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TaGFyZWRNYW5hZ2VkQ2hpbGRUd29PY2N1cnJlbmNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDU0NjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZmE3MGIwNWQyYTQxZDFjM2Q0YTJlYzc1YjNmMTRmMWE0NmY1YWEyNGJmYzRhOWU5MjJkZjg4ODZhNTkzMmQ3NyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vU2hhcmVkTWFuYWdlZENoaWxkVHdvUGFyZW50c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE0MDAwLAogICAgICAgICAgICAic2hhMjU2IjogImQ5MTM0OWQwOGIwZGU4NDFjMTNhMzAwNjBlZTc0NDAzNDE5MGIxOTFmYjIxOWM3YWJhNmQxNjlkZWQ3YzczYjUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1NvdXJjZVN1cmZhY2VJZGVudGl0eUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjkzOSwKICAgICAgICAgICAgInNoYTI1NiI6ICJlZmNlMzE1Y2YzZmM3M2ZkNjFmMjBlNjc4MmRiZjI3ZDUzM2JkNzZlMWU2NjkwOWIyMGM5YmNlNjE0ZmYzODEyIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9TdGFydEFkbWlzc2lvbkF0b21pY2l0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4OTYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmIyY2NiNTJmMjAyMmI0NWVhZDg3OWQ0MzgwMGJlMzhkNTk5OWU4NGY4OTJmM2I2NTkwNDE2YzI2NDI3ZjQ2ZCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vVGVtcG9yYWxBZG1pc3Npb25Qb2xpY3lJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEzOTE3LAogICAgICAgICAgICAic2hhMjU2IjogIjFkNTMzNDFlZTRlMTBmYjQyMTIwNzFiMGRmNTBhMWVmM2FlMjg1ZTE3MWU4YTBmZWI2NDQ5OWU0MWRhNDE1NTAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNjU3LAogICAgICAgICAgICAic2hhMjU2IjogImRiODliOGI5MjdmODYyZmM1ZDFhNTBhN2RmMjJiZDNlOTViMzA1NDJiMzZhNTEyNjJhNjkwMGUzN2QwMTllMGEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1Rlc3RSZXNvdXJjZXMuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDYyMywKICAgICAgICAgICAgInNoYTI1NiI6ICJmMDA5ZTFmMWYwNmVlNzc1MzJkZDBkNGVjNmEwMDYwZDc4OGU2Y2MyNjkzMzJjNTdjOTc2NGJkNGIxMmNiZGNiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9XaG9sZU9iamVjdEZhaWx1cmVIeWdpZW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzgwMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJjNzhjZTE5N2Q5MmU2YzE4OGExZjJlNWNlY2NiNmI5ODlmNWI4YjdlNTY4ZWQ5NTc4NGVlNjA5ZTRjZTU2MzYxIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlcm5hbC9BcHBsaWNhdGlvblJlYWRpbmVzc1Byb29mSW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5NjY4LAogICAgICAgICAgICAic2hhMjU2IjogImU5ODc3MTEyNmJlZmVkY2Y4YmRjZTJiYmM0OGRiYTQwMTQ5MzMzMWFmMGMyZDgzMDViYTMzMmE2MmFmMzU4MzQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0VtYmVkZGVkUmVjZWlwdFJldHJ5SWRlbnRpdHlJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDc5NDcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjlkMTM5YjY1YTM2NmEwOTVmNTYxNmNmYzQyNzQzMGViYWM5NzE5MDVjOTg0NTYxZjNkZWVjMWI1OTgyMTY3ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9hbGwtdGltZWxpbmVzLXJvdXRpbmctY291bnRlci55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTAxNiwKICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTc0MjQxOGQ2NzcwNTE4NjY2YzczZTVkZjczZWU5OTdiNjQ1N2Q2NTI0Yjg5NzQyZmVlOGQwOWFmYzRkZTE0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2NvbXBvc2l0ZS1yb3V0aW5nLWNvdW50ZXIueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDEwNjcsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZTQ1OWRiMmNiODhmYWNlOGYzZDBiNTliOTY4YWFiNTUyMWYzNzg1MDZiOTdhYWQwYmNlZjdmOGQ5ZTJmOThhMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzgxLAogICAgICAgICAgICAic2hhMjU2IjogIjExZmE5ZmM3NTU3NmFlZDQ2NDY5MzI1YjAyNzc4MzNjZDkwNmMzN2VkMmM2NTA2NWMzYThiOTVhNTNlN2JjMmIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDczLAogICAgICAgICAgICAic2hhMjU2IjogImI1NGNjZGUxNDEzYzM5Y2JmNGQxZjViMzQ0M2UyZTM1OGJjNDRkZWI5Y2Q4N2M2N2M0M2IyNTdkMTc5ZTAyZDUiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LWExMS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNzEyLAogICAgICAgICAgICAic2hhMjU2IjogIjUzY2E3NGJlZTY1OGQwNTEzM2U0YWViNThiZmM3ZDlhYmI0YjkzN2I2YzAzMWQyZWJjODFjNDdhNWQxNWNhZGYiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZGVlcC1zYW1lLWVudHJ5LXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI4NTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ0NmU1NGI1OWUzZTA2NmU1MWMxMzNlYzM3ZGExMDEyMDFjODA4NDc0NmRhM2Y0MjE2YmRlYmYxY2I3NTVmYiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9kdXBsaWNhdGUtZXZlbnQtZW1iZWRkZWQtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzODE1LAogICAgICAgICAgICAic2hhMjU2IjogIjBkOGQ2ZThkY2Q0ZTkzMzZhZjBjMjY2NWNlMDA3YmY0OWIzMjE1ZGQxYzNiZmY4YmE0MGZlZTFmNDhlNWFhYjIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZHluYW1pYy1zb3VyY2Utc3VyZmFjZS55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTM4NywKICAgICAgICAgICAgInNoYTI1NiI6ICJhNmVlMzFlMDVhMDMxNWQ1Yjc2YzMzMTdlZWI4N2ZiMjAwMWJiMzUxMjc0ZDEyYTJmMTAwYzE5MzY0ZDc5YjlhIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2VtYmVkZGVkLWNvbGxlY3Rpb24tcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMjMyLAogICAgICAgICAgICAic2hhMjU2IjogIjU1YjQwMzlhMDZjNTEyMmFmMjY3M2E4ZGYwZmE0Y2UyNDk5OWEyNzJjYTBjOGQ5N2Q5NzExMzAxN2U1MTM3OTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtY291bnRlci1CLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2ODUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYzI3OTA5NGRiYzUxZTY4MDhiNTdkZjMyOTAwZDMwOTEyOGM0YTIwOGVkMWNmNGVhZDE4ZDNlNDI5ZTU3M2I3NiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1jb3VudGVyLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NjEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYjMxNmFmYjZjZmI4OTE2ZDM5YTdmZDcyMzg5NDllNGIwYTU4YjRkNzJhMGI0YjQ4NDE0NTllZTQwODk1MDEzZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1taWRkbGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2MzYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjhmZjAyYmE0Yjk2ZWNkMTVlNmEzN2E5N2M4YjBiZDgyM2RkZWI3NTllYTk4MDA5NzUyYzMzZmJiNDUzZGU5ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE4MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmI1OWNjMmVjMGNhYTk0MjUxOWQ4ZGQzYWNjODU1MWYyY2NkMzA0ZTBiZDYyNTQ2ZDMxNjY5NDE2ODQ5NGJmMiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9lbWJlZGRlZC1yb290LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNjY3LAogICAgICAgICAgICAic2hhMjU2IjogIjY4Njc2NjEzMzhhOGFhZDU3MmExNzVjZDJjMTc1ODMyMzI2MzhkNjMwZThmMWVkNzc3ODIyOTg1OWM4MmE3YzAiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vZW1iZWRkZWQtc3RhdGUtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAic2hhMjU2IjogIjFmZGIwNDJjYTA3NjM3MGE3MjhmZmY5Zjg1ZDE3ZDQ5NDNlMGEwMmI5ZWY2OWEyZWQ0OWY0YzMwZmQ5ODBmOGIiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vaW5pdGlhbC1lbWJlZGRlZC1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDIyOTgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNTVkZjIzMGQ2YmY5MmQyYmRiZmE2YjE4M2JjNGMyNTFmNmI5NzM0MDVmYjdkMGU2NjNmNGIwZjI5ZjdiNWJmZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9sYXJnZS1vcmRlci1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MTIzMywKICAgICAgICAgICAgInNoYTI1NiI6ICJmZWY0MWM1MzRhN2QxNzg1N2U5ZDE2Yjk2NDMxY2FhY2I4YmZlYmRhNDhjOWYwZDQzMTliY2VhNmUyN2RlMTJkIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL2xhcmdlLXBheW5vdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ2ODIxLAogICAgICAgICAgICAic2hhMjU2IjogIjcxN2JiYjZlYjAzYzBhOTE1MmEwMmJiY2VhMWZjN2Q3YmE4YzhjYWZkYmRmODkxZWYyZDIzYTdhMGUyY2EwYWQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLWdhbWUtaG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMzA4OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI0YjVkZGU1MGMwZjRjMjA3ZGYxNTY1YTIxZjIzMjM2Y2NhN2ZjMjM1YmUwZmJlYmFiNTE4Njc2ZDEyM2M4MjIzIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25iYS1nYW1lLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNzQzLAogICAgICAgICAgICAic2hhMjU2IjogImIxNDI3NmU5ZGM2YTRiNDY2ZjZjOGI1NzY4YWRlYTkwOGRlYmU1Y2YwZTgyNDUwNWZkZDA0NGMzYjYwZDMzNjQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vbmJhLXJvdW5kMTAtc2xhdGUueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQ1NDMsCiAgICAgICAgICAgICJzaGEyNTYiOiAiY2Q5MDFjNmVhMDFjZDg4ZDA3NmJmNmU4MDU5ZThkOWNhYjA3NzFhZWJmOGE5ZjE3ZTg2OWI0YjNmMTY2NzhmOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uYmEtc3RhdGlzdGljcy55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjA3NSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5OTVkOTBhMDhmOGUyYWE0NGE1OTA5Yzk2ZTdmM2NjNTUyNTFmOTZiYTlhZDY1ODk2NmZmM2QxZmZlOGEwZTJiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL25lc3RlZC1vd25lZC1keW5hbWljLXN1cmZhY2UueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE5NjIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZWM3NDk5OWQ0NzczYTdiMmIyOTVlNDI4M2ZlNDZiNjczNmFhZjllZGJmMjg2MTA2OTBlMjA4MzAzNWIzY2RlYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9uZXN0ZWQtc2libGluZy1oaXN0b3J5LXJvb3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDE2ODgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNjhlZWVjM2E3MzUwODg3ODdmMmQ1MTk3NWZjNTMwMmNlZjIzYjZhY2Q5Mzg4MWFlZTlmODA1MTM0YjYyN2E1ZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9vd25lcnNoaXAtcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyMTMxLAogICAgICAgICAgICAic2hhMjU2IjogIjg5NTUzZGI2N2IyM2MzZjhjYjFiMGFmYmY4NThhNTA4YzY3YWU3NTQwMDU4ZjZjZTJkMWFiZjExNDNjMmU2ZDQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vcGFja2FnZS1wYXlub3RlLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNTgyMCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiYjhjMGUxYmFhNjU3NWMzOWI2MGQ5NDc5Njg0NjYxZTY2YTg0OTljNDA4ZDc3MGRiZWUzY2NhZGZjYjRkOTY0IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3Jvb3QtaXNvbGF0aW9uLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA2MzQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNDJjMjBjYTkzODYzMWMyOWU0OWJhMDBlNTBhMzA3ZmY1MDY5OWUxOWYzNTQ5M2IxMDY4NTVmNmJjNTQ1NzU1NSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9yb290LWlzb2xhdGlvbi1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI0MjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMmZmNjdmMGRlM2EyMDYyZjM5NDRhMWI5ZjAxZGIyNWM5MmVkNzFlZjc4NDk2ZTk4NGE0Y2VmZTk5MDUxMGIyZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9jbGVhbi9zaGFyZWQtY2hpbGQtdHdvLW9jY3VycmVuY2VzLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTY2MywKICAgICAgICAgICAgInNoYTI1NiI6ICI3YjBhMmI3ZGY0YTViMTJjM2RkYzc5MDNhMWEzN2Q1MzAwZGE0MDg1NzAzMjk3ODdkMGQ2NmYwNGY0OGZhYWM5IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL2NsZWFuL3RocmVlLWNoaWxkLWhpc3RvcnktcGFyZW50LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxODM1LAogICAgICAgICAgICAic2hhMjU2IjogImRlNDBkMDk2NTMzNzhhYWMyNDA0NzgzM2RiMDAyMTk4YTM3MjFhM2Y0NGEyMjAzOGZhMzQ0YmVmMmY3YmIzMDciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvY2xlYW4vd2hvbGUtcmVxdWVzdC1zaW5rLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMTk1LAogICAgICAgICAgICAic2hhMjU2IjogIjA5OTg3NjAxZDM5YTI3OTdkY2ZkMzQ5OGM3MDI1YjUzNzMxZDljMjE4MGU5MzE3YjY0NjVhMTZiZTIwMmQ4ZjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcGxheWdyb3VuZC9maXZlLW9jY3VycmVuY2UtaW5pdGlhbGl6YXRpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNjc5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICJiMWU5NGMwMzlkMGZkMGRmNzBiMGM4MDNlYmU5MjFhMjkwZDE1OTBiYWM2OWE5MDczZmU0OTEwY2E4OTM5YjZiIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvZHluYW1pYy1jb2xsZWN0aW9uLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQyNzgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiYmIzY2U0MDdhNjAwZThhYmQ0MTU3YjMzYTgyOTU4MDc2YTYwNDI5ZGMyZjliMTRhOTBlNGNhNDI2ZjMxYTlhNyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2R5bmFtaWMtcGF0aC1ob3N0LnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyOTEyLAogICAgICAgICAgICAic2hhMjU2IjogImFjZWQ3MzRlYzVhZjFiYzIzMjgwNzRhZTkzZDMwNGJmOTU0MDBlN2RlMjZlMmVmYzFkZTg2NGFmNjQwYmE4MzciLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1kdXBsaWNhdGUtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDAwLAogICAgICAgICAgICAic2hhMjU2IjogImUwN2U5OGZkNzQ2YmMyM2I0MmUzOThkOTAyNmFjZGVjMjk3YTVhOWFkYzg2MTMxNGE2NGY5ZTc3OTNlOTY2OTQiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9pbml0aWFsaXphdGlvbi1ldmVudC1vYnNlcnZlci1wYXJlbnQueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMzNzEsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMjg3NTZiYzRiYjMzOTE4MjE5ZmJiNzE5NmFlNjQ4MzAxYTQ4MGFmMTlmMWY0MDM1YWIxODE2MTJkMzcyZWRkMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL2luaXRpYWxpemF0aW9uLW9yZGVyZWQtZXZlbnRzLWNoaWxkLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MDAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMDM5NDRjYTkzMzI4NzljZTY1ZjliNDA3ZDA3MTFhNjRkOTQzZTJmODExMDBkZGYwODdhODU1MjYwZDdlOGIzYyIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL21hbmFnZWQtY2hpbGQtY29sbGVjdGlvbi1tZW1iZXJzaGlwLXBhcmVudC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMjQ5OCwKICAgICAgICAgICAgInNoYTI1NiI6ICI5NzVlY2EzODI4ODkyOWQ3MzQwMTkwZTczMTBiYjQ1ZjcyZWMyZWEyYmQ1NTUzOTc2YzRhZWM3MTY1YzMxZGY3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9pbnRlZ3JhdGlvblRlc3QvcmVzb3VyY2VzL2V4YW1wbGVzL3JvdW5kMTIvbmJhLWxpZmVjeWNsZS1nYW1lLnlhbWwiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzMzg2LAogICAgICAgICAgICAic2hhMjU2IjogImJmMWI3OTk4ZGQ5MDY0ZjMyZjA0ZDJiYTI4NWI1YWZkNDQ5NjQzYWJmNzdmM2UzNTYzYjYwZjQ3MmUzZTkxMjEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL2ludGVncmF0aW9uVGVzdC9yZXNvdXJjZXMvZXhhbXBsZXMvcm91bmQxMi9uYmEtbGlmZWN5Y2xlLWhvc3QueWFtbCIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDQzMTQsCiAgICAgICAgICAgICJzaGEyNTYiOiAiMTJjZTQ1NWM2NDMwOThjMjhhZjRiYWY5MzU2YTRkMWQ2ODkzODA5YTJmODM4YzdiYjgyNzA0NDg1NjE0MzkwMCIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvaW50ZWdyYXRpb25UZXN0L3Jlc291cmNlcy9leGFtcGxlcy9yb3VuZDEyL25lc3RlZC1keW5hbWljLWNvbGxlY3Rpb24taG9zdC55YW1sIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogNTE4NSwKICAgICAgICAgICAgInNoYTI1NiI6ICJhMGY1Mjc5YjkzNDE5N2ZkZjI2MGIzZTBkMDhiMDZiNmQyNGFiZjgwMDRlMDJjM2IwOWM2ZTM4MTdhZTEwNDljIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9EeW5hbWljUHJvY2Vzc0VtYmVkZGVkQ29sbGVjdGlvbkFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA1NjczLAogICAgICAgICAgICAic2hhMjU2IjogIjlhZmNhZWJjYzJhOGE4NGIzODBjNjVkMWI5YWQzYTRhOWVjZjczM2I2MTY0NDE4ZjFmYjllNzUyNzEyNzE0ZmMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL0xhcmdlSG9zdFBheU5vdGVTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUwMjUsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZThlMGM2OWY1MGQxNjJkYTQ2YjFjOTYxOTNmYmNmMGZjZjhkNjkyODJjZjgzZGM3ODIyNWI3NTUwNzVjNGRmMSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmJhSG9zdExpZmVjeWNsZUNvbnZlcmdlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTA3MDYsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNmM4ZDRmNmNkYjVkZDVjMGQ4M2IwNGIxZDgyYmNhYjM0Nzg2Nzc1YWE0NjQ1OGRmNWUxZGZlYjQyMGMxNzc2ZSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmJhU2hhcmVkR2FtZUxpZmVjeWNsZUFjcm9zc0hvc3RzVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTQ1ODAsCiAgICAgICAgICAgICJzaGEyNTYiOiAiZjEyYTUxMzliYjk3YjRjZGE3MzhjNGU0ZTNmMzk1OTYxNzI3Njk0OWRkZmJkM2M5NjczMzg5MDgxZDg0MzJhOSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vTmVzdGVkRHluYW1pY1Byb2Nlc3NFbWJlZGRlZEFjdGl2YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA5MjM3LAogICAgICAgICAgICAic2hhMjU2IjogIjdiZTI5NzE1Y2RiYzI2YzYyOWMzZGRhMzM4MzQwNWJlMGZjYjRjY2ZhOTA3ZDdlZDIzNDA5NWU1MDMwZjg1NGMiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZURldGVybWluaXNtU2NlbmFyaW9UZXN0LmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiA4NzYxLAogICAgICAgICAgICAic2hhMjU2IjogImIyY2ZhNjdiMjhhMTdiMWY4YjI0Y2JjNDI3Njk5YzdmYzE1MWM2Y2RlODU4YTRjMmE4MTk0NDE3NWRlNDk4NTEiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3NjZW5hcmlvVGVzdC9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVncmF0aW9uL1BsYXlncm91bmRGaXZlT2NjdXJyZW5jZUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAzNDk1MywKICAgICAgICAgICAgInNoYTI1NiI6ICJlMGFkNjVjN2YxZTdjZDFlNThlZWUxYzZjZDMxZDQ5MzJhZTBiOTMzNmQyOTE3N2Y2ZTEzY2RjMjU0ZjU5ODJjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9QbGF5Z3JvdW5kRml2ZU9jY3VycmVuY2VJbml0aWFsaXphdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDUyNDgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzQxODM2ZTNmZTIyY2JmNGRmODE0ZjZkZjk5YzkyMGFmNWRhNmE0ZjA4ZGM1M2RkMTcyZjdhYTgwNWEyMTQ4MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMDFOYmFGbGFnc2hpcFNjZW5hcmlvVGVzdC5qYXZhIiwKICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICJzaXplIjogMTkzNjgsCiAgICAgICAgICAgICJzaGEyNTYiOiAiNzc1M2ZhZTQyZGQzODJkMjE1NTYwNTcxMTNiYmE1OGJhNzYyZmU1ZDI0Y2QzMzEwNjQwNDRiMTU4OWIzOTY4MSIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAyNDMyMSwKICAgICAgICAgICAgInNoYTI1NiI6ICI5ODg4N2U3YjQyYjdmMWMxNWY1NTBkZmY3MTc4ZWQyNDFiZDUzZTQ0Yzg1YjQ3MDJhMmFiZTIxMDZmNDVjMDdjIiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgICJwYXRoIjogInNyYy9zY2VuYXJpb1Rlc3QvamF2YS9ibHVlL2Nvb3JkaW5hdGlvbi9pbnRlZ3JhdGlvbi9UaG91c2FuZERvY3VtZW50TG9jYWxpdHlTY2VuYXJpb1Rlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDI1MzIsCiAgICAgICAgICAgICJzaGEyNTYiOiAiOTI1MTlmYjY5MTA4ZGEzMTlhOGFkYWNhOTE1MjU3YmNlNjRiYzA1ZGI5NGE5NzA0NmUzYTQyZjQ4OTcwMzQzZiIsCiAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vV2Fkb3dpY2VQYXlOb3RlQWNjZXB0YW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAic2l6ZSI6IDMxNjc1LAogICAgICAgICAgICAic2hhMjU2IjogImNhNmI4ZWU1M2M2YzMyOGM1OWRjMDA5MmYzNzZiYTVkMTY2NjJkZDhhNDIwOGE4Yjk0MTVkZDdhNGJkYTJhMjkiLAogICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3RGaXh0dXJlcy9qYXZhL2JsdWUvY29vcmRpbmF0aW9uL2ludGVybmFsL0Nvb3JkaW5hdGlvblRlc3RDb250cm9sLmphdmEiLAogICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgInNpemUiOiAxMDAyNSwKICAgICAgICAgICAgInNoYTI1NiI6ICIyNzNlYmM0NWQ1YjUzZTcyMjY1ZDQ0Zjk5ZTUwODEwZmZhNjI3ZWQ3YjlkYmRkM2ZiNTJhMzRlYzZhY2I0NmM3IiwKICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgIH0KICAgICAgICBdLAogICAgICAgICJzaGEyNTYiOiAiY2FmNDg5MjFlN2QyMzE5YTk2ZDgwYjg5M2Q0NjVmMDgyMGU2NDU1MmYyZjFiYTE2MTdkMDU2YzQ3NmFlNjBlYSIKICAgICAgfSwKICAgICAgInJvdW5kMTJOYmFFdmlkZW5jZSI6IHsKICAgICAgICAicGF0aCI6ICJzcmMvc2NlbmFyaW9UZXN0L2phdmEvYmx1ZS9jb29yZGluYXRpb24vaW50ZWdyYXRpb24vUm91bmQxMk5iYUV2aWRlbmNlLmphdmEiLAogICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICJzaXplIjogMjQzMjEsCiAgICAgICAgInNoYTI1NiI6ICI5ODg4N2U3YjQyYjdmMWMxNWY1NTBkZmY3MTc4ZWQyNDFiZDUzZTQ0Yzg1YjQ3MDJhMmFiZTIxMDZmNDVjMDdjIiwKICAgICAgICAibW9kZSI6IDQyMAogICAgICB9CiAgICB9LAogICAgImNvbXBvc2l0ZURlcGVuZGVuY2llcyI6IFsKICAgICAgewogICAgICAgICJuYW1lIjogImJsdWUtYmV4LWphdmEiLAogICAgICAgICJwYXRoIjogIi9Vc2Vycy9waW90ci9kYXRhL2JsdWUtYmV4LWphdmEiLAogICAgICAgICJjb21taXQiOiAiM2ViZDJkOTNiZTdmMjRjZTQ0ODQwZjBhYmEwMmIxYzQwYzI3ZjVmOCIsCiAgICAgICAgImV4ZWN1dGlvblN1cmZhY2VNYW5pZmVzdCI6IHsKICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBLTI1NiIsCiAgICAgICAgICAiaW5jbHVkZU1vZGUiOiB0cnVlLAogICAgICAgICAgImZpbGVzIjogNTgyLAogICAgICAgICAgImVudHJpZXMiOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuY3oudG9tbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGQzMTdmYmUzNjI1NjFmMGU5ODI3YzcwNWZmNjI2MGZkNmRmMjZjMTY1MThlMGFjY2U5OWVjYmE1OTVhNGIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmdpdGh1Yi9zY3JpcHRzL2NvbXBhcmUtaW5kZXBlbmRlbnQtYnVpbGRzLm1qcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzk0YTBmZjdkNjc1OGJlZDNjNTZhMzEwYzcyYzlhMGVmNjBmMDk1NzBmMzMwMjM2YmU3ZDQ2MzAwMmE3ZWFhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5naXRodWIvc2NyaXB0cy9jb21wYXJlLWxvY2FsLXB1Ymxpc2hlZC1ldmlkZW5jZS5tanMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkNzBjNGY0NmIxNzIxZDljZDRjODk5OTYyMDhkNzMwNjgxNjcxMDc4MTI0ZDFlNDM5MWExMTFkNmQ3MGFjNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuZ2l0aHViL3NjcmlwdHMvcHJlcGFyZS1yYy1yZWxlYXNlLmpzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzU1MzM0MTI5MmQ0YjM2YTI1ZTRlOTk5ODg4YWI3NjA0OWRjYzllMDY4NmU5YzRjYjFlNmY4MjUzNmMxOGQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmdpdGh1Yi9zY3JpcHRzL3J1bi1maW5hbC1wdWJsaWNhdGlvbi1nYXRlcy5zaCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDEyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImI3ZDA0ODU5YTlkNGViOWRmNGMwNThjODQ4MWJhMWNkNTZhYjU1OWI5OWYxNDA0Njc4NzZjZjMxODgyMWM0NTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb25mb3JtYW5jZS9idWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGU4ZTU4NDNmZTJiOWYzNzA1Mjc2OGIzZGRmY2Q2YTc4OWQ5Yzc5NWQ1ZDA4OThmZjc2OGNiNWNhOGU2NTM1ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvbmZvcm1hbmNlL3NyYy9qbWgvamF2YS9ibHVlL2JleC9iZW5jaG1hcmsvQmV4QmVuY2htYXJrU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYTVjYzU1Y2FhNTliMzkxNmUwOGE5OWI1OTIwYTExMDY0YzhhZTgzNTM1ZTQyYjNiY2JlMGY3MDA5NTRiMDYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29uZm9ybWFuY2Uvc3JjL2ptaC9qYXZhL2JsdWUvYmV4L2JlbmNobWFyay9CZXhDb3JlQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk5MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmZmNDkzZGNhZTRiY2M3MTZiMzhiNDliMTc0MzgxN2Q4MGRlMTM5YWZlOTQ4YmQ2NzYyOTU1ZDJmNTc0Nzc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29uZm9ybWFuY2Uvc3JjL2ptaC9qYXZhL2JsdWUvYmV4L2JlbmNobWFyay9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MGVlMGFmNGEzZTBhNzJmMDkzN2IzYWUwM2VjNTQ1YzU3NWVlYzlhMjJiZTVkZDMyYTAzMWY4ZmZjYzU4YjFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29uZm9ybWFuY2Uvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0JleEhvc3RlZEdhc0JlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDE3MjlkYWJlNGY4MmI5ODAxMzRlYWE4YTllNDgxMGFkZmUzM2NjNTZkMzg3N2FjOTdjMmY2YjU5NjFhYzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS8uZ2l0a2VlcCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvbnRyYWN0cy9idWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImZmNTllMTNhNzQ5ZDRiMmU1MTE3MTBlZDc3MTU4YTRlOTFkN2ZiMzI4ZTUyODY0NzA5YjU5M2I2ZGY1MTUzNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb250cmFjdHMvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb250cmFjdHMvQmV4Q29udHJhY3RzRXhlY3V0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODQ1OWRhYWQ5ZjczNzgxMzlmM2M3NWU4Y2IyMDI3NjVkOGRkM2I3Nzk1M2JiYjVlYTE4YjM0YTc0Zjg4YWI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29udHJhY3RzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29udHJhY3RzL0JleENvbnRyYWN0c0ZhaWx1cmVCb3VuZGFyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZWVjYzBmODgzN2Y5NmYyMGYxYWM3ZTMzZDc0MTdkY2FlZWQyZDNkZDY4YTQwYTU4MDY2ZmFmN2Q2YTZhYmNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29udHJhY3RzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29udHJhY3RzL1Byb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHRCZXhEb2N1bWVudFZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE5OTY4YWM5MDAzOTE4ZGJkZGZiYWE1YzZiNmQ5ZTNhOTcwMGNkMWY2NzFlM2FhN2QwZDEyOGQ4ZTZlZWZkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvbnRyYWN0cy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbnRyYWN0cy9Qcm9jZXNzb3JFeGVjdXRpb25Db250ZXh0QmV4R2FzTGVkZ2VySG9zdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDg0OGJjMmU0YWUzNDdmMjlmOWEzODM4MTA2MzczZDk1ZWRmZjU3Y2JlMTMzNTJkMjM0OTQ2YjY3YjZiMTAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29udHJhY3RzL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29udHJhY3RzL1Byb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHRCZXhTZW1hbnRpY0lkZW50aXR5Qm91bmRhcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODU4MzYzOGNkZDliODU2MmIyN2E0Y2QxMTRmNGFjZWYxZWM0ZjQzNmI2OGJjOTNhNzdlOWJhZDZhZjg2NjZmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvbnRyYWN0cy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbnRyYWN0cy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NWI4ZmRiMDU2MzhlMTNlZjc0ZmI3YWU2MzllM2UyMGRkMmQzMTY2YWU0Y2M0ZDhjMmM5YjQ2ZWM3Mzc4N2UzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9idWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3ZjQwYWQ3NmZiYTRjZTUzNDM5M2JiN2RkNWIwYzJiZDIxZDcwZjFiZGZkZDJkYzljYmMwZmFlZGQ0MzJlNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvQmV4RXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmZmRmYjkwMjAxYWM3ODM0Mjc2ZTQ2ZDFlOWE0YjIzYTdjOTE3NzE3NjBiMTBjZGIyZjViZmYxYjcyMzYyZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvQmV4RXhlY3V0aW9uRXZpZGVuY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNGNmYzYxM2RhMDc0ZmRlNjFjZGQxZDExOTJmMTY1YjExNGJlNGE1MmJmYzhmNDkxZGIxYTFiYjNhNTkxZGNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L0JleEludmFsaWRFeGVjdXRpb25FdmlkZW5jZUV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkNjA1NWViYjkxMjFlMDFjYjJjNWM0YzA2YWEzZTRmMjIyMTgxODY4NTA0Y2RjNjhiMWJmZTA2YjBmZjVhOGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvQmV4U291cmNlUGF0aC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YmJlYzZiOTM5NmZhZDkyMTYwNTZlZTc5YjA3ODdmN2M4ZmZkODAxODlmZjY4MGE5ZWUxZDNlODkzZTUzOWIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhEb2N1bWVudFZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTQ5NGE1YjQyNDAwYTk0ZjQ2YjU4OGNkNWFkMGIzMWJhOWViOTJmOTIxMzE1N2MxZWMxNjQzNTdlMWMyNTI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODMwODUxMzg1ZDZhNzMwODlhYzYxMDYxMDZlZWYzOWUyZmM0YWI5NDljYTRhYjMzNDgzM2IzOWNjMTdmY2UzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4RXhlY3V0aW9uQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyOTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU0ZTg1MWE5YWJjZGVlOWViMDc2YzNjZGJlNWE0ZDg3N2I2ZGUzM2IyNzQ2N2JiYTRiYjM3YWJjYzljM2M2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4RmFpbHVyZUJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNTViMTM5YmYzMWFjZjY5NTc5Y2JiYmUyNDE0YTM1MjFkNGYwZDE3OTY4ZmNhMzAxMGViNjkwNjkxYjVlMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleEdhc0xlZGdlckhvc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzRmMWYxYTIzNjVjYWQwY2VmYTgwODhkYjMyOTI3YWFkNGI5MGNlZDRjYzFmMWVhMzEyNGYyZDBmMGQ5ZDM2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4SW50cmluc2ljSW52b2NhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOWY1YzRkZmFjZDU0ZGQ3YThhNzcxODM4YWNhNjEyNjg4NmQ2YTZjMGI1YjMyZDBmMWQzZDAxNGMyNzIwY2FlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhJbnRyaW5zaWNQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYjgzZTBlOGZjYzIzYTAyMWNlOWEyNWE1MGNiNzcyNzkzYjc4MmY4ZTAxMTQyMDg2NjZmYWU2MjQzNGYwMGZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhJbnRyaW5zaWNSZWdpc3RyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQwNzRiNThiMDA4ZWI2MmY0ZTg2ODBiZjY2M2ZkYTk1MzgzMThlZmEwODdhM2IzYTM4NGIwZjI2ZmE1NDBiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9hcGkvQmV4TWV0cmljc1NpbmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTJjMDQyYTIwNmI5NjUyYmIxM2ExYzFiZDgwMDQyMDhjZTAzY2RiMjdlMjM3ODI5NDUyNzNjYjIzYWU5ZTlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9CZXhQcm9ncmFtU291cmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmNDQzN2MyY2JlYTk2M2JhYjBjNTQxMjY5ZWI2OTdkM2M4NjhhMGM1N2I1NDhjY2U2NDU0ODc2ZTU2M2Q0ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleFN0ZXBSZXN1bHRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxMWE5YjEyM2VhOTg2YzA4MWFiNjllNzYwZTZmODY0YmU2NWQ1MWFkNWQ5NTg2OGY1ODI2OTJmMTIxNTgyM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0JleFR5cGVCbHVlSWRSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwMWE0ZDc5NDQzMzNjZTEwMWEzZDhhNDVlMThmNzIxZDg5NmQ3ZTdiZmYzOGQwMWU5NzAxYTliMTNiODM1OTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYXBpL0Zyb3plbkJleERvY3VtZW50Vmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjY2MmU5YjMzOTc5Yzg4NWMxZDlhYjFjOWJlNTVkZmEzZWU3Y2JhODVhZGJlZmQyM2EwODU0NjlkNzBhNGRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2FwaS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzE5MmFhM2NhYzM1Y2RhYWFhYjM3YWU5ZDRmYmRmNGMzNTgxNGM5OGMxNzkwYmI4ZDNmYjE0ZDE1MDU5YjZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29tcGlsYXRpb25JbnB1dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlOTZiYzdlYmIwZTdjYWZhNjI2OTc4ZjM3Yzg4Y2NjYjgxZDMzMDg5YjBjZWQwODIxZTI4Yzg4Y2NiZTM3MWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlZFByb2dyYW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3Njc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQxMGIzMTU3N2E5MjU3NGY1Zjg2ZDQ2MzllYmJlOGVmZGFhMjA5OWQxZmVhMTdhMDE3OWNkNzU3YTYzOTYwOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleENvbXBpbGVkUHJvZ3JhbUNhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2Y4YzAzZmEzODZhMDE5NzRmNDU4OGIzYzFlOTllMWIxYTY2YjBlNGVkZTU1N2ZjNjM4MTBmZmQ3ZGRkNGIwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleENvbXBpbGVkUHJvZ3JhbUtleS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjAxMmRjOGZiMzIzMTM4OWIxYWIyNzc0ODQxZGE1OTYwNGMxNjFiMTJiNTk0MjJkYjc5MjkxZWZlZDJiNDYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29tcGlsZWRQcm9ncmFtUnVudGltZUFjY2Vzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmZThjMjgzMDhmNjI4OGQxNWRmNzdmMTM5NTczMGNlYjVhMTg5MjA3ZDM5N2ZhOTllNDNlMWMyMGYzZDE0NzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4NzUzZjMwMDMwNzk0MjI1ZWVkYzJiNzllZjViYjczZmNmOTk4MjIzMWEyYTJlMzA3MzJhMWRjZmExZjJiMWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlclJ1bnRpbWVBY2Nlc3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YmNkNzUwZjExNjk2YmYzMDVlNDZjNjQ2OGFmNjE5ZGNkZDU1OGQyYzJkYTc2YmU2MzNlZmI1OWNkZmJkMTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29tcGlsZXJTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjdjY2MxMDI4MGRhMmViMDlmNDdiNjFiM2I0OTQwNWVlMmMyNDE1M2NiYzk4ZmQxNGFhMGViNzkzNGZjNTE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29udGFpbnNDYWNoZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNjVjZTJlNWFmYWQ0NmI1NjBiYWZiMDVlOGIzNjMzMGRiYWNkNmZiM2U5YTI5OWRiNzc4NmViOThjOWU1Y2Y5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4RXhlY3V0aW9uTWFjaGluZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOWMyMjQ3ZWFlYTQ5NTcxOWE4YTUxYzE2NTFkM2VhMjBiZDU5OGIyMTNmNjA0N2NhMTQwZGQ0ODE1ZGRiYzQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4RXhwcmVzc2lvbkNvbXBpbGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc4MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDliMDhmZjYxMTZkOWViZGUzNzRhMmQwODA3ODczODIzNTYzY2YwMWJhNTU4OTgzZGIyMmMwOTVlZDk0ODIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4R2FzV29yay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmI1YzIxN2Y3ODA2NWZmMmRlMGNhYWViMWUxOTI4ODY3Y2ZlOTY4N2EyYTlmOTU5YTIxYzRiNTQyZTMwMzRmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleEdhc1dvcmtTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkwNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MmU3YjE3ZDdjY2RmMWE4Y2Q0N2MwNmQ2MmExNDYyZTA1MTMyMzk1Mjg2NjA5MjdjNTE0ZTJiYjUxODRlYjRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4SW50cmluc2ljQ2F0YWxvZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImIwOGJjMjg0YWE5NmFmMzM1MmMyNmE5M2VhYWQxMzU2ZWUyYzQ3ZDZjYjBlZDk3YTdkY2UwYjI2ZjU5ZGUzOTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhOb2RlRmluZ2VycHJpbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjZkNzM0YTA5ZGQzYTFkMGYzZDA5MDA0MmU3NmY3ZTVjYzM4Y2VlNGFhMWNiMWFhOGM2NGVjY2RlMDQ4OTc4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0JleE5vZGVJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2NGQxZmMzNzY2YmI2N2U1ZThkNGRhODY2ZWM3MGI4MmIwNjdiN2UwMWZmMDIwZTUyYTNhMmI2ZTc5NzFlMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhPcGVyYW5kcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzU1YjEwODA2NDU0ZTMxYWVjNmJkMjZjYTc3NzRlZGMwNWRhZWJlMzA4ZDNjNDYxZWJmMGM5ZDAzZDg3YmE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4T3BlcmF0b3JDYXRhbG9nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZjMzZWYxNTM5ODZmZWE4ZTRkMDhiOGU0YmE1NTdmNGUwNWZjOTk2NDE2YTQxYjg2M2E5NjFmZmIzNDYzZTA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4UGF0Y2hFbnRyeVBhcnNlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNmMzNjhhZmUyOTM2YzRiNjJjMThkNmE3ZGEzNzYzNzc4OWNiOGMzZjE4ZmVhZTY4OTA5MzJmMjI5MWFlODA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4UHJvZ3JhbUNvbXBpbGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDA2ODNiZmU4OTliMDgxNWIwMTgxOGU2MGI1YmQxNjdkMzE5OTEyMjhjNzBkYjQ2YWVkNzIxNDk5OTNlNzU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4U3RhdGVtZW50Q29tcGlsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjM4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0M2JlZTFiMzM0ODY3ODQyMjE0YjdlMjE5ODI3YThhMTVmN2Y0ZmQ3ZTYwZjdjNWYzZjMzMzY3YzhhNjFmNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhTdGF0ZW1lbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZDE1YzZkMDQ4NjAzYzdiZDJlMDIwZWI3MDllNzMwOTZlNzlmYjRlNTc3OGNhNDAyYjBmZTIxYWY3NmFjMDQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ2FsbEV4cHIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ3ZDU0MWI1NzE2ZmM2Y2ZmNmU1YzliODNkYjZiYzRlZjIyODU4OGEwOWU1YjIzYmY5N2Y3MTlkNzM2N2U2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0NvbGxlY3Rpb25FeHByZXNzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmU5OWUxYzMwMjZlMjA2YzUyMmUwMjUyMjc1MmRiY2VhOWVmZTk1MjBkZTAyNDM5N2ViOTdlMTQ5NjA2OTNiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0NvbXBpbGVTY29wZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTQ5YzM2MWE0NjI1NDVlYmVkYzhkODk2YmVlZGIxYzVmYTk5YjAxZTE4Mzc0MzgyZDI2OTZhMGU1NzRjY2FlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQ29tcGlsZWRFeHByZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGU0OWY2ZWIwNjFiM2Y2MTY5MjEwMmUxYWRjZDc5NGZlMWUwMDk4NmFhNDFiNzNkOWE0ZjFiOTljY2QyZjIwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0NvbXBpbGVkRnJhbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWE1MGU3OGUyOGNiYjZhNTUwMGFhN2RlNjUzY2NjZTI4ODZkZGQ0MWNkNTA1Y2ZmM2E2YTM1MWJlMWU4MjU0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0NvbXBpbGVkU3RhdGVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDkyYzNmNzg0OWQ0MmE3ZGVlOTBkODk0YTNiMTlhYjU5ZjY2MDYwODA5ZjNlYzVmNTI4ZTdjZjhiZTFjYzZmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0NvbnN0cnVjdGVkRXhwcmVzc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZhNjE2ZGRhMzgyYWM2ZWQzZDkxODg2OGY5M2I1ODljZDAwZDgzNDdiNWJkMTI2ZTIzNTljY2EyYmQzZDRiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0NvbnRyb2wuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmRlZDJhMWM4M2ExYzNkMzczOTliYTNjZmE0YmE2NTQ4ODBiMmMzZGY4MTc0ZDg4ZDYyOGQ2NzEyNzVjZTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvRXhwcmVzc2lvbkJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDc4ZjBlZWUxY2NlMzBhNWRiOWI5ZWIyZjk2YWIyMGQ3ZGMyNTk3MjI5YTlmNWE3OGE0ZjAzNDdjOWEwMDA2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL0xvZ2ljTnVtZXJpY0V4cHJlc3Npb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljN2ExYWJlNTAxYjQxYTE3MjI0NTEwOWE4Y2ViMzI4M2NiZjk5MDE1YzM5NTM1MzdiNTE5M2FhM2VjMTZhMGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvY29tcGlsZS9McnVCZXhDb21waWxlZFByb2dyYW1DYWNoZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzkzNmQyYjJkZjU5MzkyNThkYWMxM2YyYTI0MWQ1OWViNzA5OTg2N2I0YzNjNWU5NTRkYTc1YjgwZmMzY2I2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvT2JqZWN0UmVzdWx0RXhwcmVzc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGJkNjg5YzczYjAzY2M5NmE5OWQ3OGM2MDJkNGMxMjM2N2I2NTU2YTIwZmVjZmRkY2M5Y2QxZDgxZDQ3YjJlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9jb21waWxlL1JlYWRFeHByZXNzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOGNhY2M4OTcxZjU5Nzk2NTQzNmNjYmNjM2NlYjQwM2E5MDZhYjJiZWFkZGI5MmM0ZmExOWQ0MjhjYmJkNzcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvVHlwZVN0cmluZ0V4cHJlc3Npb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYmE4YTlmYWI5NDcwNGMzNjc2YzNjODIwM2JkMDM4NmZiYzBlZDM1ZmE3YTBmMzczMDEyNmU3ODg2MTQ0ZTA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGJjMTk1ZjhhZGMwZjgzNDEwNmUzYjRmYzFmNjE4ZTJkMGMyZWMwMDc1Mjk2NjhlYTQwMzExYTRhM2Q3MDVhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzQWRtaXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmYzVjNDY2MTBhYWM3ZTg4ZWU3NGFkNDZiM2E5OTI5NWI3ZDZhNzFjNjQ0MzkxYTNlMjkxMGJhNDIwNjhhZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0J1ZGdldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTA1MTc1ODQzYjQ0ZGU0Y2E0NjdmNDNkMjBmZmRlZjNlYjVlNDIzMjBkNDkwZGNjYjI2YjI3YjZhNGIxMjk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNDaGFyZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY4NDY2MDQzY2M4NmEyNDFiY2JkNDYxNjUwMTE4YmQxOWE1YjBlZGE5MDgxOTM3NDkyYjBlYTgyMDBiMDAwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzQ2hhcmdlQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOWU2MTI2ZTZlYmJjMWZmNjMzMmQzNzI3ZTJiMjRjMzBhYmUzODVlNWRlZDA2MWJkYmEwMTgwYzE5ZTE2NWM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNDb3VudGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDcyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2YjhkNDdjNzRhMWI5Yzk2MTA0YmVhNzA4YWExMDlkMTM2Njk1ODVhZDgyYTc1ZjI3NThhYWVlMWY3MzUxZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0NvdW50ZXJDYXRhbG9nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwMjgzNmEyZTBhNGQ2MzMwZWI3YmFhZTJkN2JmYjMxMDJhMTFkOGYwY2UwMzkxZjVhMmMwOWEyMjVjNTBkYWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0hvc3RTZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODA0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjZjhmNGRlYzFjOThmZDJhYzQ5NDllOTgzODIzN2NhNzg0NTI3YTlmZjBmNWRkZDk2NmMxNGU3ZTQzOGY4MTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0xlZGdlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzM2VlZDM0NjRiYThlYzdiNDllZjNkOTE3ZjZhNDdlOWUwYjNlODI1MjQ0ZjIzZGY2OTBiZWRhOWU0YzM4MDBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNMZWRnZXJDYXBhYmlsaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWZkMmRjYTE0MGU3MTcwZjg5ZDUzOWVlNTlhMzZhMmY2ZjEyYThjY2QyM2MyNzgxZWI1ODlhZWM2MjE0OGMxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzTGVkZ2VyTGlmZWN5Y2xlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2NDM4Y2I4YWJkM2E2OGEzNjA3OWYzZTY2NzE1Zjg2YTkwNWIwZGQxNTJlYWUxNzk3NjFkZjAyMWVhNWI5YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc0xpbWl0RXhjZWVkZWRFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzIzY2NiZmVhMTY2OGNlOWVmMzkxYzc5ZGYwNzA4NTlmYTBmZmZjMjE1NzgwMjE1NDkzMDA0MDc0OTJlZjcyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzTWFuaWZlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGUyNmE4NTIxN2NkZDE1OTE3YWFmODAzNmUxMDU5YWE1MjlkN2Q1NDM3MDM0ZDdiNjVhNmY4ZWE4NmU4M2EwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzTWV0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjMmNmMDlkZWQ4OTA0NThlMTE3N2NlYjEyMDUzNjNhYWU0NGVkZmRiYTliZDY1ODAwODY2ZTVlNjhhZmFlMzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEdhc1NjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOWU0N2M3NDhlYTNiNjEyODk2YTZkNGRjNTFmNjQ0NzA3ZWQ0ZWY0ZDhmYTUyYmM5ODM1YzdjYzU5MDI2MDE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2dhcy9CZXhHYXNUcmFjZVJlY29yZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiZjVmZDhhZDJmOTMzN2Y5YTQwNjc3YjRjZmUzZjc0N2ZjNDQ1MGUyMGRmZjk3ZTc2MGVlZWY0NjZkMmFkYTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleEhvc3RHYXNFeGhhdXN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkODg0ZmZlMzNlMmQ4NTFkZDQ4YjA2NmFlNTk5ZDhiZWY4NjY4OTdiNTM3NGM3OTIwZjAxMmUzMGVkZDRhYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL0JleFNoYXJlZEdhc0J1ZGdldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjMmQ2ZDc0NmRjOTE4NWQxZDFiMTFjN2ZhZjkzYzUyMmVlZjlkMDJiNmM2NjQzOWJkNWIzZjhjNzNmZDZhMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvZ2FzL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzYjYxNWZjMGQzYzQ4ZWVlZDc5YTNjOTFmOGI0Y2U3NDdjYzA5ODRjYzI2Mzc5MTMwNDlhNGE0ZGM3OWRiZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvb3V0cHV0L0JleEFkbWl0dGVkVmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNjY2FkNmNmMGZlYjBkZGQ1YWYxNDdmZDBlYzVhMzM0OWJlOGQzMDFlNjJlNDA4NWM1YTQ5YmQ5Y2EyZDAwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9vdXRwdXQvQmV4RXN0YWJsaXNoZWRJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNTkwNzc4Mjc3MWE3M2M2MGI0ZjBjZDMxYTdkMTg1OGNhNGMxZWRkMjU1ZjA1ODJiMWY0ZTcxZDc1NDRjMmQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L291dHB1dC9CZXhGYWlsdXJlUG9saWN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5MjU3YzljMTRmMzUzODc2ZGZjODgxN2FmMjAwNDk2MzAzYjlmM2Y4ZTFhZjY4ZGM0MzViMDQwNGY3YmZmZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvb3V0cHV0L0JleE91dHB1dEFkbWlzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDcwZWY5YmY3YmM4ZjVkNzI1YTE5Njc2OGYwNzhmOTFjMWE5ZTRmMGQ4OWI0ZWM0YjQ0MjQ2ZGI3MGMyMWM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L291dHB1dC9CZXhPdXRwdXRLaW5kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTg2YmE0NWFiZjE1YzhlODNkODU0MzNlNTA2MDhmNTllNWEzN2RiNTM5N2Q5MTgxMjMzMjU4NGU5OWY5OGVhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9vdXRwdXQvQmV4U2VtYW50aWNJZGVudGl0eUJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjhhNGQ4M2ZiM2M5NzE4NTYxN2YwYTRiZGVmNGQ3OWE5N2ZjZmJhOTAyOGM0MzIwYjA5OTMxNjM0NTA5ODFkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9vdXRwdXQvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzIyOTZmMTdlZmUzNzlmNWFiMGYzYWYxNTgxNzM4N2UxODZiYzU2YzkyNjYxMGNkMWY0YjcwMDE0YTM0MWMyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyM2ViZGVlNDA1NTY5YjljOGZlMzkyY2U2OTcwZDAwMTJmODZhNDVlMmQ4ODFhNTFmZGYzZTJmZTVjNmIwMjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3BvaW50ZXIvQmV4UG9pbnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmI4ODY4Y2QyZTE1ZjBhYmYwYWI0MDY5YTdmNDQ4ZTZlNDhjYmUxNmUzMGNjZWNhNzVjZmMxOTkwNmEwNzk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3BvaW50ZXIvQmV4UG9pbnRlckNhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2ZTJjYTQ4M2NmZmFiYjcxOTRhNmU2NjlhZWMwNzRiNGRkOWRkZjQ3ZGMwNDExMTYyNTMwZjJhZWYwNTQzMWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcG9pbnRlci9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDMxYTdiMGE3OTBlMmQ0MTVlMDdhOGJhMDNkNWVlOGYyYTZhM2U2ZDdmMjQ5MGVkZTNiYzA4OGE3M2ZjNmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3Jlc3VsdC9CZXhDaGFuZ2VzZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M1MTI2NzNlZGZlMTA1YzRkYzE5YmQ4MDk1ZTJjYmUyZmVhYWZlOGEwOGUxMTM1ZDRjMDE1MzhlYWIyMDJiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9yZXN1bHQvQmV4RXZlbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmNjA3NGViYzg0MzQ2Zjc4NTM1OGExZmVjMzZkNWViZjdjYTdhMWFlNWM3Y2FkZTAzZjFiMTU4YjJlOGM3NTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L0JleEV4ZWN1dGlvblJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzc2YmI4ZTFkNzAwMDJhYWU0ZTE4NzcxYzhkZjUyYWZhYmRmZmMwYTFjMTRmYjIxMjE4ODBmNTgwZDZlNGYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3Jlc3VsdC9CZXhNZXRyaWNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzZDY3Y2Q2YTQwN2FiNzJjNTU2Yjc5MmM2MzFlNGFjN2I3ODExZDIxNTY0YmFkZmFmMTFkYTc4ZGQ3N2QxODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L0JleE1ldHJpY3NSZWNvcmRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMTk0MDFiMDhmNTg5ZmVjYzQ2MTNhMmI1M2EwM2ZmOTgwZWEyNzNkMmU4OTYzYzYxZDM5ZmE2ZWRiOWRiZjdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3Jlc3VsdC9CZXhNZXRyaWNzU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA2MDAwNzRlZTEzNTU3OTRlMWNhMjljZDVmMmJmMWQ5ODZiOWZjOTNkN2JhYTliYjAxNDJmNTU4MzFlYjMwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9yZXN1bHQvQmV4UGF0Y2hFbnRyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOGVmZTI0ZWRjZmRlZTQwZTVlZDJhYTA4YWRiMDVkZDQ1YThiNTYyOWQyZDAzNDJlMTU2N2M0N2RjMjUxMjBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3Jlc3VsdC9CZXhSZXN1bHRPdmVybGF5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwZTA3NGRmN2ZmZDA2MmIzN2Y5MTAyYjRmMzllMDQxMTNjYmUwNTFjN2I3MTk0ZGQxMmVhMjJiMThhODE0NDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcmVzdWx0L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVjZTUxZWMzMTZmNjE1NDBlZGM0Y2NiMWNlMjVhYzBhMDgzYzQ4YWZjZjJjZjFiYzdjYmRkZWI3YTFmOWNkNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvcnVudGltZS9CZXhFeGVjdXRpb25BY2N1bXVsYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNTdlNGU0ZDBhNDRmZTM5ZTgyNDlmYWZjYmZmZGQ1ZDQ0NjAxNjk5YTRjNGM3MDVjYjQ1ODFmYzUwNTQxYTdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3J1bnRpbWUvQmV4UnVudGltZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjg5Njc4NTA2ZTZmNDA1NzkxZTczYjBhYjM4MjFmODJkNjUxOGNlODhlZjg3OGYxNGQ4MDBiYjIxZTEzMTdlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9ydW50aW1lL0JleFJ1bnRpbWVDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNiZjlmNTcwZWUyOGIwNDY5MTk0YWNiYWEwYWEwOGE0NmI4NDI1MDUyNzdiN2Q0ODlmN2FjNDNjYWNjNDMyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9ydW50aW1lL0JleFJ1bnRpbWVHYXNTZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYjc3MmRjMjg4MzlhYjBlZmJlZTMxYWY1NzhlMDkwNzVmODQ1Y2ZmYzllYjNkZjMzNjg0YzhhNDRjNTc5NjYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3J1bnRpbWUvQmV4UnVudGltZUludHJpbnNpY3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJmMzBmZTIxODZmMzAwMDc3NDNkOTNiMjg0OGQ2MTU0NDZkNWFmYTcwM2NkOGQ1NTY3Y2U1ZTE3YWNhYjc4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9ydW50aW1lL0JleFN0ZXBSZXN1bHRWaWV3LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDAyMjExZWI3YjlhYjA3NDdmMTY3N2ExZGQyZDM0ZThmNzdiNzU4ODllOWNlMTQ2YTYwZjkxYWViY2JhNjNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9ydW50aW1lL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlMzc1NDI4YTBmNjM4MTkxZWZjZGY1NWQyZTE2YmQyOWFkMDdlMzFkYjU0ODUzZjVmNmE3YTUyYTA1OTBlYmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvc3BpL0JleERvY3VtZW50QWNjZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE4MjNiMmU3MDljMzAzOTdmNTZmNTE3YTBiMDcyYmE0ZDg5YTcwMTczZjVkNmFkOTM2ZTQ4ZTQxYTg2MTcwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC9zcGkvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDQxOGFmYzVkNGVlMjE4NjgyOTQ1ZDVjYTA5YzNiNjZjMTA2NTUwYWMwMmM2YzYzMTEzZTdjMDUxYzRjYmNmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC90eXBlL0JleEJsdWVUeXBlTWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0NzI4ZThlMjMxZmVkOTRhNWIyODlkZjlhODYyMTkzZTYxYzQ5YTYwMmI1MGQ4MTY5OThiNGI5YWRjMmI1MGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdHlwZS9CZXhGcm96ZW5UeXBlTWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNDM5ZDI4ODBkZjU1NzJmYTAxNmZhN2NiNjJiOWQ2ZTU0M2FmNWY0MTc2YmU3MWIwNjE4MTBhMGVmNTU3NTc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3R5cGUvQmV4UGF0dGVyblZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzcxZmU4ODNhMzM5OGNlYTRkNDRhODgzM2EzYmFlNzUxNWRjOWVhZThhNzMyNjBiNThiOTI5MWY1N2ZkZDEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3R5cGUvQmV4VHlwZU1hdGNoV29ya1JlY29yZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiYzgzYzViNTZjYTE5ZWUwNGI5NDdlNmEyNjIyNDZiM2ZiMTVkMWY5ODZjMjFmMmRiYjQ3YjZiMDQ1NDZlMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdHlwZS9CZXhUeXBlTWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjRlNzAzMmM2NzM2YzEyMmEzZmY0M2UyNmFjM2JjY2Q3MTBmYTkwOWUxMzM4NjJmMmQ0OWQwODIxNGI1ODhiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC90eXBlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmNGM4NzRmNGFiNWYwMGIyNTEyODI3OTQyNGJmYWQxY2ExMjM0ZjNlMTliOWY5NTAxMTljY2FhM2IyOGJlMjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQWJzdHJhY3RCZXhWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNjNmNjkyMjZmY2U0ZDBkYzdiM2ZjNGJkN2MzN2QwYjUwY2YyZWE5NDVhMTI5MmQ1MTQwZjM0YzM1YmJlNWQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0FkbWl0dGVkRXhhY3RCZXhWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzQyYTE5OTcxNDNlY2ViNzI5ODlhYmI4N2E3MWNkNjU4NzhmYWFiYWM3MGZlYThlNjU1ZGI3YWIzZjY5YTc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleEJsdWVOb2RlV3JpdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2FlMDMyNGFkY2EzOGViZGI5ZTZhNTliZmRkMmE5YTAzZWRhZWM3NjRlNjViOWJhMzhjMjgxMTE2MTEzOWNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleEJsdWVWYWx1ZUltcG9ydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyMmQ1ZWZkNmJhNGZkMmZhYWJlNTA0MmJiNjFmMWEzOTRkYjYzMGE1ZGYwNTA3MzEwOTQxZDk0MzIzNzFkMWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4Q2hhbmdlc2V0VmFsdWVWaWV3LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjVmYmI3N2UwYzc4ZjFlMGY3MGMzZmMwMTk4M2VmODdkZDFkYzM0YWU3ZGU0NDI1MDA1NDI4OWY5ZThkZDA0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhFcXVhbGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YzViZjQxNzhlMWE2YWQ5ZDk3ZGVkMTU0NmU5MjE0M2E3N2ZkNWU4ZDY4OGYzMDhjNTgyMmQzYzIzOTM5MjE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleEV2ZW50c1ZhbHVlVmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzMzMyNThmYTdiYzg4MDg4YzI4NjY5OWEyNzUxMDQ4ODVlNzI2OWM1N2NjYjI3YjY4OTg0OWQxYjAyOTg1MjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4RnJvemVuV3JpdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1MGEzZGI3OTM2NTNhMjNlZjE2NDZhYTRiY2UzYWZkYzkwNWE5MDBhNmY4NzM5YWYxZmFmM2VkYjNhM2YyMjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4Tm9kZVdyaXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyNmRkZTdlOTdmZmJlMmM4MjFhZWYwNjRmM2M3OGMyYTRlYTM1NzVlMjQyODllOTFiNjNmMWFlNjZiM2ZmZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4UGF0Y2hWYWx1ZVZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTVmYjRjYjBkNTI0MTgwMDY3MDM0MDJkMDZmN2I4YzQyMWM5Y2UzZDc3NjM3YmU4Nzc1NDk2Njc4YjdiNmRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFNpbXBsZVdyaXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjg5NjYwYzU4NDE0NzBiMGE5Y2RhYjc4NTY2YTkyZmVkM2U3NWMzMDdkNjNjYWY0MWVmOGU3ZTJjMDI5NGY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFRydXRoaW5lc3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZjc4YmIwNjUyYTI1OGM5ZTM2NDdlZGNmMjljYTVlNDU1ZTI1MzA2MGNhOTE3NTcxYTY4YzA4N2I4NmIwOTgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFVuaWNvZGVPcmRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjhiMDcyM2YwNzZlNzRmYTY5MGU5YzdlZGM0MzY5NWQ1ODU4ZGI5NDhjNWU1YmE4YWMxOTllNjY3MWY5N2E0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExZjk0ODJkMmEwOGE4M2FlYjgxNWJjY2U1NWQ4OTJkYzM1Y2Y2ZDc2MzZiMWRhYzkxMmUwY2ZiMzNkMzBkMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvQmV4VmFsdWVLaW5kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTUwNjIxMmViYWRlYjU3NDgzYWY0NWVhNDVkYjNlZTBmYmVjZTJjYjZkMjk4MDdlMTYzNmExZTJhOGFiMTdmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9CZXhWYWx1ZU1ldHJpY3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTVjZWNmZTBkZDg2NmJkMzcxNzcyZjFhNmY1NTkyNTA0MmNkOWY4OTQxOGI1ZTViZWJiZDljMmIyYmI3MzY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFZhbHVlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0Njk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDhiMGM3OWI0MmNiOTEzMjliOTdmZDZlODI2MzE4ZWVmYzNjNmZkMTBmZDg3ZjkyYTc0NTU0MjVlMTJmZWUyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9DaGFuZ2VzZXRCZXhWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjlkY2Y1NTYyZWI0NGM2MWZhOWE4ZmRjNDZkNjE5Nzk1NDA2OGIyZTZiNDVhYmQ1N2U4YjU4NTMwZWNlMTkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0V2ZW50c0JleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImM3MjhmNzAzOGE2ZTFiZWVkNTQ2YjUyN2U1NjRlYTFlMzJlYTQxMjFiMDUzYWYxNGRmZjNiOWVhZDU4Y2E4YzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvRnJvemVuTm9kZUJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTA1M2JhYjM2YTkzYThkZDg4N2JjMTViNGZkMDg4NDM5MzY4ZGQwNmVjNTBlOWMyNzY1MjBiOWJiM2Y5MjRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL0xpc3RCZXhWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMDZiMzY1YTJkZTk0MDI1YTlhOGU1MmRjN2EyN2RkNjRlY2FlMTQ5YzZlNWU0MTM5YzdhMjUyNDg0ZTc0ZDZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL01hcEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljNjQ4YTE4NWY0NWNiNzgzMjU2NzNiMjkzYTE3ZmY3M2QwZDI4YmI3YjQwYWM5MGI3NWY1YTk5MmMxMTkxYTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvTm9kZUJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0ZDFjMGM2NjM5NWEwNzViODc2MTVjMDAzNzFiNDhjYTAyNmYxMWVkYzYyMWRmZDZmNmY0ZWQwYzI0ZWMxZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvTnVsbEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzNjOWQ2YjRjZWRiMWFiN2Q2MDQ1MTExYjNmZGNhZWNkM2M1MmY5NzY2YzNhZGQ0NmVmY2FhYmMxM2EyMmQwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9PdmVybGF5TGlzdEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxM2FiYWVlMzY2YmE4YzdiZmNjNDg4MmJmY2E2YjhmMzQ5NzQ3MmM1NzY5ZjM1NWViYmRlYWUxNWFiZjdjYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvT3ZlcmxheU1hcEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MGQzMGE3NTNlOTYzNjgyNzNkYmU0MTA1NDg4NWE4OTZkYjdkMTU4OTBjZmFiOTU2YjViMGU4MTBmMzc1NGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvUGF0Y2hFbnRyeUJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhNzcyZDFjYzFlNGMyNmVmNWVhZmE0N2Q3YWU1MzkxMWYzY2UyMzVjYzE0NTZmMjk1Njc0OTk1YjE2OWNjNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvUG9pbnRlclNldEJleFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiODVhMWJmNjFkOGU0YTg1MTZkYWVkODE4NDg4NDE2MmEwZmEzZGQ5MTlhZDU4ZmE2NTI1NDgwYzNjNDc5YjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvdmFsdWUvU2NhbGFyQmV4VmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTBmMGNhZjRmY2FkNjA3N2IwN2Q0MGMyY2Y1ODYwZGFlOGNkZWVkYWM4ZjdlOThiODYwNWI4YzA5ZjE2MzlkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtYmV4LWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2JleC92YWx1ZS9VbmRlZmluZWRCZXhWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NjgyNjI3ODMyOTUzZjdmN2JmODYwYmFkYjBhNWFjNDc1ZmFiYzNlNGJkOGE0OGIyOGUxMGJhZjNkODdlYWY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L3ZhbHVlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2YzVkNTlhZDhiMWM4MThjNDA4MzFhM2U4Yjg1NDA3ZTQ0NGRjOGYyYWE0ODU5Mzg5M2M3MTQ4ZWI4ZTZmZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlL2JleC9nYXMvYmx1ZS1iZXgtZ2FzLTIuMC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjY4OWUwY2Y1MWIwZjlhZmE2YjE4YTY0MGUwYzc1NTQ3MDkyMWE3YjBkNjZmNjJiZmMyMjA2Njc5ZGU2NDBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1iZXgtamF2YS9idWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5OTNjNmJjYjZmM2IxOTExOGU3MGNkMzMwMmU4ZTMwMTg3YmQyMDRiMGE1ZmVlMDk2YTllZGYyZjkwMmNmMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWJleC1qYXZhL3NyYy9tYWluL2phdmEvLmdpdGtlZXAiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxYmE0NzE5YzgwYjZmZTkxMWIwOTFhN2MwNTEyNGI2NGVlZWNlOTY0ZTA5YzA1OGVmOGY5ODA1ZGFjYTU0NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9idWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMmMzYTI2NDBlZmU4YTQ4YmVlZjc0YjRiMTE3MzAwMmQ0MDRkNTdkNjNkNWRjNjMwOTM0NWE2ZTQyZGM2ZmMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc2V0dGluZ3MuZ3JhZGxlLmt0cyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxOWYxMGJkYjQxYWJkNzFlOWYwOTFlYmJhMmU4MGZmYjFkM2IyNDhiYTczNjkwMDkzZjZiODE2MDQzODk1YjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvQXBpRXZpZGVuY2VQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTVlOTA4OWQ1Nzg4ZTgwNTA1OWQ5ZDY1ZWY3MTk5MDg1YWU1ZmU1OGQ1YzI2YTkxMDAzMzQxOWU4ODE3ZDA2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9BcmNoaXRlY3R1cmVWZXJpZmljYXRpb25QbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY0NDg2YzMxYzkxYWMzMWMwNGQ1MDZmNjdkYTBlZjc4ZGRmMDgyNjYzZWIzZDNmZDIwNDc0MGNiODM3NjBiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9Db25mb3JtYW5jZUNvbnZlbnRpb25zUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDI2MzdhMTMwYzMwNWIzZTA5ZDU5NTkxMDViYzljZWYzYTRhNTQ3NWQ0MWRjMTBmY2EwZTUxNzg3NjY5NzA5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9KYXZhOExpYnJhcnlDb252ZW50aW9uc1BsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMWM1M2M5ZDQzNWQwZGJhOGY3ZDVlZGUwZjNjYjVmZWU4ZDA5YWQ5MDExNTE5NTA3NDJjNmU4YWM3MTgxNmE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL0ptaENvbnZlbnRpb25zUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjAxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwYjZhYTU1ODc1ZDZjZDJiMzc5Mjg0ZTg3NzBkNjcyNTM3NzgzZjZlMzZlMmJmNmI5NzhlZDg1Yzg2ZjE1YzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvTGFuZ3VhZ2VEZXBlbmRlbmN5TW9kZUV4dGVuc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ZTlkYjJmMjllMzJjMDIzMjBiMDI1NDQ3ZmZmZWQwNzAxNWYwZmRmYTZkNTExNjVjNzAwODY3ZDI2ZDZjOGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvTGFuZ3VhZ2VEZXBlbmRlbmN5TW9kZVBsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkY2QxNjM2ZWVkOTk1NThkNjY5MDYxNmVlNDUzMGQ2ODcwMTMzZjRiMGM1NjJmYTg3ZjhlYTM3Zjg1ODc1MmU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL1B1YmxpY2F0aW9uQ29udmVudGlvbnNQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWY1NWRhYWQ1YTI1NWRiNjZiZmNjMDNkNzc5MTUzMDlhNmU3MjNjOWUyN2Y1OTlkNDI4NGZjNjkzMGM1ZjY2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9SZWxlYXNlRXZpZGVuY2VQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODYyYmRhOWI5YTQ3ZWRkYzY1NDNiYTE2Y2Q5MWNmMWRmZDM3NWM4NDIyOGFkZjVjZWZiNTczYTM4NDBlMGIwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy9SZXByb2R1Y2libGVBcmNoaXZlc1BsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Y2RjYjk5ZGI5MGRlMjhiM2MxZWIyZDBhZWFjMTJhMTU2YzRlYmE3NTYzMDFlMDU4MzM3MGU5NGViOTFjZTA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL1Jvb3RPcmNoZXN0cmF0aW9uUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAwMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTE2YTkyMTQ4Nzc1YzVkMjQ1MmZmZTM5Nzk2YmIwZjJhODgwZGI0ZmE0NDg0ZWJlODg5OTc0YjAwNzRhM2YzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwZTVkMTdhMmM5ZTZkOTY1MTBlMmZkNGUzMmU3NzliYzdkNDVlYjIxYzA1YTE2YzdhOTU4ODEyZThhZTZhYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVBcGlDbGFzc2lmaWNhdGlvblRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgxYjE4MDZlYjg2MDE1NDAzOTU2Mzg4OWMwZDRmMWI4YmM4NWRjODg4OGM0Y2JlMTYzMmVmMDc3YTVkZDNhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUJlbmNobWFya0Vudmlyb25tZW50VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYzU1YmNiY2Y4ZWNkZTk5Mzc4OWRhYjhmZTg0OTM4ZWFiZGY5ZmUyZTQ0MjM0NmQ1OGFlOWM1OTZhNTAwMmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlRGVwZW5kZW5jeUV2aWRlbmNlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OWM2NzdmYTk0NWQxYzAwMTZmMWEzMDc4ZGVlMzJiNjllMjMyNDYwOThhZWExMmNhNzhlYmQ3NmUxNzBhZmZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlTW9kZXJuaXphdGlvblJlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTYyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImJmMmY3M2FmMzI2NjM2M2MxMTk4ZDE3ZTIyNzBjNTQ1YThjOTlhMzM1NTJlNzdmZGQwZDJkOGYxNjE0OTVlZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVSZWxlYXNlUmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDNkNzNjN2ZiNTU5ZmIxNDY5OTkwNTQ5YjRhNmFkODIyYTRhYTBkODA5MzI5MmRiMWEzYTQ4YTgyZWEwODI0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZVNvdXJjZUZpbmdlcnByaW50VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDYyYTQxZWNlOGE1MmI2M2U0MjdlM2FmMjkxZDdjNzZjZGJiYjA0NGIwZTRlZDZjMDUyNjFmZmM5NGI0OWE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlV29ya2luZ1JlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzM2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImY3MGVlZWQwNzY4ZDY3YTk1ODRiY2M2ZjU5ZmE1OTA2YjBjMjEyNzA4NDVjNWU1ZDBiMDU3NWY0MjhlOGI4ZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvUmVsZWFzZUV2aWRlbmNlSnNvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM5NGM0NWZjYmFjM2E0NTY4ZWI5ZDZjNjgyMzM3NjM5NzdiMTRhMTVlNDQwYzkxMzNhN2ZhNWU1ODcxNDFkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9TdHJpY3RKc29uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTE1ZDBkZGVlYWUyNzE4ODA3ZWI3MzUxOGIwODM0YmRkOGZhMDRhOWZkNzUyYzYwN2MxMzg3ODgxMGZlNThkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUJleEFyY2hpdGVjdHVyZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5YjgyNjUyODU3ZTEyNWUxMzhiNWNiOTBhOGMyNWUxN2ZiNDU5OWIxYTQ4Yjk3YjZhZjNhN2FjZDM2MjI3MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5SmF2YThCeXRlY29kZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQ3YjFkZWViYWNhZGM4M2U5YjNkZGI0YjdkYTAxNGEzNjlmM2E5NzM0MTUzNTBkNWUyZDc1NTZlMmE2ZDdhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9iZXgvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlMZWdhY3lMYW5ndWFnZUltcG9ydHNUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2MDNlYTk4YjAxOGQ4Mjc2ZDZhMzllYjAxZTYyYTg2NGJjNTU0ZjM4NGVmMDFjNTRhYTkwZmY2MmIwYTAxZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5UHVibGlzaGVkTGFuZ3VhZ2VUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMmJlNGM5MDdkOTBmNDI4NDRhODM5NmZmNmZhYzM2NjZkODJiODQxODlkOTIyMDIxMjc3ODczM2E5NmQ3YTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2JleC9idWlsZGxvZ2ljL3Rhc2tzL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhY2NjMWVkYjg2MDkxMGM4MTIwNDg3Y2JjNjhkMTFjZTA1NWYxZjExMzM1N2Y0MDlhZjQ1MWQ5ZWYzMjE3YTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNjY4YTNiMWUxYmMwOTQ5OGExMjA1YWMwMWFlZTQxNGU4YmQyYmU0MTEwODdiYjcxNmI5MGFlZjhhZDRhYjc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvYnVpbGQuZ3JhZGxlLmt0cyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzIxNjI5NWY2YzI5ZDU4ZjA1NDU0NmU4MTIxNjhiYTAzY2NhZDU1M2NjZmY5ZWQyNDYwZWIyNzAwZDAxZGY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2JleC9leGFtcGxlcy9Ib3N0ZWRCZXhFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiYTQ5ZjMzZmEzNjkzMWVhYTgwZjU0MDg2YzQ1M2QxYTIwMWNmZjQ4ZjZjYzlkYmVkMWI0OTViOTBhY2M0ZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2V4YW1wbGVzL0hvc3RlZENvbnN1bWVyU21va2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjM3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwYjc4NTc1ZDc2N2ZmZTU3NDZkOTgzZjBhMWQ1Yzc0ZDliYjA4NjIwYWIwZTVkODZkNWMyYzM0ZDk0MGY4NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2V4YW1wbGVzL1N0YW5kYWxvbmVCZXhFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwZGNlOWIwZDcyMDVhYTNmYWUyZDlhN2M0ZTBiZWFhMmE0NjA2NzU5NzU0NWJiZTk1NjkxODgyOThjZjI4ODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvYmV4L2V4YW1wbGVzL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5NWJiYTRkMWEzODczODI2ZDljODNiMWFjNzhlNzY4MGU3Nzg4MjdjYzA2Y2M1ODU4MDdkYzg1YjNjMDc5OGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2V4YW1wbGVzL0hvc3RlZENvbnN1bWVyU21va2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWUwMjZkMDI2ZDQ1NDMyYWVhODhkNWRmNmNhYjY1NjAzMjM1ZTQ5Yzg5OWQyNTk3ZDBhZTk1ZmRhOGNjNDE2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3N2E2YzIwYTExOTZmYmM3YzQ5MzlkYjU1MGFkMDY2MGU1YjY1ZmI4MTNmMzA1ZDZiOWRmMmVhOWYzN2YxOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvdmVyaWZpY2F0aW9uL2FwaS9tb2Rlcm5pemF0aW9uLWFkZGVkLWRlc2NyaXB0b3JzLnR4dCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDE3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjYjNlOGEyZWY4NzJkNWYyMzM0ZTkyNTFmZWNhM2MwODNmNWM4ODdhNzY1NDljZTNkZDYwZTJiNDBhMDM5ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvdmVyaWZpY2F0aW9uL2FwaS9tb2Rlcm5pemF0aW9uLXJlbW92ZWQtZGVzY3JpcHRvcnMudHh0IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2QzYmE1YTVlNjlkZGY4ZTJmZWUwZDkyYzkyNGNhZTNjNGRkMzZkNDJlNDY1ZGM5OTMxYzU1MGE5OWRiMmQ5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS92ZXJpZmljYXRpb24vYXBpL3dvcmtpbmctY2hlY2twb2ludC1wdWJsaWMtYXBpLWNsYXNzaWZpY2F0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjMzQ4NmMzYmMyZTdmNDQyNmU4ZTM5NzNlNzRhMjMxOTQ1N2NjYjkxMWJiNmRhNWFiMDNlNmVhMjNmNGE3NDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvdmVyaWZpY2F0aW9uL2FwaS93b3JraW5nLWNoZWNrcG9pbnQtcHVibGljLWFwaS50eHQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM4NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2FlYTZhZTlkZTZmMzk3MjlmOTNjMTQ2ZmY1NDUzODg3ZGE5YTIzMDNmNmY0ZjMzNTczYmE0N2YzN2Q1YmUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3ZlcmlmaWNhdGlvbi9sYXRlc3QtbGFuZ3VhZ2UtYmFzZWxpbmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzdmMGFhOTE0MWU1M2QyY2U3N2YxNWI1YWM0YmJlYTQ0NjViZTQ0MDc2ZTk5ZjBhNGExZWFjZjA1NjY4MGE3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODQ2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5N2M4YzJhN2U1MDMxZjZhYTg0N2Y4ODEwNGFhODBhOTM1MzJlYzMyZWUxN2JkYjhkMWQyZjY3YTE5NGE5YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3NGQ0ZjEwN2QyZmVhYjk4OWI5YTA0MWEwMmUyZDJiODU1NjdmZjQ4NDE1YzljN2FkZDVlY2MxOWFiZDE5ZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWE1YzE5OWJhMDIxODlhZThjNDZhMzM0MjIzMzcxYTIwNTk5ZDljMjk4ZWY2NWU3NTQwZWRlNGEzZjcyZDU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQ5MwogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldy5iYXQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1Mzk2NzZjNDhiNTk2YWZkYTY0Yzk2M2VjOGY3ZWU1NmM3YjNmZTdlM2I4MWQxZGJlMmQxYTFlM2RkOWU5ZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzZXR0aW5ncy5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmMwY2Y1MGU1YThmNTZkYjJiZjM5MWFhMTNlMThhZmEzYTFiMzUwMWYxMWJhOTBlN2NlMThhNGRiODYzMmIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhBY2N1bXVsYXRvclBvaW50ZXJDb25zaXN0ZW5jeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjMyODkzNmY5MDFjMWYwNGUxN2I5ZmIwMTBmNTZmNzUyYjQ2Yjk1MWVlOWEyMDI5ZWFhNzk4NGZkMjk4NmJmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Qmx1ZVR5cGVNYXRjaGluZ0dhc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDY2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwNDI0MzU5NjAxYzhmZTRlOWFlNzYyYmE0Y2EyYWEwODIzMWQxNjJiODFjNzE0YzNkZTU0NDdmMjQ5OWUyNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEJsdWVUeXBlU3VwcG9ydFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjA1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiNGY0ZDc5MzYzYzViMzhiYzViN2FiMzUwNDY2ZjUyNGRlNzgxYzg4ZjAyN2IzYWI3NDVmY2I4MDQwNTM5OTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleENvbXBpbGVkUHJvZ3JhbUNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE2OWViZTk2YzdlOWRhYzBkNzUyMWYyYjQ4NWM0OTQ4ODgzMTE4NjlmMmEyMDEyZmJkY2U5NGU5YmZmMGNmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Q29tcGlsZXIyMFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk4OWIzMTI4NGRiODZiMTllZWEzNjhkZWU3OGU2MmRjNWUxZDAzMjE0YzliODY0NWM3ZWZiMDIyNzM3ZmIxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Q29tcGlsZXJTY2FsYXJOb3JtYWxpemF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZmRiNzg4YzIzMTdkY2ExNWE0ZjIwYTIwMDk4YTZlZmYyZTI3ZTk5NTc4ZjNhNDVmYzE3NDlhMmQzMTQ4YmYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhDb21wb3NpdGVFeGhhdXN0aW9uRXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU2NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MDVmNDUwZDY0NzM1OTc5NWFhMjliZGRiODNlOGUwNzA5NmJiMDMxNWU5MTg0ZDZhODQ0ZmQyZDc5NmFmZDQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhDb25jdXJyZW50RW5naW5lSXNvbGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzVkZTU1YjkyMGQ3MjU2NzA1NmNkNDhkN2M5YjljMzdjMzEwMmM3ZDBhZWFiNGRkNDNjMmNjYTA3NThkODBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhDb250ZXh0UmVhZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZGQ3OTU1NDcyZWU1ZjZhZDQ3OGQyZTYzYTFmNGQ3NjBhNjhmYjI5NWE3ZGZjZjFlZmU0ODNmMTdiNWY3OTVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhEZXBlbmRlbmN5Qm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3MWUwOTM1OTVjNjliOTEzMTlmNDIwNDIzYTBjYTJlYTVjOGUzMWVmNzhmMmVhZTljZTM0N2I1N2QyMDVkMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleERpYWdub3N0aWNBZG1pc3Npb25PcmRlcmluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlODYzNGE4MzFmOTU5MmRiZWUzNDJmZjhjNDU4N2NiNzM1NTgzM2Q2ZjVmY2Q2MWFkYTJjYzY0ZWU2MjU5MDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleERpYWdub3N0aWNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MGE4OTA4OGUzZTY2YWY3NDkzYTU1MjhhOGQzYWFmYTAzMzQ0YWY0OTVkNzBjN2M3ODA5NTQ0M2Q2ODA4MzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhFbmdpbmVDb25mb3JtYW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTkxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiZGJkODYzNTM1MDA1YmI1ZjQ5OGQxZTJjMmYzMGQzNzYzZjI4MDcwYmM3MjJjM2Y0Y2M5NmM3MmEzNzVmZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEV4YWN0R2FzUnVsZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkMzVjZWY3YzE1ODU3NmI2NGM0NWJiODYzNmM1NTdhNWQ4NDgwNmM1MTNiYjAyOWU3ZjM4NTgyMzY3OTE1MmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEV4YWN0UmVmZXJlbmNlRG9jdW1lbnRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIwODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNGViNTVkMGVkZTFiYTUwMWY4NjQyMDQ0NTkzNzNhMzdjNjA0MzE2ZTgwNmI2MzM1YTgxNTdmMTA0OTRiY2NlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhFeGVjdXRpb25FdmlkZW5jZUxlZGdlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyZTJiN2I5M2U2ZmNkMjJjN2FkNzIyZmViMzUxMzRlZWYxNzAxY2Y3ZmRhYjMyYjAzOWM1YjgxMDdjODA2M2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleEZvY3VzZWRDb25mb3JtYW5jZVRlc3RzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmE0MjQxY2RiMGUwNmRiM2ExZmE4MzU4OTcwODY5NjY4NTlmODBlYThlNGY4YjY1YmFiODY4YTY0Njk5Nzg3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhGcm96ZW5WYWx1ZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWU3YTdjNmNmZTAzN2NkNDU4ZDZlYzBlZGVkN2Q1ZTMzMjUwODk0NzE5MWRlZWViODBmMTNjNjY3NGFiYmM0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4SW50cmluc2ljVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjEyNDc1NzFjNzQwZjE5NDMyNGMzNDE1MzliNzFkZDJmNjY3ZWVkZmE2NDg3ZTgzYWM4YThlZWY0MjY3MDIxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4TGF6eUJpbmRpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc2OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDRjNjY1OTFhMWE4NzRiOTIyYmUzNzMyODRkOTJjZWI4NjJiMDA4OGQyNjM0OTNmZDczNWViOWVmYTUxZDZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhMb2NhbEJlbmNobWFya1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNmNmI0YzYwYmMxMDA0ZTE4YjA2MzMyMTI4NjIwMzUzMzFlZGVlYTIzYjNjNWRiNmFkZjU5NWVjODZhMGNiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4Tm9kZUN1cnNvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjg5ZDkyMGFiNjI3NDE3YzQxYWVlZDg2MjUwYjgwNWY1NzI4OWIzMWU3ZTcwNGVmMjRmOTBmMzhiNjdlMGNjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4UG9pbnRlclNldDIwVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjJhMzVhYzg1OWRhN2EyYjZkYWNjMmU1MGZhOTYyNjMwYmE0ZGFiNzJhZDU0YmI5NDljNDI0MjhmYThhNGQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9CZXhQcmltaXRpdmVFeGhhdXN0aW9uRXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwYzkyZTYwZGMzZjJmNjViMjRkMGNkYTEzOTI0YmJkM2JmNDM1Y2I1NTRkNThmMjMyNzkzMGQ3ZWI4Mzc2ODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleFByb2dyYW1QYXJzaW5nQm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzOWE3OGNhNjg5YTk1ZDdhODA0NTVjMzU5NGViYjkxODQ3MWQ3YWQ3ZGQwYTY1OWUwMWJlNDI5ZjNkYmExY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleFJpY2hGaXh0dXJlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MDkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE4ZjA4NDA5YTRlYWQ4ODJhNDM3NGUyYWUyZmVhNTY3ZDZlZTVlMzZkNmFjOTc1Njk2YjZlOTE1MDdkYjM4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4U2NoZW1hVmFsdWVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE2MmVmNjU0YmIzODgyMGZkN2EzNTY4ODk1ZDM2ZGU4YjRhZDMyMGZhMTMwOWE1MTM5ZmI3MWFkOWFlZDM1ZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleFN0cnVjdHVyZWRSZWZlcmVuY2VFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2FhZTkzNDI2ZDViYmMxY2I4ZDQ2ODRhM2VjODk1MmIzYmVlOTkyNTM2NmQzNDNiMDI5NDk0MWViNjc4ZjY3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvQmV4VHJhbnNsYXRlZENvcnB1c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzkyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3NmRhMjIxYTAzZjBmMGEyZmVjYTQyZGYyMDIxNGMzMTY0ZTc1NmMwZDUzZWE3YThjYmUxODRlMzAxNjcwZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0JleFVzZUNhc2VDb25mb3JtYW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQ4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI0ZGJkNWI0NjcyZWE0ZTcyNzhjYTUxMjBlNGVhZWQ4M2ZmNDdmNTk2Y2ZiMTE0MmQ0NTAxYzhlMjNjODdhN2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L0V4dGVybmFsQ3VzdG9tZXJQYXlOb3RlQmV4RnVuY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTgyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxNzUwNTBmMjYyZmJjOTVmZWQ5MWQzYmIwZTdjOTA3NGFkYzE0YmZmOWI5ZjdjMWZhMzE0NWU4NzVhNjc3OTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2FwaS9CZXgyMEFwaVN1cmZhY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMjIwZTEyNDUzNDY3YzhmYmU4ZDU0NTY3ZDdkYzY5ODVlZDIyNmI3MzdiNGMxOTI2YzZlOTMwNGVhNTBhZWM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9hcGkvQmV4RW5naW5lQnVpbGRlclZhbGlkYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjdjNzAzY2I1ODc3Y2Y0MDZkOGM0ZGJmYmRjNGMwOThmNDYxNTg0Mzk5M2MyMGE5YWJiNWQwODIzYzBhODk4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29tcGlsZS9CZXhDb21waWxlQm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImQyNmRkMGE1YTk3MTUyZjA2MzVlNzUwNTU3NzQ1ZDUwZGVmZDEwYzUwOTI4NjI1Y2Q3NzgzZDA3Nzg3NmExYjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4Q29tcGlsZWRJckltbXV0YWJpbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2ZjNmZTllYzZmZGQyODQ4YWQwOWU0ODY5ODU1NjE2NWYxZWQzYzUwNGE5YmFmNDY2YTIxZjgyOGEzMGM5OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbXBpbGUvQmV4T3BlcmF0b3JDYXRhbG9nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGJhMTYyMDJlN2RkMzE2ODJiYTFkNjVhNDliNDYwMjFkNWJkMTNlZWQ0ZTA3MGJmNmJmMzNiZmFkNjBkOTQxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4QmluYXJ5QXBpTWFuaWZlc3RNYWluLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmMmYxMDVmMzMzMWE1MjRkMzEzNjFhNjMwZmMxMzQ0MDM2NWQ2NjI1ZGRiNzY0YTg4OTUzNWI1OTkxZjY5OGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleENvbmZvcm1hbmNlRG9jdW1lbnRhdGlvbkNvbnNpc3RlbmN5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDM3MWMxODJjMDA5YWI2MmI3OTYyY2YyM2IwZDdmMGU0NGIxNmZkYTVjOWJiM2IxNzEyMDgwM2U2ZWU5YzE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhDb25mb3JtYW5jZUZpeHR1cmVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImY3NDIwN2RmZmM5ZWM4NWM5MjliZTQyOGViZDU3OTFmYWVlZmM2ZDQzMDRlODQ0YjAzZjkwNGQ1ZmQ0YTFhNzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleENvbmZvcm1hbmNlUGFja2FnZUludGVncml0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTUwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2ODgyMTc4YTlkM2RlZjQ0ZTFhYjdlMjhhOTFjN2I2NGEzMTk1YTExY2E3MWE2OTJiZTg5ZWEwYTg1MWQ0ODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleENvbmZvcm1hbmNlUHJvcGVydHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzBmYmNjOGVlZTg0ZTIwNTRhNzNiZWI4MGM4NjFmMjU1NGZkZTIzZThhYTRmNDA4MTdkMjkyYWVjOTNlNGM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhDb25mb3JtYW5jZVJlcG9ydE1haW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzY5OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMjI4M2FhOWQ3NDRjZDA0M2NmMjQ4ODBjZjI0ZGNlMjc2YWU1ZTdiMTJmNDAwNjVjNTUwYTFjNDFiOTA5YmQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhDb25mb3JtYW5jZVJlcG9ydFRydXRoZnVsbmVzc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2OGIxYTM0YmUxNWMyZjIwY2I5MGM4ZTBlMDFhZjdkM2Y0ZGRjNTQwNmU4Y2Y5NDYxMWNjZDk5ZTY4OWNkZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleEVuZ2luZUZpeHR1cmVBZGFwdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTMzMDBhZGJmMmY2MDY5MTkwNzdlOTQxOTE3MDZhMmFkNTdiNDFmOTk4OTBkZDMxZjExYmJhZTlkZjMzYjIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9jb25mb3JtYW5jZS9CZXhGaXh0dXJlUnVuLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjM2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzZDYwYmZkN2VlZGFiOGY1NTRkNjk5NmYwZGRmMjAzYjIzYWE3ZGQxOWU3NjYyZGI3ZmQ0MzdlMjZiZGUxNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleEZpeHR1cmVSdW5uZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTc0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUwN2Y4NjBiYzIwYTVhMWM1ZGNhNDU3OGY2NWFiMjI4YmQ0YTVlMTJhZDYyOTRhYjVjYzhkNGU4OTBhYjlhOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleEZpeHR1cmVTY2hlbWFWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxMDI3NGE3NmUzN2RkMGNiNjI1ODRiZWJiNTBkZTQ4NTMzYjQxMDJhNDExN2YxOWU3MTVjNDEyNmJmODE1OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L2NvbmZvcm1hbmNlL0JleEdhc01pY3JvZml4dHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWI3NGUyMjFiZmYyZDNmZGM1NWI1MzZiY2JjN2QxMjA2ZDFlZjE1MjUxY2I4MDQ5MGI3ODI5ODVlM2YyYzgyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4TW9kZXJuaXphdGlvblByb3BlcnR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjYxNjQ1YTRkNzkwNTY4NWY3NWU2MWEwNjAzNGUxMzNhMDQ2Y2M4YzNmOWMwYzA4MTBhMzczOTg1NjJiODJjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQmV4UmVwcmVzZW50YXRpb25JbnZhcmlhbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDE2OWJhNDNiZWRkZDE0ZTUzNjdiNGUzNmRhOWIxYjI2YTNiNGVmZmZlMzM4NTZlMzk1ZGI4YmFmZjNlNmY0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VQYWNrYWdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZjExYWE0YzgyYmNiMTRiMWVlYWFkZTAyMmMxNjAyYzZjYjI0MDhkN2I1ODU3ODMxNzgzMGE3ZjEyYzE1OWIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC9nYXMvQmV4R2FzUHJpbWl0aXZlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTcwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmMzYzYTRlY2Y4ZWM5YWU5NGQ5ZmQyODExYjNiNGU0NmRmMTkzMjQ1NjYzZThlYTE3ZTFjNDlmMWJmMjk1NmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L291dHB1dC9CZXhTZW1hbnRpY0lkZW50aXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAyMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjc5ZTE3NjhiZThmOWRiMTA5MDJiZWYzNjRlNGM3YjYzODhlYTFjZTJjYTkxMTlkYTc3NGZhYmNjMTRhNWRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC90ZXN0L0JleFRlc3RGaXh0dXJlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjQ3ZjM4MWE0NDgwM2QyYjYwZTc0MWI4Y2RkZmQ4MmFlNzg1ZjA4YTdiZjA0NDc3MGMzMzc5YTQ1ZGI5YWZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC90ZXN0L0JleFRlc3RTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTZkNTc4YzQxOTgwYWNmOGFmZTZhMzM3ZTcxMDI2ZTcyZGUyMWVlODk2MDQyNTFhZWY1YmRmMzZkZjJkZjlkZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvdGVzdC9UZXN0Qmx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTc2NzI0YTE3OTU2MGI4YmYyY2JkOTVlNWUwOGE5NWU3ZDM1ZmM4MTEzZGMzMDkxY2VhNDIyOThiYTQwY2ZhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9iZXgvdGVzdC9UZXN0R2FzTGVkZ2VyQ2FwYWJpbGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWZmMjEyM2E0ZjYxODIzNjQ4M2M3NjA0NGQ3OTljOWI4ZTlmZjQxOWNkODg3YTk1Y2ZiMDg2OWU4MmJjMjM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2JleC92YWx1ZS9CZXhVbmljb2RlT3JkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzMDQyN2I3ZDMyOTk3NmJlM2JhMmExYTgxYzFjMGY2NTQxMjg5NTVmNDNhZGZjNWIzNmEwNWY3MDE1Nzg5ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvYmV4L3ZhbHVlL0JleFZhbHVlc0lkZW50aXR5VmFsaWRhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmIxNTg4MjU4ZjQ1OTE3YzBhZTcwMWNhZDQzZDFmNDg1MDc2ODA0MmI0MmJiNTkxNjlkMmFhN2UxYzc2ODA0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQmV4SG9zdGVkUnVudGltZVdvcmtTZXNzaW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyODczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgxYjA4NjJhOTFiOTUxOTI1OTc5YzMxZjc2N2JlMTQ1NDkyN2EyMjliMzBjYjkxZjA5M2RhNGRjZjgzZGExZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy8uZ2l0a2VlcCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFiYTQ3MTljODBiNmZlOTExYjA5MWE3YzA1MTI0YjY0ZWVlY2U5NjRlMDljMDU4ZWY4Zjk4MDVkYWNhNTQ2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvSEFSTkVTUy5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTNkODEyNGQ1OWFhNDk1ZjQxY2RjNDBmNjhkMzhiZTAyOTlkYzYxNzY1YjRiNzI3MTk3OGQ3MjhlODM3NmIwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvUkVBRE1FLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwNzc2YTBlMWYzYzIxYjM4ODM2OWE3YWM5MjUwNmQyY2VjYTM0ZDNkODEzY2NlZDA5ZjYyN2QyNTNjYjQyZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2MvYmV4LWMtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTUzZDIzNWVmODQ5NzVlYmZhMDc1MjI3MDMzNzZkZGVjMGExNTk2NTEwZTkwNzA0ZTkyM2M5MTEyMmE3MjA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9jL2JleC1jLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA0ODE1MGM4YWRhOTliNmNhOGIwYWVjMDMyMDdjNjRjZTM2ZGMwNDY3ZjRkZDVjZWJjMWU1ZmZlNGE4ZjMyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvYy9iZXgtYy0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5ZWE3NmE0NWRjYjYwNTBmNmQzNzU4M2NjMGU1MTUwZmQ1NTg1NzlkNzQzN2Q0ZDU0ZDMyNmE1ZGVhMzQ0ZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2MvYmV4LWMtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzVlNGJjNDA4NWZhYzFiOTE2NTQwNWQ5OWJiYWJiYWM5OTA3MmMwNDI4NTYxN2QxYzRjNzhkNjY5MjI3ZGE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9jL2JleC1jLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGNkOTEzMzk2ZjY0MzIzYjE0M2MyMTVjNGJkNmMxMTI4ZWIwMTBjYjM1MWQ1ZjAzMmY3YWU4MDM5MmYzZTcwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvYy9iZXgtYy0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhMzNjMmY5MWEyYzYwYjczYzE0ZmM1NmQzMGJmNDA5ZTkyYjQ1MzQzNTIyNjViN2U1NmUzZDFmYmJiNzRkYTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2MvYmV4LWMtMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTRmOTM5YzY4NGY2M2I0NjcxYTAyNTEzYWM0MWJmYzg5Y2JhYmNiNzhlNDdhNDA0N2MxNTlhMTJkMDdiY2MwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9jL2JleC1jLTA4LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDViYzI3MDllY2NjM2M1NjMyNjg5NDcwMjRmNTZlY2FmNTdmYTQ2MGNhODMzOWQzOTQxZDEwMWRhOTQzN2U3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvYy9iZXgtYy0wOS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlYmVjZjVkMzdjN2FlNzQ4NjRkMDIyNTNjZDliMTBjM2IxMWI1MWU4MWVmZTQzMWNkMjYxNmI5MzRiMGU3NDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzY4NTg5ODVmM2YyMzZmZjA5OTFlOWUyZWYzNDc0YmFkNjNiNzZjZmQyMDVhNGMzNDEwMDE0YTk1NTc5YjYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q0YjI3ZDhjMTRlYmM3ZDMxNDBiMDFhNWNkNzYzOWY5ZWM1OGQ4OTY3NGQ3NzAzYmM5YzcyNDcyMmMxYTExNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxZTFhOWE1YmYwZTk0ZWMyZTE4NWMwYzYyMDlmMTRmYTU3MzBjYjNlZGJjZDFlMmRjODRiM2U1MzU4YzQ0MmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODdhYjI4YTE5ZWRjNjMwYTlhMTM0NGU5MDQ5MDY3OWI2MjliYzFjNWQyYmZmOWQ3YmVmNWNlZGE0NDAxMTkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM5NTBjODY1YzY3NmM4NmZjNzk1NzBkZWM2N2Y4OWE5ZGE4NTY5MjkzMTlhZDI2ZjZiZGQwNmE2MWQyOTI3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhZjFmZDRkZjBkNGMxZmY2MTJkMWRkMGM3NjlkZDI5NTQzODhmYTc0MzdlOTg4NmNhNmRjMzYyODY5NjQ4NjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YWY2Y2I0NTUyZjFmZDRiYjEyMTMxYzU3MmRjZWM3MDJjYWE5MGMzOWNlMjJkNDFlYzI2OTMwNjA4MWFjYTJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTA4LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA4NzFlNzg1YzJlOGRiODllNDNhNWFhMzUyNDY1OWI3ZDU0OGMyZDFmY2UwMDcxMmY0MzY2YjFkM2U5Zjk5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0wOS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNlOGQzYzA2NmU0YjQ3Njc0ODhhMjhiYWUwZjI3NmJkZTE3MzZlMDlhNzNhOWFjNjJmOTU3ZDc4NzM1MWYxOGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMTAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlM2MxMzgxMDNjYjJhYTM5MTFhMWYwMzg1ODUxYzNjMDg1Y2U4ZWM3YTgxN2NjOGVkMDA2NDViNWU0YjIxMDIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTExLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzViZTdiMTFjOGQ4MGNjNmM5MzA5NmViMjZjNGM3N2VlNDc4NmRjYzVmN2ZjOTMyMmEwYTFlOWUyMDBlOWE1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZS9iZXgtZS0xMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3ODNjYjlmNDdiN2FiZTZlNTA5NjQ2YjhkNDJlYWFjM2M4YzRkNjM5MjgxMWIwMDBhYTgyYThiZTg2ZWMzNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2UvYmV4LWUtMTMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NjIzM2E2NTdhMWQ0ZjU0ZTAyNjNkNmU4ZThhZDE0YzRmZmI5MDI0OTY3OTE2NDNkYzRiNTBmYzA4ZmZiYWQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9lL2JleC1lLTE0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTJmMDc0YjM0MjY4NjQwZGJhMWM5ZTE1NzJiOGYxNGFjYWI2YzMxOTlhZmEyYWQzZGE0M2Y4MDcyZjYwY2QwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZml4dHVyZS1zY2hlbWEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTgwOGQ1ZmI2ZmU3Zjc1OTZmZDEyYjE3YjhjMTA4NzNmMDFjMGI4ZDczMWM4NDVjM2JmZGEyYzBlNTcwYjZkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlY2VhOGNlMDIyMzEyYWQwODhkODk2YTJhNzRlY2ViZTY1ZWI5ODgxMmJiNjVjOTRlOTE3OGU3NmI3M2E4ZmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTNkNGNjYjY4NzViMDI4ZjA0NTBiYTU0NGE1ZmYzZmRhZmM1ZjYxYTM5NTEzNGFhMGFhOTlmMDdlZTE1ZjU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTJjNDk4OGU3YzFmZTVmNjE5MmNhYjFmYjFlZGJkMTQxZDU4OWQ3ZTJhZDMyNzJhNGMzNjZjNGJiNDZmOWU1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzNDMxZDI3MDgxMWM0YmJmZmU1ZTk3YTgxZWZiOWIyZDcwMzk2MThmNjY5NjQ5Mzk3MmJiMmE4ZGNkY2FlNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTFiZDhlMzBkNzNhYjBhYzE2NDhmN2NkNDU0ZGI4ZDU5YTRmNWE5ZmM3ZjMzMDgwMmVjYTQyYjYyZDJmZDk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFkMjRjYmU1ZWYxNjM4NDY3YzZmZGY3ODk0NjQyYWUzNWNiYTIxNDAxNTk0OTE0ZDQ4NmFmMmNlMTRhYjA5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0wNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ4YTU3M2Q5ZGE0OTA4ZDRlZTMxZGU1YzlmNDIxMjVjYzBjYWNiZjZjYWU4ZWZmNGVhNTI4MDk5NjZjMDRmYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMDgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MmMxMjMzYzI0MzAyYThiZjAyNGJjYWIyZmNiOTI4MzI2NjQyYmM2MzBlZmI5MDIwOTgxMDQ0ZTgwYmE5MmQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTA5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjcxNGM0ZDI4MmU4NGY1MTljNzkxODRkNWZkMTA3YzA3OWIyMjkyMzUwYTRhZDBjNzUwM2RkOWEwZTUyNjlmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0xMC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhY2M0NjI3MmNkZjY4OWZjOGEwNTZiMDc2YTk4M2YyMTI3NTc0ZTI5NjQyYWUzODllNDY4MDBlZDdjNWM5NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMTEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YWFiYzM4MWZjYWE2NjRhNjA0Njc3ZWQ5NDQzNDY4ZTkwNjRjMWM3ZDExZTNiY2U0YTQzNjAyYWE1YzdkMDc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTEyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTc4NmNmN2QwOTJkODgzMDFkMDdiYzg5NGNiYzY2MmZkYzI4YzE0MGM5ZGJlNzUzYTU1YTdhODAzZTE5MGU0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZy9iZXgtZy0xMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwZTIyMGU4MWEzNDUwN2RlNjJjNjE1OGFjZDcwNGIzY2E5NDE1M2Q4ODhkZmU3NDk0MTYyMjBhNTRmMDdiNjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2cvYmV4LWctMTQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDZmY2RhMTc5ZjIzMjhlYjU3MmI0ZjIxOWZmY2I4Y2I3YjgzYmExZDU2MmU1MWI5ZWZiYWM5YTc4MDJjN2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nL2JleC1nLTE1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjOGFjNjEzNWEzZTA4NGI1NjVkN2I1YTk1ZWQyNWY0MGIyNjRlZTQwNjc0MzEzNzNiNmZkNTgzNDVhYWZhZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9iaW5kaW5nUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4Yzc0MzMzZWRmMjA4OTQ4Mzk5Njk3ZmQyY2Y5ZjI3NTZhNzIxNDYzODE4NGQzZDFhNTlmMDFmM2VmOTEzOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9ibHVlT3V0cHV0Qm91bmRhcnkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTZkNzdiYmFkOTJlMGU3YTJjZDEyN2VlOTM4MzYyM2NjYzZiYzFiZDYzNjdjMjQ2MDQ2YWU0YzYyYzdmMzk5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vY29sbGVjdGlvbkl0ZW1Qcm9kdWNlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0MjM1NDZlYTA1ZmRkZGI4YzNhY2NjNmJkMWU3NzQxYzNjYTQ1ZTA3ZDgyZTI0ODYxNDI4ZGU2ZmFkNDU4YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9jb2xsZWN0aW9uSXRlbVZpc2l0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmI4NDE3MzRmY2Q3Mjk3YWM5YWZlNTkxNDJjMWNlMTkzOGEwM2VmMTI0MjAxZDYzYWQ4ZDVhYmJmNjU1ZmJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vY29tcGFyaXNvbk5vZGVWaXNpdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQ5ODgzZjE4MjJkMGMxNmE0NjhkMTU4YmFhMTM3NDIyMjg1NjQ2OWQ2MTM0MmQxNzk2OWNjOWUwZTE1NGY4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2NvbnN0YW50UmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImMwYWQ2ZGIzYWU0YjVlOGQwOTYzMmIwN2FiNWNjZTIxNmFjNzAwMjkyMjc5MzhhMzgzMDFkNmM4OGRjMTExZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9jdXJyZW50Q29udHJhY3RSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ3YzI5ODRlMTBjOWIzNzVlYzExM2YxNzY0MzI3MjA3ZTM1NTlmYTBjMmViNmNjNjRlZTQ1YTk2N2YxMDNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2RvY3VtZW50UmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImE3OGFiZTE3NTZmMzMxMGMxMzk1NDY0NWU2YmRkMDdlZmM4ODU0YWRlYWI1NDI5YjA1Nzc5ODQxN2NiZGEwODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9ldmVudEFwcGVuZGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODA0ZTcyMjQzYjBmZWVkZjFjZDI1NTkzMjM2ZjViZGJmYjAzNmI3NzI1Yjk2OWUyOWQ0YzNkNDJjYTBjODNiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2V2ZW50UmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzYjYzMjYxMWU3MTlmNzQ0ZDMzMjc2ZGI0NGJmNWUzYTA0MjUyODJkMjAyZTlmNTg3NGY0MGVlNjUxMzZiYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9leHByZXNzaW9uRXZhbHVhdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWU3YzQxMDEyNGE4MjdmM2RiNDAwZGY1YzBmNjk4YWQzY2RlMjFiODQ5N2M2MDQ2ZGQzNzFhOTllMTQxYWUyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2Z1bmN0aW9uQ2FsbGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTg2OWZjOTM2NWU3YTZjMDUxODA3ZWY1MDYwZmQ1Y2MwY2I4YTIyNmFmMWI4OGQ1ZjJiOTc1NWYxNmRhOGNlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2ludGVnZXJMaW1iT3BlcmF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTgxYzVmNWE5YmI4OGY1NTVjYzFhZjNkYzQyYzg2ZDgyMmUzZmQ5MjE2OGY4NTM5MGQ0MjgxMGZiOGVhODc1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL2ludHJpbnNpY0NhbGxlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0OTZmMDNjMzM3MWZkZTNjMzVmODIyOWJiOTc0YmExYjQ0NWFhY2E4ZjUwMWFkNmE3YzU0OWMwOGQ1OGY4ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9saXN0SXRlbVJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MDUzYjFiNGNmNzI3NmNmOGI2MWNmZGY3YTI0NjI4OWRjYWRhOWM0ODY1MDAyZGMwMjJmOGY1MTlmN2YyOGM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vbm9kZUlkZW50aXR5UmVxdWVzdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODExYzE0MjQ0Y2Q2MjI5ZmIzZTc0Y2YzZjJmODVjZDEwOTYyZjUwYzViNTVmYTVjNDc0NTQ5ZTZiMTllMzhiNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL29iamVjdE1lbWJlclJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Zjc4ZTI3NGIzMGFiMWZmYmQ0Mjc5OGZmZDcyOWU1OTdhNjBmOTdkZDM0YzI5YWI0ZDU1NGFmZTY5MDYxZjEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vcGF0Y2hBcHBlbmRlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5ZDk2NjkwZTdhOWE3NGNmNzczMzg2ZDU4NmRkOTMwNGNkNGUzYTQ3NTY2NWU2MTg1NDZlZjNlOGI4MzFiNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby9wb2ludGVyU2VnbWVudFJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YWE5ZDY5MGNjNjc5ODI1Nzk2NDM1ZmJiMTQwMGRiZmIxODEwMjZjMmZjZGE1OWU0Yjg0YjYxOGZkOTMxYmIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vcG9pbnRlclNlZ21lbnRXcml0dGVuLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWY4Mzk2NTE4M2I3MGU2MWU3OWMyYWQ4NWM4MWU5MjdmZWUyMjVjY2JmNWU5MGE0MGFkMDZmOWJmMjAyN2IxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3NpbmdFdmVudFJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYWY2ZWU2NTgxZjNhZjBjNGU2MTljMmM3Zjk4ZmVlNGYzZDI3MWFkMmMwODUwM2MwOTBhOTEyNzU4MzUwMzRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9nYXMtbWljcm8vcmVzdWx0VmFsdWVSZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhlMjhhYjZmYzJlMjVhNzczMjVkZWQwMDIzM2EzZTIyNTUyODY4YjIwZjI0MjA3ZGEyNGQyMTI4YjRlY2NkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3NvcnRDb21wYXJpc29uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTZjMDE3ZTk3ODJlYmYzM2Q2NjU0NTJhNmU3NjVjMTM1N2YyZjk1ZDc4NjgyNmZjMDRiNTU5OGI2OWZlOGY5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3N0YXRlbWVudEV4ZWN1dGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGE2ZjMzMjhkYzMwNTQyNjZhZjZmM2ZkOWJiZjdjZGRhNGJiZDRjN2Q4YWYyZGE2NjE5NzlkMzYzNzMxZTJlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3N0ZXBzUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiYjhiNmZkMDIyZDI1NTI0NjZmNGYxOWYwZDg1NGZkNGFhZTIxY2M0NTIxYTY0ZjhkNGI0YjQ2MmQyNDE5MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby90ZXh0QmxvY2tDb25zdHJ1Y3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5YWY3YWYxNjQxYTEzZjljODYxZWMzMTI1YzFhYzAyNjMxYWYyNjM3NzNjYWMzMzhiN2MxYTA1MDEyMjdiZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby90ZXh0QmxvY2tFeGFtaW5lZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1YWRkOTcxZTNjMDE5MzYxNTA1MGU2ZmQyYmI0Yzc1OWU2ZGMzZmUwY2JmNmU5YjRjNzBiNWZmMjFjOGY3YWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2dhcy1taWNyby90cmFuc2llbnRMaXN0SXRlbVByb2R1Y2VkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTcwOWFiYjYwNzI1M2I5ZDY2OWUyMDQ1ODBhN2E0NDQxYmM0Y2Y4NTU5ZmVlOTMyYTc1Y2U4OGE1MDQ4YzI4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3RyYW5zaWVudE9iamVjdE1lbWJlclByb2R1Y2VkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODdkZDBmNDA4ZjVmZGU2MGY1NTVhYTA0ZDc2OWU1MzNlMzBlNzQ0ZmQ2YWFjNjVjMDYwNzcwODNiYTA1OWU5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvZ2FzLW1pY3JvL3ZhcmlhYmxlUmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZhMzZiMDViMDRkMDViNDRiYWEzZTVlMTlhYjBlMjUzODNhMzJkNTZjMTRkNjc0OWUxYmM2NTAyZTg2NWRjNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2gvYmV4LWgtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJjYmZmOTMyYWNiOTdlMDIzNDU0MzBmYWM0NjhhNmU0Y2ZkNGY1NjFmMWUxYWY2NmFmYjcwYWE2NzZhNDRkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvaC9iZXgtaC0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5NzNkOGJiZjMzMGJlZWJkNjUzNTQ0ZTVmMTdmZWE0NTkzOTAyODA3NWFjMzQ3NWM2NDgxODg2Yzc0NTAzODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2gvYmV4LWgtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNDhhYjUxMmRmYzA2MWI1ZGRkOThiMWQ3MDliZmQyZWE0MWU3Y2I1ZjIzOGQyNzBiZjkxZDA2YzRjNDIzYzU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9oL2JleC1oLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmM5NzE4YjQ0NWE1YjUzOGNkZGJlYjFiNWZiNzIwN2ZmYTVkYzk3NDMyMTk4N2VjM2NkMzYxZTkxNTQ0Nzc4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvaC9iZXgtaC0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImU5NTYxMWYzZjVmM2FkZDQ0YzMwNWQ0YWU1ZDU1ZDlmOTYyNzNlZTkxNzFlM2UxMWI0Mjk3MzNiM2U5ODYyMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL2gvYmV4LWgtMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTU5ZjUyZDFkMjI3ZTE2NDcyYzg2ZGY2NzcwN2EwZjMzMzE0NWZlN2MxMTAxZWI4OGM5NzQ5YmI4MWY3MmM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjMxZTZmNDgzYmI4ZjE2YTZjZTk0ZGI1YWE5OWZhM2RiMzU1YjU5MmVmNjY5NjE2ZWNiNjQxODllYTRkN2Y2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3ItY292ZXJhZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTgyMTliNTk4NzA1Nzc2N2U0OTgwOTZkNDIyNDJlOWI4MzI2ZmI2MzFhYTQyOWVmYzgyMDEyNmQzYmEyMTZmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1hZGQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmY2VkMTdmM2Q4ZjI2YTQxNjY5MzI4NzEzNDhjNmI3NDg2Yzk3MzJjYmY4ZmQ3ZmVmZDkwNDdhZjIxZWRjOTlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWFuZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4MGQyZDM4ZTQ3Njg5MDI5ZWJkNTM2ODk3YzMxMjc1NGNhZDU5N2M4ZDY4NDlhOGVhZmMwNDA3NTQxNWI0YzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtYXBwZW5kY2hhbmdlcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNjcyYTk5NTYzYjA1YTc2YmVjYjc0ZTBmZTA4MmYxZmYzZGE1YmE3NWQ3M2QzNjhiNjc5NzUwOTg2MDg0YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtYXBwZW5kZXZlbnRzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzNiZjE2MjZlZDNmZmU0YWJlMGVlZWIxODlhYzBhY2JmYzNhNDU4NWJmOTFlZDJiMjg3NjM3M2VlNGY4NzdhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1ib29sZWFuLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDRiYWQxMmQ1MWY3MjFkODJlOGRhNjM1ZDc2MjQwZmY0MGVkNTliNWZjOGRhY2M5NTI2YjM2NzVjMTU2Zjg0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1jaGFuZ2VzZXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmRhOWM3NTZmODk5ZDBjNjFhZTdiMzg3OTRjZDQ2YzMyODcyYTFkYzMxMTIzMTljNDFjYmE2OGZlOGY5ZTQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWNob29zZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyNmRiMjFhNWQ0MzRhNTBlM2NkODRmNWExMjViMGUxOTQ1MGU2OTk0YWE4ZTA2ODFkNDA5NmZkOTAzNTE5YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtY29hbGVzY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2N2YwMjBkZTAyZWY2NWVjOWJjNTRmYTJkZTAxODE2YTNiZTcwNDM2MDBlNzJlMzdlNWFhNWFiYmZlMjBjNTEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWRlZmF1bHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTBhMDFiMDVmMDE3YTk4N2M4YjQ3ZWVlYjNmMzAwNTk3NGE1M2ZhOGU3NDc0OWZhYmQ2YjEzNTc0OTViMWM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWVtcHR5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTZlNmUyYjc1NmNkMTgwMDc4MmM0N2JiZDBkMGRkMDY4N2NhM2FiOTRmM2ZjOGZhNjc1ODE0ZjgxZDlmZDdiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1lbXB0eWxpc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZDRkZjk2MzI1MmE4ODdlMzU0YjY0MGM3MGE5N2UwNGRhMWVmNmJkMmFiMzkxMTExZGY0NDgwZTEzZGY2ZjMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWVtcHR5b2JqZWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDYwZmU4NTU3N2EzOGQ1NzJkYjcwNDNjYmI4N2E0M2RkN2RjNTJjZDI2MTkzNWU4ZDQzNDA3ODNlMDllMDk0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1lbnRyaWVzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWJkNGQ0NTNjNjc1ZjdkNjBkNWY5ZWJjMGJmNWFlZmYwMjBkMTcyZTgyYzdlNTNiNDAxYTUwZTQ4ZDJiZWY5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1ldmVudHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYTVhYTE1NjFlY2E2NzIxMzdmNzUyYTk4M2ZkOWYxZWYyNjZhMGY5Y2I0YjA2ODE4NTk3NzRhMmRjMjhhMWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWZhaWxpZi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMDk0N2RlYzYzZmQxMDIxYjRiZDMzZjRlZTRhNWMyMDQzMzFjMjNkMjViODk3NDExNzA3YmVlNzA5NGMzY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZmlsdGVyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjhhYzRmZGJjYWFmZTAwZmRkNTgyYThjM2Y0MTk0NjJjYWU4OTUyY2FmOTQ2NDRiNTczYjNiN2I4ZDEzZTRmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1maW5kLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGUxZjE1MDljMGE3YjNkZmJiY2U0YjY1YWFhNmVhZTdkODllMDk0MTRlNjU1NzAzNjAzYzk1N2NiYWQxMjM3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1maW5kZW50cnkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOWVkZDAxNThhZjc0MzkzM2IzN2QxNjU5NzAyYmQyYWU5ZTNhM2QwZjRmYjIxN2Y2Nzg2ODE5ZTQ1YzI0NDIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWZsYXRtYXAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYWRiMmI5NzNmNDhjMzBkMmM1NTFmM2M1ZmZlMmJlZWQ0YTI4NGIyODQwZTA5YzNmMWYyYmE1ZDlmMGZkZTNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWdldC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3YjFmY2Y2ZmIxNTA0MDg2M2MxYjI5ZjAyNTU3MTRjMDQ5ZDIyYTZkNjNlZWI5MTAxNDdkODM5YzgyNzQyZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtZ3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYWRhNTcyYmE2YmUyZDFjZDBmZTczZjJkNjdiYjgzMDMzNWIwZTY1YTUwNGU0NjJlZjcyMmJkMWNkYjY1ZDI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLWd0ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1ZjhkMmEwOWRjMjgwNjNjYWU0MDY0YTcyYzMzNWI3NDliYTIwODU1MWJiMGIyZWQ1MjZkODViNGFmOThkYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtaGFza2V5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDA2ZGIyYmJjYjRlYWRkYmU1NzRlYWI5YmUwNDE3OTMyMzE3MzkzMzU5MGQ0M2M1ZmExYWE4M2I0NGZjMzBjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1pbmNsdWRlcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjNTI1YjdhMzk2OWMwOTkwYjQzOGU5MTE4ZjU4ZTcwYTM0ODU2YTE1OTVjN2ZhNDE1MmU0NDFlOTUwNjAxNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtaXNlbXB0eS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmN2JjNmQ4NjYyYzJkODVmMWZiM2M0MTY1NDBjNDFiZjE2ZTI4OGE4NDdhMmVmM2VjOGQyNmQ5MGFhZGI4YmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtaXNraW5kLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDZkOTUyMmM3YzEyZmUxNDQyZTg3NDI0MDJkYmI0OTRhYThiNmQ3NDE0ZmMxOWU1YmRkNmZkYTcyYzRlYmEwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1qb2luLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzY2OTYwNTcwMDJiYTQzMjRkNWM2YjRjY2RiNGUyMTg2OTZmYmVlN2E5Y2UyNzA0Mjc2N2M5ZTgzZDQ2N2EzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1saXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTI1MzczOTllMTY5N2QzZjAwOTk0ZTVhZjk5ZjhlMDllZjBjM2FlMjQ2ZTU2YjVjYjk3NmQyZGZkMzhiMzFhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1saXN0Y29uY2F0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM2NmZlYWM0NDQzNjk3MTBiN2E2NGJlZDMyZjBkOTcyNGYxZDBlZGVhNGRiY2MwMzAwZDMyZTQwZGYxMGI5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1saXN0Z2V0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjNlOWQwOGI2NjA4MzdkZjYzODgwMWZhZWQ3MzhlMjI2ZDNkYWFmODIyYzFhYTc5Yzg3NjNlZmQyYTc2MmM4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1sdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyNWRkMmNhZWU5NDY1YmQ5Yjc1MzEyNjc2YmFhMGJlNTQ3MTkyZWUwMzVmYmY0ZWM5MzZmMmQwNzRlNDJlNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtbHRlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjZhNTg5NzY1NzdmOWZlOTQwZTYzMGMwZmU3NzdjMmNhYjI1ODU4ZWI0N2IwODA3MWIyODI4Yzc4Nzg5MzYxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1tZXJnZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5NDg0NWNjNTNiMTY4NThmYmQwYjczMzczNTgzZTg1YTNmMGJmYTkyMWNhMzMxN2ViZGUzNzA0Yjk1MTUzMGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtbmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTIyNGU1ZGZmZTMwN2VkNjdkMWZhYzdlNDgzY2EwN2UzMDJiNDQ0Njc4OWRhMGVjZWI2ZTE2MWEzMTI3YjMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLW5vdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0MTI4ZjkxYWI4OWQxZmM4MGIyYTNiNmQ2OGVkMmIzMTNmMDE3NzU4OTkwZGFkYjg3ZTA3OGNhNWE3ZjRmOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3Atb2JqZWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWEyZDdmNDBlZjMyYjg4YmU1OWNmOGE3NTJjMDhmNGFmNDE0MThmYzJlYzExNjYzMTljODU0NjA5ZWQ5MzRiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1vYmplY3Rmcm9tZW50cmllcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYTlkNGJmMmEwYWJhZjE2MjcwOTUyNTAyOGM4YjcyNmJiNzhkMTdlNDM3ODBmMDM0ZDdjZTRiYTc4YTA2NGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3Atb2JqZWN0c2V0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTFhOTViOWI5MWE0NDhlZTk0ODdlMjU2MWIzNzNiMjk0Y2FkZWI3YzAyMDczYzEwMDM0YmI2Zjg3NThiNzk2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1yZWR1Y2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOGUxYzkxMTg4ZTg2YmVjNTk2YzZiNjgxZmQ5NTFmNTMxYjAwNGJjNzhmYTk4NWE5ZDAzZDI1NTYxNWY5YTUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLXNsaWNlYWZ0ZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2E1OTc3ZGNkNjY5NDMzMTc2OWQxMWZmOTc1OTY1Zjc3ZjY2OGRkMjIxMGZlMjE4NTQ3ODFhYzMwMDM2ZmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLXNvbWUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ODM5ZGVkZjk5MzJlM2E1NGZmZWI4ZTkzMmRmMjliMjkyNjlkNDRmNWFhY2M2NDdmZjljMjQxZWQ4ZDJmYTAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9vcGVyYXRvcnMvYmV4LW9wLXNwbGl0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjMxYzE3YjQzOTlmNGQ1MzJhMjNlMGMwOWE3MGVhZmNlYWYyYmYyNTFjNGVlOGM5NzUyMWNhNjBjZGFiNmQ1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1zdGFydHN3aXRoLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGQyNmVmZGZhOWU1MmQyNDhjZmJkOWI0ZTkzYzVkMGUyNjcyZjRlNzNlYmYwNDVkYmEzODExYjZkMDgwMmE4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvb3BlcmF0b3JzL2JleC1vcC1zdWJ0cmFjdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiYjMxMWE5N2RhOTEyNTY5MWVlYWM3NTAyNWZmZjZiODc4ZTE1OGE1MGRiOTJhYjk5MDA4YjYwOTljMzE5YjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL29wZXJhdG9ycy9iZXgtb3AtdW53cmFwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM0NDRjZDdlYzNjNGI0OTc4N2Y4MTFkNDQ1NmI4NTYwM2NkYTQ4NWQ4YmQwYWI3MmRhZmU3ODYyYTVkOGQ1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvcHJvamVjdGlvbi1jYXRhbG9nLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1NjJkYWY4OTFlNjI4NDA1OTZjZDVkNTFmZTQxZmRhMDVlZDQyOGQ2NzMxNWNjZTBkZGQ5ZDQ5ZDg4M2M4ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZjU0NjZhM2QwY2JlZmI2OWQxYzU4MjBjZjk4MDY2ZmY4NGVkYzc4MGZkYWMxODI4ZjYyYTk3OWI2Yzg4YTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9yL2JleC1yLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhNjNkMzlkZGQ2M2NkMTRiYjgxMmE2NTViYThiOTc3NmMzNGRlNjExZmUxNjc0OTBmNmM4MzNjNGFjOTNmNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MjdiMDlhNzFiYzE5OTVjNzVmYjRhZjVjYzVlMDcxOGVlMTcyOTI2ZjdiYjFhY2RlNDUyMTc3NTBkNGNiNDBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9yL2JleC1yLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2FlZTg1YTU3NjUyNzM0ZTBiOTVlNWYxOTIxZThmZjdiZWYyYTY0ZjI4MGQwODNmMjI2NjVlNTUyNDYxNWExNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvci9iZXgtci0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzN2I0NmY1MGQ4NTg3OTYxZjlkNWFlNWE2OTgxOTg4MTFkMWJjZGQwZTU5NzllMWY5MjcxZTFjNDg1NTc5Y2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MjI3NDRkZTBkNDI2YmFmMDllMzVhYjg2OWNiY2I5ZjE5YzFhYWVjNzk0OGY2MDAxZTRmZmE0OGIyZjNlZWNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9yL2JleC1yLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBkZWNjZTI0YmU2YTljNDMzY2M0YTA5ODJjNmViNzFlYmVjNTA3ZDI4NDMwNDlmMWZiNTZhMmFmOGQ4Y2YyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvci9iZXgtci0wOC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyNGUzNzJhMWFjODFmYjg5N2NlZDhmMWE0MDQwMzhlMDI4MTI5ZWU4MDJlODQ0MmNhMzZlYzFhOGRlNTQ0MTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3IvYmV4LXItMDkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Y2FlYjQxNDVkNDYzMmViYzY1MjRkN2MyNjMxNmY2M2RlZDJjZTE3MzA5ZGQ1YTg5NDkwMmVjYzdkMjhjMjE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9zL2JleC1zLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjI5NTFjM2I4ZjdjZWNhYjA3YTVlNjUzMzNjMzQ4Y2Q2ZTRhYzBmY2ZlOWJlNDY5NjVmZDg4YWNjYzg4ZTA3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvcy9iZXgtcy0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1YWEwZTU4MWQ1N2Y3ZmE4YzNjYzBlN2ZiNWE0YTM0YmE2ZGM3Mzk2YjExZGE5ZjczNDkxYmEwMTllMjg3NGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3MvYmV4LXMtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDQ3MzdiY2FiMjJjYzY5NzhhNzljM2M5ZmQ0N2YzNGM2ODMwYTU2MzA3MTVkMjNiNGE3YTYxMTYzZmJiMWZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9zL2JleC1zLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE5YjFmY2FkMmIzOWFlNzliMGQzNzY3ZjdiOTBhODJkYzgyYzUwNWQ0NWEwMTE1MjE1NWUwN2M5NjkwYWQ0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvcy9iZXgtcy0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4ODIxMDk2MTUzZjM2MTU5ZjM1N2JmMjAyMDkyNzRlNWU5YzA2MDgwYzZhYTRjY2RkY2RlZTk3ZGY1Zjg1MmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2ZpeHR1cmVzL3MvYmV4LXMtMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjgyNjlmNjIxMzQ4ZjQ2MDk3OTRiM2M3OWEyYzgyMTMxMmVmNDA4ZDY1MDQxZjJjYWVjZDc0OTYxMzE3MWU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9maXh0dXJlcy9zL2JleC1zLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2QwMjA2OWRiMDY3ZGQyZDYxNWQwZDRjMDBmNDYzMGRkYTFhMGE5ZmFmOGMwYjI4MWFkZDUxNDcyZmI5MWI3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9jb25mb3JtYW5jZS9iZXgvZml4dHVyZXMvdmVjdG9yLWNvdmVyYWdlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlZDQwNmNiZjI4ZTY1OWZmMmIwYjdhYjM3YmI4MzliMWI2NGEyNTk1NTU1YTM2ODJjZGJiOTc4ZDkyMmY4ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L2dhcy1tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjY4OWUwY2Y1MWIwZjlhZmE2YjE4YTY0MGUwYzc1NTQ3MDkyMWE3YjBkNjZmNjJiZmMyMjA2Njc5ZGU2NDBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9yZWdpc3RyeS9Db21wdXRlMi5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImI0ZjAwYTFmOTUzZTMzNzk4MmZkYjY2OGVlZTFlOWZhOTg3MTQzYzFmY2ZhYmE5MWNlYmQ2MmEwYTM1OTU2ZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L3JlZ2lzdHJ5L0ZpeHR1cmVJbnRyaW5zaWMuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Y2ZhZjdjZDlmZjhiYjRiODMzNjkyMDAxZjJmNjhjZGE1MDE3OTExMmQ1OGU4ZjJlOThmYTJiZmNlNzJmNGVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZvcm1hbmNlL2JleC9yZWdpc3RyeS9Tb3J0Rml4dHVyZUludHJpbnNpYy5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0MzgzM2MwYWM4YTM0YTExYzk3NmMyMDE5OWM2YTg5ZTgxNTM2MTQ0N2IxNTc4ZTg2ZTUyNmIyOTQyZWExOGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvY29uZm9ybWFuY2UvYmV4L3JlZ2lzdHJ5L21hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlNjQ1NmFhYTg0OGE2MzcxMDcyODBkZTkxMzViNGRkYmRhYTk1MTQzNjgxMGYyMDJiZTBiMWNhZGQ0MWNjZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvZml4dHVyZXMvY3VzdG9tZXItcGF5bm90ZS1zbmFwc2hvdC1iZXgtZnVuY3Rpb25zLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU3MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGJmNWM3ZTRmMWExZDQwODg1NjBmYTIxNzlmYzhkZWJiYTBkZTljZjYzMTAyMGRmZWJhMjI2YTlmZmZkZjQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2ZpeHR1cmVzL2N1c3RvbWVyLXBheW5vdGUtc25hcHNob3QtZXZlbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNTUyNTk1MDNmZjQxMmU1MmI1NGQ5MmYyMDRjMzNlOTc4YzM0OTA4MjdlYjQ5NjA3OTY0NGUyMzNhOTQ4MjViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL2hvc3RlZC1yZWxlYXNlL2Jhc2VsaW5lLnByb3BlcnRpZXMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhZDE4ZjQxMWI2OWI4OTBjN2UxYTJkMjNlYjU0YmQ2MDIyMThlNjc2NGJkYzMyYTIwY2FlNTA0OTE1M2UxYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvaG9zdGVkLXJlbGVhc2UvZ2FzLWV4aGF1c3Rpb24tdHJhY2UtZXhhbXBsZXMucHJvcGVydGllcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmUxY2RkYjQ3ZjMxYmJkMDZjMDk1Njg3OGI0YTJkNjY3MDkxMWQ2ZWFiNWRiNzE4N2I3OTI0NmNjZWIyOTA1ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9ob3N0ZWQtcmVsZWFzZS9wdWJsaXNoZWQtYXBpLWluc3BlY3Rpb24ucHJvcGVydGllcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjg4OWIwZDFlNjc4MjFjYmZjY2I0ZmUxNmUzMTBhMjc2MmYxMGQ3NTNjZGMzODNlMzU5MGMwODI5Y2RmODI0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9ob3N0ZWQtcmVsZWFzZS9yZXF1aXJlZC1wdWJsaWMtYXBpLnR4dCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTU2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhY2I0NzEyZTNlMDNjNWJhOWE1OGQ4N2I0YTQwYmVkNGUxZGNjYTc2ZWQ1OGVmMzU1YTc3ZjBlZmM5ZDNjOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzAxLWlzLW5vZGUtcHJpbWl0aXZlLXRydWUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2ZhMDg2ZGMzZjgxYmM2YzU0ZGU3NDVjOTYzNjg2MDZiMDM5YjEyMTE2NmQ0NDIwMWYzMTJjODU4NzRiYTAzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDItam9pbi1saXN0LXN1Y2Nlc3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdhM2QyMTUxOTI3MGZhYWI2MDhhNWI1MDA5MTE5YWQ3MWQ5NWJiOTRjODQ5MDFmZDdhNjhjZjA4ZTJjNzdiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDMtY29uc3Qta25vd24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODZiNzgxYjZhOGVlYzEwYjM5NWJkODEyYjlmNWJiMWE0ZTRjOGVhNzQ5MWM5YmVkNTRiMGZiZjEzMjliYjhlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDQtY29uc3QtdW5rbm93bi1jb21waWxlLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkYzlhOTY3MTY0MmI0MmVkODFkYmQ1NTIxOTc2MmZlZmY3NzAwMGM4YWEwZjE2YmM1NTE2Y2RiMTgxZWUwYTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzA1LWxpdGVyYWwtcHJlc2VydmVzLXVua25vd24tY29uc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDg5MGQ5YzhlNzMyNjg1YWFmN2I3M2JiNjA2ZmRmNjk0ZjM1MjRmZjU0ZDEzOTE4ZWJiN2EzZTgzM2E3OTUwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMDYtbGl0ZXJhbC1yZWplY3RzLWJleC1pbi10eXBlLWZpZWxkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI1ZTYyY2Y1MDAxZGVlZGU3YmU1YmRmZmU3MDljMTdjYmJkODFjYzQ1NjU1NDgwZjAyYmZjMzg5OGU5Y2FmMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzA3LWZ1bmN0aW9uLXR5cGVkLWludGVnZXItcGFzcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlN2FlMDA4YjgzYzIwMDAxMzY4ODFhYzU5NWQ3ZTVkMjI1ZmE1MDIwOTZhOThjMjY3NDlhNjQzM2IyYzg3ZTU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8wOC1mdW5jdGlvbi10eXBlZC1pbnRlZ2VyLXJlamVjdHMtdGV4dC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMzYxYTEzZTYwODIyZTNkMWIyODU2ZDY3ZWFkMGQwNTlkMmY0MTg1Y2ViM2M2NThmMDViODNiN2RhYWIxMTI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8wOS1mdW5jdGlvbi1zdHJ1Y3R1cmFsLXBhc3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGIxNWEzZjUyMzc0Njc5ZDBjYWI4NGRhOWJlOGFmYjY5Zjc3MGUzODM2YjIxODY4ZDJkZjRlODIzZDFlODk4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTAtZnVuY3Rpb24tc3RydWN0dXJhbC1taXNzaW5nLXJlcXVpcmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg1ZjZmNTgwODJiZWZjNjgzNzcwZmI0MDViODVjNjc2ZDY4ODJlN2M5MDUzZDk0N2JlYjg1MzM0YTU0OGE0MmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzExLWZ1bmN0aW9uLWV4dHJhLWFyZy1jb21waWxlLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjNDQwY2M4NjdlOTFmMDIyMzQ1OGEwMDZmOWU5MDhjODgzMmY4MmNjMWYyMmJiMjg1MWExMTY5YTFlYTBkM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzEyLWZ1bmN0aW9uLW1pc3NpbmctYXJnLWNvbXBpbGUtZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDU4NGQwMzI3MGQ5YWIyMjUxMDkxMTdiYjkyMWUxZmQwYWE4YmZhMzQ2NzY3YjQzY2RkMGUxOWM3YjA1NDkwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTMtZnVuY3Rpb24tcmVzZXJ2ZWQtYXJnLW5hbWUtcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JmZjJjNmU0YTc1OWE2ZGIzMGM0YWE1OWEyZDI2YjBmMTllYWQzOTA4MzBlNzk3NDQ1MGFjMDA1MDQ2NTYzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMTQtaXMtYmx1ZWlkLXR5cGVkLW5vZGUtdHJ1ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzkxN2UwZDMwMGFlOGM5NTVjZjdmOGRhZmEwMjE3NGMyOGQ1MTU0ZWJlZWI4ZWViZjliYzM1ZjRiYTk5YWJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8xNS1pcy1ibHVlaWQtd3JvbmctdHlwZS1mYWxzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMGFlMTdiZDNjZjRkMjJjYTFkMTQ3NTFmN2FiZjk5MmFiNjQ5YjZhNmEwNGU4ZDc0MjNhOTFlODgyZDdjYTViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8xNi1pcy1wYXR0ZXJuLXdpdGgtYmV4LXJlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxNWNkNDA0MjYyNTM3MzQ1NTc5MDU1YWQwNzRjMjk0YTI4YTZkYTExMDgxMzQxNzQ2ZjhmMDgxMTBmYjgwYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzE3LWRvY3VtZW50LXNjb3BlLXJlbGF0aXZlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3NzdkODg1MjJhOWNiMTIzMzM0NzA2ZDQ0MTk5N2Q5NzNlODJhOTA4Yzk5NDZmM2FkNjU4YThhYWE5NmFhNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzE4LWV2ZW50LXZhbHVlLWxvY2FsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzMzY4NzcxZjljMDJhYTI5MmQ3MWFiOWRkZWFjNzRhMGY3MGQxNzAyYWNiMTg2N2VlMjZkZTE5YmFhZWU3YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzE5LWN1cnJlbnQtY29udHJhY3QtdmFsdWUtbG9jYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmEzODAyZThkMzM3Y2VkMmJkYzA1ZGYwM2FkMWRmOTNiYTEzNjk5MmNiYTViY2JmMzkzZWM4ZTdiZWNlODY5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjAtc3RlcHMtb2JqZWN0LXZhbHVlLWxvY2FsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1Y2QyNWVjNDNkOWVmZWNlMTM0MGMzY2RhZjkzODc5ZDBkNmI5YzQ2MTUwY2U3Y2M1ZmM1ZTI5OTcwMDQwMDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzIxLXBvaW50ZXItZ2V0LXZhbHVlLWxvY2FsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiMjYwNDEwYTk3MWE0NDYwMjQxNDk2ZDRmMTcyZDRmMGFkNDZiYjQ2MzZlMzZkNzgzNDRkMTM3OWM4MDYyOTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzIyLXBvaW50ZXItc2V0LXZhbHVlLWxvY2FsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5NzI3YjVhM2JiZjRkNzZhODYzMzY1MjY4NDIwZmUyN2QyMDg1YTIwMTg1NmYyMTM1YmY3NjBhMGJjOGI0NmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzIzLWR5bmFtaWMtcG9pbnRlci1taXNzaW5nLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5YmZhMzhjMzkwNzIzOGY5MzNlOTQzMTZjOTVjNjc2OGVlZjIzZDk2YmI0ODI5NmE2MDA4NDYyZTQ2NGM5N2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzI0LXBvaW50ZXItam9pbi1lc2NhcGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmM5M2ZjNzgzZWRhNzg0MmZkNWM5MmUzNGI1Yzc1YTBiYjk3YTc4YTMzZjNmYzdiMTI3YTJlMTI2NjMxZWExMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjUtYXBwZW5kLWNoYW5nZS12YWxpZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZjUxMjNmMWEyNTJmYzhjYjYyZDE5OTE0YTZlOWQ1ODIwNjdhZjYwOWRjNTM1YTk4ODVlM2Q4NDI4ZWIyMjYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8yNi1hcHBlbmQtY2hhbmdlcy1iYWQtb3AtZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDMxZjcxOWIxYzUwNjg2ZGU3YmQ3NDllYjVjOTQ1NWIwZTNmMTRiNDg0MmUyMmM3N2I2YWYwNzlhM2Q5MTNhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjctYXBwZW5kLWNoYW5nZS1taXNzaW5nLXZhbC1lcnJvci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDlmZjMwM2QwNmMxZDkxYmZlN2I1YzRlZDRlODE2ZDBjMGZjOTVlOWY0ZGYyYWVhODA3OTE3NTMzOWRhYTM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8yOC1hcHBlbmQtY2hhbmdlLXJlbW92ZS1uby12YWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjAxN2ZkNGE2MzcyZWQwYjkwN2M2NzBmZTZkNzdkZWQ5ZjQ2OTRjMGZiYTlkOThlNjEzNWUzYzY2YWI0NThiYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMjktYXBwZW5kLWV2ZW50cy1iYXRjaC1zdWNjZXNzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3ZDgxZGNiZGM4YjMzMjQ4ZTM3ZjQyNTlhZWUyYTY4YWU4MGU2ZmQwOWE0NWM4ZjQyZjJkYTU4OTZmMTA4ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzMwLWFwcGVuZC1ldmVudHMtdW5kZWZpbmVkLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImJmYjAxNzJjNzRjOTljZDNlYTkzZjUxMGMxNjNiM2I1ZGI1M2M0ZjlkYTQwYmFhNGY2NzhhOTI0NTQ0MGNlYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzMxLXJlc3VsdC12YWx1ZS1leGFjdC1sYXRlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmMxMWI3MjU4MDhiYzZkOGY0MGYwYmYxYzkzMTFjNzMxZjU2NDU3NjM1M2QyMGIyZTg5ZDczYzhlMzNlNGMzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzItc3RyaW5nLW9wZXJhdG9ycy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmFkNmRhM2E3ZWZiZDU5ZmFiYWY0MTkyNmNmMDdjZGM2NDNlY2E4YmI2OTZhNzEyMTZiMGY2NzEwOWFlMDM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8zMy1sb2dpYy10cnV0aHktZW1wdHktY29hbGVzY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTEyMTI1N2Q1MTk2ZDg0YmJkYmJiNzlhMjVjMWYyOWZjMWJmMzdiNzBjZDMxMzdiMDIwNTc3ZTgyZTE4N2U1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzQtbnVtZXJpYy1vcGVyYXRvcnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTgxOThmNmM5ZjBlYWEzMWRlM2I5ZDI3YzVlOTBkZWU0MzZlYzUwN2Y1ZWU0ZmI1ZjBjNWNjZWY4NzE1NTRkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzUtbnVtZXJpYy1ub25leGFjdC1kaXZpZGUtZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2VhMmVlMjA0ODkzMDYzOGJhNzU4YTk4ZDYyZmY4YjIzZGRkYzBkMzQ4YmFiZGMzYWMzNjg1ZTI1OWNiYjQ5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvMzYtb2JqZWN0LWxpc3Qtb3BlcmF0b3JzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImFkYTE2MmY3NTdhZTUzYTFiZTRhYmRmNmY1MjA3YjI4YTIzYzU4MjUxZjRlMzFmZDY0ZDkzMGZlNDAxOGMzMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzM3LWJsdWVpZC1zaWJsaW5nLW91dHB1dC1jb252ZXJzaW9uLWVycm9yLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxYTQ4YjI4NmZkZTE5OWU4ZjZlMGY3OGQ0NGJjYWZkNzAxZjFhZGM5OTFjYzVkODNkZmI3Y2JhYmEwYjIzZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzM4LWhvdGVsLWNvbmZpcm1hdGlvbi11c2UtY2FzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MDFjZjdjMzNiOWQzNjY2NzQ1ZWNjOGUwYjY1NzU0NzM4ZjFlNWUxYThiN2Y5ZjQ2OGIzOTU4NjQ4NmQ4NjY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC8zOS1wYXlub3RlLWNhcHR1cmUtY29uZGl0aW9uLXRydWUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQwODE3NmQxNjJkMmQyMmYxYmEwZDNiODE3MDcyYzFhMjY4N2IyNzRlOGI0Zjg0MGEzYWFlZDViYzNiZjI3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDAtcGF5bm90ZS1jYXB0dXJlLWNvbmRpdGlvbi1mYWxzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MzIzMDNkOGQ5ZmYwNThlYjczNmZhNDUwYzA5ODY3ZjQxOGJlM2NiZTBhODE0Mzg1ZjU0ZWI4MzY5NTA0N2VkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80MS1leGlzdHMtbWlzc2luZy1mYWxzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMWU4YjEyMzg0MDA0N2NjNTY3ODdkMzU5ZDkwMWFiNjEzNjA1Nzg1NTk1NWRhZWU2ODdlOWMxMGQ0OGFkNjVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80Mi1vcHRpb25hbC1ub3RlLXZhbGlkYXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDM2YzhhNTNmNDY2NDUxOTk1YjQ5MzIwNTE2OTA2YWZkMjhmYjY0OTQ5ZTg0Y2M4MTRiZDBjYWIxYTc2MTRlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDMtZm9yZWFjaC1saXN0LWluZGV4LXBhdGNoZXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTUyNjgxNGYwOGNmZjNmM2I2NzcwNjgzZDVhNWUyYmY4Y2UxMTY3YzFjOWRhNDBmMmNiMDI4MWM4NzM0ODlmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDQtZm9yZWFjaC1vYmplY3Qta2V5LXZhbHVlLXBhdGNoZXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjQwMDBkMGFjZjMxZGM1MzE2ZWVkMjVhZGQ3NjlkZmNjNzliMWY4MTM5MWZjZmRiMzVkY2JmYmM5ZmFhZDJhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDUtZHluYW1pYy10ZXh0LW9iamVjdC1rZXktbWlzc2luZy1lcnJvci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzVlMWVjMjY1MjQ4NGQ4MDY4ZjI0MGEwOGVkYmM1MjM2MDY5ZTFlNzNkMWEyZTNkODNkY2FmOWFmYjM4OGM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC80Ni1keW5hbWljLXRleHQtc3RlcC1uYW1lLW1pc3NpbmctZXJyb3IueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjM2ZDhkZjVkZDA3OGU5YzI1OTZjOWEwOTgyYjhlZWM0YzI0MzQ0ODAyNDI0YzVlZTUyNjgyM2UwNThmZDhmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDctcmVzdWx0dmFsdWUtcGFyZW50LWNoaWxkLXJlcGxhY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDE2ZDIwMTg4ZjFiNGJjYWI4MjNhOGExZTY4OTQ2OTQ1YWRlYmU1OTY3ZDA5ZWVkOGQyZjU4Zjk0YzE0YTM5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNDgtcmVzdWx0dmFsdWUtcGFyZW50LXJlcGxhY2UtdGhlbi1jaGlsZC1yZXBsYWNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImFjYjNhYjU4MDA1MWRjMWMxOGQ4MWY2NmRlMTViNDYwN2E1ODI3MjJhZGVlMWI4ZTU5N2I1NWIwMjQ2ODA0NTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzQ5LXJlc3VsdHZhbHVlLXBhcmVudC1jaGlsZC1yZW1vdmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjViZTcxNmFjZGM2OWY1NWY4YWRkY2E5ZDAyNjlmMjdlNzNjOGViYWU5ZDU4ZWUxMjI0MzM3YTBmZjNmZjE2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2N1cnJlbnQvNTAtcmVzdWx0dmFsdWUtbGlzdC1pbmRleC1yZXBsYWNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlODc2MWIxZDMzMmZmZGIzZDNiMTcyZjVkNzgxOGFhZjNjMDcxODliNmM3OTAwOTVmYTQwYTE2YmRkM2QxNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzUxLWdhcy1sYXJnZS1vdXRwdXQtY29zdHMtbW9yZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OTVlYzI3YmYzMjgyYzcwYWYzZDI4MGNjNjlmZTQ1MWI0MWY2NWI3MzNhOTM2N2QxMGE2MDE3MjNjYWU4YTUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvY3VycmVudC81Mi1lcmdvbm9taWNzLWd1YXJkcy1raW5kLXBhdGgtbGV0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5MDkzZmY1Mjg4N2ZlMDNkMTkzY2NmNTE4YTQ4OGYzNTE4NTMxZWMxYmRiZDgyZmNjYjQwZGNhYzlmNDBiNDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9jdXJyZW50LzUzLWNvbGxlY3Rpb24tcXVlcnktY29yZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Zjk5MDQyYTFmMzU3ZjgzNWJmNDk3ZTFlYzNiMmQ0ZDFmNDA5ZWUzNjY0MWEzMDc5ZGNhNDA4NjY2MDExNTZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMDEtcm9vdC1leHByZXNzaW9uLWxpdGVyYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzM4NzkwMjY0MjE2YWJiMGQzNTVlMDdkZDAyZTdjNGM1NjMxMzI4NWNiNTczYzIxYTRmZTdhMmI4YWIyOGM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMDItZW1wdHktZG8tYm9keS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3OGUwODYzZWNmNDRlNWVlOWMxMGQ5ZjdiNTRhNDhmMTYyMWZhMjhmZTljMjQ2YmZhYWRjNTVhYzU3MzQzMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAwMy1yZXR1cm4tbGl0ZXJhbC1zdGF0ZW1lbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWIxNGZkZDgwOWUxMzkyY2VmOGIxMmUyZDE1M2I1N2NhOTY5NTJiMjIzMTQzMTJiYjI5MzdiZDBmNDgwZjI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMDQtY3VzdG9tLWV4cHJlc3Npb24tYmFzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzNDRjOGQyMGVjYmZiMjI5YWFkMjk2MmY4NjI4MTNiOTA1ODE1YmU1OWNiNzQyMjEzNDlmNTA2MjUxYWQxMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxMC1kb2N1bWVudC1yZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDEwMTA2NGFmYmEzMTE4ZGY4NWQyODc0YTI3NjdhNTU1YWFjN2Q3ZGQ3ZDMxY2JiODA2ZGFhMjQ5MTVjMjA5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDExLXJlc29sdmVkLWRvY3VtZW50LXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzI5YmM2MTU5Y2I0MTg0OWNlNmIyMjQwYjZhYzhjNzczZmQyMGFkYzU4ZDI3Mzg3ZmFiODEzOGJhNzU0N2JhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMTItZXZlbnQtcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImYwMDA2YmE2Nzk2OGQ0MTA0YTQyNTllMjYxNWM5YTE0ZjUzYjk5NzliYTU2NjYxNzc1OTZmMzUxNGVmMTYwNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxMy1jdXJyZW50LWNvbnRyYWN0LXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZjYyNTZlYWMzZTNkYWY4MDU5NDQyYjZkNWJlYTNmNjY1NTEyZDVjODYzZDQ0NjY0ZTIxY2IyZmU2MTkwOWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMTQtc3RlcHMtcmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhYjI1Y2VlNTMxMTJiOWY0ZWM5Zjg0YmI2MGVlZjA1ZDZlZWQxZTI2MzQ2YjQ5OGE1ZGRhZjYzZWIyODVjMzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAxNS1iaW5kaW5nLXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjM1MzUxZTkxMGYyNzVlZjE0M2VkYjE3NTQ0NjQzZDY4MDcyMGUyMWNlOWEzOTQ1NmIxYmZlNmI1NTNkZjc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMTYtdmFyLXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZTEwNDA2ODI5YjM0MmQ5M2IxNGM0OGYyMjg1Njc1NGY4ZDM1YTY4MWM0MGJlOGRjZTM1ODkzNDgzY2YyNzYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMTctcmVzdWx0LXZhbHVlLXJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTIzOGEyZDg5NDE4YmQxZGMwZWJiZTJiOGNlMDMzNDIzMDFlMzU2YjAyMzc5YmIxMTQ4M2YzY2M3YWM3YmJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjAtdW5hcnktaW50ZWdlci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImM1ODU4MjkwOTVjODNjMzZmMDRiMTMzMjE3OGE2NmZiOTJkMjU1YzllZTM1NmJlMWM2MjU0OTMyOGFhNGRjNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyMS1pcy1zdGF0aWMtcGF0dGVybi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2NGRhNmIwNjdlZTliOGEzMmNlOGVjODQzZTIyYzgwZWFlODE2ZDlhMjE1ZjIzZTI1NWQ0MTViYjcwMmE0MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyMi1jb21wYXJlLWVxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQ1ZjBlYTUwYWNhZTNiODAzNzMzYTdjNTk2ZWVmMmM2M2E5MmFjMGIxODQ1MDI1OWY1NWE1ZDI3ZDQ4ZmJkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDIzLW51bWVyaWMtdGhyZWUtb3BlcmFuZHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTNiZGQxNDAzNmZmMjI4NjJhMzE5OGI5MjBkODM0MWE5YjNkMzA1ZjE5YzNkYTY4NDMzNWM5OTgzMmJlZmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjQtY29uY2F0LXRocmVlLW9wZXJhbmRzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjZjMTkxZjZkMjk3NjVkYzE1NjM2NTU5YTk5NmMxZGVjNGQxMDg3Y2RiMmEwMWU2YWJlMTkwODdjM2NlNTkzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDI1LWpvaW4ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MmI2OTU0ZGJlMmNhMWExNTEwMjVmNzI3YmM1M2UxZGE3ZGM5OTZkMWEzZWU3OTM4MWYzYjVjMDYyOTAzODAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjYtc3BsaXQtbm8tbGltaXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlN2RmNjFkZTNlYzJmYWU5Yzc5M2E3MTU1MDM2YTc2NWI4YzQ1NmFlZTgyNDExYTkyNjMxZmZhOTYyZTE0MGRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjctc3BsaXQtd2l0aC1saW1pdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5MWEyZDI3MDY0ZmJiYzJmZWFmOTM5MjM0NDM0NGIxNzQ1ZTBiOTg4MWJlOGIxY2IwYWMwM2ZiYjhmN2FjMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAyOC1wb2ludGVyLWpvaW4tdGhyZWUtc2VnbWVudHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTYyNDVlZGEzNzJhMGYyNjM0NzczNmRlMTc1ZmJlNDZhYzdmZTk3MDZiNDNjMjk3MTY0ZDdjMjMwYjEyMDhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMjkta2V5cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY1NjE0Zjk0Yjc0ZDRlNTUwZjQxYzU4ZjJjY2Q5YzAwMjYzZjQ5NTk2YjMzMmMyMGJlYjlmZjI0OGZjMGY5MGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAzMC1lbnRyaWVzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTE3NjM4YWYxMDZkOWUyY2EyMDU2NGMwODIxMDY1OTkzZGVhNDI1ZjMwZTY0YWZiYTBiMjVjMTdlZDQ5NzY5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDMxLXNpemUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTQwNzhiNGM1ZWFjNmJjMTNlNDQyNTU5N2JhZDg4MmJjNTExYzRiYjU0YmE3MDgwN2RkNDM0NjVjMzkzY2E3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzItbGlzdC1jb25jYXQtdHdvLWxpc3RzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTEwZWIzMDJkM2EwZjkyNmY0OTFkNTE5OWJkNzlkMGYzZTU4M2Q2ZTg1Y2ZmZjhlOWM3YzE3ZTE3MmVjNDgzOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDMzLW1lcmdlLXR3by1vYmplY3RzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWYxM2FhNjIyOGE2NjUzNDEwZDQyYjliZjIwOTc3YmY2OTdkNmQ2NGU0NzIwMmVjMTgyOGNhNmYzMWI4NDVjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDM0LXN0YXRpYy1vYmplY3QtbGl0ZXJhbC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhM2YxY2NhODA4ZTlkNWJmZTU4NTE0OGY3MTlmMjdiNzE4NzQwMWYxNzA5OTQ0YzhkMGQ2ZTIzOTc3ZTg4NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTAzNS1keW5hbWljLW9iamVjdC1saXRlcmFsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODRjNDdlNTE1Y2VjNzRhMmQ0ZjgxNGM1ODZkNDQ4ZWU4NmNiMDk1NmRkNmRkMGIzOGZlOGM1OWU4YjEyN2RiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDM2LXN0YXRpYy1saXN0LWxpdGVyYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjY3MGMzNjFhNWNmNWY5NmQ1OGM2Nzc1ZGU1NDUzNDIxNjliMDE1YzhjZmE5Y2M5MDEwOGUzMTM2OWEwOTdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzctZHluYW1pYy1saXN0LWxpdGVyYWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2RlMjgzMTZmN2Q3MDRkZTFlMTQxZTc0ZTljN2YzYmFiYTVkZTk3ZDEwYjFhODQ0YTkyMDljODk5NWJkMDA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzgtZ2V0LXN0YXRpYy1rZXkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTQ5NzNmOGQzODg2OGE3MTI5YmNlYTE4NGMyMmE1ZjNiMTNiZjYyZjJjZThlMDA2Y2YzMTg0YzI2MmRiNDA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wMzktZ2V0LWR5bmFtaWMta2V5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2ZjNmIyOTFmOGRkMGNmYjMwM2E1NmM5MDgwN2QxMmVmYzc1ODA2NmU2ODdhZWRmMzA4MjAwZTAxN2MzNTQwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDQwLWxpc3QtZ2V0LWhpdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3MTY4ZTAzMDc5NjBmYmU5OGIxNTUxOWJhMGJkMzg4NDYwMmUyMGJhMjQ2NTkxMmQ4ZTg4NzE4NzQ1OGRlYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA0MS1saXN0LWdldC1kZWZhdWx0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTAxMzNmZWNjMmExN2IxYmJiM2E2YTkwMzZjM2Y2M2I2ZmNjY2M5NjkzMjg2YzY5YzEwZWMxNWFiMzcwNmMxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDQyLW9iamVjdC1zZXQtc2NhbGFyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWI3MzMyZDQxZjA5NTAzYjk1ZjVlODI2ZDBlN2JiMTk1OGJlNGQwYzMzNmFlZjZhZWEzNjI3YjczODNiYWYxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDQzLXBvaW50ZXItZ2V0LWhpdC10d28tc2VnbWVudHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjFmMDljMTQ5NGY2MGFiODYwN2Y0ZjhkZjRlNGI2MTY1M2FmOWRhZjVmNDZhYmM0OGRlMjZlMmY3NThjZGNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNDQtcG9pbnRlci1nZXQtZGVmYXVsdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImFiMGZhMmY2Zjc1ODQ1ODRkOGJmZTI3MmNjOWE3YjFiZDVmZjczMTQxNGFiODQxZGNiNTUxMjY2NTZiYzM1NTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA0NS1wb2ludGVyLXNldC12YWx1ZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhNjI3MmMzZmVkNzUyOTgyNjk4MGUxZDE0YjYwNGFlYjFmZWQxOWYwZTIyODYxZmQ3NWM3YjA0YmE5YzcxMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA0Ni1wb2ludGVyLXNldC1yZW1vdmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NzExYzVhZTU3MmUxYjhiMzg4MDFlNGIxYjQ0MWU0YjVkN2U0YTA0YjhkMmUxZTM5NmIzZGYzZDMwMjdjNTI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNDctY2hhbmdlc2V0LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODU4ZDRiMjU2ZTg2ZWE1OGFhYzFiNWUxZDU3MzcxMjllOWI1MTk4MzQzMDI5YzU4ZTc0YjZmOGQ3ZDgyYWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNDgtZXZlbnRzLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTIxMTc5NDgzOTI5MWNlODZmMWQwYmMyYWIzOTViMmVjMWY2MjdiNWI1NzI5MjJlNzFjY2YwNDY2NDY0ZjNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNTAtYW5kLXNob3J0LWNpcmN1aXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTRmMmIzYTI2MTgxNWQ3OGEzMDYxZGQzODFmNTk1ZWZiM2M5YmE2MzdjNjg1ZGY1MDYzZjNmYzQxOTc4ODhiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNTEtYW5kLWZ1bGwtZXZhbHVhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkNGMxOGQ3NmRhMDUwZTkzMmQwNTczZjRhMDJiMWY5ZTVmYTI4NGUzYTgzMzVkYTc1YzlkOTFjYmIwYmRhZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1Mi1vci1zaG9ydC1jaXJjdWl0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTA2NDNjZTFjYmMwN2UyYTE3NDkzOGJmMDk1Y2NhMDhhOGExZDNhMTJjNjQ4NmQ1OTAzZGQ4ZjAxNGE0YmE5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDUzLW9yLWZ1bGwtZXZhbHVhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkYTYzZTBiNTUxNDJkNDU5OWM1NDk3ODY2M2JhNDNkZWIxODViMzkxM2E0YjYwNGEwZDBmOTdiMTA4ZmVjZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1NC1jb2FsZXNjZS1zaG9ydC1jaXJjdWl0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzc3YzUyNWUxYjc4NGFmZjRmYjNhMWZlMjczZjZkNzJmZTU4NjY2ZmVkNGRkNDMwMDM4MzcwYmEwOThkZGE5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDU1LWNvYWxlc2NlLWZ1bGwtZXZhbHVhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhZmRiYzA2MTc3MmQzNGU5OWU5ZDE2MTUxZjQ0ZDY5NmJmZmVlNzY5NjczMWJkNDA0NGMwZjJiNTc5NzM2MWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1Ni1pZi1zZWxlY3RlZC1icmFuY2gtb25seS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2MTJhMjdlMmVlZjc0NGNkZGVkODE4MzkyNDA5ZDljNDk0Y2VmYzE3ZjViNjFlMTdlMzJhMDEzNDMxYWVmMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1Ny1mb3JlYWNoLWxpc3QtZW1wdHktYm9keS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3ZTA4OGNjZTZiZWE0NTFiNGRhZjEwYTQ5Y2ZhNTAwODNlNWMxZGNlYmM0ZDU1NzY3ZmM5MTllYmQ1OWQ1MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA1OC1mb3JlYWNoLWxpc3QtYm9keS1hcHBlbmQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjBlYWQ2MjM5MGIzZGNiNTc0ZDI0N2I0ODZmZGM2NTg2YzkzNzk2Y2I3ODdhZDE4YzdhYTkwNWU1ZDRmNTNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNTktZnVuY3Rpb24tY2FsbC1uby1hcmdzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTM5MTU4ZDRiOGQzZGE3ZWNjN2MzMTQ2NWMyMDk3Nzg5N2QzZDI3Nzg4ODM0NWNhYWM3MDVkYmU0MjRiNjVjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDYwLWZ1bmN0aW9uLWNhbGwtdHlwZWQtYXJnLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzk2NzQxZDY5MzM0YzM2YjA0ZjNlMjY2NmQyNmEzNjE4YmNkOGQwODY2YWU5NzMxYzExOTk2MTRmNzRmNWM4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDYxLWNhbGwtc3RhdGVtZW50LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTgxNDdjYTQ2MTQ5Njg2NThiOTJiYzQwOGQ3YzFlMDBjYzk2MzgyMDE4Y2FlODlmNWU2NTU1NGZjYzE1ZGZhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDcwLWFwcGVuZC1ldmVudC1udWxsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JhZDA5ZmJjYjVmN2Q4MzExNTM2NWQ4MzIxMjJjMjc3MThiYzk1ZTJkMWEyNmI0Njc5MGQyMzNiZjM0YjI1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDcxLWFwcGVuZC1ldmVudC1zdHJpbmcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzQ5YTkzM2EwZmZkYWQwNmE4ZTkyOWY1YjBlOTExNDJlNDZhOTMxY2E3ZTVlZDBiNmJmMTQ5YzcwNTY3M2ZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzItYXBwZW5kLWV2ZW50LWJvb2xlYW4ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmIyYzUwMTFiZWViY2Q2M2M0MDI0MWU5MTcyMTEzZjU3Nzk1MjRlZDVjNDk0YWE2M2FjMzM1Njc4MzU2ODNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzMtYXBwZW5kLWV2ZW50LWludGVnZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YTQ0OTI3Y2U1NTcwNDA0NmM1ODRjNWZjYWNjODRlYjVlYTBjMTM2MTNhMDdiZTc3NjEwMjI0NGQ1N2Q1MTk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzQtYXBwZW5kLWV2ZW50LWxpc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjJiNDBlZWI0YzgzOGNhZWJhMWVjNGUwOTZjZDUyY2VmZmJiZWE4NjNjMWVjNmIwYzVmMDMzYjdmZGQ0ZDEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzUtYXBwZW5kLWV2ZW50LW9iamVjdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwZjZlNGE5MTlmZGI1ODM3NTQ3MTBjODEzOTlkNmE1ZmY1MzBmYmIxZGQ5ZDlhNTIyM2RiYTUyODJlM2YwOWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA3Ni1hcHBlbmQtZXZlbnRzLXR3by1zY2FsYXJzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZiNThhMWU5ODhhYzdmZDYzYTMyNDI4NDllM2U0NGFmMmI5ODk1ZTlkMjc4MWJhOTZhN2M0OTgzMDg5OWZlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDc3LWFwcGVuZC1jaGFuZ2UtcmVwbGFjZS1zY2FsYXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMWZkYmZkZGM0Yjc1NGI2OTkxOThiN2Y0MDlmYzEwMDE0Y2U5YWZhYTgxZDQzNWMwMTM3OWY5ZDBiMzEzNGFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzgtYXBwZW5kLWNoYW5nZS1yZW1vdmUtbGF6eS12YWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzM2ZjVmMzk2ODQ3NThhMzNjMzcwNTFjNDhiOTY3M2Y0MzY3OTE3NGExODA5YzBjNzllZjZmZGEwMTBlMzljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wNzktYXBwZW5kLWNoYW5nZXMtdHdvLWVudHJpZXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZGFhODY3ZWRlNDkxM2M4YjU0NjdlMDliNTQ4M2U1MTY2MGFiNTE4ZjlhNzUzNTdmMDQwZjU2NGY4MTY3MTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wOTAtZXhwcmVzc2lvbi1nYXMtZXhoYXVzdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxNmNiMDc5MzMxNzdlOTU3MGRhZWYyMDRmMGY2OGZjNTVlMDYwZDljN2FhNTYxYmMyZTZjMjZlZDMyZWQ4OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5MS1vdXRwdXQtc2l6ZS1nYXMtZXhoYXVzdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRjM2EwYzI2MDA4N2EyNmU4MThiNTY2MzY3ODNlM2MxMDQ3MDU3ZjE4MjMxNWFjZTQ0YjA4M2U5Y2Q5MzgzNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5Mi1saXRlcmFsLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDBhMzcxNzc1OThlNjUxM2QxMGIwZjIzYmUyMWYwZjhkZTkwNjg4Nzg1MWVmZjY1Y2VkYWFiODAxMzEzYTBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wOTMtY29uc3QtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5YzNhZTU2ZDZhMTdjNTNiYzlmYjQyNDA5NGI1YmEyZjE4NzQyZDMxMmY3OTU5OTIzYWY1ZjhhZjVmZjI4ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5NC11bndyYXAtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmYzc0ZTI0MTNmYTRhZTg5MjM1MWYxY2IzMTIxNGM2MDFjMWI2MTA1NjkwZmRlOTViY2M4NTM0NzkwMmY4YmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTA5NS10ZXh0LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MThlY2YzZDZjMDJhNjk4MDU1YzI1YjJjZDk0MTQ3ZTY2NDA3MDMyMzAzMmMxM2Q1ZTk1ZGU5YzkzYjIyZjgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wOTYtbnVtYmVyLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzgzZDcyYzk0ZGUyNGM5MDM5ZTYwZjBhYjBiMmMyOTc1OGNiZjFhZDM2MDdiMDM5MzBjM2ViY2IxNWZjM2ZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0wOTctYm9vbGVhbi1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTUwZGFkZDcyNjQzOGIxNDk0ZTUyYWM5YzRjNTZlMzM2OGZjYjQwZGRiZTI4N2QyYjI5YzFjMWI3MGZmYjYwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDk4LW9iamVjdC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzk5YzE4Yzc2ZGMwZjAyMGI0NDBhNTQxNzc0YjI1ZTE1NTlhYzE5ZjI2OTQ5MjJhMjcxOGYwNzZiOWUwYjFjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMDk5LWxpc3QtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlZmEzYzg5ZjQyZjY2MmRiN2QyMmE4MjIwZGEyZDg4M2ZkMmM1YmI1NmVkYjdlNDkwYTFjMzcwZTk0N2Q4NDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEwMC10cnV0aHktZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI4OTg0OGU0NDBkYzIzODJhMjc5MTNkZWVhMGI5NDczYzVlMjRiMjZmMmVhZGVhN2RkMTYyZTg2MDBiNGQ1ZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEwMS1lbXB0eS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTBjNWQzNzg0NTMwY2VlMWRjNTQxMzEyN2I2YjM2ODQ3ZjU2ZTliNTQ5YTU3NGViNjJjMTc4ZmQzYjFiMjQxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTAyLWV4aXN0cy1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjEzYzUwY2FiMWQwNTBiMzQyMzIyZTE3N2EyYjJmM2UwODllYjE4M2UyYjZiNmFmNjRjNmEwOWE1N2YyZTQ3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTAzLW5vdC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQzZTRkOTY3ZDNmYWFlMDA3ODBjNThlOWY2N2RmNDE0ODgzZWU1NzliNDE5MDgyY2Y5Mzk1MGI2NGY3NDk2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTA0LWRlZmF1bHQtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhMjJmNjFkZjRmZGQ5MWFkZWMxNzdhMzY2MjQxNWU3ZGRhZmEyYjZiMTkzYTY3ODg5MzE5YTFiMGY5ZjAzNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEwNS1zdGFydHMtd2l0aC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmNmYWU3YTgwOGZhMmU5ZjYzYTRlYTM3YzA3Y2UxZGM1M2Q3MDcwYmE0NWYyNzJhOGZiN2FjODFjZDA0NzIxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTA2LXNsaWNlLWFmdGVyLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjI3ZTMwMWI4MzZiYWEzNTA2NjViM2NlMDFmNTU4YmEwNmJiZWI3ZDkwYzRjYTcwZmMyZTY0NjYzMWYxYTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMDctbmUtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2MjlmYTRmODYwOTYyMjNjNmNjMjE3MmJiZWM0NzI4M2RiNTk2YjU4NjMyZTZkMjE4NDg0YzQ0NWYzNzEwYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEwOC1ndC1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjJlYmI1YmE4N2JiOTcwZjgxMWUwMzhjNzA5ZGNiZTY4NGQyOTI3ODk2NjQ1YjMyMDU2MTRmNDVjNGYzMmFhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTA5LWd0ZS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjFkYTAyYmQyMmFiOThhMmY3MmFlY2MzYjkyMDFlMGNjNzYyNDcwMWMwMmM1NDFmNTg2NjJlYzY4ZTg4Nzg1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTEwLWx0LWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzUxYjNiZDk4NzkwYjg4MDdkZDAyMzA4MWMzODM2Y2RhYWZkOWZmNTI3MzRlMDRmMDU0YmQ2NDU0MTcwMWMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTEtbHRlLWV4cHJlc3Npb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNGQ3NjE2Zjg1ODdhYmY4ZWQ5M2MzY2EzZDA5YjE3ODQ3M2NmYThkODhiZDI5NDA4MDJlMjE3MWU0NzA4NDc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTItc3VidHJhY3QtZXhwcmVzc2lvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImQwNWYwMmFhYTg5MGNhMDZhMjE2ZTU4ODA1MjllYWYwMTkyZTMxYzIwYTBlZWUzMDBhYjMxNjQ1YjY1NDQ3ZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTExMy1tdWx0aXBseS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjdiZjU2ODEwNWFmYjYzNzU5N2IyZTAwYzVjYTEzZjQ5NWQ4NGEzZTQyY2FlZDQyY2U3YmM3MTlmYzEwMGM1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTE0LWRpdmlkZS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA3MGQ3MzAyMzRjM2NkM2E5MmViY2UzNDBiNzBmOTQ4OGE3ODMwOTM0MGU3NTJkMWZiMDc5MzIxNDhlZDY0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTE1LWNob29zZS1leHByZXNzaW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJjNDcwZWFhNGM1OTRmNTYxZDdhZGMzNjRjM2I2ODViZDlhNjA4OTBmMzNlNjRjNDA3MDgyN2Q1ODUwYzQ0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTE2LXNldC1zdGF0ZW1lbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNGRlMjdjZDliMzVhMGEwYmRkM2NhNjhkZWE0ODNkMWVjNDIxODRmMjYxNzM1MjNiNjhhYWRjM2Y2ZTdmZmUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMTctYXBwZW5kLWNoYW5nZS1hZGQtc2NhbGFyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2IzYWMxY2NhYzIxNzEzNjZiOTg3MjI1MzJjYThhYmQ1MjRkNTA0MDRlNjI1MTU1NzU3NzQ0Y2ZmZmVlYjYzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTE4LWFwcGVuZC1jaGFuZ2VzLXJlbW92ZS1lbnRyeS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwNTcyNmZmMzg2N2IwYTY4Y2ZiOWQyN2Q5OTA2ZTU1MGMyNzc1YTY4ZTI3Mjc0NjIxMmJiMmY2MTQ1YWE1NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTExOS1keW5hbWljLXBvaW50ZXItZXhwcmVzc2lvbi1jb3N0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE1ZWJiNjhkODBjYTdjZTliODQ0ODk0ZGQ2NDliNTJhMDRjNTk3NTI0MTFkYmViMjNlN2U3YTUyMWY2YmUxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTIwLWR5bmFtaWMtdGV4dC1leHByZXNzaW9uLWNvc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDliYjIyYmIwYzA1NTZhNjUzZWVlYmY1Mzg1NjBlOWYzZGY2YmRiNThmYWIyMWE4NGYzY2RlYmFmYWQyYWIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjEtY3VzdG9tLWZ1bmN0aW9uLWNhbGwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjMxMGE0NDk3NThmYzcwZjUxNWU0NTM4NTc0ZjljY2U4ZTc4YzhlODcyMDI1YmJkZWIwZDA0MWMzNzE4MmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjItY3VzdG9tLXN0YXRlbWVudC1iYXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmFmNzhlNjE4Zjg5ZDUzZTFlMjFkM2M3YjU3MTA4ZjkwZTNhMmVjNDNiMjkwZDRiNGIwMDg3M2U3MzhmODIwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTIzLWN1c3RvbS1hcHBlbmQtZXZlbnQtYmFzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkMzRjMTBmZGMwN2ZjNTUyYTlhNWRhODU1MjJjODY3NzNhNzFiYjI2NWYwZTdmOGZjMGFkYzk0NzlmNTFiNjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEyNC1jdXN0b20tYXBwZW5kLWNoYW5nZS1iYXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgxMzY1MjJjYzM4MDc2ZjgwZDEyNGU3Yjg0MWU0ZTU0Y2FjOTZmYjI1MTlkZmFiYWU4NjM5NTgyYjFlMWJmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTI1LWN1c3RvbS1kb2N1bWVudC1yZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmU3OGMxNjY1YmFjODM1YjExMmRhNWJhZTM5NGE1YjYzMjllNDhmNzUyMjBmOGYyMjU1YWFhNWJkNTkwMDFhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTI2LWN1c3RvbS1wb2ludGVyLXNldC1iYXNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NjODI3MjYyOTlmNGY1NGYyNTg5MzUzZTBjNThhYTZkNzFmOTc2NjljZmRkNDkzMWE3MTQyNjg2Yzc1NGJiNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL2dhcy9nYXMtMTI3LWN1c3RvbS1mb3JlYWNoLWl0ZW0ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDEwNTA3ZDNlZDhhMzZlMGM5NDFiYTBhMDhmN2QzZjI3OTljNDRlMTk3ODQxMjlkZDIxNGEwNDJmMDFmOTAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMjgtbWFwLXR3by1pdGVtcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNTc5OTczODg3NGJmMzA1Njk4YmQwYmVjNmVlMTZmN2E3YmY5MTBmYjlmNDUwZTFlOWQwMWU5NTE2ZjRkYTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9nYXMvZ2FzLTEyOS1zb21lLXNob3J0LWNpcmN1aXQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmQyNGZhOTQ1OGE4MDczNDcwZDk3YjMyMzY1NzU3ZjU3MzA1ZmMzYmNjYzdlMDc1MzdkNWU4MGM1YjIwNDEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvZ2FzL2dhcy0xMzAtZG9jdW1lbnQtc2NoZW1hLWFwcGVuZC1jaGFuZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzIwMDk1YzgyMDhlZTY3ZWIxZWIwNTVhNGI1OWFkN2I5ZDQ4MzE2MThiZDRjNzkzNWE5MjJiZDlmMDliNGUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3JpY2gtZml4dHVyZXMvbWFuaWZlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQ4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2NDFmMmFiNDUxZmNmZDI2Y2Y4NjhlNjJlNGVjYjVkYjBiMDE2MDdhM2Y2Y2Q5MTg5ZGY3MmY5NmRmMDIzMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9wYXJzZS1lcnJvcnMvMDEtaW52YWxpZC1pcy12YWx1ZS1zaGFwZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImU4YTQ4Y2RjN2U4NTg4ZGZhZTM1OTViNGIyZThjNTc3YmZiNjBjOWJjOWNmYzM5NGE3YWEyZTBmY2MyZTgwZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvcmljaC1maXh0dXJlcy9wYXJzZS1lcnJvcnMvMDItaW52YWxpZC1qb2luLWl0ZW1zLXNoYXBlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdmMWUxNTY3ZTU2MGI5N2M4NmI4MjQ4ZTljYjMzYjE5ZWQ5ZGQ4M2U1M2ZlYjEyMDkyYzcyZjc1MzJmOTIxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9yaWNoLWZpeHR1cmVzL3BhcnNlLWVycm9ycy8wMy1pbnZhbGlkLWJsdWVpZC13aXRoLXNpYmxpbmdzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmJiZTk3NzkwNTg5MWM3ZDRmNzg4NTY0MzMzYTM3MDA4N2RhNjFhNmVlN2NkMDBkMjdmOGM0MmIwMDdmNjMyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJzaGEyNTYiOiAiNDgxMjllYWRhODZmNTZmZDdlYjc2NzFiMDI3ZDJmYWVhYmEyOGI4N2FiZmUzNDQ1YTdhZTNhNGY5YThjMDU2NCIKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHsKICAgICAgICAibmFtZSI6ICJibHVlLXJlcG9zaXRvcnktamF2YSIsCiAgICAgICAgInBhdGgiOiAiL1VzZXJzL3Bpb3RyL2RhdGEvYmx1ZS1yZXBvc2l0b3J5LWphdmEiLAogICAgICAgICJjb21taXQiOiAiMjM3OTliMWM2MGM5MzcyMjUyZjNlOWM3M2MwMWJhMjkyYjA1MmUwMiIsCiAgICAgICAgImV4ZWN1dGlvblN1cmZhY2VNYW5pZmVzdCI6IHsKICAgICAgICAgICJhbGdvcml0aG0iOiAiU0hBLTI1NiIsCiAgICAgICAgICAiaW5jbHVkZU1vZGUiOiB0cnVlLAogICAgICAgICAgImZpbGVzIjogMjI0NywKICAgICAgICAgICJlbnRyaWVzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmN6LnRvbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmNiZjRjOWMxM2FjOTY4NTAwNTE1MWZkNGE3OWFhYjVlNWE1YWU2ZDE3OTkxOTdhNGI3YzZkZGVhNmM2MjczZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5naXRodWIvc2NyaXB0cy9wcmVwYXJlLXJjLXJlbGVhc2UuanMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzNTUzMzQxMjkyZDRiMzZhMjVlNGU5OTk4ODhhYjc2MDQ5ZGNjOWUwNjg2ZTljNGNiMWU2ZjgyNTM2YzE4ZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDk3ZjRiNWIyYjUwMTcyMTA2YmQ1NzM4MjM3NzgyMjE1Y2RiMmZjZTc3M2NkYzc1ZjA2YTA2YjRmOGExY2I1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlLnByb3BlcnRpZXMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc3YTZjMjBhMTE5NmZiYzdjNDkzOWRiNTUwYWQwNjYwZTViNjVmYjgxM2YzMDVkNmI5ZGYyZWE5ZjM3ZjE5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODQ2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5N2M4YzJhN2U1MDMxZjZhYTg0N2Y4ODEwNGFhODBhOTM1MzJlYzMyZWUxN2JkYjhkMWQyZjY3YTE5NGE5YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3NGQ0ZjEwN2QyZmVhYjk4OWI5YTA0MWEwMmUyZDJiODU1NjdmZjQ4NDE1YzljN2FkZDVlY2MxOWFiZDE5ZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3IiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWE1YzE5OWJhMDIxODlhZThjNDZhMzM0MjIzMzcxYTIwNTk5ZDljMjk4ZWY2NWU3NTQwZWRlNGEzZjcyZDU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQ5MwogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxldy5iYXQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1Mzk2NzZjNDhiNTk2YWZkYTY0Yzk2M2VjOGY3ZWU1NmM3YjNmZTdlM2I4MWQxZGJlMmQxYTFlM2RkOWU5ZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzZXR0aW5ncy5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTE2NjY2ZDkwMTNkYTBhOTYxOTllNTVkN2Q5NTI0ZmY2MjZjNWRiMjVkYjA2YzBkNWEwZGM4ZTY1MDMzNDMwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL0JsdWVSZXBvc2l0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTcxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkYzk5OGY0NTE2N2IxYTlhYTNlNjExYzRjYzVkMzc5ODgwNmI5YzhkYTMyN2E3NWI1OTEzYzI4MzcyYmVkMmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9CbHVlUmVwb3NpdG9yeU1vZGVscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMDYxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1NDM5ZTUzNDNkMzNjNjMzMThjNDdmMjViZTdkMjI4NmY4ODA4MjcwOGZjMzg5ZTVlM2I2YjI0ZTc5YzRiZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9SZXBvc2l0b3J5RGVmaW5pdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGZlYTVmYWJjYTE3MzM4NmRiNjAyOGFjYTQ3ZTBiODJiMTMxZGI1ZmFkMDBlMzM0YWY5NmY3YTA1NjZiZmUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vUmVwb3NpdG9yeU1hbmlmZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhYTYyMTZkMDY0YWYwZDFkODkyNTY4ZDdmNmU0NTBlNDA1YWJkMjMzOGY3N2U5OTNiMjJiNWQ2MzgzYWYxMzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9SZXBvc2l0b3J5VHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMGU1MTEwYjI4OWNmZjFjMjE2YmIwZmE2NDlkNzQxNmEwY2JlNDIxZmM3YWQxNDU3NDFmODY5Y2U3ODIxMThhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vUmVwb3NpdG9yeVR5cGVEaWN0aW9uYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiMmY4Y2Y5ZGY2ZTg1MWUyMzc0MGQ5NTYwNTkwOTE3Mjg5MjZmNWZkZmI3OTE0NTM1ZmFiNzNjZDZjNzliMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9ib290c3RyYXAvRG9jdW1lbnRCb290c3RyYXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmEyZTRiZTVhZTI0ODk4YTQxMTAzNTQ3Yzg3ZjA5NGYxM2FlNGJmNDU5MzVlNzAzNGY0ZjI2MWQ2MjZlNzI5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcENvbXBsZXRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZWUwNDcyOTMyMmZhNTcxMWZhZTUxYTVhM2RiZGI3OTcxYjc0OGUyMGM4MmMwMTUzZTc2NzJiMDliMzM1NjM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vYm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwRGVjbGluZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjgwZDU2MGU4NjYwMDRjNjFlNzNjYzU0ZTZmNmJkMzE3NjhlOTBjYjkyZjMzZjQwOTQ2N2I2NTU4NzEwNmMyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcEZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOGY5Yjk5YjBjNmVlNDUxYTk4YTg4ZjM4NzQzZWQ2ODZjZjAyYjgyNzgxMTY3NDdiZThjZTViYjMzNjI5MDQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vYm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwSW5Qcm9ncmVzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZmM0MTBjMTRlYzljOGEzNTgyYzVkZmJlODdhMWNiYWI4ZDVkZDA0MGJkNTI3MGJlOGZkNzRlODNiMTgyZTc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vYm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyNjhkYzMxY2M1MWFjZGQzMTc4ODJkNjg1ZGUxZWQwYzAzMDNiZjM0NTYyMGVmNWM1NzFkN2VlYTM3ZDJmNWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9ib290c3RyYXAvUGFydGljaXBhbnRNYXBwaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImFhMjkxZDFhOTUzODY5YTMyYTY3NzdlYTFlNGQyNjBhZDAwMjU3NzJmYzk3YzVhMmRkYTM4NmNjMjVlOGY3Y2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vQ3J5cHRvRWQyNTUxOVZlcmlmeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMWFjNWRiZjU5MzllMDE2MjY3OTA0MDY0YzdkNWEzNDQ0YzdmYjlhNGFmZDdjODc4YjRlNmRhOTQ2ZTQxMTNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL0N1cnJlbmN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTM3N2E5Y2ZmMDBkMjJjNmQzNGFkMTg3ZDRlNjhhZjYyYjVkZDFhYjlmNTNjOWNiZTA4Mzg1OWExNjVhMTllMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9Eb2N1bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzZkYWY3ZTY0ZmY1YzJhNTkxMzMwZmE3MWI0NTU4OGJmYzQxNmVhNTMwY2IxMTZlMzRiNWQzZmMzMGIyODNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL05hbWVkRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTI4ODBjOWMyOWEzMDRiNzQ3YjQwZmVlMDcxMDlkMmFlMDM0MjRhZDRlMGM0ZDQ0ZTgyYThiYzBmZDY0ZjA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL1BheW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkM2QzZjNjMjE4MTA4OTFmYzI1OGYxZGQ4NGEyMTQwNWZmNDZhZjg1OGM5MjQ4ODY5OTI1MGY2YWY0ZmVhN2U5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL1Byb2ZpbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTNiMWM2Njg4OWYxMTE0Y2Y1Y2JlMTdlNGFiYzQ1ZDFlN2Y1MGE4NDNhOWZhNjMxZTRmNWI5YTNhODc5YjRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL1JlY29yZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImMwOTkwZDg2Y2NlYzdjODY4MDVlNmVhMTliNWVkNDAyNmJlMmZhNzdmODZhNGU2MDFmYTE0NDE0OWU3NWYwNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vUmVsYXRpb25zaGlwLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWViZGYzYmUzYWNmNjg3NzcwM2E0OWZiYTZjOGEwM2JmN2ExZDJhYWVlNTUyNmQ1MGRhYzZkYjE3NjcwODczMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9SZXF1ZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjY5ZTgzZGY1MDQ0ZmE1Mjg5NGI4OTY5Y2JiNTc3YjA3M2UxZjIyNzQ1NTRjMDhlNWFmZDBiNmQ1YmRlNmE5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2NvbW1vbi9SZXNwb25zZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmODFjYWVkZTJiOTRhZWNkOGJkNWI4NjQwNGM1OGYyOThhOTI1ZWMyNWZhMTU3NTBjOGY4OWJjMTk4NzllMzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vU2VydmljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWYwMmFhMzQ4OWM1MmNkZjYzZWNjNzE1YzQyNzY0MzhjOTRhZWVmYmQyYTJkYjFmMWMwN2Q2YzI2NTM5ODM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29tbW9uL1NwYWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkMjZlMzA4MWI3MGNlMjZkMzFiNGY4MWQxODVmYzcyMDc0ODg5YTZhZjQ1Y2ZkMGI4YzYzNGMxZmVjMTY4NjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc3ZTRmYzllYWI2Nzg0MGJlNzlmMGUxZjk2NzQwZjljOGE0YTljOWExODBjYjI1NTRjN2Q5NGIzNGZlOTdlYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb21tb24vVGltZXN0YW1wLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmFmZmRmZmIxNWY4YTJlY2RkNzQ2NmQ3MTU3ZWY0ZTQ2MGZhY2UzYTQ0MjY3OGFlYzYyNGM0ZjM5ZGI5MDdlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9BUElDYWxsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwYzMwNTViMTY0YmQ3OTc1MjY5OTdhNGE0NzY1NjE0MzU4NGViMjZhOWQzOWJlMDc2MzUyNTQ2NzI2YWM1NGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODE1NWU0ZjljZWM4YWQ5ZGEwMTViYWUxM2IwOWZjNDNhMDg0ZTRiMDhiNGJhZTE2MDRkZWE0MTI5OWE3YWUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0FjdG9yUG9saWN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiYmRhZGM4ZDBmNWVhZDNjNWI5NmRjNWMxYmZlMzhmZTE3NDkyZTJjNTkwYjUyMTBlZTQ1NTQ3ZGNiODJlNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQWdlbnRBY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZTlkNDEyNjdhNTVjZWU5NzM2YTY4M2E4NWViZjhiNTc1MGFkYmYyZGZkZWEwNmRhNGEyYTNiZGQyZmRmZTcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0FsbFRpbWVsaW5lc0NoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ5NzMwMDcwZTI3ODI5NmFiYWY1YWM2YjExZWRjNmZiODRlODY1ODM5ZjkzNTNjMjdjNDRmYmJmMzBlN2RmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9BdXRob3JpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODZlMDAxOGVkNjAyM2FjYzk0MzExNTQ1Zjg4YmJjZTYxMjc4ZjBjMGM5MDlkMzc2ZDEzNmZkZWVmNzI1NzFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0Jyb3dzZXJTZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwZDk2Y2QzNjcyMjNkODc2ZWNhZmFhMGQ3MjcyZjgxZjBkZTJjYTU3OTc2YmIzNjY2YjIzMWQ4NTI3YTYzZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQ2hhdE1lc3NhZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTZhNGQ1NDY1YzhmMTAxMzk1NWYwZWM3ZWIyNjhkZjdhNDU0NmRiMDJhYjY3NWQ5NTM2NzI3ZTY5MjhlZTNkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9DaGF0V29ya2Zsb3dPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJmOWIwMTc5MzY0YWZlYzg4OGNhYzEyMDVkNTQ2ZjI5YWJiMzMxNzhiMzNmODZhYjQ0M2ZjMDEwNmQ5NDgyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Db21wb3NpdGVUaW1lbGluZUNoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzk0NWE3NGE4OTUwYjUyMjgyMmJiZjkxZjE3ZWRhNzRjZGI3NzIxYTkwNDgzMTU4NzUyNTM1YWU3NmIwMzFmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Db21wdXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwYjIxZTY5OTQxM2ZlZTAxNzM2NmI0ZGZlMTYzMGZlNzJkYTExZjlmNDhhZWEyMzkxOTczMjg1YWMzNDE1MDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQ29tcHV0ZURlZmluaXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU2OGFjMjU3MzJiZmNiNDhjZjIzYzI3M2JiZjcxYjNkZjEwMTM4NjhjNjAxN2IyNGNiZmY3MzQ2MTEzNzdiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9DdXN0b21lckFjdGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjBiNTJmNWY1Y2MzYjM2YjE1ZGEzZWVkZTEwODMwNzE5ZWQ3ZjllMzIwMzcwYjdjZGE0ZWUzOTM0NGMzODM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0N1c3RvbWVyQWN0aW9uUmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNGJkNGQ0MzM2ZWFlN2I5NGFhMTljY2NjZmY1NDQ0ZjA4NGQ5ODAwYTlmZmZlZDY0NjJhMTgzNTRjODc1ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vQ3VzdG9tZXJDb25zZW50UmV2b2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiM2UxYzhlOGZjNGU1OGM2NDQxYzM2ZmE4NDVlZTY3Y2U4ZDMwMzliZDc2NDk1MTA5NjkxZDBkNjIwYTBmM2EwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0RvY3VtZW50QW5jaG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxMTdkOWEwMzI2NmM5M2NhN2FhODFlNmQ5NjFiOGU4Y2Y3Njg3ZTMxMjdiNjI2OTZkYzc2MDc1N2Y0MDEzMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRBbmNob3JzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0OWQxZjI2YzYzYTY3Zjc4NDI4ODBiMThjYTNkZDY4MTdjZDhjZjZhZTU1ZWNhMTc5OWZjOThiZDBjZDEzOTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRCb290c3RyYXBDb21wbGV0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQ4MzBjYzM5NjZkNWU3ZGNlMjcyMjI1MTc0YmFkZDRhNTMzMGVjZTEyYzg1ZDQ5MzA4ZmYzNjAwZjg3OGI4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Eb2N1bWVudEJvb3RzdHJhcEZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTdkYzc4MmE5NzEwM2FlODMyNGNkMWMxZGZiNWE3ZTYyYjI1ODYzYWY0YWU1NjBmNjYyZjZlMWNmZWEzYjIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0RvY3VtZW50Qm9vdHN0cmFwUmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyMTQwMTUzYjJhOGFmNzExNmI1ZWU3NmQ1ZWI4NjM2Y2U5YzU0MjI1NWRlMmQ3ZjMyODNmZmYzMzRlYjk1YWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRMaW5rLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4YjRkYWU1ZjgyMzdlNjVlMjg1NjZhODUwMTFiNzA2MmFhOGNjNmY2M2JjMjlkMTZhMzU2NGVjMjIzODVmNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRG9jdW1lbnRMaW5rcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMDk3NDY5ZTY0MWY4ZDhhNTVlMjNlMmQyZmRhZmM3MGY2MTFmOWY3YmVmMGExYzA5MDFlYWQ0YjU4MWUwNjg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0RvY3VtZW50UmVxdWVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjk2ODk2YTcxNjBhZTc1ZTI1N2RkZWJjMGNhN2MzMjY1ZGM1NjE4ZTY0MDJhNmIxYjdhNWIxOTIzMGJmZjQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0RvY3VtZW50U3RhdHVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhNGI1OThmNWU1MjA0ODQxOTFjNzczOTRlNjc4ZWM3ZTNhOTQ5MGZjYWU3YTlkZmQ2OTgzODA5NjRhMDViYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlM2UxYTNjYmZhMmM2ZmEzZmQzMGJhOTI5OGVkNTk4MGYxODljYWU5MjYyMmM4NTNjNDdjY2YwMjY1M2Q5YmU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL0luZm9ybVVzZXJBYm91dFBlbmRpbmdBY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhmMTRmNmNjZTNjZGY0ZDMwNGM5Y2QxZTMyOTMwZTQyZmJhMGUzNzM2YmM0YTI3YmQ5YzE5ODdjMzliY2JlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9MaWZlY3ljbGVFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3ZmY3NzYxMGViY2YyZDVlNWRlNzUxYjIwMTYwN2QzODlhYmE3ODQwNjM5MzEyYTlkOGZiZWI5NGYxNjg4ZmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vTWVzc2FnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNTgyMTY0OTAyNzUyYTBkZTE4NGJkYWJkZGRiMjc3MjI5OTRiZjA4NmE1YTQ0YzlkMTRmMzgyOTIyMThlYjYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL09wZXJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OWQ1ZDFhOWIyNTNiN2FlMDI0NWU3YThjYzdjYzQ3YjE3ZGI5MmRlMTQ4NDFhNjcxMTBlMjYxOWJhZmE5YWI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL09wZXJhdGlvblJlcXVlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI4MmFkNzllMWZlYzAwZDEyMjVhNGJkMjBlMmQ5ZmVhYWMzYWYwY2M4ZGRlMmI2YjkzMDJhMWJjZjhkZmJiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9QYXJ0aWNpcGFudFB1cnBvc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjA3NjY4YTAwZGJmY2I2ZTIzM2E0YWI4M2ExZjlkMGYwZDdlYTM3NzBjMzM1MjQ2YWU3YTZlNTFkYjkxN2QyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9QcmluY2lwYWxBY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyNGI4NWZkZGU5Mzc0NjRiMjRjNjk5OWFlYjUzM2VlM2U4NjQyYjk1ZmIxNGQyOGM2MGRjZjAxYTE1ZjU2Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vUHVycG9zZVN0YXRlbWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTBkZGI2YTJjODQ0NmEwNTgyYmRmOWIzZmZhNjQzZDdjZTNhNmI1Y2EzMDNmZTBmYzg5NTI3OWIzMzZhN2FhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1JlcXVlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDE3ZWYxZmJjZmU5ZmExNTYxODJiNTU1ZjdkOTdjZWE4NGU0YTQwNjg5MDY4OGVkYjFlZDYwMzhkOGU0NTZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1Jlc3BvbnNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRlNjFjOGNmNGUxNjA4NjdiMDA0NDliNmRiZTQyM2I1YjViNzE1MTY2OWNjM2I3NWEyNWZmMjEyN2FiODY3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TZXF1ZW50aWFsV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjhkOWZmNTI1NmU2YzRjNDFiYTZhNTE2NDA0NWY5YWFjZDFiMGVkMmZlNTk1MjE0M2VkNzcxMDc2ZDhhYzEzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TZXF1ZW50aWFsV29ya2Zsb3dPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ4MmI2YmRjMGJmOWEwZDI3MTQxMTc2MGYwNmI2Y2Q4ZDNiODcwMjUwNGMyMzBmMTU0YWVkZmJhZmE0YTA1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TZXF1ZW50aWFsV29ya2Zsb3dTdGVwLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDFmZWZlMjA1NDA5ZjhmOTgyYjk3NjA0NmVmNDkyNDdmNzkwYjUxODA2OTE0N2E4MWUyYjk3OWIyZWNjOGMzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9Tb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTU5ZmViMGZmNWZkNzMzY2MwYmNlN2MyNDNkODhiMzg2MTYzNzE2ODJiZDM0NTM1NzNhMWJhZDY1MWQxMmI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vY29vcmRpbmF0aW9uL1N0YXR1cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImFiM2ZjMWZlZTRhZDU4ZDAwMzIxZDdkY2E3OWI5NzAwYWVmODQ0YmI5NGI1ZTgyNTU0NTdlNDlhMjliNTQwMjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vU3RhdHVzQ2hhbmdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3NjE1NTFmZTRiNTZiZDllYmRjOTlhODIxYjUxMmE2MDcwNWNjMTQ3YmE5OWNiYmNhNTNmYjUwNzEzNzQ2MTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vU3RhdHVzQ29tcGxldGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODVkMmRjMmUwYzU3MzM2YmRjNzE1YmY2N2Y0M2U3OWYyMzFjZGY3NjA0NGYwNTAyMTk0OTU4NWMxMzk0NThmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TdGF0dXNEZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzOGQyMDE4MzgzYjNjNTc2MTMwZjUyNzQwYjkxYjljNDQ1YzkwYTYyNDgxY2I0NzdkOGU5YzI0MDEwNmJlMWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vU3RhdHVzRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk1NjUwYTNlN2JhZTRhMWU5ZTU0Nzk5ZTBiZTA1MzNkYzgzZmYzNzI2NmRjNmNhY2MwYmMwZmJmMzc5MWM3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TdGF0dXNJblByb2dyZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA2MDBiZDM2ZjNmZWU3NTgzODE2NTFjMWFiNTcxNzk1NjE3ODMwZGYxNGI2OWJmZDg5MDk0MWY5MTI0MDNiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9TdGF0dXNQZW5kaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDEwZDNhMTUzNTI5Y2YwNzQyYWQ1YWExZDNkMjE0Yzg2YTY3MjcyMTVjZGZiZGFkNmVhNWI4MThjN2MwMDU5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9UZXJtaW5hdGVQcm9jZXNzaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0OWNhZjIwZGY5ZTY3MGE5ZjljZTFiNjc0Mjk4OGY4NzU2ZWY3NTMwMGU2NGNlYWQwNDExOWE0ODRiMWNmZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vVGltZWxpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q4ZDI0ZjIwOGFhMzJhYWU4NWYwMzQ5NjgzOTc1MjdkYjc4Zjc0ZDA0YjBjZTM2MjVmMzQ5MTU1NzkwYjExNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9UaW1lbGluZUNoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjYwYzk4ZDVhYjcwMDZjNDdjZTYwOTg1NWVjMGMyMzlkN2VlZjc5NTZkN2Y5NTk4Y2FjNDA5ZDc3NjZhOWIyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Nvb3JkaW5hdGlvbi9UaW1lbGluZUVudHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlODgzM2ZiOTA5OGQyOTE1YjljNmNhZjA2NzhhNzkxNjkzNDQyMzY2NWVmMDQ2YjE3NDVkMmIzOWY2YmQyZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vVHJpZ2dlckV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExMWRlOGUxYzhlZjcyMzY2MTRiODFjY2RiOTIxZmY5MmZhZTg5ZTBmMmZhMjg4NjFjOTUxNGMxNmI4ZWVjYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9jb29yZGluYXRpb24vVXBkYXRlRG9jdW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQ3MTNmYTIyODE2MDY0ZDlkZGVmZjJiNjY1OGFjMTgyOWQ1ZjdkNTQyMDc1ZGExODg1MGRlZDIxMjBjMzdkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQWRqdXN0YWJsZURhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTIwYmRjYWU4MDk1NjljOTVjYjRlNGZmMWQ0YTRjODg2ZDRkZmY1YjYzZDRjMDRkZmUzYTY5ZTQ3YTI1MzM3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQWRqdXN0YWJsZURhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2NTAwNzZhMzQ0MzliYWY5N2E5ZmViMGYzMjFlZGI5Y2NjMjVkY2MwNDg0NWU0OGQ1NzhiNDhiMWJjNjQ3NjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUFkanVzdGFibGVPckFkanVzdGVkRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2M2ZDhlNzI3ZTIwZjFmYTY3ZmIyOGE2NTRiZDg3YTliN2VlNTk1YjdiMjMzOTgyOTBlZWExZjc0NDc2MzY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVBZGp1c3RhYmxlT3JBZGp1c3RlZE9yUmVsYXRpdmVEYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg1ZWZjYTU3NjU5Mjk4NGNmMTQ5M2M2ODZjZWZmMWQyYmQ3Mzc3NDI2NzI5OTVkNmZhZGYzOWU3NmI3ZDIxZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUFkanVzdGFibGVPclJlbGF0aXZlRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2U3MTk5MjU4Zjg0MzNmZjg5NDMzYmEwOGM4OTQ3Yjg0NzEwMTU4ZWZiMWU0NTc2ZWViOGRkMGE0MjRjNDg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg3MWQwMWIyMzI3ZWU0ZTQwOWVkODY3M2U3ZmM2OTU2OTMzODU1MDQyMmI2NTkwN2NmMWRjZDM1YjNjZmIwNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUFkanVzdGFibGVSZWxhdGl2ZU9yUGVyaW9kaWNEYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzliZDEwYmFmMWQyMGQ0NTZjZDVkOGZkN2MyMTlkMzc2ZTk5YzM2YTU0YjM3YTFiMDQ3YjI4MjVhMGYxMDNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVBZGp1c3RlZFJlbGF0aXZlRGF0ZU9mZnNldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YzBjZjFkZGEzYjU0ZTQxNzYxMDAzNTA5YTc3ZDViNjJmNjU3MzE1YTI1ZjUxNjZiMzA2NTU4Zjc1MjE3ZjBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVBdmVyYWdpbmdTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjNlNjc1OTE4OTFlNjYyZTlkMmQxMWVlMTY3Y2JjYTQwYzlhZjA0ZTMxZGE1NTc2OGUwNDNlYzAyNGE2NjljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVCdXNpbmVzc0NlbnRlckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNiY2Q2N2YzMmI2ZGUxZTU0Y2FlN2JiOWU5OGNjOTBkNWM3NTFkYmZhOGM2Y2E0OGUxZDQ4OTRhODgwODI4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQnVzaW5lc3NDZW50ZXJUaW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmMGYyMjI4ZTkwYmYxOWFiN2IwZTNkYjUwMzJmODM1YWE4ZWU3ZDhkOGE0NGVjM2JmNzdiZGJlZDY3M2VhYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUJ1c2luZXNzQ2VudGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYjA4MDNmYTI0YTRiN2JjMzE0ZTZiNDQ1NmI5MDI2OGE4ZGZjMDlhZjYxNDExY2RlOTllZDgxM2UyZWZlMmE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVCdXNpbmVzc0RhdGVSYW5nZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YWI0ZWNiMTg2YjBhNTE5NDY5MTJkZGVhYzJiYWU2NDE4MGY2ZWE0N2QwMTk4YTg5OGMwOGEwZmI0NzY4OWUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVCdXNpbmVzc0RheUFkanVzdG1lbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2NTI5YjUwNmQwMmIyODQ5OGIyOWJjMTdkNDgzZmQ2NDRlNjZhMTY4YWZlMjQ4MTJmNDgxYjYwOWRlYzc5YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUJ1c2luZXNzRGF5Q29udmVudGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTlhODk1MDlmNTIxNTc2YjkwMTA3MTUxOWJmMjdmZjczZWY1ZTMzMTg0ZWM4ZmUwNjkwYmNmNWU1MGZmMjkwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQ2FsY3VsYXRpb25GcmVxdWVuY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGVmZmM5MWMxZjIzOTdmYWZmYTUxMGY2YjRmMTJhYmNlNGU4NTFmNDhhODhhYzkwYTdiZjNmMjYwOWEzZDczNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQ2FsY3VsYXRpb25QZXJpb2RGcmVxdWVuY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmQwYjE3ZGQxOGJmODE1MTYxYjZlYTliMDk1NWVhMzE2MjIzODc0MzZkODM4MjI5MGFjYjUxODBhMjZlMDRhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQ29tbW9kaXR5QnVzaW5lc3NDYWxlbmRhckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjU0YTE3NTcwYTFlNWNkMGEwZWY3NWU1YWFlNzQwZDIxMjU3YjZmZjAwMWYzZWE1ZGQ0M2E5N2EyYWNjZjNhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lQ29tcG91bmRpbmdUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzIwMTY2NWYwMjA4NTMyYjJkNTE2Y2VjMmE5OTg3YmQ3MWYwNjM1YmZkMTViZDYyN2YxYTI3MWE5OGVkYjBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVDdXN0b21pc2FibGVPZmZzZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTRiOTA5YzczNGNkNGMyNWEyNGViZGNmYmNlYjg0NTNhY2MyZDI5MDQ1NDU3ZjMwYzdkMjk5Y2ZhNDIwMTY5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRGF0ZUxpc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2MwMWIzNDRhOTIwYjgzZDAzYjEzNzk0NTI5Y2Q1MjE4ZGZjYzZiNDhiMjRjODBhNGJmZDA2NTY5YWU2NWRmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRGF0ZVJhbmdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4ZTY5NWQ0YzBmZmJjMDZhOTY0ZmM5MzhlMTZjMmRkNzI3ODVjNTRmYzMwYzFjMDliYzRlOGZiMTJhOTUzZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZURhdGVUaW1lTGlzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTBhNzRjNTAxNTlmYTk3N2Y3NmQ2ZmY5YTI5YzgzMjUyNTUyYzUwYTVlMTFjNGY3YjkwYmQxOTA0NzVlMzY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVEYXlPZldlZWtFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlMjYxMzhlMDRhNWMzMGJmZWY2NzZmOTcwMDczN2JlYjEyMmMyZWU1YTM2OGE2MzRkNGIxOTk1ZWIwYWI0MTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZURheVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1ZmY1N2M3MjBiZDFmOTlkMDA5ZjA5YTFkZGIwMTE4YmM2MzEzMzI0NWRiM2U1Y2M5YWVhMTIyNmRjYWI4MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZURheWNvdW50RGF5Q291bnRGcmFjdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2RlNTgxNmZmMmJiMjIyZjQzYWMzMThhNTU0NWJmNGZiYjZkNWY5OTZkMWUyOWZkMTBhMTY2YWIyNTZjZTAyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRGF5Y291bnRGaWVsZFdpdGhNZXRhRGF5Q291bnRGcmFjdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ1MjcyZDU0ZjQyOThlYjZhM2M1M2U3Mzk3ZDBjMGUxOWY1ODE1M2ExYmQ0MGM1Mzk2NTRjOWYyNTY5NmU0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRmllbGRXaXRoTWV0YUJ1c2luZXNzQ2VudGVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTMxZTI2NjQ4YmExNDJkZWNkOGUyYTQ2MThlYzEzM2UwNTdmN2RlYjI3NjI3Y2VhMWQ4ZWVlMGYxOGVjNTlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVGaWVsZFdpdGhNZXRhQ29tbW9kaXR5QnVzaW5lc3NDYWxlbmRhckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWY1OWIyOGIwOTlkMmRmZTBkYzc4NGQ2ZDViMmIyZDNlMGE3MWM3MDFhNDY5MDY0NjJlZjQzNDg0NDkzYWRlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lRmllbGRXaXRoTWV0YVRpbWVab25lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzZjk4NDk0M2RmMzRkNzllMmZkMjIwM2UzMGUwZTI1ZDlhN2QwOTc5MmYxMWNiOTFiMjg2N2FkODk1YjQxMjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZUZyZXF1ZW5jeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2ZlOTI3NTg0YjRiM2FiNTllNzFlMzVkMmExN2JlMTEyZTJkMzY0ODJlZTNhY2FmN2EzNTg2YmJkZWVmMTYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDViMzZhNTJmOWU4Njc5OTA2MTY2ODNiMjQ1NmU5MzQ5MTdmNDYzOTA3NDJjNDY2ZGY2MTAzOThmNzkwMzcwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQWRqdXN0YWJsZU9yUmVsYXRpdmVEYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzM4MjJmNDEzNWU1MzZhMjdjODA1ZDQxMTllMmEwZWIxNmJiZjMxNTg1MjY1MzE1MzdmOGU1MzFiZDJmYjkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFCdXNpbmVzc0NlbnRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzViM2YwYjFjOGNkOGQ4ZTBhNWUxY2ViNTcxYWRhODgxODdhYzJjNzIxNmQ0YzIzMTk2OWM2N2NlYTU5YmNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQnVzaW5lc3NEYXlBZGp1c3RtZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyODBlMGRiMDJhZTQ2NzllN2JiY2I0ZjFlYzUxZjFlYTFmMWE3MjNhYTdlZTMwNmMzN2IyYmJmNjdjZWUxNDBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVPZmZzZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ2N2Y0OTEyNzRlZDI0ZmFiNzkwY2JjNTlmNzg2MTk3MmNmYzcxNGU2MGE3ODIzZmEwYWNlMzk4ODcyNjg3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhNzI3NmUxMDhkN2FlM2U4ZmQxYzRmMWIyYTNjZDZkOTVhOGEwZTg0MzY2ZTRkOGJjNGE1YzY2OTQwOTUyNjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVBlcmlvZEJvdW5kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhMzZiNWM4YjJjOWQyODE5OTRlNGU3Mjg4ZGQ4ZmMxYzJhMjUzYTFiYmY5ZjM2NDdiZjhhNGJlYzExMDY0MTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVBlcmlvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY2MDRmODk4YTMyMjM4NDAwNzI2ZjI2YjIwODUzY2FlZGJiMTQ1MTk2OTE1ZDgwOTAwOTY5MzZiYmNmZmJmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUGVyaW9kRXh0ZW5kZWRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3YTRjOTNmNDkxMzNiYTJhMzQ4ZTY2YTNjZDAyMzYwZmEyMjExNDg3OTc1NTI4MjdmMGU4NTVjYmFmOTlhYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVBlcmlvZFJhbmdlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhNzY3NDg3MDE5OTNjM2NjNjUzZDI0YTVkMDUwN2M4N2VjMzBjNzU5ZjcwZGY2MjQ5OGUzNWQ1YWI4ZmEyODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVBlcmlvZFRpbWVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjZDBmN2MzYzg0MWYyOGRiZGZhOWFmYzhlNGUyZThiNDZlOTIyNzM2MjkyNTNjYjE0YmNjMGU4MzVlN2ExZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVBlcmlvZGljRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzU0OTBiYTg0YTEzOWQyMjEwNjFhNWE0YjY0NjgxYTZhZjA1NjdjNTMzYzI4ZWEyZjQ5MmVmYzVkNDY1MTY3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUmVsYXRpdmVEYXRlT2Zmc2V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4YTMzMDVjN2Y3Zjg0NGRmMGEzODBiMzY0ODAyNWJmOGVhNTFmOWI4ZmFkMTQ1MmQ3YTAyYmY2OTE4NTI5YjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVJlbGF0aXZlRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0Mzg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMThjYWY5NTdlMzhiOGRlZDEzYThlNmYxN2VmZTJiNzc1MGQ5ZWYyMGFjMTM4ZTM4MThlYWI0OTIzNzc0ZGJlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lUm9sbENvbnZlbnRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwMzk2ZTk2ZTgxODZlNzEzZmJjNDNjMjY1NjQyY2M5NmFiM2VkZmNjODk4YzhkZmFmM2MxZmRmZTlhMDRkZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VEYXRldGltZVJvdW5kaW5nRnJlcXVlbmN5RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzY3ZDhhYzk5ODI2MGU1YmY0NDdmYzVjNzAxYTNjOGY3NGUzYTA3YmQwNDAxNWNlMWRkNmQ3MGE4ODc1Mjg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlRGF0ZXRpbWVUaW1lVW5pdEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzUzNTBkNDU1NDhkMzY2MmM1NDAxMDY2NGExZGMyZTNmNDFiZjkzYTNmMDMxZjM4MTYyMDE4MzQ4OTViYzk1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZURhdGV0aW1lVGltZVpvbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjdlMWZhYjExMjBhN2NmZDQwMzg4NWU1YjlkM2ExZTQ4ZmM4OTMyYTc1YWFiZDRkN2JjODJlZjA3YzhmM2M5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhBcml0aG1ldGljT3BlcmF0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTJhNTA1YjkwNTdkZGZhZDE0YmEyNzk0ZDk0ZjFjNDNiMDFhMWJkMjM0MjljMjRiYzgwNzQxMTc0YjY3NTg3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aEF2ZXJhZ2luZ0NhbGN1bGF0aW9uTWV0aG9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0MzQ1MmM1MTA3OTNiYjY3OWNjZTE1M2YxODNlYzQ2NzZkNDc0YmUxYjA3YWU3OThkYzRiOTM1NTg1MDM4ODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoQXZlcmFnaW5nQ2FsY3VsYXRpb25NZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3ZWVhZDRmOGNhZTVhMjc1MzFiNGFkZjZiMGRmMzBiNTQyMmE5OWI5MTRiNjRhMTc3ZDliOTg4YWMxZjI1NDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoQXZlcmFnaW5nV2VpZ2h0aW5nTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNmZmZjNhYmZiNmMyYjAxMGUwZDY3ZWVjZTMwZDMyZjJjYWJkMGVjMzE3YTg4MWE2ZTgwNGUzNDVhMWNhYTZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aENhcGFjaXR5VW5pdEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGE2NzY3YzA4OWFhZGU1NzI3OGI4N2FjM2UwNjQ4NGM2MjhhZjhjMjgyZTg2MWUxODlhY2MyZTcwY2JiNjVlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhDb21wYXJlT3AuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQ3OWEwMzZlYmJiMzY3NmI2ZmFhOTljZTRjMTVmOWY0NTc5YmMwYTAwZmJmMTYzMzRkZDBmNzA4OWY3MjA4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhEYXRlZFZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwZGZkOWMwOWRiOTllZTAzMjZhODFkNjIwNGMxMjZkZDAyN2RlZTZjNGI1NTFhNDNkNGJhYzMxMmIxNjQ1ODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoRmllbGRXaXRoTWV0YU5vbk5lZ2F0aXZlUXVhbnRpdHlTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTFmZDIxYjI2OGJmYWUzMWY1ZDU4MWUzYmY2ODg2ZGNkMDIxM2Q5MWMzYWQ1OWE5ZjY0ZmNjMjQ0NGM3MzVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aEZpbmFuY2lhbFVuaXRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkOTQ5MWNkYzVmNzYwYTA1OWVmMmQ3ODgwMDljMzkzYmJmNDAxZDU0YzMwOGFhNmQ4NmVlNTVkOGU0ZDY5ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTWVhc3VyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MDEwYmYxMTBkYzQ0NWIzZjBiMmY0NTkwOGY1NTM2YjIxMTk0ZmFlMTdkYmZmYTczM2Y2NTc5M2E4Y2EzMDVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aE1lYXN1cmVCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhODg5YTE2MzVlZjJiMTRkNGMyMzViNjM3YjI1NmZiMWE4NTY5YTg2MTUyM2E2MDM0NjU4ZmU1Njg4Zjg5NDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTWVhc3VyZVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3ZjRkNjU0NWZiYzNkYWVhZDY5OGRmYTA4OGZmNDU1OGE2NGVmNzM5N2MxMjRjZWU3M2M3OTg3OTZkZDFkNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhTm9uTmVnYXRpdmVRdWFudGl0eVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiZWVhOGMwMmNmYTU4N2Q0M2FkZjFhYzE3OGQ0MjhjNmQ4MmI3YmNkZjQ2NTExZjM3MGZkOWMyZmZhYTllNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTW9uZXlCb3VuZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmN2UyMDM5ZmRjYWUzZjAxZDA2MDI0YWRjNmJlMTRhZmU1YmZlMWIxZDM0YmQwOGMyMWEzZGRmNmI4YmFhMWIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aE1vbmV5UmFuZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYzM2RiZTA3NjY3YjA5NTc1ODQ2MDAxY2IxYTAwM2EwNWUxNjFlOWQ5MzI0Nzc3YmUzZjRlZWM0M2IzOTJjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhOb25OZWdhdGl2ZVF1YW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNWM2Y2RhOTgwNDA4ODI1OTgxMDg1ZjUwOWVkMWE4OWUyY2ZiMGRiZDMxZjg1MmJlY2Q5MWMxZTcyMjljMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTm9uTmVnYXRpdmVRdWFudGl0eVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkMjI1Y2MzNmE3ZDVjNjgzOGVhNzFiZTI2NWU4NThhNGE5NDVhYmY3NmMzN2U2MzE2ZWU2Mzk0YTViNWZmMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTm9uTmVnYXRpdmVTdGVwLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1N2ExNWE1YjE3YjUwZWYyOGIyODJmNDFkZTE5OTNiMmMzN2U0ZWI1NDk4YjkxYjdkMTcyOWZiODk5YTMwNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoTnVtYmVyQm91bmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmZiZWUxYjg2YzVhZTkwODg3MDlmNTllYmQ1NmJjOTgyMjc2NmY1YjQ2YTA4MWRhOTgxZGVlNjA4ZTM4MWZjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhOdW1iZXJSYW5nZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOWRiNmUxMWI4NWRlYTI3MzAyYjVlZmVkMzU5NTAzNjkyOTBkNzg3NGE5MzJjMGJhYWMwMmJiZGY4MzY0ZTQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFF1YW50aWZpZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmMDM0ZTdkMDIzZDIyOGM2ZTZkODE5YTA3NDE0MDdiMzczODA3MWVmMjNkYjE4MzIzNjUwYTU5MjVlZGU1NTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoUXVhbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA3ZmEwYTMzOTkzMDYxOThmY2U5OGM4YWY4NTgyZDg2MGJmZDZkM2MzYTlkYWE0NWNmMDFjNDU1ODE2MmNhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhRdWFudGl0eUNoYW5nZURpcmVjdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjBjZWJmMWUxNTVlZjY3OTI0OGY3MWY4MDA4YmIxNzU4MDBhZmI0YmU5NWJiOWUzNzE5YTRjYzIwNGIxZTJlNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhRdWFudGl0eVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyYzAxZTJlZTJkODQxM2NjZjdmZWM5MmExM2MwNDE5YmE2OTA5YTcwZDU1ZTUxYmM1NDNjZmQ2YTA3NDc5YTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoUm91bmRpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjk3YTc2NDZjY2NhN2QxMTAzMjk1ODRmNjk3YmEwZTk1YmZkNmI1ZmFhYmQ3ZmZmOGZiODg0ZWU0NmJiNjg3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhSb3VuZGluZ0RpcmVjdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWY5OTYxNzk1NTUxNmJjOWIzMjk5YmU5YTdjM2U3MjMzMmQyZWY4YWU0MjRlMDk0Mjg0NjRjYzg0YTkyZTJmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhSb3VuZGluZ01vZGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2ZGI0MDg0MWY5NzdlY2U1MzAwNjQxODIwMTkwMzViNDVkNThhMjdjNTk2MTYzMjNiNzUzMjVkMmY4OWEzNjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VNYXRoU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTA0N2RlNGUxY2U5ZmE0MGUzYTdjNjY3ZjM3Yzk4MTRmMjY1YWMyYzlhNjBhMGUyYmJhM2RhY2VmMGQzOWM4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZU1hdGhVbml0VHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjE2MWQzOWU5OWU1N2ZiNDk5NThkNTNlMDFkZmIxNTVkMTg5NTdjYmY2MDhhODJlYzVhMDE5NTYzNzg4MjE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlTWF0aFdlYXRoZXJVbml0RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMjllYTNkMjk1YWRhYTI1NDJhNWRjZWJjYjYzZThiMGI4YzcwM2YxZjAwY2JiMTU5NGY5Y2Y4NjM3ZmZiOTQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQXNzZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmU1ODYwNjBlOWI3ZjE4YTcxZGVhZWI3OTY4ZTQ0YTg0ODQ2OTYwODcxNWY2NmVjYzJmODUwYzhiZjE3ZGZlNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkFzc2V0QmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYjJkNTU5OWU3YTgwODQyYzk1MGY3MTA5MmExYjVmNTgyZjgzOWEyMzZjZTc5NzUyNGZlMjJkNjg3ZDRlMmRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQXNzZXRDbGFzc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTZlMjJlN2U1MzI0YTcwZDkwZGU2MGM3NTcwNGYwMGMwOGQ4MDAwODA3NjUxMmU1YWE5MTQxODk2MWY4ODkyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkFzc2V0SWRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODliZjkxNjJmOGZmNmRiMzBjYTQ3ZGNhODA2ODNmMWJjNWI3NTA5OGNkY2JkZjJkNjIxZjJlZjhlM2EyZWQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQXNzZXRJZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczMzQyYTE2NGRiNDJmNDkwOTc5NjQwMWEzMThjMTMyMWMxNDI5MGVkNGQ2OGMwMGEyZGM1MjRkNjcxMGE0ZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Bc3NldFR5cGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDcwYjhmYWViOTdjY2I3Y2VjMzQyYTJhOWIyY2QzODVlMDI1YWRkMDNjZGM0MzI4ZGJiNTlkOWU2YjQ1YWVmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkFzc2V0VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk0YzU1OWJkMWI1NjgwYTdlMTQ3MTY0NmE4ZmMzMGJkZGNmNGY1NTFmZjJjNmMyNzRmZTQ0NGNkYmMyZDExZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNhc2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjBhYTY5ZDM3ZTUwNTA1ODRiOGZiMjlhNDJlZWZlYmM5OGI4N2I3YWRjM2NjOTRjMWMxOTcyMDhhNjg4MzMzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNvbGxhdGVyYWxJc3N1ZXJUeXBlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlMzcwMzNmYTk0MDE4NzdlNWUwZWY2MjAwNTk1M2IwYjc3OTM0MThkMjNhZDFlYmNlZGZhZDNiZTUxMGFiODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Db2xsYXRlcmFsVGF4b25vbXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTgzMmMwNTMzNjgxYzIwN2VkZjM1MGU4NmFiZDM1MzlkNzJjNDBmNTg3ZmE5NGZjYTA5M2RhYTRjZDlhYWU1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNvbGxhdGVyYWxUYXhvbm9teVZhbHVlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmZmIwZDgyYmFhMTY1MGQ0MmRkZTcyODc2ZWU4NzBjMTA5YmJmOGIzYWViMjkyZTYzODg1ZTRiOGM1YzZjYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Db21tb2RpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjUzZDc3OTQxZDcxMDI5MzRmODUyMDE3MDliMTIxNDRjZWJmMDM4YzU0OWI3MzdhZmFhZmY3ZDUzYTNiMjlkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNvbW1vZGl0eUluZm9ybWF0aW9uUHVibGlzaGVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDQ3ODIzMmYwYjhjZWNmNzQ5MjEyY2JiMDIzMzFhOTkwOWJlOWRlNmU3M2FjNGEwYmY2ZGYwYmRkMjM3NDA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ29tbW9kaXR5UHJvZHVjdERlZmluaXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTcxYTY2Mjc2MGQ3YTVkZjU0ZWM2MWEwYWQzY2M5ODFkODIzNjI2MzM0YjdiZDg3OWM2ODJlZWY4OGUxOWViYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkNvbW1vZGl0eVJlZmVyZW5jZUZyYW1ld29yay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjBjZmI5NzU3MWJkNmI0ZmMxNjVjYTE2NDUxNzIyOGVkZjBiZTk5N2ZkZWVjMTFhMGFiMDc5MTQ1MDU3ZWI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uQ3JlZGl0Umlza0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQ5NDcxMTUxOGM4MTY5ZmVmMGMzM2QxM2U2ZDg1MzM1ODBiZWZmYjA4ZDcxYmI4NmZhN2Q3YzhkZGFkYmI3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkN1cnJlbmN5Q29kZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmM2YmU3MmE4YWI4NzRkMGI5Y2IwNWNjM2ZlN2MyZDU3ZjEyMTkzNGM4OTBhMWJkZjMwODZkOGU0OGZhN2JmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlYnRDbGFzc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjZkNWVmZjU0MjhiYTFjZjkxZmU1ZjhiMmZiNmE3NDkwZDI4NDliMzdjNDEwM2M5NzFhZDMyMjMwNDc3YzUyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlYnRFY29ub21pY3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODZhMGRmOWY1MDhjYzg2Yzg0YzRjYjQ3YjhkNjJlM2IwYWY3ZDhhYmI0MTUwMDZkMzY5NmM5ZWRhY2JkOGFlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlYnRJbnRlcmVzdEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTcxNzNkYjVkMmIyYzI4NTI0YWRiY2M3YTMwZTk4ZmQwMWZmOGZlOTk1YmJmNGEyMDdhZGM2YzdlOGIzMTRmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlYnRQcmluY2lwYWxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmMDc4ZjQ3MGQ2MTJmMzQyZDNkOGU4YTFlMDYzM2NlOGVhODRkYTY0NDc5YmFlNzdlOTM1YTZhMmUwNDlhMGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25EZWJ0U2VuaW9yaXR5RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZDEzNjU5MTY2Yjg3OTYyNDc0YTZiZTk0ZmNiNzQyMmVjMzI1MGJmNTBlZGQ3M2Q3ZGZmNDAwMGQwMmY4ZWI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRGVidFR5cGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJiYTRjZmE0NjAyNWRiNTA0YjQxYWQ4ZDhhY2YxMGI2OGYzNWM4YjRiOGM0ZTg2N2FkNWNjZGMzOTgyMDYyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlbGl2ZXJ5RGF0ZVBhcmFtZXRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGViMzkzYzVhNzgzMzFmMWE1NmRkZDIzNjBhNDA5Zjg3ZjNhMjBiNmY0NmU4NjRiNmIzZTg4MjlmY2EwZTVmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRlbGl2ZXJ5TmVhcmJ5VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzdjOGQ1YzYxZGUzZmE0YmFiMjI5MjBkM2Q0MDc2MTFlN2NlOWMyYjkwNDA1MWE5YmE3ZWY0ZGJkMzIyZTQ4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkRpZ2l0YWxBc3NldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODY5ZTVhZmRhYTllNjkyOGYxYTlmNWQ1MzFlYTIwMjVmNWUzYTdiZTMzZWQ1NThlYjA1YjQxZDQ1YmY1OTkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRVVFTUlSRWxpZ2libGVDb2xsYXRlcmFsRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MTU0YzZlOGY4NDI3ZjI1ZTk1ODVmY2Q1ZmVmZDkyOTVmYTM0YTUwMjk0NWY3N2QzNTNhMDg5NDEwNzNiNTZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRXF1aXR5VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJmN2JhMWQwN2U0ZTk2NmE5YzM5MWVhNjIzNjI5NWY4MTg1MGY2M2FkM2MwZTg0OGQ3MzdhYTYwMTE1ZjY1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vbkZpZWxkV2l0aE1ldGFBc3NldENsYXNzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2E5MDY2ZThkNTBiMzVhYWZlY2RiYzJlODUwMDFhZTFmZjc0Y2I5ZDQ2NWM1ODU3ZDQzZjk2MzcwYWZlY2RmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uRnVuZFByb2R1Y3RUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3M2RhMTk3ZWE0ODgxNjQwODI4ZjMxNDEyZDA1Y2EyOTVlYTIwNGE4M2E0Y2JjYzQ4ZjE2ZWEzNmQzZjJhMGM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uSVNPQ291bnRyeUNvZGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2NGViODcwYmMxZGFlMmRhNTQzYmY5ODcyMjBkMzNhMDVhNmE1ZjI0ZWJhMzVmZDM4NDc2MzhmMDI5NWU4OWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25JU09DdXJyZW5jeUNvZGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4NzNhYWUxMmU0MTIyNGMyOTE0YTBlZjVhMjQ2MGFjNzNmZjIwNjZhYWY1MDgzY2MzODMwZGVlOTZlMmVhMWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25JbnN0cnVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzOWE5MjFkN2QzOWY1ZWFhY2JlZDMzNDM3NGIyZmIyZTYyYTNjM2I3YzU2OTkzNjJiNTBlOGI2OWFkNDA1Y2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25JbnN0cnVtZW50QmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZDYzYTI0YmVjMzNkYjJiZTM2ODg4NDlmYTNhNTFiZjYwNGY3MTM0NTA1MDhjYzhmMDE0NmFmYjUwMmJjYzMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uSW5zdHJ1bWVudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlYmI2ZjU5YzY1ZmY3ZGM0MzEyZGJjMDc4NTY2MzhhM2QxYjZhNGU5ODhiMTA0ZWQ2MGNiZTkzNjVkODAwMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Jc3N1ZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTgyODdkMGUxNmE0YmU5ODE2NzcyNmM5N2E0MGUyNGQ1NDc5M2EwYzQ0YTNkMDFlNTFmMTA1NzEwOGM1MDUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uTGlzdGVkRGVyaXZhdGl2ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTg2YmRjNDUzNDIzOWM2MDVlN2Y1ZjA0ZGQ4YjA4MDYyZmM4Y2Y3NjZiMTVmOTliZTUwM2UyOTExZmNmYWFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uTG9hbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzE4ZjQxNTI0NzAzMTdlM2Y0ZmM4ODhiZjM3MjM2ZmRjYWExZTJmZTgwODllMTIxNGZmMTUwYTIxYWNjMjAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uTWF0dXJpdHlUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZmM3NWViZmMyMmQ4YWYxZjkxN2ExMDMyNzI4MDUyNzEzMzVkOWUxNDBhNjBkYjk5NmI0ZDFiY2I4YmE5Mzk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uTW9uZXlNYXJrZXRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Y2VjYTQ1YjI2YTBmYjQ4ZTIyOTI3Yzc2MmJlOTc1NGI0ZDE0MzhjYTVjNGZmNTExMGU3OTE3NjVkMzQ2OWMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uUHJpY2VTb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjg5M2Q3N2FjOWJmNmMxZTMxMTczZDk1MTllMzVmMTJjYWQ2MjQ1Y2JiNGNhM2I2NTUwMDNiMGIzMWM5ZWQ0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblByb2R1Y3RJZFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiNDUyMDViMDk4NjZiNmVhNzA4NGY3ZmRkMzgxMTI4YjlhZWRlMDQyZmMwNzc4YmYxN2MxZmQ5N2IwZmVjZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25Qcm9kdWN0SWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNGIwN2ZiZjk4N2ZiNTBmNTVmZDljNzVjZmY5ZDRmZTFkOWYyYjQyMTA1NGRiODIyMzliYWI0YzEyNzVmZDRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uUHJvZHVjdFRheG9ub215LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiMTgzM2MzMTJmN2UwNTIwZjE3ZDE0MDE0Mjg1NTdmOTU4NzRjOTk1NmM4ZGZlODViMjlmMjVlMTFjNDYwNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDb21tb25QdXRDYWxsRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNjRlYWVlOGU1ZDdjMGI5ZDU1MTE4YzZmMWI2MmQ1NTJhNjEwYmE4M2QzOTUxNmUyZWZmMzM5ODgyNjRlODVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uUXVhc2lHb3Zlcm5tZW50SXNzdWVyVHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDFkZWFhNGQ2YjBjYWVhZTVmYTA1YThmMjU2NTcwZDBkY2ZkZmVkNjY5NWY5MWIyYjc2MGIwYzkxN2RhYzEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uUmVnaW9uYWxHb3Zlcm5tZW50SXNzdWVyVHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNmY2MTE2NjU5MzE1YjQ2OTY5YTlmYWY1OGEwNTZkYjk5ODJiY2EzMTNiZmU1NzE2YzZmMTJlY2E2NTE4NmMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uU2VjdXJpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjRkMjkzZjVhYjE2MGVkZjVjMWU5NGEwMjRhNzg1NjQyODQwN2QxMDU5YmQ0ZjEyNDIzNjZiMGIxYWIzOTUxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblNwZWNpYWxQdXJwb3NlVmVoaWNsZUlzc3VlclR5cGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmI3MjNiODZhNDQ0OGVhNTIzNjhmMjE4NGRiM2RjYTM0YTVkNmFmNzY3NzFhOWVmNGU1NTllZGM5NWRjOGY3ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblN1cHJhTmF0aW9uYWxJc3N1ZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyN2ExYmI4YTY0MWIxYTE2MWM2NGJhMDhhOGIyZWJkNjc3ODZmZWU0OWM1ZWVmYjQzYzhjNGUzNTU2M2U5MTE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uVGF4b25vbXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGUyZGQ1MDA1MDY0NzNjMTJkYWYwNzAyZDZjMTAwMWM5MGY4NDViMjEzZjZhMWI5NmI1YzBhNTVhY2QyYzQzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblRheG9ub215Q2xhc3NpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTY4YjQyNzBhYjI0MWJhODhjMzcyNTYzNjEyNjliMDVlNTcyMzc1OGJjYThlMTgzOGJkMTRiMGIwMmExNzEwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldENvbW1vblRheG9ub215U291cmNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlY2U2NTNmYWJhN2M2MmZhZGQwZjEyYjdmMWMwNTA1MjkwZDk0NGMyZTRkMDM5YmNlYjczZjllMDVkNDIwODg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uVGF4b25vbXlWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMjE3ODg1Mjk1NzM4M2FlOWMwODBhY2Q0NmQwM2M1MDI1OTlkNjVjOWM2ZGIyZTdkNTczYTVjZjM5YzVjOTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uVUtFTUlSRWxpZ2libGVDb2xsYXRlcmFsRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OTFlMzJkNzc3NmMxN2Y0NDdmZjM2NGU0MmQ3MzcxNzI2ZTY4YjZmYjI5ZjJlMzdkZDhkNjlhZmY1MjI0YTgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q29tbW9uVVNDRlRDUFJFbGlnaWJsZUNvbGxhdGVyYWxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzNmNhMjUwYWZjZTM2Mzk5NGFiMDY1MjY3YWZiMjU3MTA3OWM5ZDkxMGE3NWZkNWI4NDUwNWMyYTZmYjZmOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDcmVkaXROb3REb21lc3RpY0N1cnJlbmN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5OTNhNGQ0YTM1ZmI4OWZjZmJkMDAyYjQ2YjA1ODk5ZDIwMmQwMzcxY2YwZjQxY2VlOTkwOTNmMGNkOWYxZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDcmVkaXRPYmxpZ2F0aW9uQ2F0ZWdvcnlFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlNWFlNDViM2FiMDkxNDdhNzk3ZWQ1ZWQyMmJiNGQwOTAwNTU0ODQwZDQxNDJjZjRiMDc4NTk4MWQ3ZTFlZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhQXNzZXRDcmVkaXRPYmxpZ2F0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTc5YWMzNWZkODI1ZTMwNTZmMmExMzIxMDU0OTJhOTNiNmMzMDMxM2VjOGU4NmYxMzIzYTI3NjdkZTRmNTk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0Q3JlZGl0U3BlY2lmaWVkQ3VycmVuY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTI5MDllZGUyYTlkODdmZTVmOTgzMWZhZmVjOTRhNjBhOGQ4MjY3NDMwYzVmNTgxMmU2ZWM5ZjFhMTk0Y2M0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldFJhdGVzRmllbGRXaXRoTWV0YUZsb2F0aW5nUmF0ZUluZGV4RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Mzk4MTJhODkxOTBiOTNlMDYxOTE1ZGFjNzI5Y2Y0MGMwZTllMDQwOTk1ZmIxZWI4MzMzYWQ4N2E5NTU5NjA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0UmF0ZXNGaWVsZFdpdGhNZXRhSW5mbGF0aW9uUmF0ZUluZGV4RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZjM3OTJlMDAzNWYxMzE5ZDAyM2YxNmRhNTgyZWNlMWFlMzE5ZDcwMDExNDIyZTNlNDZlOGY1MjljY2EzYmJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUFzc2V0UmF0ZXNGbG9hdGluZ1JhdGVJbmRleEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmUxNTAzM2RkYTM4Njg2NTUyNDQxZWVkMzI3YjNiMDJlMjllZjc3YzYwYzQ4NTIyYjAwNmY2YzIwY2U2ZjE0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFBc3NldFJhdGVzSW5mbGF0aW9uUmF0ZUluZGV4RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMGZkZGI2YzliNmQ0N2QxZTc3MjhiNTg2ZWU2OTMxNzI0N2Q4NGE1YzA5MTNlMmY1ZGZkNDY0ZWI5NjMyMWQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJBc3NpZ25lZElkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTk4NTNmODg0YWQ5NDE1MWEwYjU1ZDZmYmU2YzRlNmUwMTdmYTA2OGRhMTMxODZkNGIwNzk5NGFiODg0ZjFmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFJZGVudGlmaWVyQ29tbW9kaXR5TG9jYXRpb25JZGVudGlmaWVyVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODRkNDc2NzJiZDAzNGRmZmIzMjI2YmNhOWVjZTZiMmIzZTNiODljYTY1MGIzMGE5Y2FmNzBmOGJmM2Y5OTQwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFJZGVudGlmaWVyRmllbGRXaXRoTWV0YUlkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA5ZGIyMDE3MTMxYTQ0YTc1Y2RjZjQ5ZGFlNzgxMGFhNjMwZGU1NTYzZjU5YjA5ZmMyZDgzMjkzMDhmOTM3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFJZGVudGlmaWVySWRlbnRpZmllZExpc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGQwMTIzOTY3OTRkZDk5NjA2Nzc3YWZlZjg3YTdmZmVjY2Q3NTdkM2MxNTliYTAzNjliMzU3NTNlZjcyN2Q5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFJZGVudGlmaWVySWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYjU2ZTRmNjc0ZDA3OTJmY2Q0MDY4ZjE1OTFmMjRkOTU3NWU3OGUwZTI2NmQwMmEwM2IxMjI3OGZlODVmMTg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YUlkZW50aWZpZXJMb2NhdGlvbklkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODhmOTlhZTkyOWIxZWRjZDkxMjNkOTdhODQ0OTIyNDVlYTY4N2EwMDc4Njk1ZTJlZjBhOTEzNDU3NDZhYjA0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFJZGVudGlmaWVyVHJhZGVJZGVudGlmaWVyVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdhN2FkYWJhOWNjYmFhMjQyYjAzODUzYWY0ZGM0MzY2Y2VhNGQzYzVjZGJhZmUxMmU5NTk1NGE1ZWM1YWM0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUFjY291bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2U3ZDgxNTVhMGI3NWVhZTViZWNlZDQ1YmQxZjE4YWJjOTRmMTQ0MTc0ZmEzNGJjOGE3YTc0Y2JiMTFhOWRkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUFjY291bnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjAxMDU2OTdmYTc2NjI4NzIwZmU0ZjJhMTVlNGY2YzRjYjNmYjViMTYzZmM3M2I4ZmU1ZTkzMTdjNWI3ZGVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QWRkcmVzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMjc5YTEwZjYwNTExOTQwMGY0YjI2ZTU3MGIyODE3ZjZkMjMyZDA5ZTk4ZWE5YzI1YmI1ZTZkOTU1ZDQ5NTg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QW5jaWxsYXJ5RW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4MTA4YTU2MzI1ODc1ODhjZWFhMGZjZDExNGZmZGFjNWRiNTE0MWJmMzcwMjMzM2UxOTczNmEwMjM0YjRjZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlBbmNpbGxhcnlQYXJ0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYTRkYWFiN2JjNmM1NDNmODVhMzQ3Y2ZmNjAxODk3YTViOWI3NmY3NjFlYjY0Y2VmMjY0M2QxZTYzZjZlMDFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QW5jaWxsYXJ5Um9sZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTc3N2FmMGM2MWFjOWNlZGQ0YjYyNWFiZDAwMGU2ZjA5ODYwYTdjZTVhN2RmNzMzYjEzOGVkZmYwNmU2Mjc0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUJ1c2luZXNzVW5pdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmIzYTNlYjZmMjMxZjc2MGYzYWFmZjJjZWU5ZjdmNzRjMGI1ZjA5OWI0MWI0NjRkN2UxMzU5NWU4OTc5MmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5QnV5ZXJTZWxsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjJjZThhYTIyNTQ3MTFmZmY5ZTUwODI3NWYxNmIyZWViZDE1ODZmNDlmZDgwNzBkNjUxNzk0ZWE4Zjg0NmYyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUNvbnRhY3RJbmZvcm1hdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZGRhODk1OThhMjdhZDdiODE5OGU3OTI0NzFkM2MwYmRlNmI4NWQ4MGMxZjU5ZGRiYzdlYWExNDE4NmI0M2NkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5Q291bnRlcnBhcnR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjZWIyYTdmMjQ5MmRiOWJjZWYwNmEwZWY2OWRkN2ZkMDBlZDQ3NWY2ZjEwODNlODRlZGQxNTY5NTdkMGU3OTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlDb3VudGVycGFydHlSb2xlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTVjODkyOTIzM2ExNzkyODBhMjdjZjU1OGI5ZDRkMDQwMDdkYWJjYjc1ZjNkZDBmYWFkYmNjMmJhYzdlYWY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5RW50aXR5VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTFjMmUzMWE2M2FkMDNiYWI1MDZkYWIyNzEzNGM3MjZlNzE3Y2M3NWI0ODFjZmIwYmJmNzlhMzQ3MzVhYWQ0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUZpZWxkV2l0aE1ldGFBY2NvdW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTQ5NzFiMDNmZWRmYWQ2YWZkM2JiOGU3YTE2NjVmZjk3YTkyOGYzYThkODA4OTYyODVjYjI4MDU3NDcyNzc0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUZpZWxkV2l0aE1ldGFFbnRpdHlUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjY5NjdmZDYwYmM2Njk4YTFjYjFhMTgwMmI2N2UzM2FmMjNkZTM4N2NhYzBmN2UzOTQ1NjA4OGMzMGQ4NzA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5RmllbGRXaXRoTWV0YU5hdHVyYWxQZXJzb25Sb2xlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZmZiZTE4YjBiZTZkMGYyYzNlNWEwZWQwNjBlYmZjYjQ4Y2ZlNGZiYjBmMTA0MGRlMWQ4ZTc1ZTBjYWFhZjIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5RmllbGRXaXRoTWV0YVBlcnNvbklkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJmZTg3OGYzNjYxYTg2NzA0YmIxZDBiNTNlYzhjODllNDgyNDA0NjI4YzhlZTgyMTBkMzcxMTY1ZGZmYTBjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eUxlZ2FsRW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzZjVmOGYxNjA0OGVjYmVhYjViODgwYjBlNmYxZDI5N2E5NWNhM2U1ZGZkY2EzMTRjM2U2OWIzZjkzMjE0N2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFBY2NvdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiNWY5NTNhZjVmMzg0MDY5YWYzOWFmMmZjYzYzOGFlMmQ3NGUxNGM1NmI0YjQ2NGQ1MjBhNmQ3ZjQ3YjA2OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFMZWdhbEVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZDcwNDI4NTEwNzRmYzlhODI5NWU3MWVlM2JkYTNjMThmZjYxMzZiNjA0NmQwNzAxMjBmZTQ0ZjMxNDMzMjMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhTmF0dXJhbFBlcnNvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjM2Q2OWM0YjdlYmM3NDQ1MzliZjE4YjJmNGRlNTRiM2NlMjcxODEzZmRiYmYwYThhODAzM2E5ZTgwNWE1NWM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGFydHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmI4NjAwOGYyOWJjODZkNDcwNDM5YmZlNTU5ZWVhYzVkM2VjYTM0YWZkNWJmZDM5MDM1MjU4YmJkZjQxOWQ3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eU5hdHVyYWxQZXJzb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQ1YjIwNTNmOWZjNTlmZDQ1NmExYWYzOWEyN2RhOGNkOGEyZDE3ZjE3ZjNlZTY4ZjNmMzdmZDZkOWQ3YTc3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eU5hdHVyYWxQZXJzb25Sb2xlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYmYzZTdiOWFjYjhjZDQ3YmRkYzNhMTBlYzRlNDM4MjBmODQxN2MyMGI2OTk0N2FjYzNlMWM5M2U1ZmJkOTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlOYXR1cmFsUGVyc29uUm9sZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDA0ZDA1MWExMmQzNzE0OTRjZWZjNzI4ZjE0ZmFlM2Q0OWU4MzVkM2IzMmM3ODhhNjQzZDFhYjI1ZmZlNzUzMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBhcnR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhNDBkZDQzNzI2ZTA2M2M4OTI5NDNhOGE4NjdmNzQ1YzQzOTJkZWMyYjkzNzU2NzM4YjRiNzQ1OTE3ZDU1ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQYXJ0eUNvbnRhY3RJbmZvcm1hdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZjMwMTc1YzZiYmY5MTYyNDU5ZDk2ZWE5MTgyZjEzYjg5YmY2ZTkzOWJmNTY2ZGM0MWM3OTJmMjk1NGI2MmNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UGFydHlJZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkYmQ2NmI3NDMzNjBiYzczNDg5Y2ZiNmVkZmU3NmZkZjIwM2ZlNzEzYTgxYzBlMWNmZDJiNGI1ZDMzNTI2MmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQYXJ0eUlkZW50aWZpZXJUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmMxMTJiNGExMjcyNjA3OWNlYmUxNWYwZmI3MzJjM2Q4MjcyYzQxYzJmZmE5ZjkzNjYzNjY3YmI3ODNkMTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5UGFydHlSZWZlcmVuY2VQYXllclJlY2VpdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1YWYwYWViNTE5YmFmODhmYjg2Y2Y4YWM1NGJjMDBhMzE1Yjk3ZDI4YjFkZmNjNGViYjlkZTZhZDM3NjdjYzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQYXJ0eVJvbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NiYjEzMWRmOWQ0MjllMDA3ZDFlY2YzMDM3ZWU3NDMyMWRkNGI5OWUxNDZmYmFiN2QwYWJjMGNmYWIzMTY0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBhcnR5Um9sZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDg1NTQ2ZWUxZTMyNjNmM2MwYjYyNDc2MzAyNTNhNmFkYmJmZTNiNWYyMDY2OTdhYjY2NTExYTUzNjMxZTBhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBheWVyUmVjZWl2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGNmMGRlYjI1OGQyMTYzOWM5ZDM2NGY0OTQwOTM2MzdiNjcxZmYwM2UyOTFiNTBhNTM5ZWUwMjk0NTY1NTEyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVBheWVyUmVjZWl2ZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjMDI3YWMzODhlOTRhNTMxOTEwZTg3NDNhMTFjYzUwMjBlMTAxOTMzZDI4ZTI2ZWNkY2NlMGQ3MmJmMDc1NDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQZXJzb25JZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmZDcyZjk1MzA0NWE3ZGEwZDhkZDNhNmU1MjY5N2Y1ODE4YTRkNDlkMjg0YmEzZWMyMDY2ZmE0YWViZDFmMmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlQZXJzb25JZGVudGlmaWVyVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjUwZWJhMGE3ODhjNzY0ZGE2NWZmZTgzZDI3YTFlYWRiYWM4ZmRhOGRiYmE5MDM5MDI4ODVjZGU1ZTI5MWJjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVJlZmVyZW5jZUJhbmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmM2ZDY2N2FhZjExNDc2Y2VhNTJmODU5MjYxMjUxM2UzODg5OTIyYWFkN2Q0YzEzM2Y2NWEwYWFhMTQwYjdkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVJlZmVyZW5jZUJhbmtzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyMjRkMjI4NGIxZjNjMDlhYmY4NTIxZjYyYzc5NzM1YjExNWE0NWE3NzgxNjk5NzFjMWE1OGY2MWMzNjM5ZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUJhc2VTdGF0aWNkYXRhUGFydHlSZWxhdGVkUGFydHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVkMmUyZjU0NzJmNTBmYTQ1MjNjZDY0YjBhMzY1NmQwZDNjODcwNWIyYWVjYTE1MjI3Yjc2NjYwNTdhOGJhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtQmFzZVN0YXRpY2RhdGFQYXJ0eVRlbGVwaG9uZU51bWJlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZjZmZWQ2ZDM2ZGJkYzkwY2I2MTFjMWYwYWEyOGQ5YmQ4NDk1NTI2YjkyYzhmNjE2MDJiYjFiOGY4ZmE0MDJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1CYXNlU3RhdGljZGF0YVBhcnR5VGVsZXBob25lVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTg3NDNiMzE1OTI5MmM0MDc5NzdmYzI0NmU3MWQzMjY4ZTEzZjE5ZDhjNDdiOWJlOGNlYjY1MDNkZTA1OTJhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25BY3Rpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjZDQwMjhiMGIzMjU1MDdmNjNjZTFlMDE0MWM3ODFiOGM3YjU1Y2NlZjg5NTUzZTE0MjllNTU4Nzg1MzI0YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQWZmaXJtYXRpb25TdGF0dXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlMzU5YWI2YTY2NDcyYTY0YjhmOGE3MGMxZTAyZTNjZDkzNDk4ODE4MDYzOWE2NGE2MDk2MjE4MDFiYTE2YWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQXNzZXRUcmFuc2ZlclR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5NDBmYjczMTIxNzc3Y2VlNTVmMzRhZWZjYzNlYjVmMWZmYTJkOGRhMDQ2MWYxZmI0YTYyNmI2YTA2YTI2MzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQmlsbGluZ0luc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmMzdlNTBlYWRmYjlkMWYyZDIyODI5MzYzMzNkYzEzZmIyOWQ2OGYxMDY2NzU0ZmMwM2NlMzQyYzg3YjU3ZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQmlsbGluZ1JlY29yZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTExN2E0YzEzNTlkMjJkZGU1YmI3MGU2MmY2MGRjYTZkNDM5MzVhMmY3MmQ1NjE0Y2Q1MTNjNDBkZWZkMWMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkJpbGxpbmdSZWNvcmRJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWVmY2MwMjE5M2MzN2M2NzMxNjVjZDM0Njg3MGI3NjY3ZWE3MTdiYzNhYWQyNDhhYWEzMmE0NjNkNzIyZWViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkJpbGxpbmdTdW1tYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxNjEzMWM2NTRhZjFkNmRlZDk2NzQyYjZlNTRjNjQzMDQ0Mzc2ZTIzNmY4MWRhMTZmODI0ZWM1YzFmMDFlNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQmlsbGluZ1N1bW1hcnlJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjZkOTE2MmMzYzBkZDhlZDFiNjYzZGYzODM3NDk4NjZjM2E2MmQyOTg3MGI3ZTk0MGEyZDI2YTVhNDcxYTViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkJ1c2luZXNzRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGEyZDBlNzA3M2IzMThjNTIxOWEzNjk5NWU5Y2QwNTY0OTQ0NjE4N2MxOWMxYmQzMDZhNzUyZDQwMTU0NWQyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25DYWxjdWxhdGVUcmFuc2Zlckluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4M2QxZGExZjlhZjRjYzUzODRiNGQwZmRjOTcyZGQ5YTZmYWE1MWViNzIxY2I3NjUyYzBlMjM4ZWQ1YTZiZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ2FsbFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyNTBhZDQ2MjBiN2Q3NTY5OTZlMWQyYTFiMzAxOWI1MmIxY2E0OWZiNjMwNGNhZDU3YTcyYTJhM2ZiMTNhNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ2xlYXJpbmdJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNjg1MDI1OWZmNzI1NzA4OGZmZTQyZmJkZWY5ZDZiZGJkZDc4Njg3NmJiNGVmYzQzZGZkNjI5NzMzZGNiNDRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvbGxhdGVyYWxCYWxhbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjMmZkNjcwMjA5N2IwN2VhZjdiODZkYTYzYTlmMjAwNTRjZWM2OTc5NWZkODE2NzdmMjkwMzU0NzQ2ZWU1OWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29sbGF0ZXJhbFBvcnRmb2xpby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YzA5ZGY3YmE3MzBkMmIxMDFlNjk2MGI5M2UyZTgzMGMzNWFkZWVlYjZmNmUzODFiZjU3MWNmODYwZDUxYWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvbGxhdGVyYWxQb3NpdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODkwNWEyYTU3OWI5Njk5MzMxZDQ0NjY5YmI1MzM3ZDBhN2E2ZDQzY2UzNTYxMzA0OWE0NWVhZDM5ZmY5OGQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvbGxhdGVyYWxTdGF0dXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhMTkwODY5OWU2YjViMjNmNmM3ZjU5MTAxNGJlZjY0NTczMmQwODQxZTVjZDM3ZDY4YjQ3ZTBiYmU0MmFhYmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uQ29uZmlybWF0aW9uU3RhdHVzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NzkyYjVkMWQzNjI4ZTdkY2IzNGQ4YzI2OTA5NjBjN2MxMGNmNTFmYWU2NjIxNjcyZWQwMTUxOWFhNjJiM2JjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvbnRyYWN0RGV0YWlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMTlhMTBkMzJiYjg2NWJhZjlkNzE0YjhmNDM2YWMyOWYzMjg5ZTMzYmQ0ZDY3MTc0ZjhkNmJhN2ExZTlkYWY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvbnRyYWN0Rm9ybWF0aW9uSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzNmM2ZkN2M1MWQ3MzE5MGRiZjUxNzU0ZTdiMGJmODYzOGZiNDNmZjRiOGJmZmIzZTQ2MTFiODIxMDM4ZWQ1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25Db3Jwb3JhdGVBY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFjNzg3NmNmYzQwMWJiZjdjNTYxN2IyOTFiODZlOGM5ZGJiMmQxNTVmMGE5ZGIyMjczZDI0NjZkNjZkYWMxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25Db3Jwb3JhdGVBY3Rpb25UeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDU4MzRiNjM3OGQyYThlMDk3NzlmZmU4NzJmODQ5M2RhNGUwZTliZjAyYjFiNDkzZGM3ZTg1OGE3N2Y0MGM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvdW50ZXJwYXJ0eVBvc2l0aW9uQnVzaW5lc3NFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmE3NzE0OTdhMjBkZTJkZTQ1ODFhMjhlMTg5NDkxNWM0ZWQ5MmNjZmE4MmZlZjFhZTBhNmI3ZDYxOGJmZDE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNvdW50ZXJwYXJ0eVBvc2l0aW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWUxOWYxNWUwYjM5Nzk1MjhlMDUyMzI4MDg4NGFhODdkZWU4NjlhOGI3OGE2ZTYxNmE3MDk2OTk4NTIyNzkwZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25DcmVkaXRFdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWE2NTg0OWM5MWFhMDRkMmQwMmNmZDdjYTAyYmM2ZGUzOGRjM2Q4Yjk5NDFlOTEzOTM3ZTc1M2IwNTQxNDg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkNyZWRpdEV2ZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2FmMWFlNTViYWZmOGVmNTUxOWNhMzI5MWExNWJkMzk2ODQ0NjU3OGU1NDM5ODQ5ZWNkYTc2NWU1YTAwNjRmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25FdmVudEludGVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmJhYzE5YWIyZGY5NzAyODFmODk5OGU0ZDI3YmNiZTQzNWM3ZTAyYzE3NDNlNTgwNDM4ZDc1MDlmNGRjMzE5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25FeGVjdXRpb25EZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkZTA3NDM0YjY1ZmFlZjI0OTFkZGJhOTFlYjkxNzVlNzRkNzMwMWNhMTZiZWE3NTBjMTY3MjI4NWU1YmVjYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uRXhlY3V0aW9uSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE0MTU2OTRkYjFmYzk2OTljMDc4MzM0YmExOGNmZWUyNDU3MjMyYTI2M2YyYjM5MDE0ZWQ0NDgwMWExYmI0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25FeGVjdXRpb25UeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTcyOTNjNTVjNDFjMjdhZWI1NTlhZWQ5ZTRjMzJiZDNlNDA3ZTM5YTA1N2QzNDc0ZjQ2NWE2MjcyNWJiODZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkV4ZXJjaXNlRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDNmYTdhYTNhZjZlNmQ5NWY4ZDg0MDM1ZmIyZGEwYjJkZjQ2YzZjMWVmODRiMWRjNjkxMWY0MzZhODE5MmNlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25FeGVyY2lzZUluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmZWIxNDlmMDcyYzA1MjM1ZjEzNmE5NmIyYzJmNzM3ZDI5MTI5MTMwMDBjZjg2ZjI4ODAxMmNjMmVjMzI2YmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uRXhwb3N1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTEzMmMwY2VhZGI5NjE2YWY1ZjRjOTk5Y2U4Yzg3ZmI1NTU3OTdmZTAwZTliZjVjYWQ3ZTM5YzVkYzM1NWQ0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25IYWlyY3V0SW5kaWNhdG9yRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNDkyNmRiNDEyY2FhNTE1ZTM5MTg3YmJjMjI4ODA3NTc5NmU3MjdmZjFkZmMyNWE4ODFiODNjYjMwYzIxMDk0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkluZGV4VHJhbnNpdGlvbkluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxMDMxM2UyZTIxMGFiODVhYjYwNzAyYTFkNGI2MmMzOThkY2FhOWRmMTRhNjM2ODE4ZmNkZjA5MGFhMjc3ZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2ZkNTc3NTFlYWY4NmMxMmMzMjFmMTYzNDZlN2M5MmRjMTU3ZjNjNTJmZmI4MTFjNTEzMDQ4YzY1NjAwZWViMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25JbnN0cnVjdGlvbkZ1bmN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjMxNzkyMDU1Yzk2YTY4OGY4NTVkMWRmOTU1YzdlMmI4NDk5MGE5MWRlMDEzMGU1ZDdjMGM2NjA2MWJkYzE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbkxpbmVhZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGNkNjdjNTgyNTY1ZjZjOWQ0OTVmY2ViNTdkMTQ0ZDhmM2M4MjczNTc4ZWI2MGE0ZGQ3NTEwOWM2MzRmM2Y1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25NYXJnaW5DYWxsQWN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OWU4NWFlYzRjYmZhMWRmM2ExYjY2NTdjMzJmYjhmMmNhNGQyYTM1MTFlYWQwMTNjNjdjM2YzMjEyZTUxOTdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1hcmdpbkNhbGxCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjZTQ3YzZlOTg5NGUzYWYyYzRjOTgzYTZhMzNjYTU0MmFkYTU1NDM2NDYzYTNhMGEzODVjMzcwM2NjNTU0ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbEV4cG9zdXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1NjVjYTUxNDBmYzQ1ODVjY2ExNjg1NDZmNWNlODVjMzJhOTQxMDgyNWFiZTAzZDI0MDYwOTY5MDRlMDFkMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWFyZ2luQ2FsbEluc3RydWN0aW9uVHlwZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwN2ZkYTZhZWQ2YzgyMTQ1MjBmNGE2MDkxMjY0MmQ3ODJlZmZkOTAwZDQ0ZTdmMmY2NDFiYzY4NDdkNDE0NTg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1hcmdpbkNhbGxJc3N1YW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzgzODhhNGUxZmYwODQ4ODQzNjg0MzIyZDVlNzU5MmQwYjQ4M2Y2ZTk2MjU5ZGE1Zjk3YWJhZjVhNGViYWJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1hcmdpbkNhbGxSZXNwb25zZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjBmNjE4ZDc5YTliYmMzNmU3MzNmZWE4YjU4OGQ4ZDFiYzcwOTMyZmQzODliY2JhNjVmMmJmZGQzYzQ2YTdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1hcmdpbkNhbGxSZXNwb25zZUFjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YWVjYzM4ZTk0NDg1M2ZmMTc0YmFmYjJhNjI5MjJkNzg3MTMzZmEwNjBiOTE5NjA4OWQxZWE3NTQ0MmQzNDk0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1hcmdpbkNhbGxSZXNwb25zZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4YWVhNzM2M2I1ZjY3M2I5MDgwNTBjNGE0MWM2ZTY1MTUwOTkzYzAzNzg4ZjlhYjE0OWZjNjlmNzIwNjU1NWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ29sbGF0ZXJhbFBvcnRmb2xpby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZGJlY2E5YTUwNTRiZjkzMzY0NWMzMDRkN2M0ZDJhNzJlNzlhN2I3NjI0ODliYjg0ZTY0M2IyYzQwYTIzYjFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNvbnRyYWN0RGV0YWlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2ZkZDY2NmU1MDVmZDg5N2NkYzkyOThiZmU5ZTdkYzcyNzdhZTNmMjIxNzBlMGYxNjgxNjgwYjlkODFiODI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUV4ZWN1dGlvbkRldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODZmN2Y5MGJkZTIyMjk4ZDYzYmY1MmE4ODM4MmY1ODIwYzUyZTYyOGQ0MGE1YjA5Yzk5YjY0ZDIwNzIwYzYyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25NZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFUcmFkZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzI3YWVjZDIzM2YyMzk0ODM2YzM1OTI0MzFlMmY1MDkwN2I3NTI2M2IwMDQwYThkNTY2ZTIyMzFiNDFkMzVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vbk1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVRyYWRlU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDMwZTI5YzA5MmZhYzAzZTcyODU5ZGUxZmI5Y2E4OWRlMDc4ZTE0NzI4ODFjMDQxMDFkNmM4ZWJlYjYzZjExOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25PYnNlcnZhdGlvbkV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4YTQ1YTM1NzY4YTI2MmNkZmI4OTQ4YTYyMDkwNzA3OWI4Yjc2ZTNjNTAxZjBjYzQ4NmY4ZGNjMzA1Y2Y2YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uT2JzZXJ2YXRpb25JbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2Y5NDU5NDQzYmZmZjBkNzQzYjU4ZTk5MDIyNjM5NTFjNzg4ODgyYzE2YzE1OTU0MjBhNzhlNGY4YTc2OTM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblBhcnR5Q2hhbmdlSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE1MzU1ZWJkYjkyOGYzNzU4NjRiZTBlZGFlZGFiNzA2NDJjYjE0OGQ5NzlmODA3YzA5NGQ5ZWU3ZDYwN2ZjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25QZXJmb3JtYW5jZVRyYW5zZmVyVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTM5ODc4OTEyM2U4ZTY4NjlmODlkMTQ3ZjNiYTA3NTY3ODQ3OTRhNzhhOTMzNGI2ZTNmNzM2ZmZlMGNlNDU2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25Qb3NpdGlvbkV2ZW50SW50ZW50RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NjBkMTU2NzRkZmMyZDk1MjQyODFmZTM3NmQxOWI3NjM1OTc2YWI2MmMwMTRmNzhkZGFiYTdjMTBiOTk0YTQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblBvc2l0aW9uSWRlbnRpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTRiYTMyOTI4MmU3YzljNGNlMDdiMjMzZjIyODM4MDRjNmI2Njk4OTI5NmJmNWY3MGE2ZGQ5NWY5NzBkODAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblByaWNlVGltaW5nRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDYxMWNjY2Q5NjU1NTIxYmQ3ZDMxMzBkNzc2MmRkYjdjYWUyYjU0Y2QwOGJhMDI3ODcxMDg3ZmQ1NmNhNjI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblByaW1pdGl2ZUluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjZjZlMGNjMjUzNDQ3NDI4NzU4MmE3MjgxMTFmODk3MDk1NTlkMTQwMjViMThlYWY1ZGM1NGM4Y2EwZGY3ZjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUXVhbnRpdHlDaGFuZ2VJbnN0cnVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MWJmODQ3ZmNkYzk4NTEzZWU0YzczYTJkYTk1Zjk0OGE2ZDBmODE5ZmE5N2FhYTQ5YWUxMTY4YzgyYzdiMDgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblJlY29yZEFtb3VudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjNzQ3NmNiYWU3YWUzZGIwOWJkMmY0Y2ZlYmE5YmFhMGVkN2IwZGY0ZjY0YmJkYTdhMTEwOWFkMTcxNjkyM2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUmVnSU1Sb2xlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjdjN2M4MTRkZWEzYmM3ZmVkOTMxYWJiODFmYTQ1MzYxMDc5Nzk3Yjk4N2FmMmFhZWU2ZjQ1YTYzY2Y2N2YyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblJlZ01hcmdpblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmNDFlZDU3YjkxY2U1ZjdiNmMyYjdlYWUyZDM3Mzg0YzkxZjI0MjBjN2FjOTBiMmFkZDFkNjJkYzQ1ZDYyZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUmVzZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDRhN2RkMTNmNTRhNGZlODRjMDBjZjQyNTM4MzcxMWE1NWJmMjNhMTIzYjI3Yjg1N2I3NjQ1MTFmZWM3ZjhlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25SZXNldEluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MjdmMDJmNjJmZDliYjc3YWY1NTU0NGE4ZjU5Y2UzYzE2ODQ2MTlhZTEyNDkxNjcwNDJlZjU0OTc5MDk4ZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uUmV0dXJuSW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzM3OGIwZDJmNDA3YzVkOWQyMTQzMTBhMTk1ZjY1ZWU5ZTA2NjhhNjBjNjE0YzRhZTdlZWY1MmJlMDM0OTRhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25TY2hlZHVsZWRUcmFuc2Zlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NDgzYjEzMzQxMzY1NjAxN2VhYjgxNTUzYTg4OTUwNDdjNWNlMTY1YzJiYTlhN2FhNGYyOTQ3ZjllZDQzNDZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblNlY3VyaXR5TGVuZGluZ0ludm9pY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTcxYjVjYjIxMDIwYmQyNmFiZmNjM2UzODljMDQ0MDcxNjZkYmY1NjJjM2QwZTgxNmYyZTg2M2UxNzM0YTQ5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25TcGxpdEluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhNGRkOWNkOTNjNzMyODdkNThlM2NmZTNjMTdmMjYzYTFjYjczYTZkY2ViNzcyZjMzMjI2OTkzYjE2YTQwNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ5NTBmNzk2OTdmZDIwOTIzNDM1ZWM1YTZkOTI5Njk5YTc1ZDQ0MzE4MTJhN2Q1NzZjOTk0OGMwZDA5ZDYzMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25TdG9ja1NwbGl0SW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGVhZTVhMGYyYzljMTRmNzU5ZmRkMmNlOWI1MjQwYWU0ODIxZGM2MTIzNzEyMmUxZGJjZmYwZDlhNzkxYTNjNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UZXJtc0NoYW5nZUluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxNWFiMzY3YmZkMzNlMjM4MGE3ODhiNjI1OWFiYTI3YTlmOGFlOGFhNWI0OWQzMTA0NWM0NDk3MjQwMGZkYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVHJhZGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTMxM2UyZWExNmRlMGZjMjU1MjczZDAxODIyY2MxZjk0NGQzMzY4MDg2NTE3MmE1NzRhY2U3MThlYWZmMThjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFkZUlkZW50aWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDkzMDU4NzQ0ZmRiZmJkZGI1ZjQyNGUzNDc3MmY4Y2VkZGQ4OGM5MDUyZjlmMTFmYjZiY2Y2MGExOWI0NjY4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFkZVByaWNpbmdSZXBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjliNzVmZTk2MDJiMjQyZTliOGNlZDZiMWI0Y2IyODczOGI4YzBiY2ZhMzRhMzMwODAzYTZlMDcyM2YxYzFlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFkZVN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhZDRiMTU0YmYwMDhkMzE3NDA5YjgyN2U0Y2MyMTNiZWYzZWMwOGRkZGY0MTYzMTA0ZWIzM2YyZDllMTY4ZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVHJhbnNmZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzg3NDg4NjgwNjRhYmRmZjVmOWY3MmMxMzNjOGJhMTMwZDM3MzFiYTM0ZjQwZTA1ZDI4ZjNhYzc4YTMyMGZiYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFuc2ZlckV4cHJlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGNhMzA1YTk0OGJiNjQwMGU2YmU0ZmY5YWIwMTVkM2NiNTc0MmNmN2JiMGRiZTkwYWZkYjc4MzY0ZmIxMTAxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRDb21tb25UcmFuc2Zlckluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVkOTc0OGFmZWJmZDNhOTA1NWI0MjRhYzZlMWJmNjcwMzcwMTkyZGZkOGU0ZWRmODEwNDYwYTY0MmUxMDY5ZTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVHJhbnNmZXJTdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MGE5NWU4NzA2NTc1NzcyNzQzYWViMWI1YzI1YmRlYzExODg5ODUzZWI3ZTAxYzZiYTg1YzUxMWMyOGQ0NmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblRyYW5zZmVyU3RhdHVzRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzN2YxZDdmYTg1MTkzM2U0N2EwZjU2ZjViM2YxMGQwYTk3NTYxNDc2MTFiMTM1ODYzOTNiMmJjMTI0ZjU1NTI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblZhbHVhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YTQ0NTk0MjI5MTcyYWQ1YTk0YjEwYWVjNGMzMWQ5NzBmNjI3OTUxN2Q5ZmM3MDc1ZGQxNGY3OWFhMzBjYTg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblZhbHVhdGlvbkluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkNDU4YzIyM2NhNTM0ZDRiNTdjZGUxZTgyNjBjNzRkOGU3NDliYjQ1Nzc5MDE4ZjE5NzkxZmY2ZTcyN2ViOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50Q29tbW9uVmFsdWF0aW9uU291cmNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTAzZGY2MWY0NWM3NDgyYzRiZTI3MDY1OTFmNTA4ZTg5ODMyYjA1YjlkN2U4NWUxNzc2MzNhZjllYmY0NWY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudENvbW1vblZhbHVhdGlvblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRmMGIyMDUxYTg3ZjIxMzc0MWNlZDAxMDI2ODA5MzY3ZjUyNzA4NjdkZmIyZTQzOThjMzNhNzE2ZDcwY2NmOWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25BZ2dyZWdhdGlvblBhcmFtZXRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhmZGQ4MDA4MjQ4YzA3MGFmZDYyMjU4OWViNzMyZDY1ZDYzZGYxZmQ1NzQ1ODgwYTA5YzA3NmZhZTRiY2Y3ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvbkF2YWlsYWJsZUludmVudG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWI1OTYxNTMzZDMwNGY3NmMyMzg2MWU0NzkwZGVmYjBkOTY5N2Q1N2I3M2MwMzQ5ZjI5NzY3Y2ZlYjk5YjczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uQXZhaWxhYmxlSW52ZW50b3J5UmVjb3JkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA0YjBiNWZhM2UzMzIyNTcxY2U0MmQ5NWEwNWYxOTgxMDNkYjZkODY3NDQzMTQ1NDY2MjBhYzVhZjkyYzg0NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25BdmFpbGFibGVJbnZlbnRvcnlUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNTA1NmI3NDdjMjQ2YjJmNzIzMWRiMTdhNTFlNzJhODY4NDM3NTRjMzg5NWY5ZmZiNTMwMTU1Y2EzMGI3ZmU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uQ29udHJhY3RCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImY1ZjVjM2E4NzMwNjE4ZDk2MDI3NjRmODY3NGE4NzEyZjNmYWU2YTMwMTMxNDhjNjE4MGFmOWJhYTBmYWU2ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25Db3VudGVycGFydHlQb3NpdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MzY5NjVmMDkwZGM2ZDAyNDAzZmFlZmI4OTgyNWZmYWU1MjViOGRiYzYzNWZhYmYyNDNmNDE5OWY3MTM2MjIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uSW52ZW50b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNDE4OWZkNzhkYWQ0M2ZiMGNmZWUyNWU3Yzg0ZDcxMmQ3Nzc5NWM4NzhkNTYxYWQ2MDdhNzZiOGIyYmY3N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25JbnZlbnRvcnlSZWNvcmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDhlN2RkMjJmMTkzYjRjZTM4OTZlNTQ3NTc1ZDcwMDUzNzRjODMyMWE2ODA3MDQwMTllYmNhYjc2Yjc5ODFjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvbk1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBvcnRmb2xpb1N0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4NjM2MjRjNWY3MDZhMmVlOTY0MDFhMjMwN2IxMWU0MjkwZmQyNzE2NDgxMzJlOWIyN2U3Nzc5NGU4ZWMyYzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25Qb3J0Zm9saW8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzU3MmNkMzEwZjU0N2QyYzYwODQyZTI2M2Y2MDUxMWZlY2Q3OGNiNmNiZDY1MDRkNjEwY2MyNjg1MWM3YzNmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRQb3NpdGlvblBvcnRmb2xpb1N0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5ODRiNWVmNWZiMjRmNzhlNDY0YWI1NThiY2ZjODc5MDEyMmU1MjgyZWFmZTk1Y2FhYzRjNjVhMTc1M2E5MWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25Qb3NpdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NzYxODQ5ODlmNzQ4MGM5OTQzZjdjYTU5OTQ1YzNmY2Q4ZWUxNmFmOWU2ZGMwMTUzNzMzNmIzMzEzMzk2ZmJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFBvc2l0aW9uUG9zaXRpb25TdGF0dXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzOGM3NzAxODE2YTI2ZDc4N2QxZDRlYTFkMmVkMWIwMGFhZTU0MTFjZmZhNmRhMjIyYWVkZmRkY2M2M2FmNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50UG9zaXRpb25TZWN1cml0eUxvY2F0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjZmZGQ0ZWVhZmRkY2E0ZGQ4YWUyNzFiODA1ZjQ2NzIzOGQ5Mjg1ZGE4OTUxYjdmNWFjNTA4NDYzOTg4MWQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93Q3JlZGl0TGltaXRJbmZvcm1hdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OTUxZGMwYTY4MWFhNTk2ODAzNzA3MTFiNmZmZmU0YjVmNDdmMWZmNzk2NGMyNTllNmFmNzQ1YWNiMzZlYjU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93Q3JlZGl0TGltaXRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWYwNjg4MjE4YmYxODM3MzI4OTBlZjllYWQxN2ZiMTkwZDE3ODY3NGQxZTg0NTFhMDUyNjQ5YTA5MDdlNDZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93Q3JlZGl0TGltaXRVdGlsaXNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOWM3ZGFhZWE1MjI2ZDgzZDk0OTlkYTBjYWQwNjI3ZmI1MmQxZTRmMmM5NDlhYmFhNDczYzEyZTMxNTA1YzdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93Q3JlZGl0TGltaXRVdGlsaXNhdGlvblBvc2l0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4MmE3NjJiZThjNWZmOWZkOGM3NjBkNWM1NDQ0ZTEwY2JjN2Q3ZjdlZWIzYmRkMTVmM2QzZDRiOWUyNzhmMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dDdXN0b21pc2VkV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVkMjY5M2U4NGM5MDhlYjhjZmI2N2UyODE3MWZhZjlhNTI5OWY5N2E5YWVlYmJhNmRjNjJjNzM0NjBkNTllNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0V2ZW50SW5zdHJ1Y3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2EzZjdmZjA5MmExMTA5OTdlZjE4YWFiZGM2YWFjNTM0NjQ4NGNhZDk5Mjk1OTZlNTVlYjgxMzBiMzI0ZGM3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0V2ZW50VGltZXN0YW1wLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2MzliNTEwM2ZlZmM0NzVjM2YyODEwMjQwZThkZTU0ZTQ5MTQ5MzQzOWQ4ZTZmYTAxYmVlYzI5YTMwOTk1MWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dFdmVudFRpbWVzdGFtcFF1YWxpZmljYXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyN2QzMmViNDI2YzFhYjcxYzg4YzE5YzMzNDE2YzU0NWRlYzI3OGE2NDI4YjcxN2Y4NzQ2ZDQyNDI0YzdhYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dGaWVsZFdpdGhNZXRhQ3JlZGl0TGltaXRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTRkOTI3YmE2N2JlZGE2OTk4NDk3OGQyYWQxZDUwYTU3ODZmZDhmMWNhZjZjNmI4YjYzMTM5MzRiZDkyMmVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93RmllbGRXaXRoTWV0YUxpbWl0TGV2ZWxFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1NDNmNThjN2Q1MzhlYTNiNzdmNmI2MWY2MzVmZTM2NzQyYmRkMzIxZjgyYWRlNDAxMjI2YzQzYzQ2ZmY1MmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dMaW1pdEFwcGxpY2FibGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA5NWE5NGQ4YTU4YWVjYTQwZjJmYmRkYzE3ODkxOTU0NDlhOGE0ZWIzZDY2ZWEyMDgyODYxMmE4NDYzNzMxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd0xpbWl0QXBwbGljYWJsZUV4dGVuZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDIwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxYjFiZjZiMDQzNWUzZGJhZjAxYTcwZmMxNjRjZDNjYjMxZDU4NzMwNmViYjFkZTliODMzZDQwM2RiN2MzZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dMaW1pdExldmVsRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NDUwYWFlOGM4OWZlNjRkNmFjY2FjMmVmYjAyM2MzOWE2MTA4M2EwY2JlY2U1Nzk0ZGUyZTIzZTFiZjBiYTEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93TWVzc2FnZUluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2M2RhNmY1YTczMDlhZWJlMDI1ZTU5ZWMwNjNiMzc0N2EwNjU2MWI2ZWUwNTg5Mjg4Y2Y3NWQwZmEzY2NlMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFXb3JrZmxvd1N0ZXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGI3NWMzNTQ4MGQ1YTE4MGIzYjc5MGEwNzgzYzJiYzNmYzY2NTQzYWY1MzhjYzVkMzk1YTMyZDE1MzA0ODU0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd1BhcnR5Q3VzdG9taXNlZFdvcmtmbG93LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImJhMjM5YmU5MWM0Njk3NjNlNDI5MjhhYzI4NTA4YzBjMzY1M2NlMGU2YWQ0NTllZDI5MzQ1MzQyY2Y5NmI3ZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dWZWxvY2l0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZjJmNDgzZDEwMTFiZGM1NDIwOTA5NjY4OWQ4MDc3YzliMGIxOGY4ZTJmMzNhMmNkODE3NzE4ZjkwYzc1ZWFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93V2FyZWhvdXNlSWRlbnRpdHlFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhZDkzNWE5ZjgxMzQ2MzEzNmE0OTRiMjQyMzUzNjQ5NmIyNjMwZWY4MWNhNTA5NjFmNGE3NmE2NTA5ZTk3OWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dXb3JrZmxvdy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNmVmNWMwNGE5NzhhMTE1NDgxOTlhMjgyNmJhOGNiOTM0MWU2YWVlMWE5N2VlZTdkY2JlMjRhNmFjNTNkMDY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93V29ya2Zsb3dTdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDQxODAwNGQzY2I2ZGYxYzQyZTM2YjczNmQ3ODRiNjJjNDk5MTNlZDRiZjZkMTZkNzljM2RmNWQ4OTk0YjFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1FdmVudFdvcmtmbG93V29ya2Zsb3dTdGF0dXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjMjFkNDMwZTg4YmViZTEyNGFkYWIzMjEzOGNjOWY3NjM5MWY2ODcyYjM5YjQ2NmYwZGM4YWRjMDNiNGRlNjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUV2ZW50V29ya2Zsb3dXb3JrZmxvd1N0ZXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmQxNTUyZGM0ZDRjYTNlM2RkOWY3OWJlMDcyZjNmYmM5ZWNmZWMwOWJmN2Q4NDIxYmIyZWYzYTQyNDc3ZDQ1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtRXZlbnRXb3JrZmxvd1dvcmtmbG93U3RlcEFwcHJvdmFsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3YjI5YjZlNDlkOTAzYjllZmMyNGMxMTk0YmQ1NDhjZjlmYWExNDk2NzM2ZjFlOTliMDUyYWU5MjliZjgwMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkFkZHJlc3NGb3JOb3RpY2VzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhNWM0ZDBkNjgzOWM2OTVkZGY3ZDk5NjFhY2I4YmY3YTIyMTdiM2JkM2Q3MDEyNjQwNDVlYzIyNGI5ZjU2NDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkFncmVlbWVudE5hbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjViZTg1MWRmNWVhMmU4MGNiZGM4ZjExNDlkNDkwZWRmYmU2NzFiMjlkZTM1NzQ0YWFjODU0NzBjYWRlZGQzYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQWdyZWVtZW50VGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRmMDFlMDc0ZjNmNmU0YmIwZTQ5ZjA2MTgwMzU5N2QwZTg0NDUxM2YzMDMyMmMxOWUzZTdmYWZkZDBiODY2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ2xvc2VkU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU3OWI5Y2FiYmIxOTllNmVjNDg2MDA2NGU1NGQ3NDZkNzg0ZDZiZDBjNmM3MDk3Njc5YjY0MDQwMjM4ZWFiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uQ2xvc2VkU3RhdGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkOWJhOWMyZjdlNDRhYWNmY2U5ZjdiMzdmM2FlNzI3N2U1OThmNzI4MjE4Y2RlYzIzZDRlNDg5MDg4M2Y1ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkNvbnRyYWN0dWFsRGVmaW5pdGlvbnNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5YTdkZGE5MTQ3MDdmNmQ5ODAyMjQ1NmJmYjBlNDcwNjEyYTEzMjJkZWE0OTYzMDU0YTkxZGVlMzQ4ZTBkYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkNvbnRyYWN0dWFsTWF0cml4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5NGI1YmNhNTczOWMxNzdhOWJhYTc2NzI0Njc5ZDllYWFiNGRjNzk0OTBkYzZjOWE4YmEyNDg4NmIyNTRjMDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkNvbnRyYWN0dWFsU3VwcGxlbWVudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiMmUwYmQ5NDU3NmUyMDU0NjgyNzc2ZTJhNWQ1ZjRlNzg0MzMzNmZlMzA5ODc2OTI4YjRhNzczMDRmZTQwOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkNvbnRyYWN0dWFsVGVybXNTdXBwbGVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2YjIxYTI1NzNhZWY0ODUwOTU2NDk1NjE1ZTk5NjA3ODQzOTMxOWFjNjc5ODliYzUyYjE0NTkzMjQ4M2Y3MzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkNyZWRpdFN1cHBvcnREb2N1bWVudFRlcm1zRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZjIyOWJmNTEzYTlhOWZkOGI0YmI0NTcwMzc1ZGU4NWEyMWJlMjczMDU1Y2NkNzI5N2JiYzI4MTEwYmVmYjNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25DcmVkaXRTdXBwb3J0UHJvdmlkZXJUZXJtc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmYyYWNkN2M4ODk2ZDcyNTc3MTVmZTc5OWU3YWQ4NzQyMjdkYzA3NWNhMDMxZTU3M2M4YjE2NzY4YmVlODliYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uRXhlY3V0aW9uTG9jYXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzYjQyOWYwYTdlYTlhMDA2NDZiODk3MmY1Mjc2MzEzN2MyN2VlZTFlZGQ3ZDM2ODI4YjkzOTIyZmRjZjlmZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkZpZWxkV2l0aE1ldGFDb250cmFjdHVhbERlZmluaXRpb25zRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjI2ODM3OThhMDg2YmZiMDU0OGU0MDEzMzQxMWMxZmU2MzczMjMyOTcwZTM1MzBmZjI0NzUxYWM3ZThmZmIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25GaWVsZFdpdGhNZXRhQ29udHJhY3R1YWxTdXBwbGVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTQwZTkwZjRjOTVhYmQ1YmFjMThlZTlkYzNjMzhjYWE3ZGY0ZGNiY2E3NTRmMTMyYTk2Y2MyNzQ4NGFjMDlmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uRmllbGRXaXRoTWV0YUdvdmVybmluZ0xhd0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE0ZDkxZWM2OTdlMGM3NTRhZDQyMDAxZjYwYmYxYmQxNmI2YjgxMmM2NWEwNTlkOGNiYjFkY2Q2NDMyYTBiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uRmllbGRXaXRoTWV0YU1hdHJpeFRlcm1FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlNmEyOGQxM2Q2MTMwOGM3MTQ1Y2JiOTU1ZWQ3ZTkxMmVjMDkyN2YwNDMyODIxMmRiYTQ1NjEwYmQ4NGY2OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkZpZWxkV2l0aE1ldGFNYXRyaXhUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OGQyMWVhN2VmZDA2ZTA1MTQ0NzljZjllOTg0NmMzNmQ3NmM4MjVmOTVjYjg5M2ZhODEzYzhlNTljYmU5YjUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25GaWVsZFdpdGhNZXRhUmVzb3VyY2VUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzY1YWFiNGEwZGVlYzdmNzNlMGU2ZmM5NTkwMzI2YzY0N2JkNGZmMzJjYWZhZmI1ODE0OGU3YjkyOThlZGM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25Hb3Zlcm5pbmdMYXdFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjOWFhNTRmYTFlNzU2NDcyNmRmZDVhYzNmNWYxZGMzNWRjYWMxNmE1Mzg3NTkzZDhhODBjNGNhMGIyYzVjYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkxlZ2FsQWdyZWVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhNTJlYTc1OTc1ZmU5YmJmNzAyNTNmZmI3NjNlMzkxMGU4MzcyOWNhNzQ5YTI4MTdhYTM0Y2FmNzVkNzBlYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkxlZ2FsQWdyZWVtZW50QmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTg0MjFjMDhjN2RmOGFmYTRiNTdiYzBmMzUzN2ExNDRmMDNjNzUyZTFlZGM1NzgwOWZmMTAxNjIxZTY4OGZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25MZWdhbEFncmVlbWVudElkZW50aWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyYzE2MzRlMjUwMjE4ZThjY2E3MmRjODZlYWMyOWNlNDI1NWY1OGIxZDI1NjQ3ZjRkNDE1MDAyN2I3NTAxNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkxlZ2FsQWdyZWVtZW50UHVibGlzaGVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODAxMGE3ZTE0ZWNkNzdiOWE0MzNlNGZlMDJmZjM0MDc2ZGQxZDlkMzE2MDc4ZTBjYTM2MjE0MzM2Yjk3NDEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25MZWdhbEFncmVlbWVudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0ZTA1YTgwZDliZWI1NGYzZGI3MjM0YmEyNDA1ZDUyYzNhMWQyODY0NGU3YmRmMDQwNmViOGZiZTY4MjViZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbkxlbmd0aFVuaXRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhZDJiMzg3NTZhMzkxNDQzMjRkYjRiNjAxZWI0M2E5ZGU2NzI4ZmJkZTIyNWE4ZGY1OGY1YjRjNzYzMzc1NDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbk1hdHJpeFRlcm1FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlZGNhZWE3MWIwNjI4ZWE3ODRhNTZmNjI4NzgxMjU3MjMwZjQxMjM5NTk4ZjQ1NjkwMzQxNTIxMWVkOTQyMTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbk1hdHJpeFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlYWNiYjJkODNmNGNhOGQ5OGE3ZGU3ZjgyNTQ2OWZjMDM5YjMxMmE4MzA0NmZjMWI0NzM0OWIzNWFmZjQyNzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbk1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUxlZ2FsQWdyZWVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1MDNhOWU0NmQzZDBhMTMyOTNlOWZiMTNjYmMzOGQ4ZGI5ZmFkNzdhMWZhYmEyODBmOTkzNGQ3Mzk1MWQ3ODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbk90aGVyQWdyZWVtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5MWJmYTY5MjYzYzU2OTE3NjU3ZjUyYjljOGUxMDBlNzU4MGQzODI3ZTRiYmMzMmU5Y2UxMThiNDQ4ZjNlZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vbk90aGVyQWdyZWVtZW50VGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTQzNTZkOTI5Y2Q3MTJiZTlhZGY1ZmJlNmE4Y2YyZjM2YTlhOTdiMTdhMzZkMjgwNTdhNWJlYzMwZTExMzZhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uUmVzb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2VkN2I2ODI4Mzg5MmVkOWU4NTgzM2QwZWU2NjE3NzUwODZiZDQ5OTg3MWY0OWJhNTU3NmE5ZmE1YzZlNWRhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uUmVzb3VyY2VMZW5ndGguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2NiNzMzMzkwMTIwYzViNzlhNmIzN2QzMzgyNjU0ZTM2YzA4Zjg3OWFlN2Y1Zjg0ZjdmZTFiNzA1Y2I4MTFjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ29tbW9uUmVzb3VyY2VUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDcyNGI1ODcyZTQ5N2ExMjViOGY2YjU3NDQ2Y2NkNzZiYTc3MzkyZjEyODE5YWFhM2RjODZkZWEwNjNlOWE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25TcGVjaWZpZWRFbnRpdHlDbGF1c2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiZTMwNTQwZTk4NDMzOWNkNWY4NWQwM2JjNzVhODIxYTA1ZjRlOWFkNTljZDhmZWY5ZTlmOWU4ZGEyZTRhMzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbkNvbW1vblNwZWNpZmllZEVudGl0eVRlcm1zRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDRkZWYyMjkyMjc2ZDRkOWIyNjRlMjQ1M2Q4NjhkYmQ2OWE0YTkxMTQ4NmNmYWNmNzMxODAzZTdhMDg4ODBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25UZXJtaW5hdGlvbkN1cnJlbmN5Q29uZGl0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NmQ5NDU5ZGU4NmIwZTI1MjMxMjVjMWVlZWYzNTNlNWYxYzlmZjA2NzJmM2UwZTQzYTRiM2QxZDU0M2UxNmFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25VbWJyZWxsYUFncmVlbWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTNjYjM2NDI4YmRiNGEzNmE0MDk2YTU1ODAyNzU0M2E4MGNjMzM5MGE5NWZiNDc0ZWZjZWYyZTI0OWUzM2MwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db21tb25VbWJyZWxsYUFncmVlbWVudEVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjhlYzI3YmRhYWM3ZDczZjdkNDJlODE1OThmNDljZjgzNzA0ZDQ3NmVjMTAwMGE2OWY1Mzk0NTEzZWE0MDRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Db250cmFjdEFncmVlbWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZWQyZTk5MDdkNWYwZjIzOWVlMTZmODg0MTIyMWY2OGJhYmI4ZTUyMDE0MDI5NGYwZTY3N2Q2MGI0ZWU3MjI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Dc2FDb2xsYXRlcmFsVHJhbnNmZXJBZ3JlZW1lbnRFbGVjdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWRjMzhmNWY0OGE5YjVlZGU0MzUxZWM3Zjc1YTU5OGRhMDNjY2FkYTNkYjdmNGFiYjcxNTkyM2IyY2YwMTc0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uQ3NhQ3JlZGl0U3VwcG9ydEFncmVlbWVudEVsZWN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWZiMTE1MjM2YWI0MmRmNGE2MjJkYzQ5NTQ2MGVhMGNkNDViNDAwNzMwOWY1MWE1ZDcyZDlkZTc3OGVjMDkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25Dc2FTZWN1cml0eUFncmVlbWVudEVsZWN0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZmMwN2FiMjg2Y2QwYzQ5MTJjYTM4ODY2OWQ5MWQ1ZDUyNzhiOTk5NDgxNDI1YWIwZDhlNmU4OGQ3NTgzNTlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJBZGRpdGlvbmFsRGlzcnVwdGlvbkV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYzhlYWY0ZGNmNGNkYmVmMDBmM2E0MGQ0MTBmZTdjYmVjZmQ5NmQzM2VkYTE2OWU3ZDI1OGU2ZTIyN2MyNjdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJDbGF1c2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JjY2ExODk0MWJmNjg5OWVhZTQyN2E1MjIzOWI0MzRkZjJiMjRjMWRlZjI3Y2UzNTM0MTg5N2ZkMzg2MmNjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRGV0ZXJtaW5hdGlvblJvbGVzQW5kVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGVkM2JjNjEyYjlkZjJkODQ1ZGRjNDg5ODc2MzlkMTllMTNmODViMmI3MGI1MTBhNTJkOGNiOTI5ZmI1Mjg1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRXF1aXR5QWRkaXRpb25hbFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzODRiMGNiN2NkNTZjODhkYzU1YmFmMjU1OGM3YzExOTJmZWQ5ZGY3ZDkwOGZlMzlkNDhkYTNhYTYyYWZlOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckVxdWl0eUNvcnBvcmF0ZUV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MmVhMWNjNWFlYmFiOWQ4YjE0ZTI0MmJlNjc4OWJlZTVlYzRjZTBmMmMzOGQ3YzAxNjExMWYxMTEzZmRlZjA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJFcXVpdHlNYXN0ZXJDb25maXJtYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODg2Mjk5NWNkNDZhYTQ4OGNmNzM4OTkyNDViNTkyNTA0ZjVmMGZhZjNjZjg1MTQwODVjOWViZmEzNGYzMDc4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRXF1aXR5U3dhcE1hc3RlckNvbmZpcm1hdGlvbjIwMTguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmZlNzNhMDUzZGY0MjM5ZmJkOTk3YTRhYWFhMzcwMWRmMzhmNTkwOGU3NGVhZmViMDg3YjY4NmEwMDhhNDdlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRXh0cmFvcmRpbmFyeUV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MGIwYTgyODFlNTZiYTYzNjYwMjcxZmFjNjM3Nzg1YTgxZDU0ZDMyZWRhYjExN2I0ZTA5NWU1NTE3MDU0YjEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJGaWVsZFdpdGhNZXRhTWFzdGVyQWdyZWVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGRiNmRhNzJjY2Y5ODUxYmQ5Y2YyMTgyNDcxM2U0ODk5MTkxN2NiZWMzNzViOTJmZGFmYTE3ZmMwZWRkMjY4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRmllbGRXaXRoTWV0YU1hc3RlckNvbmZpcm1hdGlvbkFubmV4VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU1Mjc2MWUwYjY0YjM4M2QxOTc1OGJmODAzODljZWE1MTIxODUwNjRkMDBlN2U2MGNlZjVkZDJjMGM0YjYzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyRmllbGRXaXRoTWV0YU1hc3RlckNvbmZpcm1hdGlvblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzYjQwNDRiNDNkOGFmNjhiNzhhMzI5NTk4YmUxMzA2ODFlMDk2Y2RiN2VkNWVkZWU0ZDhlMjZmMTViNjNkOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckZ4QWRkaXRpb25hbFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1YmJmOGVlY2ZmM2FmZTI4ODIwNDczOTZkMjFhN2UwY2NhNTNmMTZjZDg2N2ZiZjIyZTFiNTgwOTY4MDUzMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlckluZGV4QWRqdXN0bWVudEV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYzUyOTg0NTA0ZDNhYmRhMGVjZTlmYjI1MjVlNGMyYTEzMTZmMmQ3ZWQyZmZkNWYyZWZhZWY0YzNjM2RiMTc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRDbGF1c2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JjZDNmZTk0YzljMWFhYmFhNmQwMDAyOWE2NzllYjVmYzVmNDA2MTAzMWFhYzgwNjdkZWE3MWVjZDZjZWQ2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyTWFzdGVyQWdyZWVtZW50Q2xhdXNlSWRlbnRpZmllckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjIwZDcyNjBiNjdkY2NlOWNmOTZkZjBkYzkxMDIyNjlmYzFiYjUyNTZiYmYyOGUzM2FjOTRjNzMyZDgyOTJiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyTWFzdGVyQWdyZWVtZW50Q2xhdXNlVmFyaWFudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYWJhMTRhYzBlZjQ1OTc5ZTNjMWE5ZjdlYzdjYWM5M2ZkMWFiMDhjNDY4NDNjNzAzY2Y0MDQ2ZWYxZjY2MjZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzZmZWUwNjdjOTY2NmYxZGIxNGY3ODQ2MDQ3MjFhZjA0ZTI4YjEyMmZkZmYyYmNiODViNDEzNDM3YWZlNjllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjgwZTVmYmYzMWRlMjhkYjdkMDczZTkxOGE1MGQyNjNlMDlhZWM3OGRmM2Q0MjU0ZDJkOWRjYjAxYzM3ZDc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRWYXJpYWJsZVNldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZmM0YjhiN2VkY2IwOWNiMmIzODFkZmQ5NDRmNTA3NTIxZDJjMWQzYjhlZTQxOGY4NjM1YjJjYzMzNDJiMWNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRWYXJpYW50SWRlbnRpZmllckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY4NTk1ZjI3NDIyNjFmMjU0ZDI1M2YxZDkzYzQ1OWZhMzNmODY1YmY1NjU3OTA2YzMwYzY0MzAyZTZiNGRhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTGVnYWxkb2N1bWVudGF0aW9uTWFzdGVyTWFzdGVyQ29uZmlybWF0aW9uQW5uZXhUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkN2I1ZTg1ZDE1ZjJlYzcxN2VmMWQzMGQxMjU4MGMxZTE4MjMxMzA1Y2NjNDRiZjIzNGE3MTE4N2RlNzlkMGExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJNYXN0ZXJDb25maXJtYXRpb25CYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyNDhhYWRlNDE0MTQxNGRhZjZiNmUzZjA0Mjg1YjUxMDhiNjYzMWE2MzY0NzdiYTQ5ZDAyNjNmZTc5MDM4ZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck1hc3RlckNvbmZpcm1hdGlvblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3ZDc2MWUyYTE3OWQxM2Y4NzQ1NjE2ZjQwMTAwNWJhNTQyYWQ0ZTFkM2IxZTAyYjdiYzgxZjkyMmRkZTBiNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3Rlck5hdGlvbmFsaXphdGlvbk9ySW5zb2x2ZW5jeU9yRGVsaXN0aW5nRXZlbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3ZTAxYjg0OTI3NzQwNWVhMWU5MDBlZDU0MmY3MWJmYjkwZDY5MTZmMjY0MmMzZmJjZmIxOWQ3Yzc3NTc0ZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbUxlZ2FsZG9jdW1lbnRhdGlvbk1hc3RlclJlcHJlc2VudGF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OGQ5ZTM0NzlmODQ1NjJmN2E0OGQ4MWRkMzYwMTgyYzdmM2Q1ZTNhZWU5MTUwOTVmZDQxODk3MTE3ZWY0Yzc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJUcmFuc2FjdGlvbkFkZGl0aW9uYWxUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMmJlYzE2NDUyOWYwMmEyNTdjZTZkMWYzMTY4MjczYTIwYTA0ZTcwOGM4YWY5YzZjN2E5ZWFjMmZjYzJkNTNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1MZWdhbGRvY3VtZW50YXRpb25NYXN0ZXJVbmRlcmxpZXJTdWJzdGl0dXRpb25Qcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWZmMWYwYzg2NjA5YzExMjM5ZDdjOGIyMmE0MjNkZTQwZWY2ODQ4NzUyM2E4NWFiNWUxMjQ3ZWY5YWUxZDc0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTWFyZ2luU2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDU4MzExNzAzMTZhNjAxZmFjZmRkZDlmMDRkOWQ1MGU3ZTFlM2ZhMzgwN2IyMDk5NmEzY2MyMTAwNTM2NDcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1NYXJnaW5TY2hlZHVsZVN0YW5kYXJkaXplZFNjaGVkdWxlQXNzZXRDbGFzc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTA0OWZmMWMxMGRiYjllYzA0NjdmZmM4MzIzYTNkYTA3NjYzNGI1NWY5NzFiM2JlZDJmYmU0YzgxNTZmOWE1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTWFyZ2luU2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZUluaXRpYWxNYXJnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWY5YTI4YTE4MmUxZjU3YzU4NTE3YjI2Njk4MWQ5MzczYmE4ODNlNmNlODhhNGMzNGUxNGI1ZTBjOWUzZmFlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTWFyZ2luU2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZVByb2R1Y3RDbGFzc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA5M2E1ZjI5NmJlYTgyMTdhYWNmZGM2MTRiY2I4NDVhMDZhNDdlMjEwZmVhOWYwOTliYTI0YzZlNzIyYjFiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtTWFyZ2luU2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZVRyYWRlSW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWU1M2Y3NzFhNjQ4YzcwYTgxNzFhYzg4YTdkNGRiZmM0Mzg2NGYwMTZmNzY4Y2ZiMzYxOWIwYjhhZGM0ZTgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRCYXNrZXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdmNmY2ZjhkYjdlODViY2E3ZDUxZGQ2YjA0YmQyYTM4MmIxZDBiODE4NzI3NDExZGE3ZGNhNmE3ZTc3M2I2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0QmFza2V0Q29uc3RpdHVlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjk5ZGJhOTU0OTQxMmMzOWVhZTlkODg1YmVkNmFiMDJlMzQyODdlMTFiNzY2Mzk0YzQ4NTI4MzRkMzdjYTRiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVDYWxjdWxhdGVkUmF0ZURldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDYzZjU1MmYwNzY3MTYyMjU1NjkyODcyODllZjk2MjRmNzkzOTJjNTFiYjYzN2E3MGU2NzNkNjNiZWFiNmEwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVDYWxjdWxhdGVkUmF0ZU9ic2VydmF0aW9uRGF0ZXNBbmRXZWlnaHRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmZTg4NjAxOWMzMjdiOTI2YWUyMDQxMGJmYWJmNzI1YjAxZjhkZTQ3ZTM1MGRkOWQ0YTNmNzk2MjcyYzZkZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhbGN1bGF0ZWRyYXRlQ2FsY3VsYXRlZFJhdGVPYnNlcnZhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU3ZTE0OTVkNDI3YjM5NGFjMDdiYzA4MzcwNmE3YTljN2E5ODQ0YmNhNDc0N2ZhNTUwNTE5OGRmODQwZWI1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVDYWxjdWxhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzIxYWRlODczYTFmNjY1NzBiYzBjMTc0NTIyYWZkZWU4NDFlYjUzOTJlY2RiOWNkNDY4ZGU2ODdhMDI5YTI2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVDYWxjdWxhdGlvblNoaWZ0TWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OGU2ZjVlMjMxZWQzYzdhMjY5OTYyMDU2ZGUzODY1NmJlY2NlYWUzNmVlYzExMjNmM2Y4ZGQxZTRmZDc5ZDk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZUZhbGxiYWNrUmF0ZVBhcmFtZXRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODU2MjAwNTY2Y2U0YmZhYzFhM2I1ZTQ2ZGVmNWQyOTA0YzliOGY5YzE1YTgyMmY3MzVlZGQ5YzFmNmVhMzFiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVGbG9hdGluZ1JhdGVDYWxjdWxhdGlvblBhcmFtZXRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI0YjhkOGExMTA3YzVmN2UzNWQ1NWUyMTNhNTkwYTYzOTc5MjQ4MTE4ODIzZGU5MGI5YTgxODJiNmE2NjRiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVJbmZsYXRpb25DYWxjdWxhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWNjMDdjYzZlOTM0NDY4OTI1MzFjMTZjOTJjNzc2NTliYjY0NjRlMjAwYjM5OTI2MTU1Zjc4Y2FjNTA1Mzg4NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRlZHJhdGVJbmZsYXRpb25DYWxjdWxhdGlvblN0eWxlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTBiMzM0MzkyYWQ3YTE1ODVhZTdiY2QxYjU1YmViOTYyM2RlYWVmNjY3Yjc1OWZiYmI0ZjVmY2FkZTMzZGU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZU9ic2VydmF0aW9uUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWY5MGY2NWJkMzJhZGU0YThmN2IzNTg0ZjI0ZTEyOTM2NzE0ZDgxNmQ2OGE4MmZlNjVlZDAzMGUyMjVmOWZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYWxjdWxhdGVkcmF0ZU9ic2VydmF0aW9uUGVyaW9kRGF0ZXNFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxMDZmMWNiYjM1NGZjMDViNDQ5MmZjZmZlZmFmNmJhMmFlN2EyMTc1YmQxMjE5ZjBhYjQ5YjIzMzA3YjdiMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhbGN1bGF0ZWRyYXRlT2JzZXJ2YXRpb25TaGlmdENhbGN1bGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyNjBjNWJkYTllMjNmZWM3YzMxNDliMGUyYzAzNTkwNTBkZGE0ODA5Y2VlYzQ3ZjIzYTZiYTJmOTBkM2I1ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENhbGN1bGF0ZWRyYXRlT2Zmc2V0Q2FsY3VsYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTk5MDVmOWUxODcwNjg2NjczYmI1MmIxOWVjNzg0MzczOGJhZDQ5MWJhYmQ3YjZmY2MyMDdjMmUzNjEwYTA3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FsY3VsYXRpb25BZ2VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NGY4ZTcxYWZjNDNmZjM1NWQyYmVlNjQwOTZiOThlN2JiNjMyODM3ZjVlOTNlMjBjYWJmODg0OTg5ZDI5YmVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYXNoQ29sbGF0ZXJhbFZhbHVhdGlvbk1ldGhvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWM4MGRjMmQ4ZjIyOWFjODVlMjY5YmYzYjA4Yjc4N2U2ZGM4NzczMGU3YTQ2YTM3OTdhZjhjNzRjMTg1NDRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDYXNoUHJpY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE5YmQ0NzE2YWI2ZTQ1YmZiYTQxYmY4MWNiZWIyZGI5MzI1YWRlOTQ0ODY3NWMzNTJlYjAzMGZjODI5NTc0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q2FzaFByaWNlVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzQxZTA4MjZjMjNmYWJiMjBlYjI4MDQyOGRkODI3NWFhMjUyMmVmMGQxZGE1ZDUwYjIwMTMwZmQ1MzUyNGY1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q29tbW9kaXR5UmVmZXJlbmNlUHJpY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5YmEzOTdmOGNiMjQ5NGU3MDY5NzI5NWUxYmYyNmNhMzMzMTA4OWJhNzJkNjNhMWY2MjlkYWIxNTgzZDZiNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdEluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjMyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjYjIxMzk2M2JiZWIxMTJiYzEwY2FmMDBjZWIxYTJjNWIxOGU2ZTA4N2E1OThhYzBmZjdjMjdmNDA4NGM0OWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdE5vdGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI3MjRjZTk1Zjk0NGQ4NTY4NTcxNzU3YjZlODhiZDM2N2YwNzVlMTI2OThjNDg5NWQ5YzE1YzQ1Zjc0ZDVlYzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdE5vdGF0aW9uQm91bmRhcnlFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2MTgwM2EyZDdmYWU4NDMxMTM1N2VmZWI2NjUxYzMwOTQ5MjczM2RlYTBmNmRmOTgxMTc4OGEwZWIyNzFjZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldENyZWRpdE5vdGF0aW9uTWlzbWF0Y2hSZXNvbHV0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWMwOTQzNzFkOTI3NzU5YmNkNGJmMWUyZmNjZmMyNDAyN2ViNGU4MzZjOGUzZDhjMzdjYWY3OThlOGIzZDgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDcmVkaXROb3RhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjg1NjRiZWIwNzNlNzNmMWU0ZTliYjQ4NDEzZmZlMGQxNTkxMDkxOTMxNmY4M2ZkZTYwOTczNDc5YjBjZjk2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q3JlZGl0UmF0aW5nQWdlbmN5RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YmIxOWY0ODMyNGQ4MGIwYzFjMWY5Zjc4NTU1ZTVkNDg1NDk1YWU4MjE5YjAwMTQ3NmQ5MDk2MjdhYmQ5NjlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDcmVkaXRSYXRpbmdDcmVkaXRXYXRjaEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGI4Yzk4MzM3M2NmZTY0OTdhYWNkOGE1YzY1MmI1NTAzOTk3OTNkNThjY2ZjZWY5YjcwMDc0NGU0YzZkNzMzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0Q3JlZGl0UmF0aW5nRGVidC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTRjY2Y5ZDdlN2ZlNWE1MmI1NmUxZGM4ZWM2MTJmYjRiNTIzMGI0YjZkYTRiMGMzNTkyNjI2ZmQ0NzE3NzNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDcmVkaXRSYXRpbmdPdXRsb29rRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTNiNTBkMTdkNzZhMWZmOWNhODU5MzNhZTZhZGYyMWI3NzY0NGMyNDc0ZmM0ZmFjODNiNmE4MzczYTUzZTlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDc2FUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDU2Yzc0NWE4YmU5ZDNhZjMzMTE0YzdhYTAwY2QyZmJiYWU1NThmZTI1ZjcwNDcwYjJjN2VlOGMyYmQ5NjMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRDdXJ2ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjY2VhNjYzODg4YWM1N2VkNzdiNzVkN2RjZWFmMTQ2YTlmNTFlNjQwMTIxMDFhYzc5YTE1YzcwYTRkODYxNTdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXREaXZpZGVuZEFwcGxpY2FiaWxpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTc4ZDdmZDE3NTljZjk2ZjFlMTcyYTU4Mzg3YjhkNmZhM2I1Yjc0MjI2NzQ0MTIwZDJjYjdhODk3OWQ3YTg2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RXF1aXR5SW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTUzNDU5Mjc4ZmJlYzliMTE1OWM1NDkxYzQ5MWUwMTFkNjQ0ODVlOWU0ZGUxYjkwYTMzY2M2ZDA2NDUxZDg1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmFsbGJhY2tSZWZlcmVuY2VQcmljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjFiYjRlN2I4MWFlYWNkMzQ3Yjk4ZDVmOTY1YWFmODMzNWJiNDhkMzI5OGM0ZGYzZDQ1YzY1ZGRmOTI2M2IyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGZWVUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNGFiZjdjMjA4N2Q0NTRmNjg4ZTA0MTc3NjkzYjE3NGFkNzU5ZDBkZjY5M2FmOWExZTVlNTRkYTEzZTYzM2QwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhQmFza2V0Q29uc3RpdHVlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDkwYjJkOGMwODQ0MWQ5N2NlNDI0Y2I0ZTIyNWNhMzFmOWFhMWJiODI1YWRkNTcwZGM5OWYxMzRjMGZjNDhjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmllbGRXaXRoTWV0YUNvbW1vZGl0eVJlZmVyZW5jZVByaWNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZGMzZjhiY2YwMzQwZjdlNTRmMGRiMGZmNzAzYWU2Y2YyYTU2MThkNTNlNTk5YjdmOWM2MDJlODEzMzBjMGE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhQ3JlZGl0Tm90YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzcxYTYyMzMzN2ZkOTZjZjY1ZWU1YzMzOGE2MzNiMjhlYmQ5NTIyMDIwNWQ5ODgzNmMyYjhhMWYyNThhMzNhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmllbGRXaXRoTWV0YUluZm9ybWF0aW9uUHJvdmlkZXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1NjZkNGViYzNhNmJjMzFhZmVkZjJjOGVhZWZlYTdhMDhjODJiZTNmOTNjMTg1NGM1N2IwMDhmZjg5ODA1NDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZpZWxkV2l0aE1ldGFJbnRlcmVzdFJhdGVJbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTkzYWU2YWYzMjE0OTdmMTc5MmUwYzIwYjE0OWU0NDg3ZjNhNTc2MjE1ZDI3YWU3OTQ2ZTc2ZGVhODk4YTA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhSW50ZXJwb2xhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDlkMjgzZGQ2OTUzYmJkOTI3NThkYjUwOTUzMjkxZGRlZDA0MTU2NmU5OWY1NGY4OWY2NDQwOGUzOTk1NDFlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmllbGRXaXRoTWV0YU9ic2VydmFibGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjAwMGUxOGMzNGVmNDAzYjM4ODc2YzFlN2EwMDA2ZDIzNjA0NGViZjViZmZiNmM5ZmEwNDA2NzViNGM2NTI4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmllbGRXaXRoTWV0YVByaWNlU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmUxMzllOGI1ZDRjMTUxZGM4MDBiYTAxOWU5ZDZiYTlhNzEzMTdlZGIxYWE3ZGQwN2VjNDNlZmYwYWI2OGQ2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RmllbGRXaXRoTWV0YVF1b3RlZEN1cnJlbmN5UGFpci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OTZkNjUyNmE2YzcxNzY3YzIzOWM4ZjU4ZWU2NTFhZWI5MmFkYjA5YzRhMTMxNjNkZWFhMDUzNGViZWNiOGQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGaWVsZFdpdGhNZXRhU2V0dGxlbWVudFJhdGVPcHRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhODdjNmViMmJmNzc3NDk1MGQ4MmViNWMyYjE2NDE4ODk2NWU4NzY4NjhkNWE4Y2Y1OGZkNDI3NDVhYWU1YjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZsb2F0aW5nUmF0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2NjUwNGEyOTFmOGY3MjBhZmI2N2Y5YWU3YzE0MWE4MDY0MGMxZGExNWY4NWIxYzU0Yzc2NmRjYmE1OGQyMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZvcmVpZ25FeGNoYW5nZVJhdGVJbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjNhYWQyYzE1YTI2NDU4ZGYxMmM0YzkyYWUzNzU5NjNmZjNkODVlMDFkMTlmYTRhODQxZjVhOGIxMDU2YTMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGcm9GbG9hdGluZ1JhdGVJbmRleENhbGN1bGF0aW9uRGVmYXVsdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjNjNjdmOGJkZTc5NDdmNTBkNDc0YTFhMmI0YWExNTAyYjFjOWI1YzJjNGRkZDUzOWUwYjI3MGY0OGYxMmRiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnJvRmxvYXRpbmdSYXRlSW5kZXhDYWxjdWxhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjc2NDdjMDkxZjMwNTA0Njg1MGViODUxOTM4MDE3NTM0MGI2NDEwY2QzYzQ5YmNmYmY1ZTVjNDczNzdlZjhhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnJvRmxvYXRpbmdSYXRlSW5kZXhDYXRlZ29yeUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGU5MTBhNDQxMzE5NjQ4YmNjNzk4MTUzYzViZTQyMDkyODQwZWVjMWFmOTkyYTU4ZGRlM2NmN2M5MjFmOTcwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnJvRmxvYXRpbmdSYXRlSW5kZXhEZWZpbml0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxZDAxMjEyNmU4MGYzNDUyNWRkZjYyZDIxYjMxODZiOGNkMmQ5MmQ2ODI5OTQ3YTUzOGE2ZDIxZGUzYmFhNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZyb0Zsb2F0aW5nUmF0ZUluZGV4SWRlbnRpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRkMzcyYzNjNTRmZWRhNzc0YmU5ZTY4YTI3YjliYmIyMTc2ZmI0MTIzNTkzNDY5MzkxMGJiYWMzODAxOTQ1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnJvRmxvYXRpbmdSYXRlSW5kZXhTdHlsZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWRkNWQ2ZTAxNDAxYWZmZTdhZjJmZjk2ZDg0ZmNmOWYyNTllZWJlM2M5NzhkZTQ4YTA2YzU0Njc2MTA4ZDQ2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnhJbmZvcm1hdGlvblNvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNmZjZDBhN2IyYzA1YTc0YjM5YWRlOWEwNzVmMTM1ZTZjMWVjNzVjMmZiYWFhM2JjODRmOTY1MjZmY2Q3ODY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRGeFJhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjgxNjdmYWM1MzVkMDBmZGQ2MTdkMzYwMjhkNDAzZmQ2N2Y3M2E5OGVjNDVlMmJmMGFjNjFiMWI5M2VjYmZjNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnhSYXRlU291cmNlRml4aW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImI0ZDU3MjVmNWU4OWRjNTdlNzU4ODczY2E3ZWE2MjI2OTc4NjE0OGQyMmU4OGEyYzliYmNlMDM2NjE0MTJkZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldEZ4U2V0dGxlbWVudFJhdGVTb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjMwZGU0YTE2NDc3NzVhOTI1YzU5YjRlZmQ4NTMxOTA3ODYxZTkwZGU5Yzc0NWVlYjM0YWQxNzVjMzdkYzRjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0RnhTcG90UmF0ZVNvdXJjZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzMzYTRkYTEzNTQxOTMxYjY3YWU5ODg1YTY1NjA4NWIxMGQzNjAyNTk5NjlmZmM5NDcxZGQ3ZGIxNjFjMTM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbmRleC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODUxN2JlMWI0OWM5NDZmZmU5ODA2NDgwNjc0ODMzNDVjZWUzYzU5M2QwYmM4YTYwMzc5YTNmYjA4MjM0MjBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRJbmRleEJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDc0NmIxN2U0YTQ2OWY2NTkyMDAzMmJmNDY3NjNjNmNkZmM4MDc5Y2RkNmM2NDIwOTM1MWI2MWU0NDJlYTA5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0SW5mbGF0aW9uSW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGIxOTI3N2ZkYjRmZjBjYTQ0ZDlmNzIxNTBhNzFlMmFjMGM2ZjhkY2Q5ODUyNGNmYzEwZmJkNTdjMmNkMTkyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0SW5mb3JtYXRpb25Qcm92aWRlckVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGM1YTdiMDFkOTJkNDRkYWU1NjE0NDQ5YmUzZDYzOTFmYTRkNGIwNzI1ODVhYTcwOGFjMGI1ODliNmFlYWU4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0SW5mb3JtYXRpb25Tb3VyY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmU5MjQ3ZjYzMDJkMDc2MzYwNmUxZDkwY2IwZGQ0OTE2NWU2MGM5OWQzZGJlYTA5NzEzYzBlM2RkMjc4ZGI3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0SW50ZXJlc3RSYXRlQ3VydmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmFkZTVkOGRjMDA3YzUwNjgyMTI3YzIwNjI1MGJjYmE4YTQzZWM5NmQ3Y2I1N2NjOWM0MzM0YThhODIxMDNkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0SW50ZXJlc3RSYXRlSW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTc3M2ZmNjAzNjA5M2Q1Yjk0MzU0M2E2M2ZjNWY5ZmM0YWMzNmViMTgyZjFiYmQ1YjdhMTIwOGZmYWMwNWJkYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0SW50ZXJwb2xhdGlvbk1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQ0Y2IyYTU3NDA2MzhhMGFjMWI3ZGQxMGQzZTM0M2U4NjA3MWM1ZmFlNGM3ZmNkNWFlMjkxMWNjOTA1MmQ3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWFrZVdob2xlQW1vdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA0ZjdmZjNlN2U1YmM2MTNkMzM2YzgxY2MxZjUyZDI1NjI5NWViMmZjMGRlNzhiMzRhM2IxODkyYmZkZmZiZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUJhc2tldENvbnN0aXR1ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNGZhNDY1NTZmYmU2MmRlMmM5NWYxYjg3MDZiOTlmMmRkOGY4NzIzOTlkYWQ2MGIwNzkxMmJmOGNlMTBiMDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUludGVyZXN0UmF0ZUluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxMTYzYTQwMzQ1ZGNlM2RjZTAxZTMyMzZhN2VhMmM1MGVkNjY0NzM2MmNkMmI4YzBkZjliNmJiZTAzNGM1ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU1vbmV5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxN2ZiNWM1MDBjNDhhNTQ0ZTMwZTM2ZTIzZGQzNTRlNjNjNzJkMTQwNzAyY2I2Zjk1NDM2NTRhZGFlYjZkMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU9ic2VydmFibGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGExZTc1NDE2ZTM1ZmNmYzVjNzExMzI4OGE4OWZkODUyZDJlNmI0YzEzOTdiNzQxNjcyMjE1YjkxZWM3MmJiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGVyZm9ybWFuY2VWYWx1YXRpb25EYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjU1MjkwM2E1ODc3N2UxYWYyNThmNGUzNmU0MTEzYTM1OGVjMjkzZTcyOTkyYmVhYjQ2ODA3NDRiYThjNTEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQcmljZVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5NWE5NWI0OGE5YzYyMTZjZmYwNzdhNjg2ODZhZDdlMzc5M2NiYzA2ZTY2YzIxMTA4Mjk0YThiY2I4YTQ1YmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVF1b3RlZEN1cnJlbmN5UGFpci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNGEzOTc4M2M4ZTI2YjA5MTM2MDVmZDdhOTcyN2Y4MjNkNWIyZWU1MTUyNDBhNmIwOTIwNGE4NmQxMDI2NzA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFSYXRlT2JzZXJ2YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2MxZWNlNTg2MTEyYWVjODZiOTBlZDA0OGExOGJlZDczZWNmMmY4YTcxNDMyOTYzYmU5MjBlZDUxMjI1ZTkzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TW9uZXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBiMmI5OWQ5ZDE0NjA1MWFhNjZmNDIxY2I4NzkzMWFiMjU5NTQ4OWYxZmY0NDhjM2JjNWQ3ODQwNTZkNjgzZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TXVsdGlwbGVDcmVkaXROb3RhdGlvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTg2ZGFjMDczODY2NGU3OTNmMzU0MDgxZGNmYzUwYTc4NjQxMjU3NTNkNGZiZmJiNTQ3OTJmNGU3YzQxMmFlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TXVsdGlwbGVEZWJ0VHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGY4NDNmY2RkZTA1YmE5ZDcwYzllY2RjODIxYzZjMDk5ZTAwNDhiZTgyNzMyNzJmMDU3OTNmNWM0YWVhZjVhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0TXVsdGlwbGVWYWx1YXRpb25EYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTBhYjFmOTUxMDk3ZDAzNGNhZDE0Y2EzYTYwMDhiODY3YWY2NGY5MjVkZDk3ODk4MTIwY2VmYWMzNmY3NDkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRPYnNlcnZhYmxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkNjI0OTViYzhlNTc4YWUwOTUwZTFjZWYyMGQ3NGRiYmY4OTIzNWU4ZDk1NTM0Y2RiNTFhNjEzOWQ5YjZkMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldE90aGVySW5kZXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWJjYTFlYjU0YTM2NDBlZDYwMzVlZTZhZWE3NGU1ZmU0OWM0NGJiODM0MDNjNTc0YzcwNDdmYmJmYmQzYmVhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UGFydHlEZXRlcm1pbmF0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZDE2MzY0OTAwODBjMzM3NTQ5Yjk2YWJjZmNjNzEzMTYzNDRiMWE0ZmZiMTM1ZDc5NjJiNmQxMzY5OWEwNGJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQZXJmb3JtYW5jZVZhbHVhdGlvbkRhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkOTljNDg5MjlhZjllZmYyNjFlMGU3YWZlZTlmNzEwN2MxMzk5NzA3YTVhYjU4ODlmZWU4NWMxM2QzZmUyZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByZW1pdW1FeHByZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkM2Q2MThmNTZhYjk0YzA1N2I3OWJlMThiMWQ4NzNkOWJiZTYzZmU4ZThlNTIzODIxYmI4ZWY5M2NiMGZmMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByZW1pdW1UeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZGMzMjYwOTQ0NmZmMDE3MWU3YjIxMDcyZGM0ZDBjNzk2YTNmNGYyM2RjZjk1NDM0Y2Q2YzNhODkxY2QxOGU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQcmljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTZlZjI4NTAxZDMyZGZhNGQ0ODFhOTlkNTM5NzBlM2RmYzMxNDJhODEzOWJlMDBiODIyYTQ5NTI5MzZkYzg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQcmljZUNvbXBvc2l0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4M2NlMmY5MzAyOGU5MjIxMjUwYjlmMjZlNWNjM2M5NzdkNzcwZGM0NTY4YmJhY2RhYjhiMWEyMTQ1ZTQyYmE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQcmljZUV4cHJlc3Npb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwZjRiOTU4OGNhM2FiNGE0NGRhY2M4ZjNmYTA3YmMzNjFhMDBiYmVmZmUxOTQ4ZDZkMDlhMDcyYTQ4NGZiZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlT3BlcmFuZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGMxYWU2YjU3Njg5YTU3N2MwNDdmZjlhZTZiNzBjMzk0OTcxMmM3NTU5YTI3MjhkNGM5NWEyNmJhMDY4MDBiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UHJpY2VRdWFudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMDkzNmZiMTYzOTQwYmRjMjIxZTk0ZmU1MmExMGRiNTA0MWFiYTQ4YzhjYmQ3MTkwY2Y3OGFiYzEwOTBjZTU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQcmljZVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2ODllY2I2NGViNDM0YmViMjc0MDBiNDExZDQyYjcwMzljZGNjMDQ2ZWRlY2EyODBkMDg1OWM2NGQ0YmE3NGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFByaWNlU291cmNlRGlzcnVwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NzM3NjcyZDQ3OTQ1ODJiZWNhY2NmZjk4MDRhNzU5MWViMTM4ZDIyZjgwZmM2ZjU5OTdhZTQ1NjI4YjEyN2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRQcmljZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzZmZjOWM5NDU5YjI3MjgxYmQ3OWMwYjk4NzY0ODUwMWU0MDEwMGVhOGE3MGJhMTc0M2E4ZmUzMTNjMzM2NTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFF1b3RhdGlvblJhdGVUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MGE4ZDI2NWU0YmU1Mzg4M2ZlMDM4OTIyNjQ4NmEzZDlkMWE5OTRhZWE1YzU4N2QwYjNmNmNhMmVmNWE2ZjM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRRdW90YXRpb25TaWRlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MGMwYTM0ZTU1M2U2MDMxODhjYzZiZjEwMTk5ZWI4ZmI0ZDU5MzAzNjk4ODM4NTVhZThiN2YzMmY5ZmFlZjk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRRdW90YXRpb25TdHlsZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODliNzdhNjQ3YmIzNjM1ODBlZTVhODdhNzE4NjNjNzk4MmExZGEzNDcwNjg0ZGQ0ZDg1NzA5M2RhYzIyZGVkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UXVvdGVCYXNpc0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGIzYzZiZGNhYjdmZjg0MGMxNzIxZDlmYjEyNDkzZjM2ODg4YWZmYjdkMjkzMTJlMTBkNzNhOWEzMGJlODhmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0UXVvdGVkQ3VycmVuY3lQYWlyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlN2U5OTliNDg5ODcxNWJmMTM5NTZiMmIzZGE0NDFlMzhjOWVmOWZhYWY1OGM1NjA1Zjg3OWQ0MzRiZGIyMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFJhdGVPYnNlcnZhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OTlmYzI5N2MxZWYxYjk2MGMwNWU3ZWM4ZjI4NTI0ZDNiYTAwMzY2MDJkOWQ4NGJiYzkxZTRmY2VkY2MwZDFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRSZWZlcmVuY2VTd2FwQ3VydmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzdjNDcxNjU4MTE0ZDNhZjQ5Mzg2ZTIwZGIzYzRjNGNiZDZhNTAwYmU0YTUwYTUwNDdkMDBmMDA4NzE4OTNhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0U2V0dGxlbWVudFJhdGVPcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFjODkzZmNlMDEyYTMwZGUzYzZkMDNhNGEyMWMwNTY3MjQ4YmUwOTQ3YzNiODgyY2Q2MjgxYTc3YmQ3OTI5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0U2V0dGxlbWVudFJhdGVPcHRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4ZGY5YTdmZWJhZmM5ZjE0OTg4MDQ2YWUwZmUyZDQyNTY4ZmNlZjZlZjY5NWM1ZmIyMTQxN2NlZjVmZmU2YWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFNpbmdsZVZhbHVhdGlvbkRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjZmNjBmOTliNWY2MjhiMDc0M2FhZWE1NzIxMTNjNzViMTEzYTJmZTUxMzdlMGEyMmEwZTdmNWJmODM4YjFhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0U3dhcEN1cnZlVmFsdWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiYzU1MmM0NjE5NWNkMDA4MTU5ZDYxMzYwNmQ0NTlhMjc2YjYwZmM2YzM0NmQ0NzE1Yzk0ZTFiMDIxOGM2ZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVBc3NldFRyYW5zYWN0ZWRQcmljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTA3NWYyMjJkYzk3ZjEzYjQxMjAyZjFjNDgwMmVmZTllYzY4NTAzYTVlYWYwM2RhNTIyMzdjNDhjMzhmY2I2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRWYWx1YXRpb25EYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2M4NDg2YTdkMDUzOTlkYTBlODAyOTVjNmJlMTNkY2RjNzFhMDRlNWJhYjkyY2RhYzdmNjkzY2NiMTRkZGViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRWYWx1YXRpb25NZXRob2QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGU1ZmYyYWI0YzY5YmZlYWEyY2JiZTJjMDJlYWFmN2YzY2U3NWQyNzk2NDg2NWE0Mzg0MmJlOTBiOTJkNzI0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0VmFsdWF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzc4ZmJhNWM0MmQzNjY2ZTlmMTQwZTcxMzNjNDI1YjczMDJmNTlmMTQ4Y2M0MmUzOWRiOTI4NTcwMWFjYjBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQXNzZXRWYWx1YXRpb25Qb3N0cG9uZW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmM2ZDcxMzVlNDY1YmZmMWZjNzAxZmUyZjA5NDAwODY3NmRlYTlmN2VkZTUzYzVkNWE5NTQ5YWNiOTA0NDQxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUFzc2V0VmFsdWF0aW9uU291cmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlNjBlNzI0ZTM1YjEyNDViNTlkMjU3MDZhNmE5NzAzMTFiZGZmMDkzMDY2MzUxMjc4ZTQ3NWQ1ZWNiNTk0NDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVDb21tb25EZXRlcm1pbmF0aW9uTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmY3YjA2NGZmNmRkYWQ4YmJmZWExYjU3YmQ0YTNhY2VjOTJlMzdjM2Y0MGQ2ZWM4ZDUxNzAyZDFjMmU3NGU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlQ29tbW9uVGltZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0NGE4NTdjYmRmMjgyOTMwYjk1MDBiYjg1YWEwYTMzNDUwY2RmOTU0OGZhYWJiYmIxZDVkNTQ5MjNlNGVhMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudENyZWRpdEV2ZW50Tm90aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4ZTQwYTU3YTJkOGNiY2Y5NTUxYjljYmUyYWRiM2E3MGI0ZGMwMWZmMzRmMjI5MTVkNmJjYTRiMTkzZTFiNzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudENyZWRpdEV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MWQwZjRiZWQxZWM0YWZmNDY5ZGJmZWI3ZTljMTFmZTU4NDNhY2IxOTRhZGMxNmFhNjg0Njc1YmM4MDkyNDI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnREZXRlcm1pbmF0aW9uTWV0aG9kb2xvZ3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGIyZDUyYjZjYmM2NjNmMjg1MGU3ZDdiOTY0MzAwYWI2OGFkOTA2MjZmZDU2YmY5MTEyMDdlNjhjOGI1Njk0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50RmFpbHVyZVRvUGF5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhN2E1YzAwYzkyOGRiMjg3YTAyMmQ1YzdlMzQwOWQzNGM2NDRjNzg1ZDJhZmVmMWIxNjU1ZTRkODUyZTUwMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudEZlYXR1cmVQYXltZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1NzgwYmNmMGJkMmNjNmU3OWEwYzdiOGEyYmFiNDE4OGIyNmQ2MWNkZjI3Y2Y5MjE4NTA3Njg0MjYzNGExOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudEZpZWxkV2l0aE1ldGFNYXJrZXREaXNydXB0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzY1MmUyOTMxZDNkZDNiOTJkMmFlYjNjMTFiNjAzYjJlY2VkMjcwYWIyYTQ2MTdlNTZhYjMzMTRiNGEzNzIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRGaWVsZFdpdGhNZXRhUmVzdHJ1Y3R1cmluZ0VudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGJjMjIwZDNkNzI0Y2Q0YjJmMmUzODIyODU2N2IyODJjOTUyZjNhOThjNGJkMTE3Y2ZjMzNlOGUxYmU2NmY5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50R3JhY2VQZXJpb2RFeHRlbnNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFlZDA1ZGY1MTIwNGFiYzRjM2U5YWJlMDZhYTRmZjViMTlmY2JlYjI3ZTE0N2M5YWM3YmY1OTE5ZGQzYzE0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50SW5kZXhFdmVudENvbnNlcXVlbmNlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzA3OTAwNDM1NWI5NDNkMmFiNmE0OTNkNzIwNTVmMjY1ZmQ1NTU1MTY4YzliOGZjMzAyZTVmYzg1ZjZhOGRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRNYXJrZXREaXNydXB0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDk2NjZiZWZjOTlhYjdlYTk4ODdkYjJjYzNjZGRmMDNkYWFmZDg4NTAzMTNhMTBhMzkyNGEzNGEwYTc5Y2Y0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDcmVkaXRFdmVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDUxNDNkN2RlZWQzNjkyYmExZTFjOGU2Zjc3MGUwNzFiMWM2NzdjMTc1MDIwOGI0Zjg3MmJmM2M3YjFmNTljZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhT2JzZXJ2YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDJjOWIyMDNhMGFkNDMyYmI1NDcwYWQxMzI5NWFjNmY2NzU4OTJkMmQwZjVlMzBjZDU5YmVkOTczNWZmNDBiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50T2JzZXJ2YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzY2YmM1Mjk0MWRjNmQxOWRiOGI2ZTM0NGQxZGFiMDQ2MzdjNDBjZDljY2ViNTIzODJkNjM0NjFkMDM4ZmM1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50T2JzZXJ2YXRpb25JZGVudGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5MGI1YmYwZGQzYjE0MGYxZWI5ZWY4NzM2ZWRjYzA0MGZlYjY1YzJiZjYxNWEyOGU2NjhlZDc3N2RiNzY4NzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbU9ic2VydmFibGVFdmVudFB1YmxpY2x5QXZhaWxhYmxlSW5mb3JtYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2RhYTI4ZWM4MGZkODgyYmNmODk3YmQ2ZjU2OWQ1NWMyZDRhNzM1NGQ5ZmE2MzUyZDY2ZDdkN2VlNDE2NTFmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50UmVzdHJ1Y3R1cmluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MTdjODhkN2M1MDUyZDE0MDY2ZDljZTdlMzRiZjdjMDc0MGM3MWRlMzY5MGYyZDVmNzczNmIyMjA5MzZiYjg3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRSZXN0cnVjdHVyaW5nRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTg3ZjdlMDYxN2VjNmFlNzM5OTEzNTM1YzdiZDE2YmJlNTExYjY4MTcxMGIyNTkxZjRjOWYyZDc2MTZmNWUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRTaGFyZUV4dHJhb3JkaW5hcnlFdmVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNjNWY1MjhmZWMyMGMwMzlhMjdmYzkxODE3YzQ3ZTNhOGIyY2ZlZmUyODQ2NDJkY2E4MTYyNDdkM2EwNmM0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50VHJpZ2dlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTNjZmU1NTc4NzgxMGE3YzBjNjhhZjE3YzQ4YmNkMGU5MjQwYzg5NmQ0ZGZhMDRlMjQzNmQwOTY2ZTViZTAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRUcmlnZ2VyRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODhmMGRiOWJlZWMxNDhhNWFlZjg2NWIxN2VjNmVmMGFmY2U4MzNlYzQ2YThiMmJiOWNhMzZjZDBlNGIxMzcxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtT2JzZXJ2YWJsZUV2ZW50VHJpZ2dlclRpbWVUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZjZiZTkzZmM1MDE0M2MxYjEyOWJmNzkwNmJlMDcwN2Y0MzJkYzA2YWJlOTJmODcxZjdmMjAyOGZhYWNkNmJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1PYnNlcnZhYmxlRXZlbnRUcmlnZ2VyVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRlMzI3ZTFjZmQxMWYzNTRmYWE1YzAzODg0ODJiYjJlOGFjZWU2YjU5MzQ0MmJkMDU4NDNkNTE2ZWUwMzIxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QWRkaXRpb25hbEZpeGVkUGF5bWVudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmUwYWFmN2QwZTY4ZmMxYjFhYjJjYTJlYTliNDI4NWMxODQ2NGIxYTAzZDYyYzUxNzUzNGY0ZjQwYjZlMzU5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QXNzZXREZWxpdmVyeUluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmZDVkMGRlMWQxMzZhMTU3MDJlNmEwZDZkZGE3Mjg2YzZjNWI0NDcyNmY3N2JkYjMxZTVlZGIzMmE2MzYxMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEFzc2V0RGVsaXZlcnlQZXJpb2RzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyODAxOWY1MTgwZDRiYzM5NGFiZDVkM2ExOTY5M2QzNGEwYzkxN2VlYTUzYTA0NWEzMDgzNGNmYzJkYTdiYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEFzc2V0RGVsaXZlcnlQcm9maWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4Mjk3YWNhZWVmMzUwMGQ1MGE2OGFlYTU3YTVjNjExMDZiZTA4ZmQ2Y2ZiYTBjNTZhNTAzM2VlOGQ4MGFiNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEFzc2V0RGVsaXZlcnlQcm9maWxlQmxvY2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWRkNTVkNDM1OWNjZTFmYmNhMTM1MTVjNzY1ZTc2NjA0Nzk2NWIzNDhiNjQxMzBmZDMyYTgzZGQwYWM5MjU4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0QmFua0hvbGlkYXlUcmVhdG1lbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2NjQ0NmJhZTAxMzBjYjc5MDA4MjFmYWMzZjYzZWM5NDUxNzk2M2VjZjhjM2Q3MzNmNjFmNjY2Mzk3NmU1NWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEJhc2tldFJlZmVyZW5jZUluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0ZDcwZjZkNDIzY2JmMWJiNjFhYjJkYTVkNTIzNDA2MTYyNmZmNWU1ZmRmYjM4MzI0Nzk4N2IyYTBlZmIxOGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEJvbmRSZWZlcmVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmI4Yzg4OWFiYmM3YjRiNGI4ODM5OTczNjkwODY4ODBiODBmZDM3ZjFjMDI1ZDI0MWU1OTM5M2Y1MTE2YWZlNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Qm91bmRlZENvcnJlbGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwNWVhNjU3NjgyYzM4MGY4ZjQ3NDJjMTFkZDZmNTkxMmQ3MjM1NzYyNGI1MmEzNGRhYmE4MDhhODA5M2RiNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEJvdW5kZWRWYXJpYW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTA2NjE4OTUzNGFjZDJhMTI3ZDY2MTI5ZDQ1MTc5YzFhZmFjYTBlNDIxZDQ3MGE3NDIwNTlhZjQ3NzRiNjc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRDYWxjdWxhdGlvblNjaGVkdWxlRGVsaXZlcnlQZXJpb2RzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjczOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzNDgxMWVkMWM2MTQ5NWIxM2Q1MTdiMjA1NDAxZDljMTAwMzRlMDk1OTI3MTM1OWI1ZTk0Nzg0ZTJkNGFmYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldENhc2hmbG93UmVwcmVzZW50YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGMwNWQ0ZjUyNWViYmE3YzJhNmFkYWJlMTRmMjBlZDVlOTA1ZTI0MTk0ZjM1ZGU4MzQzNDgwMjMzYTg3YTY4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Q29tbW9kaXR5UGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM4YzkzMDQzMTg3YjA4M2JkNjQ2YzRkODBmMmU4MjdkNjAzMzFkMTM3YjM2M2Y3MDE3MDVhNDJmZjc5MjgyMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldENvbXBvdW5kaW5nTWV0aG9kRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMDVlNjI0OWU2ZWI4ZTQxMTU1Y2FiZTliNTgzZGJjNTI1MDZmNzhkZTRhZTcyMjI2MTQ2YmZhMTdlMmQyYTlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRDb3JyZWxhdGlvblJldHVyblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEzNzY1ZDA3YTEyZTVkODU4ZTQ2YjBhZTRlNTY3M2ZhMDAzNmM0MmI4NTAyNzk2MDliNmMyNWZiMmIzNGY2Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldENyZWRpdERlZmF1bHRQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTU2OGY4OTJhZWMwMzdlYTUyMTQwMGNmNDQyNjRmY2NlNzFiZTczYzFkNDdhZjFkZTJjYWNiMTNjOTA1YTExMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Q3JlZGl0U2VuaW9yaXR5RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTc1YTUyOWQxYmE1ZTJjNzA0NTAxMWY1MDExYjJlNWMzODExNzVhMzYxOTA2NTM5MGFlOTlhNTEyOTcyYWY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREYXlEaXN0cmlidXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5MzYxNmQ2NjE4NzBiNDUyN2ExYzAyMWY0NTcwYWUxNjM0OTU4NDE4NWYxM2JlMjlhMGI0OWRkZDZmZDczY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpc2NvdW50aW5nTWV0aG9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0M2Q1NmMyZTU3NTZjNTVmYTNhYzcxZTMwODY5Y2UzYmIwOGExY2VlNjVmNDY0MzM5ZmRhZDVhNzNkNGY0ODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpc2NvdW50aW5nVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGExMjgxMjEwMWZhN2Y5YzdiZTkxZjNmZGM2MWEyOGU2OWViYmQ2ZTFhMTkwM2ZlODA5YmI2MTAwMTc0OWQ2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGl2aWRlbmRBbW91bnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MzI4ZmY5MGU0YmNkZTVhOTAyNTJkYTlhYzE2ZjgwMWY0MmI3MGVkOGMyNWVhZjRlYjAzNTRhMjM0OWY0MDFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZENvbXBvc2l0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTU1NTc3MmJlMDcwMWQ0NmRiNGNmODlmZTkwNzE5Y2Q3MGQ3ODY3YWVjMDFhZDE3MzE5YjA5MzE1MGE5NzY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZEN1cnJlbmN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlNDg3ZTk1ZTI1YTNmYjY5ZTBmZjQ1NzcxOTU0MGM4MmZjOThjMjVjMWJhMmY0Y2IwYmRhNTIzNTkzZDE2MzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kRGF0ZVJlZmVyZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Nzc5NjI5NjQ4MjU0ZmRhY2VhMzFhN2U3MTU2NjUwNzNiNGMxYzY1NmVhYzJjZjc3ZjdmMDk2NmZjZTc4YWYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZERhdGVSZWZlcmVuY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkNWNmZDVjYjNjNWE3NGNmZTY0YWQzMDBjNzY1NTI0OTk0NDdhNGY4OTllM2ZhODUwN2E1NDIyZjhmZDZmNzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kRW50aXRsZW1lbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiMDkzMThmODg5NzJiYTYzY2U0NGY5YTYzOTc3ODhhNTgwZGE1MDQxMGI5NDQ5ZTUzYzNjM2UwNmZmYmRmNDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldERpdmlkZW5kUGF5bWVudERhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTBmMmQ2NGJmZTNkMzczMDViYzA2Y2Y4ZWZmODUwYmI1OTY1YjdlYjgyNDBjMDc1M2RkMzBlMjc1ZDE2MGUyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGl2aWRlbmRQYXlvdXRSYXRpby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MGQ3MDg4ZGZlM2U1YjYyMDMyNzY0ZWM5MDhiMWIyZTVkOGNjMWU0Zjg5OGVjYjlhNGRmNTU4NTA5ZDdjYzE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZFBlcmlvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDJlMjAxMzRhZDZhMDA5NzZkOTA0NTUzYTdiNjhhMTQxODdmMzg4ODA5NWY2MTg1ODRiOTMzOWQ3N2MzZmM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXREaXZpZGVuZFBlcmlvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA3MzA2NzM2MTBkMmQwNGE4NWE0NDgzZmNkYjUwYmRjODg4MTg0ZjhiMjYwZjA2OGJlODQwMzQ3M2U3Njg1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RGl2aWRlbmRSZXR1cm5UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODBkZWUzYmQxNzExMWU3MjdlNTkyMjlmZGVlYmViNzAyOTg2MzljNmJlOGFkMjI1ZmI5NmRkMDQ4YzExMjczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRFcXVpdHlVbmRlcmxpZXJQcm92aXNpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhNmE0OWIxMGI5ODA3ZDlkZTRiOWNkZGQ1N2JjODFlN2RkOTllNDczYThiNmFjOTM0MTMxZjFmODg2MDc4YTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZQVkZpbmFsUHJpY2VFbGVjdGlvbkZhbGxiYWNrRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWY2NWI2YWM1NzgwYzFmMzFhNmYyNWExMjliNDQ4NGI4MThjZWFmMTI1Nzc2Mzk0MzZkMTAxZmQ0NjI3OGYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGaWVsZFdpdGhNZXRhSW5kZXhBbm5leFNvdXJjZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTY2YjEyZGRmYmQ4NzNiZGQ2NTE4MDE1Njc3NmYyMGM2MDM0YzU0MjNjZDdmMzNlMGU2ZDc4ZDI3NzI2NTlmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmllbGRXaXRoTWV0YVNldHRsZWRFbnRpdHlNYXRyaXhTb3VyY2VFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjZTVmMDcyMTk0NmNkOGE1YTQ3NjQxNjc5MTQ5OTBhN2M3ODk3MmQzYmVhODA2ZmU2ZTdjOGVkMzEzMzkzM2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZpZWxkV2l0aE1ldGFTcHJlYWRTY2hlZHVsZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyOTAyZTBjYTNjMjc5MGJlNjU3MDE4Yjg2ODRmOTA5NGRjMWJjOWJjMWYwNzBlOGVhYTE4YmFkNTc5ZjJmNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZpbmFsUHJpbmNpcGFsRXhjaGFuZ2VDYWxjdWxhdGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmM5YmUwZDFkYWNmN2IxZGVhYjZiMDY5M2ViMjYwMzg1MDgxZGM2YWMwYzhkZWJkNjNmNGNjYTM2MzBkOWU1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Rml4ZWRBbW91bnRDYWxjdWxhdGlvbkRldGFpbHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTAzMjA1ZThmZGVjYTA5NzlhZDljODMzOGE4ZjdiZDAxMGNjZDZjYzdiNjNmMWUyOTQ3YWVkMjQ0ZDdjYWU2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Rml4ZWRSYXRlU3BlY2lmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYjgzMjhiMTUyNDU5YmJmNTVhYWFiNmE1OWY4MzlkMGJlNWUzNjYxNjM2OWU1MjRjZDVmN2QyNTM2MWU2ZGU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGbG9hdGluZ0Ftb3VudEV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNGI4Mjk0YTYzZjUwZjhmNGZmOWYyZDdmNjFhZjAzZjA1MWE4Y2U0ZjBhNjhkZDJlZTI5YzdlNTNjNGIxN2Y3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGbG9hdGluZ0Ftb3VudFByb3Zpc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWY5YmY1ZGY2YTRmZjc4NWYxYzk1ZmMwMTdjYmJhMDA2YTEwZjIwNDI1M2MxZDgzMzI2OTMwNzFlOTg4MzYwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdSYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNlNmM0MTc3MjlhOTE3MTM1ZjU2N2I4ZTg4MTczMDFjMTczY2QwYzdlMWE0YTVjMzk0YzM5ZDY4MDg0ZDIwNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5nUmF0ZUJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmViMzgzN2UyZmQwODEwM2VjNzI0MzNiYmY0M2M5Y2Y4YWQ3YzNiZmY4MzE1Yjg4Yjc3MTdhMWNkY2ExZWE2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0RmxvYXRpbmdSYXRlRGVmaW5pdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMGNkMGYxOWQ3Y2Q4OThjYTk4Njg5YjI5ZmFiODg5ZTcwYjg3ZWU5OTllNmNjNDY1NzczY2Q4Njk5ZTA5ZWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGbG9hdGluZ1JhdGVTcGVjaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxYWJkOTNiNjExMjBlMzc2YzE4ZGM2MzQzNDVlMzdlZjdjZmMyMWNjMmJiMWRkNTllOWE5Zjg1YjAwZjNlNDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5ncmF0ZUZsb2F0aW5nQW1vdW50Q2FsY3VsYXRpb25EZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzYWFmYTMxMmNjNmYzZmMyM2MyOGU4NzcyYWMxYmRlMTc4YTY4OGU2MmE2ZDkwZDVhNGVjMjdkMjk0NWVkNGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZUluZGV4UHJvY2Vzc2luZ1R5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyZmRkYjEyNDE3NTZiMWRjM2E0NTcxM2Q3ZmUxZWUxYjZmOTg1Yzk3NGRlMmU3ZTE0Y2I5ZTM2MDM3OWM2ZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZVByb2Nlc3NpbmdEZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwYjZhYzY2M2U5NDNiYTlhY2Q3YmQ1NTMxMGYwNTNhN2EyMTUzMGFlMWJmNDRkZjU4MWJkZTE4YTQxYmFhM2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZVByb2Nlc3NpbmdQYXJhbWV0ZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2NTE3M2RjMjg0MDE1MTA0MDViOGY5NTMxNDk3ZWM3NDYwMzExMGNkMzBmOGQ1ZmM0NDZlN2UwMzQ2M2U0NDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZVNldHRpbmdEZXRhaWxzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRjNzIyOTUxMWY3Njc3NGE0OWJkYjdlMjdjZDBjODU5YWJjNTMwYzJkYzg0MzU3M2U0OTBlODZlMjJhZTk2OTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEZvcmVpZ25FeGNoYW5nZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDI0OWQ5MDQ0MTVhNjI5OTkzNTliN2MxYzdkNTI2ZGJkN2Y5N2M5OGNlNDYwM2E0ZjQ4NTJjYWQyOWQ1NjQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRGdXR1cmVWYWx1ZUFtb3VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjhlMmMxYzA0NDU4OGIwMDNkMGIxOGVlODE4MjUwYmQ2NmM1NjJmMGY2NjM3MzA4MDI1N2NhNWY2MDdmNTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRHZW5lcmFsVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmFjMTU2NzY0YTljNWFlNGIyMjEwNzNkOTIyZmRmNDNiYzI0YTAxNTc3ZjQ3MGJlMGUzNmM5NjVkYjViYjIxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0SW5kZXhBbm5leFNvdXJjZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjZmOGVlMzFhNGRjZjg3M2M0OGM3MGNiOGZiM2MzODQ2M2I3NzQ1NzIzZmFlODFhNGM1YTJkMDBkYzVhNzkxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0SW5mbGF0aW9uUmF0ZVNwZWNpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ1YjUyMzkyMDQ1ZDY2NWMyNmM4Y2ZhMTUzMjAyZWFmNzY4Njk0Mjk3MWEyYjJkNGU1NzdhMmFlYzY5MGMwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0SW50ZXJlc3RSYXRlUGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzkxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmMzczNGZkYmZlOTVlZmQwNjg2ZWY0NmM3OGNiMjJkN2E3OTI0NjI3ODg2MTA4N2E0MjdjNmI0YmY0NDNkM2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEludGVyZXN0U2hvcnRGYWxsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiMDk4YjBjMjRmNDhlNTI0Y2EwMDAyMDFjZjYxM2EyYzRjOWY4ZjI1NWU4Y2I3MDQ1OTRhNmU1MTk5YTMyZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldEludGVyZXN0U2hvcnRmYWxsQ2FwRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjM3Y2MwZWZkOGUxODA5MTUyNjU0MDE4MTMxNGZiMTg5OWUwMGM2YmIwMTcxNjU0ZjgzOGI3NDFlNTYzZDk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRMb2FkVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI2YWUxOTdkYjU5NzNmNTNiMjk3MjMyNjI3MDM4NjYxNmVmNzJjNTkwYmQ4MzVjMGUwNWRlZDg0OTYxNWQ4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhRml4ZWRSYXRlU3BlY2lmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MzM1NzI3ODRlODM4YTU3ZDIwZjQ2Y2NkYTBkNTlkYzBlNjM5ZDFmZWJhYmI0MTMwMzdkNzUzZjM4OTc3NDRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFJbnRlcmVzdFJhdGVQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDExMmVjNzU0ZjA5OGQ1MDIwYTBiYWEyOTNkZWI5MjE3NWJmYTVlNzM5NDhhMGM2YzkxNWI5ZWE5NmUzZmM3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUHJvdGVjdGlvblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI1ZDFiNjFiMTViZWVjOWRkNTY5ODQ0MjhhMjRjZjgzNTk0Y2MzYzg3OGI2NmU5NDQ1YmQyYjJkZDRhMGYxYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldE5lZ2F0aXZlSW50ZXJlc3RSYXRlVHJlYXRtZW50RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTM3Yjk4NDFkMjQ4NmI0Y2NmNjYzMDdhZTJhYzUxNTI0NmFjZjAyYWM3NGVjNzY1MmFlZjU5ZTE0NmM5ODdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXROb25DYXNoRGl2aWRlbmRUcmVhdG1lbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3ODMyZGM3MTczMWRmNWRlYTVhMjdmNWZmZGE4YjJhOTNmNDk0ZjI4YTU2ZmY2ODM0YjdhMDA4ZDAyMGFjNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFByaWNlUmV0dXJuVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM2ZGJhMTU4NzA3YjAyODBiMGZhZjZiMDM0ZWM1OWJiNDcwMGE3MGUzYjhjNzY3MjZiMzkwOGQ2NzcwY2MxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UHJvdGVjdGlvblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY0NjM4YjJhYzJjNGE4YmI2MGVhMTEyNmVmYjYzNTE0ZTJhNGY0OTJhOTg0MDBhYTMzYWFkZmEzMmI1MWE0ZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJhdGVTcGVjaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyYTEyMjM2NjE4ZjA3ZDU0MmEwOWExNWY1MGUxMDk1MDgwYzg2NjViMWYzZDllMTAyODIxNDZkMmUwN2NhMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJhdGVUcmVhdG1lbnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjYWE0ZWY3ZjdiNjgyN2JjZWZlZmYyOWMzYjMxZmJlNThiMzRmNjE1ODNkOWIzYjcyNTQ1ODVjNDQ4ODIwNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJlYWxpc2VkVmFyaWFuY2VNZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwMGIzNmNiMGMwYjBlYzA1NDE2ZWUzYTg3MGZjMGRiYTg4YzJmMWM5MGNmNzg1NWM4NGI3YzNmNzY1YTI0MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJlZmVyZW5jZUluZm9ybWF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzNWIxNTRkMzkwYTc2YTlhNjliNzFhZTA4MGVlNTA0NzBjY2YyNmUxN2U1MWQ5OTYyNTdjM2VjODllMzUxNjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJlZmVyZW5jZU9ibGlnYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWU1Mzc1NmEwZWIxNTJiNGU4MjRmOThlMTQ4YTIwNTQ0NDMzZGU2MjE1Y2FiMzEwOWZhMjA3NDFhMDRmOGNkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0UmVmZXJlbmNlUGFpci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2ZjODY1OTc0YzRlMzM2YWZlNWQ0YTg0NDg4MDVjYjllZTAzNDdhODUyY2RjZDc4NGQ0MGQ4OTgxODY2Y2YxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRSZWZlcmVuY2VQb29sLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3NDYzOGIyZDY2ZmRhNjU3YTcxMmRiZjU3YmZiODQ4ODgzYzc2Njc3ZjI1YTEwOGMxMGRlMWI1YzQzNjRlNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJlZmVyZW5jZVBvb2xJdGVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlNGFiNGQzNzdlNzM3Y2UzNDM3M2FiYTIxMGFkZGJhNzJhNmI2MDNhZDNmZWIyYmNjMjc4NDg5N2I0NmIzYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFJldHVyblRlcm1zQmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzU1MGYyMjJiZTM1MTY0ODU0ZmJmOGUyYzNhZWM3Mjc3ZjM3MmY4YWU1NWI1YmVhMDRiZTVlMWExN2EwMDA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRSZXR1cm5UeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMzA4MjAxZTNhODVjMTZkZGNiNDFlNjMyMTY4OWQ5YzIwNzRiYTAzZjQ0ZDVjNzBiY2EzZDIwYTU0YzhmOWI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRSb2xsU291cmNlQ2FsZW5kYXJFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0ZTY5ZWQ2ODZmYTMzNWFjNTNlMWViYmEzMDA3MzBmMTczMzAwYzI3NjAzMzM1YjM1ZDMzNjhjMGY3ZGFjN2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFNldHRsZWRFbnRpdHlNYXRyaXguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzgxMTVmNzE3YTUzMGIwZGJjOWUxYTFhZjc3OTg1MWU2ZjM0YzVmZDgxMjEzZWE2YWU3M2VjZjRjMTZlZTg2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0U2V0dGxlZEVudGl0eU1hdHJpeFNvdXJjZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJmZjU3ZTg0ZTBkYjIwNTFkYzVkYzgzNGFiYTIwOGNkMWI2MjcyZWU3NDQ4YjRhYzA4YzI5NTFjZGM3NzM0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0U3ByZWFkQ2FsY3VsYXRpb25NZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyZjI2NTllYThjYmY1MDViZmU4ZDc1ODZiNDJkOGU5N2IzOWNjODE5M2Q1MzI0MGJjZjI4N2EwMjk0YjdiNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFNwcmVhZFNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5NzdiMzAyNWJhMzI3MTAxMzhjMjAzNzQ2ZTBjOGE3NzEwNjNkYjliNTJjMDc0MzA1ZjQ2NmJlZjZiMmMyNWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFNwcmVhZFNjaGVkdWxlVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ0ODRlNzdiMTY1ZjNkOGUxM2M0NDBkYWJlZDEwM2E5ZWY2NTExMGIzYTkxMDYwZTU0ZGM3MDFhYjlhM2RiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0U3R1YkZsb2F0aW5nUmF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMjRhNmU0NTNhZTUwMDY3YTAwMzA4NTBhMDYwNmI5NjM0MzdmM2U5Mjc4NzIxNTQxYWZhYzE3NmQyOGJlYzk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRTdHViVmFsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQyNTUwNGQwYWJlYThkYjIzNWU0YjEzNzc0ZTZlNmI4NGUxM2NkOTFhNTNkNTkyMmU4MmVhNTEzNjI1MTZhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0VHJhbmNoZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2MxOTJlOGM4ZTUyNWRjNjhmZTYxYjAxOGJlNWJlYWNiODFlOGZiMzYzNjBiNmMyYTg0ZTI0NzJiOGVmMDRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRWYWx1YXRpb25UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMmUwMTJhYWY2MWQzODdlZmZhZjZlMTgyMDRlZmE0ZTk4NzdjNTYxYWRkMzEyZjRhNDY4MmRmZmVkYzhlYWU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0QXNzZXRWYXJpYW5jZUNhcEZsb29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4YTc2ODA3ZmNiYTFhMjJhMzY4ZGM5MzY1NTMyNzQ3Zjg4MGEwMjJlMzY5NjkxZDAxNzcxYmNmNDFjNDQ2ZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFZhcmlhbmNlUmV0dXJuVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQxYjg1MDEwNWU3YzI5NjM5OTY0MWZmOWRmYjNiY2QwNTJmNzU0Y2QxOTk3MDZhYTcyODU3NTI5NTMyMDk5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdEFzc2V0Vm9sYXRpbGl0eUNhcEZsb29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3YzNmMmViZDk1NjE3MmQ5OWQ2NzEwOWI0MmU0YmNlMTBjOGJlYjYxMjg3MWQ5ZTI1NjNjMDgzZTRjNTZmZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RBc3NldFZvbGF0aWxpdHlSZXR1cm5UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzkyNjY5M2MyODU2NDBkYzAwYzU4ZGNjZmZjNDU4ZWE4NzEyNDZmMWVjMmM5ZTBiNGU3YWU0YjVjMDdlNDEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEFnZW5jeVJhdGluZ0NyaXRlcmlhLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjNzdiZjFhMjliNGExOTc2NzZlMzRkMDk5NDMwZGFjNTY1YjVlYTVhNjM3ODlhYTFjODU2MzVlY2YwNmFhZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQWxsQ3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRmMTAxNjkxZTAwMjQ1YjdhMGFmNTYxMTQwMGE5ZjVjODQ4YjNjMDZmZGIyNWYwZTg2M2IzZTU2OTkyNDc4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxBbHRlcm5hdGl2ZVRvSW50ZXJlc3RBbW91bnRFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3NTM5N2Q2YmZjOWZhN2NjMmVlOTMxY2ZjMzI4MjVlZWQyOTdiY2FiNDJhOTJhMjkyNDAyNTlmNmE1N2VlOTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQW55Q3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDdiN2I4ZjU2NWJkNDk4YmExM2U0NTA3NWE1NjgyNTQxOWJjODNkOGM2YmU5MzFiYTg0MzZkNzhiZDRkZTVkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxBc3NldEFnZW5jeVJhdGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTkxNDdhNjA4NGY5Y2E3ZmUwZjlkNzhkMmE5MjQ0MTNjOWE4YjRjNmQ5NDI1ZDlhMjE0OTJkYmIxY2QyZWQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEFzc2V0Q291bnRyeU9mT3JpZ2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzMzQ2NGY0ZDdiNGFlOTQ5OTk2MzNmYWI0Y2U0MzZmYzJhZDRhNDY1ZmI5ZjVkMDM4OTFkZjJhMzIzMDEwMTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQXNzZXRNYXR1cml0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTkyYjA2YjUwOTRiMDZhNjFhNDc5NTJlMzQ0MGUzZDZlNDA0ZDczMDgyNDdiYzk0MWZhOTRlNWYzMjZjMmNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEF2ZXJhZ2VUcmFkaW5nVm9sdW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ZjVjMDAxMDg4YzdlY2ViYTczZjc3ODc0NWRlMWMyMWJmZGI1Y2E2MDI4YWQzODA3YWNmOGE4OWQ5MjlmYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQXZlcmFnZVRyYWRpbmdWb2x1bWVNZXRob2RvbG9neUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzE0OTU5MTJkY2JmZmVmYjA1Y2EyMTNjYWYwZGQ1OTk1NzU4ZWVhYmQxZmJmMmQ2Mzc1NmVmYTczYzUzODVlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDaGVja0VsaWdpYmlsaXR5UmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzOWY5ZWFkMjhlMGQ0NGVkYTM4YmViMjNhMWFjOWU4NmI1Nzg3M2NlODY1NzRmNmRjOTg1MjVmY2Y1NzAzNDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmQ3ODM2ODExZjVhZWUxNzNmOWM4YTQ3ZDJjZGM0YzU4NzA1ZTYxOTI0YzdmNDFmZTVjMGFmZDQxNGQwYWVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxBZ3JlZW1lbnRGbG9hdGluZ1JhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTIwNTQ0NzZkMjEzYjYzNDZjYTgwMzNkNzNlZjU3MzgxYmIxMDRjYmQyMzYxNGVkYzgzNTA0ZTU0ZWRmOTY1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsQ3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDY1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxMmUzYTNkYWI0ZTA4ODVlNzM0OWJlM2Y0NzgzNDA4MDQwODJkZmZiYmU1Y2UwYWM4ZDI5YTg5ZGZkNTkxM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29sbGF0ZXJhbENyaXRlcmlhQmFzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOWRjMDU4YTc5NWExZDhjMWJjOTY5ODNiYjNlNzczZDY1MTVhYjdjNmFkYWU0ZWRiNGFlNTc2ZWM4NDZjMjk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdENhbGN1bGF0aW9uUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmN2JjNmJlZjA0MmU2OTcxYjJmOGY1MzU3ODNiZjdiZTJhM2ZiMWVlMjI2MmE3MDZiYTJiNTFhZDA3MDJkNDY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdEhhbmRsaW5nRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjYwN2IzZTYzOTY5MzZhODlkMWU3ZDUwY2Y0YTY1MTliMzllOTZlYmQ3NTYxMzhkOWFhM2JmY2I0M2NhYjY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdEhhbmRsaW5nUGFyYW1ldGVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiN2I4ZWMwNmI5ZTk3YzcxZGQ2OTRkMmM0ZWIxZmJiYTllYmQ0MmU1OTNmMzZmZDMzNDNmNDEyNzdiMTEyZWY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdE5vdGlmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzExZDI5YTRkN2Q0OWFlNThjNmQ0YTEwYjAyZWQ1N2NlNDI2YjAwNTIwZmUxOGI0ZDg5Yjk0NWFhYWM3NDEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdFBhcmFtZXRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmY1ZDU4NTBkMTdjZjYxOWEzMjg3OWEyYWI5ODNmYTI5YjBhNGE5NGYwODgzM2Y0MTgzZGViODljNjFhNGY0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsTWFyZ2luVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzEwYjQ4NWNkNGRhMjBmMGU3N2U2MmU1NWU3MDZkYWRjZjVlZDRlN2I1ZWFkZjQ3ZjZiZmM0ZTBlNjQ4YjFmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsUHJvdmlzaW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDZmM2MyODVmZjBjYjBiZjA1Y2RkYWZlMTg3ZWU1MTg2Y2I5NzhiNzEyZTIwMDA4ZGU2NDU2YWUyZmZjMGEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbGxhdGVyYWxUcmVhdG1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDI2YmI1NWZlMGJiYjk4OGQ5YzRmNjI3NzQ2YWY2NzAwM2RlZTk0ZWU1Y2RhZDUxMzI4ZDM5MDcyOWJmZmZjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTdhN2EyZDAxMTBkZTI3ZmE2ZjliYWNhZGJiZWMzMDI3ZTU5NDBiODgyMGZlMDE3MmQ5NTQ5ZGMwYzY5ZTBiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb2xsYXRlcmFsVmFsdWF0aW9uVHJlYXRtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNTBiN2FiMzlkYTJhNzU3ZjY3YmI5MDhmMzMzNDg4MjEzYTBiODNhYmNiMzVlZWFkYjcwNTkwMThhM2FhYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29uY2VudHJhdGlvbkxpbWl0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI4Yzc2ZjRmOGM1YzJkNmY0NzA5OWYwYmU4N2Q2YzkwZjQ5ODc1ZDM5NmFjOTRiOGNiYzZiOGY0YTZjZjIxOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ29uY2VudHJhdGlvbkxpbWl0Q3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzM3YzZhYTVhMjA1ZjllODE2MTZhYTkzNGVkM2UwMjAyMDI1NDk1ZTdiNWViNGJmNTQxZjc0MjcyNjk0NzFhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxDb25jZW50cmF0aW9uTGltaXRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjQyMjAxMjQxYzFhYTZmZTE4MmMzZTY1ZDI0YTkwM2I4YjdjYzY3MGI1M2E3YTE2YmRhNmI0NWU3NmI2YmNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvbnRhY3RFbGVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2MwYjUyN2Q0OTAzNjBmNDRiYmM0MjBkYWQ1YzJmZmJlZWUxNzc3Y2Y3YjhjNzQ2YTBiZTA0N2I0M2ZjNTU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbENvdW50ZXJwYXJ0eU93bklzc3VlUGVybWl0dGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzMjAxMjhhYjc5N2Y3ZDkxNmI5NzY1ZmQ2MGNjODFjOTFlNTcwMDg0NTliOTMxNzJlMzU0NDU1ZjhlNzU0MTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsQ3JlZGl0U3VwcG9ydEFncmVlbWVudFR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5OGQ5YzUyMmNlNjlhNDE5ODBmYTVmYTVmNDk2MmM5NWQwNTExNzcxZjhmYzI2MWQ5MmU1OGNkMGE2ODQxYTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsRGVsaXZlcnlBbW91bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY1MGQ4ZDUyOWI3MGY3ODFmOWQxOTNhNzY5ZDcwZTEwOGFiYzFkMzE5ZTE5ZTI1MGJkZTMwY2YxN2I3MTcxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxEZWxpdmVyeUFtb3VudEVsZWN0aW9uRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjRkMDQwY2NlMDFhYmM1Y2M2NjdkYmQ2NjkyZTVjNTQzZDgzZTJmZGNjZDE1ZjI5YzQ1NTcwYzQyMTUwMmYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbERpc3RyaWJ1dGlvbkFuZEludGVyZXN0UGF5bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMmI4MWFhNWU3ZmJiZWE2ZDcxZWYyZTQ1NjJiNmIxZTQ4ZGJlOWM5ZWY4OGMxYjViZTM5YmI1MmMzMjQzN2U2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbERvbWVzdGljQ3VycmVuY3lJc3N1ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ2NmNkYTA3NmNiNDFiMjIxZTc0MmYwNTllNGZjMWVjNmE1MjFjODkzOWJiZDljZmQyMGIxNzkwOTkxNjFlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxFbGlnaWJpbGl0eVF1ZXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyNDliZDllYjk4OWRkNmM3Njc5ZTM5ZWY0ZTFmY2VmZDBiMGI4ZjU0MTg1ZjEwNmQ2NDdmNWE5N2NlNGNkOGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsRWxpZ2libGVDb2xsYXRlcmFsQ3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjRmY2YxMWMzNTg5YWVhMWQ0MjJkMjBlOTg5YjFhNGQ3OWM1MGZhOTJkZGE4ZGQxYTE1YTRmZWRlYmZlMDE1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxFbGlnaWJsZUNvbGxhdGVyYWxTcGVjaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImIxMzgwNmVjYjZhYjEzNDNlNzgyMGQ3MDA1ZDU1MzllYjAzOTI1MjE2MjViMGIwZWI1MzYyNDVjMmYxMjgzZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsRWxpZ2libGVDb2xsYXRlcmFsU3BlY2lmaWNhdGlvbkluc3RydWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImUxZjk2NzZhMzYwNDBlNWE4MGNmMzlhZmU2YmZlZDJmNDc1MjI3YTM3MDViNzM3MjQyYWVkNjJhOGMyN2I0N2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsRmllbGRXaXRoTWV0YUNyZWRpdFN1cHBvcnRBZ3JlZW1lbnRUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTU1MjkzOTg2MDlhZmNmYjcyMTdkNjY0OTAxMzUzYzg0YzFmNjM0ZGQ0NDc2Y2ZiMjI5NGQ0ZWJmNjE5OWUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbEluZGVwZW5kZW50QW1vdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3MGFiMTJhNmMzMzk1MzdlMmIzYmI3OTNiYTc1ZjljNTc1ZWIzM2VkZTYzNzdiNTI0NDY0NDRjMzUxZGFjZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsSW50ZXJlc3RBbW91bnRBcHBsaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MWI5NzlkNzMwZjE0NDdiMTNjZGRiNjk0ZWI4ZWY5ZGJmZjQzOTk4YWZhMDZiNGE4Yjg5NWE1YjdkOTQwYzk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbElzc3VlckFnZW5jeVJhdGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMGNkMWE3YWMxNjg4MGI3YjdlMzZkMDE5YmQ0NDcwNjE5MjQzYjdmODNjMjM5NTI2NDMwYmI0MDU2YjkxYWUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbElzc3VlckNvdW50cnlPZk9yaWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMDE1MGJlNDBkNTQ2NzQ5ZTg4NTgwMDYzYmYxM2ZkYjY2MzljYzMxYTc0ODJiYTk1YjkxYWQxOTc4MjU4OGYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbElzc3Vlck5hbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJjNmI5MWMyODNhZGMzNmRmMDM5OTMyMzdlMmZhOWEwMTM5MGQxYzY5N2Q2MjliMWM5YzVjMzViMjhiNzRmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxMaXN0aW5nRXhjaGFuZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWNiOThjN2E4ODBiODk3YzFmNmYzYmY4MzUxMWQ4ZDEwYWY3NGNlYzk4MGRlYjE2NGI3YWUyZmI1ZmFmYmZlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxMaXN0aW5nU2VjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4YTk1YWEyNTU1ZDM5OWMzOGUzM2QzZjQ2ZTdmNzFiMTg2NmVjNTIwMzliNDg5Y2RiNTY1MGQ5ZmY3ZTVlZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ29sbGF0ZXJhbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmY3MzMwM2QzNTRlNDUwYjg4OTI5YzE2NWE2ZGI0YzAwZjEwOTkzYTVkZDAwYTlmOGM4NGNkNTkxMWM5N2E3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbE5lZ2F0aXZlQ3JpdGVyaWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFhYTNiODVjYTQxZDYxNDkwNjY2ODAwOTFjNjE1NzUwY2NmNWI5NjhkYWFkY2Y4NjA0M2FiMTc4OThiMDZjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbGxhdGVyYWxSYXRpbmdQcmlvcml0eVJlc29sdXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyZWFkYzUyZGJhZmM2ZDE0MTc5MGQyNjVhZDkwZDRkYzJhMDExZDUyODNkOTU2Y2Q0MzI5MmE1MzkwYjk5MmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsUmV0dXJuQW1vdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiZTNhN2M3MDI5MDg1OTU2OWZjZjliMTQwYTI2Y2JhNzFiNmU2YTJlODMzOWIwNzUxN2U0NThkYWNjNTgxZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsU292ZXJlaWduQWdlbmN5UmF0aW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkMGQ5M2IxODM3MGRmYWUzYTYxYmFkYWNkMzMwMTBhNmEwYWIyMjI2MmQ0YWIwYzg0M2UxYjBkZjYwMDI3NjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb2xsYXRlcmFsU3BlY2lmaWNBc3NldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MWRmNjVhMGU5MmRlZGVmMzI1ZDE5NjllMzY2NDUxMzZiNWQ1ODg4N2YyZDI5YmE1NWExODkzYmU4OWM1NzI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29sbGF0ZXJhbFN1YnN0aXR1dGlvblByb3Zpc2lvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODYyZjBkNzczMzMzNDFmODA1ZTE2Mzk1ZDJiYjY4YTNiYWI2Nzc0MTgyOTkwZTY4MDAzNGY5ODliZmRjYmU3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vbk5vdGlvbmFsQWRqdXN0bWVudEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjFmNjg5ZDNmMmJmMGE1ZWIzZmNkN2MwNzE4ODA3MmQ3N2U1MjZiMDYyY2FjZTg4NGYxMTJiNmM5YTlmMWQyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlQW1vdW50U2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzgxZjljODhiY2NjY2Q1NmIyYWZhYzFkNWIxODExOGYzYjJkMjliYjJmMDRlNTg5MTgzNmUyYjJiODIxMTQ2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlQXZlcmFnaW5nT2JzZXJ2YXRpb25MaXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJlYjM2MGFlNDMyY2M1OTAxYjg1MTUwODcxZmViM2I3OTE3YWViNzI1ZTllNmZiMDA3MGZiNDViNTM4ZDJmNzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUF2ZXJhZ2luZ1BlcmlvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjE2MjYxMTE1MjQyNGM0ODFhNjJhMWJkNmQ3NDYwMjg0ZWZiM2QxYzJkMWUzYmViY2YzOTQzMTAxMTY2OTkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVDYWxjdWxhdGlvblBlcmlvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODBhZTJiYThiMTE5ODI5OGUyN2FhNWQwZmExYjU3ZTZiOWI1MzMwZTdiZTM0MDA0Mjk0NThhN2Q5OTUyMjJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVDYWxjdWxhdGlvblBlcmlvZEJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDEwZDdjOWZjOTM4ZDU1OWZiODdhNWI2Yjc1ODkxNjMyNzdlZTg2OTE1MjE3MmY1ZDAzMWVhOTk0NWMxNDcwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlQ2FsY3VsYXRpb25QZXJpb2REYXRhLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5M2U0MzhmZWMzODIyNzU0MjFlZjJiMWI0MTI2ZmFhYWY2NjA5NjkxODQ3M2M3MWIzZTYxMmZkNTIyNDQ2YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmZjNGVmNDJjMjdjOTE0NWY1YTgzMmY3NGUzODAzZTZmMThkZDdmZWNiMDI0OWYxMTM2NzJiM2FhYzc3Nzc4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlRGF0ZVJlbGF0aXZlVG9DYWxjdWxhdGlvblBlcmlvZERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MzQ1MzI5YmMzYzYyZjcyM2QyOWZiNGQ2NmE3OTIwZGM1ZDc2MTQzNjQ0ZTY0ZmFiZGMyMjFiNjg2YTUyYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZURhdGVSZWxhdGl2ZVRvUGF5bWVudERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyYWI3MWI4Zjc5MGYwYmI4MmY0NjM3ZDRlMmYzMmNiMTQxMjFhMTE3MTg4YWE5NTY5ZGIzNTRiYWFlMGM1ZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZURhdGVSZWxhdGl2ZVRvVmFsdWF0aW9uRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDY5Y2Q0YTg3MGQxZTg2NjY1NzA0NGZiZDlmN2RlYmMxMDc2NjIxY2M5YWU5NWUwMDk1NzUxZmE1OWIwMWJmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlRmluYWxDYWxjdWxhdGlvblBlcmlvZERhdGVBZGp1c3RtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhkZGRkMzUyMWZlYWYxMzRlZGY1M2JjMjdiZjg3ZjdhM2JjOTM3N2UzYmMwYTYyOGY5YjVkODdhYTc3YWQzNzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUZ4TGlua2VkTm90aW9uYWxBbW91bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmRhOTMzNTJjZTNkNmFmZWVmODVlOGYyOTI4ZDIyOGY0ZWJjNDY5ZDA4NGFkYmI5N2NkNzI4MTJmMzAwNmQ2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlRnhMaW5rZWROb3Rpb25hbFNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyZDAzMDIxZTU3ODIwMWM2ZDJmZGNkMjMzMzBmZmY2ZWYzYzQ5NWM5Zjc1M2Y5OGU4MDFjZWRmMzU5NTFlZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUluaXRpYWxGaXhpbmdEYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlZjNjOGI5ZDNkYjNlM2I5ODk0NmUwYjJjODUyYzg5OGZmNjJlMDUxMTBhZjRkNzM5NjE5MDdmZDExNmM0ZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZUxhZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTY5NTMyZTAzNWI2MjVmYTBlNzE3MWUzZDNjOThjODYwZWI4NGUyMTRiMTRiOWNkNWFkMWNiODM1MjFkOGVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDYWxjdWxhdGlvblBlcmlvZERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljZjVkZDk2YmMzYjI0MzVjNGRkNmJiYjZmZTI1M2ZhZGU1ODNmMzM2OGYwM2Q3NDUwMmIyYWU5MmU3MTMwZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBheW1lbnREYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWJiODhlZjZkODUxNjhjYmVkZTYzMmVlNzk1MjdiNjE2ZTMxYWFlODJjNDJiMmE3NjY1ZTdkZjE4YTRhNzVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVPYnNlcnZhdGlvbkRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjYzZDAyZDJhZGYzNDUzYmYxYjI0ODNkMzA1MzRhZGNiMjAzMWYyNTgyMTM0YmYzNzdmYmVhY2Y4OWY3ZDMxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlT2JzZXJ2YXRpb25EYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDExZTMwODBmNTczOTVkNTZmOTc0NjliMDZhYWNiZmUwM2FhM2MyZjdmNjNhMjE2ZDQ5OWFmYmYzZTNkYWNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVPYnNlcnZhdGlvblNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhNDEyZGE2MDgyZWU4NDI5YzNmM2MzM2IzMzMyODc4MWM5OGQ5ZmZkMTIyMjExZjMyNDdjMTk3MTYyNDkzY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZU9ic2VydmF0aW9uVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzZjN2U0OWI5OWNjMmFhMDNkOGI1OGQ2NmFmNTNlYWNkNGYwZjVkYjlkNjM3MzllNWQ1NWIwNTE3NTk1MzY4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlUGFyYW1ldHJpY0RhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRmYjNhNTFkMTYzZjM0ZDM0OTE1YjBiZTliZDFlNDI3NTU4MTZjOTAyZjVhYWVkZDkxYWRlNjVhOWJkMTE3NjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVBheVJlbGF0aXZlVG9FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1YTM3ZGY4MGVkNTFkYzMwMTQ1NTZlNWJiMDkzNjBhNDZkYmY4Mjg4NGQwZDllOWQwOWQzYWE4NDYyYjY5ODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVBheW1lbnRDYWxjdWxhdGlvblBlcmlvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWZkMTg1MWUzZjMyY2UxODA4YTk0MzIwMDNmMjBlMWEzMjEzNTg1NWNiNGRiZmEyYTUzNTkxNWMzOTFkZTZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVQYXltZW50RGF0ZVNjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmMDY1MGYwNzYzNGMyYTY0ODlhZDE4YjJhOWE4ODNjNThlZGZhYzlhMTQ4ODkzMGQ3MWZlMzNmZWI3YzMyMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVBheW1lbnREYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Nzk0NWU1MjdiZThhOGQ1NTU1MzQ1YmEzNjAwMTU5Y2JjZGZhMmJkYTcxZGQzMGQ4ZTEyMjlkMzNkMmI3ZGM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVSYXRlU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE1MTg4ZTQxN2NkMTVjNTIyM2Q1NjY0YTc4MDg2ODRhN2I2ZDZhN2VmNzczZWRlMzA5YWJiMjAwMDUxNjYxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlUmVzZXREYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNmZkMTczOTdkMWM1YWIwNDkwNWQ5YjNjNDhkOWM0ZjE5OWY5ODE4N2RmODViODg5MTE0NWQ1ODZmOTU0MDNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVSZXNldEZyZXF1ZW5jeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OGVmZjFhOTIzMWFhZDQxZTY5MjJkODMzYjc1MTNiZDNhMTEwNDhiYWQ4NTEyMWRlYzk0Y2ZkYjBhMjAzMjQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVSZXNldFJlbGF0aXZlVG9FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwOTZkZGNiMjcwNDA1YzdlM2Q3Y2IxNWQxNmZmNGRlMzNlNzMxNGE1MmY1YjA1ODZkMGE1MDQ4ZTMwODdlM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVN0dWJDYWxjdWxhdGlvblBlcmlvZEFtb3VudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjRmYWQ1ZjI4Y2MzMjg3NzU3M2M5MzE0MTQ2ZDE0NWZkNzRiNzRmNTY0OGJmOWY5NGY4YTQ3NzhhZjAzNjBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVTdHViUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNmOGFlZDAzOWI1Y2VkMTMwZDQ3NDhjNjdlMjRlNWFjYjU2YmZkYzcxODQzZWE5YzE4NWYxYzE5YmMzN2E0OWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TY2hlZHVsZVN0dWJQZXJpb2RUeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOWQ2MzQ3YjBjYmI1Mzg1NGRjZTI0YTA5NTVlZjNlZjA5NWY4OGQ5ODBiYWM4YWFlOGJkMjBlNWUxZTBiMWI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2NoZWR1bGVXZWVrbHlSb2xsQ29udmVudGlvbkVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQ4MGE3YWNmODkwNDJjZDVhOThiMTNlYTcwZTUyZmFlNjYzOGJjMmJiYjk1ZjhkMjc0ZjE5YWNiMTdlMDIwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNjaGVkdWxlV2VpZ2h0ZWRBdmVyYWdpbmdPYnNlcnZhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZjY4NmMyYWViNzkxZjJjMTRlMGUxY2JiMTg3MTEyOTMyYTczMWRiNjE1MDk4NzAxZTEyZGRiNTYxYjE3ZDVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudEFzc2V0Rmxvd0Jhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk5OGI3ZGY0MDAzM2IwZWYzM2MyNzFjMTJmYTlkNjliYTFhOGYyOWRlM2EwYjA2NDc0MzBkMWJhNDUxMGYwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRDYXNoU2V0dGxlbWVudE1ldGhvZEVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGQ4MzM4OWI5MWM0ZGQ3YTk3YjQ2YmM3MzAyN2RiODBlMWE3NzJiZjNmMDRlY2ZjZGMzNzYwNTY4MmY2NTI4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRDYXNoU2V0dGxlbWVudFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExMmRhNDE5ODAwMDVlOGE5OTRiZTgyNDA3YWNiMGFiYWZhMzZkMWU1MzgwOTFhOTczM2U3ZWY4ZjEzNDQ1YjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50Q2FzaGZsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M4ODljNzFjYjIzNWRkMjEwNWU4ZTJlZmYwODI5OGNlNDIyYzBmNTVhOTcwOTRhNTQ5YzhkYzdhOTRmMDkzZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRDYXNoZmxvd1R5cGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODk2MjJmNDhiOTc1NDJiMmQxNWI1ZmVjZDZhYmRiMmFmZWQ0N2FhOThhYzhhMDEwM2YxMjg2OTEyY2EzYzcyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRDb21tb2RpdHlQcmljZVJldHVyblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5ZTRhNGI4MWJiOTQ2MDMzMjE4MTc4Njc4YmRkZTIyN2I4NmY0OWY3MDRkZWE3MjBmZGU4MTZmMmRiNzViYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50Q29tcHV0ZWRBbW91bnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDA2NzYwY2RmYTQ2ZmI3ODQwYWVlYTJjODdkYzE2OWIzYmNlOTc5YmVkN2NhN2JjOTQxZGI4YWFjNGYxMTU0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnREZWxpdmVyYWJsZU9ibGlnYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTI3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyODliMTE4ODJlYmQ0MzVhYWYwMzYzMDhlOTg1OTZmZmQxM2IwNmY3MDQ4NGM4YzRkOTIzMTljZTE2Njg3YTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50RGVsaXZlcnlNZXRob2RFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1MTllZjNmNDkxY2IxYmM3MWExODllMGE1NjMxMTZiODEwOTM0ZmZkZjFmYjkzYmYyNjVmMDJiYjc1MWRiODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50Rml4ZWRQcmljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2JlMWRiNWM2YWFkNzcwMzlkY2U3MmViYTQ4MDNjMzQzMmY4MDM0MmU2MmYyYzQxMzg3NGQ0YjAwMTY0NzE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudEZ4Rml4aW5nRGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODcwZDIxMmRmOTE1NzJlZjkzYmI4Y2IwZjJmNzAxMzBkYmFkNGE0NzFlMDkwYTY2YzE0ZTE0ZGZmNzU5NjY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudExvYW5QYXJ0aWNpcGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZhODJjZjdhOTJkMTY3NGNmNzljYWFlMzcxYWE5ZGJhN2U1NDRmZDUxNmRjMGRlNjhkODRlYTRjZTE1ZTU4YzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ2FzaFNldHRsZW1lbnRUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDQ3OWE1OGIyN2Q3ZDBhZTI4NTcxMWM4YmNjNGIzMjc3Y2FhMjZhNTg1MWQ0N2VmYzVkY2IyNmVmODYzMmNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudE1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBoeXNpY2FsU2V0dGxlbWVudFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzZWExY2IxMWIwZjhmZjIyYzMwMmMzNTRiNTEzMzEwYTMyOTg3Y2QyNThmNDk5MjFiZjRkOWM0ZTNlYmE2MTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50TWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUmVzb2x2YWJsZVByaWNlUXVhbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE5YjY4YzY4YzM1NjQxYzFiODZiYmY2ZDI5NTNhZTNmY2U2M2FiNzNiNmRkN2JiMmI2MzQzYzFkNWM5NGQ3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRQQ0RlbGl2ZXJhYmxlT2JsaWdhdGlvbkNoYXJhYy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDZiODgxZWI1MjlmZjk3OGU2NmZmMWZjNjVlYjcwMmQ1MjNjMmFmMmIxODg2YTgxNzJmM2MyYjUyM2ViODU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBheW1lbnREZXRhaWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTc3YmM1ODk1MThhM2Q1MTJhMGY5MDNhNzc2MzIyNDUyNzMxMDk3NDZhMWVkNTE0ZWY5NmRhOGViYWE2MTcyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRQYXltZW50RGlzY291bnRpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQyMWUwMGRhYjY1YmJmMzQ0NzdjOGU0MWFiNDc1NjM2NmZiMGE5MGQyMDBjYzA5ZWQzZWJhZWNlNzRkNWUxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRQYXltZW50UnVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMDNhNzk1YzZjMDJjMTg2NTE3MjU2YjQ1NTEwMzdhYzFlYzE1YTljNmNjNjg5Zjk2MTkzNjQwMTk5YTM5YjJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBheW91dEJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjExNTZjN2ZkYjFiY2M4ZWZmZDdiN2QyYmYyZjFiY2E5ZDE0YmU5OWU2NTYwMDZmZWEyODE4MmEwOTk5NDc2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRQZXJjZW50YWdlUnVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTg0Zjg5OWQzNzUyNzBkYjMyNDI5ZjY3NjMxZGU0YzIwZTYyMzhmM2IxNjcwNTMwNjA3N2UyNzQ4Mzg1ZDRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBoeXNpY2FsU2V0dGxlbWVudFBlcmlvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzZiMjcxZjJhYmE3ZDY3ZTEyOTEyZTE0NmU1NzU4YWY3OGQzMTVjZDkzOWNiM2RmYjQ0MmNlZmE2ZmY0MWI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFBoeXNpY2FsU2V0dGxlbWVudFRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiMjg0OTMzYmQ4NTg2ZGU1OTY0ZTEyODFmN2Q2MjliNWU3Yzc3NjJiYzhkZTM0NzEyYzA2ZmE2NGRmMzAzYzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UHJpY2luZ0RhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ZTU3NTIyM2UwZDg5Zjg1Y2UyNmVhZTEzNmVmZWM1M2VhOTNlZDY2ZDVlM2EwMTIxZWQzNDIwYTZmYzM2NDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UHJpbmNpcGFsUGF5bWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2Q0OWU3NDc4YWIxMWNhNWY5OWZmMzg3MGM0ZDBjZTBhZmQ3NzMzYjA5MDM2ZDFmOTQyOWZmN2Q1NDc0Nzc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFByaW5jaXBhbFBheW1lbnRTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTM0YTBhNDk2Nzk3N2ViZmQ4MjRkYjE3ODlmY2VlMjA4MWVmNzhmYWJkNjkyNzZlMTM0MmQ1NDFhZWJkZWRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFByaW5jaXBhbFBheW1lbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiOTZjOTZkNzgwZjBmZDMyODVhNmZhZTBmMzU3NDAxZmIzMWY5MmIwNGI3MjIzYjgzZjhlZDdkNWU5ZGFmMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UXVhbnRpdHlNdWx0aXBsaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM4ZDU2OTI4YzFmYWRhODI1MjI5NGIyY2ZlMWM2YjYwM2ZkNDZjNjdmNmM5MWExOTM5NmQ4NTA0NDc0ZDA2NjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50UmVzb2x2YWJsZVByaWNlUXVhbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWZmZjBkYzVjOGZhODcyODM2NGJmYTEyMDZjNDgyMDk1NzNmOGNkOGY3YjdkMTViZWJjN2I4NjNhODY5MzgxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRSb2xsRmVhdHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDk5YjJjNzAyMjA5ZDQ5YWNiMDVkNjQ5MDkxYzVjMGUzNTM0MGFiOWQ2MWFhYmU1YzhmYjQ4MjlmNTBlYTg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNjaGVkdWxlZFRyYW5zZmVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzdmZDA1MTczMDEzNmE3MTM5ZmM3Mzc4ZWRkZmRmMWZjNjUyNGMyN2M0YzE3M2ZiOGQxOTIxYWZhM2U5MDZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNldHRsZW1lbnRCYXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5YWViY2YxNzhjYzc4ZGZhNDNhNGY5ZGM4MzY2ZmFlYmMyNjA2NTk4NjJmYWQwZTQwZWJkNWQ1NzM3NzQzMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50U2V0dGxlbWVudENlbnRyZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDMxZWE5NTZhZjY5NjIwZDk4YTZlZGFlOWVlNDFlMWM0OTlmNDc4ZmQwZTkxYzcxMTliODNlZDEwMWYwNWI2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRTZXR0bGVtZW50RGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZDI3MWRhOWViMTdiNmQ3MjMxYjNlMGZhNTYxNGI4NjFmY2YzYmVhODIzYTcyZDMxMDUxZGEzNTUwYmYwYjlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFNldHRsZW1lbnRQcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTY3ZDA4OTViMmY2MzM5Yzk0Mjk0NzUyOGM3ODQzNzg2MTc4ZDcwNTZjZGFkYzVhMDQ1NDZmNjNmZjkyZTFiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRTZXR0bGVtZW50VGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEwMThjZDMzODY0ZWI3YTU3NjUxOTg3MTY0ODJjNzcxZjdkYTM1YmE1ZTEzYmRlMmVhODJjNWQzN2Q3NzA5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRTZXR0bGVtZW50VHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjk5NWQxNjFiYWRlZTczN2NmZDNiZWJlODQ5MTQ0MzU1OWUxYzM3YzE4Y2Q3NTc1Yzc5YjUyNDc3ZThiNDIwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdENvbW1vblNldHRsZW1lbnRTaGFwaW5nUHJvdmlzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2Y2ZhMDYyYTIzZDVkM2Q3NTg2MjM3YThjMWIxZmMwNTMwYzA3YmJlMGUwZjVmYWNmNzBlZjc3YmZiYjI3MzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50U3RhbmRhcmRTZXR0bGVtZW50U3R5bGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxNjBlZjc3MGMyMzM4ZGFjMjM1MGEyMmE4MzI1MTIzNWMwMTQ3MzA5ZDQ2N2QzOWUzNmE5YmVlMjI0NjRhMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RDb21tb25TZXR0bGVtZW50VHJhbnNmZXJTZXR0bGVtZW50RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTU5NWE2MjRlMTkxNjRlZTEyMGZiMTUzNTdiMmVhYWI2NzJmYmI4NzM3YjM4MzcxMjljZDIxZGFkNDc0OTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0Q29tbW9uU2V0dGxlbWVudFZhbHVhdGlvbkRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWNiYTYyMmZhYzcxYjExMTkzNDc3NTVjOGRjM2U5NDJmYjZmZjdmN2U1NzYwOTNmN2UzNDdjMTEzNmZmZjVhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXNpYW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM2OTViYjM2ZDkxNWQyNzY2MjEwNmNiMGM5NTI1NDdmYWNlNjc5YTZlYTEyOGJiZGNkZDQ4OWM2OTMwNWIzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXNzZXRMZWcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODMwZTUyMDljZDIxY2IwMjQwMzE1Y2MxZjJmZDQzYjU3NWU4MGI5ZTk5NjdjMTI0ODU3YjNjNWIyOGQxMjRiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXNzZXRQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmNhMzU4NzdiYzNmNWIyYzViOGI0NjhlY2E1MzNhYjM1Y2EyNjc5M2IwYzg1MzM0OGY2Njg3ZGE2NmQ3Nzc3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQXNzZXRQYXlvdXRUcmFkZVR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzMzJlNmU3MWNiODUwMWJhYWY4ZWMwYmFiYTdkZjQ4ZjA4NmIyNDYyNjFlZTQyNzg3YTU2ZDE5ODc3MDUxZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUF1dG9tYXRpY0V4ZXJjaXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4MGNjNDg0MjMzN2FmZGJiZGRkNDYyMzZmZDNhYjY0YmZjNzBhZGVmM2ExYzk0OGRmZWI2YTM5YmZkYTljNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUF2ZXJhZ2luZ0NhbGN1bGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5M2Y1YjA5ZTMwNjU5Y2JiNmY0Y2Y0OGE3N2Y4MDNmMDM1NjllMjE2Nzk3MTBlNWIyZGNkNDgxNjBiYTEzNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUF2ZXJhZ2luZ0luT3V0RW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmRhNjQzYWQ5YTZhODg3ZWE3YTllNDJkMDc0MTE3YmFmMmRmZGNmOTE2ZjNlZGI0YzMwNGNhMWJhZjBkNmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVBdmVyYWdpbmdTdHJpa2VGZWF0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1OTM0NzhmMjVmY2UwNzVlODAxOWZmOWFlODU5M2MwNDA1ZTc0OWFmYzMwZTAxOTE3N2MwMGQzN2FhMTlmY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUJhcnJpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODdkNjgwNjU0MDFhNjY3NjNmZDM1YmZhM2MwMjUzMTQzOGE4ZTZhZjg4NjU5NzJiMzc0MjNkMTEyOTllY2ExYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQ2FsY3VsYXRpb25TY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2Y4NWJkYjE5OGU1Yzk0YjgyM2E2ZjdlNGQ1NWIxMTgyNjY2MGUwNDhiYWJhY2MyMDZiNjMxYjBmOTJmOTA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVDYWxlbmRhclNwcmVhZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDEyY2E0MTk4MTM1NmJiMDljOTNlZTMyNjg3NGU3OGNlZjFkZDc5ZjYyYjBlNDc2OGI1ZDM1YWNhZDA0N2FjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVDYWxsaW5nUGFydHlFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1NjU3YjJlOGIwNjYzNWE3Njg4NDRmYmJkZjlkYTdlOGYzNzMwN2ZiMGE1MGU3YjQ3MzY4NzAxZTEzOTFmZjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUNhbmNlbGFibGVQcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTYzNDZjMDJkN2U1Y2M3YjBlYTJmMmZlODU1ZDNiZWM1YmNkNmZiYzg3MmU1MDAyM2ZkNjQ5YzlhZDI0M2RmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQ2FuY2VsYWJsZVByb3Zpc2lvbkFkanVzdGVkRGF0ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzM0ZmIwYTgyMzBhMzBiMTAzYTU1YzUzYWM0Y2QzM2E0NTZjMjViZjA3ZWFiMmQyMjc2ODBjZWQ1ZmE4YTg2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQ2FuY2VsbGF0aW9uRXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDkwYjE3ZjkzOWRkMjIwZWYzOTg4OGRjZGY0N2MzZGU1MWY4MGJhMzBiZTkwYzdlY2JlMDBhZjg2ODhhOGIzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlQ29tcG9zaXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdjY2UwOGRhNDJmMDA4MWY1NDM4YWJjYmM0NDQyMGMwMmMxZjdmMzU2NGNiMTQ5NDE4YWU2YjY1MTkxY2RkMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUNvbnN0aXR1ZW50V2VpZ2h0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiNzc3ZDRlYmYwMjA1ODRhMGJjYjRlNjU4MjVjOTRmMzE3YWZmMzQ3ZDAxYWM5M2UyZTdhMmQ3ZGJhOWZmYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZURpdmlkZW5kVGVybXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzFhNDUzMDdhM2E3YTFiZTY1YmFmOTk5NGQ0ZTA1YWRlYzMzZjgzMzExZGRhOGQwNGY4ZjMzMjQ3ZmY4NzMyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRWFybHlUZXJtaW5hdGlvbkV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5OGViZTU2ODAxOGVkMWYzNzMwMDcxNmJjZjVmYTBiYTc3YzM2MWQzNTYzYzNmMTZlNTJkZWEzZGQwMjBjMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUVhcmx5VGVybWluYXRpb25Qcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTdiNmZmNDk5Nzc5OGI0NjYxZmFmYjFhY2E2NzY0YWExMDZlYjJjMDZiZjRkNWJmZDE4NzdlOWRhNzFmMzNhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRWNvbm9taWNUZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YzIzYTdhZDc4MzJhZmYwMzUwNWJmMWFjNzk1ODQ5MGRkNjk4NjVkZTg4MjQxMTgyZjQ0MzhlODZhMmFiYTM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFdmVyZ3JlZW5Qcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTdmNTg4NDNjZTk0MTQ5YmZkZDhlNTQ2MDM3NDcxNGJlMTlhNDFiMzM3ZDJiYTE1NjRkODA1ODdhODVlZmQxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRXhlcmNpc2VGZWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDczMDgyNGFlM2YyNTRhNGVjZDc4MzQ0MWQ2NTUyNDcxNzY1NjQ4M2E3YWUyYjBjMmYyZjdjZWY4MTdjNTAyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRXhlcmNpc2VGZWVTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjlmZjg1NmMwYjFlOTczMTllOTdkMmY2NDVkMjI3M2E4N2ExYWU2MmVjMDM0MmU4MzM1ZmMyNWI3ZjVlZGQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZU5vdGljZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNDM4YmM3Yzc1N2FmZTYwYTQxOGQyYWU3YzExZTZiYWQ5ZGU4OTQ1OWUzYzVhYWVjNDQxZDc4YTE0OTdiODQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZU5vdGljZUdpdmVyRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZTM3NDdkMDFkYmJiNTg0YTljOTUwYTdkZjc4MDJjOGJmZjA2YmFhZDlkNzFkNzViOWY0MDVmNmNjNDBkYmIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZVBlcmlvZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTE0NTgxZTc2MzdmYTdlMWY0YzRjOGU4MWNlYTU3MzU4NGJkMjM0ZDUwNDIzYWU2ZWEwOTg0YWEwM2Y3ZjJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZVByb2NlZHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNTM0OTY4N2Y2ZmJkMDAxMjlhMWVhMDA0YjA1MTAzNDkwNzhhZThkM2IwMmY4OTczMjI0ZGM4MDE4MzgwMTFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeGVyY2lzZVRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjMwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlYjA3OGJmODhhOGM5ZjQxYTBhYTA5ZDNjZTM1NzZiZWZmNjAyMzBmYzk5NjBkYjNjZjk0OTM3YWNiMmQwMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUV4cGlyYXRpb25UaW1lVHlwZUVudW0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzk0OTBlMzJmM2UwM2I3MTQ1OGQwNmVhMmIyMjdmNzRhODZkOThmOWFkMDIyMjJmZDJmYjQ0ZGI1ZDA2YTY2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlRXh0ZW5kaWJsZVByb3Zpc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDRhYTY2ODViMmQ2ODQyNTI4Y2ZlYWVjZWZiNGE4ODQyZjkyMWYxYWQyYWRkYTc2MzM1ZTA4Mjc0YzM4MzY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeHRlbmRpYmxlUHJvdmlzaW9uQWRqdXN0ZWREYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5OThkZmUxNTJhMzhkY2E0Mzc4YTI1M2MzYjY3YzM3YWYzN2EyYWEzN2I3YmQ5NzU0YjQzODE1N2Q5MjM0NjZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVFeHRlbnNpb25FdmVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZGY0ZDdjMTJiNGFmZmI0MzljYTZkNmNhMDFhMmUyOGIyYzNkOTU2NDdkN2UwOWQ2NDg1OTM5NjYwMDA3ZTIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVGaXhlZFByaWNlUGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg3ZTM5MTIxYWM1YjIwZWIwYzgxYTA1NzcxNTAzM2RmZGZiZjYzMDAxYzYwOTcyMmQ2ZjNiZTc3ODkwZjUzMTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZUZ4RmVhdHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMjY0NTMzNzNmYTM4MWEwYmExMzUyMDU1Y2M0NzI2MGFlOWZiNjRiYTk0YTQ0MTgzNzVjZWQ2Zjk0MTBlZDc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVLbm9jay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWNmNjA5OTcyZjcyMzRkZWJmODQ2MDdlMTJjMjA1OTJhMjY0NTA0MTViODYxMzY5M2RkOTFiODBiNzhmZmRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVNYW5kYXRvcnlFYXJseVRlcm1pbmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjliMTg4ZDkyN2JlZjQwZmQyZTk1NzQ1OTcxOTJiYjJkNzZiODc4YTg2ODRkNGNmNmE1NGEyYzUwNjI3NmRlZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU1hbmRhdG9yeUVhcmx5VGVybWluYXRpb25BZGp1c3RlZERhdGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxYmEyZTM0NDYzNWFkNjM1OGMwNTRiODJkYjM3NGY0ODk0NDc3ODgyNTlmZjkwMDk1ZjliNWQ1MDFjOWNhZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU1hbnVhbEV4ZXJjaXNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNzQ0OThlYjhkYWM0ZTM1ZDhkYTc3ZGQ0ODAxMDcxZTdhNzg0Njc3NjE3ZDI2OWY5YWMzZjdiMDAwNzI4MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU1hcmdpblR5cGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmNjAxNTU3YzljYTFmYzZlMGIxYzU2MTdhMWUxYjlmYzUzMDFlZWQ3MjVkMzc3YjVhMDRjNjcxMTYxZDI0OGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU9wdGlvblBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzlmOWRhOTEzYzY1MjM3MjNlYTNiYzFjNjg0YWVhYWY0YTIwNzhhMmQyZWEzY2Q2ZGJiOGU2NmViOWQ3NmFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVNZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDhkM2M4Y2M4YWYyNDYzY2Y2OGM4ZWQyN2FmNjkxZGUxNWQzN2ExOTAyOWNkYWJiODViZjM4ZmFiODZhY2I5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlTXVsdGlwbGVFeGVyY2lzZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNzc1ZDBhNmUzOThiMzhhYTJiNzkwOGRiYzA1ZDBlZWRjMTBlYzE3ZmEwODUyOGRlZGE0YTBkZDU5NjdkZTBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVOb25UcmFuc2ZlcmFibGVQcm9kdWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1Mzg0Njc0MmUzZjAyYzIyMjM1MTUyOTRiOGZjZTUyNTBlOTUwZjlhYjU3ZmRhYWEyNTJkZGViZTVlYWIxZWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU9wdGlvbkV4ZXJjaXNlU3R5bGVFbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhYTc1YzQ4MmVmNDVkYzlmNWU2Y2NlYzQ2MzUxZGM0M2M1MmYxYmMzYzI4ZjhlOGU2MTE3ZmZiMDdjNDRmMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU9wdGlvbkZlYXR1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjlkYWZhZTRjMjNlYTMzNjFlNDE5NGY4ZTNjYmE4ZmZiN2IyNTNhM2ExZmY3NmMyZWUwNGQ4MDlhODM1Nzk0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlT3B0aW9uUGF5b3V0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0NDdmNjRmNWZmZThlMGI3YjNhNDJmODJjNjAyMDA5NDgxZGU3OTRlODI0MTBkNTFhMDE5OWJkMDJiM2Q1OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZU9wdGlvblN0cmlrZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDRiMjcyMjY5OGRmMWMyZTcwNTFkMTU1ZGRmZDdhZGVjMTMwOGMzMTU0NTk2NzRlN2NmMDFjN2E5MmQ4MGRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVPcHRpb25UeXBlRW51bS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWRhMmQ1M2I5ZDA2MTc5ODg0OWM1MzRmNzcxMWJhYWY0MGQ5NmU2YjIwZDdhZDdhMGEyMDQ4NjY4ZjNlZGIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVPcHRpb25hbEVhcmx5VGVybWluYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTc3ZGJmYTFiOTdjMTgxYjY4MGI3YjEyMzRhYzYzNDZiZDA2OTFkZDllNzlhODQ5Y2E2YmM3MDZkZDI5Y2NlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlT3B0aW9uYWxFYXJseVRlcm1pbmF0aW9uQWRqdXN0ZWREYXRlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTkzMTIwMDI0YWYwNGRkYzFlMmFjNWFjZDEyODE4MTZkYTg5MjE0ZGQ4ODhhNzIzZTVjM2YxZjAyYjk0Y2I4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVQYXJ0aWFsRXhlcmNpc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjA1MjQ0MGVmOWMwZGE4ZjYxYzhiZGY3ODdjM2Q1NTE4YmQ2Y2VhYzJlZjBjMzg0YTQwOTA5YTQ5Y2VjZmI1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlUGFzc1Rocm91Z2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBiMWJjMjQwMjk2NWE5YTE5YTZlMDA2OTRiOWYwMjdjNDBhNWI4OGUwZmY2NmU5ZjU4YjE3NGE1OGY4ZWYwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlUGFzc1Rocm91Z2hJdGVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2YmY2MTIxYjdjMmJhNjJjODNmZjQ3MWMxYWU1ZDMyOTc3NWM4YmY0ODIyMmRjMWVhMWViM2Y4OTA1NTRlMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjI0YTVjOWFhYjVmNWNjNDRlZTMxNDMyZGFkYWIwMzIwNWFkOGE3ZjU5N2ZmY2Y2MGZiZGE1ZWE5M2QwMTM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVQZXJmb3JtYW5jZVBheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZGFlYzQ3ZWU5Yjk1YmU1ZjgyYTBmN2U0NDJmNjI0MjY3MmVhNzIzOWVhZTUzNmZiMjdhNTE5ZGQ3ZWFmYzU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVQb3J0Zm9saW9SZXR1cm5UZXJtcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMmQ2OWU4YzY4ZmVjNjliZTZhM2M2YWRlYzc2NzNiMjhjMTk1NDgzOTM5NDU4OTBkNDliZTA5YTQwZDY2ODk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVQcm9kdWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkY2ZhOWI2NWVmOTNlZDRjYTFiMDNkNjQ5NTBkOTFhMDMzZWJmMzFlZGUyZDZhYTM1Nzc5ZGUwN2QzZTljZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVF1YW50by5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmU4MDFhNzdmMDFlNTkyN2I1NGQ4Mjg1Y2E4MmU3Y2UwNjEwNzkxNDQ4OWJmZTlhODQ3YzcyMTAzYzZjNTA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVSZXBvRHVyYXRpb25FbnVtLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjYTNhYmZkYWRkNWY5YTllNmUyNzc2YjE5ZjlmOGFmZGFkNDE5ZTNlNThhNjNjY2RkNjgzM2ExOGJiN2MyMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVJldHVyblRlcm1zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyZWFjMmUzYzc1OTQ1YWI1YTNlYTJjZTQwZGQxNDk0YWNlOTE1NjE1ODg5MjkyMDg0YTg1NWNmNTIyMzlmMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVNjaGVkdWxlUGVyaW9kLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI4ZWNhZmZiMTljZDIzZDQ5M2VkMDMwOGM0M2Q2Y2ZmYTE5ZmRkNmZjNzNkNzBlNjgyYzYwZDIxYmYzYzdhM2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVNldHRsZW1lbnRQYXlvdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJiMjZjMTZlNzE0NjA5ZjBiNDZlYzgwOTkwNjljYWY2ZTk4M2Y2YjE5MjEzZDg0YjUxZmQ3NmUzZTg5NGE5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlU3RyYXRlZ3lGZWF0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwNGE5ZjViYjE3OGM4ZmRhMGZjNWE4M2FmNzZkMmRiOGM3OGJkYjA5MmJhYzBmYWM5Mzk0MmEzZDQ0ZDZiNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVN0cmlrZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZWE3M2IxN2RiZTYxYWY0ZjJjZmYxZTJjY2Q3MzFhYzg5MTIyOGZhNDg4MGM5YmE1YmM0ZGI4NGZkNjdmODA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVTdHJpa2VTY2hlZHVsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDUxNmFkMzZjMTE0NTA1NDU4ZWQ0Y2MyODcxNmNmNGU2NjVhNTM3NTI3NjI1ZWNlYjFjOTMzY2JlNzMyNzZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1Qcm9kdWN0VGVtcGxhdGVTdHJpa2VTcHJlYWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQ0NjcxOThhYjcyOTMzOTE3OTc3MmM1YTc3MDFhMGE4NzA4YTE0YzY4YjI4OWYxZmJiZDUyNTZkOTI1MzM2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlVGVybWluYXRpb25Qcm92aXNpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2Y5MDBlYmZjZTU4YTI3NWZhOWQwYzMwNDQ1NGYzNGQzYjllNjZlOTNjMTViYTY3YzYwZDBkMDRjMWQ1YzJlNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlVHJhZGFibGVQcm9kdWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjMzc0YjA2MDZhMDE1YTNiMWE5ODg4YzIwN2I2ZGFiZmYxZmYzYzgwNmU5MDBkNDVlYzNlNTU0YjA3ODk1ODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVRyYWRlTG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0MGI4ZjkzMjUyMTg4YTVlZjM0ZTBmY2Q2OTUyM2I1NjZhZjljNGNiZTg4MTM5ZDRiYWE3ZDJiYmI5NzcxZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVByb2R1Y3RUZW1wbGF0ZVRyYW5zZmVyYWJsZVByb2R1Y3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRiZTMyYzI0YmNjNmY4YzIzMjdkZTQ2NzE0NTVhNWYxMmMwOTA3OTFiYjc1MDJjZTEwNmQ3ZmI3MDUxZjgzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUHJvZHVjdFRlbXBsYXRlVW5kZXJsaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjliNGNmNTBiZDNmMmEyYzg5NWEwZjQ4NjhlMTBmMTUzYTlkNTM3NWZkZThmYmMxYTY0YTBjZmEzYmQ2ODhiNGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25BY2N0T3duci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTRhMGZjMDczZGRmNDExYzRiZWQyNWU2NzU3Y2Y5Y2RkNzE3MWMwYzIxZTYxOGMyNTUzMjQ3YWNmYTRlYjNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uQWRkdGxBdHRyYnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzNTA2MTQ3MDg2MWM2ZjE0OGViMGYyMDBjNTAzZTA2Yjg5Y2Y4OWRmY2U3OGU1OTY1Mzg5NWExYzRhN2U3ODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25CdXlyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhMDliZDI1YjM1Y2U5OTkzNjNmNTAyMTdiNWZiZjZiMDhhYmRiM2QwNGI0NjIzYTIyODFkMDEyNTU4MGYxMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25EZXJpdkluc3RybUF0dHJidHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDhlY2FlMmQ3MTRjZTViYWZiYmQ3MTczNGJlYjE3Y2Q0MGVkOTMwNDZkMjFkOTlmYjQ0NjUyN2Q2NWU2NmIyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbkRvY3VtZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmZjQxODAxZWU3Yjk4YjMyY2FlNjdmZTE2Yjc4NWMzNjgzYWI2ZmY2MTAyZmZiNmY2YTkyYjkwODhkNGEwMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25FeGN0Z1Byc24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjNiZmI2YTE1ZjU3NWZiMjI5ZDg1YTRhOWZjNWZmM2Q4NDVmOWFmNTYxMTU3OTBkNzgxODZkYjA1MTViOGYzYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbkZpbkluc3RybS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5M2ZhZDU0M2E2ZDI5NzljZDdjOWQwNDE4MWIyNGU3OGMxY2M4ZGZkZjA5ZjNlMWU0ZGQxZjIxNmI3NTU2YzgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uRmluSW5zdHJtR25sQXR0cmJ0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTBmYzJlMDUzZGU1MjU4YTJhYWYzZTI2NjUwMGY5ZmQ2Yzg2OWNjMzNmZmE3ZTgxNThjY2U4NjE3NDc5ZDJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uRmluSW5zdHJtUnB0Z1R4UnB0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5NGE3YzlkZmRhYjE5ZDQyODFiYjgzMmFhZTU5MWRiMzk0MjI3NjRjODFkYzA4NTE0NDkwYjVhOWFmNjE5NzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25JZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzc3NjQxZGZhZGIzMGE0OGVlMjc4MmI5OTE4MGU4MTcwZDg3YzA1MGQ1ZDgyMzZiNzcxZWNiZjc5MWZmNzZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uSW5keC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZWNkYTJmYmViMmRkYzdmODk5ZTlkYzBlMjgxZmY2ODUwNDJlN2VmMmE1NWY1MTZhMTgyZDBkN2M2ZWQyMTliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uSW52c3RtdERjc25QcnNuLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImNlMjBlNDE0MjVjZjRiYWY1ZDU5YjgzOWVjMTMwMzYwOWVmMmU3NWJkZjNlYWJlNDJjOGYyNDY0ZjY5YWZlZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25OZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTBmYTliMzlhYWM4NWYyODlhODUzMWIxYWFlZmVmMzJjNzdlNjg2MGU2YzVjZjZiMTQ5NTM5ZDY1MGM4MTA5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbk5tLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxM2FmNDlhZWIxZTUxMDc1OWFiZTY2NzJlYmQ5MDE2MWYzMGY2YTg4MTJlYTQ5ODBmZmY4OWY4Y2ZkNDYwOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NkbVJlZ3VsYXRpb25PcmRyVHJuc21zc24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODkwOWEzMjZhZjJmNWNlMTM1MGVjNjU0ZWZjNzZkMmVhNGQ1ZGExOWZiZDZjNjVhNzEzYWRiNzExM2QxY2E5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvbk90aHIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjkxZDIxOTNjODIxN2Y1YWJkMDAwZGM4YjhhOWM2Nzc0MjA0NzA4NzQ1MGQ4YjMzMTZiMGVkOWY1ZTI2ZGFjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblByaWMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjU4YTgxNDJjY2E2ZmVhNWRiNjQwODM0N2ZiNDE0NWZjYTY5YWQ4YTc2YzRhMTYwODU0YzgzNjdjNGIzMmMxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblByc24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzkyNmY3N2Y2NzE5YTkwNmVkYTcwZGM5MmJmYjZlOTcwODk2NzA0NzVhOTYzYmVkMTNiMmRmZTZhNmM5ZDA2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblF0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMjgwNGFlYWNhZTI5ZTczZTdmZjcwMWM1N2I5NDA5MDU4ZjNlZWI5NjQxNDAyODVkYzllNmU3ZTk2ZjJmNmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uUmVmUmF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MzU5MjMwNWM0MjU3MTU4MmFkZWQ5OWM5MmExNjk4N2M3OTMyODc1NTEyNDEyM2NjNGY3NmNjMjRiMmNiOWVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uU2NobWVObS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTg1ZmM2MTAwMGI5MzQyYTM0YTM2Njk3YmZhZmMzZmFjYWYxNjc4NjY2NDM5YWQzZmIwOWNlNmViYzU0ZWQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uU2VsbHIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjI1ZDE5NmQ4YTk3NzM2OTE0ODY3MzEyNDI4ZTRjMzY0NjNlZTVjOTE1MTRmYzA1MTRjMmU2YWI4MDAwMjYwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblNuZ2wuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjk3ODdmN2U2MTBkMmUxZDU5NjQ3ODEzYmEwNGRlOWU2ZjY3NDNiYjA3MGJkYTQ4ODRjMmNkMmVkNTk5MzY2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblN3cC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNjVhNWI4MDQzMzk2ZDVhYzY2Y2QyYTkxMmY3YTllOWQ5OTY5NmQyYjAyM2VkNGFmNDc4MTY5YTUzOWVmNzc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uU3dwSW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzBlMTZjODIxYzZiNGEwNmEzMmI1MmE4NzcwZGUwMGE1YTE0YTViYmMyYTFhNTU2ZGE2ZTM5MTMyNjM3MWUxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblN3cE91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2FjOGIwNGYwMjk4Y2FjMDlmNmE5MmI2MjgwNmFkMWEzODVlYzIzNmU4MTgzMzc3ZTI2YjljMjg5ZjUyMTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uVGVybS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTkyNWUxNWRmYjlhODUxOGZiNDhlMzM1OTQxZTYyYmFjNjlhNzQzZjdiMjUwZDA3ZDIzOTk2ZmVlYzU3MDRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9DZG1SZWd1bGF0aW9uVHguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGI0NWI2NmYzYTJmYzRkZDM4ZDljNjM0ZGI4MzU3OTVhNGY1NzE0YjFmMWIwYjE4YzVkNjkzMTA4Njg1OTBiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ2RtUmVndWxhdGlvblVuZHJseWdJbnN0cm0uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE3NzVjMjk3ZGUyNjZiMzNhNDBjMjg5MmM2ZjI5MjU1YzRjNjZmYWZjMTE3ODI4M2U0OTgwZDkzODI0YzIwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ29tUm9zZXR0YU1vZGVsRmllbGRXaXRoTWV0YVN0cmluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZTMzN2M4ZjMxYzdiNjVhN2IwYjI5MWI3NmEwOTAxZDE3YTY0Y2YyMDcwZTZhNWQ4ZTgyODZmNzI0M2M4Y2Q2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vZmlub3NjZG02MGQwNy9Db21Sb3NldHRhTW9kZWxMaWJNZXRhS2V5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwNGUyMTM5YjNlMDQ0NDZlYjI5ZjAxYTRhYzcwMDY3Njg4Mjc0YjM0OGQ5MGJjM2YxNGNhN2ZiNWJmOGNhY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9maW5vc2NkbTYwZDA3L0NvbVJvc2V0dGFNb2RlbExpYk1ldGFSZWZlcmVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTJhMTNkMThhMDZmMGM2NjYxZTM1NmQ1MTQ4MzEzMTVlMTQ5OWMzZjNjOTI3OGRjNWU0NzM5YjBlOWQ1ZDM3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ29tUm9zZXR0YU1vZGVsTWV0YWZpZWxkc01ldGFGaWVsZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjNlOWM4NTg0NGMzMjAzNWJhODk3ZGI1YmJjYmVmNjZmMWM2MDBhZmVlZjFkZmU2MGMyNTBhODZiMDZjYmE0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL2Zpbm9zY2RtNjBkMDcvQ29tUm9zZXR0YU1vZGVsTWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhU3RyaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI0ZWQ3MzYzZTM3MWQzZGE3MDE0OWY4OTAwNjlhNWYyOGY2NTQ1YjY4OWY2NDdmODY1ZTA3ZGIyZTcyZTNjNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL0RvY3VtZW50UmVzcG9uZGVyTWFuZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMmM5MjQ2ZGRlYWE5MmMwMDlmYzdlOGVhYmJlZWVjMzVkYTIxYTA4YTMzOWIzMDM1MGYzNzYwNTQ0YWEzNzY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbWFuZGF0ZS9NYW5kYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmZmUyZWY3MmM5YWIxYWMyNTRlMDFmYzc4ZTkxYWE4ODAzM2IwZWUyYzFhN2Y2NDFhMTcwODg1Mzc2YWE0YzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL01hbmRhdGVBY3RpdmF0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNmZGJmZjM0MGUwMjgxYzJjMDU4ODUxZDllNmUwZWJkNzA3NDQzNjIwZTJkMzY4NmI5OGY0NjJiOGU3MTZkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvTWFuZGF0ZUF1dGhvcml0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMjQ0MTFjNzZkMDljYjc3OTAzNjkwMjIwNGVjMDNiZmIxM2FmYjY4OWI3N2U3YTMxZTk5OTQ0ZTZhM2VlYjM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbWFuZGF0ZS9NYW5kYXRlQXV0aG9yaXR5Q29uZmlybWVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkNzg2M2FkMWQ5NGYxY2JkMGRkNTZjZTdiMWViZWQ3Y2E0MjE0ODRiNWIxYTU0ZWZlYjBjYTZjY2NjODY2YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL01hbmRhdGVUZXJtaW5hdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlOWVhNDFiYTcwMjcwYmM0ZWNkMTY2ZmIzOTBiNWIxMDNhYTZkODcxNWNhNWVhMjA0N2M5NjkzY2M2OTg5YmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL01hbmRhdGVWYWxpZGF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3MDJhZmNlMTMwZTdhM2U1YmI0NDlhZmNjZWFmMzljZGVjYWE0NjJjZDEwMzZkNTUxNmEyOWQyZDA2MzIwYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL09wZXJhdGlvbk1hbmRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTcyNDExN2FkOWZkMzBhNTZhZDY4Y2IxODEyYzFkNTljZWE2MDkyNjM0NjJhNzBjOTRjNTM1YWNhYTM1ODNiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL21hbmRhdGUvU3RhdHVzQWN0aXZlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkYTkxZDU5ODBmMjNlNWJmNjJmNDA1NTUzNjU4MDE1OWUwNTkxY2FhZTMyZmY0OWM4NGQ2Njk2NGEwMjVkYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9tYW5kYXRlL1N0YXR1c0F1dGhvcml0eUNvbmZpcm1lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzgyOTEwYmM4YmEyYWZkODc1MWE4NGZhNjhjZjFhNTVjNzI5MjZkY2MxZjkwNTg0OWM3MGFjOGZkZjlhMWIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbWFuZGF0ZS9TdGF0dXNUZXJtaW5hdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1NDNmMDMwZGVhMmNlODAwYzI0ZTJjOGMxOGE0N2U2N2MwZGJmY2VmYmUzNGYyN2FlZTZiMjA2NDNjMTM0MWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0FkZGluZ1BhcnRpY2lwYW50UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmZjI5YmJlMmJiMTE4NjlmMjU2ODllMjNjNThmNWQzODJmZjJjOWUwMGYwMjU3YjFmOGYzODc4OWQ3NzgyYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0FkZGluZ1BhcnRpY2lwYW50UmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1ODkzZDM0M2Y0M2FjYzAzNThiMGUyOWViMGZkYWM4NTgxYTVlYWQ3YzJkM2E2ZjU3ZmE0ZmM5MmYxNjdhNjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0FnZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGJhZjMyMGQ0NTM5ZmM0OGMxOTk5ZmJkNDA5NTk4YmNlMDViOWFmMWE3YTJhY2U3ZjkwNjQ1NDk3MjNjNTE0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQWxsUGFydGljaXBhbnRzUmVhZHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTRmNjFkM2I4MWE1ZDQzMThiYmY3YTQ0ZjAxN2M2NDI1ODUyMTZhYzk2NTk2N2ZlNDY3YWE1ZmNlYzQ5MDg3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQm9vdHN0cmFwRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViYjg4MTNmMDkyYWZmMjU5NzQ2NTI4NmJiZGUzY2E1MTMzNjEzNWZiYzY3OTFjNTc5MTgxMWRhMzFmMjNmMjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0NhbGxPcGVyYXRpb25BY2NlcHRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjU2YmZjZWVhYzRjZGNkMmJjOTU0ZjNlMTlmNzI3NDE4ZGY0NTFhZTJiN2ZkYjQyYWNmMjdiN2MzYzYxOGQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9DYWxsT3BlcmF0aW9uRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0NzFhMmQ1MDhlYThiMWI0ZThmZTA2NzRiZGNiNjJhMWVmM2M2NjdmMzFiNWI5NjBmODczYzliODQ5ZGMyMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0NhbGxPcGVyYXRpb25SZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY2MmZmMzUwYWY4MTA1YjFkNjQyMTkxYTg4ZmI5ODM5MWZmYjk1NGIwNzNmYzVhZDlmOTBlMDRhODZlMmViZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvQ2FsbE9wZXJhdGlvblJlc3BvbmRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzZkNjhiYzg2MDNlZjhiMjVhMjBiYWQ2ZWU3MmQ0Y2IxNjAzNDljZWVlNmMwYTExYWQwYzY4OTk0NTA1ODAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9Eb2N1bWVudEluaXRpYWxTbmFwc2hvdFJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYWY4ZDQwZjc2Y2FkYjJkYmU2MDUyMWZkNzFiYjE3NGJlMDYwNWMzMjRiMzVmOWQyMWI0YzYwY2VmYTg0MjIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9Eb2N1bWVudEluaXRpYWxTbmFwc2hvdFJlc29sdmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzYjZlNTkxZDM2NzhiNjlhMmJhMWQxOWFkYTI0N2Q0ZGRmNDFmODRlY2FlZGM0ZDY2ODIzNWRlNjVkZDQ0ZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL0RvY3VtZW50SW5pdGlhbFNuYXBzaG90VW5yZXNvbHZlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTJjNTEzZjIzOWZlY2YwYTczZTkwMWUwMmZkMTQxOWE3Nzc2ZjA0NmZlNmQ1NzIzNTQ4OTVmMGYyZmJjMmIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9Eb2N1bWVudFNlc3Npb25Cb290c3RyYXAuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTFmY2ZhNTYyODI1Y2E3NmNkMTI0MjY3NTgyYTZiNjkzYzE2ZGQwNjY2YmZjMmE1OGM5OTIyNjVhMTgzOWJiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTExNQWdlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzMwMDUzYTI0Yzk2MzA3ZDg5MDM3NTFhYjc5ZTExOWZhYzNjZWRmMDJjNTU5Mzc5OTcxN2NiMGE5OGZmNWFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TQWRtaW5BY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhOTYyYjQ0NzdkYjQyNDI0ZjA4MDVmMjc5ZDRjMDY0NTk4ZDE2ZGM5MDdjM2Q5ZTlkMzg0ZDFhYjcxZTUzNjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NBZG1pbkJhc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGI5ZmI2Mjg0MGZiY2EwMzk1ODVkZTUzZjE3N2Q0MWVhMGJkYjM4ZWZlMDE1NmI4YTJmNGUwODdhNDRlYjhjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0FnZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhYWVkNDM0ZWQxZTdmOWRmODFmZDQ2YzkxOTE0YTE2MTU3ZTI0NWMyNzVlMjBmOTExNGQ5YjliNTM1NTVlZjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NBZ2VudEFjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2MDI1OTBmZGUxYWU1NzllODQwZTc4ZTJiYzJhZmVkMTE1OWQ5NTYxYWU0M2U2YzExZDg1OTM4MWU1Zjk4MGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NBZ2VudENoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTVmMTRhM2IyMzc2NDFkOTg1ZjA1MTBhYTI3ZDdiM2M1MjE2YjY4NTM1MWEwYjVjNTNlNWFkMGZiMTU1ZmVlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0FnZW50RXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBhOGRkMWJhZTU0NDdkZmJlZjk3NTU0ZTc5YjcwMmFmODI4YzgzZmI2NDA3MmU1N2Q3M2M0OGI0NWYyZmRjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0JhbGFuY2VBY2NvdW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxYmY4ZDk0MjZjOGU3MGJmZThkYTVhYjg5YWExMmVmYTE2MzI3ODNhZmYzNDgzZWNlY2M2ZGZkZjQ5ZmYzYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NEb2N1bWVudEJvb3RzdHJhcE1hbmRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjM5OGM2YTM1ZjMyNGRmOWJmNTI1ZmQ1ZmZhY2RhM2JiODBhMjU3MjY2ZTkyMDBiNTNmZGUwZDJlZDljN2VkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU0RvY3VtZW50T3BlcmF0aW9uTWFuZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZDMzMzMyOWZkN2ZjNDhkMTExNTJhODlkOTNhZWEyNjdmNDhiMDkwZGUzMjg0N2E1ZjBmOGMyMTU5NWMzOTc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TRG9jdW1lbnRTZXNzaW9uUmVmZXJlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiMDdmZGIzYjg5M2RhZmQwM2YyODAzMmUwMGYxNzhiZWM3NTNkYjBmYjQwYWYzNzBkZjMzNDM0NGU2Y2E4MDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NPcGVyYXRpb25DYWxsUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5NWQzMTZmMmNkNjhiNjIwZTcyMGJiZGVlYzlkOWQ4YTQyNzJjM2NmZWNjN2RiZmVkODAzOTE0NzliMzZhYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NQYXJ0aWNpcGFudHNPcmNoZXN0cmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDYxYzY0MmNmOTJlNDYzOTM0MjI1OGZmNTVlMjdhYzk3MTM0MTYxZDZmZmEwODg5OGZhYjgxYzZiYjExMDI0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1Nlc3Npb25JbnRlcmFjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhNTBmMWViZmM0OTc2MmEzOWQ4ODgwZWM0YjIwMDhhZDYzY2JhM2Y2NTU5ZjM4NjA3NzgxOTc4NzM1MTg1NjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uRW5kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2MxMGFjODJhMTVmM2MxOTIwYTA1MTY2NDE3ZWYzN2ExZmU5MDI0M2Y3M2FhNWU3NDVhODEyY2U5NGI3MmMyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25GaWx0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzg2NGNhMDEyODMwNjk3MjllMDA2YjJmMjY4ZGEwNTEyZDNlYTk3ZTE2ZmQxNDM0MjVmM2Y0ZWI3N2M1YjVkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25NYW5kYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkMWZlM2E2MDUxOTcyNDBmZDUxM2RiZTk3Mjg3NmUwMjVkNWU0ZGExMWQ0YTZiOTUyNTBiYjRmYTYzMjk4MTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5OTFlYWViNjQwOWFhMzQzMzllMjljYWJjNjA2MTljOWVlNDdiMzE0Njk4NDJmNDczOTE1ODI5Njc1NTIwZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uU3RhcnRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjYyNmUxNTRkZDQ2YmFhODlmM2RmY2QxOTRkOGZjMjgzNzU1MTRhNzg2MDllNjA1YWY0NmRjZjYxNmZjNmQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TU2Vzc2lvblN1YnNjcmlwdGlvblVwZGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YTkzNTRjNzk2ZTZjZjY0ZTBkZTZiMDc2Yjg1ODRlOTE3NGM4YjU0MTVlZGNkZTA3MGQyYjYxMGNmNDVhYzcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TVGltZWxpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhM2ZkNjgwY2E3OWYzOGUxZTg3NjllNzgxNTY5OWU2ZWM0NDkxZWQ1YTNmMGQ2NDhmMDZjMWY1ZWVjN2M2MTMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9NeU9TVGltZWxpbmVDaGFubmVsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiZmM2NzlmZmNiZDY3NmM2MzY2MTM2NWU2ZjFiOTQwYjVjMjI3MzRlOWNiMzdmM2FjZjMxMGU2ZmY0MThjMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL015T1NVc2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwZDQzYjlkNThmZWVjYzMwYzRiOTk3MzFiY2U3ZGM3M2Y2MWEzMWY2ZjJkOGVlYTk4MmQyMzY5NGM1ODBjZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BhcnRpY2lwYW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUxZDc0MzM3NmY4NTBlYWE0ODY3N2NmN2U4ZjEzYTkwMzI3ZWEwMDMzMWQ2YjQyOWJlMTVlMjRkMjNhZDRiYjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BhcnRpY2lwYW50QWN0aXZhdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1ZmZkMTg0OTNlZDRkMjBiNWVlOWNmZWMwMzlkOGZjMWU1NGY4YTlkM2U1MTY1NDNjODk4NGExNzYyNzI4Y2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BhcnRpY2lwYW50QWN0aXZhdGlvblN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyZTJhYzIxNGEwMDBmZTc1MmExOTU4Njk3YTIwZDc4ZDY3ZmJlYzBjOWU2NjM4MjdhN2YxMzc2MjNhZjdjMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BhcnRpY2lwYW50UmVzb2x2ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjYyMzRlOTEwMzczZmVjN2ZhZTkxZWEzZjBlYWIxNjMxZjlmYjdjNTEyNDAwMjQyOGE0ZTdmM2VlZTNhNjQ0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGF5bWVudEluaXRpYXRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTA5MGUxZDY0MmYyMGE3MTg1OTU5NmFjOTAwZjcwNzYxZGYwOGY0YTM3OGNjZWRmNmM2MmZjMzE2Y2U2NzcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9QYXltZW50SW5pdGlhdGlvbkFjY2VwdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiMTE5NjY1ZmM3ZTZlZGI3OGFjNmM0NzE1MmRmMGYzODIzY2EzYmZlZWFhY2U2NmFhODRjOTY1ZWNkNGYzZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BheW1lbnRJbml0aWF0aW9uUmVqZWN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzE3OTVhMDA4N2I3MmVjNjFhOGFmNmY1ZWNkMWNlYTE3OTFjNmJiYzc3YzQ2MjkxNzJkNDExZDU4ZmFjMjk5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGF5bWVudEluaXRpYXRpb25SZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjIyZWUyM2Y1ZmViMmNlMTc2MTVlMjc2NjliZmVmNmNlNzg3Yjc2MDMzNzJmY2ZiOWM4ZDkxY2ExZDIxNzg4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUGF5bWVudFRhcmdldFByZXBhcmF0aW9uRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2MjcwNTZkODY2OWNlMjEyNDc5NWFiMjEwNTc0YzIzYWI3YWRiMDE3OGIzNTc3YzExMTczYjk1ZjUwMzEyNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1BheW1lbnRUYXJnZXRQcmVwYXJhdGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODRhMDc2MzAzNTk5ZThmOWJkYTFiMzkxYmU0MGRhYTA0MmU0YjZiZTk0ZWRjOGIzNDg0YjgxNjVjMDhjNmE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9QYXltZW50VGFyZ2V0UHJlcGFyZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDAwNTUzY2EwNGExNTAzNGRkZWY1MGE5M2Q3ZjE0Zjc5MzYzMmQxOWI5NjQ0OTNjN2Y0NjJiOGFiMGI5ZGVkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUHJpbmNpcGFsQWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmIxOTQ0YTAzMzE1NDU1YzhlNGY3MGEzODg1YjA4MTVlMzFmMDIzZGNkZmMyNTFiODk3ZTFiNzA0MzcwZDdlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvUmVtb3ZpbmdQYXJ0aWNpcGFudFJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNThmMjQ5MzIxYWVmODEwNTQ0YjRlMjY1OTEzZTBjN2UzMjM5YmM0MmRlNTRkZTEyYWNkZTU3ZDQzMDVmNzM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9SZW1vdmluZ1BhcnRpY2lwYW50UmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0MWFhNDkxNTI2MDgwYTk3MmIzZmEzMmFmMjQyMTBhYmRmZjZhOGUzZGEyYTc3NmI4ODA5NWZjZmM0MmJkMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1NlYXJjaENvbnRyYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkNjYxZGFkMzRkOGM2NzI1MDFkZGM0NjNjMGQ1NWE4NDc0YTQ4ZGQyNDJmNjRiMmU5Mjk2NDkyMmRmYzZmOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1Nlc3Npb25FcG9jaEFkdmFuY2VkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlZGJmMTk4NTZjOGZjZjZmMzllMjkxMDY1MGZlM2ViYjVlOGZjYzhhZGQxMTkxZjFlYWM0ODk4ZmY4MWVmNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1N1YnNjcmliZVRvU2Vzc2lvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTU4ZTUyMmZkYWE4MGZiZGYxMmIyNzNlZTAyOWZmYzMxMGZiZDgwZjczNDE1ODgwZTI4NDhjZjhkYTlhNDhiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vbXlvcy9TdWJzY3JpcHRpb25Ub1Nlc3Npb25GYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDM5MTg1NmE3NGM2YWJlMTFhOTdlNmIxZjZjZWYxYTZmNDI0YWZjZTQ5YjFmN2M5ODQ1MTczYTYzN2I2MDYzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvU3Vic2NyaXB0aW9uVG9TZXNzaW9uSW5pdGlhdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhZjU2YWZiNmZjYjZlZDM5NDljMDk4Nzc5YTU3N2UzODg2YmQ2MzdlZGNhMDVhZWEwYWY2YjMyZTYyZjUxYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1N1YnNjcmlwdGlvblRvU2Vzc2lvblJldm9rZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2FkMjhiOTY1ZTJiYWQyYzAzYTg2ZmFjOTlmZDM5MWEzZDA0YzBjNzMxYTRiZjMwMzNiYTc4YzRmOGE4NmNmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL215b3MvU3Vic2NyaXB0aW9uVXBkYXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiOGZhMWNlZGU0NzIxNTEzYTUyMzlhMjg2Nzg4NmQ0YjQ3ZGI5NWNlYTgwNDgzZDUzODZjYTE2OGQ2NjA1NmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9teW9zL1RhcmdldERvY3VtZW50U2Vzc2lvblN0YXJ0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTViZTQxYmEwZDJlNmQyOTI0YTAwNTA3ZTA5ODAxMGY0NjJkZWFkMDkxNTUwMmFiZjY0MDljZjdkNTgzMmNkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FuY2VsQmVmb3JlQ29tcGxldGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDgzYzMyNTQyZWEwYTBlMjE5M2Q0OTI3ZTE1NWEyNjNhNmM2MDJhNzgzNDhkYzc1ZjdkYzhhODQxMjNlZmViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXB0dXJlRGVjbGluZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWQxZjdmMThjZDMyMmM0NmZhZmExZDBhZTZiMzAxMjZiZmU2OGMxN2U5OGQyOGQ4NTM1ZTExYTY0YzA5MmJjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FwdHVyZUZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZjFkODc3YjQxZDNjMzhkYzM5YmY5ZTA4NjlhYTRlYzlmNGM2ODE3M2E1NGNlYTYwZDBjN2NlOTc2OTYyODU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXB0dXJlRnVuZHNSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQ2NDBiZjkwNjgyMDQzZmYyM2E1NTJlMjlmMmQxNDk1NGZlOGM1OGMyNTA5MDQzMGZhMGU3YjhiZWVkYjE0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZENoYXJnZUNvbXBsZXRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNjVmZTYwOTNhNWE0NTFiYjQwN2RhZDgxMWJiYzI1YTlkYTQ3ZjQ2NmI4NmUyNzI5MjE5NmQ5ZDg3YzVhZjJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkQ2hhcmdlUmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2NTYzYmM0MDEzMGQ0NmU5ZjJiYmQ5YjdiZmRhODc5YTUwOWFkMDUwYjBkMWZmZDlkOTE3MGIwOWM0MjhjZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbkNhcHR1cmVMb2NrQ2hhbmdlRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViYzllODNkMTQyNjAwZDFkZjAyNDllMjUyOTNjNWNkZjhmN2VjZjk1MDM4ODRlOTVmYTJkYWQ4N2M5ZjcwYmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbkNhcHR1cmVMb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0ZGVmNjI2YTE4ZTc4MzgwY2ViODU3NDRkMDhjYjY3NjkyZDQ0MDk1NmI5YmY5ZmVjZmZlMDQxZTUxMjEwMzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbkNhcHR1cmVMb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmMyNmViZDM2Y2Q4MDcxNDc3YjdkMDI1YzU5MWU3NmUyOWFiNTZlNDg2YzMwMTI0ZWM5YmRhNmI2YjBhMjc3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZVVubG9ja1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODAyYzFmNzU3Y2JlZWIxYWYwZmY3OTdhNzhkYWZkZWMxNmQyYjIwYzIzNWFlZmIwZmZlMzQ3MTFiMmUxZGYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkVHJhbnNhY3Rpb25DYXB0dXJlVW5sb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjE1MjIzYjQwMmQ1YTVlNTQ5MjNmZDEwZmQ3MDc1MTNhZjc2NTJlNzIzYWU2MWUwNTFkNDRiMWQ1NzZlNDljZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uRGV0YWlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZTBlMTFlOWJiYzEyOGM0YWY1ZTk1Y2NlZTQ4NzdlMDdkM2ZkMjJlNjE1MGQ2NTQyY2EzMzJjNWQ1NjQ3NTBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9DYXJkVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVxdWVzdFJlamVjdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiZmIzMmJmMTU4OGZlYmU1MDQwODkyZjI1NzhiZTJkOGI3ODBhMjE3NGM0NTA2NjQwZDE2MmY5M2JiMWYwNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdTdGFydGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMTQ3NzI5ZGE3Nzg1Y2YzNzI2MjdkODIxYzAzODI4MDBkZDJiNWUwYTY0OTg4MjY2N2JmNjliOGExMjFjZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdTdG9wcGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3ZWE4OWQyNzcxMTMxNjZmMjhlODU4YjliNGIwM2VmNGE5NzI1ZDFkYTAxZjE1ZWU1YTRhOTE1NjhmYTYyYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NhcmRUcmFuc2FjdGlvblBheU5vdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjEwOGZlMjA4NjY4YmM3NDRhNDg3YjhmYTgyZGY0NjJiYmIwM2Q1NmNmMjI0YTYzYzEwYWNhNjBiNzRmYTkzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2FyZFRyYW5zYWN0aW9uUmVwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0YjMwZTc3ZmMxZmUwMjM1YThlNDE5YmMyOGZkZDUxODdiYTQ5NjFhMDMxZDhhOTJmNjhjZGFmYmY2NjU1MWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NoaWxkUGF5Tm90ZUlzc3VhbmNlRGVjbGluZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzBmZWJmODgwYTQzZWZiMjY1ZTAzMzZkODQyNzNiYzM2ZTcyZWUzYjQ2N2IxYjQ2NzRkNjIzZjk4MTg0ODgzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvQ2hpbGRQYXlOb3RlSXNzdWVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3OWEwMzIxOGQ0ZDdiMTUyNzZhMDhmYWNkZGFhNjgxZjRkMjIyOTExYmIzODRkZTNkY2FhMjRhMmU3YzJiN2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0NvbXBsZXRlUGF5bWVudFJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNGVlZTA2MmRlY2E5ZGExMzYyNjk5OThjYzBhNDE0ZTE0NDJkMmEzOTkzZjBlNjFmMjRjOGIzZDMwZGZmNTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9GaW5hbEFtb3VudFJlc29sdXRpb25SZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOWE5YTU5MzJmNjE3MTZlOTg4NzAwMTMzNGVlMGRlMzUzZjkzZGNmOGE4YTEwMzg0MWEzNWYwYWFmMDlhMjk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9GaW5hbEFtb3VudFJlc29sdXRpb25SZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDdiYzUyNmIzZWVmNDk1ODkzZWJmNjRmNGJkMGIyMDllODZjYmIyNjY2NDQwYTA0NTc1MzU1OGVkYzNhYmMzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvRmluYWxBbW91bnRSZXNvbHZlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjFkZWUyNDcxZjE2OTY1ZmViYjFmZThmMGU1MTRhZDgxNDE4YmE5MGRjYjNkODY3ZDgwYzk5MWQwMTZhZGYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9GdW5kc0NhcHR1cmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1ODgwNmRjZTdjZDM0NmFlMDBjNDhiM2Q3M2E2NmMyOTU0NmEyMDdkOTY5NmY0YWNkODk5OWUwNTI3MzJkMGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0Z1bmRzUmVzZXJ2ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmEyYzVkODk0MTgxZTNmODRmNWNjNjQwY2ZiNDJkOTNlNjAxODkwNzAzYjk2ODMzNTI2YTZlM2YzNjZkZDNiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvRnVuZHNTZWN1cmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImRlYWZjNzlkNDA4NGQ5NTk4Y2I4ZTRlYmVmNTI4NGMyOGEzOTg5ZDY5YTdhZDE0M2NiZDdmMGUwZjkyODk0ZmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0Z1bmRzU2VjdXJpbmdEZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjlmN2NkNjdmMWJmMTMyMGQyZmJkY2U5MGE4ODJmMDMyZTFmNTYyYjI4MmZkN2VkMGIxZWVjMThlNTczYjk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9GdW5kc1NlY3VyaW5nRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkMGVhNDllMDg1OGY4ZmQwOTZhODlmYmRkYjlhM2ExZGQzN2NmOWI3MmNhNTZhYWQyZmVhYjNhYTA1ZTM4NjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0lzc3VlQ2hpbGRQYXlOb3RlUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwNDIzOWJkNTExZmQ1ZjNlOGMxNWY4N2FkMzM1MjU2OWMxMzcxZWY4MzhjNWRhNDQ3ZjMzNjkzYWIzNGM4MDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0xpbmtlZENhcmRDaGFyZ2VBbmRDYXB0dXJlSW1tZWRpYXRlbHlSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzkxYzE5NGVlNGZhNzkwNDE3MTVhMzJkYjNhMGI4ZTVmYWFlMDBhYjAxYTIzNzY2YjM3YjcxMzdmNjdjODY3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvTGlua2VkQ2FyZENoYXJnZVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZWZmMWNmOTQ4ZTQ3NzE2MDg1NDViMTAyYTg1NTNkOWRlYWEzMDcxMTY1MmVmNWU3MzJkODRkZmI5NGY0MWU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9MaW5rZWRQYXlOb3RlU3RhcnRGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTRlZTcwYTA0MzlhMWVlYzhjMjU3OWQ3ODYxYzIxNzAzODlmNGM2ZTQ3NWZlYzM5YmQ0MmFmYmRjYjY0NDJmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvTGlua2VkUGF5Tm90ZVN0YXJ0UmVzcG9uZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1YjJhNDNmNjFiZmUwMjkzNGNmNjUxMmVlMTMwNjIxZDdlMTVhODIzMjlhMmEwNjQ2MTU1NTA2OTQyZDBjZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL0xpbmtlZFBheU5vdGVTdGFydGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjYzlkNWU1ZmMzOTg4OWFjMzJjNTQxYjg3ZjE5NThkMzM3ZjE2NGM4NjNiNGNlZGQ2MjE1NzFjMmE4NTRkZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL01lcmNoYW50VG9DdXN0b21lclBheU5vdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI0M2E3ZDIyZDRmNWVhNGQzOWI5ZTZhNmVlZTQxNTlkMzZiMDMzY2NkYTU0MGZmZGNkMWVjY2RiNTRhMGQwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5Tm90ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YzEwOTA0ZWFkNzZiZDE5Mzk0ODJiZDI4MTBlMjdhYzgxZmMyMGQ4ODhkNDI5ZDFjYTBlZjQ2ZDZmZGZiNTZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQWNjZXB0YW5jZVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDE4NDJlNWY2MWE4ZjZlYjAzOTVlODYzM2JhZWEzYmUzODQ4NjQxZjljZjVkZTE0YzNkZGM0NGZhZGRkOWZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQWNjZXB0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODA0YThiYmFhNzE1NmZmMjZmMjViYjU1NTczN2RhMDcwNWU0YjNiMTdiYWI5YzEzNWQ0ZTg2NDAyNmU3MTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQWNjZXB0ZWRCeUNsaWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMWJjNDRiMzZiMWFjMWJjMTRiNTE0OGFhODg4YmRkZDRhYmJhODlkZGFlZTlhYzk0YTgxYzMxOGYwMGEyNmZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQXBwcm92ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTkxYjJjOTdjY2FhMGQ5MmRiMzRhNTA5ODY0MjZhZjg0MmQyYTQyOWRmNmUzZmI2ZTc0MTg3OGY1MDdjZjZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQ2FuY2VsbGF0aW9uUmVqZWN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWEwZTljNjIyYWRkODg4OGE1NjBhYTRjNmFkM2U5ZTNkYjZmMmZiODhlMTcyMDU4ZTVhNzU1MjAyZDAzNTUwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5Tm90ZUNhbmNlbGxhdGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMjIyNjA3NTdmNGY0MDAxMzA5ODZkOTQ4YTA0ZGI4OTFhNzg0OTQ3NGRmNzU0NmU1ODBkNDFiMWEzZGJkYzE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlQ2FuY2VsbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0YTQ3NTZjYmQzMjM3ZGJkMzc5ODAzNzEyYTk5NzEwMzAxODU4OGJkZmZiMTdiZWY1MGNmNmRjYmI3OWZlZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVDbGllbnREZWNpc2lvbkRpc2NhcmRlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzlhMzUxMjdhNTdlY2FkNWY5ZTBlZGZjYTFkNWE1MGY3NTM4MjgwZjllNDUyMjNmZThlMTAyOTQ2YWE3MjJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlRGVsaXZlcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzY5N2VhNmVjMTAwOTNiOWUzYzFiZWFhZGRjM2VkZDFiYTNmNTY4Y2UzZjRjZTFiZTliZTkwNjA5YWNiZTcwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5Tm90ZURlbGl2ZXJ5RmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhNTEzNWY0MGM4Y2U2ODVlMDkwMTQxZDljZmY0OTJkM2E3MDBhMGIyYWFiMmEyOTIxYTQyYzMwNjY4MDNhMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheU5vdGVSZWplY3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNWE1YjVkMmRjYzhmYzFjMTczZDA0NmQzOWU5OTEwM2I1ODFhMjI1MDFhODEyYzQ3MGQxM2YwMDViNWM0NDFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXlOb3RlUmVqZWN0ZWRCeUNsaWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlY2Q4MWUxOGVlMmM5ODgyOTQ2MmY4MTQ5NTFkMGMyNDBlYTI3ODdlZTNhYTllNjU2NjNjMDFiYzQwNjdmODE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXllZUFzc2lnbm1lbnRDb25maXJtZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2ZhNWZiNTAxMjBjZTMwNTA4YmJkMTcwNTI2ODIzMTk5N2Q1ZTA0MmRkMTMzNDBhZTRiZDZhYjFkODYzNmQ2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5ZWVBc3NpZ25tZW50UmVqZWN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmZiYzIzNTA5YzIxMDYzNWFhZTllNDA4NjNmN2MzNGU0NDEwYTlhNDE4N2NhYWQ4YjM1NzIyMzI0OGQ0YWExYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5ZWVBc3NpZ25tZW50UmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBhMzM3Y2U2MGNjNGEyMTYwN2JkNTM0OThiMmE0OTRlMGMxMWJkYzE5NGJhZmRhMzQ3MDRmMGY1MjBhOTMyYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDYW5jZWxsYXRpb25EZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MjUwM2FmY2UzNjAzZTE3ZGVmZmQzYmQ0OGQ0YWRhMzEzMGMzN2Y0MWE5NDAwYmVkNzA3ODU4NmJhMzcyZmFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50Q2FuY2VsbGF0aW9uRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwODhlZmE1NTQxMzI1MzAwOTFlOWNmMWM4NjFhNjJlMjhiZjE4Y2Q0OGU1ODljMGM4ODdlMGQ4NmFlYmI5ZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDYW5jZWxsZWRCZWZvcmVDb21wbGV0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjZGFmZTBmZjY0ODlmMjFmMTZiOTk1MWEwMjk3ZDA1ZWUxYjFhMTg4NzJkZjQ3MWI2N2FjNjIwMzUzZWQxZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDb21wbGV0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE2MTY5Njg4NDdlODM1ZTZhODI5YjBmN2NlNGExOGM0OGNkZTQxMzIwYWRlODY4YWVhMmYyMGRlY2NlMWZhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENvbXBsZXRpb25EZWNsaW5lZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzk3ZDhkMmRkZjFkMjEyNTYzMzQzNmY5MDUwMTc4ODJmNjQxZjIwODM4NGE0ZDY4OGRmZThhNDM1NzRjNjRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50Q29tcGxldGlvbkZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNmE4YjlmOGE5ZDRkYTM0ZjdlODA3NDVjNzgwZDQ4MmI1YjdmZjk1ZmVjN2IyZTk3M2MxZjg3NWUxNmEzYzA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50Q29tcGxldGlvbkxvY2tDaGFuZ2VGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY0MDc1MDNlYWUwN2ZkMDc5ZmQ3YTE2MzRkYjRlN2VjMmEyNWZmY2M2NTE1NzkxNzg0Njk0ZTE1YTQ1MjY4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudENvbXBsZXRpb25Mb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwNDI5OTJjNTU3NzUwMThkZjE1N2U1NTUxODYzMzhmZTcyZjdiMWQyMTkzYTZmZDI0ZWU4NDQyM2JhNDBjMDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDb21wbGV0aW9uTG9ja2VkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhYmU3YTg5ZWEzM2YyYzk4MDc0Mjk3NzhmNWUyNTczMDQxNDU3ZmQyM2MzZDAzNjk0N2MxMDRmNGYxMTFhMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDb21wbGV0aW9uVW5sb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3NGUwOTQwMTBhMWRhOTZlZjdiOTc1ZDIzOTdlMTgzNWQ0YzQ1ZjYzMWViYzA0NmRmOTMzYTA4YWUzNDJlNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRDb21wbGV0aW9uVW5sb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYyYTdkZmZlN2Y0ZmZlNWY0YWE4ZmE2YTI3YjkwNmY0NjQ4ZTYzZDIyYzkxMmJlZTlhZjVjYWYzMWUxYTdmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudE1hbmRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGY0YzEyZWRlNWUzZjE1NjRkZjc5Yjk1ZWVkYzI4MjljYTliNTczZTU4NjQ3MzI3M2ZkYTkwNTZkNjBkODAwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudE1hbmRhdGVBdHRhY2hlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOWZlMzg5ZGYwZTgxZDg4NTJmMDcwMTJiOWU0ZTNjNzI5YzBlZTcxYjIzZjA0M2I0NTAwN2MyNzVlN2E5NjJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50TWFuZGF0ZUF0dGFjaG1lbnRGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGYyNTRjMWFmNmIwZWY5NDQxYTkwMTE5ZjAwZWM0YTZmNTRmOWU4MTRmZTQzNmNlYzAxNDBkZTc0MTc5ODU0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudE1hbmRhdGVTcGVuZEF1dGhvcml6YXRpb25SZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzA2OWJkYWExNjVhMGI0YmE1ZDc5YzFkNWFhZmNhMGI1NmQ0YmYzMDk1ZTgxMmNmNGEzN2RjOGM4YjJiNzczNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudE1hbmRhdGVTcGVuZEF1dGhvcml6YXRpb25SZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTRkMzY2ODlmZmU1NjIxZGFlNDM5Njg1ZGUyM2U4YWNmZmM3ZTQ5MzU1MzE2MGEzMWM4MTk2ZmZkNjU3MWU1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudE1hbmRhdGVTcGVuZFNldHRsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgwMjdkNTUzYjA5MTNjODhjZDU3ZThiY2Y2MzBkNGM0YzdlMGUxODBjMzgyOGY5NDQxYzMzYjlmZWVmNGJmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudE1hbmRhdGVTcGVuZFNldHRsZW1lbnRSZXNwb25kZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJmMDFhYjhhMDI2ZTkxNmUwNjhmODJiOTgwMWQ4YTkzMjgyODA2OWZmYjliMWJmZDcwMTZhNzI1MmIzMTZmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2FsRGVjbGluZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI0MTMzNmI0MDMxMjE5YWNjNWIxZDQzNjlkZWMwYmIwMWZjMDVlMjMwYjU3Yzg2ZjJlYmZhZTcwM2VhZGYzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2FsRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNGNjYzMxNjA4YjQzMzRiY2VmZWQxNDcyOWE5MzdmMDhhZDExZDgwYzU5M2YwMzAxMzM0YjA1NTRkNzRkYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRSZXZlcnNhbExvY2tDaGFuZ2VGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjA5YzhhNTEyNjc4NjY2YTMwYjI1MmUzNWQxZjBkZWZiMzc3YmYzZGM3MGU0OTczZTMxN2E2YmEyOGM0Y2EyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2FsTG9ja1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OWU3Mjk3MDFkMTRhMmRlNDhjZDc1YWQ4YWQyZTE5MmY5OWYwNGFhOWZiMDk1NTkzZWY4ZDUwNDBlMjVjNTM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9QYXltZW50UmV2ZXJzYWxMb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGNkOTFkZmM0ZjdiNjg4MjdmYmJlM2I5ZjU2ZjI4NDIzOGIwOWVkNGI1OTgzNzQ5ZDYxNzhjNWY4ZTY0ODllYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUGF5bWVudFJldmVyc2FsVW5sb2NrUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3MmYxY2M1NWY5MmViMGVhOGMyNTFlYzUxMDhhMmYwMWI4MmU1Zjc5MzIwZWVkMjJkMDJmMmY5NTIxNmRkMWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRSZXZlcnNhbFVubG9ja2VkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ1NzljYTQ3Y2E2MDFlYTZhMjdkYWU5YWQ2Mzk4YTRkZTc4YWNmOTgzNjE1YzU5ZGZjOTQ4NWRkZTBkNjc0MzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1BheW1lbnRSZXZlcnNlZEFmdGVyQ29tcGxldGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTU5ODNiMTZhM2E1ZjdmM2MyNzZmZjFkYmI5ZTU4ZmI3MjgzMzM0MGZmOWRlYmQ0NGU0Y2YwOTY1ZDExOTE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9SZXNlcnZhdGlvbkRlY2xpbmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ4Yzg2Yjc2NTc2ZWJiNmRkMWZkNjY4NzUyYzM1YmU2NTllYzljNzQyMjYyNzI4MTc0Zjc5NzJjMmI2Yjg0YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1Jlc2VydmF0aW9uUmVsZWFzZURlY2xpbmVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhOWEzNTllYTYyY2RkNjZkN2IwYzE4YTA2ZWI5MmQ5YTAyN2JjYWM1ODA0ODE4OWRlMjAwYjRjZDljNzgyNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1Jlc2VydmF0aW9uUmVsZWFzZVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGRjMGViNzBiN2I0YmFjNjc3MjFmMzM0MmM1NDJhYjE1MzAxMjA0MDQxY2NiZmM5MzNjMTlkYzNjZGU2MjAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9SZXNlcnZhdGlvblJlbGVhc2VkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxZGJjMWNlOWM5NWFmMWE5ZTllYTkxMDk4MDY0NjI3MWQ3YzVmMWNmN2UxYzBhODE0NjQ0MzdhMThkZTg5MzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1Jlc2VydmVGdW5kc0FuZENhcHR1cmVJbW1lZGlhdGVseVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzI1NTQzODdkYTNjY2RlODBiZjBlZWNjZGJmYTVkOWQwNWVlMzZmNThhNDQ5ZDc5MWZmNzI4ZjRmNTFkMzdjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9SZXNlcnZlRnVuZHNSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWIzNDRkNjRhYTU1OGI0ZjUzMDc4NjgwMzRhYTMwYjI2ODI1M2IzYzU5NjJhMjY4OWUwNDAxNTUyYTZmMmMzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvUmV2ZXJzZUFmdGVyQ29tcGxldGlvblJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlN2VjODBjNTFlYWFiNjJkMThjZDc1ZGRlMmYyMmJhY2EzYWVkMWQyYjA2ODZkN2QzNmMzYmUwOWEzZDZmMjZkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9SZXZlcnNlQ2FyZENoYXJnZUFuZENhcHR1cmVJbW1lZGlhdGVseVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODYwZTlmMmQ2YWM0MTAxZTZjZGFmMDZiYzA0YzQ4MzA0YzczMzg0MWQ5ZTU1MzU1NjAzOThhMDE1Yzk4ZmNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9SZXZlcnNlQ2FyZENoYXJnZVJlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzlmYWE5ZjU2MjQzMjVhZDFkZDI5M2EzOWE1OTA0MDczNDVlN2FkOTU3MWIyNmU5NTQ3OTZjOGQxYTRkNDM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9TZWN1cmVGdW5kc1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMWIzMmI1OTNiYTZmNjA2ODRiODY2MTQyMGJkNzVmMjQwOWIyOTQyOTUzZmM0NjFhOWJmNjJjMzVhN2U1M2NjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9TZXR0bGVtZW50QW1vdW50UmVqZWN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmViZDQ3N2Q0YTQwNzY0YmI2YTFmZmI1NTRjYzRhNmM3ODlhMjg5YzcxOTEwZTJiY2ZhNjgwZWI1NDA2YzY0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvU2V0dGxlbWVudEFtb3VudFNwZWNpZmllZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2M2ODQ1MWUzZTVmZDZhMDllYzA5MzcxODM5MDA1OWJkNmU0NjUxNmM1MjQyOWQwOTk2NDQ1MzNmNmIxOGM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9TdGFydENhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXF1ZXN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGU1NjUzNWJjODg0MGY1NDZiNTBmNDVlZDI2MTBkN2JiNzQ0YjVlNjU0N2FhMWM2ODRhYWFmOTM3Njk4NGNjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlRmFpbGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0ZjAzNzA0NGQyODFiMzMyZGYzMTFmMTg3MGNjMjFhOGQ1MDU5YTE2NGM2ZjE2YzM5ZjA4MmE2ZjYxMGNjOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZUxvY2tDaGFuZ2VGYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGI0ZjRlM2I3MGM5ZmJiM2FiYjIwZThiYmZiNGEwZTAzNmQ0NDlmNTcwNjQ3ZTM1MjFhYjUwMmU4NzRiZTBjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlTG9ja1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NDU5YWVjYzlkMGNmZjU5MDliNjlkZGYwNGJiMDJhMDk1YTczMGU4NTg5OTE3NjlmMDg0OWZkOTk4NzczZDBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVMb2NrZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDgwNzdmYzliMDJkZmUyYzJlNTM4YTk1NGEyNmIwNzNjMzJkMTIxOWMyMDRiNTNiMzBjYWM1ZDg0MjJiYTM4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlUmVqZWN0ZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDljMTlhZmE1MzMwNzhlZGRjNWM0NmNiNmI3YjcxMWMwZjYyNjc1NjQ1NTIxMzRhZjg4ZDZkOTQ3YWU0OTFkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlUmVxdWVzdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyYjBkYWY4Y2Q0ODhjOGQxODIyOTQzMjE4NTgwYWFiYzc0ZGExNWQzZGQzNDViMDA4YjE2ODQ4YjE5NDljM2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZVVubG9ja1JlcXVlc3RlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTUwNzIyMWEyYzRlNGFiMDJkMmI5MzU0MWQzZjM5ODUxN2E3YWUwMDA4ZjY2ZTgyMjc0NjgzNTM4Njg1MGU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVVbmxvY2tlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OGRjMmEzMTFmMDc4Y2UzNWI3MDdkZmVlZTMzMThlYjVhZGExZGE5ZmMzNDJjMmZhOWFlNTJiZjVmYmRkNzI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0MjIxZDkyMjY0NjE0NWZmMTA3Njc0MjZhMzY1ZTA4NWMxOGQ4OGQ2ODMyNWExZjMwYjM2ODRlMjY4ZDI0ZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uSWRlbnRpZmljYXRpb25GYWlsZWQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjU2OTA0NDBkNWMxM2YyZDQ5M2MwMGU0NGRjYjdhYTg2NzM3NTMxY2E5NDliODZiNWJmMTI0YTMxNzJjMGVlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3BheW5vdGUvVHJhbnNhY3Rpb25JZGVudGlmaWVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0NTk5NjhkOWU2NzMzY2FhNjgxMGUxMTcyOTU3MjgzN2FhZDhjNjQ4YWJmZGQ5N2Q4MGI2OGZlMmRkNzhjYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uSW5pdGlhdGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImJlNmI3MWVlZmNmOWRkZmI4N2JmODM4N2MwNGM4Y2U5NDY4MWQwOWVjYWFmNWI1MTc5ZTYwNGY2OWVkNTlkODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9wYXlub3RlL1RyYW5zYWN0aW9uSW5pdGlhdGlvbkZhaWxlZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDJhN2JkNjBhYWVjMmU4ZjBmYWM0ZmRmZDEzOTY5YTEzYTVkOWQ1ZTk0NDE4NzRhZjcxZmY0MjAxZmZlYTk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcGF5bm90ZS9UcmFuc2FjdGlvblN0YXR1cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZTI1MTNmZDkyNGVhZTJlMTM1ZDNkZWMzZWExODMwN2E0ODA3YjY2YjRmZDU0ZGNlNWMzYWNhNDY2ZjI4Nzk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vcHJvdmlkZXIvQ29tcG9zaXRlTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmExZGUxNzk2MTdiNzMzYjc0M2U2Y2ViOTBjN2VjYjM4MWY2NDI5NjNmZDVjMjczZjRlZDYwZDA1YTNkMDAzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3Byb3ZpZGVyL1JlcG9zaXRvcnlOb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTg3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxNmE2MDRlY2ViOTRlYzg4YzU1YzBhMDRmN2Y4M2MwM2UxNjYwNjBhODQzM2U2Y2E2ZmQwYmE2ZTBlY2Y3MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby9zZXNzaW9uaW50ZXJhY3Rpb24vRG9jdW1lbnRTZXNzaW9uUmVmZXJlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwZTQzNGFiY2UwZjIzMjI2OGJlMDcxYzRkMTZiMzEwNmQ1YWZiNWM5NDMwMWY5NDM2MGQyMmFmMDU0NjRkZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby90eXBlcy9Cb290c3RyYXBUeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWZlZTE2Y2E4MGU3YzRiYTQ2YWJlMTA4NzRjMGNiYTdkNTMxMTc4ODVhZGFjNDQ1OWQ5NzNmNDk3ZmVkOWFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vdHlwZXMvQ29tbW9uVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzcwZmNiNzZlODFkZTJiMjhmNjY1ZmY4OWJhOWQ1MzE1YjA5ZWFmZjEzNGJjYTZhZTRmMDA3ZjE3ZTk1NjE2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL0Nvb3JkaW5hdGlvblR5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzM4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkMTc1YjMyZTljZWExNTIxYTI2Nzc5MzliMzJiMWI4YTUwZTQ0YTY0ZDhlYmQyMzdlMWJiYjM1NmFmNWNiZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby90eXBlcy9GSU5PU0NETTYwZDA3VHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODMwNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTViZDVmNDI4OTNkMWRmNWFiMjE0NDExODJhMTMxNTY2MzViNTFlNmNiNDU4NWVlM2FkNjZjYzJmNDAwMDI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vdHlwZXMvTWFuZGF0ZVR5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzNmY1MDQ1N2VhYTg1ZTBlMmNmZjM2MWExMGRlZWUyNTNkNTEyNzIyY2YxYWJmMTg4YjFlNDc3OWE1NWVkOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby90eXBlcy9NeU9TVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjRhYjU0MTgyZjUyZWQxODY1N2JlMzMyZjBhM2JlZmY3OGNiMjhjMzY3ODVlOWIxNDJkMjkwMTZlYmFmMzA1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL1BheU5vdGVUeXBlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFlNzlkNWY4MjFhMWMxYjcyOTlhNGIzYjM2MDY4MTliMDBmNTc5YmJhZWFhYjNjMTA2ZWUxMjc4ZjFjMTVmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL1Nlc3Npb25JbnRlcmFjdGlvblR5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmZhOGIyMzcyMGM5MzdmNDRiY2Y2NGExZmZkM2YwOGFiYzA1NTg2ZTBiODZkMTY5YzRmMjdmZTNmYTFjMjdiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3R5cGVzL1dvcmtmbG93c1R5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyOGVlMjlkZTQ0MmUzOTc5OTQ1ZjVjNGMzZGVjYjgzZmE5MGI0NGQxNThhMDViZTIyYzg3N2FjODM3YjRjNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvQWNjZXB0Q2hhbmdlT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmYzU1MTRkNjk4ZDc4MjBhNzRhOGJjMGMwZWNlMjNlZDM2ZWUxMTY1MTk4YjU3MjllZjZkYWYxM2NhN2UwYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvQWNjZXB0Q2hhbmdlV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODFmZmRkN2IwMjRlMjQxNjVjMTgwZDY1MGYxMDQ0OGUzNDk2ZDVjNmVkNjY0NGI2ZTgxMjE0NGNjY2E1OTE3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9DaGFuZ2VPcGVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjNmZWUzNWM5ZDQzMTRkNzU5NTJmNzY3MzUzYzI0NTg4NjE4YTRmMTJkM2MzMjhjOTNiYTBlMWM1NmJiNGU3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9DaGFuZ2VSZXF1ZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyMDJiMzk2OWNlM2Y0YzJhOWY2OTY0NjcwZGE1NTNmODIyNWZjMWQxOGIyNWQ0NGUxOTU3MDE1OTgzZTQzYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvQ2hhbmdlV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDQ0MjNmNGU5YTcwZTdkNTYyOGYxNDk0YzViZTBmMWFkNDlmZTEwZDZjM2NhZDU1MWE0MDY4OWQzNWJjYWNhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9Db250cmFjdHNDaGFuZ2VQb2xpY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWI2Y2VjZTQ4NjViN2JlODViNDBlMGI5MjFkYzY4MmVhNmJlN2Y1YTk2ZGRmN2M3ODA2MzU3Y2ZkNDU0NTczNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9DdXN0b21lckNvbnNlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA0NDRhNmI4YTk5YTQyNGQ4MDg2YWU2ZDMwZWQ0YTg1ZGVjMDlmNzQ4NmZiODkyMWM4NWRkMDI0YmY0Y2JjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9Eb2N1bWVudFNlY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc5ZmVmMmRkNTMxNmM4N2IzYzQxMjAyMjYyOWViZDU1ZDI0OGViZjc1NzM2OGUzYzk3ZTZkZTVkYzgzYTA5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9Eb2N1bWVudFNlY3Rpb25DaGFuZ2VFbnRyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2VlOTk5N2ZjYzMzZWE3ZjA0NjEzOTM5OWFlYzMzYWIxOGVlYWViNWE4MTU5MDJmNzczNTllNmIzOTUwODA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vamF2YS9ibHVlL3JlcG8vd29ya2Zsb3dzL0RvY3VtZW50U2VjdGlvbkNoYW5nZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjIyNTM5OWNlOTk2YzhlMGQzM2I4NzcxYmU1M2I1N2NlNDM1NWMwNzc3ODBiNGNjODlmZTBmNmVmMDJhNzBkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL2phdmEvYmx1ZS9yZXBvL3dvcmtmbG93cy9Qcm9wb3NlQ2hhbmdlT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNmYmYyYmE2YjEwMWQ3ZmViMmU1ZjNlY2Q4NWI4NDY1Zjg3NjY2ZDFiNzZjOGQ3NjQ2NjZiNDI0ZTM5NmRlYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvUHJvcG9zZUNoYW5nZVdvcmtmbG93LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImFhNTQ0NDhiNjFjMjYwN2M2OTQyMDEzNmJmZGYxZDRhYmY2NzQ4OWRjMGNhODBlNWEzYTc0YWRhNWI1M2ViOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvUHJvcG9zZWRDaGFuZ2VJbnZhbGlkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMyYjcxMDg4ZDg5NGJjZjZlNzAxM2YzODQ5ZGUyOGUzMTdjYzQ0YjM1ZDkyMGJlZGM2Mjg4ZDFlMzg1ZDUzNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvUmVqZWN0Q2hhbmdlT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyOWJjOTI1NzQxZGU0ZWYzZDRkY2ViMDNiN2M5ZWZiNzRhZTZkM2IzYThjZGE3MTZlNzAxNmM2YmNhZmM0NjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9qYXZhL2JsdWUvcmVwby93b3JrZmxvd3MvUmVqZWN0Q2hhbmdlV29ya2Zsb3cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVhZjI5YmQ2MTc4ZGM4N2UwZmMzMGJlMWE5Njg3MjUxODE5ZjYyZWI2MzhlZmUzNzlkMGRjYWNiNDg1ZmU3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vQmx1ZVJlcG9zaXRvcnkuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTIzNjM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI3Nzc5ZDZhODQ4ZjBmZTg5YTk2ZjU4YjY1Mzc3MjYyZDA2MGYzMzU1MzY4OWM4YzlhOTVjZWI4M2RhODBjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQm9vdHN0cmFwL0RvY3VtZW50Qm9vdHN0cmFwLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZTU4ZTFkZDRkZGVkZjUyYzViODMwYzhiZjhkZjg5Y2QxMTcxOGM5MTczOWJlNjdjZDgxYWZmNGUxYjlhZWI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Cb290c3RyYXAvRG9jdW1lbnRCb290c3RyYXBDb21wbGV0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZGU3YjE2ZGJmNmM1NzQ2OWJiOWM2MDE2ODE0NTMwNTgzMjQ1ZGQ1ZDI5MjZmYTNkY2M2NDcxZjY1OWQzMzRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Cb290c3RyYXAvRG9jdW1lbnRCb290c3RyYXBEZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmNWZmNmIzMmJjODYwZmM5ZTFjM2U3ZDVkZGQyMzQwM2NlM2UyMDYzMDdlNWYxOGJiNWMwNDVjMjZkMDczYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcEZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiMDEyZDA5YjNkMjM1YjMyNDQ5NzkxOTg4ZmU0Yjk2YTFiOTE0MDU1MjIxMzcwMjRmNzgzYWY0NGJiYzk0OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Jvb3RzdHJhcC9Eb2N1bWVudEJvb3RzdHJhcEluUHJvZ3Jlc3MuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNjk5MTBlOTI2YTExMDk5YWVjNDdiZmNmZjM4OTJkOWJlMGVhYTllMTQ1MjI0NjZlZjMzM2E0NWYxYTU4ODY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Cb290c3RyYXAvRG9jdW1lbnRCb290c3RyYXBSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWFhNjI5ODliNmYyYWNhMWMxNDJlYmUwOGMyZDI1ODg1NDgwMGU2NjE3OWEzNDMyZjUxYjgyYjhmNWFkMWZhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQm9vdHN0cmFwL1BhcnRpY2lwYW50TWFwcGluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiMjZhN2ZiY2ZhNWEyN2MzNmQ5NjlkMzY4NjZiZTlhMWEyZTI2NGIzOTYzNTllNjEyMWNmM2NhNTdhNGVmMjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9DcnlwdG9FZDI1NTE5VmVyaWZ5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzhiOWZiZjMxNjI0YWE5NGQ1Y2I4OWUyZDgwZmJkZDA3NmU4NDdlOTc0ZGVhYzk2N2QzMjYzM2I5YmUyM2M4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL0N1cnJlbmN5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGI1OWM2ODM4MjJjNDkxNGIzMDQ3ZjM0MWIzNmNlZDQzMDRmYTY2NzdmNDAwZDkzMWUxMGNmMmViYjEwZDY2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL0RvY3VtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmIyYTI4YjA0MDdjNjFiNzUzYzdmODY3ODZiOGFlMWMyNDgxNTc1YjRmZGViNWI0ZTg1YmU0OWNiMTAxNjNmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL05hbWVkRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTcyMWExZDY1MTIwMTQ5NzBkYWU4ZjNmNjk5MzBjZGRmMGU2OWI1MDg5ZThjZjg4NjJjNzY3M2Y1OTY4OGExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vUGF5bWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlMTFhYWM5ZTBlZTg3YjAzNjc1MzU1MGQ3NzAwYjRjYzM2ZTBkY2I3MzIzOWRkNzcxYWVlOTEzMTg4Zjk1NGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9Qcm9maWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDY0MjZhNjU2NzBkNzEwMjA4NDZhMzAzNjgzNmE1ZGYxMzEyM2ZlMmZmZDJmOGMwMmE0M2Y4MjhkZGJmMGY3MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1JlY29yZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImM5ODFiYWE1MDY3YWE4MzdhMzczOTkxODQzNGIxZTc1OTNhYTQ5MmU1ZjIyOGVhNzhjNTYyMTZmOTBlMTUxNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9SZWxhdGlvbnNoaXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDgyODQ1OGJmOTYxNWNmYjg4ZmI1ZGE1YzY1NmNmZmE0OTlhMGNkYjc1ZDY5M2NlMzQzNTg1MWRhNjk2OTdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vUmVxdWVzdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjODFkZjNiNTI4ODkwMmZkZGNjMjU2ZjRkOThlOGE1MTM1MjBmZGM0YmZjMTUzNDQyOTgyNzJmOGEwMjBmMDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9SZXNwb25zZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4ZmE2ZGU4Nzk2YjMxN2U3NmFmOGZhNGE0NDE3YTk0ZDBiZjAwZDhkNjdkMGY5YjMwOGFjZDRlMDliYWUzOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0NvbW1vbi9TZXJ2aWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTgwODAzOTdjOTM1NTlhNTkwOGI0MDE3N2Q0MzY1OGI0ZDQ5NzdiNTUyN2RmYThhNTg5NmNjZTg5YWMxNDcwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1NwYWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODdjZGIyNzEyNjI5ZDMyMDhhZGRlYzc0YjIwZDYzZDNmOGY1NzQ5OTJkOWZmMWZlNGQwNTY4MjRiMjhkNWUzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29tbW9uL1Rhc2suanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzJiYzJjNGZhMTM1OWYyNzdkNzY2Y2QxZjY0ZmRhMWEwNThlNWM0ZGI1OWQ3MDU0MWZmNjI2NWQ3YWE1MWVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db21tb24vVGltZXN0YW1wLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDc5Zjk1ZTg1MTA0YjMxYThmMDJjNjhmY2RkYTVmODc4Y2Y2N2JjNDRjNzdmMDE3YjBlZThkMTM3YWVmYzE0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0FQSUNhbGwuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTc4NmFmZWVkNmJkMzAyOWM5NmY5NWQ2YTAwMWQ4OGZkYjI4YTE2MDMwODgyZTQ4MDI3NDJiMWQzZDA5NDg5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0FjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwZjBmYTZmOTM1MDE4N2FhNjBiNGRkNDYzMzkzOWRkZjA2ZGJhYTY2ZTU1MGU3YTI1YWRkZmFlZTMyMTdjNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9BY3RvclBvbGljeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZTEyZDdiY2RjMzhhMjVkM2IxNGQwMGY2ZjUwNDM3MzliZTEwODM0MmRiNzA0MzU5YmEwZDUyNWVhYTQ0NmNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQWdlbnRBY3Rvci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOTc4ZGFkZjM4ZWJhMzMzYzg0NDlhOTBlMzI0ZDRhZTY4NWJmNmE0MTVjOGY1NTU2NDQ0YTg5ZTg2NzdjYmRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQWxsVGltZWxpbmVzQ2hhbm5lbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMmNmZjVjYjYwNmU1ZjRjZDJhZDY1ZjNiMTE0OTE2YWQ5OTFmMzZkOWYxNmIwOTBkNDhiYjY5NTM3MjIxYTgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQXV0aG9yaXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGU1NjE4OWExYzQ1ODVmNThiM2IyYWFhOGEzMGE0OTkxOTg1YzhhMDlhYTBjNGFkYTZiNGQzODNhNDIzOGU0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0Jyb3dzZXJTZXNzaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjYjc4YjM2OTljYmM5MDQ1ZDhmZGRjYzQyN2JlZDAwYjE4OTMwYTk2NzAxYjllNDVmZDIzZjg1YWMyMDg3MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9DaGF0TWVzc2FnZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImM4ZThmOGZkOTA5OGI5YTU3MzllYWJhMWUxNmVmNTc3ZDMxODBlMTk3N2I3M2EyMTg5ZTNmNjJiNDE3OGZjMGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9DaGF0V29ya2Zsb3dPcGVyYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNiMGFiOTYwZWE1YTRlYjI1NjYwNTE2NzIxM2QzNzk2YWRkMjRhZWE2NmUwN2VlZjkxNmVkMGNhNWIwYmY3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0NvbXBvc2l0ZVRpbWVsaW5lQ2hhbm5lbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2E2YTMxYmZkOWE4ZTZlNDVjNzA1YjI0ZGUwYjNjOGI5NzE2NWRiZWE5NTdkZDZiMWRmMzRhZWNhMzE3MDMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQ29tcHV0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2QyNDY1ZTZmN2VlODIxY2M3MTgyMGQ1OTNjNjBjNDZkZTkwZmRmMDE0MWEwZDhkOTRmMmNlYmQ4ZWY5ZmMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQ29tcHV0ZURlZmluaXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmMyNDNmMjdiYjBlMzIxOTg0ZWNmZjZhYjhhYWRiZmQ0Y2MxNmQ2MGJlNWZkY2ZiNDU1NzRjMTE0ZjU4MTA0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0N1c3RvbWVyQWN0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiODQxZTExZjQ4MzVjYmY2NzdlN2E1ZmJkYWQxNDQ2ODllMzA3MDAyOWVmOGUzZmZkZjE3ZTNkYjQwNzdkYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9DdXN0b21lckFjdGlvblJlc3BvbmRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTE2ODc2YzM5MjlkODIyODA5OWNkZWUzMjgxNGE3ZDM1NzZlODg4MjAwYWZkM2EwMTBkMTFmOTc4ZGZkMGRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vQ3VzdG9tZXJDb25zZW50UmV2b2tlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTE5MGU4Yzc5ZWEzMjU0YThiNmU0NTMzMjg4NGVhNzM4ZDFiZmFkNjJkYTU2MGVlNjBlNjE1Y2JjZGQwNjMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRBbmNob3IuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDlhZGMxMjAwMTEyNjgxODNmMzAwMWI1ZTVjZGIxOTNlYTYzMzRlZjhjZjY2NjBjYWUwNzZhYzRlZGZjMzFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRBbmNob3JzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWEzZTE4ZmVmYTkyMjU0MDVkOTJiZjM1YzJhZThmMTljMmM2ZmQzNzMzMjIwZjg3OTBjZDIxNWIyOGZlMDVlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0RvY3VtZW50Qm9vdHN0cmFwQ29tcGxldGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQwNjE0OWU3NmExZGE5YTI3ZTc5OTc0MTg5ODJkZDc3MDJiNmRkNjMyNjZlNzAzMmJlNTE4Yjk0ZGQ3YTlkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0RvY3VtZW50Qm9vdHN0cmFwRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjk2MTA0OGU2MDAzM2I5MjRjZDdhYTkzZTc0ZDZiYTgxNWY4NzRhMzRjODJlMTI0MWVjYWUzNjRiODNhZmE4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0RvY3VtZW50Qm9vdHN0cmFwUmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTExMTJhMTU3NjUzNjdhODU0YWY2NzZhYTQ4MzcxYTdmYTg0NWIzZDVkZDdkZWUxMmY1YjUwNmJlYWFiYWViZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0RvY3VtZW50TGluay5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMGFmYzZmNThhMTVjMWUzMzMxMzA4ODZjMWZlY2JkMDA1YjY1NjE1ZGJhNjY0ZjU4ZWMxN2E2ZGMwMDA3NjYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vRG9jdW1lbnRMaW5rcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlNTI4OTc3NmY1NmY3MjVjN2JkMGRjOTI4N2RkZDNkMDljNjZhZGE4ZGZmY2FjZjgxOTc1NjIyZmUyZWVkMGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9Eb2N1bWVudFJlcXVlc3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjViZDIwZDUwNDk4NDA2ODdiY2IxZTU3MmNiOTkxYzE4MGUwOGJjNzdhZTU0Y2FiMjc0NTgxNjQxZWI4MzRmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0RvY3VtZW50U3RhdHVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODMyODgyOGYzNDJlMjVmYmQxYWE3MjI1NjRmZjI5ZWE2NjQxMzI4NTBhMjU0YThhY2FjYTZlYTI2NDM0NmVjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0V2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2RhM2VkMmEwODExYTViMDExOGEyZDQzZmE3MmEwODk2MTIzNmUxMzJlMzdmYzg2NWM2N2FhZTE1MmYwOTM3ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0luZm9ybVVzZXJBYm91dFBlbmRpbmdBY3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdkMjk5NGNjMWQzODExNDg5NzA3ZTBkZDNlMGYyM2IwM2Q4ZDM1YWQ1MzhhODRlMGJjYTE5NjlhYjQ5YmU0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL0xpZmVjeWNsZUV2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDViZTY1NWY2YzY1ZGViYWEwYzU0MjU1MDBkMTQwOWUyNjJhZmRjMmJhMjgxNDE1MjY5N2YwMTIwOGNlZGQyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL01lc3NhZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGI0ZTcyZDU2MThiZjQyZDExOTZkNGRkYWM0Y2NlZTQ3NGJmYWI1NmFhMzdhNTdhMTBmNTVkZDNiZWFhMjg2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL09wZXJhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZGNmYzljZjUzZjdmNjczNzY3NGZhNzJhYWNlNmNkMzY2M2Q4NTRmNDY0NjQzMDI2OTRlZGNjZThlNTQ0NzI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vT3BlcmF0aW9uUmVxdWVzdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OTc2M2YxZmU1Y2E1OGQwYjQxMjVlOGQwZTI4YTNhODZmYjQwYWJjNGJkYzgwNTA4YTcwMWRkNzQ1YTkyZDM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vUGFydGljaXBhbnRQdXJwb3NlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTNkZWU2YzQwNDhhYjQwMDVkYjI0YzI3NTBjZDA4MjcyOTA1YWYwMDI2MzIwOTU2OGQ1YWQ1MTVkMzcyZjU5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1ByaW5jaXBhbEFjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjODIxNTVjOTA2MDY2ZDJjNWYyOWYxMTU1Y2U5ZTkzZDlkMmUwNWNkNzA5Y2U4YTI5ZDhjYjJiZmUyOTUyMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9QdXJwb3NlU3RhdGVtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4NTM3N2ViZDE4ZGMwYjI2NGZjOTg5YWVhNzNiMTkzODE2MzhmOTBiZjE4NTE5OWY5M2IwMzY1ZTRiMWVjZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9SZXF1ZXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGNjZTE0ZWQyMjZmYTU3MTljNDcxY2Q1MzE3MTAxYmExMjM2ZTg4ODI5MmNhYTg1YjlhZGU5NTZmOTIwZTE5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1Jlc3BvbnNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFlNDZkMTVkOWZkODgyN2Y5OGQyZmZkMjc5OTgxZTE1MzUxNjhlNTVkOTI5MThlODFhZWE4ODVjNWFjNGIzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1NlcXVlbnRpYWxXb3JrZmxvdy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODE5YjczNDY1ZDM5ZmNmMzM3YWZiM2M3M2MyNmY3NjJjYWY2YTQxNDIwMjVmOWE3OWVlNDE4ZjQ1NGMwODA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU2VxdWVudGlhbFdvcmtmbG93T3BlcmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxYTVkN2U1MWY4MjY2ODE0YTBmMTgwNjM3NThmNzk2MWUyNjIyMTYzMzYwOWEwMjM1MGFlNmFjMjc0MDhhMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TZXF1ZW50aWFsV29ya2Zsb3dTdGVwLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmQwYzhiNTQ4NjUwNzFjYjNkZThlNWU3YTQyODk4MDYxNTA5MjIxNDdlYzhlZTA4MzE3ZGRkOTcxYjM4M2JmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1NvdXJjZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2E4NzMxODhhNDJjYmFiNThhNzczYjllNGI3NzY0ZWRlMzExN2JiN2Q1NzYzMGRjYmVmNGQ3NjMxNDc0MWRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU3RhdHVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWU4MjE4ZDZhMDJiZjIzYjRlMWI1YzYxMDM1MTA3NDhkZTU3ZTRjMDM1ZWIxYzRmMzZmYWY5MjdiMThkZGE3MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1N0YXR1c0NoYW5nZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiMzAxZjk3YTgzYzIyMTI5M2M2ZjI2MGQ0NmVlNGQwYmM2MWMzNzY3ZTgyNzVjZjdjOWQ1NjUwZmZlMWY1NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9TdGF0dXNDb21wbGV0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTkxNjk1OTVhZGI1NDFiMzgwNjZiMDg4MDRjZjU5ZWFkOTMwYmQyZDdiNWYyZTRkMzdhZjY3MWIyNzdhODU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU3RhdHVzRGVjbGluZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZmU0OWRiMDBmZjIwZjkwYTBmZjEyZGJiNjU2MWZiMjVkMTk1YzRhMzA5ODc0OWJhMWMzYTI0MTk5ZmUyMWJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU3RhdHVzRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc5YThmNGVhOWEwYTlkOTQyMmQyZmI2NDA5N2QyYmE2ZjBiOTdkNzIyZGNkOWRhNDU4OTk2OTY1ZjRhMDA0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1N0YXR1c0luUHJvZ3Jlc3MuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDJmNDg0ZmZiODljOGQ0MWVmYTA2NThlYWQ0YTMzMDdmM2Q1NmZiYTlmY2IzODI0NWIyZjc2NWJiYzUwYWJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vU3RhdHVzUGVuZGluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzOGQ4MGUxMDJiNGJjOTQxMDU5YzFhZmM5YmJmYjhmMzFmNmNlMjE5NDYwNDc1MzY0YjgzMDQ4YWNhYzgwMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9UZXJtaW5hdGVQcm9jZXNzaW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyOGIxODNkMTJkNTQ1ZDg0NTNhNWEwZTIzMjUxYzQxZTViMDIxNDI2ZGMxMWEyOGU0YTBjNmRlMjE3YjVkZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9UaW1lbGluZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ODhlYjYyMzg1NGU5MjljYmQwZmM4Y2FlNDc3NDg1YjhiODhiNmIxNTJkNGEwODRhZWM3ZjI3ZjA1ZGRmMGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Db29yZGluYXRpb24vVGltZWxpbmVDaGFubmVsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiYjdiOWNiMjA1MjAyM2Q1MWJjOTNiZWZhZDM5MGY0YzcyNjYzYTQyOTJiYmJkOTM5NmY4NTA4YjE4YTQ5MjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9UaW1lbGluZUVudHJ5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2Y2QxYjRmNjYwMTk4YjFjZTY3NzRjOTQ0NzkwMTRjYzQ2NmI3NzI4ZjcwNjZiOTNhY2Q0ZTUwNDAyYzNjNDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0Nvb3JkaW5hdGlvbi9UcmlnZ2VyRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDgxZTJkMWJjZGM3N2VhZDkyNThjZDFiYTEwMTYyZTYyMGUxYmU3NWJmOGVjMTFiYjEwZmJjNjg2YjAzYTI3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvQ29vcmRpbmF0aW9uL1VwZGF0ZURvY3VtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhZTk0MjA3NTQwOWQ4MGMyMGE5OTM0M2YyYmRhNGE1ZGY0M2E2MmI2NzE5MGEwNTBhZWExNjY5NTlmNmRlMzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUFkanVzdGFibGVEYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5YWQ1ZWI3NjgxZmUzY2M0ZTdhYTNkNzE1MzdiMGM0YmNiMTg3ZmRiNDE5ZWI0NTI4ZGQyOTY3MGI0ZTM4YTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUFkanVzdGFibGVEYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOGY1YjUyZWJlYWY4NjI4Nzg5NzZhMmZhZWYwYTliMTc5YjI2MGYzNGUxYjc0MWU3Y2Y0MDg1N2UwYjI0NjljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVBZGp1c3RhYmxlT3JBZGp1c3RlZERhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjVlZGU5OGRiNzg0ZjQ5NzliNmZjNzRkMGVhNGFhZWFkZWVjNjZlNDljYzhhMTU5NjQ1MTZhYzhkYjEzYmQ0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQWRqdXN0YWJsZU9yQWRqdXN0ZWRPclJlbGF0aXZlRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNDQyOTViNzIyYzMwNmI5MDY3ZDc3NWNiZDNiMGJhYzI1NDllYWU2NjY0NDkzYjMzOWJlZTJmMWRkZGZhYTFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYmE3MTg1ZTVmMjcyOTEwZDZhZDJmNTc0YTg3ZmNlZTVmNGRiYzZmOTFjMjEwOTc5MWI1NDBhY2ZjNjg0ZGY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTBkZGIyMzYzNjBiMzg5ZDhjMTJkYjFkMGY2NTIyOWQ0YzE1NDMwNDY5MGQwZjk1ZWI1MmRmMzA3NmZmMmQxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQWRqdXN0YWJsZVJlbGF0aXZlT3JQZXJpb2RpY0RhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwNzYxNGUyNWJkOGYwM2FjM2YzNjdjYTFlYTk0YmMyNDA2MWUxZjYyZjkzNTI1N2IwNDYzYThmMjU1MmU5ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUFkanVzdGVkUmVsYXRpdmVEYXRlT2Zmc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImMxNzcyMTM4NTczNzc5YjM2NjFlM2QyZmIyODM2MjgzZDNmNzM2ZDI4MTM0NzhmNzQ0MWQ2Y2RkMzlhZGVmOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUF2ZXJhZ2luZ1NjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGYwYTNhYjk2ODc5YWZlNjEyZDJjYjIzNDUzMmM3MDYyNGI1MzcyZDE5MGUyYzhjOTc3NjExYTdkZTkxOWNjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQnVzaW5lc3NDZW50ZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODhlYjFlNGExNGY2YzRkYzUyOWM2ZDZjODliYzc2N2I4MjlmNmM3MjQwNmJiNDY0YjczMGU5Y2YxMjIwZGM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVCdXNpbmVzc0NlbnRlclRpbWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjZhYTgzMThmMThhMGMwMDBkOTU0NDU1Y2JjODA0MDAxYTZmYWI4MTc3ODExZDRlODk3NjRkZGMyOWM2OGQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVCdXNpbmVzc0NlbnRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGU4OWQxY2ZmNGY1MDBlODhmNmFjMjhkYzJhZThlMzZiNDMyZGE1ZjdiZTUzMWU2NzgzYjJlYzkxOTE1ZGM3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQnVzaW5lc3NEYXRlUmFuZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjFkOGFhYTI2MTNjNzVkZGI3Zjg3OTI3MGU0OGYwZTMzMzUwZjM4NWE5MDgxMGVlZDIwODIyNzJhZTJiYzk1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQnVzaW5lc3NEYXlBZGp1c3RtZW50cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlNjVmNGVkNTI5ODI1ZDI2N2FjNjBlZjVlNDM3M2Q0ZWEzMjZmZWNlMmVlODNkMDIzZjg5OWI4ZTgwZWE0YzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUJ1c2luZXNzRGF5Q29udmVudGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmVkOTI2NWE4ZmQxNmUzYTE5YWEyNmM4NDFlMTI5MDA3NTM0Zjc0MGQ2NzIwOGY3ZGZiOGYyMDk5YTM0MzQyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQ2FsY3VsYXRpb25GcmVxdWVuY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdlNDZlZjEzYjNhNzg0ZDY4ZmFlNDhhNTZmZDI4OWQ3ZWY5MzE3YjM1ZTJiYTNhZGFkOGFjZTA3ZDc4MzY2YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQ2FsY3VsYXRpb25QZXJpb2RGcmVxdWVuY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE1NDhiNjlmNjQwNWE0ZmM3YzQyMGU3NzA4OTQ2NTUxZmNlZDBlZjEyY2EzZGJjZGM0ZGIzODFkYzRlNjkyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lQ29tbW9kaXR5QnVzaW5lc3NDYWxlbmRhckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxZDhhM2ViMzAyYjNmMWNiYjJmOWE4NDJmYTg4ZDM0YTExMDFjYWJhNjczZWJmYmM3MmM5ZWY2MzAxMTg4MTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUNvbXBvdW5kaW5nVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjEwY2RhNmZlYzY2NDRkNTRlZGQ1Njc1NjU2YjZiZjljNzUzZDA3ZWQ5ZjJjY2M3Y2ViOTIxOGZmZDA4YWFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVDdXN0b21pc2FibGVPZmZzZXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMTQyZjdlZTY2OGVkMDJlOThmNGNmN2M1MDJlMWJlM2RkMTBjYTgwZjQwMTA5MjBjMzU2YWM1MWQ1ZDVmZTQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVEYXRlTGlzdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5NDFlOTViYTc3N2Y4NTUzNzhjNzFhYjg0N2I0YmVkY2ZlNzQ5ZjUwZmUxOGQyODc5YzQ1ZDQ0NDVkNjExNzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZURhdGVSYW5nZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2ZjY4YTBhNGZjY2I4ZDVmYTc0YzVmYzdhNTIyNzgwNmFkMzAzMDkyN2ZhM2NhMmU0MzM0NTNiNjM2ZmFmMzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZURhdGVUaW1lTGlzdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzMmY1MmQ0OWFhODkzZGMxODQ4NjI3MGRmNjI5NzZmNGFjNGQwZjhlNjYxMmE2NzkxZWNjYTkyMDk2ZDFkNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZURheU9mV2Vla0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA2Zjg3M2Y0Zjg5OTdiMmM5ZWNiMzM1MTE3OThlMWE5OWQzNDdjZTZmYWZkZWE5N2UyYzIwNTYwMDY1NzQ3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRGF5VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjgyY2QwNjBjZWQ2ZmJkZjQzNTAzNTdiMTIyZjQ0ODRkOWNhMTNhNjFhZTliNmQ3NzVmMTExY2JiMDQyOGY3YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lRmllbGRXaXRoTWV0YUJ1c2luZXNzQ2VudGVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxZTVlNWNmZjU1MzExNDA4Y2NiMTIwOTg0MTI0NThhZDM2ZjA0NDI5OWM3NWU1MTM4YThlODI0ZWI3YmQ3NmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUZpZWxkV2l0aE1ldGFDb21tb2RpdHlCdXNpbmVzc0NhbGVuZGFyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5YzNjN2ZhMDU2MGJmYWU2ZDFjNDIwZjQyNDExMDM4NjhkMTE4OTE3ZWRjMWZiZDExNjcwNjIwZWVkNzVjZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUZpZWxkV2l0aE1ldGFUaW1lWm9uZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyOGU5MzM0M2YwMDEwODI3YTliODBmMzRkMzAwZjExMDcwZDA5NDJhMDY4MTA5NTYyNDkzODZjNmY3NTZlMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZUZyZXF1ZW5jeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzMjMzYjk4NGQxYzdjZDI3NGQ3NzAzOWM0OWI2Yjg5YTAzZWIyMmFiOGJiZmViZmQxZmFiY2FmODk5NGY2ZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZU9mZnNldC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTI5MTc3M2NiYTBiMzljZDYyM2FmYmE3ZjA5NjM0MTIxMzkzZjk5ZjM3MTc3NjhmNWQ5ZDFiMzI3NzY1ZDY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVQZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDFjYzJmMzA0ZDlkOTBiYzFiZmU1OGFiMzBjZmMxMTEyZTg1NGJhM2Y1ZDk1NDE0OTc2MWQ4ODcyODI1MzJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVQZXJpb2RCb3VuZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5ODBkOTM3YzEzY2VkN2M1M2NkNjJmMWZhMWRlNTlhOTlmMTIyZmIxZjk5MDQxMWU0YjVlZjM1M2JlYWJjODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVBlcmlvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTU1ZWM3ZjM4N2E3MjRiNDM2NmNkYWQwOGRkMGNmMTZjOGVmYTBmZWVlYjlkZjMwNGVmZTcxNmY3NzBlZGVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVQZXJpb2RFeHRlbmRlZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTg5NzEyOGMyYTdmMTkyZjdlODkxMzMyNmRkZjQ3MjY1Mzk0NTIzZmVjZTAyNzQ3ZjM2YmI3OWM0MzljZWQ1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUGVyaW9kUmFuZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmIyZWE3MjU1Njg3YzRlYTU2YjQ3MmI1MTgyNTY3ZmRhODE4ODU1OGVjMzYzMTUxZGZmODM0NDEyMmE2YjhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVQZXJpb2RUaW1lRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk3M2YxNzViZTM4ZGEwZWUzZjZhYmQzOWIyNmIyODZlYmNiZDZhNWYzOTYwYWY3NGZiZWI4ZGZiODhlYWJiYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVBlcmlvZGljRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NjYTgyNTYzM2I3NThmMzcxMGQ5YzM0YmZiMTdhNDJjN2I4ZWRlODQwZjYwNWYwM2FiNmVkMDYxM2Y4MDlkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUmVsYXRpdmVEYXRlT2Zmc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImYxY2FiMGFjMzEyNGZjMDE2NmE1NDg0ZGJmMjc3YTJjYThiMmI1MTMzYTk1MGI1MzEwMWZjNGZlMDI2ZTk4OGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVJlbGF0aXZlRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTgzYmUxYTU4N2M2MzI5OWJkOGQ2ZTVkZGMxYzcyZjk2OTQ4ZTA4NzViM2ZjYWE4Mzg4YTE2ODRkZjYwNzFlNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lUm9sbENvbnZlbnRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwNTdlOTc2MzAyNThlM2EzMTczYmYyYjhjYmM1MTQ2NDFjNTQ5ZDE5YTNjNDAyNmIyZWZjNWRlOThlZGYyOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVJvdW5kaW5nRnJlcXVlbmN5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyNzZjYTQ0Y2JmNmJjYjdkODBiNmJkZGU2ZDUwMjk0NWUzMjc1YTZiMTg0NjU0OTQ5ZTczMzc2MzU3NTA1NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZVRpbWVVbml0RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NGU0M2NiY2Y1NzMwMThiM2ZmZTQ4NjFmYmJkMDkxNjJjYTEyNDE1MDYyNmQ5NzZmNTRiOTVhMWE0NGQ1NjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVUaW1lWm9uZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0YmQwMzE0YmJlMjUwZDBlYzhjZGY5M2JmODQ5YmFlNGM5ODdmNjUxM2JlMDRkMjQ5MThiN2VlOTZjOWE3YjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VkYXRldGltZWRheWNvdW50RGF5Q291bnRGcmFjdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWRjMTc3NzZkNGQxYTZhM2M2MmNhZDVhM2U2OWRiYTE5MDIwMWI2OGQ2YWYxYTQ0MDBmYWE2YmRlNmYxNDQwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lZGF5Y291bnRGaWVsZFdpdGhNZXRhRGF5Q291bnRGcmFjdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODYyNjgzYjc2MmYwMTQzMzAyNDExNzVhMTUwY2IwYzY0MTAxMmY4MTY1YTM2NWVlODE3MGNmYzcwZDdmNzY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZGMwZDUwYzQ0NmUyNGRmNzJmYzQzOWVlNmI0MTJlMGRlNjQxMjBhM2Q4YmJmM2E4YWMwYTQ3NzdmNzZhNDI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlZGF0ZXRpbWVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFBZGp1c3RhYmxlT3JSZWxhdGl2ZURhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjMzZjA3YjE4NmI3NGM3ODMwYjdiZTE5ZmE3NzIxZDg5YzMwOTkwOWZjOTNhOTc0OTYyYjQwN2ZiOTU4N2ExZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lbWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQnVzaW5lc3NDZW50ZXJzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWNiZTlkNmFiZDNhMzZiOGZjNDI3OWVlNzAxZGYwMDk0MjUxYjk5OTdjOTczMjBjMDVmODE0OTNkMGI5ODUzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZWRhdGV0aW1lbWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQnVzaW5lc3NEYXlBZGp1c3RtZW50cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiYWM4ZmVmMDdmN2Q5NzQyZDljMzY5ZDk2ZWYwOWVhMWExNzExNTBhNmM4MjFjYzA1YzdiZjZmZjk2ZDNlMmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoQXJpdGhtZXRpY09wZXJhdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzUzZTFmNTJiNzM3NDk0NmNkMWZhZjkxMjhhYjVjNzI2ODc1N2FkMTc4OTZmMWJhODQzOTE1OTEwODJlODEwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhBdmVyYWdpbmdDYWxjdWxhdGlvbk1ldGhvZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkZDcwZThlOGY1ZWUyMzM0NDk3ZWM5NjRmMWFiYjQ5ZjI2MTQ0YmYyMjdhNDlmZmU1MjRlMTQ1NjhkMzJiOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoQXZlcmFnaW5nQ2FsY3VsYXRpb25NZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2I1M2JmMGUwNTY3ZDA5ZmJlMDZjNDU5NDAzZTJhNWJjODllNzZiNTMzMWM2Yjk5NjEzYjJkMzY5NTMwMDk4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhBdmVyYWdpbmdXZWlnaHRpbmdNZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGM5MjJmZjczOWE2ZDM5NThkMGQ3ZWU0MWQzMTM0NmIzZTFiODc4NjhjMWQ2Y2ZmMjI3NjhhMTgwYjhiMGJmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhDYXBhY2l0eVVuaXRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTMyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlMTY0ZTdlOTJmNmUwOGY3ZTMyYjhhMGVjMjY1NjI4MDA0ODMyMzlkMzM5NGJiYzMxOTU2YzViZmI1OWNmMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoQ29tcGFyZU9wLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGJiMWQxODRiZGZhODBkYjQ5OTFiODA4ZmU2YzE5MDEyYTQ5MWMzYzExOWQ0YjEyZDY0OWY5NDhiZTY3ODIwYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhEYXRlZFZhbHVlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI5YmQ0NjkyMmYyOTUxNzVmZjIyYzQwYTI4ZGNmNDc3MWE2M2RkNzI1MmJhZTJhZDUzNTNhYmJiMWJiMWU4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhGaWVsZFdpdGhNZXRhTm9uTmVnYXRpdmVRdWFudGl0eVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWZkOGEyZjk4OGIwM2VmMGVmYWFiZDQ3MzFiZWRhYzNhN2ViMmU1MDliNDJiYTU3ZWRiYmZmNTBmMDY5MWVjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhGaW5hbmNpYWxVbml0RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzhkYjVjMjc0Y2Y1ZDE3ZGQ0YWQ2ZGRmZDQyZDhkOTQ2MWEyODgxMTMyYWIwODc2YWVkYWVkOGUwODhlNzVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE1lYXN1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmZjOTVkODU5OTNmNWZiMjg3MjA2MjZjZmM2NjcyMGMwZTk0Y2E0ZWVjNmI3NTdlOGMwZDAzYzg1YzZkOWYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aE1lYXN1cmVCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODdjYWNkZTAyMzAzMjZjZTNkOWI0MzE4MjYxODQ0ZTY4M2U5YmNkZmI3MDZhMmRkMzRmN2Q5NjJhMzk5ZjgxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhNZWFzdXJlU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGI4OGE4ZTg5M2QwN2YzYTFiMWIzZmFhZmEwNjVmNTEwNGQ4YWQ0MzUyNzgzYWIxNWE3MmYzNWI4NThmYzU5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhNb25leUJvdW5kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmZhZjNkNGZmYjc0NTU4NTIzYzJjYTQ4NzRkMmE0ODhlYmM0MjcyMTQxMzBmZWVkYjY2YTk4ODdhNTAzOTBhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhNb25leVJhbmdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE2ZjRhMGZhYzQ1OGVkZGEzMmE4YmUxZTY3ODM4MGRiOGFiOGViNGY1MjdkOTkyNTkzNTc5YzZjZTcwMTE4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhOb25OZWdhdGl2ZVF1YW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlZDg1ZjA5ZDdkNDM3ZTg0MDg3ZTcwMDcyY2JkNDBkODA4YmJiZDBmYTUzYTlmZGJmMjZjYzRhY2QyZGRjNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoTm9uTmVnYXRpdmVRdWFudGl0eVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlZmIzNGQyOWFmMGZmMjgyMTQ3YWJjNmRlOGUzMjc1NTIwMzFlNzkzZWQ1ZDU1ZTVlMTFhNDg3MTAxNGJmOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoTm9uTmVnYXRpdmVTdGVwLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmE3ZGQ4OGJmYWE5MTQyMTk1ODQ2NDUwNzkxOWM4ZGY2ZDc2NzM5MTg3Nzc2OGM1ZTVhZWQ1MDgzNGYzZGY0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhOdW1iZXJCb3VuZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiZTI5MzBiZWU4MWFjMjJjZDBhYWRhMzIyMjM2MWI2ZTRiNTJjZDgyMWFjNDBkMTg1YzdiYjJhMWIxMTIwYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoTnVtYmVyUmFuZ2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjZiNzIxNWUwY2Y5ODViYjUyYzZlMmJlNjFiNjM5OWI0MjkzNjcwOWI1MmRiOTA5ODZjZjM4MDFiYzMxM2ExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFF1YW50aWZpZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODNiMWJkYjMzZDg4MDk5NWE5NDc0YWQ0MDU1YzVmZGU2MTA4NDRmOTNmMGY0OTFiMTEzZjFkMzcxODcxNzIxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhRdWFudGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjE1MDI2Zjk4MjBlYjFjZTMxODc3ZGFmMDk3NGJhZjViNDFiMmVlMjQ3NzA4YzRkZjZmZDllOGQ4NzY2MTAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFF1YW50aXR5Q2hhbmdlRGlyZWN0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlNDg3YTJkNzg5NDU4MDdmMTgyMzhmNGI4ZjAwYjI3MzBlMzc2NGVhNTQ1NzdkZTE0YzIwMTlkM2MxYzBlNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoUXVhbnRpdHlTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzVkNzEwYWM2Njg4MDU5YzU0ZTczMmZlYTRlZDdlNzAyYTk3ZmQ0OTU3ZTE1MDcxZjMzMWY4N2ZjZDcwNzNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFJvdW5kaW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGM1ZDYzZWM3NmEzNmNiNzAxOWI3NDg4ODgwNzA0OTVlMjA5OTJhZTdiMzBiYmFmNzk3ZjY1NjVlNjFkNmZhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhSb3VuZGluZ0RpcmVjdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDk3NGY2NDdkNTg3YjRhYmI0NmY4OGEwOThhOThmOWM0NDBmMGJkYTVhMWIyNGU3MmQ0MjYwZTNkMWE2ZGEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFJvdW5kaW5nTW9kZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNzZmYmI4Y2VmMDZkZDEwN2FjYTEyMDJhNjhiNjIzZGQxM2U0NjBhYzg1Y2ZiNmY1NDFiMzZkOWI3NTk1NDJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aFNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4NDM1NTQ1OGJhNDZiNWY2MWRhOTk0ZmM4MWQxMGQ0YmI3MGM4YmE5YjA3M2RlOWViNWI3OTQ1YmIwM2IwNDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VtYXRoVW5pdFR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzcyYTQ0ZDczY2ZlNGE0ODY0NmVmODc0ZTQ1NjBkNDYxYTZhNDhhMzkxZTAzN2U5OTA3ZjRiMjBjMmQ0NThhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZW1hdGhXZWF0aGVyVW5pdEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MGI3NzAwNzRkN2JjYmI4MWE2NmZmOWE5YjFkMDJjZThkMjM4MWQ4NWE0MWM3OTQ0MGUxNjgxZWQ3NGFmMWQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlbWF0aG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YU5vbk5lZ2F0aXZlUXVhbnRpdHlTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1OGUwYmYwNDFhMjFmNzkxYzZjZDY4OTdiOTFhOWViMWM1MzliYmU0ZmFmYmZjNWMzNDdkNWQ4MGMwOGQyYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMWJiYmE0MzRkMjM5OGE1NzMxMThiMDI4NmI0NDY1MDUxMzAzMmRmNWE0M2I1MWVjYjM3ODgxMWY4MGZjOWMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQXNzZXRCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxNTIzYTgwNzMyYzAyZmI0YTViYjQwN2ZiZGRhODRiZDIyZTBmNjQ5NTM0NTdhNmM3YmE4NjBjNjg4NjRmOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldENsYXNzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzA4M2Y4YTAxYWRiZTEwZmJiN2U1NjdkZmNjZjFlNzJlYjc1MDg3NjIxMDEyOTNkNjRkZTU4NWQ2MzIzNmRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQXNzZXRJZFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3ZWEyNmJlYjI5M2UzYmZiYmM5ZTYyZTFjZjE5OWYzYTNiNjMzMDAyN2EyYmNkOTZlYjI1M2M5YWU1ZDlkYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldElkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWM0MmRhODM1YWQ1YzUzZjgwODNmNGMyYzRkYjc5Mzc0ODc2Mjg5ZjI4YjE1NGExOGRkZjVhNTIyOWExZWQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQXNzZXRUeXBlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiNWQ4NDM2MzQxNmFiYmIxYzc0MmViYTI5ZGI2NmExYWYxYjZlYTMzODA3OGZjZjMyNjAyOTZjMzQ2NDNiYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Bc3NldFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDFiNzcyMTViYTdiMTRjZjhiNTkzNjAwYzE5ZGMyY2ZiZGFjYjI1NDg1ZDA3OWQ0YzlhZmMxZDEzNGRmNWMyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkNhc2guanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI4ZTM4Y2VjZGUwN2ZmNzcyZTgwZDZhODY2MzhhYTVlY2IyOTVmMWY2NDEwY2Y4YTNiYTFhYjYxZDI0MjhjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkNvbGxhdGVyYWxJc3N1ZXJUeXBlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MjdiZmE1MGMwMzM2ZWU5ZDJmOTI1M2EyOTZlMDYwMzU5YjJiNjUzYzVkYmY1YWU4MzFlODQ3NjkxZTdhMWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Db2xsYXRlcmFsVGF4b25vbXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNThiNzFlYzE4MjdlNjNmNGE2YmZkYWYzOTMyOTJlYWM1ZjY5ODNmYTAwYTQ5YzNmYjZlNmNiYTgyMDFlMzc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ29sbGF0ZXJhbFRheG9ub215VmFsdWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzNkMmQyMTNkMmJkNzQ1NTVlMDFhODdkMjBjMzAwODY5ZTNlZDNhZTBjMTk1YzkxNDhlMTJlMzI0ZjRmNTJiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkNvbW1vZGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzUxMmYwYjg0NTg4NTM3N2RiZWZmZTk0NTJhNGM3NWFiYzVjNDAzY2M0YjdkNDc2MWNkZGEwZjYwOTMwNTBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ29tbW9kaXR5SW5mb3JtYXRpb25QdWJsaXNoZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWRjYTFmZmJmNGE1OTE2OGVkMDc4OGMzYjcyMjMyZGZjZTlhNmNiMjFjYjZmODg0ZDk3ZDc4ZGIxODc3NThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ29tbW9kaXR5UHJvZHVjdERlZmluaXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTg2ODQzZGI1ZmY4YzlmMWNkMGUyNWFjOTNiZDQyZTcyMWQ1NzhkNWU3NTQ4NjY0NjE0ODgzOTkyYzllZWM4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkNvbW1vZGl0eVJlZmVyZW5jZUZyYW1ld29yay5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Mzk4Nzc1ZDEzMjRkZDgwNDcwY2VhN2JjYmJjOGI5YTU4ZWE2MDRmNzY0YTAzYTFiNThkOTY0NjAwYzliZDUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ3JlZGl0Umlza0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3N2EzMzU4NThiMWQxOTc1NTI4YmMzYTU2MTU2YmMzZWQxMTRkODM1OTRiY2JmYWQ0Y2U0YzAwNzI0YWZiOWE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uQ3VycmVuY3lDb2RlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTRhN2M3MzU2NzM2NzY5M2EwMjFkYmY1NzEyM2QxY2YwNzkwOTkzMTdmMjFhODcxMzgwZjNjZWUyYTU0MDcxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkRlYnRDbGFzc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQ3MTg1MmI0MzU4NDE4YTFkYTg1YzZiYmFlODMwYjllNmZkYWJlNWNlYmZmMTNmNGQyMjllZjE0YzM3YTFmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkRlYnRFY29ub21pY3MuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTQ5YzkwMTQzMGEyYzgzMjU2NjcxYzBiNzA5ZWUwZWYxYWRhYTMwYjI3MzQ3ZmExMTdmMWEwMWU1MmEwN2Y4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVidEludGVyZXN0RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMWFkM2JmODM5ZmIxNGUxZmMyZWYwNWYyMWZiYzI1ODhlOWQxMDFjOTA5MTgzZWYxMDc0MzNmYzc5NWY1NjI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGVidFByaW5jaXBhbEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjg0MDMyYzQ3YzMwZDBhMTgwNzg0MTkxY2VlNGMwMTc3YzBhMzVkZjRhMDYxNDE5ZTgzMTg5MDM3MDk0MWExYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkRlYnRTZW5pb3JpdHlFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjU2NjQ2NzAxZjVlZjhmMGI1ODk3ZmQ2Y2Y5YTJmOTkzNDU1MWE0OTFjNjcxNDUzNTNjNjJiMGQzNzg4NWNiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkRlYnRUeXBlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjA0ZThkY2UzNWFkM2M3ODkwZDM0ZjEyNDMxZmQ0YjIyNWIzODUyMzM1MjdiMGQwZmE3Njc1NTc2ODA2NWE2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkRlbGl2ZXJ5RGF0ZVBhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzJjMTBiNWJlNmY2NzAyZWEyNzA4YTEzMmUzMTJjMzk4YzBiNjI0NDE0ZDNmNjJmNjA4MmJmOGNjODY0ZjRkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vbkRlbGl2ZXJ5TmVhcmJ5VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTY5ZGFiNzVkNmJiNzQxYmViOWI4MGI3YzA5ZTI0MDkxZWRmNmU1M2MyZTRiMDQ0M2IxMWM0ZmU0NGYzM2U5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRGlnaXRhbEFzc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1ZmZmOTJmMzMxZTYzMGUzNDFjZWY1OGM3MTVjZTE2YTllN2U0MTg1ODVjZjFjYzBjOWZkYWZjZThlM2FmN2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25FVUVNSVJFbGlnaWJsZUNvbGxhdGVyYWxFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiYWU1MzcwODM4NTgxNWRiYTNhZjFiZTljMTFiNDQ2MzcyYTI2N2RiZTViMmU5MjZjZWMwMTUxYmYzZDE3NzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25FcXVpdHlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyMzFkYWNiZmY4YTIyYWU1YjQxMmRiYmI5ZGQ3NzFjN2I3NDc5ODllMGJhYjkzZWZhNTM5YmNiNTg3N2JjNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25GaWVsZFdpdGhNZXRhQXNzZXRDbGFzc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OWI0MTdhNjRlNDU1YjA3NTdlZjBmMzQxY2MxNWI5NDhmYTIwZDgyZTE1ZDAxMmY0NTRjODA3YWY5ZGM1N2U4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uRnVuZFByb2R1Y3RUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmNGE3ZmUwNzI1MmE2ODQ1MjliN2E5NDFlZGY3NTRjMDc5N2I3ODQyMzA1MzkwOTJkNTNhZTJmNTBjYTQ3MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25JU09Db3VudHJ5Q29kZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDEwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzMjgyMWQ5YzQ0ZDQzMzMzNjZlMWM2NzhkOGZlNTVhMTJhODZiNDkxN2RhN2JmODM4NzYxNWNjN2YzZmY3ZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25JU09DdXJyZW5jeUNvZGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ4MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWM3YTAzYjY0ODdhMDM0MWEzYTMxOTgyZmU4MTFhNTU3OTQ2MjU0ZGJiOWU4ZGJhM2M1MWYxMjNlNDI3MWMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uSW5zdHJ1bWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlODJmY2U1YzQ5MTYwOWZiMDY4MzFkNDAwYTU0ZGM2MGNmNTBkMzU1MWY5NzkyZWU2MGM1YjBlMjczMThhZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25JbnN0cnVtZW50QmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNWQ0ZjE1NzlhOWNjMTUyODYyZDBiNzdkYzJkNGFmMDg3YTcwZDU2ZmNhYzI2ZTAzYTc4ODc1ZWJjZjI3ZDRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uSW5zdHJ1bWVudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmNWM0ZjlhMzAwMDYwYWFhYWQ0MTk2NGQwNmVkMTlkZmE1NDkxMDUwYWU5M2Q3ZDM3ZGE2MDVlZjVmYTVkNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Jc3N1ZXJUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZWExOTUzY2YwYjFkOGY5NDBmNzYwYWYxNjkyM2U4MDE4MDMwN2UzZjAwZDRhMjIzYjc1MzFiNzU5YTVlZWNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uTGlzdGVkRGVyaXZhdGl2ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZjFmNDExNzFmOGMwNWU4NDAyMGNhYjMzZjBjOTgyOTE0ZTdkNzU0OWUxY2MwOGVjOGY1YjZlODlhMGFiMzY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uTG9hbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMDk1OGIyNDEwYTdjZmY0MTViMGEyOGFiMTZkMzRlZGM1ZTVhNDU0YTA3NjQ5NTE4NGY1NGQwYjA4MWRkMWRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uTWF0dXJpdHlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4OGFiNTlhNGU4ZjJhMzNkMGVmMjc3NmM4NjA4ZTM2NjAwNGFiN2RkMmRjZWYyOGQ0YzY3YTUxMDNmNjQxMjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Nb25leU1hcmtldFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjVkM2ZlNDJmZWQ0MmQ4N2VmNDRlYjEyZjhkYjgwNDhlMzY2NGNiNDk0NmJjOTA3MDA3NDQ5YTRiYzNjNWU0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblByaWNlU291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkNzgyZjU2ZWJkODdlYzMwYTRiYjY5Mjg4NWMyZGNiYmJhZDllMDRjOTdjNWI1ZTQwZTFkYThiZmE4YTgzOTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25Qcm9kdWN0SWRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjcwN2Q1MjdkYTE5Nzk5YTUxYWFmM2E2ZGFiMzc0NjMxNTY0NzliYTliMjI0MjhmOWVmNmZjNDE1NmJhMGJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uUHJvZHVjdElkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZTdmZmFlZTNmODI3N2E2ZTRmNGYxZWI5MDBiNDdmZmE1N2MzMWNjMjQ1YmM4ZWQ3MDRiMWIyMWI2MzIzYmMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uUHJvZHVjdFRheG9ub215Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1YzY4MzVjYzkxMzY1ZmQzNTc4MzhlNTA1ZWIwYjdiMzE2MTc2NzJhMmNkYmY3NzVkODFiYTAxNjA3Y2U5ZGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25QdXRDYWxsRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwNmVlMTY3MDQzNDQ1N2U3ODE2ODRmZWVkYTA4NjU5NGRjN2E0MDNkYTM5OGYwYzU4NzE4N2RmMDQ1NzJmOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25RdWFzaUdvdmVybm1lbnRJc3N1ZXJUeXBlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWM0ZWM2MDU2YWYwZmE3YzRkMmM5OTUxMDZmY2UzYmIxMTQ1Mzk2YjBkZTkyYzZmNzQ5NDg5NWRlYWRmMzk2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblJlZ2lvbmFsR292ZXJubWVudElzc3VlclR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTNlMjViOTM5YWEwZWNmN2FmYWEzOTRhZTQ1ZDJhM2EyZDEyYjkzOWM1Y2EwZmRhMGVjMjg3OWQ2NDY4NzdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uU2VjdXJpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVlZmI1NmFhYzI1MDYxN2RjMWIyNDY0MjBlYmNmNGJmN2U0NDhlYTQ0MDFhYzA2NjE5NzgyNzkxYjc5OTJhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblNwZWNpYWxQdXJwb3NlVmVoaWNsZUlzc3VlclR5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjY2M5MDJmZWE1MjY1N2ExMjUxMzA5MjQ0MGMyNmJlNjRkZjZlZTgxNjkxYThiODE5NzdhZDE2NWViNzAyN2M4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uU3VwcmFOYXRpb25hbElzc3VlclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGFkYTllNDAyZjRiZmZmODJhMTkwOWM4YjY1ZmVjYWU2NTZkNDViNDdlMjU4ODJhZjljN2VjNjYwZGUyOTVhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblRheG9ub215Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDgzMTk5NTZiZGQwYWM2MWNlNDIxMDNiOTM5MjRhOGE5N2RhNDRiNmM5M2VjNjgzNzY4ZTgzOTc0ODAyYTk5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblRheG9ub215Q2xhc3NpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWZmZmYyZDI0OTI0MzM3Nzc4MWUwZmNmZTU0NzAzMTMzODA1YmI3MjliMmJjNzBhNWI1NjhlN2Q3YTUwN2YyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y29tbW9uVGF4b25vbXlTb3VyY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5YzJhZjNjMzI4YWRiMGU0MDlhOWZhZmM2NjEzOTI4ODc4OWM4NDMwYzkyMDc5ZTg3YjExNzAzMTBhMTlkYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjb21tb25UYXhvbm9teVZhbHVlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGI3NGU3NmE1ZmEwMWI5NDQyMmNjMGM2YTQ0OThlM2M1ZjI2ZTE4OTUzOWU4ZGQ2NGUxYTcwNWY5YWNmMjg5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblVLRU1JUkVsaWdpYmxlQ29sbGF0ZXJhbEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2E1MmRmODQyM2U3Y2M2OTJhZDZlM2M4Y2Y5NTVhZjhhOGExMjYwNjgyN2FiMTM1NGMxNGRlYzcyZTFhYjAzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldGNvbW1vblVTQ0ZUQ1BSRWxpZ2libGVDb2xsYXRlcmFsRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Mzk0NDkyN2FlNzdhZjI5NjQ0OTRmODBjNWU5MmM4OWY4Y2NiZTliZjczZDE0ZDE5MTBjZjc1OTdhM2YxNzc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y3JlZGl0Tm90RG9tZXN0aWNDdXJyZW5jeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImNjYjlhMDI3ZmM1MGM2NDZhNzRhZGQ3NTNkMjM3MTFjYmY5ZDdlZWMzNGU3Mjk5YTAzMzMzMzc2MjhlNzhlMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjcmVkaXRPYmxpZ2F0aW9uQ2F0ZWdvcnlFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmYzhkNzgwNGNjMDI3NTliN2ExYTgyNzkzMzVlMTkwMTVhYmM5OWEwNjRiYjI3YzAxODg4YzcwMmQ0NDNlYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhYXNzZXRjcmVkaXRPYmxpZ2F0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MmFiMDk2NDIyMjUwMGJhNjk0ZTRhYWIxYTUwMDZiN2I3NmVmMTAzM2RjNzU3ZTUzZTdjZDZhM2M0YTdjMGY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0Y3JlZGl0U3BlY2lmaWVkQ3VycmVuY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNWY5NmFiYjI1NmJhYTdiYjgyM2NmMzIxMmIxZTI5NWIxZDMyMzgyYzQwNTA3YjA2YWQ2ODQ0NThiN2Y0MjViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0cmF0ZXNGaWVsZFdpdGhNZXRhRmxvYXRpbmdSYXRlSW5kZXhFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFmZWY2ZjE3NTUyYjhjN2VmMDkwMDE3MWUyZTljZWFlMGE1NzM2NGY2MmUyZjNjYjQwMTQ5NzBiYTkwMTY2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFhc3NldHJhdGVzRmllbGRXaXRoTWV0YUluZmxhdGlvblJhdGVJbmRleEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Zjg3ZjFkMTcwMzVhY2RmZjUxOGNlZGI2MGZlMTkxMzRiMWE3NjUxZjBmM2I1N2FkMmNmYjNkYzQ1YWFkMWRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0cmF0ZXNGbG9hdGluZ1JhdGVJbmRleEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI5MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNWE2NGQyZmE3OTQ3Zjk5NDlkOWQ2OWNhYTZhYmIwODU5NmYyNTU0MGFkZTlmZDU1ZDhhNWFiMjI0OTA4MDRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWFzc2V0cmF0ZXNJbmZsYXRpb25SYXRlSW5kZXhFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NDZjYmQ5NjY5ZjY0YzRjNDBjNTIwODUzY2VlZjJlOWFlYWViMjBiMjkwNDQ0NDkzNTM2YmI1YzQ1MmIxZDczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWlkZW50aWZpZXJBc3NpZ25lZElkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2IxM2Y5OWFjMjA5MTUyMDY2ZjYzM2NkNGFhOGJlNGQ4Mjk0ODI5YmM2MGExYjRmMjllZjA5NWE5MjJlOTUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWlkZW50aWZpZXJDb21tb2RpdHlMb2NhdGlvbklkZW50aWZpZXJUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDJkNTRlNjVhODI2NjdmYjI3ZjQ5ZTNkNmQxMDliNDAyNzViNzc3YWZiZDViM2Q1YjhkMzdiZjBlYjc1ZDZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YWlkZW50aWZpZXJGaWVsZFdpdGhNZXRhSWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlZjhiNmVhMmRlYjU0MmJkNzEwYjlhNzAyZTIwMDEwMWU3NjBjYWY5MGY5NzhjMmIwNWNjYjZiNzNkY2MxZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhaWRlbnRpZmllcklkZW50aWZpZWRMaXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlMzRjYzAxOTZkZWQ5ZTkzZGY3NWZhZGJiZjcwNGQ5ZTdhYmM1Y2E2MTcyNzRiYzgwZGUxMTViYmViODA2MDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhaWRlbnRpZmllcklkZW50aWZpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzE3MTdiMDM0ZDQzY2E2Zjg0OWQ3ZWZiM2RlZmM2OGZmY2VmMGQxOTI5OGUzODJlMDNkNzUyNGMxNGE5ZjBiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFpZGVudGlmaWVyTG9jYXRpb25JZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiNjNiNjMzYTQzZGQ0OTJhZjAwMDdiMWVlMzU4MjRmOGI4MGVlNTYwNTc0NGE2Yzg0Y2RmMmNhZTg1Y2NiOGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhaWRlbnRpZmllclRyYWRlSWRlbnRpZmllclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTE3YjBjMmRkMDVjZTg1Y2MwOWM3N2I0ZTI2Njg4MGJhYmQ0MTAyNTM3ZDhhMTEwMDA4MzhlYzlhYTkzNjhlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUFjY291bnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDg4NzU5MmNiNGZjNGMwMDc3MGI2ZmY1NTYwMDRhZDYwNTU1Y2UyMTllNTZjMDQ0YmUzMGRkMWM0NTIwY2U4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUFjY291bnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3NjM5ZDM1NzAxZGNiMzc2ZmRmY2IyMTEyOTRkNjZmZjYxMmY4YjAzYzNhNmYwYmY0OTEwNTZjMjJkOWFhN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlBZGRyZXNzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRjZTA3OTQ4ZDg5NmFjYjc0YWY3ZDA5OTlkZTIzNDhjZjIyODM5MTY2MDA2ZGYwMzVjMWIzZmY4YzJkZGM0MjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlBbmNpbGxhcnlFbnRpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTJjOTBiM2M4ZTc2OTdjNmY0OTA1ZjA5ZmNlMGI1YjMzNDhkNGYyMmJjYzZiZDI2MmViMDdkY2I3NWUyNzkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5QW5jaWxsYXJ5UGFydHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTZkNWY2YmFlODEyZTJjZTdiOTgyNjcwNTJkYTY5NzVhOWU2ZWUxZmE3OTNjMDQzMDIwOTYwZjliNmE3YzlhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUFuY2lsbGFyeVJvbGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxNjdhMWI0YjdlMjI4MWRjMzM4M2RmYWUwOTFjY2NkMTBkM2QyZmM4NTQxZjQzZGYyOGMzMzMxNWU3Y2I3M2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlCdXNpbmVzc1VuaXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZWMyODczYmU0YWJmNTUwMmVlNDNjZjdkOWEwMmE1ZTVhMDU5MDY0MTEyZjZiYTg0ZTc3MWNiMTY1NjFmZWUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5QnV5ZXJTZWxsZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTBhZWY0NTM3MjJiNzI2Yzc3NDhiNzVjMmY3ZDI1ZTI4MTQ2NmVhNDM3ZTgzNjQ1MjZlZmU4NGYxNjc4MzRiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eUNvbnRhY3RJbmZvcm1hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTAxZmZiZDE1ZTkwZDBjYzAwN2FlMmE1ZjkwZTZiOWI0NjdhZmQ2ZGExMGE4NWQ5MTJlOTVhNWI3YTc0ZjFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5Q291bnRlcnBhcnR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxM2RkNzQ4ZDhmMWJlNTQ1NjYwNDljNDQzNjg2OWYyM2QxYjg0YzcwZWZlNThjZWZhNWZlNDE4ZTg2YzkwNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlDb3VudGVycGFydHlSb2xlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzOWVjMjM0ZGIwZTBmNDk5OTM5NDJiMjkyY2M4ZDBiNDIwOTRkNTQ5NGYwYWQ0MTBkZWY4NWNlNzE1ZDcyMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlFbnRpdHlUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YjE0NTdiYjExM2JhMGU0M2IzNzcyZGRmNGQwOWM5YjhlZmY2NjExNTUwYjhiOTMyNWQ2YjM1ODg1MmQ2YTliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5RmllbGRXaXRoTWV0YUFjY291bnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1MjgwM2I0Mzk2MDllOWY4YThlN2QzNjEyZmRmMGE1MjgwZjg0ZTE0NzYwNGU2OTkwMGI0YTg1NmIwZmUyMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlGaWVsZFdpdGhNZXRhRW50aXR5VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTMxZjk4M2MyY2IwYjRiMzU1NWZiNGRiMjcyYmYyZDk2Mzc1ZjZlMzRkMWIzZmZkYThjMDRlNThhMTNhODg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5RmllbGRXaXRoTWV0YU5hdHVyYWxQZXJzb25Sb2xlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3ODA4MzUxNmJmNTA4OTU2ZjNkZjE2ZjYxMmU4ZTllNDFhMTg0YTVkMjYyZWRlODg5Mjg3OTYwZWQ3ZWFmYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlGaWVsZFdpdGhNZXRhUGVyc29uSWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI4NTg4ZTcwNjNmMjNlYjY0OTE1YjIwYmVhOWFhNmRkMGQ4MmE4MjQ3OTBiNjY0MzA5MDI0MWQ4ZDAxNzY2NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlMZWdhbEVudGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0Y2FiNDBiMWRkYjFlMWEyOWIzNmJkOWY0NGQ1YjUxMWYwMzI3NGEzM2YyOTYwNzI2YjVlMTdmMjBmNGE3YTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlOYXR1cmFsUGVyc29uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyNWI1NDFiMjk1MjdjMzRkZTJhZjA2ZjcxNzA3ZjZkNjJjZjk4MzEzNzlhNmRmZmJmMTZlYWNjZWI2MmZhYTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlOYXR1cmFsUGVyc29uUm9sZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMywKICAgICAgICAgICAgICAic2hhMjU2IjogImVkMjNmMzI4ZDhjNWYwMWRmYzVmYTZlYzkyNmVjNTkzOTc1NTc4YmM4OGY5OWI1ZDBiMTM4N2IxN2VlZmRjNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlOYXR1cmFsUGVyc29uUm9sZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTgwN2ZjYWI2MGFjZDk0M2JhNWUxZjBkNDQ4MWU4NTkzMWU1OWFkNTgwMjYwNDI5ZGIxM2U4YTA0YTFlMDY4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVBhcnR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4MzVhYmY1OWRlYjk4ODkyMmY2OTEwMjFiNDllYzBmODM1ZWI2NjhiNmRmNGE2YWRmMmQ4M2U3MjZkOWEzYmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlQYXJ0eUNvbnRhY3RJbmZvcm1hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDQ5MGRmODcxY2I1MzU4ODg1YjdhZDQ0MDY4ZDI1YTAzMDlhYzg2NzYxN2YyMjk4ODc5NDlmMjgyOTcwOWZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGFydHlJZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFiNGM0MjhiYzhmNGRiMGZlMjYxZjM4YTc1ZjMzMWQ5MGY0Yzk2NjBhZDlhNGNhMmJkYWVkYjgwYTI3MDYyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVBhcnR5SWRlbnRpZmllclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2JmZjljZDQ1Y2I1OGM5ZjNhNGZmMzJiZGY4ODkxNzViNzc1YWJmNDE1OGIzYzc4MjVjMWY2Nzk2N2Q2NjJjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVBhcnR5UmVmZXJlbmNlUGF5ZXJSZWNlaXZlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZjlkMmRlN2EyMWFlODIwOGJjYTUzZTQxZmY4M2E5NDljODYwNzcyNjA1MWQ2Y2NiZTk3OWNiZDM2NGY4ZGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGFydHlSb2xlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzIyYmM2ZGRkNWQ3NjgwODVlYWExOTY5ODg4MjgzNGExYWQyNTQ0NDNmYzcyOWZlOGVjYTcxODQ4M2UzNjJkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVBhcnR5Um9sZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTk5ZTU1NGZmM2VkZmVkNWVhZGQ3Yjg0NDJkOGNhOTY2YmYxZTRlYTUwZTFiODA1MDE4NWJlOWU1NWE1NDFkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVBheWVyUmVjZWl2ZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzQwNTAwZGZiMjg1NmE2NGYyYzg1NGY4OTQyZmNiZmE2MThjZWMzMjlhNGQwMmFlYWQyOTdiMDk1MmYxZDUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGF5ZXJSZWNlaXZlckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMWZhMDA4YTcwNmUzYWIzOTExMTk5YWUwODcxZWNjYzBiYzRmODUxMmJmOWE2MTJlM2I4ZGRjMmJlOTU3MGNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGVyc29uSWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzJkMmNhNWMyZjhiOTY1ZGUwNDY1ZGY0MzM0ZWZjMjZjMTljNDZhODhiMWNhNzBhNzg4ZjJiMGVkYzY1NWVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5UGVyc29uSWRlbnRpZmllclR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRjMTNkNmQwYmYyNzZmY2VkNzFlMTI2MmY3YzU2ZWFiZWIwMzMzZDFiNjRjN2ZiNDE0Yzc1MDIxN2RkNjQwYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlSZWZlcmVuY2VCYW5rLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDYwNmYzYjg2MDVmNTEyZDU3M2UwYmRlMmFkZTM5OWI5N2M3ZjllZjIwNjZkOGIxMzc5MWUyNDliNmRhN2U1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVJlZmVyZW5jZUJhbmtzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmE1YzA2NTI5ZjRhYWVjNmIxNzhjYzA5ODNlNmFjMmM3YzNjMmU2MjY2MThjYmIzNzc0ZDBjNzNiOTc4ZGQ5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eVJlbGF0ZWRQYXJ0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2MTdjN2ZhMGI0YzQ4ZTQ4NDkwYjk0MTkyOTlmYjcwNTIzOWJmZmI4Y2YwNTVmZjcwYmE2NzJjMGY4Nzc5OGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHlUZWxlcGhvbmVOdW1iZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzc2NzlkNzhhOWRiNjA4NTI3MDRkZTRhM2ZlOTQyYTI1NTU1MjI0MjQyMTllY2RjYjZiZGJiZDkzMDZjNjI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5VGVsZXBob25lVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTE5YzQxMTQ2NjEwMjNhNWY4MGI4NGZlYmYwY2QzYTVhZmMxYjk2N2QxMTNiMDVkZmQ3Yzg2YWQxNjUxNDJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1iYXNlc3RhdGljZGF0YXBhcnR5bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQWNjb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwMWZhYjJjNDI2Y2FlODIwNDI2Y2Y3NzY3NTdjMjFmZWVjZTIwMzc5YjE1Mjk3OTEwNWQ3Y2QyZmRhNGFiZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHltZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFMZWdhbEVudGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhNmQyZmJmMDFmNjI3MTVmZTdkNjUyNDhjZTUyZWJmYTIzMmYwMmI0YTI3YWNhZTUzOWU4MzU1YTMwNjI1MmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWJhc2VzdGF0aWNkYXRhcGFydHltZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFOYXR1cmFsUGVyc29uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTYyNmU3N2YyNTYyYTVhZWIxYmZmNGE3MDU2NTliYTg3OGU2NDIzY2Q5MTAyODRiMzUxMDJlNjFlMDQ3ZjNmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtYmFzZXN0YXRpY2RhdGFwYXJ0eW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVBhcnR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzMzOWFkZTQ3NGU5ODY4ZDgxM2Y2OTFlZjNiMDg3OWZmMGVmNjk5NDIyZWU0MjA5MGE2ODFiYWM3MmM3MGJjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25BY3Rpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTJlYmFjZTkwYzI1NjQ5NzIwNmE4MmMxMTk1ZTg2YTcwMGFlMDFhMGFkZTBmNTk2NWYyYTUyMmU2MjcwM2FiZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25BZmZpcm1hdGlvblN0YXR1c0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2RkNjlkMGNhMDBhZTY1YzJiZmM3ODQ3ZjZkN2FhYjY3OTMxNGIxMGZkOWIxOTM5YzU5YTlhNDFhM2Y5NDUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkFzc2V0VHJhbnNmZXJUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiYzI4YjdhOGM3MzI4MTU5MjMxNmQ3M2I4MGU3ZmE5NDhjYzRiZDMyMDQ1M2VhNDllMTg2ZjhhNjFjN2M4YTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQmlsbGluZ0luc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwNTYxZGFkNDkxMjhkMDJlMzM0ZmU2MDRjZmZmNmYwYTFlZjA2NmY4YjY4MmUwN2NmZmNhZmI5YTJhNzYxNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQmlsbGluZ1JlY29yZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjE0NzA4YzFiNWJmZGQ0ZjJhZTZiOTdiMDk4YzM0MzE0ZWNkMmY2YTFlNTJkMDM1YjQ5NDU0OGZmNDEzNTY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkJpbGxpbmdSZWNvcmRJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTRlMzUxZTQyZjk5YjMzZDUzNjVkNzVmNmM1Njc5Mzg3ZDhkM2YyZTBmMDg5YjBhMjIyODQyZDRhYWEwNGZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkJpbGxpbmdTdW1tYXJ5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOThlNjljY2Q0ODMzNThiZWQ5YzE4NTM0NDZhNWU3NjMyNTM3ZDY3NTg0YjMwMGM1MmY1OGFlNGMwOGVhNWVlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25CaWxsaW5nU3VtbWFyeUluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmUyOGM1ZWRkZjUwMzNkNzhlNzQxMDhkZjBmODFkOTM1NTYxNDA5ZjI0OWJhYjc0YTMyMTk0NzMzZTg2NGExNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25CdXNpbmVzc0V2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI5MTc5Y2Y2OWM0OTEwOTMzZDk5ZTViNmNiYThjOGE1YjJkMzE4ZjgyNTU1ODkwMWFiM2NiZjgzNmJjMjQ4NzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ2FsY3VsYXRlVHJhbnNmZXJJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDY5YTljOTIxMjRiOGUwNjAzMTZmMjUzZWIwZWY2M2EzMmM1ZDIxNmVjOTJkNTY0ZGY4YzVkZGI1YTE4NWEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNhbGxUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwYTU4YjJhMmJiMmYxNzQ2MGQ1OWFkODczOGVhZTJlNTQyYzFkN2YzMDcyNDI1MzE3MmQzMTlkMDY2Y2QzNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ2xlYXJpbmdJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjljZTFiYWIxNjI5YzU3Zjk5YWVlMmU4ZmQ1ZjJjNjg2ZmNkOGJmZDliNjc4N2NhYmEyNjVlMDU3NDU1MDVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvbGxhdGVyYWxCYWxhbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ5OGRkY2VkMjMwMjc2NTczYmQwYjU1MmQyOTUzOWU0N2VjYTM5MDM2N2I0Njk5YjJiZTk5MzI3YmYzZjIyZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ29sbGF0ZXJhbFBvcnRmb2xpby5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OWE5NjBhZWFjMDM5NjkwOTEwYWU5MjI2NTVlZGQ3MGFjY2M2MjlhNjE4NzhlOGMxNWIzN2YwN2E2ZWQzZWM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvbGxhdGVyYWxQb3NpdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMGFmOTZlZjM4NmQwMDMxN2JhOGNjMmVjNTI2MDdiMmQ0ZDE1ZTcxYTdhOGNiMTBmYzFiZWFmMjgzN2NiMzQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvbGxhdGVyYWxTdGF0dXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTgyZTIyNWJmZjRiM2Y2NDQ1ZTBiOTA1ZWE5MDZiNjQzMWY5Mjc3YWE5ZDg0YWMxNjcyN2RiYmU4Y2IxNWViMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25Db25maXJtYXRpb25TdGF0dXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTQ4NGY0Nzk2NWJjMjdmYzUwYTk4MDU0YzU3MThiNGM0YzIzODVhNGJiMDdhZTYzNTAwMjYxZjJkNjg3YmM0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25Db250cmFjdERldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzQ3MWZlNTlkMWM5MTg2ZDMwZmVmOWMxNDAwYjVlYTQyMWQyYzEzMzI3ZmU2NDk3Y2RkN2ZiYWNjMzAxZjRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvbnRyYWN0Rm9ybWF0aW9uSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzRiY2M1MjI3MmI5NGE4Y2NlZDMyYzg4NzNiZDQ1M2Y3MzBjYWRjZGViMzJmMDMxMTg3OTA4YTZjYzc2M2FiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvcnBvcmF0ZUFjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxODJlY2NhMzM1MWM3NmQ3YjRkZWJiYjgwMDVlMDljNWY3YmM0YWY0NTI0OGRlZmVjMDZmMTNiODcyNGM5MTJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNvcnBvcmF0ZUFjdGlvblR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4NTA3YTU2ZTJkMjYwMTVlM2ExMDhhYTIyZTRmMWRhZDI2NzIwMGJkNzE4YzRjMzAwYjliNmJkY2UwNDkzYTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ291bnRlcnBhcnR5UG9zaXRpb25CdXNpbmVzc0V2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjIyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzODlhZTc4NmQwZGFmYTk5ZjQ2ZjQ4Yzk3OGI1NjlmNzRhMmU1YmVjMWY0M2Y5YjE3MTAyMjRiNjFjMzI0NTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ291bnRlcnBhcnR5UG9zaXRpb25TdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZmUxMTBkNTEzYzdmYjI2NzI3MjllZDRkNjAxOTA4OTU0ZTkzYTJhNzkyMGRhNzk3MzY3MGZkZDE1OTNiNGY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkNyZWRpdEV2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0MTU2NWQxZDEwMGExNDZmNWRlMWZhYjU4M2E1YjBiNWUyMDI5NTcyYzJjODFlMWYxM2M1MTBhMDc0OTIxMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uQ3JlZGl0RXZlbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTA2NDc5MDllMjU3MTQ3YjNkM2RjYThkYjQ3ODJiMDdkYTgwNWEyYWM4MDcyYTAwM2M1NDUxYWZhMTBhOGEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkV2ZW50SW50ZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZWQ0N2Y2MDA2NTBiZjU0YTU5ZGZjMzU1YTg5YThiN2RhM2Y3YjMxZjQ4OTRkOTc1ODc5MTAxOWFmZmQwMmIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkV4ZWN1dGlvbkRldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MzU1NmE1NjQ5YTM3Y2QxYTg3OGQyMTc0ZThlNjMxMzA5MjJmZWMzMjU1OWI4YWEyM2ZhNzMyYjI2YzE2NTU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkV4ZWN1dGlvbkluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE5MTNjMDkyM2Q2ZDkwYjRmYjQ2ZWI5MTZiNDc2OGZjZTA0MmJmNzY4ZmRhMmY3ODdjZGY2MTVlZjM3NDNiZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uRXhlY3V0aW9uVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTczZDU3ZWNhMjg4MDhkNTJiN2I0OTcwMTQ0MDY4ZDAwOTVjN2M1NjlhYjZhMzhmYjA2NGQyMmRmMWZiZGI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbkV4ZXJjaXNlRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzdiZDQ1NzIzMzI2ODFmM2M0YmYzYzU4ODBmMjUzNTVkYWY5OGFkODE1NmZhOGZjNDI3NzIwYTdkODMyODhmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25FeGVyY2lzZUluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyNzI0OWY4YTgwYzNkOGE2NmQ5NzZhZWY1ZWE4NWQwODIwZjA4NGU4Y2IwOWI3YzE4MzI5YmNiYjRiZTg3YWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uRXhwb3N1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTlhNDhiZDI2OWY1YzJlZTI3MjkxYjk2NjI0ZGJmOTk0ZTI2MGM4NWYxNzRiZmZkZGFhZjQ0ZTQ2NDYwZmRkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25IYWlyY3V0SW5kaWNhdG9yRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiYTkwOGJjMWJmYTg0MDhlMzc3Yzc2OWQxNzdkMTk0ZmQ2NmJjOTg5MDg2MzlhYjgxYzQ5MDU1YzNkNmVjMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uSW5kZXhUcmFuc2l0aW9uSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzg1MjcwYjFmYjU0NzQ2ZWM5NmJlZDkzYzFjNTYyZThkYTQyYTVhNDNhNjhlYzEzYjFhMjEyYWQwNzFhZjBhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25JbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyNTUyNTE5NGNjOTYyMTJhNTFmYTgxNWEyNWMzZTgyODQ4MjVjZjcyMDE1ZDI4NWM1ZjYwNzU4NjFiZTYyNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uSW5zdHJ1Y3Rpb25GdW5jdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWVhNTJlZDNlMDViMjJjNjA3MTZlYTU2MGE3ZTI2NzZhODdkNTcxNzMzZDEzMDRkNjk0NThmNzJkNDM5ZmViZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25MaW5lYWdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkOTAxYWJjZDdkMTA0ZjQyMzJhZTI3ZmIzODA5MzRmZmNkZTU4MWFhMzQ5OWE2Y2RhMjZiMTg0N2Q5ZTk1NjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbEFjdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZTc1Mzc3YWZkZjkzOTY2NWRjMWVhODhiMjUzODNmYzE5MjBmMzllMzRiZWJjNmRkYzU4ODZjNzcwZjBkMTljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbk1hcmdpbkNhbGxCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0MjU4OTg1N2I4OWNiMDE3OWU1YTBiM2YwMzBlZDgyN2RjYjA0ODQwMWYxZGIxZmNmMWJhOGUwZmNhOTVhYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbEV4cG9zdXJlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImExMTYyZTQ0OWMzYmI3MzRkZTQ2MmExNGE2ZDQyMzhjOGYxNjY0ODEwNWExMDllZTJjMGVhZGYzYjY0MjhiNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbEluc3RydWN0aW9uVHlwZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5YzQ3NjMwNWE1MTA4N2JlZDIyMmVlMTQyN2FlMzUxMDg5YzU0NmEyNDZiMDgxZDEyYjVlNWU5N2U2NDBhMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbElzc3VhbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwNzRiYzdlYjg2ZmYwMTkyNjI4NTFjMjdmZmRiYzliMTM0MWE3MTZmODRkMTI3NjEyZDJjMDlmMWJmN2QyYzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbFJlc3BvbnNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjOTk0NDYyNGM1ODNmNGUzYTlkYzNmNjliODEyZTYxN2M3ZWI3ODBkZDQ3MzAwMWZiNzI5MTRjYzAyMjkwZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uTWFyZ2luQ2FsbFJlc3BvbnNlQWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDM5MDQ5YTk0MjJiNjE0ZmU4YmUwMGJjMjY0ZWNkMTVlODY5NjBmNjJlOTI3MGExNWU5ZGJkMDVjN2U3OGY5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25NYXJnaW5DYWxsUmVzcG9uc2VUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhNWI0OTI4YmZiOWE3NjMwZjMwOWZiYmU5NDQ4ZTY0N2JlZjliNjM0MGFhOTk3ZTcwYWY1YjViMGIyYjgxZmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uT2JzZXJ2YXRpb25FdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzYTgxZmU5ZWQ1ZTI2MTBlMGE1MWQ2ODkwODgzZWIzODg1Yzk0ZmRkYjE4ODBjYzExZmE5MjhkZmZmNGZiOTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uT2JzZXJ2YXRpb25JbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhZmUyNDhiYWIyNmQ4NjFkMzE0MmFlZTk2OGQ5ZWE4ZTgwY2E3MDFmMjMwOTI2MTk5MmViMDUxZjc5ZWJhMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUGFydHlDaGFuZ2VJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzVmOTIyMzM4N2MxNThjYWZkZjBiYWNiMjI5OTU0NzNiNDgxN2MxMDBkZjExOTE2YzRhZjY0NWJhZDU4YWIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblBlcmZvcm1hbmNlVHJhbnNmZXJUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODY4MzM5OTQzOWE2NjRkYjNmMDA0Y2MyNDk4MDk2NmUxNDk4NjU1OGEzZTcxZTBkOTQ4MWMzY2E2MmFjYmY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblBvc2l0aW9uRXZlbnRJbnRlbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmZmQ3ODQ3YzJkNzhlZWEzYmI4NWZlNTgyMDZmZWI5NjAyMTE0MzgzNzI4OWM3YTZlZTQwNzY0ODFjNmYyYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUG9zaXRpb25JZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1ZmI2MTdjMjcyZGNmZjhlNWRlY2RhNjliZTFkYTZkNzUzZDNkNjEwMzBkZTc2NjhlZDBhNjRjMTY4ZmU1YmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUHJpY2VUaW1pbmdFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDI5ZmU4MzljNzk1ZTY1OTIzMDNmM2JjMDRiYWE3YjA4NGI1MzlhZjgwZTE5Zjc0ZWQ0Yzk2ZmRkYzQ1YzhhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25QcmltaXRpdmVJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZGY5YzY5ZTVmMjJlZWE1MTk3ODBhMjczOWZlMWRiODJiZTExMDRiZDBkMDA4MWRkMGJlZTFhMzRiYjE3MmMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblF1YW50aXR5Q2hhbmdlSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDgxNGEzOGU3YTZiMTAyNjZkNGI4OTRmNTMyODc2ZDdhNGIzMjM1ZmJmY2ExNDM2MjE3MzUyN2ZkOGIwMDdhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25SZWNvcmRBbW91bnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0OTBkYmJiNGI5YjY5NDk1YmNmMGZkYTkxZGQ0MDUwNTFhZDY5YTQyZTZlYjVjYmVkMDRhZWY4NDkyZjVmMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUmVnSU1Sb2xlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0MTNjZTZjMTMxZDMxMmUyMTI1MjAwMDUyYjVmNDJjNTBjZWMyYjE4NGJiMmYwZGNhYjJjODlmMDQ0NTc5ZTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUmVnTWFyZ2luVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZGQzOGZkODVjZDFiM2U0OTFhYmI1YzRhZGQ4YzI3ZDZlODAyMDdiM2MxMTY0MzM2YzlkNjRmM2Y2ZTJlY2MyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblJlc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImUxNjJkN2Y0YmY5ZjRmMjdiNTAzOWQ3ZTRiMzc3ZDc1ODE3ZjgyZGUxNzUzNjA0MjJlYzJmYTBmMWI3ZDk0MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uUmVzZXRJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTBkYWYyNTM0YmI0MjA4ZGY1M2Y4M2FkYjM5Y2UyYWZjNGJlNWZiNTAzYjIyY2U1OWZkOTIyY2Y5NzA3YTEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblJldHVybkluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmIxMGE5YzFjMmM3NzFjNjdhZjE3NmNiMTJlODE5ZDdlYThhZWUzYmY2YWIwYjNmMGRhM2VlNjFiZjRhN2I5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25TY2hlZHVsZWRUcmFuc2Zlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwNTdkNWQxNDlmYjgxMDhhMzMxZWMwNWIzMDQzODQzZjEyY2FmMTliYzAxOTAzMGQyYzI4MTZjOTM4Y2Y2ZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uU2VjdXJpdHlMZW5kaW5nSW52b2ljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzlhMTQxMzlhY2E0NmYwODFkOWJmOGZhYzU2ZDAzNTczNjhiMjVkN2RkODVmZGFlZDhhZTliYTdlZTM2NmY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblNwbGl0SW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YTgzMzY0MWJlOGRlODFiYzIwYzBiMTI3NzFmYzkwOTgxZmEyOGMyN2Q4ZDZmNTMxZTYyYTZiZTZiZGY1N2EzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblN0YXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGNiMmUwMzFmZjQ0OTczNjUyMzQ4MGVjMTE4OWI4ODdjYThkYTdiMTE1YjU3YTliZGQ5OGFlMmIyMDRjMmI3OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25TdG9ja1NwbGl0SW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTRhYTlkMjVhZTU4YjRhMjI1NjY4Y2RkMmJhZjU5NDBiMjM1NmNkYzNlZjk3ZThlNmE1ZTU3ZmFhNzU5ZjA0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25UZXJtc0NoYW5nZUluc3RydWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBhY2ZhYzhmMjgxY2VhZDIxY2UxODhiMDZjYTFmZDgyMzVlOGI5YjgzMTQ3NTY3MDM5MDBmNjE3NDJjNmQ4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25UcmFkZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDdiNjI4ODEwZDYyNmYwZTUwMmQ5ZWZjZTliY2FjZWM3ZDY0MGE0YmY4NjNlZjE1NWNiZWE1MTdmMjFjNTY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRyYWRlSWRlbnRpZmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMGFkZWI2NDI3YTMxMmE1YzQyYzgxOWFmNTQwMWQ2ZjY0M2QxZWUyNWE1NTU0OWRiZjY4ZDUxYzM1ZmE4ZGQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRyYWRlUHJpY2luZ1JlcG9ydC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZjdlYjc3YzliYmY0NmFjZjQyOTQ2YzE3OGQwYmJjYjdiN2M4NWNlYTBkOTNiMWRmZWQ2M2QwZjljOGY1ZGJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRyYWRlU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjI2OWY2MGRiNTU0NGRkOWIzYjJhNjA3ZDY4MjI1M2FlYmE2NmVlNjU2YTI1MTRhZDhhZGUyOTY2OTZkYTFiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25UcmFuc2Zlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzYwNmFiOGE0MzBkOWJiYTU1NzJkNjg2MGMxMGY1YjZmYzQzZDllY2U3MzRmMzkyNDQ1MDExODM4MzkyNzBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vblRyYW5zZmVyRXhwcmVzc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmMjYwYzY1YmY1NzIyYzAxMzAwNDc1ZGIyMzZiNmE0Nzg5MzkxOWI1MjBmM2EyMmM2MzU2ZDVkMWEzODczNzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhbnNmZXJJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImU2ZTg1ZDcxNzFmMmYxNTNlZjczNmNjZmI0YjcwMzVhM2YyY2E1MTQ3MWM1ZDU3NzdmNjEzNWZhN2FhMjFkNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhbnNmZXJTdGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5ZGVmOGE0ODczMjNkYTRjODkxNDE4MjgyYTE0MDQ3NmYyYjcyY2YzNThmOWYzZDBmYzE0YzM2YzUyZWZiZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVHJhbnNmZXJTdGF0dXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGE1ZDY4ZGVkOTFkNmFiMTc2ZGMwOTA1YjAzYWU4N2VlODE1NTQwYzRhYjRhYjlhZDk1NTM5NGYzYWQxOTliYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25WYWx1YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2IzYzExMTJkODkxNjc2OThiYjI0MjlhYmY5ZDZlMmRjMWIzN2NkMmZlZTBiN2FhN2U3N2M0M2I5MTAxMWMxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRjb21tb25WYWx1YXRpb25JbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0MjkxZDYzOTE2MjA5MGI4YjNmOTBlOWNiYjRlOTI4MDg1NjRjNDFlZTUyZWM4YzI4NTQwYTQ0ODk3MDEyNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVmFsdWF0aW9uU291cmNlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0ODUxZGMyZWRkOGY3MGQ1OGMwMWE0OGM5MDllNTQ2OGJiZWM0ZTc5MDExZjVlOGVhYjExODU1OWQ1YjcwMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9uVmFsdWF0aW9uVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZjNiMTIyZWFlMTQ4YjRkMWZmMmMyYjQ1YmY0MjU3NjdkOTIwOWU1YmI1NDI5ZDU3ODE0NzczZDdiMzZjYmJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbm1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNvbGxhdGVyYWxQb3J0Zm9saW8uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNzg0MjU3MzBmNTgxZjVhMTI1NWRkNWRjNjhiYzRkYWE3YWU3ZGEyNjhhOWE0ZjZhMTkxMDBkNzlhODI4YjVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbm1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNvbnRyYWN0RGV0YWlscy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwMjZhOTM0NmY0YTcxZmM4NjMxNGU2YzljMjViNDczNWIzMzY1ZjFhYmE3NWUzYzUyOGQxNjBhMmExYjZiODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9ubWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhRXhlY3V0aW9uRGV0YWlscy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1YmYyNTViODRhM2Y5MWM1NTM4YTk4OWRlOTQzYjY2ZWU2NzE3YTEyYzE5ZWIxYzgxNzViMmU1ZDRlMWEyZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50Y29tbW9ubWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhVHJhZGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjIxMjIyYjRlY2YyZjUwNDUyNmNjOWVlOTRlYTdiMzZiNjlhN2IyNmVjMzAzOGQ3MDFiMmI2OGJhMjc2ZDVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudGNvbW1vbm1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVRyYWRlU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTZlZjFiYTkyMzMxOWJlMzIyZTc1Njc0NDYxNTYzZTIzNzEyZmE5NjA0NGRiM2M4MWYwNDY2OWIyYTI0MTA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uQWdncmVnYXRpb25QYXJhbWV0ZXJzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmNDRkZjk2ZTQ3ZjdmMzhjMzc3MmNjNjczMzQ0OGUyZDUxOTIzMTdmMzNhZThiOWEwYjY5YzNiMTRmYmY4ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25BdmFpbGFibGVJbnZlbnRvcnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGVlMDIzODc0NDFjZDIzZmMwYTU0N2NmOTllYzc5NGI3ZTA5OGMxYjk3NDhlMTZiNzU3ODA4OWNkNTc4N2I2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvbkF2YWlsYWJsZUludmVudG9yeVJlY29yZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTAyNTYxZWJjNGQzY2UxMjA3ODBjZTEwNjVmMGVlNmVmMGQ4MmJjMmFjYzEzMjhjZWZlMGUzZTBkOTU0NDU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uQXZhaWxhYmxlSW52ZW50b3J5VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZGZlNThjYWVlN2E0YzkyNmFlZjdmMmYzYzcwYzYxMzhkZDc2MjExNDM4MmY1NmEyM2ZmZWExZTBhMTRmNTc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uQ29udHJhY3RCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTkwMDk4M2YzYzQzZTlhZmJlN2I4MTFlZWU4YjgxMmY5YmMwMmQ0YmM5ZjVhOWJjNjFiOTlkNTFjYzE3MmRhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvbkNvdW50ZXJwYXJ0eVBvc2l0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImRlZDAwNzI0YTkyNjY3ZDQ0MmFlZjE4NWE4ZTNkOTEzY2M0ODk0NDJmYWYyNDUwNTgyYjIyNjUwOWJhODExZGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25JbnZlbnRvcnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNGY0OWI5Yjg3MjM4NTYyZGE4NmE3MzlmMmY2NWI3YTEyZjdkNDg0MDAxNmY0NzVhMTUzMTk1OGM4OTExYmM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uSW52ZW50b3J5UmVjb3JkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVhYTYyMmNhYWFiOTM2NmVmYjI0ZjFmZGYyZGJjMmZmN2IzNWYxOTAzOTYxYzM0OGM2MDg3MWIwOGVhZjk0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvblBvcnRmb2xpby5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODc1ZWE3M2IyOWQwMDBiYzc3YWQzYzc2ZDVjMWZmNmNjYjBhMjQzYzJlNmU1M2NkN2ZjNDM4NjY2NzU4M2U5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uUG9ydGZvbGlvU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzZkY2QxZGY2ZDY4NGQ4ZTJhMDM4ZGQ5YzQyNDIwODZlNDBlZjMyNjNlNTg2NmM1NGRkMDExYmU3MzRlNWViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9uUG9zaXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMThjNjlkOTViNDIyNTVjNGYwMzFjNTgzYjQ2YTljNTQzMDFhMDc4YTMwZjE3ZmMyNWE5MWNkODQwZjkyYTFkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnRwb3NpdGlvblBvc2l0aW9uU3RhdHVzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmZDI2N2FkYjI5MGM2ZDYyODYyM2I1OGYzNWNkYzkyNGEwZGY5ZTAxYTQ0ZmZlNjk0YWViZDA1OWU0YjdlNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50cG9zaXRpb25TZWN1cml0eUxvY2F0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYzQ1MjgxNGJlZjZlYjdhNTg0ZmM5NmVjODk3MmYyNDc0ZmM2OTFiN2JlMGYxMzdiMDJjZWJkNzZlZDBjZWFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHBvc2l0aW9ubWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUG9ydGZvbGlvU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzVlMDYzZDAyOWJkZDlkYTRkZDMzZDQ3MGJlNDFjM2Q2YTJlYTQzNWFiMzgzMTJlYmJlZGY3NDU2ZWZlNDAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93Q3JlZGl0TGltaXRJbmZvcm1hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImYwODRjOTY1NTU4OTgwYzlhYTlmMzgwZDEyYWJhZGI3MDNjYzMyNDQ5NTZhZjY2NDZmN2U3ZDVhNjc4OTQ5ZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dDcmVkaXRMaW1pdFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiYWQwNjNmZjhkMWUxYTNhMTJmYzUwOGQzZmM1YmViMDIzMDY2ODZmZTYyNGFmNzEzNTIxNDFiNjlhNWY5OWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dDcmVkaXRMaW1pdFV0aWxpc2F0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTk3YzM3MDk2YWE1OWU0ZjI2NzZjZTA2Y2I2MTc4YmZlYTk3MjRhZjM3MzMwOGI0Y2Y2M2E4NTVjZTY2ZjI5NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0NyZWRpdExpbWl0VXRpbGlzYXRpb25Qb3NpdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5MzE1MjFhMDU3ZjU4NDk3ZjMxZmY1MTMyZTUyNDY3ZWNmZDk5OGFiODkxNmVkMjllZmU4OTVjYjY1MmIwNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dDdXN0b21pc2VkV29ya2Zsb3cuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTRmNzI5MGJkOTU0NGFiZjJmZjBiMmViM2UyZWQ4Y2ZiODVhMGZjN2NhNzAzZTZiNTI2M2I1MzQ1NTViMmNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93RXZlbnRJbnN0cnVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ODNiOTczZTM4MTY3NTA3YmIzNTdjMGY1ZjE2Mzg3MzViNzU3NGM4MDNlNGI4YzkyODJmZWUxN2FmNzRiMmQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93RXZlbnRUaW1lc3RhbXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTc2NjA1MWVmMjYwNTU0ZjQ3MGU3MTg1MWNmY2U4MTRiYTBkODczMGY3ZjZiZTNiMTNkNjI5ZTBiN2I5NDJlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0V2ZW50VGltZXN0YW1wUXVhbGlmaWNhdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2NlM2UwN2M5ZGE0OWQxMzgyMjg5ZGU4ZTZkNjczZjczNTYwY2MyZTNjNjU2YmM1YTNiYjE3OTQ4NTBjMzNjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0ZpZWxkV2l0aE1ldGFDcmVkaXRMaW1pdFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzAxMDY2M2RhMzg4NWVkNzY1YmUwMzUyZDczOTJmODhjNzBkMWQwMTQ5OTIyODUzMGRiNzAyMDQzNWI5ZDU2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0ZpZWxkV2l0aE1ldGFMaW1pdExldmVsRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkNzkzN2JjZGUwMjJhZGIxZDEwMTEwYzlkYzVhYjllNzYwN2Q1NzE2ZjgwNTZlNjQ3NGYzZWYxNDdjMTE2OTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dMaW1pdEFwcGxpY2FibGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDUyY2FjZjBiMzM4N2E2Y2RiZTk1N2UxMDRlNzcyZDdlMGYyMjNjMTJhY2JmZDQ0ZmVjNDIwMmQzODA3N2I3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd0xpbWl0QXBwbGljYWJsZUV4dGVuZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlMGJkMmRkYTk0ZDUwZTQ0ZWM3N2ZkYmU3MDJkYjVlNWE2ZjMzODVkY2VjOTExOTUxMjIzZDlhNDg4NWJhYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dMaW1pdExldmVsRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImYxYWQyY2NlMjhiNTEwMWNiYjg5YzIxNWZkMDA5ZjI2NzdkZDQxNDFmZmMzOGNiZWM5NWVhYjk5N2E5NWM3ZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dNZXNzYWdlSW5mb3JtYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjIzMTg4MjQxMGM0ZDg5YWExNGMyOTQ5OTQ0NWNiMzYzMDcwYjQxZGFiNGE2MDQ3MDEyOTdjNzUyYzM0N2MyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1BhcnR5Q3VzdG9taXNlZFdvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzNkMDI0ODk5NmU5NTRlY2Y3ZDVjNmJjYzdlOTRkOWMyMjk1YjEyYmNjM2VhOGNmNWU5OTMzZWMyNGE2YzIyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1ZlbG9jaXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzkyMGI3MWVjNTVmYmYwYjk5N2RmYWQ1NmJiNjIyZGVlZjY5ZGNlYzllYjdmMDA2NDQ4ODA0YTRhMzJlYmQ0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1dhcmVob3VzZUlkZW50aXR5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2Mjg3Y2ZmNDA1Yzc2ZThiNTZiMzc3MjliZDU4NTYxOGFiNmFmN2U1MTM3ZmQ2Y2NkNzRlYjllYzRkOWNjODQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dXb3JrZmxvdy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2ZDlhY2JiZjZiOWRhZGNjZWNkZTY1MzJlNjAyNzhjMDllZWFhOGMwZjRlMzg0NDYyZTFiNWVkMWYzMDQwMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dXb3JrZmxvd1N0YXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlZmEwNmE3ZmQ0MGJmNDljMWU5YzEzMzMzYzVkYWViNjYxYTMwOTJjN2FjYzk2NWJhZjhlMmY2NzQ5ZWZjNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWV2ZW50d29ya2Zsb3dXb3JrZmxvd1N0YXR1c0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTU5Y2UxNzdhMDRjOTQ5ZDFhZjcxMGU4OTNiYzViYmJjMTk3NTEzM2YwMDQzNmExN2NkMmJhNDNjM2M4NDY0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtZXZlbnR3b3JrZmxvd1dvcmtmbG93U3RlcC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3N2ExYjM5YTI3MjNmNTkxNmNkY2Y5MjE2ZmYzZTlmYzAxMGJlNTdiYTNmYzdhYzhiYTMyMjcwMDE1YTk2NTM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93V29ya2Zsb3dTdGVwQXBwcm92YWwuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZDBkNjcxYTg2NzM5NGZlYmIyNjQxMzdkOWE4OWFlYTU3Zjk1Mjk4ZGVlYzA1ODBmMWNjMDhmZjljZDIyMTYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1ldmVudHdvcmtmbG93bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhV29ya2Zsb3dTdGVwLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFmYzg2OGI4M2NiY2ZkYTYxZjA0ZjljZTIxZTVkM2JiN2VhNjlhN2Q2ZTEwODU2MjVlODc0YmZiZGRiOThhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQWRkcmVzc0Zvck5vdGljZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzE4ZGUxZWQ4ZTVmZDg2OTZhZTE5NWZiNjg0NTUzNjZiNjFjNDVlZjFhOTE3N2VlNDVmMjMyYjg0MDJiMjA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25BZ3JlZW1lbnROYW1lLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM4YzhmODIzZWEzMDExZTAxY2QxMTZiYTdkOGQ0MjQyN2ZkYmNmYjQ4NzQ0NDBkMjM3ZGI5ZThkZWU2N2M1OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkFncmVlbWVudFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE4YTI4MGE0ZTM4ODUzYTVjZDQ2ZWRhYmY3ZTYzYTVmYTU5YTgxNjQyZjRlZWQzNDM1MGY3OWFmOGUxMTUxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ2xvc2VkU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjljZDE0Y2NhMGM5M2Q3MWRhMzg0NWQ4MjVkOTlmNTIyYWNhNDVjNTA5YmUyNDA4YTFkYTZkZjBjZDBiZjM2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ2xvc2VkU3RhdGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImFlYWVmMDJkYzc5YTdiMjBlYjM1MjkwNmU2MGEzY2M5NzAwNzI1NDhkMjQxMzhjZjU5MTQwZDQ0Nzc3NDFkNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkNvbnRyYWN0dWFsRGVmaW5pdGlvbnNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlMjg0ZTE0MDBkYWQ3ZjYwYjM2YzFlMGU2OTA0N2Q1Yzg2NWE4ZWUxNWZlNTFlNDdhZjlhZDEwZDI4YTc3MWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkNvbnRyYWN0dWFsTWF0cml4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmVhNGU5MDY3MzViYTE4MjkxMTU3MGE3NTkwZTA2MGNiM2U4MmM2NzdjOWJhNTMxYjZjN2UxMzk0YjBjNTE2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ29udHJhY3R1YWxTdXBwbGVtZW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTUzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3ZmQ3ZGNhZmNiM2I0MTI1N2Y5YTAxNDhlMjA5MjhkNGY0MTViYjFiMDYyMGZmYjI3M2JkOGI0ZDgyZjdhZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkNvbnRyYWN0dWFsVGVybXNTdXBwbGVtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2EyYmFkNzQ2MWIyODlmNjc3ZjdlYTMwMGFmMTU2MjA0MjVlZjc0ZTkwZjVkOTM2N2MxNTI5MjA3MjU5NzdkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ3JlZGl0U3VwcG9ydERvY3VtZW50VGVybXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI4NzJhYTJlZTJmNmY1MGUxNTBlOTVhZWE4YmY0NWYwZTE0Y2FhZWZiMjNlOTMyNTg5Mzc0MDQ2NzY2ZGQyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uQ3JlZGl0U3VwcG9ydFByb3ZpZGVyVGVybXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzE3N2NkMTk0YWNhMDgzYjAwNzgzMzUyYzYyNjkzN2RkMGZkMWQyYjAxMjkwMDdhZDVkMjBmMjliYWE4NTk1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uRXhlY3V0aW9uTG9jYXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjgwZGU4Y2JkYjg4ODY3OTgyZjRiNTNiZWViM2YyZTM1YTU2ZWIwY2ZjZTlkNTQzMGMyYjA2NDIyZTY0YjQ2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uRmllbGRXaXRoTWV0YUNvbnRyYWN0dWFsRGVmaW5pdGlvbnNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzNTIxNTZkYzJjODUyZDQ2OGMzNjZlOTA5MjIwNjZhOWJhYzU2N2RiNmIyMTcyOWNlYmQ1NTU4ODVhMDAzNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uRmllbGRXaXRoTWV0YUNvbnRyYWN0dWFsU3VwcGxlbWVudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTMyNDY0YjVlZmE5MGMxNmFiNDQ0ZDY1ZjRiNTQ4ZmY5OWRkN2FmZWZjYjAwYThjOWI2YjU3MmY2YzAzOTMxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uRmllbGRXaXRoTWV0YUdvdmVybmluZ0xhd0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWFkMjg5ZmQ0ZTNhY2ZmZDUyMmQ1MzNiYzhjZmFkM2U4ODcyNjA4YjAwZWFiZGE5OWJiNTIzNGMyZTY4ZDVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25GaWVsZFdpdGhNZXRhTWF0cml4VGVybUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Yzg2OWI3ODA4MjhiM2QyMmZlNDI5ZDEyM2Q4MTVhYjY1YTAxMzNkNzY3YTNjNjhiN2YyYmU3ZDVkNTA1NWY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25GaWVsZFdpdGhNZXRhTWF0cml4VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjA1MzAwMmRmZjM3YTQ0OTE4MWRmZjA4ODEyMGU0NTM1ZTQ3OWMzZjYzNDEyMDYzNjY3NDk2YzU0OWRjOGI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25GaWVsZFdpdGhNZXRhUmVzb3VyY2VUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwMWE0MzRjZjEzYjRhZWRmNTc0MDQ3MjVmZjMwZGIzYmU2MzY3MGRiYmU0MWI5Yzg5ZjQzOGFmNzE4M2JlZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkdvdmVybmluZ0xhd0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDY0NzQwYTc5MThmMmJkYTE0MjU4M2FjNWMzZTE5YzZjYWRhNGY3MzA5N2MyYmQ3OGJlNmRmOWIxZGY3YjNkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTGVnYWxBZ3JlZW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI1MTdhYjVjNjZiYWQzOWI0MjhhYjZiOTcxNDUwNTdmODVkNGEyMGE0ZGU5YzY3NmU0NjkyOGE1YzRjZDE2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTGVnYWxBZ3JlZW1lbnRCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMmI5YTlhYTU2MzlmY2E0NWFjZThiYzcwYmFhNWRhYzAzM2Q2YWU4MmQwMzM1YTExYmM5ZWEwNzdlZDM1N2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkxlZ2FsQWdyZWVtZW50SWRlbnRpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTAzYTg3Y2MyNTE1MzIzNTIxNDA3MjgwNTZhZDljZWQ4YTgwYmJiYTAzMzhiN2YyZjZiY2Y5ZmNmNGJhZTYwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTGVnYWxBZ3JlZW1lbnRQdWJsaXNoZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0OTdjNzA2YTNlN2FjZmEzNWVhZTg0ZThkZDQxYTgyOTBjMWNmZmZkMDVlYTg0MzMxNWUwMTQ4NTRhNDZiNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbkxlZ2FsQWdyZWVtZW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWQwOGE0ZjkxMjFhMDZiMTgzNGU3ZDc5OTIyZTRhNGU1YTU3NTIzZjhjZjlhMGZkNGFhZWJiNWFkMWQ4NmIwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTGVuZ3RoVW5pdEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzNhYmE1Y2VkMGI5MWRlNGNkMTdkMzA3ZGQ5YmRjNGFlNDUyM2U5OGRjMGFlYzQ3ODU3Nzk5MTE4OWY2ZTczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25NYXRyaXhUZXJtRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTZjODc5OWQ3NDk1YzIyZGJmZmY1YjNmNTI1ZmE0NmE4MGNmMWU0MDkyNWNhN2Q5OThhYzQ4ZDEzYWFhOTQ4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uTWF0cml4VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZTZhYmQ0ZDQyZmViMjE4OTEzNWUxMDg1N2QwMTUwYTgyM2UwOTFkN2ZhNzdiZDk2MGY3MDU2N2Q1NjhlNzA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25PdGhlckFncmVlbWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzYjEzNmFjNGQ3ZDFjMWM5ZWRlMzIwYjY2N2Y1MjBmMjc0ZGM1NGY1NTcxOGI1YTVlNDVhZWI3ZWIxODFlZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vbk90aGVyQWdyZWVtZW50VGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTU4MDI2MWQ4NzcxYmRkNTY2Njc2MThhMjY3NzkyNDdiOTI0MmY2MWNlMzM1ZDFkNGVmOWFmNWQ1YjBhNWJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25SZXNvdXJjZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzM3NGVkNDg4YzQ2YmU2ZjgzNzhjZjVkMWM4Y2NjOWM2ZmYzYmViMzM3ZmExNDk4Y2IyYjQ2NjcxYzJiODc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25SZXNvdXJjZUxlbmd0aC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxZDkzMjA1YWVhMzIxNGM4NDJiZTliNjJjZTgxMjNhYzk1MzhmODM0YzEzN2FkNTk4ZTdhNGFlY2RkZmJiMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vblJlc291cmNlVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzYxMWVlYjU0YzFjYzU3ZTY4ZDliNDhiYmJmZmQyMzFhM2RiYzFjZWIwYzYzOTYyMDZmNzNiNzgxMzU5OTA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25TcGVjaWZpZWRFbnRpdHlDbGF1c2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDlkZGE4MDlhYWVlZjgzYmJkZjE5MmZhY2FlNTllZTJiOTQ1Yjg3M2JlNjQwYjA5MjU1ZTIyNWZkY2JjNjE0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uU3BlY2lmaWVkRW50aXR5VGVybXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwMjhlZDJhNjg4ZWQ2NDBiOGI3YWFhOWU2ZjNjYjk2MWIyYzc4N2MxNWNhMmU1MTIzMDIyZDA5OWZlMTU2MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbW1vblRlcm1pbmF0aW9uQ3VycmVuY3lDb25kaXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDdjZTI5M2Y0NTFlZGJjMzQ2YjMwMzJiZDI1MDliMTBjOGVkNDc1NDdiMzA2ODY0MTkwYzVkZDFmNTVhNTc3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uVW1icmVsbGFBZ3JlZW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDgyNTYwYzE1NTk2ZGM3ZTY5ZGIxZjNlMzMzMzA2YzUzOGNkMDVlNTg4NGJiZmNjMGMyMjEyMTIwNDg0MmIxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9uY29tbW9uVW1icmVsbGFBZ3JlZW1lbnRFbnRpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNWQ5ZDgxNDk5MjNhYTgxZmY3ZjIzYWE4MTMxZDk5NWE2ODZiNjQ2MDZjNTVlNzQwMmFlZGJiNGUyYTI2Mzk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jb21tb25tZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFMZWdhbEFncmVlbWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NTk1MzgwYzZhNjc2OTdkMGU3NGE0MTFjZmIxZTBiYjI3MWJiNWMwMmM2NzQwYmRjNzlmNjM5ODVmNTZkYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNvbnRyYWN0QWdyZWVtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2M2NiODEwZWYzZTU2MjU1ODczMGZiOGMzNjcxMWQwMzljMDUzN2U2YzNmMWVkNzc4OGIyNTU2ODI0NWYwNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNzYUNvbGxhdGVyYWxUcmFuc2ZlckFncmVlbWVudEVsZWN0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlMDA2MjM3OGFhMThiNDFkODZhOWQ1NGQ1YjkyM2VmNzRlNDc5MjRlZjA3NDA2MTJlZmQ1YTQ4Y2I1YmY0YTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbmNzYUNyZWRpdFN1cHBvcnRBZ3JlZW1lbnRFbGVjdGlvbnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMjdhYTZkNDNiYmYwMjE3MTg0MjEyMWY1MmVjMGE5MmMxYjQ4NGEzMDVlNWUwZWZmZWU3MGYxYTA0NzE2NzEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25jc2FTZWN1cml0eUFncmVlbWVudEVsZWN0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxNTk2NTJlNmJhNzU3OWE0ZmNlZGViNzQ4ODQxZmQzZTZlMzFhNGVhZTY1NTc1ZjBlNTBmM2QxMjIwNzQzM2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckFkZGl0aW9uYWxEaXNydXB0aW9uRXZlbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImFmMzM2ZGU3YWViYmIzNDI2MDVmMzFmMjQ5ZjU5Yjk0M2QyMDE1MTFjNDFjZTZkOTBlMGQ3MTJlODVlMjNiYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckNsYXVzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNlZDQzM2I0MGYyOTljN2YwN2Q1Mjc1N2NjZjlkZjg1ZmUzNGQ3Y2NkMmJhNWY5NDM2OTM0OGVkNTZlM2YxNDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckRldGVybWluYXRpb25Sb2xlc0FuZFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDRlNmNiZDU0NzViNWVmNjU3NGYyZDFmZjEzMmUwZTc3ZmFjMDkwZmNmODhhNWNmMzI3OTRiOTFiMzYwMTY3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRXF1aXR5QWRkaXRpb25hbFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhhZGM3NGFiYzIyYzI5ODkwYzU0M2Y5NjkwOWE1YmU4MWYwOTBlMzFjYzIyYjM5YjljZjg1OGEwYmQxYmNkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRXF1aXR5Q29ycG9yYXRlRXZlbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGJjYTUzNjcyOGZlYTUyMzAzNzYzODU1MDMyNmM0ZWE1ZGYyZGVlYWZhNzEzODljM2JhMjljZWRkYTdiYjdmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRXF1aXR5TWFzdGVyQ29uZmlybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWJiMDRiNzcxZTVkYTRmZmRhNWFlYTE0YTVkMjE4MGI5YmJmZWUwNmY1NzcwOWZiNDM1MDA3NDcxNDc0MGVjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRXF1aXR5U3dhcE1hc3RlckNvbmZpcm1hdGlvbjIwMTguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzJiOTVmN2E1Mjk0Y2YzYTlmNjIzZTU0NThmOTJjYmU4MTQ2NDJjNjdiODk2Y2IwNzJiZDAyMmU5ZWIxMTNmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyRXh0cmFvcmRpbmFyeUV2ZW50cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTA4OGE0YWUwNmRjYzc3ZjgxMjY1ZmM3YjQwNGZkMzI5MDIxZjk3MTIwODIzZTM5YWQyMTk0NWQxNmI2NWRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJGaWVsZFdpdGhNZXRhTWFzdGVyQWdyZWVtZW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYTU1ZTlkZTRjOGIyYmVhN2NiMjlkNmZmZTFhZDg4YThiNTU0ODE2OWNkNDgzNjBjMjk2MWRmZDM2NmNkM2JiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJGaWVsZFdpdGhNZXRhTWFzdGVyQ29uZmlybWF0aW9uQW5uZXhUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxZjVlYjE2MGIzZDc5OWU3NTg5ZDlmZjkyMDY2Yzc2MjdkMjNhNDIzYmE1YTZiMDMyYTM2OGY4M2IxZjIzMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckZpZWxkV2l0aE1ldGFNYXN0ZXJDb25maXJtYXRpb25UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU5YzEzZmNmYzMwYmJlYmNkZjU3NWM4NmI2YWE1ZWJlNGM4NWRhZjdhYzkyNjU1YWIzNGMyOTYyOWYxMTZmN2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3RlckZ4QWRkaXRpb25hbFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDIzMmRhODgyNmE4MmQ0MWFkYzM1MjM4MGQ5MTQyNzBjMGNkZjA2MTkzYjFiOThjNDljMmQ2OGMyZDRmN2I5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVySW5kZXhBZGp1c3RtZW50RXZlbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTMwOGJhYTViMTMzN2E1OTc5ZjU1NmQzMzY0MTQwZjRhZmUyMzdkYThmOGQ3MTFmNjZlZjYxNDYxYWJjY2YyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQWdyZWVtZW50Q2xhdXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3NTk2OGU5NTYxMGRhMTZiNGZmOGYzZWRlZTAxY2UxYjExZjMwMzNmZGZiYjM4MDMyN2EzOTVmMDVlZjdkOTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck1hc3RlckFncmVlbWVudENsYXVzZUlkZW50aWZpZXJFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiZmM5ZGYzMWUzZTRjM2JjNTRjMTUxZTc0OGRjMDRkNGQ2MDU2MWZmNTQ2OTJkM2M2NzE3MTA3YjUzODNiZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck1hc3RlckFncmVlbWVudENsYXVzZVZhcmlhbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZThiMDRlYzM1ZTM5ZjQ4MDgzMmJjMDM3ZWFkM2EwYTg0ZDdmNDUwYTQ0MjE0NTJjNTY0Yjc3Y2FjMzIyN2FjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQWdyZWVtZW50U2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYWI3OTQwZGJlOTMzYTVkODZlYmY0ZGJlOGU0MzQ0ZWU2MmY3N2EzM2YwMWY4ZThkZTljYTkzZmEzMzc0MzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTc1MTNmZjM2NzMyYTNlZWI3ZmNkZTRlYTFkOTQ5MjkwYzExZWM4OWE1MmM2NDQwY2FkMGEwN2E1ZjYyOWFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJBZ3JlZW1lbnRWYXJpYWJsZVNldC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkZWVjZDNhZmJmYzQ2ZmE3ZjdkMmZjMzY2NjBlZGE1MDRiZjIwMTdhOWI5YWE1NDA2Mjc0ODVhYzg0YmQxZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck1hc3RlckFncmVlbWVudFZhcmlhbnRJZGVudGlmaWVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1OTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGY1N2Q5M2FlOWM3OTJhYTlkM2YwZDA1ZTliOTM3NzE0NzdlOWIxZTFmN2ZlNzIxN2ZiYTc2YmNkYzMxMmQxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQ29uZmlybWF0aW9uQW5uZXhUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWU4MGIxMDJjZDQ2NDIwY2MxYWMzYzMxM2RlZDEyNzk5Zjc4NDdkMmMxNDE1NTQzNWYxNzE2YjYyOWI1NzFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJNYXN0ZXJDb25maXJtYXRpb25CYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzVkNGZlOGZkMGQ2MTRkNjYxYzcxYzFjYzMwMDdlZTk3MTJmYmFhOThlNzhmZjAwNWNhZDEyMmFjYTI2MDQ0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyTWFzdGVyQ29uZmlybWF0aW9uVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzU3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhMTZlYjJhZTRiZDNlZjA1ZTE2NmRkYTViOTE5NzkzMmUwYjkyZjZmYmZiMGYzMDExYjhiY2Q4OTliYjU2MzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbWxlZ2FsZG9jdW1lbnRhdGlvbm1hc3Rlck5hdGlvbmFsaXphdGlvbk9ySW5zb2x2ZW5jeU9yRGVsaXN0aW5nRXZlbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjhlNDQ5OTYwZGUyNTM2NGIyZWJiODhkOWY0ZDg2MjRhYmI5OTliZWNlNzkxYmYxMTFlMjcyNGZlNTY1MmE2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbGVnYWxkb2N1bWVudGF0aW9ubWFzdGVyUmVwcmVzZW50YXRpb25zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZjVjYjE5ZGYxNmJhYjQ5MzZmNGYyNzBlMmEwMjFjZTNiYWE2YmRkNmYwMmMyODMyZmY2ZTI5ZmYzNzJiOWU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJUcmFuc2FjdGlvbkFkZGl0aW9uYWxUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYThmMDdhN2QzNjk0ODY4OTQ0YWI0OGRmMzQ0ZTQ1MTIyMDAxNTU5MGM3MjRmYTMzYTdmZjMwY2E1MGY3MzgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1sZWdhbGRvY3VtZW50YXRpb25tYXN0ZXJVbmRlcmxpZXJTdWJzdGl0dXRpb25Qcm92aXNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGI2MDliNDI2ZmMwZDgzMzM1NmU5OGY5ZDc3YzBlYmFjNDMwMWFjMGMzZDFmODc2OGI1NjU4NmFmZTEzMjM3ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbWFyZ2luc2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0MjdjMjAzMzg2YmY2YmI4ODI5NDNlNTJiYzFmNGJhYWU1ZDI3Nzc2NTY0ZmYxMTNiMzgwNGM3MDczNGU0YmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW1hcmdpbnNjaGVkdWxlU3RhbmRhcmRpemVkU2NoZWR1bGVBc3NldENsYXNzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhZDZlMGEzMzAxYzRmYWM1NDZmMzM4ZjY0MmY0MjVmYWQ0MDdmMzIyMjU1MTE0M2ZlNzZiYmZjMzgwOTUxOTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW1hcmdpbnNjaGVkdWxlU3RhbmRhcmRpemVkU2NoZWR1bGVJbml0aWFsTWFyZ2luLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDUzNWY2OGFjMzRlMzg4OTcxYTJiM2EzZDNmNjNkMzg0ZDMwZGEwMDRhZTAxZDc4NGY4MDhjMjE1NTE4ZmU1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbWFyZ2luc2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZVByb2R1Y3RDbGFzc0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDAyOGU1NmFlYzkwYTg4ZDhlZGIzNzc3MWUyNzljZDI3YWU0MDFlY2YxMDg3OTIyMjZhNWYzYjMyMjA2ODEwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtbWFyZ2luc2NoZWR1bGVTdGFuZGFyZGl6ZWRTY2hlZHVsZVRyYWRlSW5mby5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImExZTIzMTc4MzkxZDVkMTZiZTU2NDAzMGJhNTBmNzM5OGM2MTRmYmNmYjc3MGEwMTMzOGUxNzc5ZGNmMjViOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEJhc2tldC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODRiOWM3ODlmNDc5MDE5YWVmNzRjNzQ1MDU4ZTQ3MTNmYzE1YjYwNjljMWM0MjA2OTlmZDVlM2FkYWU2YjJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRCYXNrZXRDb25zdGl0dWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzljNTI5NWViMzAwNjdlMTc3ZDZjOTJhNWI2YmFlODdlMzg3MDM4MzU3MjBlNjFiZDE1NWEwM2ZjY2RjZThmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDYWxjdWxhdGlvbkFnZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1M2Y2ZjFjN2Y5ZWM5NzVlYWQxZDMyYzdlMGM4MzdhMWQ3MTNmZTJmNTQ3MGJlNzRmMGNkYWIwNWVlMjVlMGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENhc2hDb2xsYXRlcmFsVmFsdWF0aW9uTWV0aG9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1MWJlMmEyYTg1MDg2ZDBiMjJiOTBmZDc3NTQ1MGY2MTU3NGU3NTM1YmY4MWEyMjRhMjNlMmQ5ZGRjYTU4OTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENhc2hQcmljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyMWJhYTFjYzA3NDIwZDk3Njc2OTY5MjkxZjc2YzE0ZjI0YTRkOTQ4ZjU4OGM0MTNjMmFiMWE4NTM4ZmFhODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENhc2hQcmljZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDE2Y2EwNjRmZmUyMjQyZjE4NGZiYWUwNjMwMzJjMzY3ZTdkM2QzMTJhZTk2YzI5M2QwZWZjYzA0OTcxNzY1ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q29tbW9kaXR5UmVmZXJlbmNlUHJpY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTkzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4ODNmZDE0NDFmNzc4ZjY4NTI5OWE3YjE1YjhmYmFhYzAzN2FkYmE1YzhiZGYzNzc1ZmEwMzYzODRhMGVkMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENyZWRpdEluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImExYzY4NTE0NGNmNTdjZDk2NjAzNGRkNzY2OGJmMDJmODY5MzNhZjRhM2VjOWJhYmU3OTBkMmFmMjViZmM2YWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENyZWRpdE5vdGF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYTRiMDQzYzZiMmVkMTFhMGYzZDcxNTAwYTY3YWEyY2E4YzllZTVlY2EyMjYxYThjMjk4ZWM1ODYyZjQwNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENyZWRpdE5vdGF0aW9uQm91bmRhcnlFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzMwYTc0OWFkMzZmMjg0OTFlOTU2NTA3NDc0NWRjYmQ0MWMxYzQwNmUzMmZjZjkzZjk0YTEzYWViNTVlYmI3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0Tm90YXRpb25NaXNtYXRjaFJlc29sdXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1NjNkMTRhMjYyYTZjZGM5MmQ1NzgzNWIxMmMxODA0ZWM0NzE4Zjk1N2I1ZDNhNzJhNGNiZDZlNDUwY2RlNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENyZWRpdE5vdGF0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhNGUwNWMxY2I4NTgzMzQ5NmIxMzMyMDIzMjZlNDFjYWJmZTE5NTJlOTFkNmExMDgzMjhlODdiYWI4Mzk4ZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENyZWRpdFJhdGluZ0FnZW5jeUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTZhYjJjODE2NTRhMWM5YWRhODUzNDdmZTJhMzFiYzY3ODlkOTFkNDRiMjQ4ZjFkNDdkYTNiMjEwNWQ3NzQ1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0UmF0aW5nQ3JlZGl0V2F0Y2hFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODcxMmM2MzFiN2RhMmNlMzIxZDVlZDVjNmZiYTNiNTFjMzIzMzI4YzVkZmMwNDY3OTU3Njk3ZTk4ZDg0NDdmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3JlZGl0UmF0aW5nRGVidC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMwZGU0YzRjOWNhM2NiNmUwYWExOWE2NGVlNjc5ZDc1OTFlZWUzNTc2MjNjMzBkOThiMDcyNDAxMTRhNTk2YzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldENyZWRpdFJhdGluZ091dGxvb2tFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmEzYzg1NGM3ZDFhZDNiODZlYzE2ZjkyMzE2MDhiMjhiNmYwZjcwY2MwYmFkYjU2Yzk3Y2YzMjk3MjhmMzhhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Q3NhVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDM4MGRkOTllOTZhYjEyMjgzZTllNDc3NWIwMjhlZWIyNWZjZGM3MmQ0YjFmZTE2OTVkZmRhMGFjOTM0MjJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRDdXJ2ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiOTBhM2ZiMmViMDNkNDIyY2Y4MTBmNmMwMTU2OThlNzdlOWZmMzQ3NjM2ZmUwZGZiZjllZmQ3ZDFmNDA0MDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldERpdmlkZW5kQXBwbGljYWJpbGl0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Yzc5YzAxZDM3MDA3MzI2ZTJkMmRjZjI4Y2RmMGQ1MTBiNGRhNjc3YjE2NDIxMTE2YjJmMjNiNWMwYmVlYjE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRFcXVpdHlJbmRleC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNmVlNGVmNWUyNmE0YTFjM2Q2N2U4YzQzN2MzNmQzMGYyMWIzZDk5Zjk0ZWIzMzc2ODBhYjE1ZjA5MDExNmY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGYWxsYmFja1JlZmVyZW5jZVByaWNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2M2JjZDhkODU2N2MzN2QzNGM1YTcyZDlkNTA3MjQ2Njc3MGJmMjBhMDA5ZTRkZDBkY2FjNTRlNTgxNzdjN2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZlZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1NmI5YTM1YWFjMjBjNDUwYzY4NjNhOWJlODkzODY1NTJiNzllZGFiMjI0YzI3ZGQ4OTI3ZTI0YTJlZWU0OGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFCYXNrZXRDb25zdGl0dWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkMTVmZDFhMzk5ZTVlZGYyYWY4ODliZjRiZjM5ZTE5OGY5MTdmNTFmNTcxOGY2NjcxMzhmNGY3NWRhMjJlYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFDb21tb2RpdHlSZWZlcmVuY2VQcmljZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjA3YmJlNTM2ZTIxMzFkYzE5OGZkOThkZDljZjhhZTIwMGQ3MDgxY2U5NGRjYTA1MzQ5M2EzNWEzZTZkNjZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGaWVsZFdpdGhNZXRhQ3JlZGl0Tm90YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYmJhYzg5ZGIyNTcwMjkxMTlkOWFkYTFlMjRlYTg4YjdmY2Q4ZTc4ZjI4MDU3YjRjZjg1NzZmZjRiNzA1MDU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGaWVsZFdpdGhNZXRhSW5mb3JtYXRpb25Qcm92aWRlckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMGQzMGI2OTc4MzcyZTM0MTllZDg4MGQzODUxYjc1NGE4YWE1OWIyMTNhMjBhZTZmMDYyZWRlZjk0ZGZkMzgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGaWVsZFdpdGhNZXRhSW50ZXJlc3RSYXRlSW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOWEwYzZjMGVhMjQ3ODZkYjI0N2FhYjFkYTYwMjIxODI2NzEyODM0YjBlZDZlNmU0ZGFiMDZhYTA5ZjJiZWNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGaWVsZFdpdGhNZXRhSW50ZXJwb2xhdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MDFiN2Y4ODI3MjIzM2M1M2QxODkwZDZmNDliYzJmMWQwMGJiYTgwNDZlYTE1ZTJmOTc2NDdlMzYyYmIyNDRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGaWVsZFdpdGhNZXRhT2JzZXJ2YWJsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4N2I5Njc2YWQ0NjkwOGRjMjUxNjJjYTcwMmM0ZDA5M2RlN2VhNTBiOTQ2MTM5ZWM4NzliNjY5YzYyODZjOGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFQcmljZVNjaGVkdWxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEzYjNmZWZkMWEyNDEwNTNmN2QxZjRlNjIwOTEyMzVkYWVkNzJiMGFlNzZlZTY2Y2UxZWU1MjY1ZGZlM2Y0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RmllbGRXaXRoTWV0YVF1b3RlZEN1cnJlbmN5UGFpci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NjljNWY4NjA3YzgyMTUyZmU3MDBmMjI1YjE4NDcxMTIzOTcyZDA0YjdiZTFjNzdjZmY2ZWQ2YTk0NzVlN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEZpZWxkV2l0aE1ldGFTZXR0bGVtZW50UmF0ZU9wdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWFkMWYzYTA5MjkxYzlhZDJiNGExN2QwODBkZGE1OTVkZTg0NzQ5MGJkZjk5OWU1ZjQzYTA5NTJhMDE2NDExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGbG9hdGluZ1JhdGVJbmRleC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzRmYjA1ZTJlNTVmMTYzYmJhOWNjMjQ0OTEwN2U3YWE1YTJlZTRiYzEzMzk3ZmRjYWVjNjczMTkwMzMyYzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGb3JlaWduRXhjaGFuZ2VSYXRlSW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDg0M2VhOTkwNGU2MmE4MDQ1N2E2OTgwZjc4MjRhOTY0OWFlNmY4M2NmNDRhYzA2Y2Y3ODQ4YmQyODQ0M2FiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RnhJbmZvcm1hdGlvblNvdXJjZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2IyNjkyYjdiM2ZmMWFkNzliYTM2NjljN2QwMDJhNWEzOWMxZWZiZTJjN2QzOGZjNDdjODc1ZmJjMTdhNjZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGeFJhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjdkYWJjZTc2NmE5MDk5NTA5MjA1YTNlZDc3YzlkY2FjNjkwODFjOGIwMmVmOThkZWZkYjRlNzI4YjRiNzI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGeFJhdGVTb3VyY2VGaXhpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTUwOTg5YzM3ZjNkNTQyMjA3YzA3MzJiYjhmNGQ2M2IyM2ViNjVhYTg0OWFhYWIyY2I2ZWM2M2JiNTM4NjBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRGeFNldHRsZW1lbnRSYXRlU291cmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGQ1MDc5MzcwOTRkOWNiYjFjZjBjMGNhN2EzMWMwMmRmZGQ4ZGMyODA3NDM4NjY2MTk5ZDk5NDNhOTE4ZTM5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0RnhTcG90UmF0ZVNvdXJjZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg2YTNjODk3MWUxNmMyNTMyNGViMTFhY2E4NWQ1ODQ3NzA3NjkyOWI0MGFjMDBkYjdiMTJkMWVhYWMxY2ExMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImExMWMyMDg4OTMwMjBiMTgwYzM4ZjM5YWU0MzEzOWRhOTMwYjAyYmVkMzAwOWNlZWJhODU2YTBkNWE5MDMxMTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEluZGV4QmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDkwMWU5NjljYjg1MjIzNTM2OGY1OGVmMDhiOTFlNzUyZGRjMTRiNjIxZTU2ZTdkMTA2N2M3OTE1NDQzZTdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRJbmZsYXRpb25JbmRleC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWMwMmMxMWQ5NjdiOWE2ZGNjMTE0ZTgxZTQ4N2EzZWM1OTQ0MDEwMzI2NGM1OGJhYzdjNWEyZjE0YTZiODM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRJbmZvcm1hdGlvblByb3ZpZGVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNzk4NTZjZjhhODEwMDg1YTA1YTViY2RjOTFlYWQzOGM4Mzk4OWRiZGVhYzJmYjljYjkwZDM1OTQwZDc2YTEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRJbmZvcm1hdGlvblNvdXJjZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDQ3MzIxMWY2YmExYmFlODc3OWNlOGNhNjBlNGZmYWE0Y2IyYjk5MWY1N2U0YThlOTY2OWZjNzQxM2FiODEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRJbnRlcmVzdFJhdGVDdXJ2ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzZWM4NDA4ZjA3M2U0MzEzODczNGNkMzY4NWZlNDU3YTc1ZDI4NDQ2MmQ1Yzc4MGZiODMxY2MxYTM5MDA5MjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldEludGVyZXN0UmF0ZUluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJmYmE3ZjdhZDQ0MTlmNGRkODBjMjg3NTkyYWI5ODRlODJjZTRkNzM2MTc0ZjA4MjUyM2ZhNzZiZDBiZGZlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0SW50ZXJwb2xhdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2U5MDMyZjcwYWI0ZDMyMDI2NTljMTYwNmY0ZDYwYzcyNmRkM2U5Nzk4OGE4YWFhNDM5YmFmOTA2OTkwYmRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRNYWtlV2hvbGVBbW91bnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGIyYTVkNmM1YjIzYTIzMDQwNzZiYWYwN2U2ZGIwNTkzNGMxMzg2MDIwNzEwY2M5YjBlMTU1MGI0M2MxODE2NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0TW9uZXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDdlYmNkOTM3ZmEyM2JlOTI5NzJmM2I4MjZiYWNlMGU1MzZlZjY5MDEzY2JlZWIxYmIzMDgxMzU3NzNhNjJjOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0TXVsdGlwbGVDcmVkaXROb3RhdGlvbnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYzEzNTM0NzE3ODg3Nzk3M2Q5OGExYzg3NzczZGQ3YmIzN2U4MjExYjgyNDM5MGFmMjgyZDVkZDFiOTQ2NzlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRNdWx0aXBsZURlYnRUeXBlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhZjg3ZmRmMmY0MGNiNWY0ODkxOGMxNjIzNDA4YTg2NWViMjc3ZGM3OTNhZmM0MGUwMmI0ZmYwZjc5MDc5YTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldE11bHRpcGxlVmFsdWF0aW9uRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTI5ZGU2OTQyYjIwN2Q2MmNjYWU3NTRjMmMzOTA0OWFkOTBkOWMxMGIyNDYyMzA2NzEwNWY0OTlhNDBhNTJjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0T2JzZXJ2YWJsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2YjI1YzRmZmMyNjM0MzVjYTQ2MmExMDA2ZjU5ZGIzYThhNzBlZDMxNjFkZjlhM2I1YTk1OTE2YjExMjY0NzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldE90aGVySW5kZXguanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYyOGRhY2M5YWMwYTk0NjEwNmY1MWJmNzQyZDA3OWI4Yzg0NjE2MWJiOTQ4ODljNmNjNDY1MGE1MjJlMzQyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UGFydHlEZXRlcm1pbmF0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTVlN2Y0MDE2NmUxODM2NTE5OGJjMmNhMDYxMjkxMzg0OWRhMmU0MWVmNDY1NTAwODk2M2Q5Nzg1NjE5MDNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQZXJmb3JtYW5jZVZhbHVhdGlvbkRhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiNDVjYzM0ZWVlMDc2Yzk3OGQzMmU4NzUwNzQ1OGUwNmJmOTk3MTBjNmViYzM4OTk2YzUyOGNjZDczZWQ5MzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFByZW1pdW1FeHByZXNzaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJlZTM3YTVhZWFlYjE4YTRiNDFlYTkwMDdiZTIyN2NkNDRhNTAwNmJlOWY5M2U3Njg0YWE2YWZmNWU4ZTc3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJlbWl1bVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzAyZGVlNzgwMTQ3ZGVhN2YzMmFlNjgyOTUwYmFhZjAzNTFiYjU5Yjg4Yjk5NGY4M2ViNWE5Yzc1YmYwNDZjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWFlMDYzMzQ4MDZkZTNjOGI1ZTA2NmVhMmEwNmY0MjMwYTlhNWQ3NTcxN2ZmOWM2YTAwZjUyMjg4NTI1MWExMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2VDb21wb3NpdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQ2Yjc1ZGE3YmJiZWY1NmUwNTM1Zjk4MmVlYjJiOTk1MjY2OGFhODM0ZjQ5OGVjOGIyMzZjZDlkYWJhYTgxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2VFeHByZXNzaW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2MTNhOWU2YTQ3NTMzYzk1ZmYyYmM3ZWQ1MTBjNzhiMzM1NTk1MTM3MGMzZTZiOWNhOTk5MjBhZWE3MmUxZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFByaWNlT3BlcmFuZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTZhMzBhMmMwYzZjNjlmOTA0NDAzYjlmNWMwNmU0ODMwNGVhMGY5YjQ5MTlkMmE5NmQ0Njg0ZDgyYzc1ZjM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRQcmljZVF1YW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0ZmUxMmNiOWQ0ZmY5ZWNiOTk0NzQ2ZjEwZTM5NGM4MWZkNzY3MTI3Y2JjYWYwZWJhMmU2MDRmMTA1ZGM3MWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFByaWNlU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWJjMWZmYzhkMjE0MDI4YzFmN2VjZjNiN2E0YzZjOWE1MjlkY2YzMzVlMDhhNGY2MGE2NzdlZDFmYTRkYzhhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2VTb3VyY2VEaXNydXB0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk4ZjAzNWUwYTg5MDEwN2NhYWQ0YjEzYWE3MjJjMTkyZDJhZWJlYWVjODI4YWI4NzAzNDdlZWQwMGEwYjUxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UHJpY2VUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTJjZWExYWVlYzBmZTk5Y2YxOGQwMTk5MTVjZWM4MzU3NmYxZmVkZmZlMWZhOWM1MTljZDAxNjEzMTMwNjUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRRdW90YXRpb25SYXRlVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjA5YmJjYzUzMDMyODlmMjU1NWYwMDEyNzFmYTkxMmI4OWMwYWU2ZTA3Yjg0YmUwZmE0N2JjZGUzNGZhY2YwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRRdW90YXRpb25TaWRlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMjgyNmE5ZGZiZTZhYjdlZGYyY2RhNzAwNTlmMDYxMmYzMzNiZTUyNmM5MmEyM2EyNjRmYjdlYmYwMTY5YzEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRRdW90YXRpb25TdHlsZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzEzNjA0MjA4NWE5MjI4ZjQ2ZDExMjA3NmQyYjdkNmUxOTMxY2ZlZTMxY2RkODFmYTM1ZjRlYmQ1NzM3MTllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRRdW90ZUJhc2lzRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4YjI4NGNhNzYxNjcyODRjYzJhMTJjNWRiOWJmZDdkYmU2Yzg0YTMyZTIxOGI4Y2RiODIwMTE0OTVkZTEzMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFF1b3RlZEN1cnJlbmN5UGFpci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzM0MzE3NDM5Y2JhYzI5ZDNmZDE5ZDQ4YzBkMWExMjVjZmM0ZTc5Y2EyY2QwNGFkZDMxNmY0NTVkZjcwMWZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRSYXRlT2JzZXJ2YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDIzOWFhYWI3ZjFhYmJmNGU0YTg4MzY0YTFjZjFlZTdmODZjMzI3OWQ5M2E1NzIzMmEzMDYwODU0YWExODU2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0UmVmZXJlbmNlU3dhcEN1cnZlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmM0ZmU5YzQ1MjAyMzIxMDQ3Y2I4ZDgzZWM5ZDBmZDU2ZjFmNzkxNjhkODgxNWYxZDZmM2QzOTY5NjZjMGJiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0U2V0dGxlbWVudFJhdGVPcHRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZThhZjkxNzc4M2JhODc5Yzc2OGFjNzU4ZDdiNDIyYjllOTNkYmQ4MmM5NzI5ODc3ZmVjMTk0ZjNlMjk1MmIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRTZXR0bGVtZW50UmF0ZU9wdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImNkYTU0MmNmMTk2ZTIxOTg2MGFmMmVkMzgxODA0NzA1OGQ2ZTlhODFhNjU0NzViZGMyYTgzNDExMmEyMTM4NzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldFNpbmdsZVZhbHVhdGlvbkRhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Zjc4MGNiNjI5YTk1ZmY3YWRiMTYzNWUxNzM4ZWJlOWRlYjVkMDgxOWYwOWI2ZmRiMWQwNTMxOTEyZDNjMjk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRTd2FwQ3VydmVWYWx1YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzhjMzI0OWMwNjE2MTcyOGY0Yzg0ZGI1YTYyNTEyNzA4MmM0NmIyOTYxOTljNmJmNWU1YjI4ZjRhYjQ2ZDdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRUcmFuc2FjdGVkUHJpY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTlhMDAxNzg3NDJjZjQwNmVmN2QwOGViMjVmYTM3Njk2ZTMyMzcxNTIxYWY0OTZjMjA5MzIzMDg3Y2EwOTNlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0VmFsdWF0aW9uRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOThjZmFhMjI4ZTQyNWZmOGNlNjVkNDdlMmZiOWRiNzg4MzVmYWU2NjViZGQ3ZTRmNmE1ZTJiN2U1ZWZkMTAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRWYWx1YXRpb25NZXRob2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDMwY2VkZWIyM2JhZGQ4Mzc1MTQ0OWU3YTA3OTcwMDUyOTU5NDg1MTA0NTE1N2FiMTdhZTlhMGRhYjgzMzM4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0VmFsdWF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzRmYzA2YWY3ZWFjNDNhYTNlNTY2YTE5YjQ4Y2ZjZWZiNjljOTk0MzYyMDg2OWMwNGIyMDVmNjhiMzgyMWM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRWYWx1YXRpb25Qb3N0cG9uZW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NGYwNzUxMjU0MmI0ZjZhNzY0YmJhN2I3YzgwNmZmZTgyZDgwNzIyNGE4YjY5ZjMwNDlhYzI4NmE4ZWM3ZTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRWYWx1YXRpb25Tb3VyY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTI5MTBmM2I2NDYxMDdjODQ1ZTUwNGRkYWQ4NmM2MThhZGQ0NjFkZjBkZGJmNDk0NjUxZDAwNzI4ZmFiMjE1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVDYWxjdWxhdGVkUmF0ZURldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWNlZWRjYjJmZDQ0OTY1NzA4MzE1NWUyODZmNjg5YTMyZmI2NTllMmY1ZjI0YjhiMWZjZDc4NDFhYjAwNGNmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVDYWxjdWxhdGVkUmF0ZU9ic2VydmF0aW9uRGF0ZXNBbmRXZWlnaHRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2QyMTY0MDc3MThkYmNiZTcxMTQ2NDQxOTE1YmIzZmEyOTI5YzljMzVlYzVjM2I1MGFlZmNkYTE2NGQwMWQ0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVDYWxjdWxhdGVkUmF0ZU9ic2VydmF0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTJhMjVlOWFlZWU3MzBhM2Y4MzFkMTY1YmQxNDQxOGUxMjhlMmQ2OTI4ZTBmMzU4ZjA5ZjI1N2Q2NzllNDk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUNhbGN1bGF0aW9uTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyMDFlZWNkZmVmZWRlYTdjYzY0M2Y3MDNmMWYxYzVmMmQ3MThiYWUxYjNjMjUzYTQ1OGVjMjU1MGM1NTMwZjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGNhbGN1bGF0ZWRyYXRlQ2FsY3VsYXRpb25TaGlmdE1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmQ4ZThhOWVlZWJjZTE4ZjQ2YmM0YTA1YjVjNzU1YWRhMzJiNDE3ZGRhZGI1MzE2MTdlNWI0MjMzOWVhZDc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUZhbGxiYWNrUmF0ZVBhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGRhZjZkODFlZjlmZGIxZWEwNDZhNWZjOWNmYzc0NzFmYTcwM2FhNjdkZDY5YzM2MTQ1ZmJhM2MyNDRmZTlkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVGbG9hdGluZ1JhdGVDYWxjdWxhdGlvblBhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGEyMWZhZTE2NTAyNTZiMTQ4Yjk2OWE5Y2IxN2Q3OWY3NDdhMDRiZjdjNjE0ODU3YjFiZDc2YWVmNDI2OTY2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVJbmZsYXRpb25DYWxjdWxhdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMTk3MjBlODdjZDQ3OWFiNTc3MDg2NzM1OTVkMWE4MDUyZTE5OWVjOTFjYzAyNWNlYTFhZTRjNjJmNDRmOTllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZUluZmxhdGlvbkNhbGN1bGF0aW9uU3R5bGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE0OTk1Y2NjZDI4OGE4MjQ0ZjE4OWY3YzVkNzc3MjY1Y2M0ZTU0MTBjNTY3YjVmMjdhMGY3NDA5ZmMxZDM1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVPYnNlcnZhdGlvblBhcmFtZXRlcnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTdjOGNlOTMxNGMxNWEwMzI4Yjk1NTliYTM2Njk3OWNkMTgyZGQzNDk2YThlODkwOGYxNGViMDY2ZWJiNjIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZU9ic2VydmF0aW9uUGVyaW9kRGF0ZXNFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDIxMjA0ZjU4OTYyYjFiNzgzZjc4OGQ5ZmMyMjJjZDFkOGE0MjBiYzg1NmM2M2IxODg1NTc0YTBmNDZhNWM3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0Y2FsY3VsYXRlZHJhdGVPYnNlcnZhdGlvblNoaWZ0Q2FsY3VsYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzUzMTRmNDkxYzcyYmM0YWQ0YzZhNWZhMjQyNTcwOWFhZTdlZWUzMDMxNDEyYTJkNTQ4YTFhY2M5MGRiNTVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRjYWxjdWxhdGVkcmF0ZU9mZnNldENhbGN1bGF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzg1N2I5Nzc4YjI4ZDdlNmRjODU3NWU0NGIwYzU4YTdhYmExYTMzZTlkN2YzYjI0MjM1YmRkYjc2NjAzODMxNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0ZnJvRmxvYXRpbmdSYXRlSW5kZXhDYWxjdWxhdGlvbkRlZmF1bHRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQ1ZGNiMjg4MmE0NWNkMDMwYmViOGEyZTY0MzdjMzlkYTUyYzQ2YTBhYzUyMzNiMmM5ZTk3NTMzMWQ1Njk2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0ZnJvRmxvYXRpbmdSYXRlSW5kZXhDYWxjdWxhdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NzFlMjE0MWRmYWViM2EyODNjMGU5MjM1OGI1YTVlZmIzYjg1NmExYjY5MDZlM2NhNWQwNTNiYzNkNWY0ZjIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRmcm9GbG9hdGluZ1JhdGVJbmRleENhdGVnb3J5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjYWMzMjRkZTk1ZjY4ZjgwMjE1OGQ5MmUxODQ5NTdkOGJiMTkxNTEwZmIyOWM2NDI0YTIxNzVjMjcwMjUxNDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGZyb0Zsb2F0aW5nUmF0ZUluZGV4RGVmaW5pdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI4N2M0MTIwMTE0ZjYwMWQwYmI5YjNiYjA2ZGI1N2ViNjM3MDQ3YWQzMzM0NmJkYTc4M2RlMWZhYzBiMjhmOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldGZyb0Zsb2F0aW5nUmF0ZUluZGV4SWRlbnRpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNjk0NDc5ZmRjODI3OGM4ODY3Y2Q2ZWI0M2E5OTE0MzQyMjViMzlhZjI4OWRlODYxMWIwZWMwZWUyZTc2NzEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRmcm9GbG9hdGluZ1JhdGVJbmRleFN0eWxlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZmFmNGI0NGZhYzI4YzFhODE4MzkzN2ZkMjQ1MDdiYTNmN2JhMGZiYjkzMjE1ZDA2MDA2YjhhNzE5NTQ3M2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFCYXNrZXRDb25zdGl0dWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4YTQzMmY3OTBjNWFlMTNiMzJiOWEwYzUwZWI3NzYzZDJkYzAyMTQ5ZGVmOTUzN2Y4ZDVkZjgxMjc4ZDc3ZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUludGVyZXN0UmF0ZUluZGV4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWZjNjQ4MzE1NTdlZGMyODlmNDE2YmM4MjVkZjA0YWNhMGY5ZDY2NjZmNzY3NTU0NGIxNmE3Njk3ZGFlNmRhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhTW9uZXkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzU3YTIwNDhmNzA2ZDgzMzhjZjczYTU5OGE4ZWE4ZmM1Yjc4NzdlNGNmNjhjMWI2Y2Q0NzU0YjA3NzMxOGVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFPYnNlcnZhYmxlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA5ZDRlODA0NTM4OGVhYzYyNDhlNWQ5YTUyMDU5NmI3MTU4OGU2NGMxOGIyMzFjNjRkNzkyOTQxM2YyYTI3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWFzc2V0bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGVyZm9ybWFuY2VWYWx1YXRpb25EYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxZTYyNDY5OTZlOTA4ZDkxNjQ5NDUzOWIwNWE0Mzk4OWI3NGQxNzA4ZWY2MWRjZTVjNGZlNjUyYmVmODA4MjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVByaWNlU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMjQxYmM3MDNmMzIwMTRjMGJmODkxOWI5MjQ0NWM3NGM3OWY4ZWMyYjBkMDAzYjU4OWU5YjYyYzExZDNjNDM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFRdW90ZWRDdXJyZW5jeVBhaXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWJiOTE0OGNlMjg1NzZmYWMyMmZiNGU0NzE2MTE4MGM1OWYwYzQ2ZWVmYzA3ZmZiZWRhYTUyZjlhZDNmMjc1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlYXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFSYXRlT2JzZXJ2YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Y2I0N2ExYmQxMzlkZjI2NWQxMTQ2MDRiNTk3MDBlYmI0YzQ2NzYyOTg3OTc0NmI2NzlmOTE5OTRmNmQ5MGQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlY29tbW9uRGV0ZXJtaW5hdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2IwMTBhMWM3ZTkyMjcyNmI5ZDRiZGUwM2NkYTBhYjQzNDI1OGRkNGQ1ZWQ5NjllNzU3YWNlMGUwMTBkNmY5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWNvbW1vblRpbWVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMGUwOWRhNmM3ODkxY2E2YTgwMGNkNWQ2OWFmZTc1NTIyMjU1ZWFiZmYxM2I2ZTkzNWU0MTAyODRjM2MyYTlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRDcmVkaXRFdmVudE5vdGljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZWM5NDQyZmFjM2FhYWQ4NTYwM2VlZmM0ZDUxMmMxNzY4NTcwMGEyNjlmOGE2YTExMGNlZTM1MDdiNTQ0YzM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRDcmVkaXRFdmVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY5MDQ5MjU0YjJhMmI5NmQwYTY0ZTRhOTdmZmI1MmExYjY2NTZlODQ5OTJlNTUyN2JjZTYxMTEwMjM3MjdjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50RGV0ZXJtaW5hdGlvbk1ldGhvZG9sb2d5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzRkMDg0OGFhODY0MGU2N2Y4YzAzZmE4NjAxZWE5Mjg1YzcxZWE5NTRkZTY5MjRjZGU2NThlZTliYmMyNjVhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50RmFpbHVyZVRvUGF5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1YTI1OGJmODIwMDA1MzRiN2JiNDk5MDZjMmFkN2FiNTljNWZmNjdmNjczOWY3YjNmNmRlODc4Njg1NDllNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudEZlYXR1cmVQYXltZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjNjhkNmMwY2YwNzNhZGJiNmZhNDg2ZWFiMWEyNDkyMzU0MDcyNDc3YzljZGIzOWNhOWI3ZDIxY2VmYTkwYWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudEZpZWxkV2l0aE1ldGFNYXJrZXREaXNydXB0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyYzAxN2I1YTVhMzcxYWM4YjA1ZmRkYzE1NDNhODE1NzViZjc3ZDFhYmVmMzRmYzRjM2RhMzRiZTU0NWJmZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudEZpZWxkV2l0aE1ldGFSZXN0cnVjdHVyaW5nRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwN2QzZTgwZTNlOGVkMzFiYzI3YTJhMzgyMjFkZGM0YzY0ODhkYTFhMzFhYjc1NGMwYTQ5OTgzOTllNDhlMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudEdyYWNlUGVyaW9kRXh0ZW5zaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBlYWJhMzFjYTgzNWEwY2JkZGNhNGJlMGE4Y2Y2MDAzZDVhZWYzM2YxZTQyZmFmZmRmODcxMTE1YTAyOGQ3NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50SW5kZXhFdmVudENvbnNlcXVlbmNlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlYzk5ZWY2OWY3MjlkNGU3YmJjYzYxMWM2NWUzMjMzZmQ1NjBlMDJjYTBiNmRlY2UyMWVjZTAyNjkzNmQzNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudE1hcmtldERpc3J1cHRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjc0NzJjY2NjOWYyM2I5YTEyMjUyY2IwNTQ1YTRmYmI0MGZkMWQ1NGQ3NDFiY2IyOTg0YjZmYjE4MmI3MjI0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50T2JzZXJ2YXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmRiN2QyNWZmYTA1MDYwNzk0ZTI1MmI4NmU5NTYzNGM1NjFhMjJkYjkxMWQ0Zjk4Njc3MzYyMzFhYjM5NzM5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50T2JzZXJ2YXRpb25JZGVudGlmaWVyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBkMjc1MTQ1NTZjMmQ3NDRlZThiMzNiZTI3OWY2MjVjOTc3ZDVkNjgwYWU3MDM3ZDI2MGM1MjUxZDNjYmZhMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudFB1YmxpY2x5QXZhaWxhYmxlSW5mb3JtYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzQyODNiMzNiNTBlN2Y4NTM3ZWViMjQ3ODEwMGEyZDViMTk1MzZkZWJiODgzOGRiZDY1MGFiMjhiYjk1NTEzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50UmVzdHJ1Y3R1cmluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNWE1ZTJmMGJhNDY5NDg0ZDE5YjQyNDI0YzhlMzEzZmM3YzBlOTc5MDUzM2QwMGI2Y2I2OTFiZGFmMDJlMzMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRSZXN0cnVjdHVyaW5nRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5NjBjNjYzZjRjM2YyOTQ0MzY3OTNhMTFmNDVlZjY0Nzg3YTdmYmI5YTlhNzIwMTc3Y2E3NTQ5NWRmOTlkZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudFNoYXJlRXh0cmFvcmRpbmFyeUV2ZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWQxNTQ4NTc5YjIzZmNkNmY2ZGQwZjcyMmI0M2ZiZDI3ZmZkZDY5OTA0ODBkMjYzYTNlYTFhZGNkMjE5ODA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRUcmlnZ2VyLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWU2MjY2NTE2YzllY2FmMWM3ZTgyOTlkNzdmMTMzYWI2ZDU3MjkwOTNiY2QyM2Y0ODE3MjhlYjZmM2FlZTI4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50VHJpZ2dlckV2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQ3NzJhMTJjZGMzNThiNDk4ZjFhMjEwYTgzYWRmZTkwNjdiYTJlOGU2NzYwNWQ3MmY2YTJjNDJkNGZiZmY5MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2Rtb2JzZXJ2YWJsZWV2ZW50VHJpZ2dlclRpbWVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImYyZjUwYTI1MzBmODdjMDhhNThjNDFlNjY1NTQwNjA4MDExMzJjNmZkNWY3ODQ5MDk4ZWRlMmQ4YTZhYTU4YzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbW9ic2VydmFibGVldmVudFRyaWdnZXJUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMDNhNzdiZmUzMjcyODlmNDI3YWNjMjhjYTdkMmZiYThlNDdiYjNhYWJhNmZmYmQ0Y2JhNzM3NTQ3ZGEyMDMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFDcmVkaXRFdmVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTBhMzEwYjgzYjJmYTUyNDUxMjk4Y2QzMmY1MzZkOGJkNDViZWJiOTMyZTI4MjMwY2QwOGM2NDhkMmJhMDRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1vYnNlcnZhYmxlZXZlbnRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFPYnNlcnZhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5NjE5YTZhOTc3MWZhNzg2MTc5NTJjNDRhMmZjMjg5MzcwZDAwYTRiODAzZGM5MjIxZmY3ODVhOWY5NzJmODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEFkZGl0aW9uYWxGaXhlZFBheW1lbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4Zjg4ODI3NDFmOTQ4NzkwZjM5MDk2NDI2MDEzNTA4YTc0MWM3NzZiNTFmZmJiZjgwOTI1Y2U5MmQyNjBjMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEFzc2V0RGVsaXZlcnlJbmZvcm1hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlZDZhNTJkMDQ5YzU0MTJkMDkwOTNkMjg1NjY3N2Y5OWQwMzMyZWE2MTg4NTExM2Q5NzJjM2FhYTkwYzc1MTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEFzc2V0RGVsaXZlcnlQZXJpb2RzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGEzY2ZlZTRiZTI3YTdjZmY3MzUzZTk4NjVhODY0ZWU1NTNhNzUyZGY1MDNiMzEyMTlhMWIzNTA5NmYyYjU2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0QXNzZXREZWxpdmVyeVByb2ZpbGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTQwM2YxZmQxMWQzMGI4MjgyYzJjN2M4M2ZkNzFlNTc3NTAwYjNmM2IzZDc2M2FlMmFkNGQwYjRhNDc1NTNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRBc3NldERlbGl2ZXJ5UHJvZmlsZUJsb2NrLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0NTMzYzY4ZWI4YTNlOTU0Y2NlYjA4OTVhOTZjY2VkNzBkNzk3MjVhZGUyYzdkODNlNDU4MmFmYjI5MjYzMmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEJhbmtIb2xpZGF5VHJlYXRtZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlNDFjZDQyZjYwNzZiZmI0ZjY5YTM2YjMwNjQwNjhmZWFiNjdmMTJiNGExYzU0YTE4NTlhOGYwZjQ5MjQ1NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEJhc2tldFJlZmVyZW5jZUluZm9ybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwYTI1NDI3Y2U2NjE1MjRjMmZjZDk5YTA4NzcxNzc0NDM0ZjBjMjA1ZGQ0MGUzMGRhZjEzN2I2ZmQ3YjFiZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEJvbmRSZWZlcmVuY2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWIxZDU2Y2Q2MjFmMDE2ZTg2ZjA5NGQyODRmODYwMmUwODExYTVkNjNmNWY5N2FhZGUxMTkxOWVmOWZjOGYzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Qm91bmRlZENvcnJlbGF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGI3MzE0MjJkNTIzMzA2MThhYTBmZGRlOTYxMjA0MjIzYTUwNDQ4Y2I1MjEzMmI0ZDQyYTA0NTY4NGJjMjQ0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Qm91bmRlZFZhcmlhbmNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiMmVkN2U5MjgzMWZiZGVkNzAxNmM0MzliNjJiMzBjMWNjZDc3NTNhMzVlYzZiOThhYzQxZTlkYmRjMDIxM2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldENhbGN1bGF0aW9uU2NoZWR1bGVEZWxpdmVyeVBlcmlvZHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWIwYjZmMzdiNTY5NmMzZDc1MmI1ZDUwMzViYjgwNzNjMTViZWU3MzA2ZjhmOTdjZDMxZWQyNGZhMmQ2NTM1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Q2FzaGZsb3dSZXByZXNlbnRhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTY5N2IzNmQxNjM1OWUwMTNiMjA3MTViZWVhOTNmODE5MzUzNjcxYTcxNmJiOGUwMzQxZWY5MGI4OTlkZWI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRDb21tb2RpdHlQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTMzYTMzMjczYTUwODkzNDhiZmI4NTNmMWZjYWFkOGRkMDYyY2U4Zjk0MTljZTM0MmI5ODkzNmI4YWY5MTM4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Q29tcG91bmRpbmdNZXRob2RFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQxZTY4YWU3YTZhZGYyMjI2MzA3Y2I0YjVjYmEzYTUyMTZlZTRmNWU3OTA3ZmQzMmJjMDhkMGIwYzJlMGU2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Q29ycmVsYXRpb25SZXR1cm5UZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NjI5ZGY2YjkyMTI3OTYxZWYxYjc1ZWY4ZjZmYTRjYjkyNzM0MDAxMDcwZjE5YmM4MGVjNjc3Y2U2OTAwZDY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRDcmVkaXREZWZhdWx0UGF5b3V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyNWI4OWE0ZGU5OGQ3NzRjZDAyMGRlZTU1MjU2NmE2NjE5MjQ3N2U4YWZlN2E4NjE2NTk4ODBjMzY2ODM2NGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldENyZWRpdFNlbmlvcml0eUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTExNWEzNDg4ODA2MDI1OWY2NzlmNGQwOGEwMTFiY2E5YWM0ZjQ5OGJjNzBkMmNlMTYyZmQ2ZTg3OTQ1N2E3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGF5RGlzdHJpYnV0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5YjNmNTAwY2MwMjA4MDIyZTEzNGVhYWI5NWI2OGM4OWQzMTc1YjUzMDM3MWIzM2U0ZWZiZWE0NTkzZjJhNWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpc2NvdW50aW5nTWV0aG9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhNjE2ZjBjOTUwOWI2OGMyYzYyMjQwNGIzMjc5ZWY3NjUwNzFhMGQ2MTkxNDlkOGIyMjk4YTY5YzZjYzI3M2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpc2NvdW50aW5nVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YmMwMWUzYjJiMmZhMjkzYzYwMWUyMTZhMGQ4OTA5OTJlOTk3ODBmNDA0ZjhmODczMjYxODM4ZjNlMmM3MGYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZEFtb3VudFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzU0NGM0YTZiMmQxMTRiOTMzM2EwMzJmZjg1YzE1ZGYyN2RkMGI3ODJiYmIxYjYyZGRhOTk2MWNmMzU3YTQ4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGl2aWRlbmRDb21wb3NpdGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYWNkZDFkZDA3YWQyNmNhOTI5ODY5NzBmMjExNmU0MWU2YTMwMjU2ODkzMTk1MmRlYTM2ODYxYjFiY2NlNWJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZEN1cnJlbmN5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjljOTA4N2Y3ZDhhY2FiNmE4NDgwMTk1OGU2NDQ3MWYwZmI4MjFmZGJlNWE4YTE1OTZjMjA1ZWE3Njk4NGI1MWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kRGF0ZVJlZmVyZW5jZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkYWViMjgxZTg1YmIyYzg1YTZkMjljMmQxZjhhZjQwM2VkNzAyYWMxYzIxNTgyMDFhYTkxNjhkNzRhODI0NjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldERpdmlkZW5kRGF0ZVJlZmVyZW5jZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWI2ZmZjMzhhODgwNDQyMGZkM2YyMGIwMGY2ZDAyNmU4MjdiNjY3MzJhOTgzNDY3NmMxNTIxZDU0ZjJhMmUyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGl2aWRlbmRFbnRpdGxlbWVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOTE2ZWQwOTk2Y2YyYmYzNzRhMzI4YjVlZTdkYjE4OTk3MTdmODE0OGFmOGY3Y2VmNTg3MDcwYzViM2M5ZjY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZFBheW1lbnREYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODUxOWE3YjllMjNmYjU3MzE5NDg2ZjNjNWUzYTAyZDcyMjg0M2RhOTFkZjU2ZmFiNWI1YTgxZmQ2YzliMGRkOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RGl2aWRlbmRQYXlvdXRSYXRpby5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZTRjNzM4YWQ0OTI0OWM0ZjdmNjIxNzNkYTE1ZmI1NWZmYmIxNTNlOGU3ZWEyOThlNWQ4YjA4YmRhODBkZWViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZFBlcmlvZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjI4ZWVhOTk2MTA0MzJiZjRjZjUxYmM5NGEwNTljZjUzOTQ2MjMxYzJmN2JiMTJmNDU0N2NlMGIzYjkxNTYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZFBlcmlvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTM3ZDNmM2FlOGE5YmU3NThhOGMwODgwYTE2ZTUyM2Y0OTY2YTgxNThlMjczOWM4OWI3YjVmM2QwNmUzOGIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXREaXZpZGVuZFJldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyOTBjYmExMDc0YWE0YjNmMjMxNWUwNjAxYTFlZjNkMTVlOTRmNDYxYTIwN2QyOGExMjVlZjQ2ZjhmZTVkNDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEVxdWl0eVVuZGVybGllclByb3Zpc2lvbnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQ2YWViMGNhNTc0ZjIzZGE2ODhjOTEzYzU5YTI5YWVlYWE3Y2VkMTU0NmFiMmJkYmE5ZWE5YTE0Mzg5ZmQ5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RlBWRmluYWxQcmljZUVsZWN0aW9uRmFsbGJhY2tFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2MzZTJjNDg0Y2JmY2RmMjEzNmQ0MDBmOGYyN2FjYzczOWJiZmU2YzI3ODY2YzkwMmIwNjFjZDRjZGIyNjk4MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmllbGRXaXRoTWV0YUluZGV4QW5uZXhTb3VyY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzA3ZTk3NDllNTBkODFiMWY1ZTJiNzhkMDM3ZTQ3OWQxMTJiMDM0N2Y0ZDdkYjBkZjM0MTBmODU0MGFiYjc0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmllbGRXaXRoTWV0YVNldHRsZWRFbnRpdHlNYXRyaXhTb3VyY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjEyNzg3NWJlMmY1YjViYjJmYjM3M2QxZGJkMDhkYTNkYjhjNTBhMjUyOGY3NDIzMGQwNzU0YWFmODFmNGJjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmllbGRXaXRoTWV0YVNwcmVhZFNjaGVkdWxlVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzUwZmI4OTkwMWJmNDZiMzU0ODE4YmY0NDM3ZGUxMzcxMzAwYTE1M2EyNWI4MDQzNGM3YTMxODU3YjE0ZTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGaW5hbFByaW5jaXBhbEV4Y2hhbmdlQ2FsY3VsYXRpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzgwZjg2NGZkY2FjYjMzYzM3ZWYyODZkYmZhYTRjODE0ZTBhNDNkNDIyYWQ1OGNlNWFhMDdmMTgxMzczMTAwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Rml4ZWRBbW91bnRDYWxjdWxhdGlvbkRldGFpbHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2IzNTBhNjIxMjI5MzZjZTA0M2U0M2I2MDg4YTRiNzY5MWMzZjI0NGIyZmMxMTY2MzFhZjMxMDI1ZDIzY2ZjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Rml4ZWRSYXRlU3BlY2lmaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE4YzI3MDUzMjBlMDA3NWZiZGE5OTkyOTkzZjdjN2RiYjViZTA2ZWY3ODBmMjAzMTE2NDA2MGFmZjAxYjM1MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEZsb2F0aW5nQW1vdW50RXZlbnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRjYWVmYjUyZjAxMTUyODEyNTVkZTU3OWE1MTZkM2VjM2ZkNWYzOTQ4ZDkwNzA4M2NiYjNhZTlhZWQ1MDJjYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEZsb2F0aW5nQW1vdW50UHJvdmlzaW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZWQxMTVjMDE3MmZlYTg4MWI2YTBmZjcyMWNjYzE5NmU1NzcwM2Y1YzA4YWM1Nzk3ZTBkYjdkMjgzNmUxNTcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGbG9hdGluZ1JhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWIzNmFmMzdkMmFiNzAwMzFkYWZkNjk0Y2M5NDE3YzJmNDVhODQ3OTEwNTM0NGMwNDQzNmU2OWQxYTk5NDBmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RmxvYXRpbmdSYXRlQmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYzM0ZDM4MDhlZjYzOWZkYWQ2MGU5ZDEyODRmN2MyYmJkOTk5ZjEyOTE5ZjBjNWNlNTg4ZjUyMTVmMjEzNTA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRGbG9hdGluZ1JhdGVEZWZpbml0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViNWI2MzZlM2I0MTA5ZDkxNjE4ZjEyZTRjNTgxYTM2N2Q1MDg0N2U4NDhjZDVhMzU4Y2IzNGUwNDk0OWYxOGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEZsb2F0aW5nUmF0ZVNwZWNpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQ0YjQwNjMwOTZhZDg2NWY2NDU0YzU2MTliMDBkMmZiN2VkMzg3YjMwYzBmMWU0ZDlmMDNhNGRhMjkzMjk0NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Rm9yZWlnbkV4Y2hhbmdlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmFiMWIwYzRkNjA5ZGRiNjQ2Yjk4MTIyNjRmMTg2YmM2NjViMTAyODE1N2M3YTg2NmZmNTlhM2RiYzQ4NDhlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0RnV0dXJlVmFsdWVBbW91bnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJmYzY5YjRjMTQwZjVmYTY1NzY1YzVhZGNkYzJjNmI4N2ZkYjI0ZjQ3MzljMmVkODdmYzk2OGQxMTcyNzE5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0R2VuZXJhbFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEzOTZlNDEwNzFlZWM1YzU1MzMzNTAzYjgxYjNkMTE3NGZlMmEyMWNjYjBiYWU1MmNiMjkzZWZmMzM0ZDQyMmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEluZGV4QW5uZXhTb3VyY2VFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2RhNTFlOTJkMDI4OTJlNTM5MTAzMGE5ZjU3NGJhYWIyOGNlNTk4NGRkMDE3Y2IzYzkxMWIxOWY3ZjhiMDQ5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0SW5mbGF0aW9uUmF0ZVNwZWNpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTAzYWRjYzg4MDRiOTZkZDY3YjJjYWJiY2FkZDk2YzExM2Y2NDZiZTMyYjk5Yjk2NmUxMWE5OWEyMmNlNjc1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0SW50ZXJlc3RSYXRlUGF5b3V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEwZjM4ZTVmYWFjNThjODEyZWZkOTQ0MzViOWMwNDM1OTM0N2JhYzQ2MGJiM2UxNTgyMTM2NjZjNzE2MjZlODEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldEludGVyZXN0U2hvcnRGYWxsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjJmOTYyYTE0ZjlkYmRlMzY4MjIxMGE3YWE3NWJmOWM4M2MzNjc4N2IyMWQxZWUzMjAyZGM1YTVmY2Q4YjhmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0SW50ZXJlc3RTaG9ydGZhbGxDYXBFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGVjNWI0MTA4ZDNjYWQ4ZjY4MTRiNTFjNzM3YWQ5MTA0YjE1ZTE1MjZmNzE5MzdkOWJkZThhNmFhZGM5NTUzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0TG9hZFR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhYjY1OTZmMTliYTgxYWY3ZTQ2OTdkMmY1Mjc0NGU1MjEzZjg3ZTllMDE2OWY5OWI4OWUxY2M1MWEyZTg5NzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldE5lZ2F0aXZlSW50ZXJlc3RSYXRlVHJlYXRtZW50RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiMjMwMWEyYTIyNmNmMzA0YzhjMzhhMDU2Y2ViOGQ3NTMzYmZiNDU5M2Q1NWMzZTg3ZmI0NGJjMzM0YjBiMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldE5vbkNhc2hEaXZpZGVuZFRyZWF0bWVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZDQ5YWI0MDc0NzE2ODRiNTE2N2ZmYWI1NjIwMjUyNmRmODYyZjc5MTJkODUxNDBhYjRkNTRkMTcwMjVkNjE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRQcmljZVJldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODAzYjI2Y2Y0ZGI1ZTEwOWE2N2Y0YjYyZjY4ZTcyMWYxMTY5MmRlOGM4NzZhM2Y0YWI1YjU1MmUwZjRhN2JjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UHJvdGVjdGlvblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzM2Q5ZDYzOGJjMTllN2JiZmZhOGM0ZTQ2ZmE2YjgyZjFkYzRmOTg0N2VhOTVhNjlhNTk5NWMzZGIwMjExZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFJhdGVTcGVjaWZpY2F0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJkYjhlNWJmN2JhNDY2ODg2MmEzNDBlZDA5MDgyOWQ0YTBmNDYxMzRhOWVhNGRjNWZiNjhlMTEzNGRiNDkyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmF0ZVRyZWF0bWVudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzA3ZDA5Y2IwZjI5ZWYzMmVkNWM1ZWFhYjA1N2Q5MmQxNzkyNzgzMmE5MWM3YWFiZDE1OTc3N2FmNDU0ZTRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSZWFsaXNlZFZhcmlhbmNlTWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkxOTRiMWJiZDI4MDYxMTExMTg1OWE4YTA0NTdiMjdmNjRkYjg3NTVjODY5ZDVjY2RmOGRjNTIyMzA4OTIzNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFJlZmVyZW5jZUluZm9ybWF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkNGFhMzA4ZjYxN2ViY2NmMTY1ZDdlZjQ4OTYzMDBiODZhZGJlMDg5N2ZlODUzODI4ODUyODRiNWMxMTEzY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFJlZmVyZW5jZU9ibGlnYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjYxZjA4ZjU2OTBlNzU4ZGZhNzI1ZWU4ZWVjMDlhOThhZThhZTBlNjZmMGYwODlhNDEwZjc3MmY3ODg5OWZmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmVmZXJlbmNlUGFpci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YWMxMzhjNDRhOTkyNWUxMzAwMzMxZTI3ZmMxZGQ3ZTA0MjVmZDQ1NGE1YTdlNTdhNDJlZTU4MzljMmQ2YzQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRSZWZlcmVuY2VQb29sLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzNjY2E1YzdkYTU1YTk3ZWU1OTY5NmRjNzI2MzM5NGZjMTMyYzJlOWI4YzRlOTA3MTNkYjQxYzQ2MWU0YmFmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmVmZXJlbmNlUG9vbEl0ZW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGUxZTg5NmViY2U2ZDk3ZWZjZjExOGIyM2VlMjMwZmYwZDUzMDg1ZDExZDI4NGM0MmI2MDUyNzMwMTdmZmUxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0UmV0dXJuVGVybXNCYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU1MGRmNjhiNzYzMDBlYjkwYmZlYjljYzVkZjlmZTBhNWMwN2QyNjk1ZDM2YzEzZjczMjU1ZDcyY2MyNmJkNTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFJldHVyblR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQ0NmNjMTExOTdhMGU0YjUwZjEwYjZlOGFhOWIwMGU3NjMzM2U0YWE0NzNhZGRmNTFjY2VkMGJhZTUyNTUzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Um9sbFNvdXJjZUNhbGVuZGFyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OTczMTU2ZTIyMjM3OTA5NDAyMmY3ZWVhYTljNzYyYTE2NjZiOTI1ODA5OTk3YjkwMGRmZjBjMDRkZDZiODRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRTZXR0bGVkRW50aXR5TWF0cml4Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmU2NGQ5MDUyZGYxZmQ1YTllNGU5MDdkMDVmZjhhZDg5NTY4YjIyZTI5ZDYyNDQxNTEzM2UxNjdlMjhjMTMxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0U2V0dGxlZEVudGl0eU1hdHJpeFNvdXJjZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjU5MTRiNTUwZTU2NTA3ZTFjNTBkMTlmNTE0NTcyZTE1YmQ2NjQwYzQ1ZGYyZTM4MjMzZjhmZWFmMWJlNWFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRTcHJlYWRDYWxjdWxhdGlvbk1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDRkZTdlMGUxY2FlZjdlMWQzM2MwYzI5MjkwYjI3YTk3MTZiMjBkODFiYzBkNDcwMWRiZDg1ZmQ4NjUwODNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRTcHJlYWRTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImU4Mjk5ZGJjZjZjMmFmMGMxNGI5ZThlZDk4NzBiNGZkYTBkNzBkMGEzNGI3YTczY2NiYzE0ZmM2ZjRkOTc2YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFNwcmVhZFNjaGVkdWxlVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjFjNzJkY2FiOGI0ZDE0NDUyNzVjMjcwOTQ4YTIxYmRkN2JmZTRiYTk1ODI5ZjY0MTA5Mzk3NDk4NTY1MmM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRTdHViRmxvYXRpbmdSYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2MzU2NmE1N2M1NThjMDM4MDJlNWE2OGUwYjBkYmE5M2U1OGM1ZGQyMGVlZGNlMWU2YTMxZGRiMDI0YzU0OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFN0dWJWYWx1ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZGY4ZjY4NTQ4ODM1MDQ5YzFkYWQ5NjU4OGE5OWIyNTFlYjBlZDZiZDdmZDQwZjY3MWYxNDlmYzhlMDEyNDIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRUcmFuY2hlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlZDhjOTE3MTZmMjU1ZjMxMDdjMzZmOTMyMzJlZjg0MzdlNmQ0OTViMGQxNWM0ZDc2YTZiOWNhMTY0MWE4YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFZhbHVhdGlvblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3ZTYxNmUzZjM1MmY4MzYwYTdhNTIyN2YxZGVkMGQxMDFjMTc2YWYzZDE3NmIzZWRiOTFlZjAyYzU5YWQ4NDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldFZhcmlhbmNlQ2FwRmxvb3IuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU2YjFkMjRlNzY5YWM3OGRkNzQzZjNkZTE2YTA3ODk5MDY4ODNmMTI4OGMxZTBiOTcxNzBjYmU2YTc0M2JlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0VmFyaWFuY2VSZXR1cm5UZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZmQ2OGQxZmNhOWI1YzkyMWFiMTA4ZDk4ODJlZmFiMzMzODljYWZkMGRiNDgxZWFkMGEyNzZlZGY2ODU4ZmMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRWb2xhdGlsaXR5Q2FwRmxvb3IuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODA2NjA0NzcyYWEyYTUyZGNiZTQ3NDFmMjE3MDk0NDMzYzNkNTRmZmI5MWRhYmE4MjcxY2Y4MzcxMGVhZGJlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGFzc2V0Vm9sYXRpbGl0eVJldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiOTllZWFlNDkxODkwMGFlY2I4ZDIzODUxNjg1ZDIyYjcwZTkyNjhiN2Y2OGQxZjIwNTBmMmY5M2U2ZDQ4NjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldGZsb2F0aW5ncmF0ZUZsb2F0aW5nQW1vdW50Q2FsY3VsYXRpb25EZXRhaWxzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI3ZTExYTQwYjRmNmRkN2Q0ZDc0ODI3OTFkOGQ2MjZmN2RiZmU0ZGM5YzA3Mzc3Y2JjODU3ZjdhYmViZGUxOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldGZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZUluZGV4UHJvY2Vzc2luZ1R5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI4NjM2OWIyZDFiMTkyYzZmNGNmYmZiMWRiZTIwMTk2NzhhYzAxMWY4NGM2NDUyMDJjNjc4NjBkNjNmMDhjNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldGZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZVByb2Nlc3NpbmdEZXRhaWxzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1Y2Y1YTlmMDViMjU3M2NhMzhjYzQ5ZTk0MDJlM2EyMzU4OTNjZTMyMjNmNGE1ZjFjNzNlYTA1Y2E2YzUzNTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldGZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZVByb2Nlc3NpbmdQYXJhbWV0ZXJzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjNTdlM2QwNzFlY2Y4YWEzNjNmMDg2ZDkwMzQ2ZTYzMzMwMDA1YjVkZGE5YjM1MzQxNWU1ODNiZDQ4ZWY4NWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldGZsb2F0aW5ncmF0ZUZsb2F0aW5nUmF0ZVNldHRpbmdEZXRhaWxzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhNGZiZWNmMTMxYTU2NWU0M2ZhYmE2YjE2YzY4YWEzNjllYjAxZGVmZGU0MWY0YzU4ZjZjY2Q1MTljOTQwNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rhc3NldG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUZpeGVkUmF0ZVNwZWNpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzY0Yzc5ZmVkOGUzYjg2ZjIzMGQ4NGQzMzA0NTcyMjVkMjI5ZDg5OWNiYzcxNzhhMmE5MzMzOTFlMGE4MGU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFJbnRlcmVzdFJhdGVQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YzZiYzdmZDRlMDk5NDM3MWYyMGFlYTdjMTlmNDM4NzczYjE4NjdlNTEwMTZhZTY5NzcxYWYyMzlkNDBkODUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0YXNzZXRtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQcm90ZWN0aW9uVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTc3YzQ3YTdhNjhhZGIxMTlmYWYxZDQ1MTFhNGYzMGUxMDM4MmM3MjBmN2U3MTJmN2E1ZDdiYjIzNmRjYmZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEFnZW5jeVJhdGluZ0NyaXRlcmlhLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0ZDZjYWNmNGZlMjU0YjJlOWZkY2ExZWU0NTM4YjEyMzBmODBhODJkODdlNmMyYjg3YmJlNGMzMTk2OGI5Y2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQWxsQ3JpdGVyaWEuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYjY2YWRiMDBiNDQxM2ExNTkyYWRhODVmNTk0ZWY0N2Y3M2U1YWJiMmMwMDZkZjM5YmE4NTQ4ZjRhNDQwN2VhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEFsdGVybmF0aXZlVG9JbnRlcmVzdEFtb3VudEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMmRkNDU3ZTVjYzBiOTU2MmNlMjE2MjJhM2ZlNmM0NTljMzllYzQ1YzMwZTk2YmY2MzlhYzczM2MzZWYzZjE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEFueUNyaXRlcmlhLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFmMTNkY2MwMjkxY2JhMWQwZmQ5NzRkMjI4MTcyNzNjODU1OGIwNWIyYTY1ZWFmNTY0M2YyY2Q3OWFiNWM2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxBc3NldEFnZW5jeVJhdGluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NywKICAgICAgICAgICAgICAic2hhMjU2IjogImFmZmU5NTNkMzY3MmI1ZmYzZGY0MGFkOWM4MDY0NjIxMzFlZmQ1YWU4ZGYyMjU5YzViNmU3N2UwNDBmYzIzZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQXNzZXRDb3VudHJ5T2ZPcmlnaW4uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOGFiMjZiMmNkNzM2OGFlZDU2YTk2NjdhN2U5Mjk3MDQxOWFmZjJlMjM1MDg2NmIzNDM5MzJhNmVjNWFmM2FlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEFzc2V0TWF0dXJpdHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNTNmNmM5OGZjZThiYTk4NjVmYTczMDRmN2FjZTU0Y2ViZTYyOGY4ODVhNWE2ZjBiMjRjNDMyZDY4ZDJiMjMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEF2ZXJhZ2VUcmFkaW5nVm9sdW1lLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTY4NzE1NzQyZmRmNzk1MDY1ZDU3NGNiMDlmNzgzOWZjYWRhYWMzZjYxODM0YmViZTQ4YTU4MTk1YmYyNTAzZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxBdmVyYWdlVHJhZGluZ1ZvbHVtZU1ldGhvZG9sb2d5RW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM4M2VmYjc3NTJiYTQ1MDBkNTQ4NjkxOTUzNjE3ZDlkZDdhMTFjNjFjYzk4M2UyNDllNDNmN2IxOWQwNTM4OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ2hlY2tFbGlnaWJpbGl0eVJlc3VsdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Y2IwYjQwOThmNWQ1YmYzYmViZjc2ZmIyZGU4NWJkMzA4MmJjZjFhMDMxNTE3ODU0ODA2OTBlNjQ3NjA5NDMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWwuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjVlZDZjODM0OGIxNzZlMTU4MmIyZTljM2E0YWQxZTg4OGFmZmMzMjY0MGQxZDVkMDU3NDkwYjczMjk1YTM0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb2xsYXRlcmFsQWdyZWVtZW50RmxvYXRpbmdSYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczYmZjMGU2Y2U5OGVlMTc1NmM2YTgyYzE4MTVhNTdmMDMzZTI1ZTVlODA1MDc5ZTVmN2ZlOTU0OGVhYzhlM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbENyaXRlcmlhLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmNDNlNTUzNmMzZDc5ODU2MmViNjc0NzJlMGU2ZDRjNzgxZTk2ZWRjZjkzYmVlMTc4MzU5YmRmYWZjNGExNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbENyaXRlcmlhQmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZGQ2ZjE3NmVjMzMyM2NmOWI4ZTg0OWFiYzI1YmM1OGJhZmI0Y2UxYWViZTYxYTA5YTBkYmE5NTE1NDk4OWMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdENhbGN1bGF0aW9uUGFyYW1ldGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNDI5MjUzMmM3Zjg0MzQ0N2Y2NmI4YjRkMWMxOTk2MThjZDQxYzgxZTA4N2Q2MWU3MTRjNGQ3OTdhZjRkZjg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWxJbnRlcmVzdEhhbmRsaW5nRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM2ODNkMWMyZTZlOWViODJiODE3MTkwMDFmZDdlYWIyZDhkNzVhZTk5OTk3ODYzYjkwMTc4YzQ0ODFkYmExOTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0SGFuZGxpbmdQYXJhbWV0ZXJzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJlNzY1YjBhODU3NTVmYzVjZjRkMTJlMDBlNzE5NGNiOGQzZDU1ZDYxNzVkNjJmYzJjOTI1NTU3MjE5MGQzOTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0Tm90aWZpY2F0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImU4OGUzNjVjY2U2NmM2ZmNkNTljNjUwNWVlNTlkYmEzZjdmZTFkOTk1YzY2ODRlZTAwZDg1MmIyNGI1MjRmNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbEludGVyZXN0UGFyYW1ldGVycy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWQ4ZTZlZmFmY2Y4YWNjNGNlYjhkMDY0ZGFhMWY4ZTg3MWVkM2U0ODA4ODE0MzkxNzgwZDRkNTAzMjZmMGNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWxNYXJnaW5UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU0MWY1ZDRjOGZkMjBmNjI2YWIxYjU3ZWJkY2RjNDZiYTc5YTJhNzZhM2M3MWNhMjJhNjdkYWZlZjQzYWIwMDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbFByb3Zpc2lvbnMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YWI3NTEzZTU0ZGNjYWY1Nzg0NDEwYjNhN2QwODU3ZGRlNTViNWNmNTZhMDhmMjQ3ZTEwY2FmZThjYjJlNjU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWxUcmVhdG1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWUxYWYzNmE0YTkxM2QxZDc4NWExZWM0YWQ0ZTIxYzUxYTA2ODM3ZjY2NTZhYmRhZjkyZTg0NjAxNzdmY2M3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbGxhdGVyYWxUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzYTgwOWExYTRiM2VjNjlkMzUyZDQxNmEzN2MwYzQyMDFkZWEwOWEyYjRlOTg3MTE4ODViYzFlNDVlZjkwY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29sbGF0ZXJhbFZhbHVhdGlvblRyZWF0bWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5N2Q5YzUxZDUzZjZmYTlmMWY5NDhlMzY5ZjkwNDE0NTYyOTQ3YjkxODQzZmU4ZTlhYzUwMjNiM2I3NjkwY2Y5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbmNlbnRyYXRpb25MaW1pdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhMzQ0NDQyZWM5NjUzOWIzYmYxYmIwM2QwZmRjNTMyMWIxMTYzNDY3YzI1NDY5ZGMwYzMxNTgwYzQ2NGM3MDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ29uY2VudHJhdGlvbkxpbWl0Q3JpdGVyaWEuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTliNmVkNWIwZmQxNjk2NWEyMjc3OGEyZWIxZTJjMjNjZmI2ZGZkZDNlZGIwNGZiYWJmMmViNjRkNTBiZWVkYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxDb25jZW50cmF0aW9uTGltaXRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOTRiZTc2MTdlNDc5ZDdhNWRiYWZlZmRlNjhjODIzMWNhNGM5NzZiZmZjNGEzZmI3MzFkYWFlMzkwMzMyNmVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENvbnRhY3RFbGVjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiODA4NTgzYzNhYTRhNjU5MWMzZWI1OTQxZjM2MmVjZGQ2MTNiMmFkMTczZmVlZGRjMDQ1ZGU1MzQ5MmI3MTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsQ291bnRlcnBhcnR5T3duSXNzdWVQZXJtaXR0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjM1ZjZmY2FlZjIzODcwZWVkMjc5MmFmZjEyNmI3ODU5ZjczMzUwMWIwNDlmMzYwYTM0MzliOTExNTVhNTRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbENyZWRpdFN1cHBvcnRBZ3JlZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI3YzA3OTZjYWE2N2MyYmQ0ZTJkYmFiZThkZTZlYmM3MjZiNDU5ZjMxNTU3MzEwMThiYmY2ZDBmNTQ0OGYwMGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsRGVsaXZlcnlBbW91bnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNTE4NzM3MGIxOTRjYWJjMjc2MzljNWMzODczM2Y4NGU4NjA2NDM3ZDVhNDQ5MjE4ZjJmNWNmYWVhYTZiZDJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbERlbGl2ZXJ5QW1vdW50RWxlY3Rpb25FbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM3NjNkZjhkOWFhZDlmM2IwNzcyNDM1ZjZhOGZlNDk4ODllNGI1MDJlNjY5ZDgyNDJmODlkODQwYzk1MGEwOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxEaXN0cmlidXRpb25BbmRJbnRlcmVzdFBheW1lbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTEwYzgyNzM1MWRmNTU1ODhhMmNhMTZiNmYzN2Q3NDBjZmExZjQxOGI2Yjc3MGRiZThiN2U3NTUyZjE4YTgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbERvbWVzdGljQ3VycmVuY3lJc3N1ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMzg1MTczYzkxZmY2ZjA1M2M1ODE4MjYyMmUwNWFmMmY4YjIxZmNhMTJmZDNiMzdlZWJjMGRmNGEyODEyYzQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEVsaWdpYmlsaXR5UXVlcnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWVjMDc0ZTY0YzAyOThhZjk5MjFmZjIwMmRlNTRmMjc4MzkxNGFmOTc3Y2ZkZGY4NzhiNWI1YTc5MzU3ZGI5NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxFbGlnaWJsZUNvbGxhdGVyYWxDcml0ZXJpYS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYjJmOTQ4Mzk3Zjk2NGI1NzljMzk4NDcyYTU2ZmQ1NDBjODEyODg3ZjIyMGJkMmM4NWM4OTVhMWQzZjVlNzliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEVsaWdpYmxlQ29sbGF0ZXJhbFNwZWNpZmljYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmFmMDAzODlmMWU4NTlmYjA1ZGFhYzU3MmYxODAyMjFkMjc2YzE5ODkzYjUyOWJiZjIwMjhmODViNjViZjg2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxFbGlnaWJsZUNvbGxhdGVyYWxTcGVjaWZpY2F0aW9uSW5zdHJ1Y3Rpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYTlkMTc0MWFlOWVlNjQ2ZTMyZDIzM2VkNjQ2ZTllM2QyY2YyZTdkYTk4OTY0MTFlNTUyZDg0OGNkZGE0Zjg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEZpZWxkV2l0aE1ldGFDcmVkaXRTdXBwb3J0QWdyZWVtZW50VHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOTMzZDhhNDdmZDAzNGVmNDVjMWI1ZjNlNzgxYjBhMjRhYmM3MmQ1MDdmMWE1NzY1YzUxODVjOTAxZGJiZjFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbEluZGVwZW5kZW50QW1vdW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmM2I5MDc1NzBlM2QwOTA5NTQxNzFkYzRkZGNmMjlhOGUzOTgyOWIwY2Y0NWRlMGI2MmM3ZTU0ZmM3MTEzYmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsSW50ZXJlc3RBbW91bnRBcHBsaWNhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxNjQ2OTM2ZTk0NTgzYjI3MTk3NWRjMjhhYWI1NWY0NDMxYWEyYWNlNzQ1YTQyZjQ0NDVkNjdhYTkwZTI3NGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsSXNzdWVyQWdlbmN5UmF0aW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDc5MDA5MTllYWMwMGQzNzNkNTYyYzI1M2ZkN2Y3ZDY3NGFjODhiMThkNDEzMTIyYjZiZTc4MmQ3YjBkZjAyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxJc3N1ZXJDb3VudHJ5T2ZPcmlnaW4uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZTlmNTFhOWNlYWM2Y2ZkZTViM2JhNGU4MzYwNDA0MWJlOTBlZTg4YjQ4Mjg4ZjljZDY3YTljYWY4OTY1YzAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbElzc3Vlck5hbWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1M2I4NzUzZDE2YmFmMWQ0NDA1OTMwMDNjMWE2NTcwYThhZDQxNzM1OTBkNWZjNTg5YmQzNDdlNTU2ZThkMzZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbExpc3RpbmdFeGNoYW5nZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1MzM5OWNiMDNjZDdlNDUyYjYxMGVkZjZiMmRmYzQ0NWVlYjNjNGEzODQ3ZTcwZTk2NTAzMDUyYjA0ZmFlZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsTGlzdGluZ1NlY3Rvci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzNTU4NTkzMmI4MzBiYjQ1MzQ4ZmVlMjZlNTEwMDQ0MmJmMzY2NWM2ZWM1Y2I4YjcyYjYzZTBiYzhiNjg2YzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsTmVnYXRpdmVDcml0ZXJpYS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI1NWJjZDVkMTM2NWRkZDE5Nzc0MjhlNDAwMDQ4YzZhMDQwN2ZjODY3NDFjNTY5NTk4ZmE5Zjc1NjNiYTk2YTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsUmF0aW5nUHJpb3JpdHlSZXNvbHV0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OWM5NTEwOWQxZTJiNGYzNTIwZDZkMTE2NDU1NTYxODcwMTY4NzQ0Y2I3MDFlMGMyMmZmMjU3MDgxZThhYjIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29sbGF0ZXJhbFJldHVybkFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFkMDRhOTVmZTFhZDE0MzQzNWMxZjA0MjBmZmE5ZTQ0ZmRjY2U3YjhkOTExZjQxM2JhY2I2ZjYwZmFjNGE5NGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsU292ZXJlaWduQWdlbmN5UmF0aW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGIyZWIxODhiNTVmMjAxYTBhYzVmY2U2Nzk0NzRjMGY1NTE3OTJlMWQ2NjlmYjEyNjk4NzM2YTcyOTM2MTRmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbGxhdGVyYWxTcGVjaWZpY0Fzc2V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNGY4NjAxOWI5MzRkYmRlZjhiZjU5NzM4M2E4NGI4NDMxMjk0MjEwM2Q2ZWQ3MGI0MWEzOGFkNGY2ZjM1OGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsU3Vic3RpdHV0aW9uUHJvdmlzaW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0NDkyYWRjMDBmNWUwZjdkZTkwNjE4N2FiN2UxOTUyOGU1OTMwMzU0NDRmOGI2ZjQ2OTlhZDRiODg2YWJmNDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb2xsYXRlcmFsbWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ29sbGF0ZXJhbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU5YjAyY2QzYTBlNTEwMTQ2MWM1MmQ1MjY1MmNhNWNhZmQ5MmUxYzJkM2QwYzI5NjI3N2QyZjZhMTA0ZWRlYTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25Ob3Rpb25hbEFkanVzdG1lbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA0ZTg3ZDFhMTkwZmJjN2U4YTRjZGEyZTk5YjBiMWZlZWFjOTlkZmI1NWVlYjVlMTM0ZTljYTJlNTI3NDkyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQW1vdW50U2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDQyNGY5MzgwNTZlZWVmYTdmZGNmMTQ3ZWEyMGI0OGUxZjQ0YjZlMDgwNzdjNjVlNDI2NGEyNjlhMDgzN2NlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQXZlcmFnaW5nT2JzZXJ2YXRpb25MaXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2E2NDg3MzAwNjMxZGFmMWQ4ZjY0ODlhN2M4MjgyNDVjMTc3ZDk0M2RlZWFjNzI1M2RlODZlZWMxNGE2OTdjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlQXZlcmFnaW5nUGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyYjcxMDdiMWM3Mzk4OGYyODZlYTA2ZDRkZWViNWI1ZjJiMzE4OGJmOWQ5MmJhN2E1MWRiODg1MWNmMzE2YWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzYTg4NWI4NjVkNWUzMTdkY2U3NDc2NjUwYzg1MDg5ZDUxODM0Mzk4MDVmYmUyNjAwNzE5Njc4OGNiMzIwOTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kQmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmZDdhMzMzNDZhYThmNDQyMTVhZDRiZDk0ZTQ4ZmZkMDg0MTRjMzkxNDgyYjI4MTZhNjU5MmQwY2FmY2VhMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kRGF0YS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyYzA0NDA1MzJkZjBjYWY4N2IwYTY2ZDBjMjBhYzg3N2Y4NjA1NjE1ZmYyY2E2NTAwZjY2YTE5YzdjYThlOWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUNhbGN1bGF0aW9uUGVyaW9kRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGEzMDI4ZDNhZjc1ZjUzMmY1MTEzMGZkZTdjNDc4NDM5ZjNhMGM1NzNhZTJiOTUwYjVhN2M1Nzg0YjZiYmIyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlRGF0ZVJlbGF0aXZlVG9DYWxjdWxhdGlvblBlcmlvZERhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBlMDJiODUyMjY3ODU2OTVmNjNlYzk3ZmI4NzAyOTM0OTg0OTc0MjY0Yzc2YzA5MTRhMTYzOGQxMTU1NjUwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlRGF0ZVJlbGF0aXZlVG9QYXltZW50RGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmVlMDgzZTI0YmVkZTkwYjY2Yzk3NWEzNDkwMDM1MzhjNGFjNTJhMTU5NGU1ZDY1NzVkYmU4NDE3MjU5MDU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVEYXRlUmVsYXRpdmVUb1ZhbHVhdGlvbkRhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmJkMDVhZTdmNDMxZjFjMjRkY2JmOTU1YzVhM2NlMmZhMDc0Mzc3YWM1ZDdkOTM3ODE0MmQwOGU1M2RjNDkwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlRmluYWxDYWxjdWxhdGlvblBlcmlvZERhdGVBZGp1c3RtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhmMDMyMzI4NTQzNmExM2I3MDRiMTIwMjNhY2M2Yzk0ZTdjYTU1MTg5ZThlNzM5NDNlMjE2NjAzOGRjYWE3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlRnhMaW5rZWROb3Rpb25hbEFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2YmY1YmRiODY4MTc5YzIzYjBjZjRhMDdhMTAyMDZhNWY3YTQ4MWMxMTFmMDMzNGQ1NzU1YjQ3YjczZTM5NDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUZ4TGlua2VkTm90aW9uYWxTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTE1YjZhY2IyZDliZTAzZDNiNDE1ZDhiYzIyOTFlMjU3ZDQxNmFjYmM0YmUwM2NhMjZlZTU5NTBkYTA0OTFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVJbml0aWFsRml4aW5nRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZlNDBiZWM1NDIyODMzMTRjYzFhYzk5ZmI1MjdiZmIxOTI1OWM1YmY5YjhmZjEzOWY2M2JmNWJmMzI5ZTE5OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZUxhZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyYTE5YTE5MTUwMTUyY2U4MTVjOGVkMmE0NzFjOTFlYjk5NjZlNDI4OTYzNmU3MzZiMGJkZjA2YjNhMjczZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZU9ic2VydmF0aW9uRGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTJkNmMwZDYxNDk4Y2JkODgwMGYyY2JhNmI0MjRjM2Y5NjJlN2M1YzgzZGE4YTE1ZGE4NGI0NmM3OThlNzU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVPYnNlcnZhdGlvbkRhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA5MzEyYzcwODY2MzJiN2MwMTZjZTAwMTQyNjI3MGM2ZjMwMjY0NWNjZTk1MDU3Mzk1MzY1OTUyZWU0YWY0ZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZU9ic2VydmF0aW9uU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NjMyMDA4MjZjNTQ3ZjExNWUwZmZmN2JlZTZlNTUyODNiYjQ5ODcwZDMxMTg1ZDU1MjU3MGRmY2IyZjIwYzQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVPYnNlcnZhdGlvblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyYWJiYjVhMTE3Y2U0MjI2MGFkYjJmMmU0MDdjMWYyYWY5ZTQ0OWVhMmRjZmNjNjZmYzA1YzNiYWNmYWNiMWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVBhcmFtZXRyaWNEYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWUxNjFhYzQ1YTdkNDQ0YzBmY2MyNWIxMDhiNjZlMGRiNjc1YzUxNzQzNzc1ZDhjM2IxNTMxNDdiNDJmODIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVQYXlSZWxhdGl2ZVRvRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODhkMDEzYjI2YmRmMGZkNjUxMWM2YjEzMWY4MTdkYmY3YmM1OWM2MmY1NWIzZmU3MDg4YmZmYmU5ODMyNTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVQYXltZW50Q2FsY3VsYXRpb25QZXJpb2QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmRhMWU4NDE5MTM2NGM5NjcwMzE2NjhlYzMzYzY0YjU2YmQyOTU3YjdkYjk4MzU2MjM0N2Y1ZGZiOGFjYzM3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlUGF5bWVudERhdGVTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0MGUwODZlYmY4ZjQ4NzM3ODFjOGEwMzJlMmUwYTcxYzRhZmIyOTYwNGNkZmU3NTI2NzgwZmVhZTljMzAxOGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVBheW1lbnREYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTBlNjIzMGU4NmUwZjk3YzYzMzI5OGYzMTFlYzk5MDJlYjVmMjcyMzY0ZGFlODQ1YjhmZDM5MzY0NmMxYmY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVSYXRlU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNGFiMjliNGQwNzY0NmY0OThhZjQ5OTcxNDkxNWJmYWU2ZjkwNjkyZTRkYjg5YzA4NWExZjAwODIxOTAxMjM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVSZXNldERhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxZmMxZjg0Y2ZjYjFjMzkyYmQxM2U3ZjY5MGE4NWM5MTVjNDRhNWQxMTgyYjBmMDhlMGU0MzA5ZDFjZGZlNmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVJlc2V0RnJlcXVlbmN5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiYTRkMjExMGIyNWNkMjY4NTY4YjQzZDBkOTg3ZGM0ZjMzYTg5OTkwNGM4NGIxM2UyNmMyZjRjYTllMWZlNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZVJlc2V0UmVsYXRpdmVUb0VudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTQ5MTA2MjIxOGQxNWM2YTMwNjU2NDkzNzE0MjQ1MDRjNWIwYjBlN2U3N2E0NmNjMTE2ZGNhNWM5YjFiOTRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVTdHViQ2FsY3VsYXRpb25QZXJpb2RBbW91bnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWJkNWQzZGE1YmU5NjY2ZGIxODNlOGI5YmJhZDM2MDllMTljZjRlZjgzMjMxMzQyNmE4NjM4NzQwNTYzZWM4MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlU3R1YlBlcmlvZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmQ3Y2Y1MmQzYTc4NDdiODMxY2RiZTE4MTU4ZDlhZmFmMzkwMjBhZWQzNTE4Y2IzY2FlZjYyYmJjNzBjY2JmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVTdHViUGVyaW9kVHlwZUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZmY4ZGU2YTY3YzY1ZTc1YmQyODhhOWQzNjIxZDUxZDk5YWI0N2MzMWZhYzA5MTMxZjAxOGU3N2RhMWJjNjc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVXZWVrbHlSb2xsQ29udmVudGlvbkVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODVhMDY3Nzk0MTM5ZTRmMjQzMDFhYWU1YmI1ODMwNTA5ZDQxZDRmZWVhYjM4MmVjYWFmNWFmZDUyYTJiODIxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNjaGVkdWxlV2VpZ2h0ZWRBdmVyYWdpbmdPYnNlcnZhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwYWFmMjM3NjY4Y2UzZWNmOGFiMmRjYzMyZmFhYTJhMjI2M2IzOWFkMjc0MTNiYzFjZWMyMWMzNmZjNmZiZWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zY2hlZHVsZW1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YUNhbGN1bGF0aW9uUGVyaW9kRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzFlN2ZiYjYyNzg5NWFkOWZmODExNTQ4MmMyMjc1YjI5MWE4NmI3MDBmYzFjNjFiMTJjN2NmMzU0ZTE0YzZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2NoZWR1bGVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQYXltZW50RGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTIzZjllODQ2ODYyNTNjZTViMGFjMWI1YTBmODY4NDNiOWNkY2VhMWQyMmZhMWQzMGVjYjM3NzczMDFmYjIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudEFzc2V0Rmxvd0Jhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWJiYzM3YWIwZmJjYTY1ZDk5ZWZkOGQ4MmM4MGRmM2E3ZTI0NGJkM2YyNjI3MDYzNDQzOWY3OTYzNTM1ZWM4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRDYXNoU2V0dGxlbWVudE1ldGhvZEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzc0ZDA3ZWYyMGFmNDU1YmI1ODlkMWE4ZDMwYTZjZWFhZWUyZmI0YTA2NmNkNzk5Y2I5NTU4MjZjZDNjYTAwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRDYXNoU2V0dGxlbWVudFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3NjY1Y2NlYWE3ZmRmY2QwNTk2MTgwOTIwY2YxZDNjZDIyNTBjNDZkMzc0NzQ3ZjhmZThhZTJlOGI1NDlhYzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50Q2FzaGZsb3cuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODI1NTgwOTIyMmExN2VmNzFmMWE1YjgzODQ1NzgzMTQxZjM4NmEyZWNmZTJiODI1ODlhNzAxNDczYThhYTIzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRDYXNoZmxvd1R5cGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZmQ3MTFlZjUyY2I2NDM0Mjg0NDUxNDQyMzRmYTBlYzgzZmQ3NmMxMDlhZjZkYWZjY2U3OGUyMjRjNjZkZDVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudENvbW1vZGl0eVByaWNlUmV0dXJuVGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGY4NjlkMjJjYmY0NWYyNjVmZTVjZDYyYzNjNGQ2Yzc1MjlhYjk5NmE1NGM1ZmZmN2MyMWJhZWRiZWMzOGU4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRDb21wdXRlZEFtb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlYmUxNmE2OTJmNDJmMTRkMjk1M2QzNTg4MmM4NjcwMDAxZGM2YWQ0MGU4MDQ3ZTRiNmQ1MGUyODQ4OTk5OWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50RGVsaXZlcmFibGVPYmxpZ2F0aW9ucy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWRhNGNhMWIxODEzZTZkOTcyNWUyYWM4YzcxNDU5ZjQ3ZWE3NzdiODg1YTE5NjNhZTI0YTA5NTFkOWY3N2QyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudERlbGl2ZXJ5TWV0aG9kRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkNzljYWE2NWUzMWZlNzk2MjE2ODEzMWI3Nzc0OWRjMjVkYmQ1OTRjOGJjNjNiMmQ5ZWY1NDRjYWExZTg3NGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50Rml4ZWRQcmljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUyZWI1NWFlZWJjZDE4ZTA2OTljM2M2ZWFhYjc4ZDM2YTcyNGViMjQwMThmODMzM2RlOTZiODNiMTgzNjRjM2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50RnhGaXhpbmdEYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzOGI1N2E2Yjc3NWZlOGI4ZTE1ODA4OTI0OTY0MTU3NTRiZmVhMGM4MDViZTZjMDhkNzRlZDlkZDIwZDM4NjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50TG9hblBhcnRpY2lwYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjVjYTMyODFhMjVjODcxNWExYzkyNTNjNDgwNmIzYTJmN2U0MWE5M2UwMjI2ZjE1MzNjOWRmNWJkODIwMjQwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQQ0RlbGl2ZXJhYmxlT2JsaWdhdGlvbkNoYXJhYy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODQ0Y2E5ZTdiY2U1YTg2OTNlY2M4Nzk3NmNlMTVhMDRlMjViZTlmYWYzNWRjNjZlN2U0N2Y2MmExMDE2MTUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFBheW1lbnREZXRhaWwuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTVmOGMwNzRlNWM3NmM5YWQ4NWRiYTk1MjZjOGViY2MyODY4NWMwMGRhYmUyMThhZWVkZmQwY2IzNDIxZGUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFBheW1lbnREaXNjb3VudGluZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1OGEwOGRhNjcwZDhlM2ZjZWQ0ZDhkODhjYTM5NDk0ZGVmYjRiMTQwYzhjYjBlNjA3ZWU3ZDdjNzI0YjM0NmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UGF5bWVudFJ1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZmE1MzAxYmQ3YjNiNzY1NGI3ZGRhMTU1ZjVmNDczMWJmYjFjMGFjZDhjMjQzZDQzZWNmNzQyZmZiMjE2YTI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFBheW91dEJhc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTNiMGY3NGVmZTRiODBhYzYxZTlkMGY0MmFjMWE0OGYwZmRmNTRiNzdkZDg4MjQ3NTllNzY2MWE1Y2IyNDJiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQZXJjZW50YWdlUnVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhMzc0Mzg1ZmE3MTY2NDRkYWQ2MmIzNGRhOTViYTVmYTJmOWE2MzFmM2M1NTA1NzM3NTU1OTc4NDIwODY3NmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UGh5c2ljYWxTZXR0bGVtZW50UGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODUyMTMxYzhkNDZjNWM0MDllZGVkM2VmZjI3Zjc0YTFjMGI2YzY5OGIxOWQ0NTUzMzU2ZTQyNDhkYmYyMzAyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRQaHlzaWNhbFNldHRsZW1lbnRUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMWRkNjE4MjlmMzA1YWI4NzE5MzgwYjEyMmQ5ZTEzYWIyODNlZGVkYWRjODc0NmRlMmRkZmY3N2U3ZTAzOGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFByaWNpbmdEYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjZjMzNTljM2FhM2JjMDQ3MDgxNjkzMjUyZjQ1ZjI2NmYxMzU1ZjhiNDUxOWY2ZThiNDliMTY2M2IxNzAwYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UHJpbmNpcGFsUGF5bWVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmJkNzYxYmQ0MWU1Nzg4NDhjZWU0YTAzN2E2ZDNiMDlmN2M0OGQ3NDUyYjdhYWJjMjJjZTgwYjdlYzNmYmM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFByaW5jaXBhbFBheW1lbnRTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2N2NiMGM2N2U3Y2I3ZmEwYzMyMzEyYWY5ZDU4NTczNDE0OGIwNGM2ZjdhYTEyNDI1MThjY2FjYzYxY2IxMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50UHJpbmNpcGFsUGF5bWVudHMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDcyNjk2Zjc3YjA5NjhiN2VhMzAwZmNlNWY1ZTBmNWVhYTEyMGZkMzE5ZDFmZmYyOWFlY2M2NGViZWVjNDgxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRRdWFudGl0eU11bHRpcGxpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMDUyMTE5ZGU1ODUxYzhlMWU5ZDc1MDk5M2I1ZTE0ZDY1NjM1NjhhMGJlZjM1NjJmNWI5YzI5NTY1NWI1OTZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFJlc29sdmFibGVQcmljZVF1YW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImI1YWFkODMzYWZiNGU0OTk2NTYxMWQ3MjBlZDYyMTU3ZDYyZTNlNzFiMThiN2ViMjEzMTE4ZDFmZGFkNzlmMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50Um9sbEZlYXR1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzk4OTJjMTk5OGQ4YzQ3MmUzNzllN2QzN2Y4ODdjNTdiZTY2ZDczOGFlOTM5NDQyMDU4OTVjZmQzZmY5YjExMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRTY2hlZHVsZWRUcmFuc2ZlckVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTExZTNhOWM3YzI1MmFmNjAzYzc1NTRiNzhlN2E5OGQ3NGM2NDY0YjBiMTI3ZGQwOGZmYTg3OThhN2NlNDllYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRTZXR0bGVtZW50QmFzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzRjZThkZWRhOGJjNTA5MWY0OTRlZDI5OTVmMzcwNDM4OGI0MTM0ZWRkMDZiZjBlZGQ3NDBlMjJlODc4NDA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNldHRsZW1lbnRDZW50cmVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjk2NThhNzRmN2Q0ZjE0MjI1MjU1NzIwOWI5NGFiZTg4ODQwMTdmZDQ4ZmY5MjY0ODc0MmVlNzAxOTE4MzBjYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRTZXR0bGVtZW50RGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZTA2NTUyNTQ4NmYwZDAxNzNhNWQ4YTUwYjlkZmMyYzk2NTE1YjYzMzA0ZTFmZjUxNWY0MzgyZmFjMDlkOTc2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNldHRsZW1lbnRQcm92aXNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTdkY2MwMGRkM2E1NDY2OWY3MzVhYjNhMGRjMWI5MDc2ZjY2Nzc4YWQxNzgyYmE4OTYyNmMwNjMyNDBiMmEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNldHRsZW1lbnRUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMWM1M2EwM2Y0YmIwZDBkZDVjZTI3MGFhZDE3ZWQ5YThiZTk3YzA1YzE3MzI4NGYzY2I1ODdkMzYwMzFjYTA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudFNldHRsZW1lbnRUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmOGQxMzA5MmU0MWMwNWFhMWM3ODVhMTdhZGZmMzM2YTc3YWE5MGQ3OGZjY2FhYjJjYTBiNjgxNmM5MjIyZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50U2hhcGluZ1Byb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE2ODc1NTU5MDM0NDg3ZTczZTQ5Y2YxMDdhYjAwNTk4NWMwOWI4MTMwNzgyM2FiNmUxZGE1ZDc4MzhjMzc3NzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50U3RhbmRhcmRTZXR0bGVtZW50U3R5bGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWI3ZjBlNjQ1YjdiZjg0Mzg2MzA0NGZhMTlmMTFlNGY5ZTAwYjgzYTE3ZmU2NjczODQzYjlkN2FhMzAzNjg5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRUcmFuc2ZlclNldHRsZW1lbnRFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGY3NTBlMTE0MmE5MzFlYjQzZGViZThmN2VjOTZjNjJhNTI5NmQ1OTIwNDc2YWVkMGQzOWE3NDYxM2VmNWY2YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdGNvbW1vbnNldHRsZW1lbnRWYWx1YXRpb25EYXRlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkMTVkNTg4YzMwNWVkNzQ0ZTFhN2M3ZTVmNWY0MTQxYjFiYjk2MmE3Nzg1YjBhNTI0NDY1ODgyNTMzNjg0ZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhQ2FzaFNldHRsZW1lbnRUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwOTM5ZjVmM2Y4YjhhZjgyODRmYjQ0NjU2MzY3OTNmNzVjOTVhMjkyYjBmZjRiYmY1ODc3MmYyOTcyMjg5MjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3Rjb21tb25zZXR0bGVtZW50bWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhUGh5c2ljYWxTZXR0bGVtZW50VGVybXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YWQxZmMyZTkzODliYWY2MjMzMTUwNzU0OTVmOTY0NmNlNTUwNzkxNjQyNWRlZjIwNTg4OWVkMGRkZTFlYjkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0Y29tbW9uc2V0dGxlbWVudG1ldGFmaWVsZHNSZWZlcmVuY2VXaXRoTWV0YVJlc29sdmFibGVQcmljZVF1YW50aXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE5NjNlM2UyYTFlY2QxZThjZGEzYzcxYzZiMTE2NTFkZGM1M2I4ZmI0NDNjYTQ1ZTY0M2U0YTA4NTczMjc1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQXNpYW4uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzJkZjAxNWFjYTE0MTc0MGRiNzU2NWEzZDgwMzNjZDU4YTgwNzcxYmNjYTg5Y2NkYWY5MjM3NTAxYWIxYWU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVBc3NldExlZy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImExZDM2Njc4MjI3NjJlMTI5ODQ4N2Y0NzBmODRjNWE3N2EyNWRlM2M1NjdkNzlmMzg5NWQ3NjZiODRmYzg5YjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUFzc2V0UGF5b3V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwYjM1N2JjMmU0MjkzMDMxZGI2NTZjY2Q4NDQ3NDJlOThjM2U1MGM2N2MxZGMzMWRhNzYxM2VhOGQyMWYyNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUFzc2V0UGF5b3V0VHJhZGVUeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzYzU5MDVlZGNlNWRiYTA4Nzk3ZWMwYTdiMjVlZDdjODc5ZTdlYzI2MzVjYTEwYTg3MmIxNzlhYTFmM2Y0NjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUF1dG9tYXRpY0V4ZXJjaXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmJmYmRkZGE5ZWY3ODBmOGI1ZmYyNWIzNDkxOTNkMTcyODZlMWEwYjJiZmU0YmE3YzAwNzc0ZTMwODlkYjA0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQXZlcmFnaW5nQ2FsY3VsYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MmE4NTY3NWEzNGNiNzVlZjNmMzlmMzg3NTdkY2M0M2IzNWVkZTUxYzAyZGU1NDhlNDdjMDRmYzAyNTNmZjRmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVBdmVyYWdpbmdJbk91dEVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZmQ1YTU3MzVjMDdmYmEwY2ZjODU4MWE2ZTIxZmQxOWY5MTU0ODUzNjE0ZDVkNDBjOGZhYWVhNThhZjhkMzBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVBdmVyYWdpbmdTdHJpa2VGZWF0dXJlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjcyMTRhYTNhNzkxODQ4Njg1OGE2NzI5NDg1NGM0Yjk0NzAyZGE2ZTA0ZWEwMmQ0MzE0YTI4OTllYzE2N2M1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQmFycmllci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMywKICAgICAgICAgICAgICAic2hhMjU2IjogImE5N2Q0MTA1NGQzMGJjNzkzYzRjMDEzZTNiMTJjZTg0OGZiOGE4NzEyYmQyMWViNjIxMWVmNmU5OWE1ZDUxMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUNhbGN1bGF0aW9uU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1N2RiNGQzZWRhYjBhN2QyNmQzMmQ1MmNhMDlmZThiMzliMzc4YjEzNjdiMDkxZDY2ODQ5NDU0OWNjZDRiYThlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVDYWxlbmRhclNwcmVhZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlY2I5ZmE3NTNlMTVkOGI2ODY5YzllZTliNjZhZWQ1NmRlNTFmODM2OGMyN2IwYWYzMGQ2ZTcxZTJkMDQ4NGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUNhbGxpbmdQYXJ0eUVudW0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOGY3MDdjZjBhZDYyNTVlZjhmMmNjMmNhM2U5Y2ZkNDZmZmI0MGNiNzUyY2ZkZDEwOTRhYmFiMzQ1NzMwZDM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVDYW5jZWxhYmxlUHJvdmlzaW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjEyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYzZjQxNDc0NTYyYTE1MmIwMjE5YmRhMTI5ZjNjM2RhNjBjMjM1NTRmZTIzNzQyMjlhYTcwNWIxZWUzZTNiYWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUNhbmNlbGFibGVQcm92aXNpb25BZGp1c3RlZERhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTY0ZjFlZmU1M2U1ZDEzYjUzZmZjOWQyNDNkYzM3Mzc0N2JmNzc0MmE5YjEwMjZiZmExNGJmNjU3YWJlOTMyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQ2FuY2VsbGF0aW9uRXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDE3MDg4ODg2YjNjODQ4NDE3NDEyYzU3NTY0NmUyY2Q5NzA5NjA5ZDZmZWFjZDliN2FhNDM2ODBjYjFjNDE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVDb21wb3NpdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWI2NTUzYjU0MjY3ZDNhNDNiYTEzNWVkZTM4YjQwMDMwZGViMWVkMzU3ZjRjOWExYzQ0OGMxMjcyMjQzMDU4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlQ29uc3RpdHVlbnRXZWlnaHQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMjA5ZjQzZDY3M2Y5ZTU3MmQ1MTcwYzk5MjUyYTViYmFmOGM5N2Y4NzE0ZTlmZmE3ZWRiYzljMGFiMzY0Mjg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVEaXZpZGVuZFRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmQ3OTBlNGI3ZTRjM2EyZjhmYWRiMmQyMzU4Y2IwNDcxOGZiODE1ZmMxNGM0ZDM4ODQzMGJiYWJkZTJjNTA2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRWFybHlUZXJtaW5hdGlvbkV2ZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3NjlmZTg4ZWFkZDE5ZWJhMWZkMmQ0YTJlZmNmZmNmNmM1MGQyMmJhZDU5MDg3M2MxNjYzNmY5YmFiODA4MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUVhcmx5VGVybWluYXRpb25Qcm92aXNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzhjOTUwZDIzMTA2MjRjZTQ0NzZiYjliMjYzMDg4NmIxYzMyYjg4NjNhYzY0ZDEzZjNlYjhkNDA4ZjIxNGI3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRWNvbm9taWNUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YzhmZDYzYzQzOWU2YTRmYTZlMmI3MzVhZDhhZWI5NWQ1MmQ1OWRjNzg1ZWQxYjZiMzlkNzNkYzQ0OWM5YTY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFdmVyZ3JlZW5Qcm92aXNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQ3NjVmYzJhMTEwMDEzY2NkZmE1ODJmYTczYjgzMWVlNTNiMTYwMzk1OWIzMGYzMzM4MWZkMGIxZTQxM2IzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXhlcmNpc2VGZWUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGFiNWUzOTBjYzRmNThkNGM1YjZhM2M1MzdhN2YyYjdkNGU5ZDY5NDExYmJiN2Q5NzNkNmM5ZmUxNjYzOTkzOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXhlcmNpc2VGZWVTY2hlZHVsZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWQxODJlOTcwNTVkN2IzNmNkY2M0OGU2YmVkZDcwZDcxMTRlOThkYTMyYjVmMTcwOGFjNWNkMmZlODRjMTg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeGVyY2lzZU5vdGljZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MjllZWYwZDIzNjcwZTA1MjI2NWNiMjVlMGEyMTIwMzJlOWUyMWI0ZWYzOWExYTFkNjczYzFkMDZhNzZlMmFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeGVyY2lzZU5vdGljZUdpdmVyRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlNDAwNDJlODg1ZWE2NDYzNDc2MDBlMzNmN2VlY2RmNmNiMDE5ZDIyYmU2YTNkMjI0MzJlMGNmMmZjMGJkZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV4ZXJjaXNlUGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmZjNjRkYzVmYWE1ZjJhOWI3YjVkYjFjZGVhZDEyMDViMDE4ZDE0NDc0ZjM0YTMyNTZjODM0MWZhNmM5NTBjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXhlcmNpc2VQcm9jZWR1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTY2NzNhODhhYjIwODhjOGVjYzg1MmMxMjg4ZGYzMmJmMmRhNDhlZWUxMjIwZmUyOTJhNzg2NDRhYzZjNmVhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXhlcmNpc2VUZXJtcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmY2ExMjhiY2IzZjgzMmUxZWNhOTZhZDI0NDZjMDU2MTE4ODExZWEzZWI1NTgxNWEwZTMwNmM0ZmYwYzU3NmNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeHBpcmF0aW9uVGltZVR5cGVFbnVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhMzhlYWMxMzMxNDM2MWMxYjQzZDdkOWVmYWY4MjA1YWVkYWUyMzZjNTZkNTIzMmM4Mzg2MTUzMmFjNjZiYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUV4dGVuZGlibGVQcm92aXNpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzJlZDViNTViNGZhYjc3ZWMxMzQ3OWI5ZDZiODQzOWNjYWQwNzVkM2NlNWUyOWMwYmY2Yzg1N2UzODgzMmI3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRXh0ZW5kaWJsZVByb3Zpc2lvbkFkanVzdGVkRGF0ZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZjUwZDA4NmU5YTNjYzgzM2RiMGFjYjMzMWQ1ZTBkZDlhZjM3YzUzMjcyNTVmZTNhNmM1ZDI4YWZkZTcwZDk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVFeHRlbnNpb25FdmVudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2MDM5YzZhZTkyMzA5NTE3NmZhYjkzZjA4NzI2ODIzODczNGFkMjdlZjY4OGM0ZTRiY2IyODQyMDdhZTBhZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUZpeGVkUHJpY2VQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ3MzM0YTM1M2IzNGU3ZTk0NDdkODM1MTc2YmM3MjU5MDYzMmQ3OTE4YzEwNmU3YWJkZjk0OWIzZWM0ZTlkYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlRnhGZWF0dXJlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzN2Y4Y2ZiMGQxZTQzZjdhMDZjNzY2ZmE1NzIxNjBiYzNhZjc2MTg3Yjg4MjhmYWQxNzA1ZTU1OTE2Nzk4YWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZUtub2NrLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjFlOTU2ZTQ0YTA4ZDUxMGI3OGMxNTNjYjRhNTM1ZWRkNmRmYWYyNWRkYjU1MTlhNWNlNjg0ZDQ3NWY3OGMzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlTWFuZGF0b3J5RWFybHlUZXJtaW5hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNjQ1MzhkYTU1M2MzZWE2NTYwMjYzZjAxMDMyNTE2ZWE4NGI1OWQyMWIwNmViNTY3MzdiZmYyZDcxMDFlMWI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVNYW5kYXRvcnlFYXJseVRlcm1pbmF0aW9uQWRqdXN0ZWREYXRlcy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZTgxMzJkOTIzMmE0OTNmMmYzNmY2M2U1MmRkYzc3ZDkyYzJlYjg3ZDkwYWU4MWM5ZjA2MWMzNmUxOWQ1ZjdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVNYW51YWxFeGVyY2lzZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNThjOTcwZTBjZjUwYjZiNjFlMjUyNGM4NTNkNDJjZDcwYjViZmQ2MWNhODFiMTk3ZmJjZGM5NmZiMGQ5ODI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVNYXJnaW5UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2ZDZmMWNkYTJhZjczNWRiNjI4NWYzNDMxZmI3OGM0YzRhMTZjNTg0ODJkZTU0YWY1NTI2NzQ2OGQ2OWJhZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU11bHRpcGxlRXhlcmNpc2UuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRlYTQ1NjM1N2JjMzNjZTU1ODQ1MDhlMGZkM2Q0NGQ3YThjZTgxMTZhM2ZiMzdhYzZlOGVhZjg2MzQyZDVmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlTm9uVHJhbnNmZXJhYmxlUHJvZHVjdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWZhNjJmYjA2M2ZmNmJlNTM1YmU5NjY4MjAzN2NhMWJjNTRkZmI3MmM4ZDA1ODFmMmUyMWZjNDdkYzU1NTI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVPcHRpb25FeGVyY2lzZVN0eWxlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2NWVlMThiYzVmZWNjMmZmMjBiMjE3ZGY1MDBiYmM3NzhlNDQxNGJiZTNjYjdkZmJlZTQxNDM1YWQxYWE1MTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU9wdGlvbkZlYXR1cmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjU2NzU3ODRhZjEyNGQyZGM5OWE5MzU2MWM4MWRmYTJlNzg4MWIyY2QwNjM0OGY1NTNlZDhiNWQ1YjgyNDkxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlT3B0aW9uUGF5b3V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzkzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4ZDgxNjVjNTU4OWJlNGE3MjNjN2U1MTNmZTcwMWZjNzQyODk0ZDhiOWU2ZDM0MzBiMTAyOGU4MjY0MDlhZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU9wdGlvblN0cmlrZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmY3Y2E4NzRhMGIxMGIyNDVhNDA5YmZiYWQzNTc4OGFhNDQ3YzNlZjQzMzZjZDQyOTNkMjUwMzVjNmQyOGE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVPcHRpb25UeXBlRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiNGU3OWNkZDQzNjJmOWI3MGI5NzlhOTM4YjNiOTM5MGVmMDQ2N2Y0YjNiN2Y3MWVjNmU5YzdmYzgyYTAzZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZU9wdGlvbmFsRWFybHlUZXJtaW5hdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YmRlNDA5YTllYTczMzk1MjFlN2I3ZGMwODQ2MzM0ZjE1M2VjNjgzNGI2N2E4NDljODg4MjJmZDBjOTAzYTgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVPcHRpb25hbEVhcmx5VGVybWluYXRpb25BZGp1c3RlZERhdGVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWUwYzdlNjdiMTQyNDIxZjY2ZjMxZTAzOGU0Mzk4ODFiMGM3ODFjZDMxZjU3ZWE4YjM2Mjk5MTJjZGYzN2ZjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUGFydGlhbEV4ZXJjaXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZmODZmOWQ3MDMyYjdhMGM4NmFlYjE0MjAyNTNjYjU4OWY4ZjY2MzcyMzFjZWNjNWE1ZThjMzA4NWE1NjVkYzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVBhc3NUaHJvdWdoLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWRmZmQxODdjY2YwMDFhMzFjNDcxYTFhOGM2MDdkMGY3NTJlN2RjODMyOTQwZDVlMzJkODQ1YWUyOWU3NmQ3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUGFzc1Rocm91Z2hJdGVtLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTkxMzg4MDcxZjIzYTE5NDQ5ZDBiNzVlNmU1MzkwMzNkOTQyOTVlM2U2NjAxOTJjOWEzYjkwZThlZjFhMjY0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUGF5b3V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwMmUzY2YxZGU3MDYxZmVhZjZkZDdkNGFmZWY0YWVmZTgzNzIyOGM0OGNmODI1N2RiZTYxMzU0YjljY2QyN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVBlcmZvcm1hbmNlUGF5b3V0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUyOTBjYzA5NDE2ZDg5YWExNGUzZDc2MmU2MDRlOThiNzZjNzk4ZjM1OTliMDhkN2IwYjk5YTYyZjk1Mjc3NzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVBvcnRmb2xpb1JldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmMzY0N2IxY2VhZmViOTRhY2NkZTFhNmFiNDk5YzAxMDBmMTFhOTE3MjFmNDYyNmQyODMxNTQ4YzcxODBiMTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVByb2R1Y3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTM2YWYyNzk4NjI3MzZlYWYyYzRkMGM4Yjc2OWI0OWJhNDBiZWQzMzUyZGMxZjFjYTczMjdmMGNiNzc3OTRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVRdWFudG8uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODM5ZDI1MmJhMGI2YmVjMjRmNDk2YmQzYTkxZjExYjYwZTRhMDU0NGMxY2VlZDNkMWQ2OGZmZDI3OWYwMjBlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlUmVwb0R1cmF0aW9uRW51bS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjMTE1NGEwZWRkZDA4Y2U0NjkxNzJkZDc1Y2UyYzY1YjVmMmU5YTUwMzE1YWExMjY2ZTUzNjQwOWVjNjQ2MGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVJldHVyblRlcm1zLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgzNDZmZDY0N2UzYmY1Njg1OTNiNTY4MTk4N2U0YmY4M2YwZTQ4NGYxZjQyZDFlZjZkOTI5YmVkYjRjZmMxZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVNjaGVkdWxlUGVyaW9kLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3ZjljNWEyYTQ5YWQxMjYyM2UzYTkwYjg0MDllNzVkZDg2OTM1ZjdjOWFlOTVhODk0YTI2MmQwOTkwN2M4ZjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXByb2R1Y3R0ZW1wbGF0ZVNldHRsZW1lbnRQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGMxODkwYjZmM2E2Y2JmNDdjNDFhM2ZhN2RhMWJlODBmOGNiZTdhODg1ZmRlNzQyY2MxODQ5ZGVkZDg2NDBmOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlU3RyYXRlZ3lGZWF0dXJlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGNmMGJiODY3ODBhNDUwOTMxNmNhMzI3M2Y1NjdkNDBkNzQ5NGRmMzk2MGJlMGM1NzdmZWVkNzRlNzE2YTU1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlU3RyaWtlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjMzZmFiNzkyZTY0MjhlZTBhODZlNDI0Y2ZkNmRlYTk5NmM4M2UwMmZlYmI1YzUzNWJkODBlZGZlY2FmZDZiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlU3RyaWtlU2NoZWR1bGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOTE5MmRjNjBiZTYwMGJjN2VlYjM2MmJhOTdjYjIyZjMzMGZhODkxMDdhMzM0NDdkOTlhZTBkMGM1ZTkxMGEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVTdHJpa2VTcHJlYWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODIzMGY2ZmI2ZmE2NmEyMzBjOTc5YmEwMzFkOTI1OGQxYTI5MzcyZmRiNWZjM2FhMDQyYjg2YTEwZjZjODBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVUZXJtaW5hdGlvblByb3Zpc2lvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2Y2ExNDc2OTM4NWUzZmIyZjAzM2E5YjlkMzM2NzEzMWUxZWYxODJiM2Q4ZDNhN2Y5NDEzZjc4ZmI5YmUwZjM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVUcmFkYWJsZVByb2R1Y3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWM3MzYwOGIxNDM4Yzk3OWE5ZTVjOTlmYmZjZTFkZTdiMzgxNjJhZDEwNzdhMGQxZmM2ODU0NjZlNzA3ZTExNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlVHJhZGVMb3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODRjZWY2YzRhMTRkMjM2NGUyZDZhYTg5ZWI2NmZlZDJhOTQ0YmFhYWM1ZTJhNWE1ZjIzM2NhNjk4ZjJmNzlkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcHJvZHVjdHRlbXBsYXRlVHJhbnNmZXJhYmxlUHJvZHVjdC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTgwZjFjOWMzOWViOTNmYWFmZjg2Yzc1YjMxNDYyYTYyYTA1NTFjNjhjMWZiMDdiZWM0N2EwYTYwNzZmOTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVVbmRlcmxpZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZWI1YjEzZWM5M2I1OTg3MmQzOTMwMGFmNDZjMDkyMTZhNWY2MGVmZmE2MmUyY2IyN2IyY2U5ZmY5NDRkZTY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFPcHRpb25QYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWNiNmI0MjUwMDYzNzQzZmI2ZTllNmZmNTY4N2JkOTE2NzI5ZGE5YTZkNGNiODEyZjQxYmNkOWMzM2Y0ZTBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1wcm9kdWN0dGVtcGxhdGVtZXRhZmllbGRzUmVmZXJlbmNlV2l0aE1ldGFQYXlvdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTY0NzZlZDEwZWQ2YTViOGE2YzRiODhjZTBmNzc3Yzk2MjkzYjNjYTJiZGZmNDMxM2IzNTc3MDc1M2Y5NjU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uQWNjdE93bnIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OGY1ZjRhNjU1OWExZjJjMWRkZDkyOTg3NmI5NzlkNDY0ZjcwMDdiN2M4MWQ1NjY3NzJlMGIyODcwMTQwODAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uQWRkdGxBdHRyYnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGIzNjUyY2I1YjNmOTNiZjkyMTc4YTY5MDA3ZWMwMzY5ZGFmODhhNTU0NDc4MzVjNDBkYjg4YjQ2YmNjMDJiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbkJ1eXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzhjOWUxMWI4NzYzYTEwZDU1ODk1OGY2MzQ3YzA2ZWExN2UxODdiNDc1NmQ5NmU1ZTlhNmRhM2I4Mzk2MTZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uRGVyaXZJbnN0cm1BdHRyYnRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmRhNWNlZDE2YmE4NDEyNmE5YzU2M2NhODc4Yzk5OGM4MTlhZjdkZDU2M2E1ZDgxZDY1MmQ1ZDQzNzU5ZDlkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbkRvY3VtZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzMzM2JhYjcyYmVhZDc5ZTcxZjAyNzUzNTFhNGY5MzhlYzgzNjc5N2NmMzQ5YzEzMzViNGJiZWQyYzY0MmNjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvbkV4Y3RnUHJzbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4MzI3M2I5OWVkZDQ0ODI2MDAxZTI5YzAyMTc3MmExMjNmNGVhM2ZlODM5ZmM4ZTkyYzkzNTZjMGQxMGQ0ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25GaW5JbnN0cm0uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YThhZGI5MjFiMDIxYTJhZWFkMjQ3ZTNiOTkyYTA2MTkyOWYzMzZlZTYzZWFhYmE5ZGEyYjdiNzY2OWJiNTFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uRmluSW5zdHJtR25sQXR0cmJ0cy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxMGJkMDcwOTljZjExYjk5NzA5OTQzODAwMTBlY2VkNTBkZDE1Yjg1MjY5YTc5MGI1N2UzNTkwNzhkZjcyOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25GaW5JbnN0cm1ScHRnVHhScHQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjUxNzYxZDQ0MTIxZGY2MTNlNmQ3MDc0YjVlZTgzMGIxMGZkNWFiMWM4ZDdkZTY5N2FjNGE4OWJlNzFiZWU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uSWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMjVmNTZmYmIzMDczMDIyNDZlZmQ2YWVjMDFhYmQxYTlmZWRkNjIwOWY0ZjE0MWIwMDQ2NDM4YjE2MmM1OTM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uSW5keC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmY2IxMTIxOTlhZjMwMDNkNjQwOTE5OTVlOGZlMGFmMTBiZDI0ZjM4YTIyMWIwMjFkMjc1MzRiZWI5ODgwNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25JbnZzdG10RGNzblByc24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYTVhMWRiZjYzY2I5ZGVkNTlhOTNlYWViZTBhZTg2ZmFmNTQ1MWU5MDg0OTBkZmUxMmY1ZGIyNTg0NTczNjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uTmV3Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVhODI5YmI5MzBhMjM2YThiZGU2NDI5NWJmYTQ2NDM3Mzc5NGY2ODZjMjIyNDk3YjMxZjliMmEyYzkyMzNlNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25ObS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5NWUxZTg4OGJiNWQ3YmI4MDZhYjY1NTgyOThhOTQyOTFmNDlhNDQwZDc2Y2VlMjEzMDg5ODc2NmEyZWQ4NzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25PcmRyVHJuc21zc24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZTc2OGU0NDZmNjY3OTJjMjk2ZjdhODIyNzYyMjI0MWUxYjljMjczZjZjZDY1ZWYzYzE5ODkwYTcxZWM5M2E2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uT3Roci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3N2FiZDRjZjg5NjE5YzMxZWM4YzMwZDgwOWM4MDRkM2M1NGJhMWRhZjdjZmZjNzFkYjU3NGZiNGYyZWNjYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25QcmljLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWI0M2Q2N2M4MTQwM2EwY2Y1MmJmN2UwZmFkMWYzOTlkNmVhNDgxZmExMDhhNmFiOTIyYTVhZDBmOWEyZTQ4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblByc24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZmVjNDJmN2YxOTI3MDFhNzk2OGU3MDNjMzQzMDhhZjJiMzkxMjE1MWQ0YzJjYTVlNGI1MzBhNDlkODJkZjVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uUXR5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Y4ZjgyODFjNTA4ODQ0MzgyN2RjYWJhOWZhMjJjNWM2MTFhYjk0MzIyYmIxMTNiZTVhMGZmN2YzN2RhZWY2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblJlZlJhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OGRjNmJhNTlkNmJmNDliZDRkMzk2MGNhN2U5ZmVmMzUyMTg3MWYxMzQ1MzJlMWI3MjkyYmMzMDI2Yzg2NGY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uU2NobWVObS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzZDNmZDc3OGMzOTRmNjEyNDczMTEzMTc3ZmQwOTBlZTIyN2I4YjUxNjQ0ZDg5ZDNjYjUxNGJiM2Q5NTVhMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25TZWxsci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmNjM0MzMwODA1NGFhOTI0ZjdiMGZlOGY4ZjQ0OWRmMmQ4ODRkZDY3YTUyZmFkMWM1NjIxYWNjYjVlNzBmZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25TbmdsLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQ5NzQxYzQ1NGYxMzVmZTk4NDBhNjMxMjgwYzBmYWJlYzFkOTlmNWJmZDJhZGUyZmI2NTJhYjJiMmUzMDE1YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY2RtcmVndWxhdGlvblN3cC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwMDM2OWM1NjY0M2MyMDMwZjFmNGRmNDg3NDQzMzVlY2Y2M2U4MTcwMTJhYjg5MmVkNTlhMWEzNWUzYTg2NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25Td3BJbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5Y2RjMWY2Y2I2ZDA1MGI4NTcyZWIwMGQxMzFiZTNkMjg5OTgxYjNmZTZjZWI1NjEyZWZlZjExYmE3MjhmYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25Td3BPdXQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDljYzFlMWQ1NDgxYWFhY2YyZDgxN2JhZDQ5NDAwMTA1NzA4MTQ2YTM1ODRkZGEwODMyMjFjMzUyZjNjZTA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uVGVybS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5Y2Q4YzgzMWRmZWVjYWQ2MzZiZWI2MDIzM2NjMmFkMmJkY2QxODVhMDhiYzgwZmE2ZDgwYWZhNDYxOGMyOGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NkbXJlZ3VsYXRpb25UeC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOGI0Y2Y3MmMxZmQ4NjliOWYwZWEyNjNkMjI5M2I3ZDViNWE4ZTkyZmMxOTI2MjhiOTQ5YzA1Yjc2ODIxZjg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jZG1yZWd1bGF0aW9uVW5kcmx5Z0luc3RybS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2NGQ0NjhkNjM1NjdjNDFjZjg1M2MyZDExMDQ2NDMxNmQ5YTc5N2QyMWIyYzRiZDdlYjIxYjkwYmY1OGM3ZGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NvbXJvc2V0dGFtb2RlbEZpZWxkV2l0aE1ldGFTdHJpbmcuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTM5YmJhNTljODc1MjExNGYzMGYzMjk4NmUyYzA4ZDlhMTJhZjZhYjE5NTNlMTZlY2U2ZjY2M2YzNzM1YTc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9GSU5PUy1DRE0tNi4wLWQwNy9jb21yb3NldHRhbW9kZWxsaWJtZXRhS2V5Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE4NTk4MTlkNmFhNDI4MzY0ZTA0MTg5NmRiZGRkN2VmYTU1ZDk1M2FmMzlkNmRiNDQ5YTgzZGU3NzRjZGU4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY29tcm9zZXR0YW1vZGVsbGlibWV0YVJlZmVyZW5jZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImY1ZjkyZjAzNTQ5ZTc2MDk3YThhMjA2ZDUzNzU0MWNlYjM1MjE1OTZmZmRmZTkzYjdiOTNhNzFlZDAwNjQ0YjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL0ZJTk9TLUNETS02LjAtZDA3L2NvbXJvc2V0dGFtb2RlbG1ldGFmaWVsZHNNZXRhRmllbGRzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGQ0NWUwMzk0NTYyMWM5OGZjNjRlNzQwZGQyOWI2NDIzYjg0ZGQxYTMwOGM0NzVhOWI0YWJkNmYyYTIxNTc1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvRklOT1MtQ0RNLTYuMC1kMDcvY29tcm9zZXR0YW1vZGVsbWV0YWZpZWxkc1JlZmVyZW5jZVdpdGhNZXRhU3RyaW5nLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDc4ZmQxNGZhNTU3ZmI1MDNjOTg1YWRlOGM4YzI0ZmRmZGU3NDdhMGQ3ZWU1Y2MwMjAwYTFiMzcwYzRlODJmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9Eb2N1bWVudFJlc3BvbmRlck1hbmRhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTQ0NmIzNmY0ZmJmODNhYWFjNzIwMTk5NmMxMTA0MzljMjE2YTIxNzg2N2ZhMTVkMjU0MTdlNmNlZGUwNDgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NYW5kYXRlL01hbmRhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODgyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkZjM2ZTMzMDQ1NzZkNDAxYTk1MzgwMjZjYzA3ZTU0NWE5NmNkMmJhMDBlODM1ZTFlNWFlMjE2ODRhNjgzMTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvTWFuZGF0ZUFjdGl2YXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwYWNjNjcxYmM1M2MyMjBiMDBkZWFmNjAxMmI5ODEwMzI5OGUzNGVlODRkMjRkYmNhNDVkYWQzMTRiMzU3YjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvTWFuZGF0ZUF1dGhvcml0eS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk5NGNkOWQ2YmIzYzc5OGE1OWFiNzVjYTg2MGM3YmVhMjNjYjUxYjVmNGM4MDczMjZiZjViMWYyZTFhNTJkZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvTWFuZGF0ZUF1dGhvcml0eUNvbmZpcm1lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhMzMyMWQ0NTA0M2IzZDFhZTI0ZDk1ZTUyODUyMmJjZjVmZWJjZTU3MGU5ODY1ZDMzNzc1Yjk2OTQwMDU0NjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvTWFuZGF0ZVRlcm1pbmF0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTEzNDAxNWFlOTc5ODc1NGQxYzg0OWQ1Zjc0NzdkMzg0ZWM0MmU0ZGY4ZTVlMDQ1YTExODg4ZWZmOWE1ZGQwNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9NYW5kYXRlVmFsaWRhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMDIwYzI1MzlmNTczYzk1MDFhZWI4OGJhNGQzOTY2NDhjZDRlMDI1Y2JiMDg5NTNlYmY5NmUzY2JkNTlhMDExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NYW5kYXRlL09wZXJhdGlvbk1hbmRhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTM2ODM5NmU2NTBlMDAxNDliM2ZmNGUyNDhiYTJkZGViZjk5YzhjN2QzNGY4YTkwMjM1YjBmYzE5NTdkOGE2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTWFuZGF0ZS9TdGF0dXNBY3RpdmUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNDg4YmExZGEwYjQ3ZGQ5YjJhYzRjOTMwY2ZiNmVjOTBjYWIzYWJkNTYzMmE1OGFlNWYwZTIyODk0MzMxZjY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NYW5kYXRlL1N0YXR1c0F1dGhvcml0eUNvbmZpcm1lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNhZjc1MjAwNjI5NDViYjQ2ZGJkYTU0MzEwOTNhZDkwNzFmOGQ4Mzg3MjZkMzgwNjBkY2UzMTMzMTliNzE1NDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL01hbmRhdGUvU3RhdHVzVGVybWluYXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0YjMwNDE1NGEwMmE5ZDBlODdjYzU4ZDA1MDI2YTg2ZWJlMmI0ZDdiMGY2OWNmZGQzYWJmMWQ5Y2Q3ZjMyNjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvQWRkaW5nUGFydGljaXBhbnRSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NDJjMDRkMjViMjliOGNlMTIyNTVhNzc4NzNmNzM2Y2EwNTExMzQ2ODFkOTFlZGNkZTM5YjRiMTNkMzg1YmNjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0FkZGluZ1BhcnRpY2lwYW50UmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDJiMDJiYjA0MWIwYWNkMDNkM2MyN2Q2YmNkZDhhZGNiZWU1NGNiM2M5ZGEzYzlhMjBhMzhjZTdmMWYyOWE4MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9BZ2VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdmMjU5ZTA1NDM3N2YzZDIxNTg0Y2I4YThiYjAwNGU3NzU1ZWE1ZjExYTY2OGU2ODA1YWNlYWY0NWY2NGEwNzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvQWxsUGFydGljaXBhbnRzUmVhZHkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NWNjNDVmODU2ODIzNzBhZjI1YTdhNTYyNzEzMjY0MzE2ZWM0OWQ3ZmIxYzUxNmUxZTE1M2I1NTY3ODYzZmI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL0Jvb3RzdHJhcEZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMywKICAgICAgICAgICAgICAic2hhMjU2IjogImQxOGU4ZGVkNmI3NjJjODBmM2VmNmU2YWIxYzZkZGQxMjhjMmVlOWQ4ZjZkZGFlOWU4MWQ5ZTc4OGZkZWUyNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvQ2FsbE9wZXJhdGlvbkFjY2VwdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGU3MTMzNGY2ZjcxZTY2NGZiNTkyZDJmZGY2YmRmNzljZWE0NzRmNGU0Y2JlNWM2ZDExMDg1NjA5MmFkMjk0MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9DYWxsT3BlcmF0aW9uRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2NhMzFlMzhlMmRlOTc3ODMzYjM5YTYyODEyMmU4Nzg3NTZmNTNjYWI0OGNiOTc3N2U4NDhiMDg4YmZkNGRiNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9DYWxsT3BlcmF0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzAxM2QzMGMxNDdkMjE1MGI2ODFiNmU5OWZjMjA5YzViYTNkZjIwYWM3ZTMyYzUwMGU0NDlmYjZkZGU1ZWU3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9DYWxsT3BlcmF0aW9uUmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTYzNTBhOGZkOTU0ZmUwMjcyY2ZjZWNmOWQzM2YwMTA3NTUxYWQxMjNkNDZiNzI3NzYyYTFjNzAxNjIwNjA5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9Eb2N1bWVudEluaXRpYWxTbmFwc2hvdFJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiZmQyYmRmZWYyMmQ1OWJiMjA3MmQzNDkwMmIyNGQ3MzdjNDQ0MWFjNWY3YzU4MGY2YWUzZmEzZTI0Njg0ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvRG9jdW1lbnRJbml0aWFsU25hcHNob3RSZXNvbHZlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3MWZjMDYwMzkxY2E2NjY2NDVlMTE1NWYxMWYwMGM0NzQ5N2U1ZGQ5Y2VlMmRkODA0ZTE0OGRjMjgyOTQyYjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvRG9jdW1lbnRJbml0aWFsU25hcHNob3RVbnJlc29sdmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTg5NzI0MTU4YjYxNTk3YTA4MTJkM2FkMDRmNmJiMzYyN2JmNTVmZThhYmU0Yzk2Njg0N2YzMmFjODgyNzI3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9Eb2N1bWVudFNlc3Npb25Cb290c3RyYXAuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDIwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyODcyMzdlNzc4YTRjMjkxZjgzNmYzNDQyZmIyMmZhNmJiNmEwNTVmNGFlZjZjMmQ4MGVkYzAzZGRkY2QyZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTExNQWdlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYzk5NmQyYmUyMGRhMzcwZjhkMjdmNjlmYjA0YWU3MDdhYjBmMGNiMjk0OTRmOGE5YzFjZDBjZWNiYjNkYzJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NBZG1pbkFjdG9yLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE1MmVhOWI0NDY4ZjFlNTlkYzg0MTBiODBiNjJhY2U0ZGEwYWU5MmU0MTcyYTQ4ZmU1Mjg3NTJkOTM3ZjEyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TQWRtaW5CYXNlLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNGI0ZTQzODVjZTg4NjI3NTU3NWQ1MjA1ODkyNjIxNDRkZjM5ZTAzZmQwNjFmOGE1MjFmMGE0YWI2YTY5NTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0FnZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU2MWNmN2IyYjEzZmM1ZjIwZjJiNTdmNDQyN2Q0OGQ1OWMxNmU3NTE3MWU2N2RkMjEyYmRmOGZkYzA1YjQxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TQWdlbnRBY3Rvci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjOGY3ZjRhNmRhNmNlYWViN2Y0ODVjODJlNGMzNDI5ZTk5N2YyYTcxN2MyZjFiOGVjNGZjZTVmODAyZjg5ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0FnZW50Q2hhbm5lbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjM2YzZDIzYzVjNzk3MjMxZjMzMzg3ZTgzZjA0ZGM1Yzg3YmI3YWI2NzMxZGZlOTYyNTRiNjAyNDE2MTk2Y2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0FnZW50RXZlbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNGVmZjI0ZTc2NDg5OWU3MjkxZDUwNjQxODgwNjM4MDI3MGFkZTU5OWRkZTQ1YmZiMTViYjcyNjIyNmJkOGQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NCYWxhbmNlQWNjb3VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNzlkMTQ4ZWM4YTlhYjIzNWQ2NTllMzZmOTUyMDc5NjU0YjQ1NjY5OWVhNDE1NzllZTg4YmNhOTY5MWUxNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0RvY3VtZW50Qm9vdHN0cmFwTWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4OGVlZDk5NWJhYjhkYzYyYTFhYTExNDAwYWZjODMzN2M3NWIwZmQ0YzU5NjUzYzBiNGM2MTk3YTZmMzVkZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0RvY3VtZW50T3BlcmF0aW9uTWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRjNGQ0Y2UyNmJkNDRlMWQyMzgxZDFlMWI2NzljYWFmYzY1ZmNmYzE2NWViNmJhMDU0MTI1YTcxNmEzMjA4MGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU0RvY3VtZW50U2Vzc2lvblJlZmVyZW5jZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjZDU5NWE1MmYzMzQwMGUyY2IyYThhMTdiZGJmZjMwZDY2ZDY4YTE1MzEwMDEwNWFhOGYyZjc4NzQ4MGYzMzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU09wZXJhdGlvbkNhbGxSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE5Y2QzMGUxMzk5NGEzOGRiZTEwNDY4MGJmOTQxN2IxNTE0ZDQzYmY4NzFmYmY3NGEzZWFiNzE2Mjg1OTQ1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TUGFydGljaXBhbnRzT3JjaGVzdHJhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWFiMTEwOGU4NDBhMzgwYzczNmJmZGEzNjRlZmViNDYzNDJlMDc2NzE3OGViNjZkODNjYzZmNDYxZDBkOTYxZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TU2Vzc2lvbkludGVyYWN0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTFiMjYyODIyMDA2OTY5MzE2MWFiZDE4OWUwYzUwM2ZiZjg3ODVkODkzOWNjNTMzMmFjMmE5NmVkNWVkNGVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uRW5kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYxY2RjN2U0MDE1YmJjN2E2NDQyYWI1MTA3NThjNjhkOWUyM2VjMWM2YmViMmUyMmVjOTFmMjg4MjE4Y2YxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TU2Vzc2lvblN1YnNjcmlwdGlvbkZpbHRlci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODYzN2M5NDY4YzA2Y2EwZWRhMTdiNmM4ZDEwNmEyMzJkZGM5MDExOWZhNWY0Y2ZkOTJmMGIzY2I1MjM1YzljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uTWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTI5NDA2MDRkMTg1M2RhZDkxNDZmNmJkZTVmMjMzNzZjODg1MTQxMWEwNDcwZGVkYTBjZjFiNzljYTJmZTI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NTZXNzaW9uU3Vic2NyaXB0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzYjAwMTBjMzgzMDI3Mjg4MDQ2ODE5NGE4ZmEyYjhiMDAyMWNhNzhlY2Y0MWI5OGFiNjg1NTQ3OTA5NGFiZGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1Nlc3Npb25TdWJzY3JpcHRpb25TdGFydGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NhMjZjZTA1ZDI1NjE3ZmU1M2FmZTY5OGIwOWQ2OTVmOTNlMzc3NmJhNWFjOTAzM2Y0ZWMwOTE3YTJjODUyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9NeU9TU2Vzc2lvblN1YnNjcmlwdGlvblVwZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYmUzNDE2ZjE5MWFhMzFhMGQ5MTI0YzBlMGM5YWViMzY0YTVkYmI4MTMyNGJiMjliMzUxMDkxYWEzNjAzMDNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL015T1NUaW1lbGluZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkNDA1NjAyMjg4ZThhYWI2OGM1MmE5MjViMTFlYzA3NGEwN2VkZThjY2M0OWFiZTcwNGQ1N2QzNjAwY2MwZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1RpbWVsaW5lQ2hhbm5lbC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0NGFiOTIwODI2Mzg4ZDY3NzIyM2M5OWI2MmU0YmU1MzUxZDA1NGIwODlhOWM5NTk4OGZjNWU4NjhkNTRiMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvTXlPU1VzZXIuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjcyZTFlMDBiMzczNTZiMjMzM2RkMTU2MjlkOWUxNWUxZDZhMjMyODMwOTVhNWI1NGFkY2RmMzEyMDIzMTM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BhcnRpY2lwYW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzFkYjc0NmMzNjU4ZDdmYjNhYTZkNjhiOWU3ZTdiOTk1M2FlMDllZWUxODFiMjg2OGM5YmJlZDMzMzg3ZTkxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9QYXJ0aWNpcGFudEFjdGl2YXRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxODAzNWI4NGI5ZWI3M2IwZTAzNDgzM2Q0NjI5NGQ1NGVmMzBjYzA2MTc1ODJmZmNkYTdlZGE1ZmUzYzhkNjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGFydGljaXBhbnRBY3RpdmF0aW9uU3RhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTBhNWU1MTZlZGM2MTdiMGI4ZmZlNzMyNDZhZGIxMmRiYzgyOTA3Njc5N2ViYWY5NWUzYjQyYWIzMWIyZGMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BhcnRpY2lwYW50UmVzb2x2ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNWJiYTliNDQ0YTljMzBlYmY4M2I1MzVjNjYwY2YyMjg3MjVhOTIxMjE5YTQzYjM2ZjJhODdhOTRjMjE0MDRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BheW1lbnRJbml0aWF0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjBlMDY5MDYwZWQzODMzN2RmYjQ3MmFjNGM5NjhhZWZkM2ExODlmYTgwZjA2Nzc4YTgwYThlODNiODY3MjI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BheW1lbnRJbml0aWF0aW9uQWNjZXB0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYTAxODU2ZTRjODhhMGQ5NzFjODVmMTM3OWM5MDQwNGM5ZDdkNDRhMDRjNDQ0ZjA0ZjgwMzNhYzk2ZGE3NDUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BheW1lbnRJbml0aWF0aW9uUmVqZWN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmM1YzNiNDI0ZThhMTg3MzEzNzIwNWZiNWFmMzQwYjM1MmYwNTllZjFjMGU1ZWUxN2QwOWQ0NjY1YjYyODhkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1BheW1lbnRJbml0aWF0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM4M2M3MjhkYjM4M2NiZGNjY2E1ZmU5NTA0N2E2NWI0ZTc2YTBjZjY2MzVmOTlkOWVjZTA4ZTcwODNiMTY1NDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUGF5bWVudFRhcmdldFByZXBhcmF0aW9uRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjYyYzhlYjgzZDMwYzQyZDJjMGY2ZGE3MWJiNzc1YmQ0MTliODE1MmFmMGM2YWU1MWMzZWY0ZjgzNTFhNGNlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9QYXltZW50VGFyZ2V0UHJlcGFyYXRpb25SZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2Y1ZWUzYTg0NDVhNmI5MmZmYmQyYzY5MjgyNGU2NmEwY2FhMjg0YzdkNDg3NTEyNWM2MjI3NDUyZWMxODgzZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9QYXltZW50VGFyZ2V0UHJlcGFyZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDVkYTZhODdiZGUzODliMTM1NGFlNGMzZjMxYzZjMjQ0NjBlY2Q4YzRmMGE2ZGQxNDE3OWQ0ZTg3OTA5YWQ3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9QcmluY2lwYWxBY3Rvci5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZhZmFlOTQxNmQwNzVjZmY4NTRhYjYwZDA1NzhmNjRmN2QzMDhiZTRhZWZiNTFhZDFhMTEwZGU5NzYwMjRiMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUmVtb3ZpbmdQYXJ0aWNpcGFudFJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJkMjFjNWEwMDBiZThjNGVlZDAxOGMxODFmYzFmOGJjYjVjOGFkNWY5NTNkZDdjZGJkM2U5NWRkYjBjNTBhOGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvUmVtb3ZpbmdQYXJ0aWNpcGFudFJlc3BvbmRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM2ODIzMzA4ODRhOGJhOWU4YjUxMTdmMWYxMTRlZTM2Nzc1ODkxMGU2MjlhNGIzNjVhYTZmYmU3MWI4NjJlMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvU2VhcmNoQ29udHJhY3QuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjdmYTgyMzU4YjJiODJkNjdlZjk0N2FhMmIzMTUwMzliYjY0YzA5ZmIwYTQwYjc4ZGQ4YWFmNDRjYjAzZTFiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9TZXNzaW9uRXBvY2hBZHZhbmNlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyZDhjMjQxMzYzM2YxZmQwMTkxMzA5Yzg5YWI0YTYyZDY0YTE2ODRjMDc4ZjBmYWU4NmIxMjhlZWJkY2M4NGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvU3Vic2NyaWJldG9TZXNzaW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGY4ZDM3ZTRhNTJiNjdjMjAzZjljMzA1NWFmYmRmMWFlMzVhMjFiMTRiOTI1ODI2NjljYzA2ZWEzNjA2MmIwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvTXlPUy9TdWJzY3JpcHRpb25VcGRhdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NTI1ZWY3ZjExODFiZmJkYzM1ZjdmMTE4MWEyMzBmNDI5ZmNkZTU4YTI5N2M0ZDNjMDc3Y2Y2ZDU3ZTRjYTczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9NeU9TL1N1YnNjcmlwdGlvbnRvU2Vzc2lvbkZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkYzc4NTJhMGU5YmI0Mzg3N2NmYzJkZTFjNjU1ZTY2M2E0ODEzODZiMzZiMDY2YmRkZDNmZGE0MTk1MmQwNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvU3Vic2NyaXB0aW9udG9TZXNzaW9uSW5pdGlhdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5NmI5YzMyYTMwNTViODhhZTg4ZjNmZjlhNzIyMDRiMjU0YzcwZTI3NDY3OWU5ZjRkZWNhZWVhOTJiZTE1OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvU3Vic2NyaXB0aW9udG9TZXNzaW9uUmV2b2tlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0ZDBiYmNhNDJmMWRhMTAwMGY0MmZiZjk2ZTQ3YTBmNTllOTJiZWY3Njk1NTVmZTVmYzBkNTE5NzUzYzE0YWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL015T1MvVGFyZ2V0RG9jdW1lbnRTZXNzaW9uU3RhcnRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhNjk5NDQ0MDhjYjA1ZjVhNmIyMWJjODlkNjc2MzZlNTg4MWFiZWE0MTcxMjllOGNjYWU2MjZhZjUyZGRmNDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FuY2VsQmVmb3JlQ29tcGxldGlvblJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwNzZmZmUxNTQ1Yjc0NDRiN2FlYzk2MTgwYzVlNGJmYzU5MGEzOWJiMzZlYWNlODBmNWQ0MTU2MDY3YjM5MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FwdHVyZURlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmVhYmUxNjA2ZTUxMDc5OTU4YzMyOTgxNGQ2Y2YxZDFiOThhODg4ZDQ2MGMwZGNlOGYxYTA3OWMzNWZiNDBkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXB0dXJlRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA2NDNiMzVlNmJmZmJkZjI4YWMxMDJlNmY2NWMyYTk2YzFhZDkxY2I2MDI5MGFjMDNjMDk5Y2ZjZjNmYWZkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXB0dXJlRnVuZHNSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYzhiMzYxYmMxYzViMTZkMzAxNjJiM2E3YTdlNzZhNDAxODllOGY4YzI3M2FlYmNjZmM1YmQ4OGExOWJkZjNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRDaGFyZ2VDb21wbGV0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMjY2YjdkZWMwNzM4MTYwNTU4ZjdjMDM2YWVlNDg2ZGU3YzA5MWQyYzQ5ZGI2NGIzYTE3YzBiOTUzZmZlYWI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRDaGFyZ2VSZXNwb25kZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTY1YWVlNWM0NmQ3MTJlZjY3NjJhOTU4YzM1NzIxNWFlZGFmMDUzMTgyMjc0NzExZTQwNGFiZDg1M2M4Yzk4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvbkNhcHR1cmVMb2NrQ2hhbmdlRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE5ODgyNWQzNDdiMmFmYTc4ZjcxZDJhY2Y0ZTNjMzY3YTNhYTBkYzkwNWY0N2Q4NTk4OWYwOGUxMDRhNWJkZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25DYXB0dXJlTG9ja1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI4ZTlkMjFkZmE4OTg1ZGUzZWIzMzA3MDk1NTk2OGU1YWJhNGU4YWFhNjdkMjQ3ZTZlMzYyZDhkMmQ1ODRmYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZUxvY2tlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3YjgxZWU0ZjNlODM5ZGY2M2Q5NzU2ZGYxNWY2NTEwNTA2YTNlYjA3MGY5Y2M2NjdjNjhhMTcyNjZiMDYyZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZVVubG9ja1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwZTI0MTYzNWJiNDhkMGU0YjE1NGEzNjRmZmE5NGQzMTEyNjRhZWU3NTM2MTQxOWE4NmFhOWViZjIyYTQ1OTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uQ2FwdHVyZVVubG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmZhODJkZWMzNjMyMDNmOWMwODBkOWRlOTRkMGFkNjYxMWUwNDFmMTJjZmM4ZDA0OTliMzc5NDllYTM4MmU3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25EZXRhaWxzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhmYWNiNDBlNTc4MDUzMDZiZTY0ZDAzNzRlZWU1NmE3ZDY2Mzc2MzQ4NWFkNzdhZTE0YWUyZjE1MGEwMzI3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25Nb25pdG9yaW5nUmVxdWVzdFJlamVjdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWIwMDg5OTkxMWVlMjE4NmE1ZDlmM2RjNmVkZmIxNTE0MjkxYmM0NmEyNGQyOGFlOTA5ZjMzMjkzM2M5YTliNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9DYXJkVHJhbnNhY3Rpb25Nb25pdG9yaW5nU3RhcnRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyYzJhMTRiMjA5ZGIyYzExMDhhODY0OTcxM2U4MjZhMzBmOGNjMzg0YzliMmU3MmQ0NjQ1MGRjZDQ3MDExMjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ2FyZFRyYW5zYWN0aW9uTW9uaXRvcmluZ1N0b3BwZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNzdiN2MxZmQzMjE1N2JjZWRlMDMwYTU1NGU5ZTM2NGE0OGU3MGZlZTY3YjAyNjFjZTYwMzNjYzlkNzcxMzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvblBheU5vdGUuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZGVkODFlOTIxNzkwNzZmNjUxZmQwOTQ3OTgyMzgyNDViNjUzNTk0ZWQ1ZWI2NWY0Mzk1ZjQ0YzNhNWNjMmRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NhcmRUcmFuc2FjdGlvblJlcG9ydC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjFlYzA2ZWU4ZTE2NDdjNzk2Y2NmNzFlMjdlYmMyNWQyOWQ3MTMwYTJkYWI5NDZjZGEzZDAzYzRkY2U4ZDJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NoaWxkUGF5Tm90ZUlzc3VhbmNlRGVjbGluZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzNjNTNkY2I5MTMzNmY3NGJmMDlmYjc1OWE0ZDljM2M4OGRmMGJjODIzYjRlYmU1ZWI4NGU2NDMzOWJkMGQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0NoaWxkUGF5Tm90ZUlzc3VlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5NGY2MjRmYmIzNTQ5NWI0NDE0OTY0NWUxNGMwNTEzNTkyOWJhYzk2NTAyZGRjM2I4ODUwZjE4ZmRlNjllY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvQ29tcGxldGVQYXltZW50UmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjhmMDE1Yzc2Mjk0NDc4MzhhY2FiMGYwYTc3NmYyYTNjNzMwOGY1MDljZDJmMjE2MTIzMGQ3MjA5YzZkNTVhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GaW5hbEFtb3VudFJlc29sdXRpb25SZWplY3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAzMDc0MDZhMDQ5YjE3NzZkZDIwYjZhOTgyZjRlNmFiOWRmYzQ4ZDdiMWUyZDAwZDIwYWQzNTQ0NzU4N2UyZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvRmluYWxBbW91bnRSZXNvbHV0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTljNDA3MzQ3Yzk2OWQwM2MyYTkxNTEwOTg1ZjBhNmM3YWMwYmY2OWNmODNiODM4ZDBiMDU0NTJhMzhkMTcyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GaW5hbEFtb3VudFJlc29sdmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzQ4YmYyZmNiM2M5ZTgxMGZkZGRhZmNlN2QyN2ZlNzU2NjdjY2IzZmI3ODUzYmEzMDhhODVlZjJmNWMxOTYyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GdW5kc0NhcHR1cmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGVhNDU3YTIwNGNjYWU5Y2M0MjEzZWFlNjI0ZTIyYWU5YjYxMTE1NjAwNzJjMzBiNTBlN2Q2NTI2OGVmNzhhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GdW5kc1Jlc2VydmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWM1YjlkNTJhNGI3OTFmNjYxOGU4MTc2Y2UxY2JiYzYwNjUwMTZiNzRlODJmMGNjZTFjYzJiYzFlMDg0ZmI2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9GdW5kc1NlY3VyZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZTlhMDk1YTIyNzhjYWYzM2M0OWIwYWYwOWYzNTU5Y2JkY2E5ZmU1M2Q3NWMzNWY5ZDRkZmE5OTJlNDlkYWZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0Z1bmRzU2VjdXJpbmdEZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiNWIxNGE0NzYxODg1MTIwMmQ2OTAxNGZmN2UyOTUwOTg3YzU0NGEyM2RkN2Q2MzkwMWVmNzA3MTlmNTlkZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvRnVuZHNTZWN1cmluZ0ZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFmMDFhZjBjOGE2ODg2N2JmMmIwNWJjNmViMjRhYjVlZTRhNDU3NDJhM2VmMWUwNzg5OGE5ZTk1NTFiMWViMTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvSXNzdWVDaGlsZFBheU5vdGVSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmRhNmM5YzNhNjI1YTc0YWM4NWM4OTA2ZDdjNDhlYmZhZWFjNWYyYmNmMGM0MTVhM2JjY2MwODVlYjMxOGFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0xpbmtlZENhcmRDaGFyZ2VSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDU3YzZhYmQwNTk4YzA3NTFhN2E5YTg4NmExODY1YTM4M2RjZTM5ZDg1OTMwMGE1ZjQwZjI2YTAwODUyOWZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0xpbmtlZENhcmRDaGFyZ2VhbmRDYXB0dXJlSW1tZWRpYXRlbHlSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzIzNTM3ODI4NGE3NzhhZjJmMGNmM2IxZmZkZWQyMGQzZWY0ZTcxZjhjYzZjZGM3OTNjYjc4NzU4MTg2NjczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL0xpbmtlZFBheU5vdGVTdGFydEZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA0M2FiOGFjYTY2ODE5YzgxY2UyYTU2NGYwMjM0NjIxMmY0ZGRkMDNlNWNmYzUzYzZmNDFmMTY2YTRmODU5YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvTGlua2VkUGF5Tm90ZVN0YXJ0UmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmYyYjRlZTk5N2FjMGM5YTZlOGViMWE0ZTQyZDRlMzY1ZjI1YTU1NmNkMTA0OWE4NmI2YmUyZmIzZjE2ZDY2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9MaW5rZWRQYXlOb3RlU3RhcnRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwMzRkMGI3ZDRhYTE0OTNhNzljMmNiZmJkNmU4Y2Q1ZmFkMzE4NWNlNDc4NzkwZDkyNzE3NDg2NzMzMTZmMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvTWVyY2hhbnRUb0N1c3RvbWVyUGF5Tm90ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5NDE4OTkyMmQxMzc1MmNiNWYwN2M2NWVkNWM3MzFhZjE1MDIyYWEzMjE4ZWYyNTgxNmM4ZDEyNjU5MWMwNjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NTU0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImU4YjVkYzY5NDM3MTczNzkzOTljNDUzYWM1YzFmZmIzOTQwYjFlYzBhNWE3ZjlkMTg0NjZhNmRlZWRhNzgxZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZUFjY2VwdGFuY2VSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhY2RhZmY0OGYyZjc1OGU3ZjdlOTdlMjI3ODY5N2RkNWZkMWY3Mjk3NjYwODE4Yjg0MWZlMjgyOWY0YzE4YmQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVBY2NlcHRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImNjNWRiMThkYTU2YmFjZTQxZTZkM2JiMzhlMWVkZjUxZmIwYmNkMGJlMTE4NDRmMDVmMGQxNDY4Mjk5MTNlMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZUFjY2VwdGVkQnlDbGllbnQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZGEyZDJkY2JkNDI4YTUzYTYzNjE3YTY0ODNhZDczYzVmZTUxYTFhYzY0Y2E2OGFkYjAyNmI5OTExOGQ4YjFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVBcHByb3ZlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmMmFkNjE3NDkzZTQzMmExZTY4MDJjN2MxNjY3Y2RmNGZiZjNiMzMzM2E0NWFhZjM4YWU4NzczNmMwN2IyY2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZUNhbmNlbGxhdGlvblJlamVjdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWJmOWQzZjQ0YzExYjE0NjViYzRiNzEwMzU2YzczNjM4MzVlZDQyMGIyNDBhZTFhNDZlNTI2Y2E2MWY2MDczYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlQ2FuY2VsbGF0aW9uUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzRhYTZiMDg3MTBlNTFjYjhkYmUxYjE1NjQzMTFlNmU1ZmM4ZTc3YTdlZWVhOWJjMDNjMmI0NjY1MTIwODMzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlQ2FuY2VsbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDJkMGZlOWExOTY5NGRkMWVmNDE3OTE0ZGZkNTFkNDIyMGE2ZDQxOWZmNzA2YzJlZTI3OWQyNTgyNjk1OTJjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlQ2xpZW50RGVjaXNpb25EaXNjYXJkZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDI3OTM3ZGE0MjllMWExY2I5NzNiMTFjOGQ5OWY0NDIzYjU0ZDZlMGJiYjZhYjViZTExOThhOTAwYmZkMWU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVEZWxpdmVyeS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMjkxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwZWE2ZmIxNzc1YTE3NWZlNzY3YzRlMjQ4MjBmMzJiNTU5OWNmMDY4MTAwMTQwZjdjNzVmMmRlMjZlNzExODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5Tm90ZURlbGl2ZXJ5RmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNmMDdmOTQ2YzIyMGYyN2UwODg0MzVlNmYxYmI5NTFjYThiN2U2YzMxNmMzMjhiYTY4M2QxOTI0ZDExMzNmZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXlOb3RlUmVqZWN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDU0YWM2MGU4YzQwZGJhZDcwNDIxOWNlODdjZjYzNjY3Y2FhZDJkM2E3YjJkZDdmNGM4NDk1Y2YxODI0MDQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheU5vdGVSZWplY3RlZEJ5Q2xpZW50Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTBjNmMzNjE1NDllZjM1M2M0ZDdiZGI4YjQzMjAyNjNhM2FiZGRjZWFhYjA2YTk3NGY2MTUzZDA3MjJlMmQxNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXllZUFzc2lnbm1lbnRDb25maXJtZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmODMyOTIxN2ZjMzhlOGMxNzNjOTFhOWQ2NGU5M2Q5ZGJjNTA1ZDM3MjU0MzdjZmM5YmQxNmVmODk2MDI1ZDJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheWVlQXNzaWdubWVudFJlamVjdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNlN2NkYTI5YmQ0MTU0NWMyMDc2YWY5NzhmNzNmODkzZGE0YjI5MjZmZjZlMzk3ZjU3NjcyMDlmZGFhOGNkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXllZUFzc2lnbm1lbnRSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMmQ0ZTRmNmNmOTM2ODgzMzYzNjEyN2FmMjg0MDU2ZGZkMDMyM2E2YmNkMWExMDA3OTg2M2VlYWU3MWVlYjFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDYW5jZWxsYXRpb25EZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllNTRlYjczNTZhODNkNDRmM2NjNmFlOTI5Yzk4NGM1YzY4ZjAxMDU2NDI0YmNhZmMwMWMwYzFiNGI0ZjYzOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENhbmNlbGxhdGlvbkZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmYzJlNzY2YWIyZDg5NDk5OGYxZjU1N2NlNGYwNDViYjljMGU3ZDZiNTczMDY5YjJiODIxYmVhYmFlZGMwNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENhbmNlbGxlZEJlZm9yZUNvbXBsZXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NzI0ZThhMjRmZDI0Mjk3ZGViMjg5ZDE4NWIyMDM1MDY5MDcxYzk1YTk3ODA3OGRhOTljNTYyYjE0ZjcwMTA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2QzOWRjNjU4M2ZiNTc2ZGQ2MzYwZDE2ZjVlMzdhNjk2YTI2NGZiM2ZhYTQ5NzdhYmYzODUyNzczOGI3YjI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0aW9uRGVjbGluZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTk1OTVkNzE4ZDY0YzNkZmUzNjFlMzg0NzZkNzE3ZDU4YjQ0MjA5ZjcwMGY2NTk0YmZmNGE0OWE0MDk0MDcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0aW9uRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQ2MDNmMzZlN2FhMjYzNWFlMTBkZGUwNTE3Mjk4YWJjNzVhNzRhYjBhYmU4ZmJiMmU5NGI1ZjdmOWZiNjRjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50Q29tcGxldGlvbkxvY2tDaGFuZ2VGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYWY0ODU4OTE2YzdlNGRjNjA0ODBhNGE1NDM5NmQ2MTQ1OWRlMGYwNjgwYWEzNDk2NDgxYzUxYzk3NmQ0ZGE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0aW9uTG9ja1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhZjc2M2JjYWJkMzhlZWZjNDFlODdiZTNjZTc5MDAyYzQ5YjBiODEwZGE5NTk2YmVjY2Y1MjBlNmJlNGNkMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudENvbXBsZXRpb25Mb2NrZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzFkZTNhYjMwNTQzM2FhNmViYjBlYmI5NjQ1MDIzNWMyNGJmNmU3NTMzZjhkODI4N2E5YmJkNzg3NGQ3MDIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRDb21wbGV0aW9uVW5sb2NrUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWRmYjk5ZDgwYjc1MTAzZmYyNWEwMTM2MTg3NjBhOGM0MTlmOTEyYTk0MjU4YmIwZDJjZDFhM2E0MTcxZjM0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50Q29tcGxldGlvblVubG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzA2ZTk0NTU3NzgxMGM5YmQ2Y2U3NDEzN2MyZTA0YWQ1OGE1OTM1MWVjZWM0YmEwMGJmODNkODY0OTM4ZGZmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50TWFuZGF0ZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTc4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk4OGEyMmIwNDQyZGI4OTZjYTlhYzc1YTM3N2ViYzM1MmM4NmI3NjJlNDYyNTBhN2Q4YzU4ODVmOTEyYjljYmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudE1hbmRhdGVBdHRhY2hlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwOTg4NjQwMmU3OTNjNDUzMWFkYTc0MDY5NGE2NjEwYjgzYzZmY2E1OGI0NDdjZjJiZmRiZDRmNWFhY2JmNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudE1hbmRhdGVBdHRhY2htZW50RmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjVkZDY1NTM1ZTMwNzI1MDJmYzkyNjZjOTU1MDMxMmQ1NGI2NjYxYTZhMzc0YjU1MGZiMWU5MTBmMzZhZGRhNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kQXV0aG9yaXphdGlvblJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3M2U3ZWY4NmI3YjVmNThhNWM0ZjZiYzM0OTE0ODEwMGVhM2FiZmRhODRlNDFhZTk4NDViZmY3MGVhMDUyZmFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRNYW5kYXRlU3BlbmRBdXRob3JpemF0aW9uUmVzcG9uZGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxNTQ3NjE2ZWYxOTY4NWM1MDljMjExMTg2YzI5NjRkNDcyOGMyYWFlNjg4ODQxNmVjMzRjYzQ2MDkwNGVhZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudE1hbmRhdGVTcGVuZFNldHRsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTM1YmUxZTMzNGM5MTE0NGNlOGMzZjhkMDA3ODkxYTUzM2Q0NDMwZjdlZmU3MTg1Mjk3Y2Q1ZjZiZWFiOGNlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50TWFuZGF0ZVNwZW5kU2V0dGxlbWVudFJlc3BvbmRlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMGE3YjdkYjg0N2VlODY1ZjJjZjdmNGRjNzllODUyMjRhNDRmMjc2MDViNmExNzUwNzMyMjNhYjBmNzFkOWFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRSZXZlcnNhbERlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjI1YTJiMDE5M2RlMWFkNDRlMzE3OTk2NTg1NTk0N2E3MTAwMGFhYjZlNWU1OTkxMjg4ZjNhZjM4YzZkN2FhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50UmV2ZXJzYWxGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZThlZjMzMWFkN2NjNDAwMGUxMjRmNTQyYjViNDczY2UwNTYwNDFjYTdlOTI5ZTZlMTAzZmE0ZDdiMjc4OTc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRSZXZlcnNhbExvY2tDaGFuZ2VGYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZWIzMTg5OGM3MTg5MDMyYWQ3YmNmZTg2NTJkNDIxNGMzYTgzNDhmNzFhOWI3OTY5Y2JlNjQ2NDE1MzQ5Y2FkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRSZXZlcnNhbExvY2tSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYThmYzhkOGI2NTI1ZDczNGE0Y2M3YmVmZDg2ZWIzNjgyODE1MTdjNTEzZDI1ZDIxYTZmZTI3OWRiNzIzOTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1BheW1lbnRSZXZlcnNhbExvY2tlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4NTNhMzc3NTQ4ZjEyMGNiNGU3ZjMyZjE1MzZlZTBjMTdhODUwMjkzYWVmZDk4MjE5YWUzOTA5YjIxMjJjYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudFJldmVyc2FsVW5sb2NrUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjExODdlZmRjNmM4ZmNkOTk4NTA3Y2EzYzljYTRkMTVmNzEwYTBmMzdkNmVhNjYzOTI4ZDk2OWNkMjEyODBhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9QYXltZW50UmV2ZXJzYWxVbmxvY2tlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhMGRmZmE0YTg3ZTZkMWI5ZmRkOTRjNjczMmU0NTdjNjdlN2MyY2RmMzUzMjY0MGVmMDNhMWJmMzVkYWRkNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUGF5bWVudFJldmVyc2VkQWZ0ZXJDb21wbGV0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmVmZTlkMjlmODliYTcxZTBkZTA0MzQ4MWFiNzViMzYyZTliZWIyNzRmNzM2MTIxMGZjZmIxZDk2ZmEzMGRlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXNlcnZhdGlvbkRlY2xpbmVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTZiZDMwNzYyNGNlYWEwODRjN2M2NTliM2Y4OWRiZTUyMWRhZWE0ZWZiNWM1M2ZmMThhOWFjODZkYjg5YjI0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXNlcnZhdGlvblJlbGVhc2VEZWNsaW5lZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2NjRmNDk3ZmNiOGY3YTVhYTA1OTFmOTM3YjllMjBlM2VlYWU0ZGM2NjViMmE0OGM5ZmQwY2U4MDAyNmQyYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUmVzZXJ2YXRpb25SZWxlYXNlUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWY1ZWQwOTVmZDE4MTFiZDVlYjExNzc2NjVkNjRiNzcwM2M5MjlkODE1NDNkMzBiODlhNGE5MjA0YjllZTk4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXNlcnZhdGlvblJlbGVhc2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUxYjAzYThiNTBiYWI4YThjNGZiODZiMGFkNzVkMzIzODlmNjQ0ZTgwZDM2MmFhNWYzYTQzYTUyYzE4ZTEyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9SZXNlcnZlRnVuZHNSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDU0YzBkMWRlNmM1MGI5ZWQ0MWNjYTY4M2I3YjZkOThmZjgzNDMyY2YyMDNhNjg0YTY2ODcxZWVhNDQ3YmJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1Jlc2VydmVGdW5kc2FuZENhcHR1cmVJbW1lZGlhdGVseVJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhZjRmOWFlZjVhMTJhMDQzYjExNjBlMDdiMTEwNTdlNTVjOTBhNmU4OTdiMWZlMzMyMTU1NjkwMDViMDQ2ZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUmV2ZXJzZUFmdGVyQ29tcGxldGlvblJlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlNzUyYjY1MDE0NThjOWQ3MWUyZWNlOTAwZTc4MzVjMDlhOTY0YzI5NGU4NWZhMjg1MDg2NDNhYTFmN2M2MDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvUmV2ZXJzZUNhcmRDaGFyZ2VSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwY2I2MzA2NjQyMThkMDFhM2Q2YzI1OTRjYWIwMDk5OWNlZTYxODNlZWY3ZDdmMzJlY2RmMzhkMTQwMzQ0ZWUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1JldmVyc2VDYXJkQ2hhcmdlYW5kQ2FwdHVyZUltbWVkaWF0ZWx5UmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTFhZDY1MWNhYzFmODhlMzQ2NTFkODYzMWEwMDUzZjljMjllZjZlMWEyNDMwMWEwMjMxNmRkODM5MjI0OTcyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9TZWN1cmVGdW5kc1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2Mjg4MjIwZjJjMjg0MDhjYjcxMmVjOWMwMjdhZTc5MTE4NTk4ZmRkZTE2YmZlMDUzNmVlYWU5YjI2YWQxMDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvU2V0dGxlbWVudEFtb3VudFJlamVjdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODRhY2Y1YTJjMTI2MjMwYTI3NTZhNGViODczYjM1NTM4ZWU5NmEzYWI0MjNjOTFmYzE4ZDQ0ZDgyNjY3OGFjZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9TZXR0bGVtZW50QW1vdW50U3BlY2lmaWVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDEzMzdkNzQ0M2Y1YTM2ZTlmZjg5OTZhYzNkYWRjODc2NmZiNDcxNDY4YjgzYzMzMzI1ZjhiZjlhZTJkYWUyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9TdGFydENhcmRUcmFuc2FjdGlvbk1vbml0b3JpbmdSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWYxNGJmNzg4MTYwNjVlNjM0ZjBmMTYxMWUyOWY5Njc4YjJhMmRmZDMxMTYyNTMzNDIyMDY5ZDY4ZjhhODA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZUZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg3NmZhMmZmMjM1NDQ0ZTNhZTFmYjJlMGQ2YjRkZThlOWFlN2U5YWUwMDliMWVjZDNjODQ3YWRjZWEzN2E3MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlTG9ja0NoYW5nZUZhaWxlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4ODc0Y2NhYzRiZGM5MDBlZjI3YzZhOTUyNjE4YWVmM2E2Nzk2YjRiYjZkOGYyYmU4NzQzOTM3NzJiYTY0M2MiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlTG9ja1JlcXVlc3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImUzZWJhNjcwYTJiMzA2MTMyMzJmZWY3YmVmNzkxYjdmNDhhMGFmZDU4Mjk0YWVkNzM5ODkxNDc1YmQ0NmE0ODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlTG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjJjZGI4ODNiMDQ2YjM3ODZlZmU0MjUzNDcwMjM1NjYxNWU1Nzk5NTMzZjA3ZDk0OGM4MmVmOTY3ZTM2YTY5YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVSZWplY3RlZC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhkMWEwNGE1OWNkOTE1ZDhjMGJlMTEyZjRlZDVkNDhkOTY3MDY5Nzg2YTlmZDNlODI0NDhhOWEyOGE1N2IzODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1BheU5vdGUvVHJhbnNhY3Rpb25EZXRhaWxzVXBkYXRlUmVxdWVzdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWI4YWM3Mzg2NTk5MDY2YWMxYTA0NTk3MjJjMzNkYzEzZWY1NDNmMWI1YzMzM2ZkMzQxNWJkMjYxOTJmNzAyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVVbmxvY2tSZXF1ZXN0ZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZTNmNTI2OTM0NWJmM2EzOTgxNTRjOWVkOThmMTdkOTNlMmQ4YWVkYmYwNzhiYWI5N2JkNDMwMDA5Y2ViYTE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uRGV0YWlsc1VwZGF0ZVVubG9ja2VkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTUxNDVhOWYwNzI5NTNiYzJhMDVmMDQyMWIwNDc0ZjllYjQ4NmY4NGNjMDg3YzgyMWZlMWM0YTQ0NWY5NjFjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkRldGFpbHNVcGRhdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDNkZTViNzZiZTI2OGZlNjY4Y2JhZjQyOTJlNWQzODIxZGFkOWU1YzQ2YjUwMDcwYWFiMDJiMWNiNTBlY2MxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbklkZW50aWZpY2F0aW9uRmFpbGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmI5OTMzYjdhZDM1MGNiNTY5Y2E5ZGZjM2QwZTljN2JmODRhMWRjYzRjNTIzNzJmNWQxMWU3ODkyODIwYjI5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbklkZW50aWZpZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYjkwZTc5Njk0ZDlkY2ViYmZlMGFlYWEyYTM5ZjI4MjJhYjgyMjU0ZjJhZmJiYjQxNDdlMDA2YzcxYzU4YThhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uSW5pdGlhdGVkLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjhhNTNhNDk4YjVhMzlkNDUxYTVjNmFmMTBhYjYyN2U2OWUwNWQ3N2Y5NjhkOGExZDYzYjViZWE0NzQ1NDk4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvUGF5Tm90ZS9UcmFuc2FjdGlvbkluaXRpYXRpb25GYWlsZWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTQ0ZTQzNThkMjg4NjRlZDIxMWY5MTQxNDAwMmMzNWI2ZDY4YWVjOTc0NjE3OGFmNWE4MTk2MjA4NTNlNTRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9QYXlOb3RlL1RyYW5zYWN0aW9uU3RhdHVzLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmY4MzY5MWZhYTBlYjEwZTA3Zjk5YzIzY2JmMDk2MzA1Y2M1YjlhN2I4MzcwZTIwODg1MTNmZWYwMjJmN2NmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvU2Vzc2lvbkludGVyYWN0aW9uL0RvY3VtZW50U2Vzc2lvblJlZmVyZW5jZS5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTg5YzJmNmZjNWE3MzdkZmJmNTlkZjBiY2YwNjI5ZGE1ZjUzNTVmZDI4YjFjMGY0MDg2MTQ1YmQ0OTE2MjMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvQWNjZXB0Q2hhbmdlT3BlcmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDE5Y2U5ZjJiODdhZGI4YWZhYWU0OWIzMzU4YzBiYjRmMTE5NWExNDMxNWZhNmJkZjhlZGE3MGZkNzU0YzdlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0FjY2VwdENoYW5nZVdvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY0Mzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjk1OGE1MWJlNzVjZTA2NTI5ZDFjMjk5ODQ1ZjVkZjZjOGQyNjk1OGE4N2E4OGE0MDJiMTk2OTRlMmUyMWJkZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0NoYW5nZU9wZXJhdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzMjFkZmFlZmYwNmFlZDFhZDZhZDZmOTBiZjYyZjU2ZjkzNmI0OTQwODM4ZjljZmIwNWEwNzIzYjFlYjkwNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9DaGFuZ2VSZXF1ZXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllMjYwNzhkZTEyMTA3OGE3MTYzZmU4NzllNTBlNGJiNDdlZTY3NjE3MmZjNDgxYWY2MmNjYzZmNTAyYjJiNTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9DaGFuZ2VXb3JrZmxvdy5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MjAwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlNmM2NjdmNmZjZTA4MjAyNDc1NjhkMWZiOGVkYjczNjJkNjM4NDRkMzZiNTAyNzgzYjlhYWUwNjNmMDVlODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9Db250cmFjdHNDaGFuZ2VQb2xpY3kuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjBiMTZmZmNiMjI0MjA1MTJjNThjMjFhYjY2MWRhMTBmYmZlM2IxYTRmOTYyNjQ4YzJiZjE1YmEwMmIyMTdjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0N1c3RvbWVyQ29uc2VudC5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTVkMTlmYzZkZTA1ZDVkNzI1MjEwN2FiMjE4ZTE5NmExNDY5ZTcyOGEwOTAyMDUxODI1YWRjNWU5OTJiZTVmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0RvY3VtZW50U2VjdGlvbi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjMwMDM5NGU0NjlhZDZhNTkwYTkyMTVmOTk3NzYwOGNlYWEwNmMyNzIzYTU1NjM2ODgzYjY0MmU5OWVmOWRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvRG9jdW1lbnRTZWN0aW9uQ2hhbmdlRW50cnkuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBmYmQ3ZGEyYTYzZThjZWI2ZjE5MGJlYmM2YzIxMmUxMDA0NWRkYWYzMGMxYmE2NTZhZGUxMDk3M2Y2NGE4MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL0RvY3VtZW50U2VjdGlvbkNoYW5nZXMuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGMzYTk3ZTNlMDBlNjAxNjc3ZTM5NWU0Mzg2OTdiZTdmOWQxNGM3NjNkODA0Zjk4Y2FiNzQxY2JhMzVkNTJiYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL1Byb3Bvc2VDaGFuZ2VPcGVyYXRpb24uanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzllNzgzNjE0YmM0N2MxMjUxMDRhZTIwNTRjMTRmZTY5NDk4NzMwZjRmZmUxMWZjNTM4MDJjNDQzNDRhNzVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvUHJvcG9zZUNoYW5nZVdvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjNmUwM2ZkNTk1Nzc4Yjk5OGFlYzAwNTUxNjIzODk1ODRhYjg1MmVjMTkyNDM5NzQ3YTgwZjA4ZGM3OTMzN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL2RlZmluaXRpb25zL1dvcmtmbG93cy9Qcm9wb3NlZENoYW5nZUludmFsaWQuanNvbiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxN2MyMDZhYjM1ZGNiNjlhNjM2MThkNDMzMmYwMDFjMGQxYjlhYjYzOTllOTBjNGI3NzliYTZiYjEyYTFkNTIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL21haW4vcmVzb3VyY2VzL2JsdWUvcmVwby9kZWZpbml0aW9ucy9Xb3JrZmxvd3MvUmVqZWN0Q2hhbmdlT3BlcmF0aW9uLmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGM0M2QxYmRiYWJmZDBiMzRiMzFhZGQ1NDZiMWE4ZTBhOTIxMmVjMmMzOWQ3YjIzZmY4MjJmMmE1OTlkYjM1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9tYWluL3Jlc291cmNlcy9ibHVlL3JlcG8vZGVmaW5pdGlvbnMvV29ya2Zsb3dzL1JlamVjdENoYW5nZVdvcmtmbG93Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjExNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyZDk1NWI0NzJhOGE5NTllOGNkN2I5M2UzNmE5YzMyNzg2NWNhNDc2ODdmN2MzYjdlZWM4NmY3MzQ5ZDY3MzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9yZXBvL21hbmlmZXN0Lmpzb24iLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYyMTYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWM0ZDExZjliYTZhZjBlOWI3OTBkYWU2Y2VlYTcwZjNjNmZjNTE3YTRkNmIwMTY2YTgyNTllNDExMTY0Mzk4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9yZXBvL0JsdWVSZXBvc2l0b3J5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MzQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVlOTkxZjdmZWY1NWFkN2IzMGI1OGQ4YTJkZTVmMDlmYmM5ZmEwZDBlMzRjN2UyNTk4ODViNGYzNDkwMjRmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9yZXBvL0Jvb3RzdHJhcFJlcG9zaXRvcnlDb250cmFjdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGM3ZGRjYzI0NGJhMzg5MTBhYmE5ZTY1OGVjZmIzZDYxMzFiMTM1MjZkMmI2YWFjODg5Mjk4ZGMzZDNmZmYzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9yZXBvL0Nvb3JkaW5hdGlvblYyUmVwb3NpdG9yeUNvbnRyYWN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5ODU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWJhOTdhOTlhZDY2YmUyNzVjZTFiNzE3YzgyZWM2MGQ0ZTIwNzcyNjMwODFiZDYwYTk3OTk3YmQxMmZiNGUyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9yZXBvL1JlcG9zaXRvcnlMb2NhbFZlcmlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYWM5NzQxOTcyMTQ3YTkzNzBlM2MxOTZkOGI1NmI2ODAzMzIxOTFjNTgxYjJhYmVlNWVjOGU0YmNmM2Y3ZDQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL3JlcG8vUmVwb3NpdG9yeVR5cGVEaWN0aW9uYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmN2ZiZWQ2MThkNTU0OTBmNmU3NGU5YmJlMzNhMTc2ZTg2MWE4OThiN2ZhMWRhOWRkNDRjN2ZiMjUxMmE0MzdmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9CiAgICAgICAgICBdLAogICAgICAgICAgInNoYTI1NiI6ICI2MDdmNDYwZjI4YWE4ZTAyYjJjNDJmMTdkNmZlY2Y4NjI0YjFlYjU0YzI0NmQ2ZWM4MzI1YTdiMjllMTI2NjcxIgogICAgICAgIH0KICAgICAgfSwKICAgICAgewogICAgICAgICJuYW1lIjogImJsdWUtbGFuZ3VhZ2UtamF2YSIsCiAgICAgICAgInBhdGgiOiAiL1VzZXJzL3Bpb3RyL2RhdGEvYmx1ZS1sYW5ndWFnZS1qYXZhIiwKICAgICAgICAiY29tbWl0IjogImMzZDU4NTYxMjIwZTZkZTZiZTZlMzAyY2IxNjc5OWMxYTFiNTE1OWYiLAogICAgICAgICJleGVjdXRpb25TdXJmYWNlTWFuaWZlc3QiOiB7CiAgICAgICAgICAiYWxnb3JpdGhtIjogIlNIQS0yNTYiLAogICAgICAgICAgImluY2x1ZGVNb2RlIjogdHJ1ZSwKICAgICAgICAgICJmaWxlcyI6IDE0NzMsCiAgICAgICAgICAiZW50cmllcyI6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5jei50b21sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2NzE3ZjlhOWUzOGRmMGRlYTRiNWVlZWM1YTAyNjRjMDQ5MDg1NmVmNGMyNjFjMDUzYTA2ODgzYmEzZTY5ZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICIuZ2l0aHViL3NjcmlwdHMvcHJlcGFyZS1yYy1yZWxlYXNlLmpzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZmE2OTI5MmUyNzk3OWE2NWVmNWI2NTY5ZjU1MDRiNzAxYWRhNDdjMTg5ODIzYWQyMmU2ZTM1YWEwYTJmOTk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiLmdpdGh1Yi9zY3JpcHRzL3ZlcmlmeS1yZWxlYXNlLXJlYWRpbmVzcy5qcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDI4MjM4YmU1ZTY5ZmIzZWNkYjkwNTY4MTM0N2NlYTA1MWJiZGM4ZGI5NWY3ZmFmZDVmN2FkNTQ2ZDZiNTAxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogIi5naXRodWIvc2NyaXB0cy92ZXJpZnktcmVsZWFzZS1yZWFkaW5lc3MudGVzdC5qcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTdiMjA2MGVlMTc3NzY2NzQ0M2MyMjAxMzYyNjUyNmI4ZjlmMTA5MzIxNmYxMzUwZDEzZmU0ZjUxNDEwYjU3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2UvYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0NTljY2M5YThiZGExYzU3YTY1OTNiOWEyMTY0NTY0OWNhZWVmYmFhYjUyMmM4ZTY4OGQ2MjFiNjc3OTBiNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbmZvcm1hbmNlRmFpbHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTJmNGMxZDM5MWY5ZThmNDhmYzZhYWViYjM0NTU3Y2I5NTJhYTEwNTQwMWFmMjE4Mjg5YjJkMDdkMWM3NDE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZUZpeHR1cmVFeGVjdXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDExNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwZGMzNzIzZjYyNmUzMjIxMWUwYjVlODZmZDc5ZTIyYjdmYjFlYmYwODM3N2YyYjRhZTQxMzNiODhjNjdmYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbmZvcm1hbmNlRml4dHVyZVBhY2thZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJjODFlZWJmMmUzNzVhNzFhMjUyMWIwYmViYTJhMDE4ODMxNGFhOTFiYjY3MDVlNTAwMTFjZGZiMDdlYzA1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VGaXh0dXJlUHJpbWl0aXZlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMDQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE1NzVkNTNlZGMxNmI5NzFkZDkyM2Q3MTI5ZTlhYTYxNWE0MzY0M2NhMGFiN2VlNmUxNDU1ZjRkMzY3M2M3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VGaXh0dXJlU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2FlYTI5MjdkNDAxZTYyZTk2Y2Q0YjQ4Y2FkNjU2ZGJiODc4ZmNkNmNlM2U2YjYzMTExYzZjNzQxNGZmYjA5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VGaXh0dXJlVHJhbnNmb3JtYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg1ODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWU5MzQyMGEyMDNkNzU5MGI3NTRmYmNhMWFkYzE3NjVhZDNkYWIwNzFkNzRlZTM4NjQ4OTkwMmZkMjRlYTczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZUdyYXBoT3BlcmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0OTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOThkMzY0YjcwNjZkYmM2MTFiMWQwMTliOTA3MmYxZGZiNjQ1NzgwOTRhZDk5MmU0N2QzYWQyNGQ0ZDVkYWM4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VQcm92aWRlckVudmlyb25tZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNmIzZmE4NTFkYTRmYzhhMTIzNjIzNzc0ZDA0MWIyZjlkY2VmNmRmZGJjNjBmMGY1MjRmODM3MTZlZTc5YzlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb25mb3JtYW5jZVJlcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OTEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTI1MTZkMjIyZGU4YmE4MTQ1MWM1ZTA2NmY5NDExMTYwNGNjOGY0NzA4NzQ2NGQ4MDI2NjBmZjkzN2I5MTc3MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VSZXNvbHV0aW9uT3BlcmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzODkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjRjYWM5ZDYwOGU1MTZhMjk3YTZiOTJmNTY4ZmZkZWI1MTllZDM3MmJhOTI3MmNkZTI4ZWQwMWRjZjY5ZjI4MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29uZm9ybWFuY2VTdWl0ZVJ1bm5lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcxNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZWFlYjI3YTU5NGQyZjM2MWZkOWVmNDc2MTMzNGVmMmY5M2MzNGQxZTgzOWZlMjZhNWFhMjM0MWYzNGRiNTkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb250cmFjdHNDb25mb3JtYW5jZUZhaWx1cmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE1MzQwYzNjZjVkNGQ2NzcyNDFmMjU3ODEwM2I1NTFlOWMxYjEwMjM1OGY2N2VkMDk0Mjc5Y2QxODM4MWQ4YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29udHJhY3RzQ29uZm9ybWFuY2VSZXBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTQxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhZDk1NDhjOGIyZTQ1N2NiMjA2NjdiNzI1ZjU1YWM1MDc0OGJmMjcwZDE4YjA5NzMxMTE2ZTc0YjU5MjY4YTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbnRyYWN0c0ZpeHR1cmVDYXRlZ29yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDE5NDFiOGRlMjNhNTk1YWY3MTI4NTdjNTU5MGM4NzE5MjlmZDI2OWI0NjVjN2JmOTY3ZWFlOTgwMmIzNWYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVDb250cmFjdHNGaXh0dXJlUGFja2FnZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGM4OWJiMmEwZWFlMTYxZDI1ZTBmYmQxMTJhMDM0YTRkZmQyYTI4OTI1ZTc4NjA2NDUxYzBjNDY1ZDhiMGMwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlQ29udHJhY3RzRml4dHVyZVJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNGFjMDgyNzFkZmQyNjgyZjlhYzAwYWNkOWFjZGY1MGY2MzhhMDU0NzY1Yzg5ZDMyYjA1YTkzYjNmMGMwMTQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVGaXh0dXJlQ2F0ZWdvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjM5ZGExMDk5MzA5NzBhNmYyNWE1NGY4NGEyYzMwZTljYzJmN2I0ODVjNzZlOTM0MmI1Y2RhMzUxNTFiNzc0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2FwaS9CbHVlUmVsZWFzZUNvbmZvcm1hbmNlUmVwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0OTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Zjc0NDcyMDI2NWY0MzFjYWExNzZkZmE1MGI3NjMwMzM4NTAzZDFjNWMzNDk0MjUyMzNmMjE0MzU0NjQ3ODVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0NvbmZvcm1hbmNlUmVwb3J0Q29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDcxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk1MTkxOTIxNzZhNjJkNDJjYWZjMjZkNzI0YTU0MGQ2Y2YzZTQxMDZhYTFkN2Q0OGNiYzBkOWI2MTQ5M2JhYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvTGFuZ3VhZ2VGaXh0dXJlUnVudGltZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWJkODBjNDA1MjYxNDkxMWYyNDg5MzZiMWQ3NDE4NDBiYmQ1ZDVjZjYwOGVkYmYwMWZjMTNiNWQxYmJjZDZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjhhY2IzZDdkZDY5OTk3MjMxNGVmZGMzN2Q5YjgwMmI2NjA3MTg1MTQ2NzdkZDY3NTUyOTU4MmQ1ZGVjM2RlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY2xpL1JlbGVhc2VDb25mb3JtYW5jZUNsaS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGE5Y2FkOGNjNDQ2ZmFjMDZmNTBiYjYxNTYzZTgzNjAxN2NiOGNmNzk0NjllYjYzZWI2Yjc1ZjZhZDNmNDUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY2xpL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZDY5M2FmY2RlMDFjOWQ5MWZkNGNlY2ZmZGQzNWQ3NDg0OTFhZWIwZjVhMmNkYjBhZWRiMGFmYTMwYTQyZjI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0Nsb3NlZENvbnRyYWN0c0ZpeHR1cmVWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjI0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhYjk3OGNlMDM4NDIxMTQzZmQxYWE5YWE1MGM0YmZmMjU2YThmM2E5OTliNDM4ZGEzNGE4Mzg1MjJiMDdkZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzQXNzZXJ0aW9uRXZhbHVhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTUwNjQ4MDU0MzQ0OTdlZmZiMWEwYjI5NWI4NjRiNjU1ZjI3ZmVjMzk5MThmMmUyZjIyZjQyYzRkZTMxMjc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0NvbmZvcm1hbmNlUHJvamVjdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzRmZjg5OTU1NzdjM2U1NWRmOWY4MTNjNzYxM2JjZDY3M2JiOGFmNmUxYjQ1YjJmNzgxMTI5YjU3YTdjMTk1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNDb25mb3JtYW5jZVN1aXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5ODgzYzBjN2QwNWEwMTIwYjc4NDM2OTU0MDdmNjA0NzI3OGQ4MjhiNmY0MWI3ZmNjZjk3YzcxNGI3ZmNlYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZUNvbnN0YW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWNlMzg1ZjZmNmQ1MTllYTc2ZTU1NDg5ZGI2N2U3NGM5YmYwYWIwOThmMTZlMzQ2MmZjZWQzMjM2ODc0ODAyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNGaXh0dXJlRXhlY3V0aW9uRW5naW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQyMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDUwNGNkNTJhNDJhYmU2NmM3N2U1MjMzZGUxZmQ2YmRkYjJiMDc1ODUyMjNhMzE1MzNkZDdmOTk2MTBhZDA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0ZpeHR1cmVGZWVkZXJFbnZpcm9ubWVudC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5Njk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjY5NjE1MmE3ZmFjNzhmNjdkOTY5OGYyYzdjYjA1NjdiNWY2Yjg4OTVkY2U1MDMzYjM5NTMwNGMyYjRmNTBjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNGaXh0dXJlSGFybmVzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YTYyNTFiNzViMzAxNzI2NDhmNjIzOTk3ZjhjNTRhN2E2MmFiYjQ3MDExNGE2ODNlYTBmODY3Y2ZkZGY0N2EwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0ZpeHR1cmVIYXJuZXNzRGF0YVN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzUxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4YWFmNzExNTg5NzJjYzllZmViN2FiNTg1OTVjZDIzOGQwNzkyYTZhNTA0YzE3ZjY1NGQ5ZDE5MDg3NGFkMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZUlucHV0UHJlcGFyZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTM1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImQwODNhNjRlOTVhODMwNDNmZTQ1MGNmYTNjMTdhZjA2MDc1ZmM4ZDdiMGM4NmZiZDJmNzE0MDlkNTA0ZDNlY2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZVByb2plY3Rpb25FeHRyYWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzY0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkNzgwNDQzNGEwMTg5N2M5MjBkOWY0Mjg1YjRjYmM0NDYxZTMyNGM4ZjNkOTNjMTVmOGFmYTBmMjQyNmMyNGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvQ29udHJhY3RzRml4dHVyZVByb2plY3Rpb25TdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg5MDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZWI5ZDYyMzNjY2Q2MzA1NTAzMDAxNTJhNDNiNWYxZjkwYjBhOTZiNWE2MTgzZDgxZjI3OWVlMTMwNTAzNGRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0ZpeHR1cmVTY3JpcHRlZEVudmlyb25tZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzE5ODU5MDA2Mzg5Y2Y0OWI5M2FiMGMzZWNiYWMwZjU5ZmUxNGU3MThhYTJhYTY1MzM0YmU3YmQzODNlZjkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0dhc1NjaGVkdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM1NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOWU5OTQ0YzQ2ODljYzkxODA1NzNlMGZmMzRjMmNiY2EyYjQ5OTdkMGVkNWUzZDBmNTViNGQxMGJmYzBkOWUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c1Byb2plY3Rpb25DYXRhbG9nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzEzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3MGRhZjAxNjNlMjA1MWM5ZTgzYWNjZjc2ODI3OGYwYjc0YzM4MmVmMjUzMzY0MzlhMmVmYTUyNDllZjI3MTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvRml4dHVyZU5vbkNoYW5uZWxDb250cmFjdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTBmMjMwNTQxODdmYzZjZWUxNzM3MzRlMDI3NGRiMTQ3YTM2ZGIzMjJhY2I0N2QyZjliYzk3OTFmODFkMTU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0ZpeHR1cmVQYWNrYWdlQ29udHJhZGljdGlvbkV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZDRkZTY0YjE3ZWIyNWRkYWIyMTIyOTA3NmQ1M2FiNzNiMzVjZDg4OGE4NjM5MmViN2RmMWE2YzlmZDY4NjA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL01vY2tFeHRlcm5hbENoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjFkZjlmOGMzZTk4ZWZhN2FjYTdjZmRjMGJiNjAyODA5OGZkYzM2MzNmYjRhOTIzMGIxOTZjMTcxOGFmYTJkNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Nb2NrRXh0ZXJuYWxDaGFubmVsUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzU5MDQ1Y2Y1ZmY5MzgyZWQ2ODEzMjNjOTY4YjQxZTU3YTIwMmMxZDZlOWM5ZmU3NTE3ODRjZTM5NTRjMTQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL01vY2tIYW5kbGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwYTEyOTNkMmRkYjA0MTMxMDk0OGFlYjFiMzViZmI3OTkzMTM0Y2FjNzRhNGU0NmFjNDFlZDNmYTFlOTk0MzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9jb250cmFjdHMvTW9ja0hhbmRsZXJQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWMzMjc3ZmNkZWMzMzY4MGM2MDNhNGFhN2ViZTI3YmQxYzFjNTJmMTM5NjA0YmJiZTgyM2IzYWI1ZjQwMzgwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Nb2NrVHlwZUJsdWVJZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Y2QyMTY3MjAzODFkNzQ2OTg3MDFlZjJhZDIzZjY1NDkxODRiMWY2MzM5ZjMyNjQ1YWY0MTJmZDZhZTBkZTFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL1NjcmlwdGVkQ29udHJhY3RzUnVudGltZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTk1YzY4YWIwZGRlNjVjMTIwZTVjODVmOGViMTY0MzA1ZjE1Y2Q1OWM5NTg2MzdhNzczM2VlZDdiNGRiYmYzYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjdjYTcyMWI0YTkzZmNhMzM2ZmVkMjA0ODZmMWM5ZmQxN2FjNjM3NmUwYTQ5Mjc1YmVlNjgxNTYwMzhmMmIwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL3J1bm5lci9CbHVlQ29udHJhY3RzQ29uZm9ybWFuY2VTdWl0ZVJ1bm5lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NGM1MDdjOWY5OTY5ODcwNWQ1NTdhMzZiOTM3NmVhYzU5OTg2ZTU5NzkxZjg5NTA5YTI5OTk0MDI1NmQzNGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvcnVubmVyL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZGVhZDNmYzllYmRkMmZlODEyOTFlMDkyNWZjNDAwYThmYjIxMWQxNjY0MGM0MWNjZTdiMDIzNDEzZjFhMzkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL0NPTlRST0wtTEFOR1VBR0UubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjFlZGJiZDc5MzA3ZDNiMTA5MTk4YjAwY2IyMmIzNjc3NmNiNGE0NTlkYWMyNDViYWVhYTcwNmQ0M2Y0MzM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL0hBUk5FU1MubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODc3NywKICAgICAgICAgICAgICAic2hhMjU2IjogImNjZmQyZDdhY2U1N2ExYWUxZWI4YzEwZTczOTJkMWJiNDEyZWM4YTdmNzcxZmUxMjVkM2Q4MzNkMzhmYzkwNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvUkVBRE1FLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzNTBhM2U5YTM3MzNiZTYxYTg4Y2M4ODhmNzgzZjA2ZmMyYzkwY2E4MDNjNGMyOGVkZTUyYzI0YTJjMWNiZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvVFJBQ0UtU0NIRU1BLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNjI4NjA3OWFhYjcyNWU0MmUzMDBjNGUyYzhhYWNlNmJmMjE0ZGVkYjlkYWE2ODZhMWI2ODVjZjU4YmEyYzM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Mjc5NGRmMTMxZGY2ZTI2YjZmY2NhMmFlZDU0ODQxOGExZDJjZWVkMzJhMTVlOTcxODY5NTI2M2Y1N2FiYWU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4Y2Y0Zjg5MTllNzBlMDk0M2UwOGU2MDFlOGIyYTVlZGQ3MDE1NDdmOGQxMTQ0ODAwNjRjNjE0NDBkYzFmMTcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YWI5NThlMTZmZjliNWNlOGQ2ZmUxZTMxMjVhNDhiN2QwODU5YTY0OTllMjg0ZWZjZWM1ZWQyZmYyNjdkY2ZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTdiOWI4MWZhOTM0ODc1MTE4Mzk5Yjk3OGZmZmE3YWZlNDE4MGQyNjIxYTUzOTYyMzAxZmU2NjM5MDNlNmU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWFkNDllZDZmOWU3ZDQ0ODYzYmNiYzZhOTcyMzkxMjExYjJiZWUwYTdhYjIxOTM4N2Y0ODU4YTUxNzczMDQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0M2MyOThhYTQ3ZDhhNTY4M2I5MGEwMDkwZjdhYzQ4M2I4MTBhMDRiYTg5ODJkNzgzZmQzNjEwODIyY2E4NmQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Noay9jLWNoay0wNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZWFmMDc5Mjc2MWRjYTc5MDczYWZhMTJjMGMzYmM0NTVkOGRkY2I3ZGZiYTkzZjlmZTM5NmExYjhhNGEwYWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Rpc2MvYy1kaXNjLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcyNjMxODFkNWE4Y2MxNWYzYzk0NzBhMGNiZjgxYmRkYjYwNTc3YTA5NzU3NzUwYmUxNTBlMTlkZjJmMmQwYTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZGlzYy9jLWRpc2MtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRhZjAwNjhjNzAxYTM5ZGIzYjM3ZTk1NmMzMDc3YzcyYWEwOTI2YTVjNGVjZTYxNjg1YTM3OTM3ZTAyYWUyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9kaXNjL2MtZGlzYy0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTAwZjMzMmY4ZmRlZGU4ZjBhYmJiMGQ4MDlhMjQwNmUyYzFmNzVlNzQ4ZmU5ZjA2MjJhMjgxMGVmMTJiNTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2Rpc2MvYy1kaXNjLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjliZDgxNGM1NTY3MzVlNzlkZTg5MWI3ZTA4NWEyNTYxMmRhMzBhYzI0YWJiMzI5MWU4MGMyYjVmZjhjZWMwZTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZGlzYy9jLWRpc2MtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTUzYTFjMzQ4NDIwZDc4ZWUyNGRlY2I2ODM5ZTBhYjQyYjBiZjEzOWRkNWZkNDBhMjQ1M2Q4Y2ZkMTZhZjljZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9kaXNjL2MtZGlzYy0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MjM2MTJkMjRkNDM1NDhhZTM4NWY5NDg0ODczN2E1NTI5MjBhOGRhZDE3Y2YxNzViOGJmNGUzNDY1ODkyYWM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2UyZS9jLWUyZS0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmQ2NWJlMDEyZTRkZDcyMmMxN2E0MmZlNmIwMmVhNDllZDgyYjY0NTdkMGYyMzI0ZGFhMGM3NjQ0MWNlYTM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2UyZS9jLWUyZS0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjExODk2YjRjOTA5NWEzNTdiZTI1OWZiODcyZmFiZjkxMDdlZTUwMWFiM2I3NTg1ZmFiNzcwYWE4NmM4ZTllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2UyZS9jLWUyZS0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTJmZTViY2M5YmI2ODQ3Zjk5ODcxYzhhZGI5YmU4NjYwM2ZmMWVjOTgyZDhjZDE1N2Y0MDA1YzIxYjk3ZGNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWN5Yy0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDhlYTY2ODk3ZTZlZTAwMTU5NDc3YTA0NDA1OWE2ZmU0NmExMWRlMzUwOTBmODVlOTc4ZTgxYjM3YmYyM2FmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGMzOGQzOGZjNjA5MjkxOThjNmQzMTE2Y2Y4ZjkyZWMyODFiZDE3MWM0ODg0NjQ0NTY3MzdlMzVhYmRjZjA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTUyNTIzZWE3MzM5Y2ZlZGJmMTZhZmQ3YmJjY2I1N2I2YjliM2UxMmFjNzRjNjNlNDA2YTZmZDBkNTMzYTQwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOGVjYzUxNDFkMzViNGQyMjg1NTkzODFmNzI3NDMyMGJhMGI5NmZiMGM5YjlhYzgxYjc1NDE0ZjM2ODBjMjJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTFlMjQ3MWJlYjNkMDA0NDI5NGRjODRkMjMzZWZmMWU3N2JkNzMyZWM3NmYwOGZlZjNhZDBiZmVlNzVkNGMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNWRlOTY3YTAzZGRiMTJjYmFlOTlmN2JiYmZhY2UyOGIxZTY4ZTk1MTk4NmQ1ODNmM2NhNWFmYTNmNTY5N2Q4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZjE5NTE4NDRmZGIwOWNjNjEwZDQ3NjMxZDA0Y2EzMmM5NzY2MzkxY2YxMzc5NDUyODJlOWM5M2YyY2IxNzYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wNy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NzY4ZWMyMGJhM2FhNDUzNWIxNDRlNWQyZWJhNWRjZThmMTg5Y2ZkYzI0YjljZmVlNTJkYjY4ZmFiNzI2NDViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wOC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3N2ExZDE1MzRhZWMyMDZiODIyY2U0MzNjNzhhY2EwNGQwOGIwMTIxMjE1YjE4MGNjNzJhYjIxZTEwMGY5ZjQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wOS1jeWNsaWMtbWVtYmVyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3OWU3YzMyOWU4OTFmYjU3ZDNkOGFjMzYwN2M5NjdhOTNiOTliZWIwNDY3ZmE3MTVjY2IxYzE3NWMxOTdjMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA5LWxpc3QtdGFyZ2V0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiZTM4YWY3YTRlNTNmYjQxYTU1ZGM0YWM0NzE5ZTM4MzRhMTBmMDNjZGFjMDJlMGQ2NDNkZjMyMWVhMjhjNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTA5LW5vbm9iamVjdC1tZW1iZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODY5MjVlOTVjNzViM2M0OWQ2MmFiZWFlMzU3MjNjYmE2NjU4Y2Q0ZjMzMDExMTM1OTQ2M2U3MjRmMmU3OGExMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9lbWIvYy1lbWItMDktcmVzZXJ2ZWQtZmllbGQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTg5MDg3MWUzN2VlYjkzODYyMDIzOWZkZWYzZjM1OThiY2Q4NjI4MDFmZjY2Y2FkYjY2NzEyODMxZGExZDMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2VtYi9jLWVtYi0wOS13aWxkY2FyZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyOWEzYjQxZjE0ODVmNjYwM2I3MTZkMjQzYzAzNWM4YzhhYWYwYmY1ZmNmZGE0MWE3NmJhZTdmMTU4NjA0Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTEwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImE2NmQyMzQxZTM5ZmEzMmYwMDRjZTIwYWZiYmQ4OWEzZDAyMTk0MzgxNTg5OTI0NGRmYzk2ZGU0ZDk1NGU5ZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTExLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjljNDMzOGY3ZWU0NGZlODU1MjU1NGFmMmZkOWIxMDZkNzc5Nzk4NzcwNjM5MTM1MGM1YjZkNzVhMWI4MzExZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTEyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2MTg1MDQyZjY3YThjNmE4NTljZmQzOTY5YzMwZmM5OTk4MTg2MzNmMWMxY2FiYzZkOTFmOWRhNzAzY2U0NzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTEzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3MzFmMzk3YjYzMmMyYTY1N2FlN2VhOGJjM2YzMDU4YzhjNDljZGQwNzdkYjAwNjViZDRkZWExNTZkNDg4N2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTE0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkZmI1ZGNjOTQyM2FhMGJjZjM0MTVhY2FjMzBjNzRiYjk2ZGQ2MDU2ZTRhOTBlNjBjMDIyODk0MjlmZTdmNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTE1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlYzhjNjM2ZDAzZjYzYTc0ZWI0OTlhNDFhM2JiMzA5ZWQzZDE4MzkxMjY5NDY2N2VjZjRmMWU4OTllNmU2MTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZW1iL2MtZW1iLTE2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwYmRkNzVkODVjZTllZDc0Mzc3ODE0ZGM2NWNjNTJlMTNiYzEwYzdkNWY5Y2IyODliMTUxYTc2Zjk4MzE5ODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZXZ0L2MtZXZ0LTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjYzkwMmNjNGFmMzVhMTFlNzU3YjFjYTU2ODQ1NzFjYTM0NTBjYjc3MzFjNDRmNjZjY2I4NWIxZDYzYzgxNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZXZ0L2MtZXZ0LTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllMGJkMTYxYTRmYmI3YmUxYTcxYmY3YzM3YjIwZTFmY2Y4YzQ1ZWNkOTkxODEyNzc1MjdkODQxOTdhZmZlNmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZXZ0L2MtZXZ0LTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5OGNhNmUwMDc0NTdhZWY4NDQzNTMxZjEwYTI5NDQyNDRlZWJhMmZiYmZkYjNhM2U1ZGFkMjczYTg1ODA4ZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZXZ0L2MtZXZ0LTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3MjQ2Yjc3MWZlNGM4OTBlZWFjMjIyZGYxOGExOThlNjdlODhlOTIzZTljYTcxMzViMDhjYTFjODZkNDgzMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZXZ0L2MtZXZ0LTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImJiNzI4OGFhN2QzNDJiMGE3NTc4MDhmMjk4NDg3MzIwYTExN2ZkNWE0NzcwNzYzMmZkNjQyYTQ5Y2RlNzlhNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmFpbC9jLWZhaWwtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjhiMjUyNDc0NmY0MDRlNGFlNGNhNDJkZWU3NGM0YjMyOTIzNTM3YjU1YzRjODNhMWUxZmMwNTMwNTczMmJlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mYWlsL2MtZmFpbC0wMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZDk2ZTc4OTQ0MTA1NWQ2NThmNTEwZmI5Zjc4ZDI2OWE3MTVlNWI0OTQzMjg4MWM0YTI2NjU0NjAzMTA3OGRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZhaWwvYy1mYWlsLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiMWY5ZjQxMzQzMWJiYzFmZDczYjhhMTRkNTkyM2FlZDkxM2Q4NjFiNDMxMzVhOGFmZDY1OTdkMGNiMGUyMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmFpbC9jLWZhaWwtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjAxOTUyY2UxYTAyOTk5ZmQ2MjQ3NWMzNjM0NzJkZDcxNzA0YzY2ZTJlZmRlMDU4N2RkNjBiMjA2MjA3NWQzNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mYWlsL2MtZmFpbC0wNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMTYzNzYyYmE3ZmYyNGQ5NWEzM2FhZWI0YmZlNDhlNWFmZjkxNjkwOTBhNWFiN2QzYjNjMzczZDZjNjQ2NmUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQyYWZkYWViZWMyZjE1ZmRmMWI1MTM1ODFkNGM3NjVhOWYxM2ViZjdhZjYwODJlZTJmY2M1MmE3MDI2ZjgzZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGJkYjg0YmFjNzkzOGI0YTg0ZTQwYTY1MzlhMjk5NGQ4YjQ4MTRiNDJlNjgzZDdkNDJiZDIxMGE2YzU4ZjlhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0wMy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxY2I5NTZkMjUxOTRlOGI4ZGNhNzEyMDlmN2I4MTgyMGEyMDUzMTE5ZmI1NDZmZTA5ZmEyMGU3M2I2YWEyOGRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1Y2FjZjE1Mjk0MDM4NjVlZmI4N2I4MTU0ZmE5MzA4NmNiNzQzNGJlMjVhZDNlZDM4MDcyZDY1OGM4ZmY2YmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVjMGVlM2UxNTZjZWRmY2IzNTU5MmFjNTJlYWQ1ZDljOTE2OTNlNjFlOWZhODdmNWQxZjhlMWQ2MDUzYjJhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0wNi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0N2VjNTZjNzMzZjU4YmRkMWM3M2Q3Y2ZhMjVmNWZkM2Y4NDdkZGY1MWZkMTUyZWM1ZTMwMjVjYTFjNGIwNGY2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFjOWU5NDZjNzQ2ZDZlYTAzNTA3OTJjNDM0M2ZiNmIyOTU3N2RkZWI1OTExZDUzZDBkZjA1NmZhODM3MTVkNzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMDgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODBiMjc5MDg3NjY3OTAyZDMxNGIyNDJmNmYyZGEwMjMxMDZhNjMzZWViODRhZjcxYWI0NGUyY2IyZjU0OTBlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0wOS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MmRhMmQwOGIxODMzYWJlOWIwNGFlZDM4MDM3YThjYzQ3MDVhN2JjMjIyMmM4MDQwZTgxZThkMGFjNGI5OTlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTEwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmNTg4NDRhNmZjZTdjYzdiM2RiMWFiYmY0MjcxZDJhMWI4YmI0Y2Q5OGRjMDFkMjA1NTkyYjE4MGQ1NTllNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMTEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjAxYmI1M2JiNTFkZGQwMzMwN2RmODEyZDVhN2M1NDk3NDZiMTdhOTkzNTljZWVkZGNlMDVmODNkNDQyMDY4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0xMi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDlhZDNjMThjNjgyODFmMWZmMTQ1YzYyMTUwZjcyZTNkYzQyYTlkMWM1NjI2YjkwMzg1YTUwNzQxYmUxYmQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTEzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczYjg0NWZjZTRlMTJjYjc4OGQ5ZWJiMGU4ZDE3OTI1MGZmMGY3ZTEzMDgyYTE4NjEzNjBlZjE4MWY4NzhkYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMTQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA0MDAyNGJkNTU1MjI5ZGIyY2E2YjJkNzZhMzZhN2U1Y2I0ZDI1NDRkNjQwMmVlNjliM2U5ZGRlMGVhYTc3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0xNS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZDEyOWFiMGI1ZjAzMTdlNDc0NzgyOGNlYjE1NmRjYmE4ZmVjMDc4NDVjMjU3MTg2MzA1ZjhlMzE5ODUxMWU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZlZWQvYy1mZWVkLTE2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3YzViN2I5ZTRmOWQxMjBkZDNmNDFiZWFlN2IwMDczMzNjYWEwZGM5ZTZmNzEzZDViZDA2ZjdlYjYxNjRjNzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZmVlZC9jLWZlZWQtMTcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzkyNDNhZDc2OGU3YTNjMWVkMzk5NzllNzJkNzYxZjkzY2Y2ODEzYzFhZDQwOTBlYmY5MDNjMDRmODczY2U1ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9mZWVkL2MtZmVlZC0xOC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODJjMWJhZDU1YmU2YTViYmJjYWFjNzA2YTMwN2MwYzUwODUwZTk5NGY2OTViNjlmOWI5OTRjOTU4NjcxZjkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2ZpeHR1cmUtc2NoZW1hLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODc2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU2MWQxMmViYWMyMjBiYjdkYzFjMTNlNDI0ZGUyY2YzNGU3Yjg1MzZmNWE0MTA4ZTNiZTRlZjc3ZWE5NDMwOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL2NvbXBvc2l0ZS1nYXMtZXhoYXVzdGlvbi1wcmVmaXgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZmRmYzIxNDEyZjY4ZTYyMmZiNDJmNzRkMzdmN2Y4ZGYxZDZhMWY3YzRhMDlmZDc0MTc4YjZjOWRlYTk5OTZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9jb21wb3NpdGUtaWRlbnRpdHktYmxvY2tzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2RiODA4YzBkYTYxMjkxOGRjMGVmNTc4ODZmZDc3MDBjNzQxNGViMGUwOWJhZDY5NTY3OTFhNTE1NGJjMTgxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vY29tcG9zaXRlLWludGVnZXItbXVsdGlwbHktM3gyLWxpbWJzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmJkYWZiOGVmYTQwMTVjYTNjZDQxYzFhYWU5OTQ3ODQ3OTBiY2E3M2FiNDk3ODdlZDQ5NDgwZTg1ODM1YjM4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vY29tcG9zaXRlLWxpc3QtYXBwZW5kLWRlbHRhLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDE3Y2YwNjQ5MWEyNTNmZWU0YzZkZDMyNzk5ODdlYjgxZWZkZTJjZTg0YTYzOTU2YTk2ODMzMzdkZTQ3MTBmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vY29tcG9zaXRlLWxpc3QtcmVwbGFjZS1oZWFkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjViOGEzYmU1NTQ1MDljY2QxMzk3OGY2ODNkM2I0MWFhNjMxYWFhZjQ3MjhhMmQwYWQ1NzVhNjQxMmU4YzkwOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vY29tcG9zaXRlLXRleHQtNjUtY29kZS1wb2ludHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ODI3NzU4NGEzNWE5NDlmNDNmNjJhNzNjZGJmOGNmOTBlNmRhOThlMzU0MmY2NWViYjBlNDAyYTc0NjgwODA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9jb21wb3NpdGUtdmFsaWRhdGlvbi1wcm9vZi1yZXVzZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2OTVhNWM2ZjZhMTllMjM1MzYwNjc3ZjgxYmVlOWY3MjI4NWM1ZDkzNTI0ZDI4Nzg1MTUxYjk2NGEwNGYwZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1jaGFubmVsQWNjZXB0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjk0ZGI0YjI4YjUwNGRmZWJhODIxY2QwZTQ2MDZiZTA5NDY4MmI4NzlhMjBkMzY0ZTAyMTAxOWMxOGI2NjZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItY2hhbm5lbENhbmRpZGF0ZVRlc3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY3OWY0MjNkNDZkMDQ0MGVlMDVhNmUzMDQ5ZDNkMTBlM2VkMDAzYzEyMzBlOTM3NmYyMzc2YWM5MDM1YzBkYzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1jaGVja3BvaW50Q29tcGFyZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiYjkyYWNkM2RkODJiYWE4Y2FiMTY5MzZhNjcyZTQwYTkyMzkwZjZmYWY2ODE3NTc2ODExMWZmOGNiNzAzZTZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItY2hlY2twb2ludFdyaXR0ZW4ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OTMzZTgwOTMxYmRmMTA2YjI2NDNhYTQwMDNkZWQ3ZGFjNjgyNzI0NTdkZGVjNGFjZjQ2MWE0OGVlYjEwNTkzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItY29udHJhY3RIZWFkZXJSZWNvZ25pemVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTE2YTMxMWEwMDAyZTE5ODZlZDg3M2FmM2I4ZWQ5MjNhZmU0M2ViNTU5ZjZiN2U0MGE4YmUxN2IyZWM2M2Y1OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWRlbGl2ZXJ5U25hcHNob3RFbnRyeS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5ODVjMzM1ZjBjZTEyYWZkYzkwZjZlYmQ0OGRhZTUyYzkzMmI4MzNhNjgzMGQ3OTc0NTUwY2U1MDhjMmMzMTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1kb2N1bWVudFVwZGF0ZURlbGl2ZXJlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI4OGQwMmM4MTAwODE0NDZkYmM1MzZiY2EzZDI4M2RjOGJjODMzMzg2MDJjMjM4YWQ0OTY1MjM2YjNkZjU4NTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1lbWJlZGRlZEV2ZW50RGVsaXZlcmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmRjNWY2ODI3MjExM2U1N2IxYzA2ODI1NmEzYzE1YjljZDBmNTFkMGZhYWI3NzU4ZjRhZTBiOTc0NDg2NzVlYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWVtYmVkZGVkUGF0aEVudHJ5UmVhZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImQxMTE0ZGE4YzJhZDM0MzEyZTYzOTNmZjMzYzJlMzlmZTA0YmU4YWQ2MjIxNzkwMTIxMjNjM2EzMjljNGM2ZjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1lbWJlZGRlZFBhdGhTZWdtZW50VmFsaWRhdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjc4ZmY4ODI3MmY4Mzg3YzNhMWNhNzQxZmU5Y2JlNjQ4NjIzY2Y5YWIxNjI5ZGEwZjZkZDI1MGNjMWEwOTQ4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWhhbmRsZXJDYWxsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGZhYTE0YTM5MGE5NWM3ZTVmM2M4NDMzNWM4N2ViZDQ5OWM5YTg0MWZhMDAxYzZkOWU3NjA0NzJmZjJmN2ZkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWhhbmRsZXJDYW5kaWRhdGVUZXN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTVlM2FhYjA0N2E2ZDFlMjYzNTZlZWM4MzMyNDEyMWZjNzkxMjA2MTIzMGQ1MjE3MmIzYWE4YzVmZTM1YzQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItaW50ZXJuYWxFdmVudERlcXVldWVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTA4ZGQ2ODA5OGJkZDc5NGEwYmM5YmM5YzY3ODViYzliOTY4OGVlMTRkOTBlNWEzNGZiMTc4N2JjNzJiMDRjYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLWludGVybmFsRXZlbnRFbnF1ZXVlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlNDhjZGNjZjk1ZWQ2NTcyY2Q2YjM2M2FlYmVkMTM2NGMxOGQ0YmZhYmIzYzRhMThhYWE5NjllYzZhOWFkYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1saWZlY3ljbGVEZWxpdmVyZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZDU1ZDI1Nzc5NDc3YjFjYzI1NmI2Yjc4MWRiNTM3OTBhY2Q0NjM5ZDk1MTQ2NjU0ZTk1MjBiZTlkODJlNDIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItcGF0Y2hBZGRPclJlcGxhY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNDcyMjhhNDc1Mzk3Y2NkNjBhMzZhYzc5MzIxMDMwMDI2ZjkxM2M2Njg3Zjk4OGY5YzgzOGY0NGJiMDdjNGY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItcGF0Y2hCb3VuZGFyeUNoZWNrZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzQyZDgwOTg1MDA1MWZlMTc1OThhZjRiMDU4NjhhYzQ3YTc5ZjE3Y2YxNTFmYjg0ZDExYjM2ZThkMDEzMDZhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItcGF0Y2hSZW1vdmUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiY2E2MGM3MzAwMzQ1YzE2M2IzNDRhZGI2ZTQ0MjFkYzQyNTI1YzFmYTMyZTYzNGYxYjRhMzIyNTdiMmVlMThmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItcG9pbnRlclNlZ21lbnRUcmF2ZXJzZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDdkOWExOTQ2NmY4OTUxN2ZhNjIwNjc2OTZiZTg2MTE4ZjczMGFkOGE4NGExOTgxZTRiMjhkODgyZDAxZTQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItcHJvY2Vzc0ludm9jYXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTRjMWJmYTBlOWYwNzdjM2QxN2RkNzAyZjY5MmI0OTAwZDljYWM3NDdiNmI3YzQ3NjE1MTY5ZjJiZDkxMDc5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9wcm9jZXNzb3ItcHJvY2Vzc29yTWFya2VyV3JpdHRlbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdiNGVlNmVjOTdmZjY2NjZiOTUzNTMxODgyYTk0ZWQxY2RjZWUxOTVkYzg4MTY1YmJkMjljMzA4NGFhNGFkMTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1yb290RXZlbnRSZWNvcmRlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4MmY2Zjg3ODFjMTg2MzdkODBmNGUzNjk1ZjEyNmM4Njg3YTViMTZmZTFiNjg1NDk5MTk3NzBmZDJjMTA3NDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3Byb2Nlc3Nvci1zY29wZUluaXRpYWxpemF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmI2Mjg2ZTM5MjkwNmVjNzcwYmYzODAwZGYwYTBhMzUxY2IwYWUyYjdmZGRlZTZkYzU5MDZmZjYyNDk2ZmU4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLXNjb3BlT3BlbmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGI3MDVlZDdjYmQ2MDEyMWExOGQ4NzBkOWQxOWUyNDE2ZTM3ZWMyN2I0YmE0M2Q1ZGZmOWFhZjJmODEwMGI4MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLXRlcm1pbmF0aW9uUmVxdWVzdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFhOTVjYzNjMmExYWM4YWY5YWIzYzE3YjJmZGZjZGUxZDkzNjQ1NmRjMDIyYjZiYjUyMTU1NTIxMDNhZjM1MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vcHJvY2Vzc29yLXRyaWdnZXJlZEV2ZW50RGVsaXZlcmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWNhNjEyNzljNWUyMGMyMWFlNDY4YjAxOGI5NGZhZmVkM2M0YTg0Mzc2Mjc3OTNkNGQ3MjFmNjU0YzRlNDJmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtZGlyZWN0SWRlbnRpdHlIYXNoQmxvY2sueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzc5YjMxYjFhYWJkMDRmZGJjZDQzNTZkNGMzZTg4ZWIwYTk2ZGJjYWI4YmYyOTJhNTIzOTYzN2M4MDA1YThmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1pbnRlZ2VyTGltYk9wZXJhdGlvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImIxM2FlNjc5ZmU4MTZjMzdkOTQxN2JjOGM0OGY5N2RhNGZjNWM1MjE0ZmZkY2JkMGY4Mjc5NzllNWM0MWM0MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLWxpc3RGb2xkU3RlcFJlY29tcHV0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OWNmOGIwOTQ0MTYyMWRjMTk2OTRhNWQyMWI0ZTU2NmNiZDA2NTgzZTA2N2UyN2Q0NmRjOTQ1MmU4NDhlYjQ5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1saXN0SXRlbVJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzY5M2M3MzE1ZjM5Y2RmNWE3ZGU2MjQ3ZTMyYmVhZDlhZDExNDk0YjUwMGI0MGVkOGMyZjViYTM3OTlmMTMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1ub2RlSWRlbnRpdHlFc3RhYmxpc2hlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQzMDdkMDJjOTIxYjAxMzM0M2FlNTFkODYwNmRkY2M5ZDgyYThkMmQ0ZDhmMDk4ZGI5MjQzNmQ4OTBlOTZmZTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLW5vZGVNYW5pZmVzdE9wZW5lZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMTY0NDZmOGI0ODQ1N2MyMGQwNDU3MTk2ZTA2MjdkYmE1ODkwMmRiNjY0MWJkY2QzZjBlYzE5YjBmOTJiZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLW9iamVjdE1lbWJlclJlYWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NjZlNDM5NTc3MzA2Zjc4ZGI1NzA1MDEwZGZmNTE5ZmYxZjcxMjFiN2M3ZjljYTA2YTAzZjBkNTUwZDAxYTQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy1vYmplY3RNZW1iZXJSZWJ1aWx0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmI2YzU0NmVhOGEzOWY1MmM0NjI2NTc1ZWQwZjgyNGIxMDM3ZDg4M2FkNWM1NzBhZWE5NDAxM2RlY2I2MjQxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtc2NhbGFyQ29tcGFyaXNvbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhiMGIyODRkOGMxNTM2NGUwN2ZjZDZlNzhjNTExMzVjYjgwNTZiMTUyMzk0MGQ4NzQyYzNhMDhjNTM3ZDQ2MzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLXNjaGVtYVByZWRpY2F0ZUV2YWx1YXRlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2NDdhZmFjNmUwOTRlYWIzN2U1ODhkNmY4ODA5MTVmOWEwMDI2M2MwN2U4ZDJhNWQ4ZDg4NWY4OTQ5OGRmOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLXNvcnRDb21wYXJpc29uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODUwZjY3YTUwNDc4MWU2YThjNWI2ODNhM2QwOTMyNDkxMDQ2OWE5ZWU4MmQ4NjQ1YzA4NzgzN2U4ZWIwMWZiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtc3VidHlwZUNhbmRpZGF0ZVRlc3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU5NjQ1MjhkM2M5Y2JmMjM5MjY2NDIzMzE4YjIwOWM5N2M2MmM0OWVhMzU0ZTZmNTRiZmI4YTYzMzBhMmQ2NzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvZ2FzLW1pY3JvL3NlbWFudGljLXRleHRCbG9ja0NvbnN0cnVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODgzNjZkNjBhYzRiNmVmMDYxMjU4MzBiYjJhNzQ0Y2Y2MzZhMDMwZjU2OTFmMmQ2NjMxZDM1NmJiMGQ5NGU0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtdGV4dEJsb2NrRXhhbWluZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZmE0ZmI0MDIyMzRlMzdkYmI4NTlkYmViZGMwOWYyZDUzNmJhMmIwNmJkMzk2NjI4ZDU2YmM4ODEwOTFmNzljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2dhcy1taWNyby9zZW1hbnRpYy10eXBlRWRnZUZvbGxvd2VkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTUxMTA0NTYzODNkYzYzODRjZGI1YzUyYzMwYzYwYjFlYzUxZjJhMWMzYTBmNmFjMjE5MDA0NDlkYzk3ZGYwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtdmFsaWRhdGlvbk1lbWJlckV4YW1pbmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTdkNWI0ZTU0M2Q0N2JlNzNiZjgyOGI4NTM5YjMwMWExYzg0YmZhMGQxMjFjYzhhMDAwOWIzMDE2YmQzOGQ0OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMtbWljcm8vc2VtYW50aWMtdmFsaWRhdGlvblByb29mUmV1c2VkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM5MDQ3NGVlZDQ2ZDNkMjg3NjcyOGUyYWE3MTZhNzFmYmI4ZTllMGUwZmE3NmJmYmJlNzYxODQwMTkzOGFkNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTJlNmQxNzM2YzViNjlkMmFhNjkxN2U1NWUyOGJkNjA2N2QwNDE1OWYyOTAzMjQ2ZTQ0OGNmNDE1YzRiOTMwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjA0MDBiNWIwMmJjYmM5Y2FhZTY4ZGIxMTA2MmU3NTE3ODU1MzRmZjBkNDkwNmRjMWNmMjBiNWUzMTI1MGVkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTZiYTQyYTBmZmE4NDI5MTBlN2ExY2VmYjhlMmQxNzQ2ZGU0YjlmYzQ3MzA2Zjc5ZjIzMWQxYTYxOTFiZjM0YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2FjMDY2ZGZhMzQ3OWZlYWVhOTcxOTk2Y2U0MDAzMWZiNjNkM2FjZDEzMmQzMmJmZGNmMzBmMDQwMjYxNzU5YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjEzYjI2ZGNjZTM4MWM2MGQxYmQ0NWMwMmUwN2U0NWY2NTY3NDg5NWY3NTE1NzU2MTY3OWExMGZkMTEyZTRmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M5YjU3MWE5NmNjNjlhZjM5OGQyMGU0MjliNjFiZTA0OWQyNzFiODU4M2U4MDljZmUyMTBhMjQwZDQwMmRiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWUyZWIyMzJjNmEyYWYwYTM0YzY2NzExOTdlMzU1ZGU3ZWI0YjNkZTNhMzE3ZDNiMWM5MTgzZDJhMTAxNjcxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9nYXMvYy1nYXMtMDgueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmM2NzIwYzA5ZTk0Y2M1YzM0MmVmNTY1MmU0ZTEzNzc4MmVjMWViNGY0ZTg3MmRmNGJjOTk2Y2RjODM0MjAyMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9pZHgvYy1pZHgtMDEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzE4MmY4NTBmYjJhYjg2MTQ3YTE2ZTQ3ODZhM2ExMjRhMjllOTE5Njk5ZmMzMzUzMzVhODA3MWE4NGIxMDczNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9pZHgvYy1pZHgtMDIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVhNmIyYTg1MDVjMzkwNDBjMmEyOTExNmRkYjliOTVkMTU0MjMxYmM1N2M4ZWJjNzAwNWVjOTVmYTQ1ODM0OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9pbml0L2MtaW5pdC0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDY0M2IxY2U3NTc2Y2M5ZjNmODlmNmFlOGM0MTM2ZjY1ZjZlMzA5NzAwOTEwYTEyOGZiMjU3YzdlZDQ2OWE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2luaXQvYy1pbml0LTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVlYWI5MjE5NWM0OTc2YzMwY2Q5ZDJjZTM3NTNiZDM3MzNkODFmMTM5MTRlZTkzZDI0MTVjZTMyNmM5Mjc1YzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvaW5pdC9jLWluaXQtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNjNDUxMjUxOGE4NTcwOWE4ZGY5MDY2Y2NiOGQyNTNiZDRlYjkzMDY2ZmJlOWVlYzM4NWE3MWMwNGZhMDZlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9pbml0L2MtaW5pdC0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYzQ4OGUyYTZhMzhlN2QyYzFhY2U4YmIwYzA0YWEwYTIzOWNmMDEyYjYzNDM4ODY5Yzg0NDY4YTZiZjliNTVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2luaXQvYy1pbml0LTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyZWU2MzU3NTBhMjVmMGNmYzg3YzUyMmJiYmQ5ODAzM2Q3MzM5ZTMyMDNlNGY0NjA5NjBkYmRkOGFkNzk2N2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvaW5pdC9jLWluaXQtMDYueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDgwMTk5OWI3ZTM5Y2Y2Y2E5MmE4NWUwMDY3MWJkM2U3MjNhYzcwOTUwYmYzOGZhOGExYmY5YjZlMmVkNTk5YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9saWZlL2MtbGlmZS0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYTBjZTM2NjY1YmUxMTI1NDE1ZjAyNzJhNWE4Y2FlYjNkMjllNDM1ZjkxOWFhNDhjY2FmZmQzOGQ1ZDQxN2VjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL2xpZmUvYy1saWZlLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5MjFjZGVhNWFlMWE2ZDI1MmYzZWUzN2RmZDY5MjkyMjhkYWM5Y2NjYmU2MjIwMjM3NDQxMTBlZDMzMTVjMDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvbGlmZS9jLWxpZmUtMDMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGFjMWMxN2YwOTdhYmU0OTBmMzVmNjhlMjVhNjM4NjgzNDkyZDMwNDFiMmI4M2Q2OTBkZDY5MjQzNTQ3MDM4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9saWZlL2MtbGlmZS0wNC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMGJlYWE0Y2VlODUxYTFlYTQ1N2QyZWY2ZDkzZDNhNmEyY2UxY2E4MTIzZmU2ZjM3MjIwODNkZGMzZjQwODI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL21hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YjIyNTE4MmIxMTBhMmM4MDhkNTM5YjYxNDA1NmI3MGMxZWU0NDkzOTZjMGQyOWQxYjA3ZjFkNDA3NjQ3Yzg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL3Byb2plY3Rpb24tY2F0YWxvZy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMDExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Y4YTMxNTQ5NWEzYjQ2NjM4YjcxZTA3N2EwODlkODA3MTgxMjA0YzM2Y2MxZWJkOWY3ZTlkZjBjMjVhNTk1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtY29udHJhY3RzLTEuMC9maXh0dXJlcy9wcm90L2MtcHJvdC0wMS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MWEzYTc3YjdjOGJkMmEyZDViYzkzZTk3ZDhmYzcxYTcxMjQ4NWRkZmI4MzZmZTA2ZTAyYzc0NGQ3ODMyMWNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1jb250cmFjdHMtMS4wL2ZpeHR1cmVzL3Byb3QvYy1wcm90LTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0OTRmNzUwZTFlOWIwNDY0YzZlZGQ2MTAxODg5ODEzM2Q4M2YzY2Y1OTRhNTIxYzVjYzcwNDZjNzc0NWEyODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhYzZhNzczZTVkYzNhYzMzZjJjZmRmYTcxMTQ3NWZlYTA5OTM4MGJmNWE5NThjOWMyNWVhMDQxODVlMDVkMzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM2Yzg1NGJlNzFmMTQ1NGRhMmYzNTNiOWZjODAzNGQyMjhiNjEwMTc4ZjAzZTA1MmQxMzI4MjNhNTBiZjczZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYWE0MmIzZjkyNjkxNDFjYjQ5MjAyOGZiYjUyOGM3NGVhMzQxMDI0MTYzNWZhYmE2ZTZhYzQ2NWNkZGZjMmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc0MmViNmMwMGFhNWY1Yzg4ZTA3Njg2YTk3YTgzZGE3ZGRlOTUzMjQxODhhZjViYmZkZGNlNDJjZjY4ZGQ3MjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTA1LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzZDhkNGQ4MmRjYjVkOTFhZjFjNGFjOGJhODQwNGFhOTQ4Njg3MDYyYmZiZTMxZWVlZTQ3NWViODY3OGY5YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTA2LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4ZmEyYTk2MGUxNTA2MTAxYjMxNzAxNDU0OWNlNWJiNzYyMDhhOTQyYThiYjIxNzQzMjJiYmRjMTFiYTdmMzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvcmVwL2MtcmVwLTA3LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImEwMWVlZTZhOTEyZTQzOTYyNGRjOGJhY2Q1NDAxMmM4Y2JmMWVlNDFkYzU0Zjk2MDcxNGI3OTQwZmMyNTBlZWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2MtY3ljLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiYmEyYWYyM2E0Mjk2NjM2YmVhNjNhNWE4NDA2NGVkNDJlNTVmOWViYzdhZDc3YmM1ZTgxNzVhZWRhZDhkNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2MtY3ljLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxMGYzNjU0NDgyMjQ1YzY3NDVjZjE5ZmZhMTI3OWI4YTMzMjhkMzVjNDVkOGFhZWM0NzQyN2ZjNjIzMGIzMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2MtY3ljLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk2MWZiMWQxMzNlZTc1ZGU0Mjc5NDA5YjcxZTM5N2FkYmU3ZmQ4ODQ0YjgzNWVkY2I1MTJhYjhlZTY4ZWUzNjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2Mtc25kLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgwYzc1YTdjZTBmZGI5MmNmYjJiNzhhNTdhMjBhZmIyZTM4MmVmYjkyNjNhOWJhN2ViYTg1OTgwNWE2NmNlNzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2Mtc25kLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmZjUyYjhjOTM2MDdjYmMxZWJhNDQyN2Q5ZTZjZjcxNDNlMjk3ZmM3YjY5ZmUxOTFjMjEyZWRkNDFjMTkzZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2Mtc25kLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwMjYzYjgxMjg2OWVkZjA4Mzg0NjRiZTg4ZmNiYWUyMDM5OGNhNTVjZWJhMTIzMDBhZjZlMTA1ZDc1ZjQ1YTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvc25kL2Mtc25kLTA0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxZmJlYjNmZTQ2MzNiNGMwMTU4YTVjOGU5NTM2MGNiZGUzMWQxYjI3MDE2ZTE2Njc5ZDhhN2MzNzIwMWE3YzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvdXBkL2MtdXBkLTAxLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2ODlhYjMzMGMzNmNkNDhjMzQ3ZDhhMGFjMzMxZmRkYzVlZjg2MWMxMTAxZmFlZWEyNjdlMzBiMmZjOGY2NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvdXBkL2MtdXBkLTAyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhZjYzOTA3YzRkMGM2YTBhZGE3NDkxNzlmZWVlMDY0MDNhMjAyOThmZjRiM2IwZTEwMjFhNzE0YWE1ZGU0N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvdXBkL2MtdXBkLTAzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhNmYzMDQxMzQyZDUzMzUzYjQwNDMxZTIxM2M3ZWE1NGVmZGE3ZjJlZWEwNDkyYjExODJjYzRhZGVmMWRjNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWNvbnRyYWN0cy0xLjAvZml4dHVyZXMvdmVjdG9yLWNvdmVyYWdlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjExYmQ5YmJmYTg0YjAwMDhiNjM0MDkxOGRjZWE1MDFjOGRhMTc5OTUzMTg3NTBkOWEyMzI2MDBiZTk3ZGI2YjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9IQVJORVNTLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMzk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2Y4N2ZiOWNjNWQ4NmFiMmMzMDY3NjQwYmZiOTViNGRlZGUzOWRkMDJhNjg3OTUwNjhkZWJhMmQ3YTk4NDE2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL1JFQURNRS5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTEwMDk5Yzk0YjVkZWY0MGU5OTk1NTAwZGVlMzU5MmU5YmMzMWFiMDEwMGY0MGY1YmM5YWU0ZmQ4NWEyZjIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfYmx1ZV9kaXJlY3RpdmVfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYThlYWEyZjk2YWNlYTMzYTQ3N2E1ZDg4ZDdlMTE4ZjdmMjJkZmQ0Nzc1MjFkZGM4YjBmMGY4ZTdkYjU5Y2FkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfZG91YmxlXzFlMC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0YzgwZTFmZWVlMGI3NWE4NDA0YzY5MWM5MWNmOWM2YzMzZmE4NmQzZjIzMDUxNmQ2ZDY0ZGZmYzZhYTFiNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9kb3VibGVfbmVnYXRpdmVfemVyby55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNywKICAgICAgICAgICAgICAic2hhMjU2IjogImY2MzI3YzJkZDljMDE3OTc4YzQyZWYzNDQ0ZDIxZGM2NGIzODhjYzk1MDBmOGY3M2ViYWY1YTkzOGQ4NjliMzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9kb3VibGVfb3ZlcmZsb3dfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YWU5MmRlZDdmNmZlMjRlYmZiYjRjZDY0ZWY2MDk2OTU5Yjk5ZmJkYjU0NjAzM2MxODVmZjc3ZWQxNDRjMGY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfZW1wdHlfbGlzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MywKICAgICAgICAgICAgICAic2hhMjU2IjogImM4MjZkNDdmMWNkMTU1MjlkNTdkZmVmMzAyMjQ5OWM3Mjc0YmIyOTQ1ZGQ1ZTJmZTIxZmU2ZTJkNWEzYjQ2MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9lbXB0eV9vYmplY3RfbGlzdF9lbGVtZW50X3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgyNzFiMzgzM2EyYjE1OTZmNmEzNmY3YmI2ZTgxMjI1ZTY5NDIzZTFjMDdkYTNlZDAyNTExODFiOTM3MmU3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2VtcHR5X3BsYWNlaG9sZGVyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM5Y2FlY2YyMDI5Yjg2ZmY5ZWY0OTY5MmVlZjg2ZGI4YjYxY2I3NWQwOWQxZGI4NzcxMmI2MWQ5MDEzNjg5MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2ludGVnZXJfMV92c19kb3VibGVfMV8wLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDc4YmMxOTkxMjQzZjFhNTNjOWIwYjJkOThiNjQxOWIzNGUzOWM4NGQwMDEwN2Q5ZTgwYmQzYzMzZmE2MDM0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2ludmFsaWRfdGhpc19wbGFjZWhvbGRlcl9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzY2E2MDQ4ODYzNzk1NDM1OTA1NGE1ZDUyZGY5MWZjZTE3MzY5ZjBjNjZlNjc3ZDNhNjZmYmNmMTU0OTI3MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9sYXJnZV9pbnRlZ2VyX3F1b3RlZF9leHBsaWNpdF9pbnRlZ2VyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE4MzBjOTYwY2I4NjM0OTEzNTBkYzMzZTM5ODg3MmNkNzJhOGEzY2ZiNTdjNzU5NWNkZjNmZDYzMGE4YTIyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX2xpc3Rfc3VnYXJfZXF1aXZhbGVuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDJjYzc2NmViNWI4ODAxY2FlNTI0ODZlYjMxMzY5NzY5YzY2ZWI0OWVhZTc1YWE1MjEyM2ZmMmJhYTdjZWI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfbWFsZm9ybWVkX2VtcHR5X3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2M4MWIyZmJjZDliN2Q1MDFhYzAzNmFhOWFjNjQ4Nzk2NjY2NzgzNjc4MTRhMDg0OTRmZTg2ZDk1NzdkZGNmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX21peGVkX3JlZmVyZW5jZV9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVmODFkZWRkNTFjZGIzZmM0ZWU3MTNiZTRjZDUwYmMxNmQwNmNiMzVjODA3ODJiZGQyZWIwNjkxYjZmNmNiZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9uZXN0ZWRfbGlzdF9ub3RfZmxhdHRlbmVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGIyNmY3NDVkMmEzMjYyOWE2YWIwNTFlZjZlYmY0N2YzYTM2OWE0ZDYyYjZhOWY0MzVjYTdiMzk2YTZiZTc3MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX251bGxfbGlzdF9lbGVtZW50X3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODY4M2I5YjRhYmRlYWJjNjcwZWEyOTAxMjQ1ZTliZmI4MGM5Mjc0MjhjOWJhNGVmZjBmYzI3NDU4OWZjY2UxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX29iamVjdF9maWVsZF9udWxsX3JlbW92YWwueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YTg3ODc2YzY0NDZmZTczYjFjOWJkNTE3ZTFhMjRhZDlkMmVkZDM4NjE4NDE3ODQ4NDkxY2JmNDM1ZTQwM2VkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfcGF5bG9hZF9vbmx5X3NjYWxhcl90eXBlZF9pZGVudGl0eS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI2YjYyNmRjOTU4NmRjMjJmZDFkZjE1MTEyYjYyYzBiOTNkMWJjNjYzYmVmYTk4NWY1NGRkYzg4ODZmYzk2MWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9wbGFjZWhvbGRlcl9jaGFuZ2VzX2xpc3RfaWRlbnRpdHkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3N2IxZWEyNzk0MGUyM2YxZGJkYzJhNTk1ZTBhODAzNjE4NzdlNTY0NGU4OGQwMjU0YmU1NWQ1NmZjMjIzNGM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfcGxhaW5fYmx1ZWlkX3ZhbGlkYXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMjEzNzdiODAyYWIyMTJiMjNlNzBmNTMwNmYwMWZkOGQ2ZmFiNzE1YTg3ODZiMjIxZjY5MDU3NTQwNzhhYjg3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfcG9zX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjM4MGU4ZmI4YmZjZDA3MzdkNTNhMDhiYjllMDUxZmQwMDFlMjliZDQyMjRlZTU5MGMwOGVhMjAyMGQyZTljYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3ByZXZpb3VzX2ludmFsaWRfYmx1ZWlkX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTQ4ZjBlZWRmYmZjMDc0N2MxYmExMzhlMDM5ZDVmZjA1MDIyYzc2NjQzYmUwNzg2MTk0Y2UxNmNmZjJiYzY4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3ByaW1pdGl2ZV9pbmZlcmVuY2VfYWxsX2ZvdXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OTdhNTYxODM4OTc4ODU4MjFkZGFmNjk2ZDg0MDg1OGUzYTNkOWYwMTk5ZmVlM2FlYTBiOTBmZGI5MjRhYjVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0JfcmVwbGFjZV9yZWplY3RlZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkYjBjMGZiODEyN2MyOTU0MjRkMTBhOWQ3NmU0MDQzMjUyNGQ4NGE5NGQxNTFmNTEwMzhkN2YzODg3MTU4MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9yb290X2VtcHR5X29iamVjdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwNDNlODQzZWQ4ZTk4YzEyYzI3MDMzYzA0ZTY0MGRiYTNmZDM5M2I4ZDVjYWFiY2FjMjkxN2JhZWRiNDk3MDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl9yb290X2xpc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTA4Y2ViYTliY2MzZDI1MjhiMDVlY2ZhNmIwZWYzMGI0ZmE1MGNhNDBhY2NjMTNlMTU2MmNiYTM5ZWVhMTA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0Jfcm9vdF9udWxsX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTU3ODg1MTZjNzNkY2IwMTAzNzEyYjU0MzRlMjQyNmZmMTQ5ZjQ3YjdjNGVkZjk0OWI3ZTcwODlkNDA4MzZmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3Jvb3RfcHVyZV9yZWZlcmVuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMmNlMjM1OTFhYTVkYWVjMDEwMDM2MjBhYTVlNTViN2RlMDdhMGIyZWU2NTM4NGQ2ZmIwYTIxMmM4YmU0MDljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0Jfcm9vdF9zY2FsYXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNWE3ZmU5NGZkODg3YmZhNTk0MzAxMGQwZTI2Y2FhNmJmOWZhN2QzMmE0ZWQ4OTQyZGRkZDJlZjM3MzM0ZWNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvYmx1ZWlkL0Jfc2NhbGFyX3N1Z2FyX2VxdWl2YWxlbmNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTAyNWE0YmEwYzgzODM3MzczNTJkOTk0ZTI4ODRiOGJkOTQ2OTIyODAyMGYyMGUzMzg4ZmE2MDM1NjQ3OTNkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2JsdWVpZC9CX3R5cGVfYWxpYXNfcmVqZWN0ZWRfaW5fZGlyZWN0X2JsdWVpZF9pbnB1dC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQwZTgxYmRlMTIxZjNhODMzMmUxNTM3NTczMTEyOTYzYmI1YTdlNmZmN2NmNTIyYjJhN2FmMDJiMWRiNjBmNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9ibHVlaWQvQl91bnF1b3RlZF9sYXJnZV9pbnRlZ2VyX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2EwNjRjMjhkOWZiM2E1ZTllNDM4ZmYwZTM1OGFlYzQ2NWY3ZDUyYzBkNmU0ZTk2NzRjNWYwZDMzZTQ5ZWZmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2NpcmN1bGFyL0NfY2lyY3VsYXJfcmVmZXJlbmNlX3NldF9pZHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjhlNDAzMmI3NDUwMmVkMzY1YjNmMWYyYTk0YzAyZDE3MjQ0N2I4M2Q2ZmExZDMwNzE1NjM3YjZiYzJiMTVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvY2lyY3VsYXIvQ19kdXBsaWNhdGVfcHJlbGltaW5hcnlfaWRzX2RldGVybWluaXN0aWNfb3JfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjNiMjI5ZTdlMjJhYTE5ZWE5NTVhMjU1OGNmZWEzN2JjMjc3Yjk3OGY0NzNlN2Q1ZWI1ZTlhMGE0MWE5MGQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvY2lyY3VsYXIvQ190aGlzX3BsYWNlaG9sZGVyX3JlamVjdGVkX291dHNpZGVfY3ljbGljX2FwaS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzMTY3MzgyN2Q2MTVhOGFjOTE5YjE5MjhlYmE3YTRlOWY3ZDc5YjRjMzM5MmNiMTg0MzBiYjgxODAyMzY2NmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9jaXJjdWxhci9DX3RocmVlX2RvY3VtZW50X2N5Y2xlX3N0YWJsZV9vcmRlci55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxMTY3OGUxZTBlOWQ4Y2IxNTUxNjg1MDk1NDIyNTU5Y2YwMTJiNzE2MTY0MTAzOTNiZjhmZDMxNzI1NTllOWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9jaXJjdWxhci9DX3plcm9fYmx1ZWlkX3JlamVjdGVkX2luX2ZpbmFsX2lucHV0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTkwNTU2ZmI5Mjc4ZDJjYWIwNWZmNWYyMTczOTJlNGMwOWYxNWM5MzgxMzhjZWUzNzlhYWU0ZjU4MzAyZjdjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2NpcmN1bGFyL0Zfb3BhcXVlX2N5Y2xpY19tZW1iZXJfZnJhZ21lbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYjhkNGZjM2E3MjlkYjM4YTM2ZWY3ODc1MWJhN2I0NWZlNDk1OTg3ZmFkMThkNDJiYWEyMWU2NmY2Yzc4MjBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvZml4dHVyZS1zY2hlbWEueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTU3ZGJiNWNkZGFkODEyY2U3ZTJhMjJjM2QzMDAyMDdkZDMyOTdmODIxMzM0YTE4NGI4OWJhMzZiNDM2YjU2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2xpbWl0ZWQvRl9pbmxpbmVfcmVmZXJlbmNlX3BhcnRpYWxfZXF1aXZhbGVuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNmYzNTRmZjMzNzY0Y2ZmZmJlMjBmMjI3ODFlMjAyNDgxYTNhZjQ5YzIzNDMwMzU0NTljYmY0NDQwMmZmOTJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9GX3ByZWZldGNoX2RvZXNfbm90X2NoYW5nZV9zZW1hbnRpY19yZXN1bHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTU2MTE5M2JiNzEyYTNlNjgxZDk5MTlhNjk0MzcwZmNlMTgyOTJjYWI1MmYwYzhiZWYzOTAwYTQ0NTM4M2MxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9GX3Jvb3RfcmVmZXJlbmNlX2RlbWFuZGVkX3BhdGhfb25seS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5YzMzZThiZGM1YWI0MzFhMDJjYmI2M2YxN2VjOWI0M2ZhMTBjYzViYjczMzYwMmYyMmY0NzI4Mjc3Zjk5ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL0ZfdW5yZWxhdGVkX21pc3NpbmdfcmVmZXJlbmNlX2RvZXNfbm90X2Jsb2NrLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDBiMTJkMzdlMGY3NjhlZjg5YzMyNWY0YjNiMGI2NGY5YTNhM2NjNmRlMzAyOWM4ZWJhYTQ5MDljNzBkNDIxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2xpbWl0ZWQvUl9pbmNvbXBsZXRlX2Nhbm5vdF9jYW5vbmljYWxpemUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YWU3NTNiNTY3NGFhYTIyMGVhMGZkYjBmM2UxZWU0YjczM2EyOGY1OGZiNTk5NTRlOWM0ZTQ3NjRmZTQ0ZjQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9SX2xpbWl0X2RvZXNfbm90X3Byb3ZlX2Fic2VuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOWNiNTNhYTAxNzRkZWY0ODIxYzQ5NjA4N2VmMTEzM2VlMWI2OGM4MmEzZmNlZmYwOGIwZTYyYmNiZGFiYTJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9SX2xpbWl0ZWRfcmVzb2x1dGlvbl9lcXVhbHNfY29tcGxldGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Zjk0YmVkMTlmYmQzNzE2MGE3YjZiNDkzMjQxMWIwZWZhODdjZjIwMTc3OTZhZGQyZmU3YWFjMjViMWM0NjdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9SX3Byb3ZpZGVyX3VuYXZhaWxhYmxlX2RvZXNfbm90X3Byb3ZlX2Fic2VuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMGQwNmVlN2JjMjA1ODUzZDU1YmRlMTc2NzI4MGNjOWNjZDU5ZDFmNGU0M2M3YTY4OTRlYzVkYTI3YTBjNTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvbGltaXRlZC9SX3JlZmVyZW5jZV9iYWNrZWRfY29udHJhY3RzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzMxZmEyYWJiYWI1NzAwMmYxZjIyNjU2ZGIzYjNkNjdkZmZhODEzYzBkMWQ2NTMyNGY0Yjc1YzZlNzU0NTY1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2xpbWl0ZWQvUl9yZWZlcmVuY2VfYmFja2VkX3NjaGVtYS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImMxYzU3M2Y0Y2M3OWU5YzJiMzliN2VlYWRjYTIzYmY1ZWVjZmJkMjEzOTcxZGM5NTYxY2E3YWFkYWM3MzJhYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9saW1pdGVkL1JfcmVmZXJlbmNlX3dyYXBwZXJfbm90X3NlbWFudGljX2NoaWxkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTUxY2JkOTFlYjI4MTc3NjZkMzhmMDExODU2MTRhZjEwNGYwMGQyYjAzNmFkN2E1ZmRhNjJlOWFlYjc5MTBkMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL2xpbnQvTF9ub19wcm9maWxlX2VyYV9sYW5ndWFnZV9jb25mb3JtYW5jZV90ZXJtcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImMxMzY0YzdkMDQwMTZmNWFkMzEyYWNhZmQ0MmZhYjBiM2M0OGQyMGMzNzY5NGM2NDQyZmY0MjQyZDFhNmY5OTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NzM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGM0YmFkN2VjYjAxNmI5MmQwNDZiNWUxYWU5NjJlYTJlY2JjNjNkZTkyMDgzMjI0MjZmOWYwYjJjZjg2ZjM5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX2Fic2VudF9hcHBsaWVzX2Jhc2VsaW5lLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjNmNzQ5MzliMWU1MWMyNjM3Y2ZiMTNjZTllYzc4MDM0YWM5MmNkNzJhYWM0Nzk3MWRjNzMwYzU3ZTRhMWY4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX2J1aWx0aW5fYWxpYXNfb3ZlcnJpZGVfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YmQzMjM0YTc5YjcxMjdiOGQ2NjM5MDUxNmRkNWI0YzJlNzNhNGVlMWQxYzQ4MDUxNzE4ZmIyZTZhNWYxZWU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfYnVpbHRpbl9hbGlhc19zYW1lX2FsbG93ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMjFmNGJhZmNhMmQ3MzcyMzFjOThmNjgwZDEzNzJhMDNhYjAxZjNlYTExM2VkMzM0YWEzM2EwYjliOGNmY2I5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfZW1wdHlfZGlyZWN0aXZlX2VxdWFsc19hYnNlbnQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZWQ4YjljNDU2Y2Q5YjZjY2M3MDBmZWEwYjkyMTQ0ZmQ5MjY5YTRkMjk3ZTEyMjI2NGYwYmQ2OWU0ODEyMGFlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfaW1wb3J0c19vbmx5X3R5cGVfcG9zaXRpb25zLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTM1MWJkYThjNjI1NTkxOTk2ZDU1Mzk4NmJlMjRmZDkzYmFiNjA4YzY4MTZjYmU5MWZhN2I5NGNkNzI1NzEyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX2lubGluZV9pbXBvcnRzX2FuZF90cmFuc2Zvcm1hdGlvbnMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxM2NmYTk5MWNmY2VhYWE2MGEyZTg3YTZiZTBkMjUyMWM5OWUzODg4MTUwNjBiZWRhYzRhZjdiNDIzYzlhY2NmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfbGVnYWN5X2l0ZW1zX2ZpZWxkX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDFkZGE2Zjk0YTc1MjE0MmYyZTM1YTNlYjgwYzdlMjY3MmQ3MGZkNTA2N2RjYTQxY2YxMDUyODAzZWM2MTMzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX25lc3RlZF9kaXJlY3RpdmVfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NmI2ODEzN2NhNjA2YjBjMjg3Y2M4NWZjMTVlOGEwYTEyOTI1MzRkMTA5NWQzNDZmODU2Y2Y3ODdjOGE2NzUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfcHJlcHJvY2Vzc2luZ19pZGVtcG90ZW50LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmRlNzc4NGU4NTkyNWFmM2UwZGNiM2YzZDFmZDg0ODk2OGZmZTBhNDUwODFlMjJmYmEyZTgyMTY2ZTQzZWQ5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3Byb2ZpbGVfZmllbGRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZmE1OGI2YjEzNjIwODhkMTIyMzlhZjE0Mzg5ZTlmN2IyZmU3NWU0YzQ4Mzc1MzZiN2Q3NzM5MTk3NTA4MWE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfcmVmZXJlbmNlX2JhY2tlZF9jb21wb25lbnRzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjRkNDM0YTZlMDU0ZmU0ZTM3Y2EzM2FlZTJlNWYxNzNkMWMzZDhjMjBiNmZiZDk1NWQxMjlhYjEyYmQ4OTFiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3JlZmVyZW5jZV9kaXJlY3RpdmVfZXF1aXZhbGVudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4MjY1MDUzZmI2Y2E5OTFmODE5M2JlOTVlMGE2MjM4NjA5NDY5MGExMmEzZGFjNDE3ZDk0MjA1MzUyMTM0MDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9yZWZlcmVuY2VfaW52YWxpZF9ldmlkZW5jZS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZlZjRjMzBiNzIzYjM0ZWI1YTZmNWZlNDhmZDJjZDNhODgzMmEwZDNkOWUxYzU5ZTMzOTc0MjczNGIzNWMyMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL1JfYmx1ZV9zdHJpbmdfYWxpYXNfcmVzb2x2ZXNfZXhhY3RfZGlyZWN0aXZlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmQ0NjViNmJjZGZiMWUxYmFjMDgyMjE4OTAzYjFiZDZhZDYyNTE0YTA5OGFkY2NiMzRkNGE3NmRlZDU5NjIxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3RyYW5zZm9ybV9pbnRyb2R1Y2VzX2JsdWVfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzY0YWE1ZTAyMjUwNTk2ZDMxZWU1OTk0MmVmYjczOWY1ZTM0YmYxOWUwOTExYjkwMzY5NTRkOWRkOWZkNDJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdHJhbnNmb3JtYXRpb25faW5zdGFuY2VfcmVmZXJlbmNlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTk0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjdjZTIzOTdlMzM1MmUwMTFmMzMzMDc3NjkzNDk3NDE2OGRiMDZkYjNjYjQwZThlYTYzOTlhZjMwNGE5ZmZkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3RyYW5zZm9ybWF0aW9uX3R5cGVfYWxpYXNfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZDllZjU1YmIzMTJkNjg0OGMzNzQ0NWM3ODhmZWMzYjhlNDQ1MzllNmNkZDA4NmZkMTA3YTY2MGViYWQ3ZTcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9SX2JsdWVfdHJhbnNmb3JtYXRpb25zX2RlY2xhcmVkX29yZGVyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTE2MTcyZmYyNDAzN2YyNTFjZWMwZGJkNzUzNzZkOTIyY2FkZjk4OTkyZWU0NzJmZDg4MzViNjI1ZmU4NDNjZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3RyYW5zZm9ybWF0aW9uc19yZXZlcnNlX29yZGVyLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTRlYTBmZWQxOGVhN2MzODUwN2I0NmY1Mjg3YTkzNWUzY2YxMzdmMzIwNDI2NDdlZjQ0MTRjNjc0Yjk4N2UzMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3VuYm91bmRfc3RyaW5nX2FsaWFzX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWFlYjNhNzI1YjhlNjdhYjcxNzFmZjJkYzkzZjg4OTUyYjU5YmJiNTM1ZjE5YTkyZmMyYTUwNmNmZmE1MDBiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3Vuc3VwcG9ydGVkX3RyYW5zZm9ybWF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDcwNjliNjQ4ZDNmOWM0ZDA1NzhiYmUxYzU0OWJiYmQ2OGE1YjhjZDRhNDc1ZjE4OTJhYWI4YzY4Yjc1OGVmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvUl9ibHVlX3VudXNlZF9pbXBvcnRfbm9fZWZmZWN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWRiOGM3NjAzNjk0ZGU0NDZjM2E4YmVmYWY0NDk2M2ZjZTJkYTU3OTk4Y2E5NWRiNWUzYzQ2MmM5NjFmYWZhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvcmVnaXN0cnkvQXBwZW5kUm9vdFRleHRUcmFuc2Zvcm1hdGlvbi5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4ZjAyZWMzMzZhMzVlNTQzODM4YzY5ZGU5NWFhOTU0MDc5MTZjOTUzYjJjZDZjMzc0ZWFiMTcwYzM3YWI5MTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL3JlZ2lzdHJ5L0hBUk5FU1MubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRkMTA0YjcwNDM3NDdkMzgxNWU4YTIxMTM1OGIzYmIyNTY5YzRmZDEyOTcyMGZhODBiZDY0ZWIyMmVhODQyNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcmVwcm9jZXNzaW5nL3JlZ2lzdHJ5L1JlbmFtZVJvb3RGaWVsZFRyYW5zZm9ybWF0aW9uLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzdhM2ZjNWVkYWNjNDVhYjg0NTZlNGEwNDE0YTExZjIyNDM0ZGE4ZThkODA2MzIzNTRmMzNjMTAxMDE3M2VhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3ByZXByb2Nlc3NpbmcvcmVnaXN0cnkvU2V0Um9vdEZpZWxkVHJhbnNmb3JtYXRpb24uYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOTc3MzNhODU4MTJhNDg0NWNkN2Y2OTljZjVmNzk4YjE4MzU5ZjQ1OTg0ZDA2NGM4YWY2ZTVkZjg0MTIxYzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJlcHJvY2Vzc2luZy9yZWdpc3RyeS9tYW5pZmVzdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3MjI5NTAwMWRjZTUwODkzZGUyODNjODhkZjRlZGI2ODhiNDBiNjk1ODczZGQ4MTQzODU3M2E1YWI3YmM0YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2FsbF9sYW5ndWFnZV92ZWN0b3JzX3Bhc3MueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZmE5YjFlNzhhZGE0Yzk3ODFiOTQ3ZmQxYTU0NmQ0YWQyZDYzNTUyNjg2NWZlYWNkYjA3NjhkMzNlMmM1OGY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9jb2xsYXBzZV9kb2VzX25vdF9wcm9kdWNlX21peGVkX2JsdWVpZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiZmJmNWYyZmVmODUyYzZlNGEzOThkNjYwMGNjNjdiNGNlM2Y0MGU4OWY4YjhmZGMzNzA1ZDU1ZDMwN2YwY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2NvbGxhcHNlX25lc3RlZF9zdWJ0cmVlX3ByZXNlcnZlc19ub2RlX2JsdWVpZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkMzI1NGVhNzkzNzllZTdjYTJjMTFkYjNkYjJlZTQ5ODY5NDZjNDkxNzI2YTAyZWRhYTJhMjYxNDljNDVlZjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2NvbGxhcHNlX3ByZXNlcnZlc19ub2RlX2JsdWVpZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJiODc3NGRiMzdlOWZlOThmM2JlMDQzZWYxMjk4NTcyMjgwODA3MmJjMDk5OThmYzFkNDVjNzIwN2UyYTVkYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2N5Y2xpY19tZW1iZXJfcmVxdWlyZXNfc2V0X2NvbnRleHQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTVkY2E4M2I0NTM2MmUwOTRkNmE1ZDdiYzIwNzQzZjAxYWNkOGFjNjAxNzMyNTUxOGQwZjdhYWJkZWZjNDQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9kaXJlY3RfbGlzdF92ZXJpZmljYXRpb25fd2l0aG91dF9lbGVtZW50cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY3MmE4ZDUzNzYxYjI5ZTI5MTM5YjdhYzQ5YjZjNDEyODczNjNiMDVjMzdjMGI4MTQzMDkxZWMzYzI4MzAwZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX2V4YWN0X2dyYXBoX2ZyYWdtZW50c19jYW5vbmljYWxfb3JkZXIueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTM0ZWI2ODFkM2YxM2QyZGVmOTNiODRlYWMyZDM0Y2IwZjg3OTVhY2JkZTQ5NzY1ODEwNTNiMzlhNDYyYzI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9leGFjdF9ncmFwaF9mcmFnbWVudHNfcm91bmR0cmlwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWIzZWU5NTk2M2E0NmIyNmFlYjBlY2E1YTUzMGUzOWI5ODk1YThjMjYzNWY1ODVkZDczZTZmY2YzZTg0MjVmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfZXhwYW5kX21pc3NpbmdfbmVzdGVkX2NvbnRlbnRfZmFpbHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NGM0YzBhYmFkMzJiMzljM2M5OGQxYmRlNTlmNjY4Zjc4ZjAzZmRiOTk4N2Y0ZmJmMThjZmNjMWVkOTQ5ZjE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9leHBhbmRfbmVzdGVkX3JlZmVyZW5jZV9wcmVzZXJ2ZXNfbm9kZV9ibHVlaWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMzA3Y2YwMTY3OGVmMzkzMWI2YTM2YWEzZDYxMWM2NDgxOGY1NjNlMzc0MjBkMDNhNjhkZDJkMmFkNjRkZmUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9leHBhbmRfcHJlc2VydmVzX25vZGVfYmx1ZWlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjAxNTRlM2VmZmU4ZGIxZmM3NmFmOGY0MDQ0YmJmOWQwMThiYmM3NDk0YzNmNWNhNzgyNGEyN2NlNzI0MzA1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfZXhwYW5kX3dyb25nX25lc3RlZF9wcm92aWRlcl9jb250ZW50X2ZhaWxzLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM3OGYzMTZhZjI2YjJjNzI2Y2I1ZGIyOGNlNGZjNDY2NzAzNmE2NTk4NzA3MDMyYTJiNmEwZDlhYjYwYzdhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Byb3ZpZGVyL0ZfbGlzdF9wcmVmaXhfYW5jaG9yX25vdF9kaXJlY3RfbWFuaWZlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTFiNjQ2OWNmOGE3ODhiNGE5NDA1YTY5OTlkYjU4Njk1MDIwOGFkMDhjNmVkNTNlNDRkNWQxZTQ5NWU1OWI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9vbWl0dGVkX2RpcmVjdF9rZXlfY2Fubm90X3Byb3ZlX2Fic2VuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMmFlYzU3OTc3ZjI3NDRjM2NiMzBlYTA2OWJiZTc3NGQ5MGYxOTJhYTAyMDkyNTczMjljNWFiNzk2Mzg1NDAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9wcm92aWRlcl9taXNzaW5nX2NvbnRlbnRfZmFpbHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlODBhMWUwNDhjOTRjYWNmZTMyNmE3ZDAzNjkyOWIwODI0ZTNlOWY2OWYxZDdmNjg3ZTYwZTI1YjJiMDdmYjIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9wcm92aWRlcl93cm9uZ19ibHVlaWRfcmVqZWN0ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTY1MzIwODgyOTRkMTIyZDg1NGQ1YzFkMWYyMWEzZGMwZTk3MGQwNjM5Yjk5YmU2MTliYzcwODRiMWMyY2VhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcHJvdmlkZXIvRl9zZWxlY3RlZF9leHBhbmRfY29sbGFwc2Vfcm91bmRfdHJpcC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlOGNkNjg2OGUzZDA4NzIyZjNlZDVmNWVlNTAxMDFmNWQ4ZDRhMzIxNGViYjRjODZmYWUwZDI3MGNhNjRiZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9wcm92aWRlci9GX3NvdXJjZV9wcm92aWRlcl9yZXF1aXJlc19kZWNsYXJlZF9tb2RlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjVmZDZlN2FhM2UxNWJjZThlZWU0NTg3ZWUzMDU0ZDBjYTRkZjY0Mjg3MGQyMDc1OGY1YmY5ZGJmM2IyMWExMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3JlZ2lzdHJ5L2NoYW5naW5nQ29yZVR5cGVEZXNjcmlwdGlvbkNoYW5nZXNCbHVlSWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YTU1OGI4ZmUxNWYyOWM0MDllNDMxNGYyY2YzYTA4NmEyNTNjMzIxNjkzOTZiMjYxNWFiOGMwZTVmYjVmMjIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVnaXN0cnkvY29yZVJlZ2lzdHJ5Qm9vbGVhbk5vZGVIYXNoZXNUb1B1Ymxpc2hlZEJsdWVJZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0YTUzOWNhZWJmN2NlYjdkNWFiNWMyMDVjNWZmYzVjNjQwZTQ1MmI2NzE0OTU3ZjkyZDhhZmZhZTllODg2ZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZWdpc3RyeS9jb3JlUmVnaXN0cnlEaWN0aW9uYXJ5Tm9kZUhhc2hlc1RvUHVibGlzaGVkQmx1ZUlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzA0ZjliY2FhNGVlYmFjYmEyNjMyYzhjMzg3NWRlNTBmMWNkNjQwOWIzODk1MGQyZGU2MWI1ZDAzMTQ1MTJhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3JlZ2lzdHJ5L2NvcmVSZWdpc3RyeURvdWJsZU5vZGVIYXNoZXNUb1B1Ymxpc2hlZEJsdWVJZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2OWUzZWEzZGZlNWRmZGMzZjJlYmM0ZTI4ZmRlYWEyN2NlNmRkN2ZjNjYxOGVmZmQ2YTFiNzg2ODMxZDg1YjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZWdpc3RyeS9jb3JlUmVnaXN0cnlJbnRlZ2VyTm9kZUhhc2hlc1RvUHVibGlzaGVkQmx1ZUlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGRlY2YwNDA0OGQwMmY5OTUzMWM0MDNlZmEyMDM1MzdhNWM3MTk2NWY2MWY3YWQ5NjBkZjNhNDlmMTVlMDNhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3JlZ2lzdHJ5L2NvcmVSZWdpc3RyeUxpc3ROb2RlSGFzaGVzVG9QdWJsaXNoZWRCbHVlSWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNDA3ODVjYzU1NTY2NDY1MmJjOTI4MThlMzc4ZjU5OTI0Mjg4NmI1M2FiZTg0ZmVmZjJmZmRmMjM5NGE3MzViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVnaXN0cnkvY29yZVJlZ2lzdHJ5VGV4dE5vZGVIYXNoZXNUb1B1Ymxpc2hlZEJsdWVJZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2NmNjNjZhZGYwMWM2MzlkMzExOGViZmRhZWY4MWI4MWQ2MzE1ZDllZDAyYzBmMGQ1ZmJmM2Q3YjBmZDhhNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXByZXNlbnRhdGlvbi9CX2RpcmVjdF9jaGlsZF9yZWZlcmVuY2VfZXF1aXZhbGVuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YzdjZDBlNWYzM2NlYzhjOTcwMWQzY2Q0NThkYTMzMjJlNDY3MDA0YTBkYTBjNTQ4ZGJhYjVjMzE2Y2YwZGJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVwcmVzZW50YXRpb24vRl9kaXJlY3Rfbm9kZV92ZXJpZmljYXRpb25fd2l0aG91dF9kZXNjZW5kYW50cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5YmU5MGZkNGQzOTA4NzAyMWQzYTUxZmJmNTNhOTYzMDQ1ZjY3M2MwZTRhNTZjNGMwZWUyOGM3NDZjZGJjNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2FwcGVuZF9jYW5vbmljYWxpemF0aW9uX2ZpbmFsX3BheWxvYWRfdGhyZWVfaXRlbXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YWEwMGMwODdlY2Y0OGI5MzNmYTc0YTYyYzVlN2YyYjlmY2Q5MTAxY2EwNmE0YTUyZjY2ZWQxZTVjMWRiYWFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9hcHBlbmRfbWluaW1pemVkX3ByZXZpb3VzX3JvdW5kX3RyaXAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzY4NGY2MWE5MTcxMGFiN2ViZDJiYzQyMDhmMmE1MGYzMTRkYmJmY2Q3NWEzZGRiOTdiZDJkOTc0NTg2YTYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9hcHBlbmRfb25seV9yZWplY3RzX3Bvcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0M2E5OTM1N2QzZDJlNmE0OTVkNTk0ODFhZDVjMDAxNmM4OGIxYWIwODZiMDY5ZDA5MjlmNWVkNTYzNjBmNGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2JsdWVfaW1wb3J0cy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI0MDk0ZTdlNDI2NDA3YzgxMDQ4YTg5NjIyYWM3NTU0OGNkYWRmMzcyYjlhOTk3Y2Y1NzQ2ZWI0ZjJmYzNjZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2JsdWVfaW1wb3J0c190eXBlX2l0ZW1UeXBlX2tleVR5cGVfdmFsdWVUeXBlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzg5OWQ4NjgxYjQzYzNlY2QzMjUwMjA5NzM0Nzg5ZjZhYjM0NmM4M2VhNTlhMzJhYzk0MWIzNjZkMWU1N2NmMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfY2Fub25pY2FsX292ZXJsYXlfbm9fcHJldmlvdXNfbm9fcG9zLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQyYzRhMzkxMjBiMmZhYTU4N2Y4Mjg2MjRjNGY2MTJjYjhhYjNhMDdmMmUxM2NlOGM5YmM1YWJjYjQyZmQxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfY2Fub25pY2FsaXphdGlvbl9kZXRlcm1pbmlzdGljX2Zvcl9zYW1lX3Jlc29sdmVkX3ZpZXcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTdmMTcwMWQ4YTQ1YWU1OTA0ZjBkYTM4MmE1OGMyMDI0NjIzOGMyMzUwMzFkMzY3YzRlNThiY2Y3NThjOWYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9jaGlsZF9maWVsZF9sYWJlbHNfbWF0ZXJpYWxpemVfdW50aWxfb3ZlcnJpZGRlbi55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyN2YzNzAwYTAwYTUwYjYzNDZiMDU1YTEzMTAxYjZmYzU3MjFjOTlhNDYwMjJkY2YyNGFiN2NjZThmMzFiZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2NvbnRlbnRfYmx1ZWlkX2lzX2Nhbm9uaWNhbF9ub2RlX2JsdWVpZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA0MGE4Nzc3ZDRmODAwZjgzNzU5ZGFjNTk4NDk3MDg1MjUxOGVhMGMzMGUyNzI5MGYwYjcyZmJmMjhhNGNhYjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2NvbnRyYWN0c19jYW5vbmljYWxpemF0aW9uX2RldGVybWluaXN0aWMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjJjODVmMjhhYzdlNjI2ZGY4NGYzZDhmNTEyMjU0OWViMmJlOTg0NzA3MDI4NzllMzRhYTVhOWU2YThlOGMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9jb250cmFjdHNfbWVyZ2VfYXNfY29udGVudC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyZjMxMWY3YmNlNGJiMjkzYjNlZDQxYjVkMWZjMTQ4NDAzZTViOTQzNzM4ODNkOGQwYjU4NjA5OGIzNjVjN2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2NvcmVfdHlwZV9jb21wYXRpYmlsaXR5X25vbWluYWxfYnlfYmx1ZWlkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGFkNzU5ZWUyMWZkZTY2MzBhOTI5MTE5YTBjMjNkMWE2MTUyNDRhNGYzMjEyZDVhODJmZGU2Zjg5Y2NkNmI0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfZGVmYXVsdF9wb3NpdGlvbmFsX3BvbGljeS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFiYzM4MjQ2YzZiMTc2MDBmN2QwYWRhY2MxMzJjOWQ2ZDI2NzczNjMxMTE1MTAyMGM4NDc1ODczMWI3YzZhMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2RpY3Rpb25hcnlfa2V5X2Nhbm9uaWNhbGl6YXRpb24ueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMjY4OTEzNWQ0NjNjZDAzYjhjYTI4Yzc5ZDhmODA1YWYzNDJhZDA3MzE3Nzg4NmQ2MWIyNTQ0YTkyOGRhNzliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9lbnVtX2ludGVnZXJfdnNfZG91YmxlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzJjOTY1YTA1NjM5YTBhZjFjMDRjNGU5YjZhOTQxY2RiMDljNDFjYzdjYTc0OGVkNTE0OGQ3YTc2ZDY3MWY5MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfZml4ZWRfdmFsdWVfY29uZmxpY3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTZlZWMzNmI1NzA3ZTA5Y2JjMDc1M2FiNjIxNjBhODc1ZWIwNTFiNmM0MGVmOWFkYmVjMDhiZjVhNGE0NWM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9pbmhlcml0ZWRfYXBwZW5kX29ubHlfcG9saWN5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjQwY2ExZGNkMDgyY2VhOTk5NzM0YWI1YzYzYjBkNjI2Yjk4NzNjZGQwMGQwZDllMzBiM2YzNGZjOTgyY2QzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfaW5oZXJpdGVkX2ludGVnZXJfbGFyZ2VfdGV4dC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1MTNkOTc3MzYzOWJiNDU0ODMwZDg3NDJjOTMxNGEyZTRjN2Y3MDlhNzU0NjE2YTZiOGNhMzM3ZmU5ZDAyMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX2luaGVyaXRlZF9pdGVtX3R5cGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZTFhMzlmMmU0YWVlYWRlZWQxY2JiODE5NTE5MmY5YWE2OGJlNDMyNWNmNjU5OTVhZDI4ZjI4MjE3MDQ3ODAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9pbmhlcml0ZWRfa2V5VHlwZV92YWx1ZVR5cGUueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzk4YmRjNGUyZDNlZGMwMDY5ZWM1ZDY2MjAwNDk5N2U4YjVlMWQzYWZjYjY4MDJjNzk2ODc2NTQxMWM2Y2MzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9pbnN0YW5jZV9maWVsZF9rZXB0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTViZjIzOTRkMTNlNDcxNmE5ZTk3MDI0NDc3MTA5N2Y3Nzc2MmNmZjEzZjgyNzhmY2JkMmRjNmExMzA0OTcyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfbGFiZWxfb3ZlcnJpZGVfcnVsZXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYTZiMTUxNDM2ZjRmMzg3NWQyNTQ3MTM2OWI3OWJkM2EwNjNjMzE4NDA5ZjUxNzJkOGIyZDg1Y2NkZDNjZWFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9sYWJlbHNfbWF0Y2hlcl9uZXV0cmFsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDQzM2JhYzQ3OTAyYWUyYjQ1ZjlmODdhNjk3NTNhOTVjYWMwOWNjYzdmOTlhOTYxNmNiZDJmOWQ3NDg2NWFhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfbWluZmllbGRzX2NvdW50c19vcmRpbmFyeV9maWVsZHMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTlmNGJmMjI5ZWQyZDZhZjEwOTgyYTg5NWY4YTAyZDg4NmNkODBiZmI3NjhkODI4ZjAwMjhmN2IwNmYzZjRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9taW5pbWl6ZWRfb3ZlcmxheV9yb3VuZF90cmlwLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzYzYjExOGFmZTExYjExMWQyYjRkYTZmZWVjMDk0NTcyMmRkMjBjNjc5ZWMyMGI5YTlhNDYzN2VkMWQyN2ZjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfbm9uY2Fub25pY2FsX2luaGVyaXRlZF9pbnRlZ2VyX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmM4NmFiNTNlNjgwM2QxZmQ2YzA5NjlmZjcyMjA1OWJjZTY0ZDEzMjdmZjFmYjc0NTY4ZGY2NjVkYWUyY2ViNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcG9zaXRpb25hbF9jYW5vbmljYWxfZmluYWxfcGF5bG9hZC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkMjc5MDVkYjhiMzcxNjgxZjNlNmI0ZWE4ODM5OTVjYmY5NzJmNzkzODllYjViNmJkODcxMDI0ZjUzY2M0MWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3Bvc2l0aW9uYWxfbWluaW1pemVkX3JvdW5kX3RyaXAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzY4NjE4ZjVlZWIzMmM4MGQ4MTA4YjMzOTk5MGQ5OTBiYjExZTA3NDEyZDU5ZDAzZDdhMmNiYmNmZWQ1MDI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9wb3NpdGlvbmFsX3Jlb3JkZXJfb3JfcmVtb3ZlX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWQ0N2JlYWJmOWNhYWFiYzc5ODk3OWVkMTBkMjNlM2Y2ZWY5ZGU1MThhMTBmYjMxYWE4YjdjNGQ0NzEzYWE0NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcHJldmlvdXNfYW5jaG9yX21pc21hdGNoLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzdiZjA0ZWE3NDA4MDM5MmE5YzBjOWVkNWYxNTI5MGU2ODI1MmI1Nzc3YjQ4ZThhOGEyYjQ2Yzk4OWFmMzRmNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcHJvdmlkZXJfcmVmZXJlbmNlX2Nhbm9uaWNhbGl6ZXNfYmFjay55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIyYTkwNGUwMDJiMDY0NjlmM2Y1Yjg3ZjUxNDMyNTRiNWEwMjQ3ZjgyNThiYjZiNmM0YjJlZDBlMzYzYzM2MGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3Byb3ZpZGVyX3JlZmVyZW5jZV93aXRoX292ZXJsYXlfa2VlcHNfb3ZlcmxheS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImI3Njk0MzdhOWY4ZTYwMmRiNDdlYjRmZTYyM2E2ZmIzYjJlNDRmMzMxYzRlZDUzOWI5MGI2ZjljMmQyZWNhMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3F1b3RlZF9kZWNpbWFsX3dpdGhvdXRfaW50ZWdlcl9pc190ZXh0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY1ZWIxM2IzMTFhNmEzNjlhOTBmNzAxZDk4Mzc4N2ViZTA3N2NhYzg5MWZkNTZkMzgxMmFjMDZhMzgyMmM2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfcmVxdWlyZWRfc2VtYW50aWNfcHJlc2VuY2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTE1NWM3YTlhZDliYmU5ZjcxNDg3NWMzNDc0OWVjZmE3NmYzNTI1MDIzZjQyZGRjZTJmMWYxN2M0YzM1NGU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9yZXF1aXJlbWVudF9vdmVybGF5X3ZhbGlkX2FuZF9jb25mbGljdGluZy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkZTMzMDBlNjgxOThhNmFmNWY5MTUxMDFlZmYwYzFkMTMwYjE2OTc0MGQ1ZWE3YzliMDkzZDFmNGY5ODY5YjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3Jlc29sdmVkX2Zvcm1fbm90X2RpcmVjdF9jb250ZW50X2lkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE4NzJmZGQyNzFmOTI5MGQ1ODM1ZGQ3YzFjNDZlZDkxOTAxYmZhZDNhNGRhODU3ZTA1M2UyN2ZiNTJjMjk0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX2FjY3VtdWxhdGlvbl9jb25mbGljdC55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhjZDI3M2U3ZDZjNjI5Y2VmYzY4NmE3ODU5ODMzYjUzZDY5OTJmYWE5NTgxYzU4ZjQ2YzhiODIyM2RhY2I5NzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3NjaGVtYV9kb3VibGVfbXVsdGlwbGVfb2ZfZXhhY3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzFlM2NhN2U0MTBjYTdlMmJkNGI3MGE2YTU4NDRjODRjNjMyMGQwNDJmMjk0YTI3OTg3ODI2N2JiYTdmYWUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfZG91YmxlX211bHRpcGxlX29mX3JlamVjdHNfZGVjaW1hbF9hcHByb3hpbWF0aW9uLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmRjYWYyZWVlOWRiOTFhODE4NTZiMTA4MWVmODE2OTJlZTc3MTI4OTU5YjI1MTY0ZDc0ZTlmODRlNDg1NzlmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX2VudW1fb3JkZXJfYW5kX2R1cGxpY2F0ZXNfY2Fub25pY2FsLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDgyOTkyYzE2NTk0YmJiYTYwNzg5OTIzOTRmNjIxOGJhMGFjYjMyMDBkMDM2ODU5NDIyNmU3MDVlN2NlMWI3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX2ludGVnZXJfbXVsdGlwbGVfb2ZfbGNtX21lcmdlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzZjYmRjNjgxYjJkM2JlNjZjY2FjODExNjcwY2U5NGZhZjRiYWJkZjgyNGFjN2Y3YzZiM2NiODYwZGJjY2RlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX2xhcmdlX2ludGVnZXJfbWluaW11bV93aXRoX3R5cGVfYWxpYXMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzEwNDVlMmRhNjQzOWYyYzE0ZmUxYzc0MDI4OTFlOGQwNjM5YjFkOTYyMTBjNTZiMzhjZWE5NDkxNmMyMmUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zY2hlbWFfdW5rbm93bl9rZXl3b3JkX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzljMzNlYWYxNmEwZTdmYzI5YmQ5ZWNiYjllYmY0M2E0MjE0NzEyMTJlNmRkZmM2YThkZjQxYmZmMzk5YjdiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc2NoZW1hX3ZhbHVlX3NoYXBlcy55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQxZGEzMDM0YWNiZTBmN2NlODA5NzQ0ODk0MjhkZjBlZDFhNzVlMzIzYTJjZDhiN2ViODQ3ZTM5Mzg5YjNmMjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3NjaGVtYV93cm9uZ19raW5kX2tleXdvcmRzX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzhkY2JkYjNmMGUzYmNlNTZlMWQ4ZjUxOTcxZTcyMzUzZTM1ZWU2MzY1YmVjZmJhNjgzZThkNDRhYWY3NWFmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc291cmNlX2VtcHR5X29iamVjdF9saXN0X3RvX2VtcHR5LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JiODcyMGRlMmJkMTNmNzkxYWZjNjE1ODQwYjcwYTc0NGVmNzBlYjBlMTYzNTAxY2FhMjI2OWVlZDc3NmY2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1Jfc291cmNlX251bGxfbGlzdF90b19lbXB0eS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYwMzg2OWY1ODMwOWYyNTc5MDljOTlkYzg5YWEwNmI3OWYwYmNmYmUzMGYxMzZiMzFlN2VhMDZiMzI5NzhiMjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3NvdXJjZV9yZWN1cnNpdmVfZW1wdHlfb2JqZWN0X2xpc3RfdG9fZW1wdHkueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3YjkxOGVkNzY2NjJlMzhkY2RiMzljOWFkY2E1NDIzZTE1ZjczMWVlMGZjYzFlNTMxNTkzNTI4NDcwZjZjYmFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl9zcGVjaWFsaXphdGlvbl9jcmVhdGVzX25ld19ub2RlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmE5ODBmZDlkOGMxYWVmMzVmODUxOTFhNzM4NWFhMDRhYzYzZDljNWEzMGY0NjViMmQ3OTEwODJiM2NkNGFlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfdG9wX2xldmVsX3R5cGVfbmFtZV9kZXNjcmlwdGlvbl9ub3RfaW5oZXJpdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzg0NWJjNDBhM2U2NjU2NDExODcxZjUwZWNmOTFjODI4MzU5OWMyN2Q4YzZmZjMyMzFmOGE3ODFlMmZkMTMyYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfdHlwZV9hbGlhc2VzX3JlbW92ZWRfZnJvbV9jYW5vbmljYWxfb3ZlcmxheS55YW1sIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmNGI1MGZmOWNmOTYyNGY3MzQxMTIxMmM2MWExMjU3MzNkNDVkMDAwN2NjNzY4NmQzM2U4MDBmN2UyZTExZDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9ibHVlLWxhbmd1YWdlLTEuMC9maXh0dXJlcy9yZXNvbHZlci9SX3R5cGVfY2hhaW5fbWVyZ2UueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzg3YTBiODVlNmRmZDI2MjRkMzJmNDdkNmExZmFhYTE0ZWI2ZDU5OTRmMmNiNGMyZWUzZTRhMzUwZmMwZWE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl90eXBlX2N5Y2xlX3JlamVjdGVkLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGU4NzlmYmEyNWRhZDhjYzI1MDRkM2Y2NGI0MGMwZGNjZTI0MTM2N2RiZjAwZDc5YzYyYTJmMTAyYmI4NTExNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL2JsdWUtbGFuZ3VhZ2UtMS4wL2ZpeHR1cmVzL3Jlc29sdmVyL1JfdHlwZV9kZXJpdmVkX2ZpZWxkX3JlbW92ZWQueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOGFmNWJlMjJhN2YyNjhkZTg3MWM3NTg2ZGMyMDg4OTU0YTJjMzQ5NWJmMDRkNzExYTM3MDJhNmNiMWU2MjE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvcmVzb2x2ZXIvUl92aWV3X3BhdGhfcm9vdF9pc19lbXB0eV9zdHJpbmcueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMDcxNTRiMmU0NjM1MGY1NjMzZTk5ZWU2MTdkYWRjMjk1ODUyNWI2YmJjNjg5YTFjZDljOTQwN2MyZDZkOGM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS1sYW5ndWFnZS0xLjAvZml4dHVyZXMvdmVjdG9yLWNvdmVyYWdlLnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRjZjZhMjVjODNjNmMxZWZjMGQxMTQxYTczZTlkOGZiNTM0Y2YyMzFmYjBmZmZmMjhkNzEyOGIyMmM5YjRjNTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbmZvcm1hbmNlL3NyYy9tYWluL3Jlc291cmNlcy9jb250cmFjdC8xLjAvc3BlYy5tZCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDkxNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NDA2MTUzNzkxZWQ5OWNmOTcxNjM3MjZiOGQyYTI3MmUzZjBjYTEwNzhkYzZjOWY2OWI4MTg1NWQ4MWU1YzgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb25mb3JtYW5jZS9zcmMvbWFpbi9yZXNvdXJjZXMvbGFuZ3VhZ2UvMS4wL3NwZWMubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4Nzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTIzNGIwYjQyMTkwYTc5ODI4MDk3ODFiNWVmZGFhMmU1ZjFhYjRiN2Y4ZDg3MGZiZDFmZmU3MDIwY2M3ZTg2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29uZm9ybWFuY2Uvc3JjL21haW4vcmVzb3VyY2VzL3JlbGVhc2UvYmx1ZS1sYW5ndWFnZS1jb250cmFjdHMtZW1iZWRkZWQtbW9kdWxlcy1jb2xsZWN0aW9uLXBhdGhzLTEuMC9QQUNLQUdFLU1BTklGRVNULnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE4NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTgzMjcwZmJhZTgzNjZkMWM4Y2Y2MDA3YTkwYjQxYWNjNzIzOTk5YjFmZDQ5ZWZlNWRlOTg0NDg2ZDc1MDY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImJhMDQ0NTJmMTM1NTAyMDFiMDBkYTk2YjA3ZTIyZjFlMDM0MGJjMTIyYzc3ZWMyZTJhMjliZWEzNmU1M2NjOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZENvbGxlY3Rpb25CZW5jaG1hcmtTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NTc4YWU4MmFkZGJiNWRjMDQyZDM3NWYyYzVjZWEyNjZkNGRmYjQzMDIxOGU5YzU0NTc3ZWNkODcwYTFjMzJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRDb2xsZWN0aW9uTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OGRmYTdiZGFjZmQ1MzQ5ZDgyZThlYzA3YjU4NWZkYWM5MjU2ZmQyOGE2NzZjOWUzNzY2YTYxMTVlZTFiNDlhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRDb2xsZWN0aW9uUGF0aHNCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTczMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzNjFhZjI3ZmM4YmUyMDIzMWNhODFmYWE4OTJiMjVhYWMxMGQ5MTc1ZmYyZDY5Njc1ZDgxMzM4MmZmYWEwYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZENvbGxlY3Rpb25Qcm9qZWN0aW9uU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4Nzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2QwYjY1Y2M4NTNjZTdlOTQ4ODczNzFkYzI5ZmUwZTI0OGU2MDNmZWI1MjIyZjY3NmIzZjM0MzRmOTY2NjhlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkQ29sbGVjdGlvblNlbGVjdGVkUHJvY2Vzc2luZ1N0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTU1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5MWE3MWM1YmJiNDA4MTg1N2FkZDZjNzJhYmU5YTFlYjFiOGRmNThjMzhkYmViYjUyNmE1MDRlZGY5ZTMxZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaFNlcXVlbmNlQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ4MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0NzJjYzY3YzE2ZTQwZmZhZTI5OGEwYzM5NGRmNGQxMTM5OWEwNGI3Mjk3NDMzMTQ3OTIyNzhmZTZlMmRjNGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQWN0aXZhdGlvbkludGVydmFsVmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzU5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3NGM5NjcwZjhjYWVmYTFmNmM4MzRjZWY1YjgyODE5YjY0NzA0OGIxYzVhZjA0ZGUyNWZjMWU1YmZiZWU5NTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQmF0Y2hQYXRjaFJlY29yZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTJlMmE0ZWI4NTljODE4ZWViYzllMGRhMzFiYjIyMzk0MjU4NDkwMTE2Y2JjYWMzNzNhYmZiYzU5ZTEwMzhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0JhdGNoUGF0Y2hSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDcwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE5YWEyN2JjN2JiMDUxMDNjNzY5Y2IxMzQyYTRiYTVlNWFhNDU0YzRkZjc0MWZjMzM0ZjYxYWM4ZDgzYjlmMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQmF0Y2hQYXRjaFRyYW5zYWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNiYmU5YjA1MWVmMGJjZWZmMjIxNTdkYjU2NGE0YzViOTgwYzA1OGQ0MDk1MmNiZTYwNGRiZTdjMDFkYWMyZTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQmx1ZUNvbnRyYWN0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTFhNTE4ZTA4ZWVhMTNjZDZiZWEzN2ExNWE4ZWQ2ZGVkNGY1ZmU5YTgyMzA1M2YxNDMyYjc0Nzk0NjBmMTBkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9CdWZmZXJlZENvbnRyYWN0RWZmZWN0RXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTRiMWFlOGNlYTZmOWVmNmUyN2FjNDAxNzA5ZmM5NjAwNWIzYmI0M2E1ODNiMDIwY2RkMjhkOWNkMjU5MjhlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsQ2hlY2twb2ludENvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTEyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYyNzVmYjFjOGM5YzE2ZGRkMGJiNjliZWEwZDNjYTcwYjRlNWI5NDBkNzY0YjAwNTJmMGU4YmE2NjkwMDRiOGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbEV2YWx1YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjM2OTliNWFiOGFkODg0MzU3ZjY5Zjg2MDM0ZTM0ZmEzNmNhYTQzZjc2OTAzMzFhZTcyYmMxZTgyZTJkZDMzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsRXZhbHVhdGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTNiNjQyYWE4ODVmMGRlZDE0OWQzMTIyYWRiMWU3ZGI2YmZmNDk1NjQ4MzEyNjc3NGM4MWZhMDBhNGQyYWQ5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9DaGFubmVsTG9va3VwUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzNDIwMzc1ZGU4ZjBkZWExZGI2NTUxNjQ5ZjU3NjNjY2FiZDdkMzE5YWVhNWZlZGMwNWFjZTM0MTcxMTk5MDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbE1lbWJlclNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjY2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxODBlMDViMTAwNDFjOTI0OTY5ZTg2MTI1MDg3MzNhNjdlZmUwNjk1NjdiODMyNDExMWM4NTNlZGFmNzRjNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTU1ZTliZjJlYzJiNjg5M2JiYzI5NmMyNDA0MWU4NmNjNjIxMTRiOWRiMjAxYTgzZGFkMDlkNTZmOWRjZjE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoYW5uZWxSdW5uZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzI2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmMzhmMjFkMTM0Y2FlMDNjMmEwY2ExNzdkMjA0NTE3NDRkMzIzNzk3Yjg2YjA5OTAzNzM5NzJjOTZhNGQxYzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hlY2twb2ludERvbWFpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZDc3MzYyNTg2ODliNTk4NGNmMzYwMWNjNzgwODkyMzRmNTgwMDFmMTdlZTc5YWVmMmNmMDc0NjE4NjlkMWM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoZWNrcG9pbnRJZGVudGl0eUNhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwZDliZDZiNzMzYzg4ODA2MjM5ZmMwYmRiMDgyOWQ0OGFkNjhhMTc0Y2MyODBjYWFmMzdkYjJiNzgxMjEyNjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hlY2twb2ludElkZW50aXR5Q2FsY3VsYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTgzNGI5Njk0YzMyZjU5ODNkOTZlZWY4NTY3MTYxMmFjYTk0NDJkMjE0OWE4MmUyMDg5Nzg4YmViMjZhOTgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoZWNrcG9pbnRNYW5hZ2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYjIxMmNkOGZiYTQ4Y2Q1NjI0ZmI5Y2QzOWIyYjBiZmZlNDg2ZTRmYWY1OTU4N2M0YzY0ZDI2NzY3NzgwZWU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbXBvc2l0ZVByb2Nlc3NpbmdPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNjAwZmUzYzJiOGM0NzMyZTY4NzU1N2FkZGM5M2U0NmM4YjQ1MjA5NGRhNjc4Njg5OWQ4N2QxZDZhM2Q1ZWU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbmZvcm1hbmNlQ2hhbmdlZFBhdGguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGM0MGQ3ZGQ3MGE4ZGY3MGJmOTVjMzM2NzUyOTA4YTdlNjMxZGRkYjUzNWY2NjFiMDg2NmJhMGJkY2MwNzc0MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db25mb3JtYW5jZVBsYW5uZXJPdmVycmlkZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMmNlNWU5MDMzNzNmNmM3M2Y5ZGVhYjA4NGVmZGIwMWUyODM2NzU2NTE4OGI2YmY2ODY1MTZiNTUyOWZmODgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0QnVuZGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU0NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYzcyMjJiMTE4NWY2OWJiZjhjODNlN2RiODY0MGY2ZTA4ZWU3MzhiOWM1ZDk2MjFkZTQxYTExOWY1MDk5NjMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0Q29udHJpYnV0aW9uQ29sbGVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0ODVmYzJjN2I1NmJiMjk1ZWY4Y2FkZTJlMjViY2FmMTcxYzUzYTA4ODcxNGYxN2MxNTEwMmE4NjZkODRmMGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RDb250cmlidXRpb25SZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMzI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWFjMWNmMWVmYjY1YTJmZDdmNDYzOTBhNmNiYmJjZWE0Nzk2ZmUwY2NiODI4NmRhMWExMTk5MDcxMmJiZDAwMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdEVmZmVjdEJ1ZmZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYjUwOTQxMmRkYTJjZWQxMjg1Y2M4MzA5NmFiY2ZjOTA4YTkyOWQ3MDZjODhiZTk2NjQxNDgxYjZiYTZjYjQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0SGVhZGVyTG9hZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MTYwOTM0M2JkY2RkZWI4ZDNlOTJjZTc2OTQxZmJjZDJhM2RkNTMxM2MxNzQyYjQwMmUwZDEzMjdkYTc0MjlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0TG9hZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTJjMzQ4ZmIxZDQ0NjNhM2Y5OWY4ZDM5YThhNjgxYjgzYmY2MDVmY2UwNmYzMzcxZDhjMWMyZWYxMzZmOTVkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0TWF0Y2hpbmdTZXJ2aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM0MTJjMzAwODVkZDAyM2FlZjYxZmQwZjNjNTQwNzgxNGIyM2VmZGEwMTk2YmMzOWM2NmY5YWQyYzJhMzM3NjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2M2E4YmE1YzJiNDBhOGYzY2VkMDg1ODdlNTM5NTg1NjNmYmFhMmRjY2VhYTAxYTE1MzhlYzMxODRmOWIxNWUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0UHJvY2Vzc29yUmVnaXN0cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTA2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjlkYmNlNWM5OGY3YjM5MzU4NTk3ZWY3YWZjNzMyY2YzNzYzZTU3YjI0ZGI2YjA5OTYyYjc2N2Y1ZDNkYjA4MjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RQcm9jZXNzb3JSZWdpc3RyeUJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDBhYjMyM2EwMmU4Njk0MDhiNzQ1ZTE1ZTg5MWVjZjA4ZGFlOGIxODZmM2NlZjEyN2U0MDdlNDM1NjYzODNmMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdFJlY29nbml0aW9uTWV0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1Njk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGI3YjhkMzM5OTU4NmFmNzliNDhmNGQ5YjZhNjc0YTNjMTg3NTM0OWI1Y2QwNDkyMzRiNDk4MTJjYjU1MTBmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdFJlZnJlc2hTZXJ2aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTMyYzc4NzAzMGUwNTQ4YmFkYzUzZGMxZDBiZDJiNWQ2ZmQ0MWMwZDM3ODI4ZDIzNDFkMzRkODk1ZTFiMTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0U25hcHNob3RDYWNoZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDhiMWQ3ODlmNTRjOGU1YzA3OWQ1YzRkMmUwMGYzZWE1OGFiNDcxN2IyYzlmMzMyMjEzMDM0MDVkOTU4OWFiZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdFNuYXBzaG90RmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NTM2ZTYxZGQzNzEzODY3NzMxOWYyOWRkYjY3MWFiNDFjZjJjMDFiNzhhMGEyNmYyNmQyYTNlOTA2ODYzNDdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RlY2xhcmVkVHlwZUxpbmVhZ2VNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODAzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2MDg2OGFjZGU0MDZkZDdkMjZmZGVlY2Q5N2YzN2Q3ZjcxYTI4YjkyZWMyNGQ0NzgyNWQ4NWZkYTNmNjQ4ZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGlyZWN0Q29udHJhY3RNdXRhdGlvblByZWZsaWdodC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZTVlMWRmNWQ4ZmFjYWZjZjA3NzFmNTljODJkNDBhNDhmOWZiYTYyYTZmODJmZTI2MDFmNWQwNDBmN2I0MzU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RpcmVjdFByb3RlY3RlZFN0YXRlTXV0YXRpb25HdWFyZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg0NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMTM4YTBkODhmZmI2ZjUzZTVjY2FjMzZmNDZiM2ZjNGY0MmM1NTU0YjdkNjE2YWVlOTllNTFmYTVkMmNkOTE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RpcmVjdFN1YnNjcmlwdGlvblN1cmZhY2VQcm9qZWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzM0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllYzAxM2VkZDk0ZjUxZTlhNWFkN2YzNDY5ZDc2NWJmZmJlMDUxMTBmN2Q2YzljNjBhYjczODhlNWFkNDFjYmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGlyZWN0U3Vic2NyaXB0aW9uU3VyZmFjZVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZjViZWMzZGE5ZTQyYzZmM2RlOWU1NmQ2NWM0NjBhYjEyNGE1ZmY5NjljYzY3ZDFjNjM4YTkzOWIzMDRkMzI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc2luZ1Jlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg5NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMGE5ZDQ5ZDMxZTViMTk2OGJjYzM0YzY1YWI4NDA4OGM4ZWY0NDkxOWFkNzVhOTQ1OGI1ODJlN2JjYTU3YTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc2luZ1J1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODEwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJjMjNmOTVlODUwMzIxY2ZlODZmMzk2MGRkNjdjYTVmZmI1Y2ZmNGQ3ODljZDcyNDY2ZjIwMzk5ZmNlNWVjYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTA5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRiMzcxYjRhNjJjZWNjNGExZmQ5NWFkY2NiNTMzYjY4NDM0NTUzOWNmM2MyMmEwZWE1MjU2YWU5ZWRiNDkzNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JBZG1pbmlzdHJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGU2NDQ3NDIyNzM5M2RkZWY3MjNiZGZmZjg1NmVkNWRmNTQ1NDgyNDA2ODU0ZTM4ZjFmYzc4ZWM2Njc5MDFhZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckJ1aWxkZXJTdGF0ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDgxN2Q1OGY0OWE3NzNmN2QxZWZlZDQxMDdjMjgzOTBlOGZkNjRmYjc3YzBjZTA5NzQ0NjBlNjBkMjIxYjY3OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckJ1aWxkZXJTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQzMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1NmM4NGY5NzliNDE2ODQ0NzM3MmRjNWJmMjQxNmMzZDE5MWY2NjJjYjQwODFkYjk2MDFiMTkwMzA2NTYwY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JDb21wb25lbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3NWZlNGY2OTEyYTU0Mzk2ZjE2OTE1MmRiMjFjZDliZWU1ZmE5MDAyMzAzMDY0ZjBmYmZhYzA2M2JlOGI1YTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JDb25maWd1cmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxYWJmNGE1MTY1Y2YxZjcyYmFiYjczZDNkNDc4ZjU0OWYyMjlhZmVkYTBmZjZmNWE2ZDIyOGJhMzRkMzIzOWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JDb25maWd1cmF0aW9uU3VwcG9ydC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjIwZTJjODQ4YzA0NjE4YWM5ZGM2YTIwNTBlMTIxNDYwY2M3ZTdjZTlmZDk5M2FlYzBmNTNlMjUyZmM4ZTczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yTGlmZWN5Y2xlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODI1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImQyZDViNzIxMzdjZjc5YmI2OGM1NmUwNzQ5MTkxZWYxMWFhN2MzYzI5MmJhZTI1YWEwMDdhOTIwMzczNjIwOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JOb2RlT3BlcmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNDU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjA1NTU5OTM3ZDY4ZGI2YjcwMjk5YmNhM2EwMDkyNjY3YmIzNTY4NDc3MDE1ZWQ1OTNkYzJhNTkyYmYzMWY5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvclByb2Nlc3NpbmdTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDk0NGU3YmI1NGZkNzIzMGRhODM4NTM5ZDQ4ZjY1MWJlMDBmMjI3ZGRmNjY4YjI5OTc4MjYzOGUzNTgyN2UxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yU25hcHNob3RPcGVyYXRpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTAyODczZDEyZDcwZGRjMTUxNmI4NzBkY2U0MTAxY2NjZTE2MjMxN2ZhZjM2MWFiNGY5MzU5MThmNTU3NDgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50VXBkYXRlRGF0YS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmYzMmFmZjNhOGI3ZWVkOTAzYmMyZmYyOWYyYzRmN2MzNWJmZDQyMjZiMTE1OWYzYWZkMTg2MDU0MGY5YjBjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50VXBkYXRlRGF0YUFkYXB0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JiZWVjZTY0MWFjNjY5MGRlNTE4ZWUyNmQwMDYwZDkxZThjYTY3NzI2N2QxOGE2YjUyYWZkMmFlMjhiZGM4MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFVwZGF0ZU9jY3VycmVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2NjZjUxZWUxZWM0ZTQ5NWUyNmM1NmE2MzJjMTdjOTNlNTE5NzIxNDc2NGQ3MzM4YTdmZDRmY2IzNGE5ZThiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFVwZGF0ZVJvdXRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ODY4MWVlNmI0MjRhZTg1NDE3MDUxNWRiMmQ4ZjUzYzAyNTZkODZjZWRhNzIwMWZhYjY0NzEzNWY0MTIwNDczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VmZmVjdGl2ZUNvbnRyYWN0UmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjU3OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ5MDFhNGJlMWE5ZTYwYmFiMzk0ZDJiOWU0NzUzZjM1NDMxYjMxODA5ODMyOWRjZDljYmZhY2IyNWFiZDVhZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlQ29udHJhY3RTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWNjZWU2ZDNlNTk1NGY0YThjNDQzYjBlMDBiOGI4ZWRmNWIxNjFhNmQyMjQzNWZmYjViMzUyZGFhZDBhOWM2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FZmZlY3RpdmVDb250cmFjdFNuYXBzaG90Q29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhMTI0YjQ3ZDc2ZmEzZjNhMTIwYjhhZWM3NjhjNjkyYmMyMzc3YTNjNDBiMzFkMjRhZWJmNDJiMGExNjZiY2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlRnJhZ21lbnRhdGlvbkNhdGFsb2cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjljMmVkZjIyNWZlZWU2NzE0MmU0NjM3OWJhNTA2YzMyMzIzMmJlMzg0MDA1ZWY1MWVlNzU4MDg3NTI5NTgyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FZmZlY3RpdmVGcmFnbWVudGF0aW9uQ2F0YWxvZ0J1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTE3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmODMwOTZjNTRkY2ZlMmUzN2JiZTIyY2YwN2ZkZjliNzg4NmE1ZGY4YjZjMGFlMzgzZTVkNTQxNDFhZmM3NTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlU3Vic2NyaXB0aW9uU3VyZmFjZVByb2plY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDAyY2FiYzBkMTk5NzQ2NzZlOTcyZDcxYTM0YTVjMDkxM2M4YTY1YmEwNGEyZTVhNDUwZTM3NDBmZDc3NTlmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZENvbmNyZXRlUGF0aC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDY2MGM2ZTJjYzY0Yzc2N2ZjZDk2ZTMyNDc2ZTBmNzc3YjZiMGQ2NThhMjBjNWVjZjlhMzA4ODI0YjcyYWY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkUGF0aE9yaWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImUwNjBjMmMwYzBhNDRlOTJmMDMyMzY3MDEwMzI5ZTZmYmM1Njk0NTI5MmMzM2Y1N2YxYzY0ZDhmMTkzMzVjYWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTY29wZURlY2xhcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlZWZhYjMxOGFlMzk3YjBhMTFiZmQyMWQ0OGU3NjRhOGFkYTUzMjQ5Y2UwYjhlN2Q0MDg3Y2Y4MzIwNmE0YzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTY29wZUVudHJ5UGxhbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTI4NDljOTkyMjgwMWEyN2VkMjk4YzVlZWZlZWY5MDQ5ZTg5YTUxYTRiMzk3OTFjZmMyZDBiODc3YTg3N2M4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZFNjb3BlUGxhbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwNDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTFiZDQ3YmQ1OTA0MGFiNGJlMzQ5ZjM5NTc3ODFkNDEzNDVkMTQwMzE4ZDU5ZDhjYTk0MjUzNzcwNjVkMGJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkU2NvcGVQbGFuVmlldy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNjNkMjM3ZDZhYjgxZDQyYWVhNjQyYzc3OTgwN2MwZWQ0NGIwYTFhOGIzODE3YjcxMDk1YzdhOGRhMDRjNjdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkU2NvcGVQbGFubmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA1NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2OTllYjBiNmRjNzRhMTVmNzFlNGIwNjBjYjEzMzI1NWUxMzhlNTM2MzgyN2YwNWFkZmI1NWRiYjEyZTRhODJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkU3Vic2NyaXB0aW9uUm91dGVQcm9qZWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGUxZDU3NGM1Y2E5MDAyZDhhOGI4YjUwNDFmNTRiYWY4NjhmY2U5YTNiZTJlNjVkZWI3MzcwMjQ4OGM0MzczZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FdmVudE9jY3VycmVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjA3MjZjZmQ5YWEyMjI2NjdkZGU0OWU1NzAwY2MyZTJiNWIwOWNiMWZjZjI1YTA4ZTg4MDY2OTVhOTRlMmRkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FdmlkZW5jZUNsYXNzaWZpY2F0aW9uVHlwZUNhdGFsb2cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTY0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzMTRlZDYwZmRiNDIzZmE1N2Q1NDIxMDhkMzUxMWU3ZDcwZjU0MTg4NDBhZGViNDBkZWFmN2VmMWJlMWU1NzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXZpZGVuY2VDbGFzc2lmaWNhdGlvblZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiZjI5YTg1MTQxMGZiODE4NzgwYTJiNTA5N2E5YzEwMGIxNzkxMmNlMWYyNDY3NGNiZmE0YTNmOTc4MTZlMjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXZpZGVuY2VEZWxpdmVyeU9yY2hlc3RyYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNzgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzg5MGRmYmViNTU0YjUzNmE3ZWI2MzRmNjExOWZlY2EyNDI1MDFhZjA5OWU2OTZlNDMzZDYwMzI0MjZjMjhiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeGFjdEJsdWVWYWx1ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDdlNDVlYjY4NTRmZmU1M2FiNzViNmNmMjYxNWViY2M2ZjgyNDI0NzBiMjRiNTIwNzQ3MDc1MWM4MTBhYjVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4ZWN1dGFibGVCb2R5TG9hZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTQ1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmYjM3Y2RmZGQyZGU0MGQ1NGJjMmNjZDUxYTUxYmYyMTc2NmM3NWEwNGM1NDc4OTRiOWRhYTM0Zjc5ZjdhNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXhlY3V0YWJsZUJvZHlQYXRoQ2F0YWxvZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE4YjNkMWRjYmM3ZDFlMzVhNWJkNzIzYThlNDk5YWY0YjQyZWQ0NmFkYjhmYWZjYTMwNjA5YjczNTNmM2IwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeGVjdXRhYmxlQm9keVNvdXJjZURlc2NyaXB0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzAyYjkxMDZkNzE4ZTI4NDFiYTc1YzAyMTZiMWViMWFkMTQxYTBlNjBjYTU1NTRhZmQ4MzgzMzE4YzhmMjQxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeGVjdXRpb25FdmlkZW5jZVVuYXZhaWxhYmxlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVkNDczODk1OGUwZTQyY2U0M2E3MmYzYzk2MmFmZmNhNjAyMzFiMmEwNzBiZjQ2NTYwNzNmMTlmMGJhMTY4NmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXhlY3V0aW9uTGlmZWN5Y2xlQ29vcmRpbmF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGI5Yjc4NWY1YzQ4ZmM4MzNkYWY4NDlkN2ZiNTRiNDg1MDMzZDE0YTg1NmI4OWQ4NDJmYjViNGQ5MDk2OGMzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENhbmRpZGF0ZVByb2plY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMGIxMmEzMjY0YTk4ZjA2MTk0NjVhOWIzMzM1ZTRmNmE0MmUzMWFiMTA1NTBjNmNlM2Q3NDE4Mjc5M2I1NTJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbERlcGVuZGVuY3lDYXB0dXJlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkMzkyZmIxYjQ4MjM2YWE1ZTI0MWQxY2M2ZmJiZTRjOTMxMjlmNTRjYTdkNjcxMTA0Y2UwZDE2NmU2MGY5YjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRGVwZW5kZW5jeUlkZW50aXRpZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc4N2FlMmE5MDY1Y2Y2ZDdiYWEwMjQyZDhmNjdkMGNiODc3YzZmZDdhMjI3M2MwN2U0M2VkYTVjNjk0ZDYyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxEZXBlbmRlbmN5U25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImIwOWQxZThjZTYyNmIzYjBlNWQyMzIzNTM0MjhiNDYxMjRhYjAxNGEzZmFiNmQzNDE2M2RlNTQxYWU1ZTY2ZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRGVwZW5kZW5jeVN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTE0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMwM2MxZDFmNTU4M2VhMjI2OTU5NDI1YTEwNWYxZWE1M2IyMjJlYjAzYzk3NzQwYmQ4NzAxNGUwZDFmZDdiNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRGVwZW5kZW5jeVZhbGlkYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3Mjg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFmYWM2MTU1NDA1NmJmYmVmMTM2MGZjMjA5ZmYxMGQxNjkyNWY3MzRkZDVhMDFiNGQ3YjA0NTk0YzhhNDdhZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxGdW5jdGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDcxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwNjZkMGViZTBjNzEwNmE2NGI3MjgzYTNlNGUyMDcyYTY4M2MwYzg4NzQ4YTY3YTY0ZGE0ZTQxMTcxOWM3YzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRnVuY3Rpb25Db250ZXh0RmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NTg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjIyYmFhZThiMzQwNDc2MDVjMzZjZmNjN2Q1NzdlN2Y5ZWYwOTkxMGE0MzMwOTFhODdiMWYzZWE3ZTVhMTJhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxGdW5jdGlvbkV2YWx1YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDA2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyZTcyNzUxMTRjZjUwMGQ3YWZkZDhiMjVkNDVmMTAzOWVmZDU5NjA0NDBhMTFkZTc1YWYzZDA5MjNlM2JhZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsRnVuY3Rpb25SZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjY5YjgzZTljMjA4MjA2OTFiZTMyMjYxZGJhYTQ1MTYzMzY1NjI1YWZjZDZhZGMxNGUwNjVlNzllNDU5YzM4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxGdW5jdGlvblJ1bGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU1YjNkZjk3OWUxMDYzNmRiMmRiZjQ4Y2JhMDhhZTE1MGIxYTI2NTI0N2I2ZDAzZGJkMjYxOTZhZmFmYTExZTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsTWVtYmVyRXZhbHVhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMmM5NzVkODY3ZThkYzQzZmM0YjM1MmZjNDExZGIyODc4MmY1YzY5MWU5MDBjMDcwYzlmZDFhYzAyOTVmNDhlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbE1lbWJlclNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4ZTFkZWVjNTRmODA2NTZhNWM0MGM1YTQ2MDlkZTBlZDRhYmUzMzRhYTQ0YTQ0ZDY4MmIzN2Q3YTgwNjA5ZTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsUmVzb2x1dGlvbkN5Y2xlR3VhcmQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzAyMDkzODJjOGFlYWFhMjk2ZDFiMzIzOTEwMTU0NDJmMzYxOGMzMTkzZjdmY2MwZGQ3YjdiMmE1YTZjNGVmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxSZXNvbHZlckNhdGFsb2cuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTMyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlMGE0YzE1MWZjMzc0MTFhMDJlMjVkY2M1MDgwZGIxMjcwYzZlYzQ2ODI3ZjU3OTNjNTE2YjRkZjBhY2M0N2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsU3Vic2NyaXB0aW9uRnVuY3Rpb25zLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcyODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWU2MWYxZWEwN2QyZThmYmE0ZTY2YmE5ZDdkYzQ1MzQyYjkzMTgxYmNkMTAwNWE4ZmMxNjgyN2E1MDI1OWI5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsRGVsaXZlcnlDbGFzc2lmaWNhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkMjU4OTkzYjFkMzNlZWMxOTdjN2U5Yjg1M2EyNWE5NDg2NjNhZmExMmJjZGUxNDU2ZGEzZTVkMWIxMTk3MTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxEZWxpdmVyeUV2aWRlbmNlVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTM0MDU5MDVkMjBiN2I2Zjc4M2U5N2JjNWUxNDI4ODg0ZWY1NjcyZTZhNDEyYzgxYjAwZmU2NTI3MWYzNDJmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5RXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUyMTA3ODhhZjkzNDExMTkwYjgyMTAzNjUzMmQ1ZjA3MTA5NjVkODU5Y2I0YmQyZjZlNTc3YjBlNzNjZDkyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5UGxhbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjBmZDEzMzc1MWY0NWQ3MzYxZjljZjM5YjNkZDg4ZDU0MjZiNzY1MmQ0MGVkMDZmYjkxNWRiOTA3YWMyMzkyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5UGxhbkRlcml2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTQwMjY3NjAxYjY5MjMzNmJhYjA4YzhjMzgwZjIwZjgzNzBjNjRkYTUyN2E3OWE5YWNlY2UxNDcyNWRhM2YwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5UGxhblZlcmlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzI1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiMzkzYjljNTAyNTQ1YTM1ODRkOWUwYTFiMzQ4ZmVkMjg1MDNkOTI4MGE5YTFkYzNjYTFlMDlmMjBkNjU0YTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxEZWxpdmVyeVJlc29sdXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDU2ZWRkMTVlZDk0ZjEzYzNiZjBlN2JiNjhkN2I3ZjY2YTNkZDA0OTRkOGM4YWIwODgxZWIyOWFiNzYwODgxMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5U25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTcwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzYjliYmJlZjI4ZDA5MzI5MGVkODVjYmM5ZWEzZDAyNjc4Mjc0NjZlYzNmNDczZWVmMTA4NDRmNjQzOTAzNTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxFdmlkZW5jZVZlcmlmaWNhdGlvblN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTkyZjlkYmMxYjc4OGE3ODA1YTVmMmI4MTgxNTEzZDkwZGU3ZjgzZDhlYTUyNjQ5ODA0YjFlNDU3OWU3M2EyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbE9yZGVyS2V5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTcyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0MTFhZjM3ZWE3Y2NhZjEwYTA2NmIxZjJmNjQ5ZWRjMjliZjUyZGZlNDBlOGZmMzZlOGI1ZWI0M2QxODQzZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxQcmVzZWxlY3Rpb25WZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjEwNThiMWQ0OThjMzJlNTgwNGQyMDgwYmNkODQxYmU4YjRjODlkZTQyNmYzOWJmOWJkYWI3NTFkZTY5ZTc2ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbFNvdXJjZUV2YWx1YXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDRjOGE3OTlmOGYyZWIzNjBkODU0YTdjZWEwZDZiZWU5N2MwNTE0MmY1ZmI1Y2Y5ZDEwYTMxY2M5NWFkNjgwMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbFN1YnNjcmlwdGlvbk9jY3VycmVuY2VLZXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2ZhZDlhZTk3ZmU1NzhjNjdhZDkyNjNmYzRlYThjM2UwZWVkOWI2NTRiMDgyMjQ2ZjBmNzA1NGU0YjVmMjY0ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbFN1YnNjcmlwdGlvblByb2plY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDE0ODM4MGI5NGIyZTQyZDgxNTZjNmM3ODFiYzA3MzkyMTc3MzhiY2E3NDYxMjE5MGY2NWFiNGIxNmQ0Y2I2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbFN1YnNjcmlwdGlvblByb2plY3Rpb25CdWlsZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE0NTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDhjN2I1NzUwODliNWJkMGZmODhkMzZlMGU2YTcwNzY5M2M2ZjVlZjhiM2ZkNzA3ODIyMTdmODBhZWJiZmMyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsU3Vic2NyaXB0aW9uU2VsZWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NmJhZDEwNmJlMmQxNTY0YWYwNmI0NTI0MjY2MmQ3NDdhZDYzZGJhNWJlYTM5NzI2YTlmMzg0OGJlMmVjMzA2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ZpbmFsU291bmRuZXNzVmFsaWRhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhMmI2MDNjMWJkZTA2YWJmY2IxOWNiNGE0MDAwNDliNGM0OGJmYTUwMzVlYmQwNWU2YjQzNDY2OGVlMGI2NzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRnJvemVuSnNvblBhdGNoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZWFkZmUxNTQ2NTcwNTc1YjdmZjM2MTE5MGE2Y2QxNGE4NTM1MDI2OGQ1NDc1ZTJkMDY3MjdkZDJkZTUzMDMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0dhc0NoYXJnZUNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTUwM2ExOTM3MTFiYjljM2U5NWZiNmQwZWExNjA1NTAyZTA0MzlmYTEyYzA1MzgyYzI4ZTU3MTgwNmE3NzA2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNMaW1pdEV4Y2VlZGVkRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwYWFjNTRlY2EzMTQyMjNhNjM1OGI0NzZjNGZhNTdiYjg0YzMwYjk5NzQwNzEzMDhmYmEyOWExMWEyNjdjOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvR2FzTWV0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTM0MywKICAgICAgICAgICAgICAic2hhMjU2IjogImE0MjZmZTIwM2IwMzc3YWQ3YzVkOGZiOGJlNTJkNzRiOGJkYmQ1ZTg0MzJjZmRlNjZjMDkxYTZiNmJhNjJhMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvR2FzU2NoZWR1bGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTU3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNlOTUxYjczNGFiZTcxZTk1Y2M5OTFiNmVlYzY2M2Q5YzBjZjYwY2NjMzU0NjRjMzgwODI5MTdjMWY4MjgyZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvR2FzU2NoZWR1bGVDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTE0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImIxYTJjMWY0YzM3NjA4NWMyOGY5ZDRhODFiNTNkYjBjMGQ0NWZhNWUzY2MyNDQ3OTQ3MjQ1OWY5YmY0OGQyYzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvR2FzVHJhY2VFbnRyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYTI4MzczOTI1Yzk1MTFmYTAxMDQwZWYwMzViMDVkNTkzN2IzOGJkNDNhOTRlZGRkNzFmNDc3ODE1MzlkM2JlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0hhbmRsZXJDaGFubmVsU2VsZWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTFkNjFjNTEzZDAwYmIxZjY2OGQxYmQwYzg4YmI1MGIzZjlhMWU1YmMyNTJlZTc0ZGIwNzQwNTE0MDA5YTVmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9IYW5kbGVyTWF0Y2hDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjNzA1OTVjZDdhMjJjYWZmYzMxZmZlOWFhZjcwMjliYzlhZTI2OTIxM2VjOWMyMDhkMWE4M2NhZDkwOTdlYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSGFuZGxlclByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDZlMTdmY2I2MjEwMWY1MWM4MGMzY2ZhMWE3N2IxNzI2NzlhZWY3MDEwZTRjMWQ2ODQ0ZDNiY2M2MTRiMzc3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0hhbmRsZXJSZWdpc3RyYXRpb25Db250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0ZDA2Zjg2N2ViNDYzNjU4MTdlODRhMGIzMjU1ZDcwMDdkMmNkNjI1ZGRkZTc4M2EyZDEyYjY2NmQ0NTRiZTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW1tdXRhYmxlSnNvblBhdGNoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmQwZmE5ODVlOTUyYWVkODczOWFiNWIyYTZiYTNlNGNhYWU5YjYyYTc4YjY0YTcwMjljMDQzMTk1NTBiN2NjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ltbXV0YWJsZVBhdGNoUGxhbm5lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNjYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQwOGVlOTAwZjE3MGI1YjIzYzE2ZDgyMjJiZTNmN2Q3ZGJjNzRlMzc1YWUwMTdjNmY1ZDcwMzIxZmZhMzE4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9JbmRleGVkRGVsaXZlcnlEaWFnbm9zdGljLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgwMywKICAgICAgICAgICAgICAic2hhMjU2IjogImIwOTQyYjMxNDk0MDEzNjY5NDBjNTgxNGFkYzEzZDY4NmU5ODc2NWI5MTJmOTYwMDM1MzAwOWZjNjBlYTkwM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW5kZXhlZERlbGl2ZXJ5RXZhbHVhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk0ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMmZjMDA3ZWExNzQ4OTljZGZmMzE1NGMyMzI5YTFjMTY3MWZhNjZjMDFhMjA5MDljMTJlYzQ4YzAwNzY4NmEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0luZGV4ZWREZWxpdmVyeVByZXBhcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE0MjkwNjA3YmIzMTk4OWFiYWEzYTlmMzcwMjZjODRiMjhjMDZmNmM2MDUwYTg3YTg5MGMyMzYzNjAwMmNjMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW50ZXJuYWxPY2N1cnJlbmNlRHJhaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZDllOTlmYTdjMzY3MDJiMTc5MjAxNzg4NmMwMjc3YTA5OWNmMzdjODcxNWFjNWIzMzdmNTBlYmU2YTJlOTMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ludmFsaWRFeGVjdXRpb25FdmlkZW5jZUV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMDZlNmU5NzkzMzRjODkxMWZmOWY3NWQwMWQxYTE5NzIyNDYwZTFmNWFiZTE0MDRmY2Q1ZDllNGUzNDUzZmMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0pmclByb2Nlc3NpbmdPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTIxNjZhMTAyMTE0YTdhMzBmMDAxMjZlM2Q1ZjQ5YzUzYzIxOTMxMzEyMDI1NjM3NzUwMjllZDc4MjU2NDljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0xhbmd1YWdlUHJvY2Vzc2luZ1NuYXBzaG90TWFuYWdlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YzE4YmM4YmU0MTVmYzc0NGQ0MWNjYzNjZmZhM2EyZTY2NDExMDZiZTNkNmRlZGIzNzQzOWVlMDlhYmE5MmNkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0xpZmVjeWNsZUV2ZW50RmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MjI4ZDc3MTkwNTUxMGMzODRiZWFmZWUzNjVkZTg0MDZiNTE4OGJjZGNhYWJjNWQ3N2FiODdmMGIyNzljNmExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0xvZ2ljYWxEZWxpdmVyeUV4ZWN1dGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzZGUwOWJhMmY2NGRjYmZmNTA3MmNmZDcxNDZkODlmZWIzNjcxNDZkNTYyNmM0NmIyN2FhN2EzNTUyOTRhOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTG9naWNhbERlbGl2ZXJ5R3JvdXBlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYzVkNGFjZWNhYzIwY2ZhMmIyMWE3MzY5NWNlZjEzMjFkZGYwZjI4MGJlZWI2MzJkOTQyNDhjOWJlZjBkZWIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL01hdGVyaWFsaXphdGlvblByb3ZlbmFuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdhZGI3Yjc0OTY3YWUwOTQ4NDIxZjE5NWEwYjkxZTQ3ZTZhOWM4ODcwODIyZmU4NTQ4Y2EyZjBiMzFkMzQ0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9NYXRlcmlhbGl6ZWREb2N1bWVudFZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODNjZDAyYWRhZDdmMzZhOWVhNDIyOGY5ZjM5Y2QyZTI3NWViODU0YTFjYWZkN2U5YzQ5ZDMxYmJiMDAxODA1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9NdXN0VW5kZXJzdGFuZEZhaWx1cmVFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNzNmZWM1N2U1MWY0NWZlODIxNGI3ZGQ5ZDMxM2U2MjUwZTIzNzI0NzQ3ZWM2NmIyNjdjOTY2NTY2OTBkN2NhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL011dGF0aW9uQ29tbWl0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTExMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhMzE3ZGRjMWVjNDlkOGJlNjBhNmQ3YTFkN2JmNjdjNjQ3NjA1ODk1NjcxZDA0MmI4YmE0MzQ2ZGZjYWIyNzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTXV0YXRpb25HYXNDaGFyZ2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4MjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NGZiMjM0Mjc1YjkwMzA1ZmM4Y2ZhYjBhZWM1ZWU1OTYyMGNjNGEwNjVmMDRiNGMxYTM1ODVmNjc0ZmFlZmQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL05vT3BQcm9jZXNzaW5nT2JzZXJ2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YzE4ZGNhYjAzMjNiZDA2ZGFmMTBkYTQxYWNkNWY0ZTNjMTlkMmM3ZjFmMjA1MWE5NTAwYzVlNzEwNDg2ZGE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL09ic2VydmF0aW9uS2luZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1MzRiYTQ3ZDRlYjVlZDJlMzA5Y2NlYTcwNTA5ZjBmN2VlODI1YmM4OGY3NWE2MTA5ZDYwZGM0ODk0MDA1MjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGFydGljaXBhdGluZ0Nsb3N1cmVQcmVmbGlnaHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YjkwNWI5ZDcwNjYwZGIxNzBkMDc0YmI1ZDk4MjVjM2I2ZTg4MTE5ZTdkYjg3ZmVhMjU5ZDlhZThmZmMyOTdhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoQm91bmRhcnlWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ3Mzg0NTAyYjk3ZTdlOWY5ODgzMmI0MDgxOWFlZDQ2MTg5NGFkYTAzMGVmNmRiZTkwMjc1YzNlMjA2MjFmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaEltcGFjdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMWFiZmFjNjcxMmJkNWEwZjIzZjU2NGNjNTQwNmQ1YWJhMTFhNzc2OTI0NzQyOWQ2OWYxZTk5YTY1NTFhZWUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoSW1wYWN0QW5hbHl6ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzExOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ3MzRlMzllYTE2NjcxMTZkNWIwYjk0MzUxNWRhY2U0MDBmYTFkMzkyMzljZWUwNzFhMTdlMmRhNjExNWIyMTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hJbnB1dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzgzZGFkZThkNTRkZjcyZGYwMDU4YmVjNmYzNjk3ODQyYjJlYTZjMGIzMDVmZGRiYTc2MjAyNzg4YzQ4YjM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoUGxhbm5pbmdDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzYwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3NmZhZDNjNmIwM2QxN2Y5MTYzMGU0MWJiYWY1ODM5Yzg5YzcxODQ0MjRlMjg3MDQxZmNlMDExMWYyYjA0MTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hQbGFubmluZ0VuZ2luZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODA0NzU0YmQwOWMyNDQwODk0OGViYTQzZGVjYjBhMDE4ZjdiOWMyMGFjNjdkMWJmOTE3MmIxMDg3MjU1NjQ4OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaFByZWZsaWdodC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzNlMDhiYzg5NzQyNjEzYjJmNjcwMjQzY2Y5Njg0ZTQyODk0N2IxOGI5MDZmYjU5NWU1YWQ3YTAwMmQ2NjIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoU291cmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjQzMGZmNWYyOWRjZDA0Y2I3Nzk5NDRmNjBjMDVjYzc0YWRjMTI4ZjQwZDNjY2Y4ZmQ4NWMyN2YzYWMzMzE3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QbGF0Zm9ybUNvbW1pdENvbXBhbmlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZWY5NzI0NGVhOTBhNDNiYWI2MGUxNzA4MDEwYmNjYTk1YTc2ZDUwNTE3ZGM4MWMzMWFlZjNjMDA3OTUwOWI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BsYXRmb3JtUHJvY2Vzc0ludm9jYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjRkMjMwNmY4ZDZmMTZmYTA3YjFhZTM3ZDQ2ZWQyZDMyZDM0MWIzNTAxMmVjYTM0NDFiMDVhOThiYTFmZWNiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QbGF0Zm9ybVByb2Nlc3NpbmdSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDkzMjg1YjI1MjM2YWZiNmYyYTQ1NzJjNjIxNzA2ZTYzYTBkNGVhODdmODU1MGQ3NDNkZDU5MTMxNGI2NGM3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qb3J0YWJsZUxpbWl0RXhjZWVkZWRFeGNlcHRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWNkMzNlNmUwYWM0N2I1M2EzNGQ2NDA4OTQ3MWYxMGIzMWNmMWEyMWNjZTE4OGIxZGYyMTJiN2Q4MDlhN2E3ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QcmVwYXJlZFBhdGNoVHJhbnNhY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODgyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZkNGYyMzE4M2Y0NzEyMjNhN2YyOTliZGYwMzliMTNhMjA5MTg5NjM5ZDJjZWQ0OWE2ZjE1ZDM4ZjVlODAwNjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc0F0dGVtcHRSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzQ0NDQ3MGI2ZmQxNzFmYWQxNTg2NjRiOGYwMWM4ZTRkNTJjZWVkMjAxODE2OTFiZDIyMWViMjNjMjBiNjg1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzR2FzTWV0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTFkNjZhZmYyYTgxMmVhMTAwYmU4ZGExMWQ5MTA4YzViNGRlY2RjOGI3ZTljYWMwM2JmZDE5ZmYzZjM1ZWNjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzUmVzdWx0QXNzZW1ibHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTdmNmJkYzI1NTNmOTE0M2UxMzU1YTlhODMwNzgzNjlkZGQwMWM3NDBmNjJjMjFiZTdiMjkzNmI1MzI1MzRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdDaGVja3BvaW50VHJhbnNhY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2E5YzVmMmEwOWQ4YWFkNDcwNWRiMTUwOTUzZTdlNDcyN2JjNWI3ZTU4MDI1MmRkOTljMzAwOTQyYTM0ZDI4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nQ29uZm9ybWFuY2VSZWNvcmRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNGY3Mjg5YWUwZTQ4MTZlZTI1YjU0NmNjYjc2NDQzM2ZlMGNmMGNmY2FlZGM2YWU1NTFlMmEzNWZmZjNmMTA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdDb25mb3JtYW5jZVRyYWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5MzJhMDcxMWNhMGFlNzEyOGRkN2NkNTVlNDQ3NTg4YjUwNzdiNjU1ZjRmZjRjNzk0MzJhMTYxYTI0MDcxYjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0N1dG9mZlRyYWNrZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0YmQwM2EwMzI4OWE2OWRhNmNmZWU3M2I0NjM3YjA1ZDE4OWNiMjlkOTJmODM2OTAzNzc4ZmRmZWU4NDgwNWVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdEZWJ1Z1Jlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3M2YwNmRlMGVhM2ZjNzI3MGJiMWQ2MjFiZmVhZGRlZGM3NTdlM2FhOWY4YzNmYjUwYmRjMTUwOTA1MzYxMzhjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdEb2N1bWVudFZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4NTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMTJjZDA3NGQ5OGE4YzUzMjE3OTdmNjdkYzc4NjNmNDI2YzExYWJkZjY0MzMzMGUyYzU2YmMwYzhmM2I3MzVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdEb2N1bWVudFZpZXcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODc4NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0NDExNGE4YzU3YTFkODUwOTY3ZWQ4MGFlNDZkMWMzMjk0MWU0YzYwMmQ1ZjU2NGU2YTE1MzE0MWEwOWMzODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0V2ZW50UXVldWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDQ5M2I2MjhiYTcxY2U0MDZlYjM0ZDc3Y2ZiZmQ1MjkwNDgzZThmZWFiMGU5M2E2OWI4NjUzOTFkMTdiMjI2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nRXZlbnRTbmFwc2hvdEJvdW5kYXJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhZGJkMDJiZjI2OTgxNzMxMTM1NzIzYWYxNTU3MTY1YTg0MjE0ZTMzOGUyMmQyNzA2MDY2Mzk1YzU4OTg1YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ0V2aWRlbmNlVmVyaWZpY2F0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFhZGU3YmEyOGRiNjFlY2I1ZTJmMzU4YjBiODRhMTk0YzZlYmFlNDlhY2QwMzI2MDIyYTllZWU0MWU4MGU5ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nR2FzQ29udGV4dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDk3OTljZmNmMTQ2YmZmMzk0Yzc0NDBjY2E3MTlkNDQ2Yzc2MjkxOTgxYjIzNTczNTgwM2FhNWY4YjhmNWYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdJbnB1dEFkbWlzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjQ5MDUyMTkxZWU4MmQxNWY0MDEzYTQ0ZWUzMmZhZWVjNzVmNTA1ZTkxMGExMmM2ZGI5M2ZmZTI1ZDI1ZGI3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nTGlmZWN5Y2xlU3RhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZDI1NzZlMDhmNDdhNDA3NzIzN2Q2M2I2NzM5ZDdlNTIzMzU4NGVkZjlkNWZkYThhMjFmMDJlM2QxYmVkMzg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdNZXRyaWNJZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM3NTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGE5NDhlYTRiYzU0ZTcyZWQxODRhMDAyYjk3OWIwYjE3MzU5YmUzNGNkZjYyYjVkNjEyZTZhYWVhOWVkNjAxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nTWV0cmljTWFuaWZlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGIwMWI3NmYzZTRkYjZlYWMzYTM4ZGY3OGIyM2FhNTU5MzJjMDczNzcxNTA1NzZjN2JlYjE4ZGVhMDM3NTZjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nTWV0cmljc1NuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmMTQ4Nzk1N2E4Y2M2NzA2ZDdiOTU1MmI0YjdkZjg1MzVhYzRlZTU1MTg5YWIyOTZkMGI1ZDA3ODM0MGFmYWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ011dGF0aW9uU2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDE2NzJlMzY4ZmNiODg3OGUyZjA1NDVjZDQ4MmUzNzYxOTFhNmNmZGUzMGU1MDBkYTU3NjU4YTE2NTdkNTJmNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nT2JzZXJ2YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGE2OWVkNTVlODZkMGE5MWZhNDg4NzRkNDk4NjQ0NWE0NDAxNzljZmVhOTNiMmFhZWQ4ODg2YzZiYjg0MTZlOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nT2JzZXJ2YXRpb25Db250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjY2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjODk0MzIxOGQ1NDNlN2UxMTZhODA0MGUzYTY2Zjc2ZTczNGI0ZjdiNzFjNmNhZDdiYzcxNzViZDM2NTJkYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ09ic2VydmF0aW9uRGltZW5zaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyY2RkZjE0Nzg1ODExYzMwNTQ0ZDAzOTQzMGZiMTZmYTgzNTlhMmRiMWY5Nzg0NDc3MGM0ZDMxNzliNzc4NDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ09ic2VydmF0aW9ucy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0NzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1OWJkYWQ5MjNhMGRjYzE2ZWZkNThlNWMxZDJjYmM4NTFmZGUwNDFhNTM2ODFiOGJhY2U2YzA0ZjY4ODA5YWFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiNjQ2YjRiNTUyMmYzOWI0YzkwZWVmZTlkODE2NjFjMDg1NmMyMjQyOTNlOTk4YmQ1ODdlY2RlMGMwZGMzOWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ091dHB1dENvbGxlY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImExNGI3YjAzOGUwMGUxNzZhMjA1NGFhZDUxZWZjZmVhNzMwZDE3YzhjZDRjMTRjMGRkYmJjZjAxMTRmNjZkZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1BoYXNlQ29udHJhY3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjRlZGJmZjUwOWRiNWY4ODZjM2JjYzc3Yjk5Njg3OWM0YTYwZTgxN2NlYWYzMDE3ZGVmMjdhZjM3ODA1NTU2NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nUGhhc2VQaXBlbGluZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMTJhYmU4MjNjNGMyNDIwNDYxOGUxZTEyMDFkYTVjY2QzM2ZjNDZkZWY3NWJjNzdhMjExOThlZjE1M2I5NGU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdQaGFzZVN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjlmMmNlNzM3NTlkZGNjYWVkZGRkMTE3ZDI2ZDQ0ZmNjOTZlMzJmMDljZDI5OGVmMzNmZjEwNDNmNzgzMDM4MzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1Jlc3VsdENvb3JkaW5hdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI4MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzM2NmNjQyNGM3ZWY4MDJmNzA1MjViOWViYjE5Y2Y3MmMxOGM4YTYzMjhiNGY2NTgxODA0YzNlMTA0M2I0Njc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdSdW50aW1lQ291bnRlcnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2MyY2JlMGRlZWY1MjBlOWMxZGI1ZjY5NWExMzZmZWM0NWUzNDhkODFmNGEyYTMxZTFmYzBhZjQ5ODUyZTBhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nU2NvcGVSZWdpc3RyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZjU0N2ZiZTJiNjI5ZmQwMmQ0MzMzYzM1ZmY1YTYxZmU3M2U0YTJiNDY5ODFhYjhhNGQyOGFmYjk3NzgxZjE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdTZXNzaW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViNmFhZWVjOGMyNjNmMWVkZWEzYTNkZmFkOTgyYmIzYmE3YWIxNTRjMzQ5NjQ5OWY1Y2QwNmYwNDhmNzc1MjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1NuYXBzaG90Qm9vdHN0cmFwLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzI2ZjQ2MDFhZTk4Mzk3NGZlNWNmYzUwZWIyZjRjMDc1ZjY3ZjBiYzFhOTdlZWNkODM5MWJjYmJhZTA1Y2FhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdTbmFwc2hvdE1hbmFnZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTI5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNlMjhkN2U5MWFiOTBiYjI5NjI1ZGY2NjI2ODVkNWRhYWJkYTEzNzFkMWRhYTEyZmVmYmUzMmNlYzM5MzdiNDQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1NuYXBzaG90VHJhbnNhY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA3NTJkODJiODYzODdhYzA1NmZmODhhNjRjMTU0MDRhMTI5NWY2YmJkOTc3ZDk3NDE0NzRmNDc4MjZmNTE1YzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1RyYWNlQ29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjMzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRmN2JkOGViMTg2YzUxMmNhZDNmZGY4MjBmNTdhYWZhOTQyZWMxMzkzZTk2Y2M0ZmQzMjUzODJjZGRlMmYzNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1RyYWNlUmVjb3JkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImY2OTI3YmVjMmIyOTRkMzZmMTAwZDVjNmNjNGZkYzEwM2U0YjEzZDM3ZjIzNDcyZTA1YTg2NDA4N2EyZTMwNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRGlhZ25vc3RpYy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjN2M5YmUzYjMzZTkyMWQ0NDcxYjBhZGFjNjU4NTU0ODA1ZjI2NTMzMzNhYzhjMjQ3NDg2MzlkZWQwZjAzOTQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvckRpYWdub3N0aWNDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDhkNWNiYzE0ODM0ODlhZDY1OTY5ZjAzYzFiNmVlMGY2MmY0OGQ2M2MyNTkyNjdiNTlkNjRkNmRmOWQyZGY4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JFbmdpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDAxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3ZDU0Njk4YzkyNWQ3NWU3MWI4ZWE2N2RlNGNmMTA0NjU1YTNlZjIxMGI0NTgzYzQ2OWEzODQxMjlkNzZhNzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRXJyb3JDYXRlZ29yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYWU3ZDE1NGQ1MzJhMDM2NmQ3YjE3MmZkYjg0N2E4NmMxMmI4ZDZhZTVkN2UwY2U2NmRjYmFiYmE1MWE1YWU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjcwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0MDIyMmE5ZDU0ODUxNmY5ZWUzNDU3NmVmM2FlMGNjMzA5OGYzMzVkOTU4ZTAyMWU0ZjAwMDFiMDkwNDQwNTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yRmFpbHVyZUV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZjZjYzRhNTYyZmY2N2Q5M2QyNzY5OWViNjcyNzNkOTZjZTg2M2MwYjcxMDFhODFhMDkzYThiMjhjZTFiZmMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvckZhdGFsRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1NjUzZDJmZTc4YzZmNjUxYjVhOWU1NTBjYzc5NjQzMDE3MjYzNjVlOWI5N2QyY2IyNDkwMzU5Y2MwYWJhMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yR2FzQ2hhcmdlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYjBiZjBjOTAyMzQ0MTY5YzYyNTE0ZjI3OWU5NDU5OWM1YmQ3MTFmNTFhZDgyOWVlY2VjOTliNGUyMWJkNDYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvcklkZW50aXR5Q29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyMDg0OGI2NmQ4NWM1MGM5YWQwNmI4ZjE1NjlmNGYyNTkwZmZhZTVmNDQ1ODM2MWQwYzY1OGJmNjg5ODAwMjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29ySW52b2NhdGlvbk9yY2hlc3RyYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODQ2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjM2ODIxNzg2MDJkNWRiMmE1Yzc0MzMzNzgyZGVjZTlhMjI1NmM5NTA5MmE0NzJmZTEwN2Y1Y2U4ZDIzMTI0ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JJbnZvY2F0aW9uU2VydmljZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAxNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjliMjY1MDUwYjRhMDhhMWNmMmFjZmNmMTg1YTY5OGJiMTUwN2JlZjExZWU4ZTNjNTJlOTU1NTMwM2JlMGUzM2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29ySW52b2NhdGlvblN0YXRlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQyMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWU3YmYxOGI3NThiNDIzYmM2NzU4YmNlYzE4YWU1ZDAzODQ2YjdmNmEwMTZmOWZmMDg0MDc2NzQyMWY0NWJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3Nvck1hbmFnZWRDaGFubmVsVHlwZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2ZlNDEwZDE4YTQxMDQ0OTBlZmI5NGQ5OTYyZmM5YWM1ZmI4NmFmODY3OWU1MDc4Y2NkMjU5NDcyNjJjMGE5ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JNYXJrZXJGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyNDQwNjQyZmNjZmQ3YmRlMDE1YmNjNWQ1NTE1MTI0NDVmODNiNjFlMDhkZTQyZTRkYjViZDNlZmI1Y2Y1YWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yTWFya2VyU3RvcmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDIwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4ZjhjNjNhNjlmODY2MDQ4MjJjZWZiOGEzODkwYTVmN2NjZGM3YTc1MWIzMWVjOTdiMWM3Njk5OTE3ZmQ5NjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yUnVudGltZUFjY2Vzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxODY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjVmZjdlZjljOWMzMWZmY2I0YThiNzY2Y2M3NzIzNWZiMjQ2ZmY2Yjg3ODAzZTA5ZGZhYjNlNTVhOGMwOTIxNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JTdGF0dXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQ4OTFhYjk0YjhmOTM2YjNmNGE5YTBkOWQ0MmFhNjRjM2M3YTMzN2JhNjY5MmVlMjdmZTcxMDU3NDQxYWNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm90ZWN0ZWRTdGF0ZUd1YXJkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0MjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWVlYjE4ZTc3ZTQ2OGFmZWM1NTAxZWM0NWI5MmI2NGI1MWJjYTA5ZWQzZjg1Y2NlYjI1NGU2NWU3OGQyMjM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1JlY29yZGluZ1Byb2Nlc3NpbmdPYnNlcnZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY0NzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZjM4Y2NkZDA2OWM5YzU1YjMzODU1MzU1NjM2ZDczZDg4OTIxZGU4NmVjMzBkOGE2MDQ0ZmVjYmU2ZWJkODQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1JlZ2lzdGVyZWRDb250cmFjdFNjb3BlSWRlbnRpdHlTbmFwc2hvdE1hbmFnZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjE2YjhkYzAxZTQ2ZDk1ZjJiYTNjM2RmMDU4ODE1Mzc3YmRkYjNkNzVhZGYyMTllN2RiYTAyM2QzMmQ0OWE1NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Sb290RXh0ZXJuYWxEZWxpdmVyeUV2aWRlbmNlVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjNlOGZiYzY5ZmFmZTc2ZGE1NWE5ZDE3NDZmNTkyOGE4NGRiYTc5NWM2YjUxMjljMDdiZjJjYzBmNjUyNWNmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SdW5UZXJtaW5hdGlvbkV4Y2VwdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1MDJiMjEzODc2OTU3MzE1N2EyZDczZDE2MTZlM2Y2NDA4NzQ4NDM1YWMxYmQ2YjYyMGQ0OWY2OWVlMTMzYjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUnVudGltZUdhc0V4aGF1c3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTBiZmYzYjM0MTJlYzliOTVlY2FmZDM3ZjFkZTMyYjQ2MzE4ZmYzYTQwMDQyM2JjNjU0NzI4MzZkMTQ2N2FkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SdW50aW1lV29ya0J1ZGdldC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNWFmMTI2ZWQxY2YzNTdjOTc0YTFhZTI5NGZlNjMxNWEzYmIyNTA2NjIyZGNiYzliMWFiOWE1YzJmMzYyOTYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVXb3JrU2Vzc2lvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3Mzc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdiZGU1YTM1MDVkMDgzNWM2NTgxNTQ1YzYxNmM4MzgwNTkzMzA5OTAzYzYzZmMwMThmY2Y5ZmEyMjQyNmJjZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TYW1lU2NvcGVDaGFubmVsQ2F0YWxvZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1Mzk3M2UyZDBiYWEwM2YwMTcwZWU3MTlhYzhmMzFhNzdjNWVlYzRmY2MzYmFjMDk4YzgzN2IzNGYxMTZlYmNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlQ3V0b2ZmVHJhY2tlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMDQ4N2Y2ZTljNWU3ZWE4ODYxZWI1NzFiNWIzY2RhYzI3ZTZiODE0ZTkzMzJkYWY3N2EwNmRiZWJjZjlmYThmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzQ1MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzYTJiNTkyNDA5ZDAxY2QyMWFhNzhkMmZkMTE3NWFjZjkyNmZiYzAxNGY4MmIzNDI3NDA1ZGM0OGFmNjZlM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVGcmFtZUZhY3RvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1Nzg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWY4ZmQ1MDlmOWE2MmE2Mzg0NzkzODUyODcwODEzNWMwNjNjNzljNTAxN2IwZjBmNjk5NGRmZGZhZTIwZTBiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZUhhbmRsZXJEaXNwYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIzOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyY2FmM2I4ZDRjODdiOWQ4NGVlOGE1MTRhZWJiZWQ2NzJmODdlMDc3MjFjMjRmMTEwMTgxOGYyNzkwZDEzNDIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlSWRlbnRpdHlFcnJvck1hcHBlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZTk1NWM1OTE5ZjkxMzc2MGY0OTk3OGQyZGM1YzllOTg2NmQwODlkMzQ0YmUzNjIzMDI2ZDNkNWVhNzBhMmJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlSW5pdGlhbGl6YXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ODg1ODA2YzJlZjVlNDRmODM0MjEwNzAzMGM3MDY4YThmMzJlN2MzZmNmOGFiMjBjYmRlNGRhZWU1ODMzNjE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlTGlmZWN5Y2xlRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWJiZDY4YTExNTEwNDYwMmE3N2EyMjk5NzRkMTFlZjVhOTk2ZTBkNTM4ZTdkNTllOGY0ZDNiZjllODY4YmE3YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZU11dGF0aW9uRXhlY3V0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzNjNjUwNzk3NGYxZmYxZWY5MzUyYzExMjdjOTViNjc1YmI3ZWViODlhOWFjODJhNDgzMDg1YjBhNDAxZDczMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZVBhcnRpY2lwYXRpb25SZWdpc3RyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMWU4ZTliZTgzMTcyMDYwNDk2NTQyNjc4YmNkNmM0ZjRjMTRkMmYwMDQ0YjI2ZTY3Zjg5OTlhZTk0M2FjMzVlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlUHJvcGFnYXRpb25DaGFpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzEwYmY5YWRmMjk2YTgzMDhlOTdiYzc0YThkYjRiYzMzYjg0MmM5MjY1NDM1Nzg5ZTkyNGQ5MDgxM2M5ODA5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZVJ1bnRpbWVDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTkzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI1MWFiZDQ1M2M3MzBkMGExMDFiZDgwY2M3ZGIxNmVmNGVjMTY3MDYwNTA3MmY3NmJjODMzZGZhODE4MTQyOTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVTb3VyY2VQcm9qZWN0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ1MzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzMyODVmNGEzNmY0NjRiMGVjNzQxZjViOTU5NjhkYWRmYzNjZTBhZGJiNzY1MDdiZmNkYzlhZWM0NDM2ZmNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlbGVjdGVkRXhlY3V0YWJsZUJvZHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIyZTA3NWUxMzgzZWY2YTZkOWU1NzM2YTJkYmIxMGYzNWU4ZTBmMTA3OWU4OTAxYjlmMjg5MGQ4NTY1NjllMGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VtYW50aWNHYXNGb3JtdWxhcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NzY4MjkwZjI5NWUwNzgyODEyN2IyMGRhNmJkNWM2ZmZhNDM5ODFiOTY3MjAyOGM5OWRjZTZjNDRiODdkMGUwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlbWFudGljR2FzTWV0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjYwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM5NWUyMDI0Y2NlMjQxMTM0NWYwZGEyM2I4ZjA3MDJkYWJiMTNjNjc1M2EzYTFiOTVlM2JiMjViMzMzNTVhY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VtYW50aWNPdXRwdXRCb3VuZGFyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0NTQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjU3MWQ2ZGU5YTc1ODc2NGQyNzkwZTA4OWYwMWQyZDhhZGE3NjliNzA3ZGNiOGI5NjAwMzJlODFhYmQ3MDY3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZXF1ZW50aWFsUGF0Y2hQbGFubmluZ1Nlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTMwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWIyNDIwYjUyMjlmNzZiMGI1Yzc5ZDFmYTAxNmFiMGMwNzllYmE1ZTJlMTA0OTVmNDg0ZGYwOWM3NWQyZjI4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25EZWx0YS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMzQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjBlODMyMTYxYWNmMGE0ZDQzN2IzYzVmNWRjYTIwYzQxODIxZTIxNDIzNmMxYmQ4MmEzMzRiY2ZmMjkwMjJkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25EZWx0YUJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmRjNmU2MTdlYjkwYjhmNTJlMzU3Y2Q2NjBlN2ZlNjlhMmZlZjJlZTM1ZmNkOWRhNDQwN2M4YmE1NzRkOTE5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25EZWx0YVZhbGlkYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MGE1YzQzZmFiZWU5YjdjMmY0ZWViYjIwNTY1ODJhM2FjYjlhNTk1OWE4ZTJjOWRjNDFjNjhiOGU5MDA3NDYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvblN1cmZhY2VJbnZhbGlkRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjkxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiODQzNzZhNGE2YThiY2QzOTEwMGYzZDVlOWNlNmNjYzU5YzkxNGZjYmZiY2YwMDIxMjQ5NTg4NDk3YTlkOWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU3Vic2NyaXB0aW9uU3VyZmFjZVByb2plY3Rpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjg1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1ODczN2UyNjEyMDYyZTQ0YjQ4OWFmNjFmZmQxNzU0YWZkYTgwMzM5NGFkNzU4NWRjYWQwMDQ0MGVlZjA5NDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU3Vic2NyaXB0aW9uU3VyZmFjZVByb2plY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwOThiZGE3MjdmMzZhMDI2YWNiMTc0ZDM4OTNkMWViMTRiNWQ5YjljYTk3ZGEyYmZkMjBhMTk4OTllZjlhMjYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1N1YnNjcmlwdGlvblN1cmZhY2VSdWxlcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDExNThmNmMxZDM4ZTZhZDhiN2Q2ZjhjZTdmZGQxMjBjNzljMjZlZTI3ZWMzNWUxNjJjMGExMzc0ODliYWE4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25TdXJmYWNlVmFsaWRhdGlvbkNvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlNzc5ZjJmMjNkY2UwZmFmMjg3NjA0NDFmZjMxMmY1OWMwOTE1ODU5MGVjYjczMjkzZGM2ODViZDA0MTI0OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU3Vic2NyaXB0aW9uU3VyZmFjZVZhbGlkYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZmYzU5OTc3ZWRiZDNmZDg2ZGNkMmY4YWU2YTBhMWIzYzRkYjA1MmQ4MzExZDE4YTk5M2QzMDJkYzgzOTZiZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvVGVybWluYXRpb25TZXJ2aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDcyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNGY2YWM1ZTcwNjk5YjJiYzU4MWJmNWZiMjM0ZGYxYzM4MWM5ZDM3M2FkMTliNWU5Mjg2NWY1NTI2NzkwNTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvVHlwZUdlbmVyYWxpemF0aW9uUG9saWN5UmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDE0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhOWE1MTE1ZmJmNGJjY2IwMzgwNDg1NDE3ZWIwMDc0NDNkZDUxODc3ZjY1ZjQ3ZjA0YTdiNWQ5YjFjMWJlY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvVXBkYXRlTWF0ZXJpYWxpemF0aW9uTWV0cmljcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIxMGFmNjEwYTQxYzgxMDk0YWMzYTk2YjEwNzU3Y2NlYjU1OTE0MjRlOWI0NzY1OWIyMmE1N2I5NGRlYmQwY2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvVmVyaWZpZWRFeGVjdXRpb25FdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGYwZGZmMTY5YjEzNzY4YWVkZWQyOWZkZDQ3ODk0MTNiNjgwZjk0NDFiMzE1MTYxM2JhMjcyYjRhNTkyN2NlNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Xb3JraW5nRG9jdW1lbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODAxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlN2VmMDA2ODNmYzhiZThiZTVkMjU2OGY3NjVmYjJiZDlmZWZmMzJlYWM2OTY3NDQ4ZjY4NDdkZmQ3YmVjNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQ2hhbm5lbENvbnRyYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhNTkyOWE1NmNmMmI3ODAyY2ViNDFjOTA1YTc4ODMzZjY2Mjk1N2I3NTUzOTA5Y2M2ZjVhYmIyYWM0NDgzNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQ2hhbm5lbEV2ZW50Q2hlY2twb2ludC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMTk4MTk1ZGUyZGJmM2Y4Y2U5NTZkMTcyMmFjZWEyNTEwZGYyNzUzN2MzODRjOTAyNjhjZjRkNTlkNzllNzYzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0NoZWNrcG9pbnRFbnRyeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMTQ4ZTE3YjkyMjU5ZmY1MjJjM2M0MDgxMmVhNmEwYmQ3MDZiNmYzY2ZhYjBkMzIzMmY4OGZkYTNjNjNmNmI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0NvbnRyYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAzMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjczN2VhODBlMDhjMDk5YWUxMmJlNjBiZGU1ODk2YzUxZjczNmQ4YmJjMjdiNDAxYTMxN2JkNDJlM2U1MWMwZjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvRG9jdW1lbnRVcGRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjAxZThiMjQwOWY0OTQzNTk2OTEzYjVjNTliYWE3ZDVjMWZjZTAzYzc4NDIzMmUyNWM5MWMwZTBlNjRjYjY3MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Eb2N1bWVudFVwZGF0ZUNoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWRkOTdkMDQ0NmE4MzBlOTFhZTcwNmEwZDU2NTYwZjc0ZGFhMmQ3Y2YwMGJlOTg3N2E1OTc5OWEwZTYyYWIwOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9FbWJlZGRlZEV2ZW50RGVsaXZlcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjgxM2Y0ZjFkZGUyOWVhNjI1MmQ0M2Y2NTU2NGJlOTM0M2E0YTBhN2M0MDZiMDhlZmFlYTMwZDRhNWMxMjNlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9FbWJlZGRlZE5vZGVDaGFubmVsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1YzA3NzhjMWUwOGNkYmFmYzIxOTc1ZjUxOWY5OTE5OWU4MzY3YWZmOWYxZjk0NDhmM2U3YWRhMzFkMTJkODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvSGFuZGxlckNvbnRyYWN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc1NywKICAgICAgICAgICAgICAic2hhMjU2IjogImY0Y2U0NTIwM2NkZWQ1MDYxZTRiMjhkNGRkNWNmZTQzOTk1ZDUwMDAzOGExMjY2NjEwMDhhZTk2ZDU1Y2JmYmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvSW5pdGlhbGl6YXRpb25NYXJrZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDJlNjdlOTc3YjhjZTM4YTVjZjk4MDU3OTZjYWIyZmY5MzNhNjcwZDE3ZDUyZmQxNWRjZDcyN2U3YmI3ZmE5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Kc29uUGF0Y2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjcyNDE0NzVlMzUxOWI4NjI0NGQ1ZThlMWFmYmQ4NjRhYzg0NjM1YjUwM2Y5OWUwYTc5YmJmNjczZDBiN2Y4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9MaWZlY3ljbGVDaGFubmVsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDM3NTFmMDhiMjdmMjIzNDBiZTBjNjU5ZjMwYjI4YjVjN2YyNDIwM2Y0NWM4Y2UxMjY2YmIxZjFmNTA1YmFkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9NYXJrZXJDb250cmFjdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxODliZTQ2MGNhY2IxMGVkYTZmOWE5ZjgzOWRhZWM0YTgxOWJjOTlhNTdiZThiYTdiMGM2MzRmMjZiNWU5M2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvUHJvY2Vzc0VtYmVkZGVkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUwMDM5ZmEwZDhmM2FlYjUwMDBjOTcxY2IwMzcxZWU4NzM1NmRjYzU0ZDZiMTdlOTIyNGE2NGExMTRhMzAxMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvUHJvY2Vzc2luZ1Rlcm1pbmF0ZWRNYXJrZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGIxZjg1ZWE1YWE2MzJjMjMwOWNjMDU1MDA2YWMxNjZiMzVhYzk2ODUyYzIyM2U2MDNhM2I2NTVjNTliNTE1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9UcmlnZ2VyZWRFdmVudENoYW5uZWwuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzE3Yzc0ZjQ0ZjJhNTMxNWY3ZTI5YzY5ZWMyZjM0ZmM0NTg1MmJkMGQ5MjllYzExMzk5OWRkOGU3YzIyOWQ3YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9UeXBlR2VuZXJhbGl6YXRpb25Qb2xpY3kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJjMzRiM2FmMjI1ZDM0MDRiY2ZhYmY4MzZkYWM3NjE5OGIzZGQ4ZWU5NjhmZWRkN2Q2YThjNTc3ZTk1NzJmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9UeXBlR2VuZXJhbGl6YXRpb25SdWxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImIxOWVhMjUxMDZlOGZhNzFjNGIxYTdlMjg0ODFjZmYwOWI4ZDZhOTVlMGQ1NWVkZmU2MTRlZDA4ZTA3YjQzZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhMDM4MWRhOGJiNzM2Nzc2ZDZhMjBjNTI1ZWE0ZDYzNDVhMzhiYjFlYjAxZDE1YWY0NTZmMGY1OTUwM2E5NDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJjZmYyNDMzYjg5MTEwZmNhNDYzOTRiMzk2ZmZlNzkwNDZmMjU3NjMwMTNkMzU3YjcwMzMyYzAwNDM1YzJjNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvcmVnaXN0cnkvQmx1ZVJ1bnRpbWVUeXBlUmVnaXN0cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTA0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjExYjNjY2YwNGU4MmU5ZTYxZTc3MTQzYjliYjFlYmQ4ODdlYmVmNjc5OTBhODBkNmQ4ZTZkNjU1YWI5MTE0ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvcmVnaXN0cnkvUnVudGltZUJsdWVJZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzAyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTA1YjJkOWIxOGI5OGU1MjQxNjI3OTA5ZTFmMTMzZDNmYzgxZmQ2ODE5ZTY0OWM0Mzc0YTExYzllM2JhYWVjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9yZWdpc3RyeS9SdW50aW1lVHlwZUFsaWFzZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzI4ODFjZjY1NTkzYjE5YTM0N2JmYjhhZjJlMTk4MjQ5Y2Q3ZDk1ZDFmN2YwYWY1ZjZmMTlmMDA1NWFmM2U5OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9yZWdpc3RyeS9SdW50aW1lVHlwZUtleS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYTY3NTA3ODExYzcyMTgwMGE2Mzc4MmY0MzQ4M2VhOWQ1ZjIzNTMxZjcwYTI5M2FlNjE5NzM5Yjc5ZTg0MDE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3JlZ2lzdHJ5L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MWIyNWFmZDk0Zjk2Nzg4NzRhNDJiZWY3MTc1MjFhYzM3NjAwZmVjOWI3YWQyNGVhY2FhNDVkMWE0OTdhYTAxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3V0aWwvTm9kZUNhbm9uaWNhbGl6ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTI3ZTE2YTdlOWI0ZDU0MWJhNzQ1MjMwYmNiYmE2NzdkMmVmMGVkODcyODc2Njc4Y2M1NjUzNWQ2NGEwMDFlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci91dGlsL1BvaW50ZXJVdGlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk5MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOGJlMWZkZGNhNjg0MmM2MjlkMTE2ODYzNWE5OGU5MmNlYjQ5NjQ1ODljNzlkMThmMGQ1YmM3ZTE2MzY5MGQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3V0aWwvUHJvY2Vzc29yQ29udHJhY3RDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzk3ZmMxYzc5ZGVjZDM0NGJmMDc2NzkzYTc1YmM0YzhhYTlhZjU0YWRkMDZmYjVjYWQ3MmU3MGMyZDg3NGQ1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci91dGlsL1Byb2Nlc3NvclBvaW50ZXJDb25zdGFudHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDY3YmUxN2U3ZDc1NDE1OTdhYzA2M2I4MGRkNmY2Nzk2ZDcyZWRhNzRhMTlhZWNhN2ZmMmYyOWNiN2Y2YWE1MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci91dGlsL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OTU1NzgwMjk1MWE1MmUzYjcxN2JiZjYzNGY2OTg4ODE2NTJjYjQzYjNkODRjOTBjOGMzZjNmYzkyYTdlYzIzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzLWdhcy0xLjAueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWY0MDU0Yjc3ZmM3ZWYwMWEzZTYyZjViMjlkMjA5ZTg0ZjI2ZTg1MTQ4YzkxYjAzZmU0OGRhMmMzNTc5NDA4ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9DaGFubmVsLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU3MjBmM2E5MGFiZjk1ZGU2NWVmZmNlOGM3NDllM2I2YmVmZjU3NmQxMDAwNDk1MjA2Nzk1MzM1NTY1ZjgwZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9DaGFubmVsRXZlbnRDaGVja3BvaW50LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Y0ODA1MjMyZjZlMjJkMmEzMjA3OWFkMWRmNjdkNTI2Mjg2M2Q3Y2MxZTI4N2YzYjljZDY0Njg4ZGJkZjRlMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9DaGVja3BvaW50RW50cnkuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYWNlNTkyZTQ1OTdhYzVkMWEzMzEwOWQ0NTZlOWE4NzZjNzY2N2ZlZmNlZGE3MmQ4YmEwNGIxNTRiMTcwYzg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0NvbnRyYWN0LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWNmNjQwZmI4MTBjZTZjYTlkMTk0ZTMzNThhYTExNDIzNzMzZWRiZGUwYWNiZDFlNDZkMGRhYWM4ZTEzNDM5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Db250cmFjdEV4ZWN1dGlvblJlc3VsdC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiM2ZkNjU1MDdjOWRiNTg5ZWU0ZTNiNWMxNGY2OGYzYmE2NGEwYzk5OThhODJiOTg2MDViZWQ2ZmJmMGU5YzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvRG9jdW1lbnRQcm9jZXNzaW5nSW5pdGlhdGVkLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTBhNjhhMmE4NjliMGEyMzRlMDZhYTk5NzQ3YjZhM2RmZjdmNTJhYzM0ZmRjMTE5ZGIwMGEzY2FkZWQ2ZWVjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Eb2N1bWVudFByb2Nlc3NpbmdUZXJtaW5hdGVkLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTQyNTUzZTg5ZWVmYTY4NDg3ODRjM2M0YzlhMTU0OGNlNjlmYTYwMTU0NDBjOGIxMTlmOGVlMGM2ZmNiYjMwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Eb2N1bWVudFVwZGF0ZS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3YzU1OTY1ZDA0ZGI2NmVlODhiZjAzY2RhZDQxMTUyOTY1NGJlYjk0YzZiYzhkM2ZiMDNiMmU5YmVkOGRkY2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvRG9jdW1lbnRVcGRhdGVDaGFubmVsLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODVlOWJlODEwNGVhMTAxYjllMjI2NTcyZTg1YzJjODNmMDViZTVmYjUwZjAzODE2YWI3ZWVmYmMwYjJiYjdiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9FbWJlZGRlZEV2ZW50RGVsaXZlcnkuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NmU1MjA3N2JhZjdmN2E0NzNmNDA0OTQ0NmNmNjQ2Yzc5ZmFlNWZhMDJkMGY2YzBkNDVmNDE0MzRhZjg0NTlmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0VtYmVkZGVkTm9kZUNoYW5uZWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDFhZjg2NzBhMWZkY2Y0NjEzZmM0ZWI3ODQwNjFiNjE0NTA5NGMxYmRkM2MzYWU1YjliMmM3NWE4NDM1NTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL0V4dGVybmFsQ2hhbm5lbC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU0YzNjODg4YWE1OGI4YTIyNGUwZmFmMmZmZjNiZGM1OWU1MWY0ZDEzNGYyNTg0NWVmMTgzNTU5NWI0NGZmMmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvRml4dHVyZUV2ZW50LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQzYTE3NzczZDI4NGNiNTQ0ZjU2ZTYxNWFmODYxYjFmNTU1OTIwY2Q5YjkxMjNhM2I5ODI0NjU2ZDY2MjIwYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9IYW5kbGVyLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2VmYjgyMDlmMDZmOWNhYWRiZTQxMDE1NzA0YTJmNzg3Zjk0ZGM1YzQ1MmE1ZDA4OGU4OWJiMWYzZmUzOTIwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9Kc29uUGF0Y2hFbnRyeS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzZjY5NTQ3ZGFiOWFkZjExNzVhYTliZGVlYjI0Y2VhY2Q2NzM0ZGRiMWM1ODQ2ODNjMjg0NjRkYWNkN2FmNmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvTGlmZWN5Y2xlRXZlbnRDaGFubmVsLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWI1MmRlMTljY2NkYTU2ZmZlNmQ1MjUxNTFmZjY0YWY0OTdmMGUxNmI0ZjNmNjdhZTEyOTNhN2ZkZmJmMDEyMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9NYXJrZXIuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YmE3YjFkYTc5Y2IxMjAxYjFjZDYzMTkzZWM5YzczMzU4OGNjOGNkMmY1NzQ2NjRhM2VmMzdlYzJiZjkwYmY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1Byb2Nlc3NFbWJlZGRlZC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlOGE3MGMzMDA4MGYwYWZhMTg3ZDEyZDI5ZGNjYjA4YWE1ZWI0ZTE5YWU4OTM4ZWE1MTdiNjg5ZGY1YjlmYTFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1Byb2Nlc3NpbmdJbml0aWFsaXplZE1hcmtlci5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmZjVhOGQxYmMwNmY1YTZiYzlhNWM0Y2QxYzM0MGQwNWM4M2JlMzk2OTdmMmU5NjZhODRhNjdhNDg5YjMyYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvUHJvY2Vzc2luZ1Rlcm1pbmF0ZWRNYXJrZXIuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NWRlNGQwN2I4OGNiZmU5OTc5ZTlhNGUwNWYzYmY4ZmY5YjgwODZlNzRiNDA3NGEzZDMwNjFmYjFlODhlZjgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1J1bnRpbWVDb3VudGVyRW50cnkuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDdlN2U1Yjc1Y2JiYWQzNjU1NmE0YTQ4YjdkMTdkYjVmNjJhMTlhNTM3Y2ZjMmZkZDYyNDcwMmEyZGExNGI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1J1bnRpbWVMZWRnZXIuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ODg1MThmNmY2YmM4NTcwZmZlZjcxOTgyMmMzMzU5YjQxYzE0MGU3OTVlM2I0ZmY3NGE3ZmQyYzI0ZjRmMzE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1NjcmlwdGVkRXh0ZXJuYWxDaGFubmVsLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgyNDZkNjJkNzdiYzg4YmE0NWU5N2U3MGM5MjExZTZjNjM3Nzg5MmE1ZTRmZDE3MGI0YWUwMmU4OWMyMzA2ZmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvU2NyaXB0ZWRIYW5kbGVyLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWYwYmY1NjYyOGQwOGY2ZmQzMDIwZWRlYTA4NTM4MWE3MzYzOTM4ZmFjMmE2N2U0MzJmZWI0ZjI2ZWNkOWJiMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtY29udHJhY3RzLTEuMC9UcmlnZ2VyZWRFdmVudENoYW5uZWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMzgyMzNhOGJjODc5OWI2NmNhYjE4ZTc1MzJiZWUxODU1NzdmNzZiOTljMTRjMTY5ZDI1NDBkMjk4MTcyZmE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1jb250cmFjdHMtMS4wL1R5cGVHZW5lcmFsaXphdGlvblBvbGljeS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1ZWI1MjJhZTdlZTc0MDc0MTQ4YTJhYTA2NDUyZjhkZjI2ZmEyMzY0ZWZmOTIwNWQ0NmM5NGJmODJiMWYwMjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvVHlwZUdlbmVyYWxpemF0aW9uUnVsZS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxZDUzMmYzNjNiYjMzZTM0N2VkZGU2ZjQyZmI4NWRkNjVlMWUzNDg5Mzc3MTQ5OWZhY2ZiMDU3MjlkZDEyZTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWNvbnRyYWN0cy0xLjAvbWFuaWZlc3QueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MjgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDRjOTRmMTJkMDI3MzRiYTUwZjhkYzZmODkyMTBiNzljZTE3MzU1N2UyOTlhMTM2YWYyYTQ1YjBhYWJjODY2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3NwZWNpZmljYXRpb25zL2JsdWUtY29udHJhY3RzLWFuZC1wcm9jZXNzb3Itc3BlY2lmaWNhdGlvbi0xLjAubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5MTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQwNjE1Mzc5MWVkOTljZjk3MTYzNzI2YjhkMmEyNzJlM2YwY2ExMDc4ZGM2YzlmNjliODE4NTVkODFlNWM4MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9CbHVlQ29udHJhY3RzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MDc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTUwY2M4MDhkOGVmYmU0NThkNzE2NDhlNmJlMmRlZmJiZjZmZDgzOTQ5NTliMmVjN2YzZDRkMjA0MzVkNTRlYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FbWJlZGRlZFNjb3BlUGxhblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTc4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhYzM3NDNmMjM4NmM5MWU5YjU5MGI1OWEyY2UwMWY2YzgxNmE4Y2YwMzY3YmY4NDFmZWJhMWJiZmE2NjhmMDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWNvbnRyYWN0cy1jb3JlL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTY29wZVBsYW5uZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDYyMDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxOTgxZDQ1OGE5NGExZWQyNmQzYzg3NmU0YWEzNDg0ODY4MTMyMzI4NDIwMzM2YjhjODgxNDEzNjE0OThhYzI1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsU3Vic2NyaXB0aW9uUHJvamVjdGlvbkJ1aWxkZXJQcm92aWRlck91dGNvbWVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY1OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNWQxMTg4MjMzY2FjMmJlMDYxNWZlYzNkYmQ2YjIzZDQ5ODdmNmIzODUxNzliNzAyMjllMjJiYmY3NWJjMTRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1jb250cmFjdHMtY29yZS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BsYXRmb3JtUHJvY2Vzc0ludm9jYXRpb25QbGFuVmVyaWZpY2F0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU5NjU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWFiNzZjYTczMTVmZjZmNjM3YmI2YTJkY2UwMWJjZDY0MzI0MDIyZTA1YjBiNjEyNTgxYzA1Nzk1MDE4YTJhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtY29udHJhY3RzLWNvcmUvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Qcm9jZXNzRW1iZWRkZWRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjIzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1ODVkMmE3NjBkZjJhOGMxZWVkNzJlM2YwYWFlMzEwZTA4MWM5NTQ4NTU2MmM1YzliMWMzNjRlNWQ3ZWU1ZTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlYWEzNWIyODlkZGM5YjY2MDkwZWM0MzVjMzljMzhmNzU3MGViODBmYTk5MzZmZGU0ZGFkN2RlMGI0YjQxYWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmFzZTU4QmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhMTY5NGFhMzFmNTY3ZjE0NTE5ODQxMzE2ZGNlYzJjNzc4ZTkzNTg5YjBmNTQ0NzRlOGNjNzdiZmI3ZWEyMjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQ2Fub25pY2FsSGFzaEJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNmQ3NzNmYzg5ZGZiMjQ5ODBjN2FkMjBhNDNiYzA3MzhjZTg5MzMwMGIxZjYwZTdhM2E5NzczNGVjZTIxOTEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbkNhbm9uaWNhbERpZ2VzdEJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3NzNkYmNjODRkMTliMzY1YzE4YWRmZDZlOGFjMTNhYjViNDlkNGRjYmM4MDM3NzRhOWI4Y2FhMDRmZWU5Y2Y1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGVJZGVudGl0eUJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MTdhMTA5ZTNiMWQzODMzMGIyZjk5YmEzNDhhMzY0ZWY2MzhiMWYwM2Q1ZjdiYzI1MDI4NGY1Yjk2OTlhZGNmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZUNhY2hlUG9saWN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY3NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZTI3YTUyNDBmZjM1NDJjYzI4NGZiNDVhMTcxYmJiNjE5ZjY2ZDU1MzA1ZmY2MWYyZTJmYmU3MmE2NDlmMmUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZUNhY2hlU3RhdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MjI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDcyOWFjZDkzMWE4ZjBmOGViNGIxMWIzODNjYTVmNmM3NGIxZDJkYWZmY2YzYzMxOWMzMmRlMWIwZTQzYjQ2MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvYXBpL0JsdWVMYW5ndWFnZUVycm9yQ2F0ZWdvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJhNjdiNTkzODBkMmZmM2U4NzVkNTFkMTU3NjM3NzUyNGE2NDQyYWM3N2E1YTlhYWQ0NmYxMDY2NDM4YjczMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvYXBpL0JsdWVMYW5ndWFnZUVycm9yQ2xhc3NpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg5MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZGIwNTMzODQxMzM1MjA4ODlmZjMxZmEwNmVlZGY4NjBjODJkNjhhMDVjMzJkYjJiNzc3MmM2MjAyOGI0MDg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZU9wZXJhdGlvbkxpbWl0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzN2VlMGI4OGI0YjkyMzdiNTIxZmYwN2FiYWYxNmVkOGZmZjk1ZTU1MmM1MTA0OGJiNWMwMGRlMGQwMTE4ODU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZU9wZXJhdGlvbk91dGNvbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Yzc3OTM5ZjIyNTE4Mzk4MTQzYjJlNTE3MzY1MmZmNDk1NDk4NjlkMWNmNGQwN2I0Y2MwNzk1Y2EyNTM2Y2EzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZU9wZXJhdGlvblJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3MTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YTE0NzBjNjlmNTJhMjFmZDJkZTVhOTQ3ZTcxZjFiZjZjZWE4Y2VhOTc5NGQwNzEyYWU5ZTQ4OGMxYjMwYmI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9hcGkvQmx1ZVZpZXdQYXRoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjc5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdhOGNiOTViNDdlYzZlOGQ0MzNkNzJkMTI0YzM2MzU3ZGE5Y2JhOTliNWE4NGZmZDdjOTUyNzhlODAzNDUwODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2FwaS9Ob2RlUHJvdmlkZXJPdXRjb21lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWFmMzgyYzEzNWY4NjkzZThjZWUwZTMzNmQ5MmM4Mzc3MmM0MjZmYWRkOWMzY2I1YjIxZjgwOWM2ZWJiM2U0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvYXBpL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YzQwMGVkN2NiMTA5YmRmMjcyMzIzMDIyZjlhMTZmOTZhMDA0NjE2YTg0MzM0ZmEzMmFkNjA3YzE4MjFhMjY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb2RlYy9CbHVlQ29kZWMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDM5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YWMwZDRjN2ZkZGM5ZjMyN2MxMTg3NWY5Yjg0MWY3NzBjZDA4ODZkNWJkNGU0ZGU4OGU1OGI0ZjNjMDJjNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29kZWMvQmx1ZUZvcm1hdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5MDM4NTBjYzk4NTA4ZWIzOWE4OTc3OTNmNGUxMGM2MDE4N2FlNWVhNmIwNzNhZTIzZGE2OGMyMWVmNGZmM2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvZGVjL1N0YW5kYXJkQmx1ZUNvZGVjLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA0MywKICAgICAgICAgICAgICAic2hhMjU2IjogImI5MjQzYTUxM2ViMDcwOWJiMjZlM2I0Yjc3MjRkZmI3NWNkNWE2NzVkZDFlZDc3OWQ4NjFjMDRjODdiZTYzNWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvZGVjL2phY2tzb24vVW5jaGVja2VkT2JqZWN0TWFwcGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNGI2YzQ4YTI0YmYzNDI5N2ZmNWQ1Yzk5MWVhMjgwNzJkZDEwYWViN2FlMTlmNTAzMTliNTJiMzY1NGYyNGI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb2RlYy9qYWNrc29uL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNGRmZDhiMWY5NTlkZTczOWI2NTQ0NmFiZmQ3NjkxNmEyODIyNDIzYTU2NjNhYTg2NTBlYmRlNGRjODJhNzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb2RlYy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTU2NDJkZDcyYmI3ZmU5NDcxYTc5Y2Q3NWUwODM4YTI4ZmJhM2FmMzZmM2VhYmVkNTIxMzQ5ZjZiMTk2ZTUxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvQ2Fub25pY2FsR2VuZXJhbGl6YXRpb25QYXRjaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MmRjODI3OTgzMTAxMzI2ODZjOTE3OGRjZjViMDAwNmI1MWM0OTk3YTBhNThjNDNkZmVkMTIxZjlkYzRhYTIyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9Db25mb3JtYW5jZUVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1Njc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE5NjU4ODNkZGViYmI4MDZlMzM5N2MzMjY4MWMyNDkxODYxYTgwNWZhZDRkYzE2ZWUyNmFmMTU1YTc1ZjcwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VQbGFuLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdkYjJlZWViNGQzYjFiYTE5ZGI1MGExZjU2ZjJiZDBjMTEyZTg2ZmM3MjA5MjZiNTNiZDlkYjlkODNiZDI4MzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlUmVzdWx0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjViMjkyODBjYTFjN2MyOGUzZWRiZDA4ZDRiOWQwNmUxYTI1ODM2ZjE1YjY3NTE0OWZmMDEzZjcyYWYwNGNiNDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL0Zyb3plbkNvbmZvcm1hbmNlUGxhbm5lci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWVhZThkMmM2OTUyNDdiMzJlMWMzZDE5OWM3ODE4YWM0YWYwNmYwOTEwOGJiYTY3ZGIyODIwN2RmOWNkZTMzOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE4NDgxYjFiZGI0MmM3YmZhNDEzNDVhNmQ4ODJhMThlNzIwMjFkZmU1OGY3YzgwMDk4NzcyZTk4MmYzYjk3MTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2dyYXBoL0JsdWVHcmFwaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzFhNzllMDA5NTExMWM5ZTljZWIxYjQ4M2IwOWQ1ZjEzYjBkMmE3Mzc3NjQ3YjIzZjg1OTlhNWQxOWNiYjY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ncmFwaC9Ob2RlRXhwYW5kZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTkxNGQ1YTMxYzczZGVjMjEzMmRjNjYxNTFiMjFjNGI3ZmM3OTlhNGEyOGVhNjNmMzUzNzMzYjRhYWM0MTEyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZ3JhcGgvTm9kZUV4cGFuc2lvbkVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NTI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmY1YTlhNjEwNWRiMTNhNGJlMjg2NTYwMWFlOTRkNDU2OTE1YzhkZTJjOTQ2NWU1MDczZWU1ZWIyZDE0YjRiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZ3JhcGgvU3RhbmRhcmRCbHVlR3JhcGguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWYzMGU3OTdiZmIzN2ZiODQyNDgxMWE5MWNiNjQ4ZmIzODFhMTdjM2UxMGFkNjA1YjkwOGE5N2Y5MDdmODUxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZ3JhcGgvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzMDFkMTUyOTU1NGUyMjc2NDM3Y2IzNGJjMWFkYTMyYTNhOWIwM2Q0NTI4MWJiOTdmNDFiNjgxNWY4MTM0NzUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Jhc2U1OC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY3NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTY3NzM4NTc1NzY3ZmU2YzkxOTk2NjMxMmI0MmY5OTk2MGQyMWM0Yjc1OWFmZmUzYzEzYTJkZTYxOGJhYTQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CYXNlNThTaGEyNTZQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNDJkNTUwMmYwYWIyMDU1NWVhY2M0MjQ5NWRmM2I5OGE1NWNhYWVhZDM5MzAzOTRiN2VjOWQ5OTE4YTFkYmY4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CbHVlSWRJbnB1dE5vcm1hbGl6ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNkYTNhOWU5YThjYWYwYmQ4ZmU5MzMxYjZmYjBkMTUyYmYwYWVhOTQ5MjE5NzExM2JkYTBkMjZjNzYzN2ZhNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmx1ZUlkUmVmZXJlbmNlVmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYwNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTIxNzJiYWExMWUxOWEyZWIxZWE2NTNmNThhYTlkMWEzY2U0ZTczZGYzN2MyOTI3N2Y4MGUwOTBkZWI1ODFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CbHVlSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdkNjIyOTU4NzIxYTU2MDgzM2QxNDg2NTNiZWMyMWZiYTFhZTQzOTEwNzg1MGRjOTAzMzA5YjNiNTRiNzZjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmx1ZUlkcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkODM1MzgzMzljYTkzNmNiYWIwMmRiOWY3Y2I0YjhmOTU5YTNjMDAwZGYwNjFjNjdjMmQxZjNiMDA0ZTk4NzM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9DYW5vbmljYWxJZGVudGl0eUNvbnN0YW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzVhMDk1M2ZkYzM2N2MwYWZhZGM2NGE1YTgyOWI4YTYwZGEzZmE1ZDFlNmU2NTU5ZjBiMmUyYjM2MTEwMGY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9DYW5vbmljYWxJZGVudGl0eUlucHV0QnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2YTI3Y2I3NDhjMDczMTNmMTcyOGVhMGIwMzFiNTM2YjUzMmI5NmIwNjVhNDllYzVlOWQ5MWYwY2VmMmIxYmNlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9DYW5vbmljYWxJZGVudGl0eUlucHV0UmVjb25zdHJ1Y3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzMyNzY5Y2RkMjBjYzMyZjZhZWYwN2Q0M2VlMzRlN2YwYTFlOTU2ZjE0NDdkYWIwMjI3NTRiMjI1OTcyNDQwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQ2Fub25pY2FsSnNvbkhhc2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MWRmN2Y0NDM3NTBkZmFjNTI0MDY2NTI0YmQ1NDM4NmEwZmQ0ZjE0MmVmMmI4YmQ5NzhmNmVmZGNhZTA5NWNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9DYW5vbmljYWxKc29uVmFsdWVXcml0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDk1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllZjU4Y2I0NmVlZGI2ZWY2ZTgwOTc1ODVmZmU3ZTA4ZjhjY2NhODUzNDgzOTExMGQxNGQyNTJhMDFiZWQyYjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0NpcmN1bGFyU2V0SWRlbnRpdHlDYWxjdWxhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM2NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNDUwYjg3MjgwYjM1NjNlN2E5MDVhZjk0MWJmNjhlYWQxYTBjZDU1NjcyNWYzZmY2NDcwMjVhZWEzN2JjYTRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9EaXJlY3RCbHVlSWRDYWxjdWxhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODg3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImE2MTNiOWM3YTI4M2RmZjU1NTE4YzM4MjU3Y2EyZjZkZTA5OGQzMTA1N2FjZjczOGM5M2FiZDk5ODY5MWQ0ZmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0xpc3RCbHVlSWRGb2xkLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY0ZmFlMGY5MWU0OGI3OGM4MWMzOTYwNzI2MmNlMWI2MzQ1NWI5NGZjNTVmM2RkMzQ4NzVkODUyMWRhMTM5ODciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L05vZGVUb0JsdWVJZElucHV0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA4NzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyYmEyZjBhZjRhNWFjOTFkMmZjNWY0Y2Q3NmJmMWI2NmQ3NjJkMmYyOWJjMzJlMDgxOTIwYTEyODAzNDY3YzgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9PYmplY3RCbHVlSWRIYXNoZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODg3NjE4OWYxNDdjZTNjZGQwMDkyYTAwNDA5NjljMjRiZDY5ODU0ZjY0NzE0YjQwOGM0Nzk3MGQzMDVkYmJmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvU2NhbGFySWRlbnRpdHlFbmNvZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjc2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhYzAyYjc2NjI3YmY0OTczMDg0MzdiNGU3NjRhZmFiOGI5MGVmMTFiODY4Yjk0MDUzZGIyNTA0MGRkZDBhZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L1NjYWxhck5vZGVJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NGI1NWNlYmI2OGQ3ZTBlNzRlYzg1NWMxMjFiNjJlNzFkMGJkODlmOTFhNTE0NTlmODI2M2FhNzRmMGQ1MGFhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9TY2hlbWFFbnVtQ2Fub25pY2FsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZTRiZmM3ZDZkZGY2OGQ5NjQzNjE2NTc4M2U3NTVkMGY2MmI2MzQ2N2Y4MjE1OWNkNDFlMjFlZWU0YjNiNTg0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9Tb3VyY2VEb2N1bWVudEJsdWVJZENhbGN1bGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzI3MDJhMzRjOTk2YWVjY2VhMjYwNjNlYWIxMGE2ZWI4MTI0ZDRhYjNhNjZlMDliYjNjZjkyZjA4N2I3Y2I1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvU3RhbmRhcmRCbHVlSWRlbnRpdHkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTY5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTE0ZDczMDNlZmZmOTJkZDA4YjZkZDIyYzQwOThhMWM2NTQyODU2YmI0M2Y4MGM3NjI3Mjc2MjMyNjQ0ZjE4YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvU3RhbmRhcmROb2RlSWRlbnRpdHlQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1OTYyZWVlOTYzZTE3ZDcyMjc0ZDAyZmU2ZTJmMDA1NWE1MzJiYmIwZDlkNjI0MDZhYWFiNDhlYjlkNGE3N2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhODZlMDBlZDc3M2RkYzhhY2RmOGViYWZmZjRkMGQ1ZmFmY2E0NjZhMGI5OWJmZDc1ZDZhNWY1MWZhYjFiM2JiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9CbHVlTWF0Y2hpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTFjN2MzOWM4YTkyMmJjMWYxZTA2ZTI5NmI3ODc1N2NjYjMwMDJhZDIyNTYzNTMwMTgwMGQ4YjRkMjg3MTFmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWF0Y2hpbmcvRnJvemVuU2NoZW1hTWF0Y2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMDc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzFhYzc2ODI0ZWY4MGEzN2M3M2Q5N2Q5MmFkM2ZmYWNkNWJhZjBiMjc2NDA2ZGYzNWE2N2E0YmRhYzI0YmZlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWF0Y2hpbmcvRnJvemVuVHlwZU1hdGNoZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTE0NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkNWViMTAzOTRjNDM1ODhhMDA1YmUyMDdhZjY4YjM2NWVlNzkwOWRhY2U1YTA5YmU3NTUyMTY0NWFhNjEwYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL0xhYmVsTmV1dHJhbFR5cGVJZGVudGl0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI0MDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2NjBjZDI0NTNmY2MzMzkyNDllMjVmMjY1NzYwZWNkMTM1ZGJiNGVhMGFhOGJkYWRjMzlhZTJlOTg4ZDZkM2M4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9NYXRjaGluZ1BsYW5DYWNoZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYxMjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZjVlOGM1YTkxMmRmNzljODg4YWE0ZDllZjI2YjliYTk4YzAxNzVjZDBmOTQ2YTFiZDlhZGQ5Y2U2NzgxMzMwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9NYXRjaGluZ1J1bnRpbWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk3NTI3ODAzNjM5MjA4YTZhMTFjYzUxNGUyYjllMDAwODYwZmViMTJjZWE2NmUwNjRjODJjZjc3OTMwOWJlZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWF0Y2hpbmcvTm9kZVR5cGVNYXRjaGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ0NTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MGE3Zjk0Nzg3ZDI5OGE4ZWJhY2E1YWQ5OTRiOGQ1MGFhYmQyMTM5OTk1YmM5M2VjMjlmYTk5OTQ4MGIwMmViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGY0ZWQyM2NmZTg4ZTIwMzhhYzQwYWY2YTNkNjJjOTM2ODNlZDc0NGExYmRmNDUzY2E1ZTBmNWFlZmM2NTI4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvQWN0aXZlVHlwZVN0YWNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA4ZjBiM2UxYmE3MDUwYzMxNDU5MmMzOTJlMzVlNmU5ZTYxYTIxOGZjYTU1ODk1YzY0NTcyNGYwN2RmZGM1MGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL0JsdWVTbmFwc2hvdHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjIyY2RmMmQyNDMyODA4YzI5MDJlZDMxZTEwOTkzNDE4MmQzYTEyMTFkN2NmNWRhOGRjYTA0M2UzZmZiZmYzNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvQ29tcGxldGVkVmFsdWVWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlODRkNDcyY2MyMjAzNDZiYjNhMDE3ZDRkYTczYjA0NDQyZDUxNGJkZWJlOTJhYzI4YzRmYTc3ZjA2MDVhYmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL0ZpeGVkQ29udGVudFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZmNlNTY2MDJjMTU3YjNmZDJkZmM4NjI2ODg0ZDJhM2ZjNjcyODFkNmQwODAwNDA2NmJlNzQ2NDZlNGNmYzRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9JbmNyZW1lbnRhbE1lcmdpbmdQcm9jZXNzb3JDYXBhYmlsaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4YTM4NThkOTg2M2VkYTA2ZjAxNWViY2Y0NzRmOGE5OWM3ZDE5ZDQyNGZmNjUxMTMxNjFlZTBhNTJjYTNlZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL0luY3JlbWVudGFsVmFsdWVSZXNvbHV0aW9uUmVxdWVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZWFjZjcxMjgzNGQ3MjI0ZGUwM2QxZDBkZjExZDVhM2JiZjU5MGYxZmU4OTBjNzY4NjQ4YmZlYzYyMWRkYjgyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9MYWJlbFBhdGguamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmQzMWUyYzZkYjcxMzIzZDcyOWEyMGI0NjQyNmI1NDdlOGMzNTNkNWU3YmE0YjA5NDJjZGZmOGI4MWYxMmY3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTGFiZWxQcm92ZW5hbmNlVHJhY2tlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMzMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDg3MGE1NmI5NTczYTkzMGQzYjFmYTcxNWJkM2FmOTRmNmVhZTg3YTdkMGUwNWUzZTkzODY5YTFiMzk3YzE4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvTGlzdE92ZXJsYXlNZXJnZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDQzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxZDE3NjJlN2Q4NDBhMDlmMThkNmYyYjI0YTRiODZlNjNiNWE0Y2ZjMWNkY2FkMjE5MTU4Zjk2ZDZiYTljOTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL01lcmdlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwMTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNDVmNzMyNDkwNDhmNTVkYzI0MzIxN2IxN2ZkZTkwOWJiZTUyYzUwNDM0NGYzMGMwYWI3YjE0MDc5ZDgxYWFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9NZXJnaW5nUHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQ5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0NDQwYmU4ZjA0NmVmNzU5OGJjMjdhMzliMGM3NzZkNzQ0MGNkYWU3NzE4YzliMGNlMDY2YWNhYTZjZjJkNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL05vZGVSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5ZTRhOGUwNzZhMGFhZjE0MjNkYWY1OGRjMGJkYTdjYzA1MjBiYTJlY2FlODg5NzA4YzQyNTcyYWI5MTAyNTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL05vZGVTcGVjaWFsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Y2JhMmRjMGFmY2FmNWE2MDAwNWQxNDYyOGNjODMzMGQyNTA2YmVmMGU1NDdmMzk0YzdkOTYyZDUyY2UxMmExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZWZlcmVuY2VSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxODU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWRhMjIxOTI3YmNiNjY2YzIwZmJiMTI5NTlmNTZkMGUyZjdjNWM3ZDlmM2I3YzZiNTczZDBhMTliNTM0ZjYwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x1dGlvbkVuZ2luZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MDk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTdkZTUyM2NkYTlhYjZkNGEyY2YxZjgyZDIwM2Q0MDk5YmRmMTEzYTQyMWQ1MTY4YWNjM2Q4NTkxNDcxYjUwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x1dGlvblByb3ZlbmFuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYxYTRjNWFmMWQ2NjVlZDY1NGNiM2E1OWVhOGY2YzU3Yjg3OWUzZTk0ZmFlMGE5OTk0M2RhOWIzYjVmYmUwNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x1dGlvblNlc3Npb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGI0ZjNkNGYyNTYyMTVkN2UxOTNjNGNjNzkwMDVkOWRmNmZlZTlkNmM3Y2MxYTkyYzc1MjdkZTExYzNhNWU3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x1dGlvblNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2QzNjQzNjY4YWZhNjQ4MDNiZTk4YjM0YjdhNDBiN2EzNjFkODIwODc1ODM5NDAxNjBmZmNjOTA3NTUxYjllMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x1dGlvblNuYXBzaG90RmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Yzk2YTM3YjYwYWFiNTU1ODZhZWVhNTcxZTkzYWVkMjlmMzFkN2MxZTRjNTlkNDEwN2Y1YTc4Y2E4MDA3N2Q4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUNhY2hlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM1ODQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NmM3ODU1YWNlYTc0NTMyZjk1MzJmOTMzMjRjYTc1YjM0MTZhM2I5YmE1YTg2YWZiNDViZDI4ZjRjY2JjYjRiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUNhY2hlQWNjb3VudGluZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmRkNmYyMGQ2NTU5YjU5NjdmOTljMjY0ZjA3MTMyOGE1OTA1YmFlMjg5NDg3Y2ZhMGM5OTMwNzFkZDE1MjA5NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x2ZWRSZWZlcmVuY2VDYWNoZUdlbmVyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjgxODYzNTUwMzYwMmY3ODQwYTU0N2ZjYTUwMDE1NDVkYjcxZjE2ZDBlZTI4MTc1ODJjNTkyZDI0MzY2OTQ3NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x2ZWRSZWZlcmVuY2VDYWNoZUxpZmVjeWNsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNDEyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzlkZmRlZjcyNmU2MjY4YWQzYWMxYTJmMDcwNzRlYjU3MmEwNzA2NGNmMDM4NDk2MzRmNjYzNDRiZTA4MzNkMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x2ZWRSZWZlcmVuY2VDYWNoZVN0YXRpc3RpY3MuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFmZDlmMGIzYThlN2YxY2Q3NjQwZTA5ZGE0MTdjYmZjNWM2YjUxNTI5YzEyZDVmMDQyNmJkMWJkNDJiNjFjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvUmVzb2x2ZWRSZWZlcmVuY2VHcmFwaEluZGV4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxMjczODdhMTk5NTlhOTdlMTllYWUwZjFkMDNiOWQxYWQzMzUwZjkxMmIyNWJhZmUyZTVjZDNlNzM0M2VjODUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1Jlc29sdmVkU25hcHNob3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg5MDA5MDdkZjNhZjU4MWQ0Mzk4MDM2ZGJiNTk3YmE3ZTQzN2YzMTYyNDg4ZDRjNzlkNTQ5MjZiNzlkYTJmODAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1NuYXBzaG90UmVzb2x1dGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMGE5OGJjZTk5N2YyZWQ2MTViMDk3MTQ0ODUwOTMzZmVmMmU5OGI3ZjJmNzE3OGVjYmYzYThjY2FiNTEwNWMxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9WZXJpZmllZENhbm9uaWNhbExvYWRDb29yZGluYXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwMjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmM3OGE1NDIzMzk0MjM4ZDg0ZDAzMmUyNjY1MmIyODEzN2I1MDA5NWY4MzBjMmE3ZWY0Nzk3NGQ3ZGM5MmRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9WZXJpZmllZFJlZmVyZW5jZUVudHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2ZiOTgyMzc4OWFlYzA0MGRjM2YzMjkxMmQ4YWRmYjk4NTA2NWRlYmIwOWQwMzJmZGU3ZjgxOWE3MjA2NjQ4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvVmVyaWZpZWRSZWZlcmVuY2VSZXNvbHV0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4MywKICAgICAgICAgICAgICAic2hhMjU2IjogImE0NThmOTdhZjkxNTFjNjU3ZWIyYjE2Zjk0MmJiY2Y4YzVmN2JmMTliNDBjNDc4ZGI2ZjQ0OGMyY2Y1MWEzYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNTdlYzczYzI0YjAyYmFmZGNmYzY0MTYyYWJkZGE4ZGE0NzMxYzk4Y2Y3ZmUyN2E0NjA2YzdiMWE4NGZmODIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9wcm9jZXNzb3IvQmFzaWNUeXBlc1ZlcmlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRlYTg3NDAxODdkMzVhOTZjNDU3NjYzNWY3MmM5MTU5ZGE5YjA1NzUzZTliYjVhNDE1ODgwZWVmZjU1NTNiYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9EaWN0aW9uYXJ5UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzA1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmOWUyZmZiMGJiMjQ5MjBhOGMyOTJiMmM0OWMxNmJkZDUwZTE3NDZjNjdmM2MyNGJjYTIyOTdkYTU4ZGEyM2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9FeGNsdXNpdmVJdGVtc09yVmFsdWVDaGVja2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmQzNjE5ZDQxZTBlY2NlMmYwYTE5NjhiZDU1ZGI3MDA1OGRlYmUwZGJiNjkwNGUzYTAwMDRhYjE3ODMyYTliMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL0xlYXN0Q29tbW9uTXVsdGlwbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTg4ZmYwMDA5NjY2OGRiYzY2NzAxYzE4NGNkZjg4ZDFjZWZmNWY1MmUxNWU0NjhiYmQ2N2EzYjc3MzIwZTcwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL0xpc3RJdGVtc1R5cGVDaGVja2VyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzNjU0NjhkYzkyZDM4YjJhNjgzZjhjZTAzZmYxNjMyMDNjMzJkMGYzMzdlZTc4ZWU4NDQ3OTkwYmE0ZTg5MGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9MaXN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzYyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzNTJhMTA4MWQwYmU2ZDY1ZjEzODIxZDA0MGRlMjY1MGJmY2I0OWVmNDQzNzZlNmJiNzc1NDE2ZTI3N2E1ZDciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9TY2hlbWFQcm9wYWdhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAxNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMWY1NTEzNzczMzhkZTkyZjgxZTZmYjI0NjFjNDdlZWFjMWE3MjQzMDI5MTQyNTNmZDQ0MDFiMDhkZWM1ZjY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9wcm9jZXNzb3IvU2NoZW1hVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODEyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU5MWY1ZTUyNDMwNTU3YWIzODA0ZDE1YzVkNGZkZWNiODJlMDY4Nzg2ZGI4MjgyNjgwMjY1YzVlMDRlYmM3YzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9TZXF1ZW50aWFsTWVyZ2luZ1Byb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTBiZDFmZGM0NzExNjhhNjY1MDdkNTg5ODk0N2IzZTljYjBkMmExNWI2MGM2N2M1NDQ0MzZmYmQxOWQ5OTFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9wcm9jZXNzb3IvVHlwZUFzc2lnbmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlMTIyOTEwODYzNzAzNWEzNmQ4NjVkMDIwODg4MjM0ZDE2NjcxZTAwNTEzMDE5NDI2ZTY2YmI2NjI3YmQ5ZDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9WYWx1ZVByb3BhZ2F0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjdiZTliNmVkYzhkNzlmZjNjNzYyYTZlYTQzYjRiOThmYTRhOWZiMGMyMjg0MzBlODE4ZDQ2MmEyOTNjMDM1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWVyZ2UvcHJvY2Vzc29yL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZDQxM2YwMjEzZDNkNjc0NjVkZGUzMDM2NTRjZmE4MTgwMWE5Y2E2OWFjMzI5MzgyMDRmM2E3ZDRkZDU4ZTM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wYXRjaGluZy9CbHVlUGF0Y2hpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OTAwNGYxZjU5MGI1MmU0YjEyOTc3YWVjZGE5ZjQ0YjQ0YjRiMmM5ZTdmZjhlZDlhYjhlZjgyYTE3ZWU3NTUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wYXRjaGluZy9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjJlOTY5NWEzOWYzMzE4MTg2M2E0OTVjNmQ1OWE3YWIwOWM4YmEyMDAyZmJlODk3NjJjM2RiZWFhMzBiMDI1ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9CbHVlUHJlcHJvY2Vzc2luZy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzNTYwNDNmZGRiZjJjODZkYjMwNWRkMTlkNWRjZGExMTM0MDlmYzdiYjdjZmQ2ODgxOTY5MDQyYWRmZWRiYzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvRGlyZWN0aXZlUmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFjYWU1Mjc4MTI0YmIzNDlhNDYyMWViNGIzNzE5OWI3YTI3OGI2M2QwN2M2MGE1NDgwOGYzMDhlOGI0ZmQzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9EaXJlY3RpdmVWYWxpZGF0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTYxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc5ZGU3NThlZTNmNzgwY2ZhYzJjMzZiZDY2YTMyOTMxZDRhNzU3OWIxYjUwZjAyN2RkMjI3ZTU2Y2I1NTcyZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvSW1wb3J0TWFwQnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MDEzYzBhMGEyMTY3ZTIwMDNhMjkzZDg4YzE2NTAxNzAyZTllMWU3ZTlmOWMzYmU1MTNkNmY1NmVhZjkxYTBiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL0luZmVyQmFzaWNUeXBlc0ZvclVudHlwZWRWYWx1ZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTcwZmNkNGQwNDEyNTFjYjZkODA1ZDFiNTY5Mjk5N2VlZGQxZGE5NjlhYjA0NTg0YjQxMTZkNjQwMDBmMWFiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9Ob2RlVHJhbnNmb3JtZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGY5ZTA5ZDllMmIzNTM5ZTc5MmNiZjJiODgxNDk2Njg5YjhkZjcyNDlkNDAzNDVhOWE0ZmI2Y2M2Yjc2ZGYyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9Ob3JtYWxpemVMaXN0UGxhY2Vob2xkZXJzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5OGNjNWRlYTEyMDE2N2JiOGVmNWRmNzVmN2ZjZjE3ZTFiYmEyZDQ5MzU5OTg4ZmE1YTdjYmRhYmUxNjhlZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvUHJlcHJvY2Vzc2luZ0NvbnRleHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDAwYWZlZTZjZmM1NTkxNWY5YTdkZmI2NmFhNzg3MWE0YzkwYjUxYzczOThhM2FmODc3ZTFhNmMxYzZkZjRkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9QcmVwcm9jZXNzaW5nRGlyZWN0aXZlUmVzb2x2ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTM2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWE0MWEzNDQ5YjU1MDJkNWM1OWJhMTM2N2ZmN2FhZmFiOWY2MGM3YjI2YzM5MzlhZGUyMTlkMDc2NmY5MWU4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9QcmVwcm9jZXNzaW5nTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxZDhhYTJiMmNkMGVjZWQ2MDNhMDFiYThmYzg3NTI3NDAxMGZjZTM4ODVlMTk0ODZiNGZmZWI5MjQzNzUyNjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvUHJlcHJvY2Vzc2luZ1BsYW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTI2M2UwYzU0NDg5ODM0MTc5Y2VlOTMwZjc2MGRmZTg4MTlkY2EzMTBlOWYwYmYwMGE4MGFiODBmZmUxMzk5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9QcmVwcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTE1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzNhOWRkNmY2MWJkNDVhYjI4ZmRkMzhmZmYxOWQwMzQ0NDAzNmFmMTg3NGNlMTIwNzI0MGM3YzAzYjNkM2JhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9SZWxlYXNlZFRyYW5zZm9ybWF0aW9uQ29tcGF0aWJpbGl0eVJlZ2lzdHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhYjJlMDY1NTRjYjkyMjhhMTVlNDEwMGNmYjcxZTY4MGQ2NDIyNmY1MzQ4YTM3Mjc4MTViOTg5ZGViYTA4ZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvUmVwbGFjZUlubGluZVZhbHVlc0ZvclR5cGVBdHRyaWJ1dGVzV2l0aEltcG9ydHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjNjNTE2YWE4YTVmNTYyMDM1NGIyZWQ5ODE0MGU3MDJjZjhhOTVlN2E0MjEyZWZiNTZmYjY1NWEzYjgxMzU5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9TdGFuZGFyZEJsdWVQcmVwcm9jZXNzaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2MywKICAgICAgICAgICAgICAic2hhMjU2IjogImJkYTc2NzVmMzM5NWNiMmQ3MTE5YTA2OWU5MGJmNjAyNDU0MDI0OGYxMzE4Y2RhMGEyNzc3MTZlM2Y2MTFmNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvU3RhbmRhcmRQcmVwcm9jZXNzaW5nUGlwZWxpbmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjc4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiOWY5NDM0YzIyZTY1ZDgxY2MzYjY3ZmQ2ZWUwZjcwYzkwNjExMzI4ZjliODk5NTA4MDM1NGFhODViMjQwMjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvVHJhbnNmb3JtYXRpb25FeGVjdXRvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMjIzYzM4Njk3MDEzMzA3ZjljODhjODcyYWJkYjY5ZmNjMDQwODkwNjk1OGZjN2YxZjcxMGE0NDY4MGZiZDBkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1RyYW5zZm9ybWF0aW9uUGxhbkJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODc4YWZiMGEzMGVhMDA0N2M1YTRkODc0MzdjMTdmODFmNWQwODE1NDIzMTBhZjczZTQ0OTc2OWRjOGI2Yjc1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9UcmFuc2Zvcm1hdGlvblByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMGEyOTVhNWM0NjQ4ZjliMjU3Y2U5ZDUyZmVjYWRjNzkzNWY4ZWJjYTQ1NjM1N2JjYmE2YzdlZmU2NTA0OGM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcmVwcm9jZXNzL1RyYW5zZm9ybWF0aW9uUHJvY2Vzc29yUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTJiZjY1Yjc3YjIxNzQzODQ3YmJiNDY1OGQ3NTVkYjE5NjQ1ZmQ2YTNhOTg2YTM4NjAyZTg0NWE0YzQ4YjA3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9UcmFuc2Zvcm1hdGlvblNuYXBzaG90LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg4ODhjZjM2NzdjNGU5NzA3NTkxZWZhNWUyOTUzZTI3NzNjNjI5YzI0NGVkZWJhZmExYzYxYjJjYzI2MzFjOGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwOGEzZjM2NGQyZDQ2NTI5MjRjZjg5NzQxYTA3NGJiOTQ5MTAzMDA5ZmRiNTZhMWM2MTViOGY5NjA0NTkzMTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvcHJvdmlkZXIvQmFzaWNOb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDc1MywKICAgICAgICAgICAgICAic2hhMjU2IjogImM2MGVjMjE4MDg4YWFiNmZkYzAyNmM3NDQ3NmNlYzc3ZTlkYTM3Yjc2ZmY5YzUxN2M1ZDI1NjA5MTRmODY1MmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvcHJvdmlkZXIvRGlyZWN0b3J5QmFzZWROb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM1NGNlNmM3ZGM1NTUyOGMzZjY1ZmVkOGNiZTlhNjIyNmZlOWZhZTVlNzJhMzI1NjI0NDFhZTY2MmIxNGE4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJlcHJvY2Vzcy9wcm92aWRlci9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmExY2FkOTlhNDk0Mzg1ODhhMjdmOTRhMDM0MWNhZWM0NWZmYzQ1NjlhZDgxNzM1NDg0NTMwMmMxMDcwMmRlYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvQWJzdHJhY3ROb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTkxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmI5MDMzYjIwMDU1MjA1YzIwNTY2NDI1Nzc4MjRjMzY5YTMwNDA3MGZjZWM1ZTNjZDI0Y2YxYmRkYzAwYTQ0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvQ2FjaGluZ05vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU3ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMmY2NjlhMmY1NTBiMTk3MDA2NzhlYWFiYzg2ZjExN2ViOWQ1OTMwMzNmNGNiZmYyNjEwNDljM2Y1Njg1ODgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9DeWNsaWNBd2FyZU5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MThlZTgyNTc4NWY4NjY5N2NhMDZlM2ZiMTY3MDYwOTYxN2RhNThlMDU0ODc3NWNjMjcxN2FlZTJkMzE3MjA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9DeWNsaWNTZXRQcm9vZi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc3NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzY2U2OGZhNTVlODkyOTllNGMyZTU3Y2NiYTZkYjI2NGNjOWMzNDE2NzA2YjFkMjlhNzliN2FiNDdlYjA3MWYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9DeWNsaWNTZXRQcm9vZlJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMzMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYWFkMWUzYTAxMjQ1NGI0NDg2YjcyODMyNzVmYzYwMjVhZjIwMDc2MDhlYmNmYmY0ZjFjNGU5YWJmMTA3NDc0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9EaXJlY3ROb2RlTWFuaWZlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNThkZTc2YjA3YjAxYjU5YTczZTg3OGQ0ZGEzNTc4YjZmM2IxNjczMjJhMTQ0ZGViM2M2OWZmNWY3MWU3Nzg1MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvRXhhY3RGcmFnbWVudEFzc2VtYmxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTNiMzRlMmExOGRkZTc4ZWI0OTAzMzU1ZGY1YmJkMjk4Y2Q2ZGY5N2VlNDY0MWJjYmY0MDlmZGUzN2E5NWIyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvRXhhY3RGcmFnbWVudEdyYXBoVmFsaWRhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYmMyZTYyNDEyODk3MTljYTU4NDFjNTY0N2U2NjgyNTRiMzUyMzg1MGRlMzFhOTIzYzYzNmYxMDNkOGIxNWJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9FeGFjdEZyYWdtZW50UHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTQ1NmQwZjYyOTI0MDY4YzcxZTlmOWRhNjU2NGE1MmFmODI2MGJjOWJmMDJhNmJiZWI4YjQzNWMwOGE5ZTNiZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvRXhhY3RGcmFnbWVudFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDU4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImIzY2ZhYjhjYmUyZDQ4N2IxMzIyOTczN2M4NTc3N2IyZDA1NzEzYjUwZGRmODFjOTI5ODk4OWRmMWU3OTYzYjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0V4YWN0Tm9kZUdyYXBoRnJhZ21lbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZWUyZWNlZjIwNzQyYzI2ZmFhYjQ5YzY5NThiNDQ3NTI0MWY3OTliZGJmNDdiYWE5OWFiYmUzYzRlM2FkM2RiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Ob2RlQ29udGVudEhhbmRsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhMDNkODk5ZTEwOTk3NDY3NTI3NWEzOTFmYzRlZWQwOGJhNWJjZDI1NTZhMTA0Mjg3NWUwYTZhY2ZhMjhiZWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL05vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZmRkYmZkYTVlY2NhMWNkMzBlMDljNDgyNTA0N2RjMDc2ODVlZmUxZDllZjcyMzc1Y2UyYTZhNjg4NWM4M2RlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Ob2RlUHJvdmlkZXJSZXN1bHQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjBjZjNiMDAzYmIzMzViOTE0OWNmN2M5NWE0ZGJmOGRjZWQ5MTYxZmRiZjMzYTQyYWEyNjg4OWY4NTA5NGQ2MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvUG90ZW50aWFsQmx1ZUlkTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2OTNmZDgwOTZjZTk5ZGZlYzI1ZTdhNmVlODE1YTE4YzNlNTNiOGJmODBhYmM3MjcyZWNkODYwNGMwODRjNTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1ByZWxvYWRlZE5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZWMzMzAwMjBmN2FkOTY4YTkyNzU3ZTg1NjhmZTcyYzA0MjQwNGYxODdhNGFiMWMwNDZiZjAxNWE0NjBiM2Y3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Qcm92aWRlckV2aWRlbmNlVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODA4OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE4YWJiNGJkYzQ4YzA5YzgwNjM5MzI2ZWUyZWQ3YTc0MmJjZTE4M2ZiZjBhNzUzMmNkYzMxZjg0NjRkNWQ1ZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1Byb3ZpZGVyTW9kZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzE3MzhhM2Q2MjY3YWNhY2E0ODE3ZWE3MDFmZTQzYjEwMzZlNGEwMTM4NzBjODA2MzNmYTRlYmM2ODRhNWI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Qcm92aWRlclVuYXZhaWxhYmxlRXhjZXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzQ1NzI5NmMwYTQ4ZWJjOTA1M2ZiNThjYWYxMGUyY2M3OGFlM2FiYzAyMzYwMTQ0MGM4MzZjYWQ5ZjljNDhlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvU2VsZWN0aXZlRXhhY3RGcmFnbWVudEFzc2VtYmxlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MzU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNkNGQwM2Q0YTExZmZjOTM5ZjQ2OGVmZWJkYjMyMzY3MWQwYWUzZWI1OGMxYzY2NDYxY2U2MjNmMmMxYzk5MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvU2VxdWVudGlhbE5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5MjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzE1ZTUzZDBhYzgxYTNhMzk1NjgyNzJjNjNmNDI3ZmRiZjI2MTg4MDliZGM3YzBjYjU1ODE0ZGVmNzNhOWVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Tb3VyY2VDb250ZW50VmVyaWZpY2F0aW9uUnVudGltZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MmRhMmY4NmExNWM2YWM5MDY5YzAxMWVjYWM4NzA4ZjE4YmY3ODY4Mjc4YjZjMTQ0YWYyMjk5YWNiOGZmN2FlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Tb3VyY2VQcm92aWRlckVudmlyb25tZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTY0MywKICAgICAgICAgICAgICAic2hhMjU2IjogImVlMTM2MTBlMDY2NTMyN2QyNmRiMTJhMWFiZTc0ZmYzZWMyOWZhYzIyYmQ2MzZiOGE0NWRlYmQ5ZmUxN2NiNzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1R5cGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MTFhNDk1NGExMzI1Yzk2YWVlYTJlNmI2MTI3OTNmNzI0YzMxMGM5OTAyYjAzMWQ1NWUwNTliNTA5NmRhYmQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9WZXJpZmllZE5vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImRlNzVjNWMzOTJlNzdlNGU1MWJiZGRkZGQ5YWE3ZDE5MzcxMGE5ZjQwMWU3M2Q4NjhhOWViZDkzZGFmMTMyMzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1ZlcmlmeWluZ05vZGVQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjgxZGJlNmQwMGMyOGZmMGM5ZmRmZjZmYWNmODMwMzc5ZDkxOGQ4YzkyNGM0NmUyZmFiYWI3MjE2Y2Q0YThkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU0MjEzMzc4OTIwMDBiNmI1YWIyN2ExMTZhZWZlMGRmYjIwZTQ3N2VjOWU3ZTg2YzUwYjc3NTIxNmIwY2MwYWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L0JsdWVDb3JlVHlwZVJlZ2lzdHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3MTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTAxZjgwMjQzZDkyMGRmMjFiZGI0Y2M0NjMyYWZmN2EwOWIyZmE3NTQ3NGEwOGYzN2NhYzg2MjJjOWQ4ODBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZWdpc3RyeS9Cb290c3RyYXBQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNTAzNjU4MjUxMTdhYTg0NWU5MmFkZDcwYThlNGVhNDk2YWVjNWI3N2E2OTY2YTI0Zjk1NWE5MjgzMmQyNzRhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZWdpc3RyeS9CdW5kbGVkVHJhbnNmb3JtYXRpb25Qcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMjExZTc1M2NjYTBkODJhZGFlNDU4NjM4OGQ5MzJlYmIyYzk1MjRjNTk1NjRjYWI3OGQ1NjJlZjVlYzBlNWQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZWdpc3RyeS9Ob2RlUHJvdmlkZXJXcmFwcGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE2NjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MzYwODc1YzlhMDQ1MWEyYzUyZjA2ZDMzNDRlZjJmNzkwNzI2MWM2NzUwOTI0MTY2ZWI2NDhiZGY4ZDNkMWFjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZWdpc3RyeS9SZWdpc3RyeU1hbmlmZXN0Q29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI0MDJiZjAxZTJlZTA2MWNmOWVjMzU4MjY4YTg1M2YxZDkwNmIzODYxYjI0ZTgwM2QwZjZiOGM1ZDFmMTA0NGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3JlZ2lzdHJ5L3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzllOGQwNTlkOWE5ZjdhYTg1MWNjYjlmOTQwYmNhZTFlZDFkNmI0NTliOTQ1ZGJmZGUxZjk2MjcwZDIyMTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL0JsdWVSZXNvbHV0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2YjUyN2Q1YjBmMGMzMTkyNDI2NzBiZWIxNGNhYjViNjQwMDdlNGZjM2I1MzhhYjI0MjZmZGI4Y2VlMTZmY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvQ29tcG9zaXRlTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjlhMGFmNDk3MDIzNjk1ZWRjM2VhNGIzOGRmNTM4MzA5MDE4ZWY3ZTM4YzFjMmQzMzBhNzE1NjdmYmE2NmE2ODYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvRGVmZXJyZWRSZWZlcmVuY2VQYXRoTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEyZjhhM2VmMmZjOWFlMWExYzM4N2MzMjY1MzViZjczMmViMjZjODc0MWM0NmFhMzkwNDk1NjVjYWEwMDJmNWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvRXhjbHVkZWRQYXRoTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNhZjc2YzE4YzM0YWVlZDE3ZGY4YWNmMTNiZTIzMTIwZDk5ZGEwOTA3MGNiN2M1OWZjYTYzYjMyMTFiYTA0MmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvTWluaW1pemVkT3ZlcmxheUJ1aWxkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5OTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NjNmYTRiN2JjOTU0MTk2MWVlMTUzYzliYTE5YWIzZTg4NThhZmFjMDBiNmYzMzYxYmRmMjIxNzljM2UxNGMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL01pbmltaXplZE92ZXJsYXlSZWNvbnN0cnVjdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MjI0MDQ5M2QxZDQ4ZWNlYzMxOThjNWFhYTg5OGFlN2YzYjgxNTI2NGJlZWViZmY3MjVhNGE0NTdhNmI0ZTY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL05vTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJlYjIzODQzZjYwOWVmMDg4OWU3Mzk0ZDExZWNhZGVmNDY3ZDBmMmJlMGI5MWExMDg4Mzg4ZTY2ODQzYmY0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9Ob2RlVG9QYXRoTGltaXRzQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1MmY0NjZjNzgwZGM5YTVjOTliMjVhNTdhNTAxMTE2MjMzMTVkZmIxNjdlZTkxM2QxNjAxYTNmNTRjNGZlYzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvUGF0aExpbWl0cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjkyZjkzZDI2MTRkNTdmMWQ3ZDQ0Njc1MWM4ZGJlZWViM2NiOGUzNTZhMGIyMmRiNTJhZmI2ZTk4NThjMDAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL1JlZmVyZW5jZUNhY2hlQWRtaXNzaW9uUG9saWN5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA4M2FiMzZiOTQyMmJkNDAwYzZmYmU3ZTcyNWFiYWE0MDkyMjE2YmEyMjFiZDA4NGQ0NDc1NDM0YWJmOWY4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9SZXNvbHV0aW9uTGltaXRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzYyNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmNDJiYzU2YWRhYmNmOGIyYmZkMGRjMzVmODk2YjRhNzhmMTg3NzllZGEwMjU3Y2YxZjgzMThjNGI3NDk3OTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Jlc29sdmUvVHlwZVNwZWNpZmljUHJvcGVydHlGaWx0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmIzMmVjODljOTA3ZDBhYjE2YzZmNWNlNjk4NzUwMzc2MDMxZjBiNzFlNmNjOWMyMmE4ZmI3MzkxODM4YWQxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGY5NTNlMzc3MGQ3OGIyYmM5ZmUwODBiOTE5Y2QyZWU5MzYxYTcwNjMwYTQwMDVlYjc0YzIzODUxNmUzYWUxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9CbHVlTGFuZ3VhZ2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTZlOWY2Y2JjNWY1ZWRiYjI0NDZiN2I4YjQ2NTM2M2M1MGU1OGZhNmI2NGY1OWEwNmI4MmQ0OTYyM2U1MDM1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9CbHVlTGFuZ3VhZ2VSdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzMyNTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTZhZDM2MWZmNzQxNTdkYTIxZTMzMTU4Yjg4MmE5ZTExZjJkOTJjYjg2ZjE5MGY0YWNkYjA4ODA0YjBhZjJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL0xhbmd1YWdlTWF0Y2hpbmdTZXJ2aWNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlYzAwZjY0MTI0OTA1NTgxZmMyZjE0ZmM0ZTI1MGUwZDA4MmIwZjcyNDRmNTc5ZjMxMDBiOGY5NWNmNTUxYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VQcm9jZXNzaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZDA3NmE2MjQwY2VlOTA3ZjMxN2NkZTlmODI2ZTNiOTIzNTZiNjYyNzBkOGM1MjMzYjIxZjg1ZmEwNTc1NmIwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL0xhbmd1YWdlUnVudGltZUFjY2Vzcy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzk0OWZjMjZjNGU1NzlhZmRlNjI4YzU5Y2MxOTJmODY2Njc3ZmQxYTQwZDNlZjk2NmFmNTk3Njc4MzA4Yzg4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL0xhbmd1YWdlUnVudGltZUxpbWl0ZWRSZXNvbHV0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTM5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY0YTA2YzIzYTRkZThjNmUzNTlhZTlmNGMzOThhYmQ1NWZjYmU4MDU3YjI4YTE4NDAzMDA1YWMwNGM5ZDMwNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VSdW50aW1lU2VydmljZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDExOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImY4M2M1ZmQ0NmM5ZDQwOGEyYmU2OTM1Y2RmMjVjZDhjMjQ1NTI3MWJjZmU2Y2I0YzQ1NmEzYzBjZDYyMWI0NDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VSdW50aW1lU25hcHNob3RTdG9yZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTFkMTk4MDdmYTM5YTcwMmE2NjMxNjgzYzBiNGFjZjJjZTY4ZGYzYWNhYmYzNWFjMjk4NTNmMWE0NzBlN2QzNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9Qcm9jZXNzaW5nU2NvcGVMaWZlY3ljbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWVjM2U3NWIwZmM1NzFjMWIyYTRiNjEwMjFlMWI1YmZlMTBmZDc2MmU0MDI3MzI2MDlkNzE4ZTgxMTBmYjQzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9SdW50aW1lTGFuZ3VhZ2VQcm9jZXNzaW5nLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzU5MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNGQ4NjY0ODZmYTllYzY3ODkzZTY5NmVjZWI3NGYzZjRlODQ5YmE1MjI4ZjM4NjlhNmZmNzBkMGIxOGQwZGYyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9ydW50aW1lL1dlaWdodGVkTHJ1Q2FjaGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NzkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWJkZTljYjZmMzJjNzdhMmIzMjY0OGI1OTZiNGE5Y2FjOTNkYjFhNWQ1NmM5ZjQ1ZWUyNGE3OWJmMThkZjhiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcnVudGltZS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTVhZTgzZjlhNmJmOGY1ZDE3NjgwM2U3MTQ5NjNlNmNiNTAzYTc4NjM1NzUyMmJhYzQxYzA3NWM3YWMxMjM0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvQmx1ZVBhdGNoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjM5MWRmZjZlZDQzNjMzNTY4NTRlNDA3Mzc3MDUxY2Y2YWM5NDZjM2MzMjgxY2MyODVlNzMwYTE3YzI5NTAyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvQmx1ZVBhdGNoT3BlcmF0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGI2MmE0YWExYWM2MGU0NzIxOWRmMGIxYTQwNDk1NWUwMjFjMmY0ZTRjNmRiMDFkYjI5NjEyNzAxNTE4YTQ1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvQ2Fub25pY2FsT3ZlcmxheVBhdGNoRW5naW5lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU3NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTNhZGRmZDUzNzE2ODdlZGIwNWY3Y2E1YzQzNWY2N2FjZTUzMDRkNDlkMDdmOWFmZWVmY2E1YjE5MjBhMzZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9DYW5vbmljYWxQYXRjaFJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjQwYWQyMjUwMWJhOTY0MTM2OGNiYWM1ZGFhMDZhZTA4OTZjNDRmMzk4MGQ2NGI3ZDRjOTlkYWI3YTg5Mzk2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5DYW5vbmljYWxEaWdlc3Rlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM2Njk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTk3YzZlNWNjNjFhNmI0Yjg5ZTUwMzg3NjJhMTNhYzZlNmUzNzk1MjE1YjA2MWNjY2VlMDBlNjNhZmRhOTMwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuQ2Fub25pY2FsV3JpdGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjAwMzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDJlZWYxZjM2NDE2ZmE4MDU0YzY3ZTE5ZGNhNjY0NjE5NzA4YzBiOGY1MDYzYzA5MGViODQ4MWYwNmJiMTNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjUyOTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NGViNTM0NWU1NmZkNTBiNTIzNGNmZWZkYTZiYmE1NDA4NGFiNGU3MjU2N2U4NGExNWM2ZjkwYWVmMjFmMDE1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlQnVpbGRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjg5OGU1MWZkMDRlYzRhZmUyOTczODNkYmU1MzkzZWUwNTQwMGE5NmNmMDk4NzcyYmIyZGM2ZDVmNDJlNTQyNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZUNvbnZlcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxMTI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWI4MTMyODNmM2ZlZGI1ZGNjM2U0Mzk5OTJjNWJhZWIzMDRkMDJjMjhmOTBhNmRjNmM0NGMzMjA1YTQwMDgwNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZUlkZW50aXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk3NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNmY0MGE1M2Y0ZTg4NWQ5MWU1ZTk4YWI4M2EyMWY5YjZiYWMxOWNiZGMyNzM4OTgwODg2MWU3ZWNiYjgxNzI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5Ob2RlTmF2aWdhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg4NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwNTJhZWE2ZmNkMWMzOWI3ZWQ1NDRjMjJmNWRjNmYyNjVhNWM3MmRmNWE0YTE4NGMxMGM2ODFhY2JiMjg1ZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGVSZXRhaW5lZFdlaWdodC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTZjY2MyYWY2MzlmMTNlYjI1MjljZWMwMDE5NjBmZDgxN2EwYmIyNWZmZWRjMjdjNDA4ZDViMWUxOTc0YWIyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZVN0cnVjdHVyYWxLZXkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MTY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWVmYjViYmExYWM1ZmQ0OWNjNThjODM3MWI5NDQxY2YyYmM1YjBmNTQ3OWFmZGY5NmE5MGQ0YmYwYTdkMTgzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZVRvQmx1ZUlkSW5wdXQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjc0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjZTI1M2Q5NDNiNGI0NDk0YjZmM2E1NTQ5MGIyODUzNDc2MWRlNmM1YjgxZmI2N2QyZTdiMzJlNGNkMzBkOWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0ltbXV0YWJsZUJsdWVQYXRjaC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGU5MTQzYjFjN2EwMmFmZWVmMWYxOGNhNDA0YTJhNWEyN2ExYTZkMmNlNWRjNzMwNjU4MzNlMmU0MGZhMWU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDNiZjAxYWE4ZTVmNGI0OWI5ZWE5NWQ3NWEzMGNjMDIwMjNhZWFiYjYwODYzMjgzNjlmN2UzODc4MGZjZjRjNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvYmx1ZS5sYW5ndWFnZS5tb2RlbC5Ob2RlSWRlbnRpdHlQcm92aWRlciIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNlMDExMTkyY2JmYjRmZGZjODY3MDFiODc0MDIwYThhNDMzMzM4MzdkYTRkYTU3ZmQ2NTc4MTZkMGQ0NzAxOGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtbGFuZ3VhZ2UtMS4wL0Jvb2xlYW4uYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MmNmNzg4OTlhZTY3ZGNmY2RiN2NiODM3MTkwYTA0NTQ1ZTM3OTY2MjM2ZTE4MDg4OTViYTcwZWVkYzUzMzFkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWxhbmd1YWdlLTEuMC9EaWN0aW9uYXJ5LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImY1YWUyZDM2MzkzOWYxNjY4NWYzYzA3ZTRhMWYxZjE1YTJmYTBhY2JkOTA0ZDAzNDQ2NTEzY2U5MDU2ZWI5ZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtbGFuZ3VhZ2UtMS4wL0RvdWJsZS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkYjI4YmU3MmM1NWI2MDZjYzhlYmNiZTM1OGRmNDk4OTkxYzhiZWY2MDE5ZmIxZjM3NTQxZGJmYzM5MjllOWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtbGFuZ3VhZ2UtMS4wL0ludGVnZXIuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZmZlNTI4NjliN2VlNGQ4NTg3NDA1Y2UyYjc3MDYyMjIwNGY0MDYzMWQ2MjQ2NjIwMTM5YTVhNDkwZmM2ZGUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9yZWdpc3RyeS9ibHVlLWxhbmd1YWdlLTEuMC9MaXN0LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTA4ZTg2NjIxYmMyYTg0ZmYyOGVhY2MwYzRlNTc1MDQ2MDVkMDU3NWY3MTRmNDU2ZDNhYmJkZTQzMGRlMGEwOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvcmVnaXN0cnkvYmx1ZS1sYW5ndWFnZS0xLjAvVGV4dC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRiOGE0ZmY0NWNjY2ZiYjkyZTAxMWFjM2M3OWE3MGU2YTE3ZTU3ZjJhODA3ZTEwNzQ3ZTlmNDQ0YzhkMTVmZTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3JlZ2lzdHJ5L2JsdWUtbGFuZ3VhZ2UtMS4wL21hbmlmZXN0LnlhbWwiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFhOTE5YWUyNWIxYzIxYzlhNWU2MzIxM2MwNjdmODNlMDNhZGVkMzlhNTk3YWRiODA0M2Q0YWFjZDBkYWNmNTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3NwZWNpZmljYXRpb25zL2JsdWUtbGFuZ3VhZ2Utc3BlY2lmaWNhdGlvbi0xLjAubWQiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk4Nzk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTIzNGIwYjQyMTkwYTc5ODI4MDk3ODFiNWVmZGFhMmU1ZjFhYjRiN2Y4ZDg3MGZiZDFmZmU3MDIwY2M3ZTg2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvdHJhbnNmb3JtYXRpb24vSW5mZXJCYXNpY1R5cGVzRm9yVW50eXBlZFZhbHVlcy5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJjNjU4NDgzMjdkNjEzZDkwNWQwNzMzNDhiN2Y2YTE3OGUxOWVhN2U0OTRlNWJlM2MyOWMxZTc0ODAyMGNlNTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL3RyYW5zZm9ybWF0aW9uL1JlcGxhY2VJbmxpbmVUeXBlc1dpdGhCbHVlSWRzLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzgxODgwZWM2MDNmNTAyNGU1MDJhNTFkYzJhZDQ3NmUyOTg0YmIyNDIyNDM5ZWQwZDI3YzkwNDcyMDkzY2ExZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvdHJhbnNmb3JtYXRpb24vVHJhbnNmb3JtYXRpb24uYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkZjAwMzYxOTMyZWE4NjE4MzdiM2Y4OGVjNTY4NmIwYjFhYTc0ZjI2YTk2NDMzZGFkZDcyOGVhNjhjNDMyZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWNvcmUvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvTGFuZ3VhZ2VQcm9jZXNzaW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2ODYxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTJmZmM5M2FmYjNlOGQ2NWIwMjUxZjAyMmFlZmY0ODA1ZWVlNDMzYWM2OTIzM2JmYzVjZDJiN2RmOGU1MDQxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtaXBmcy9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDlmMWE4ZjgxZGJlNWU2ZDJkMzE2NDBjMWZhNjRmMzgwZWQyZjI2MmY3YzcyMzA2MzFkNDhiN2YyZGQ5ZGMyYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtaXBmcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvaXBmcy9CbHVlSWRUb0NpZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMzg0YjFlZWUwOTUzNGFjMjg5NGUzMjU0NTBlMTdkZWRmYmVjMDFmZDc0NzhjODg5ZTcwZWUxMWMyMGI3NjJmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1pcGZzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9pcGZzL0lQRlNDb250ZW50RmV0Y2hlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjhhM2FmMTI1ZmUyYzdkNzA0ZWFjMTU1MzkyYjk3ZjZmM2EzYjAzODhjYzA2Zjg3YTU3NzM3YjhlYzgwYWNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1pcGZzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9pcGZzL0lQRlNOb2RlUHJvdmlkZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzViMjYzNWE4YWEwOWRjMTI5MTQ2ZTVmOGEyNmJjMzZlZWE1NTM4MTI2ZmM1ZTg5OGE1MGE1YWNjMWJlMDllZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtaXBmcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvaXBmcy9JcGZzQmFzZTU4LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzE3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY5MWFlZTRiNjY5NjBjNDNkN2FiN2E4MGM1ODc1Mjk5NmRjZTNjNjQyMDI5OGZmYTc3OTlkYWYwYmE0MDRjZjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWlwZnMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL2lwZnMvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUzOTI0OWViN2ZjMGI5ZDBiY2VlMzYyYzQ4YzhmY2Q2ZjdkN2Y3ZjA1YTJjYzRhMGJjMjFmZTQzODM1MzExZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWphdmEvYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcwMjYwZTA2MGE1N2U5OGQyZjgzOTkzZmNjODQyMTY2NWVhYTdjYzYyOTkzODQxNzFlOGM1ODA4NTJiNTdlZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWphdmEvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL0JsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzY3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImFlZjIzZmQ1ZGQyZWUwOTA4ZDIzMjA1M2U5ZjA5MmViYWFiNTFkZjUzNmE5MWQ0Yzg1ZmUwYmNiOGMzOTZjM2QiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWphdmEvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL0JsdWVSdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUyMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0ZDM1YmRiNTM5MDRjODRjYjgxNjY5NjkzYTg5NTZlYjk5NTE4OTYxOWFmMDNkODAyMDMwMmU4YTc2ZDFlNjNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1qYXZhL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmI1YWE1NjMzMzk4ZWVjMmFiZDU5ZmU3NjAzNzBhZGQ2MDAzYmNjZDVhMzA3MmNiMWIwNTg5NmJhMTdkNzIyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtamF2YS9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZVJ1bnRpbWVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQ2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4NGU0NzY0ZDA3MmExNzhiNWJmMjI1NGFhNTM0N2JjZjgyZDA2NWZiOTg0MjU4YjBhOWJlNTFiNWU4ZGJjNDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLWphdmEvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0JsdWVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ2NSwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlYWQ1NTgyMDk2ZGExOGY0OWRiZTZkMWZkMDI3MDZiODhlMjNkM2U3MGI1NDIyMmRmNDk0MDVkMjM1YjU2NjUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc1YTdlNWI3MjdjYTIyNzY3MjkxNWY1NzRmNTY1YzI3ZDYzNDY3MThjNGYwMzAzMzFiOTM4OGY0MDZmOWU2MWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2RpY3Rpb25hcnkvRGljdGlvbmFyeUF3YXJlRXhwb3J0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MDk1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWIwMWY4Mzg3MTQ0ZWVmYWY5NTYzZWY1OTUzY2UyYTI2MzQ3Yjc5MjQ3ODdlMjk0OTA1MTYzYzZmNDc3ZWRlMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZGljdGlvbmFyeS9EaWN0aW9uYXJ5UmVnaXN0cnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGYzMGIzYmQzNzc2YjhhODFiNzFmMjEwZGU2M2YxMmZiOWQ1MDhhZmNjYjZiYjhjYmE1MTgyNDAwNTY2YTdlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZGljdGlvbmFyeS9FeHBvcnRDb250ZXh0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkwNzhmZWI1NTM3YzYwZjAxNWY5NDIyYTMzODQ5MjBjNGEwNDZjYTZiMTcwY2NkZjI2ZjYxODdiYmZkZTkyNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2RpY3Rpb25hcnkvVHlwZURpY3Rpb25hcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTdjZGYwZGQ0ZGQ1ZGY3MWEyMjU4NTJhOTQ5YTY3N2JmY2Y0NjZmYzRmNTExZTY5OGZlMDNiOGZhZmE5YzcyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZGljdGlvbmFyeS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQ3YThhMzRmOWM3ZjNkZDJiZDA4NmZkNDE0ZDQ4ZGI5NTJkZTk2YjI3YzkxYjcwY2JiMjExZmJiNDlmYTkyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9CbHVlQW5ub3RhdGlvbnNCZWFuU2VyaWFsaXplck1vZGlmaWVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlNDc4OTg0NDk4YmU5NjIxYmQzZmRhMWVlYmJmZjZlZDNhZmVkNjE1ODM4MTVlNjViNmE0YTEwYjM1YzkwZTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQmx1ZUFubm90YXRpb25zU2VyaWFsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1MDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZGFhMjViN2MwZmM0NjFhOWM0NTQ1OTUwNWE3NzI1OGYzNzJiMTA0MGY3N2NkM2RjNjhkNjc1ODNjOGM5NDhhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0JsdWVJZFJlc29sdmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAwNmZmNjFkNzc4MzEwNzgzMzk1MWUwZTZkZTk2NjBkYWU0ZWVjZDI4NDdjYjNhMzg3MjljNzMxZDM2MDhmZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQmx1ZU1hcHBlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg5ODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNDAzNjczNmQ1NmI2ZjlhMTFlZjU5ZDFiNGM5YTVlYWVmODk2NDM1M2YwMTUzN2JmNDliOTdjNGEzZWRiODA5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0NvbGxlY3Rpb25Db252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4ODM1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODhiYTFkNTFhMmQ0NmUyZjY5NTlmOTEzMGUxZTVhM2RiZjczOTkxOGEzMWQwMDM4NmE5NTU1NzNiNmE0MmM5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Db21wbGV4T2JqZWN0Q29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjliMTkzNTNiMWI0YzUxM2MyMTU3YjBhNmIzZTFhNGIzYjg2MTAzODkzNmZhMzgyZWI4MDM1ZTM1MjA0MDM5Y2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwNywKICAgICAgICAgICAgICAic2hhMjU2IjogImZhNjczY2YzNDVjZGQ3MzVjNzI0NmQ1MTM0NTgxNTUzYzA5NjkxYzM3NGU0NDU1ZWFmNTQ2Zjc1NTFlNGQyNzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQ29udmVydGVyRmFjdG9yeS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYzNTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NzEzNDNiMDJkNzVlYzM2MDg1MjdiYzE0ZmFjZTc2MGQ3ODc4ZTY3OGQyZmYzYWI5Y2Q0YTQ3NTNiN2NkNDUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0VudW1Db252ZXJ0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmJkZWI1NWI5ZDY4ODJmYzk1Y2M3Mjg2MmZiNWZiMTU4Yjk2ZWFjZDg2MTJkYmJjZmE1NWFmNzJkZTdiMWJlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0phY2tzb25Qcm9wZXJ0eU5hbWVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0MDc5ZWJhNTU3MDE4YmZlZjM0YjhiY2JiNTczZjQzZTRmNTA2ZjE3MDc0YzU1MWIxMzY5NmE3NmJkYjY2YTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvTWFwQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjI5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFkZWVmOWMxZjc4NDM4MzY4MTIwNmM1NjczMThhOGU3MGU4MDg5NDYzMWIwOTNhNTQzYmZhNzYwY2JhYjRmNmMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvTWFwcGluZ09iamVjdE1hcHBlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0MWJkYmJlZWUyZmVmYzc2YzljOGI3OGM3MGRhMjU1NWFkMDhjMWQxMmM3NTUwZWUzZDQ1NTZkZWZiNTA1MmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvTm9kZUNvbnZlcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY4MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4NTZiODA4MmVhZTc5NjNjOTc4ZmM5ZGE0ZjVkMGQwNTg2ZWU3YzZlZWNlNGQxNTlhNjk5NzJmNTc1ZGMxNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvTm9kZVRvT2JqZWN0Q29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNlODRiMWFkMGFkODY4YjNmNzZmOTk3MTliMmFlYTEzMDRiMDA2MWEzNzQwYjA1ODNjZTdiZWYyMWVkYmYzNzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvTnVsbENvbnZlcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmODA5NjQxMDgwM2UyYWJiYjJmMDVjNGIxMTVjNjM4ODM4MzY2MTdmYjk1ZDc1MzE5ZTc1MTRjMDQ2MWJkMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvT2JqZWN0RmFjdG9yeVJlZ2lzdHJ5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1ZjNjNGMxNTBlMzk2MjQyZmMyMDU3MTAzNjU4YmNiNzQwODdkY2IxNjg2YTg4OTM1MzAzOWZlMmY5YTE0NTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvUHJpbWl0aXZlQ29udmVydGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzE1NTNjNjI4NjBjMzNkN2UzNDE0ODc0OGU2YWM5NGI0M2Q0ODUyNGQwNTYzZjU3ZTY2NjM1OTA2NDc1NjFjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9UeXBlQ2xhc3NSZXNvbHZlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMmZmNGNkOTQ0YWY0YjQ4OWMzYjZkNTA1ZmQyNzRlZWNhOWZkYzY3YzNkOTc1ODQyZDM0YzVkOWNiZTcxMTUxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL1R5cGVDcmVhdG9yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2U4YWJhZDMwNDI0Yjg3MTFhNTVlN2VhNzE1NTkzM2FhODFjNzY1MzY5ZTJjYTA4Nzk2MDE5YzBlMWVkOTI2MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbWFwcGluZy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9WYWx1ZUNvbnZlcnRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNjczZWI0MWJhOTcxNTU2ZGJhYTAyNjIxODgxYWZjMWM5MzdhODQzNmMzZWM5YWFlZGYxMzMxNTQ1OTk5M2Q4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOWVlYzE5ZWNhMmI3MTE1NjhjMWRiYzIzMzUxZDIzNTIxYThjMGJiZTg3ZGViZTUwZjBhNGI3ODJmZjhlMjljIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tYXBwaW5nL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL3Byb3ZpZGVyL0NsYXNzcGF0aEJhc2VkTm9kZVByb3ZpZGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODMyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImI0MDZkOWUzYmYwMDllZTVjNDk5OWY2ZTJjODNhMDE0ZTM3NGYwN2Q1ODgyNDRiZTRhNDk3NTZjOGU2ZGYzN2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1hcHBpbmcvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvcHJvdmlkZXIvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTIwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjOTVhOGE4Y2QzODQyYjNjZjllNmI5NzM0OGEyMWVkZTNiYWUxMmNmYzU0NmU3OTNiZTk1OWUwYTFjMDYyNzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL2J1aWxkLmdyYWRsZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZTY4ZjUzY2Q5Nzg2NDI3NGViNTY3NzZjMzMwYjM0ZTBjY2NhN2ViMjdlMjYwMGYxMjRmYTA5YzcyM2M3NDFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvQmx1ZURlc2NyaXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDcxODY1NjZhNTU1MTEzMzAxYzQyYzBmODZjYjRjMzJhYzllNDMxZGM1OWNkODlkZDJkYjVkMjRjMmQ2ZmUzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL0JsdWVJZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImIxZjg1NWY0ZjhlMWM0MGNkZDgzZDhhYjk1ZmFmNWQ4NWU1ODAyODBhYTc0M2U5MmRiNzBlZDA4OWJmMWQwYzYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9CbHVlTmFtZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMzYzE0NzVjNTUxYjZlMzZhZTZlMWM5OTdmMzMxOTcyZWNiNWYxZjJiZTJiZjY4NzFmOTU1ZTUxZTg4YzFlN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkOWFkODZmZDRhMGE4YmMzZTU4YjE0MWNlM2U0MjQzODQxMGJmNjA4MGQzOTIxODFjMTM3ZmU0NGRjMTQ2ZTQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZURlc2VyaWFsaXplci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNDcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWFmZGJhZjI3MzMzNTQ5NzI5NWU3NjE2ZjVkMjUyM2Q5ZThiODIyOTQ4M2RhMmNhNTE3YmM0ZWM3YTgxMzcyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVHcmFwaENvcGllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjY0MmVkZTZhMzE3MDIwODdlODgyMzkyNGY0MGVjODQ5MDFjOThiNjE4NGIxOGQyNGUzZjdhNWE2NGM2MWRjNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVJZGVudGl0aWVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTkzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImUwYzA0M2QzMjQ3ZTc4ZDI0MmY0NTJkYjNhNWY3ZDQ5ODgwYTEwNjZiYjE3OTE1MTM2NWM4ZmIwMGU5MDY5OWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlSWRlbnRpdHlQcm92aWRlci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyOGU3NWEzY2EyNmIzMmQ1ZTQxMzNmNmUzZjU2M2U1ZmRkYjA5Y2QzOWZhNjFjM2E0YWZhOWM5NGU2MzM2OTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9Ob2RlUGF0aC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgxNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjQ1NGUwM2YxOGYxYmMxOTM2MGUzMmEyNDI1MDk1YzdlOTBkMDhiNTNmYTBiYzA5MjgzZDI0NTJkYmQ3OTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZVBhdGhFZGl0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWQ1ZjI3OGIyNTllZmQyODkyZDMzMTdlY2NjZWNiZDhhMTQ2MTQ5ODJjMTQwODhlNWU3MjVmODQxZDRmZjIyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVQYXRoU2VsZWN0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MDEwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjk2MjYzN2VkMDk5ZDRjOTA4NzZhYzdmZGE2ZjY3ZTI4YTQyZmNlZGJiNzg2NmFkNWNkNGEyMTA3ZWRkMTFkMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVTZXJpYWxpemVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmM0MmE2ZDUyMGE0Y2JmOTY1ZTViZTk1YzhiYWM0MmU5Y2EwZWJmMDk1MDYxNjE5NjhkNzk4YjgyYjg1ZmIwNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVXaXJlRm9ybS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzU5OTZlZTY1NDM1NzgxZmIwNWU3NThjNzE4YjllMmMyMjhjYTg4ODI0ODRhNTJkZWFkMzM3MzE1MTRkNGE5NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL05vZGVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUxNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ODk0MGRiZmJhZjdiYWVjYmI2MjUzYzZhNDllNjRlNzIwMjQ0NzE0NjAyZjQxNTc3M2M2ZWE2YTBlOGJlMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9TY2hlbWEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTc3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiMGUzMTkyZjg1OTdkOTI1ZjdlZjNjNjU2MDQ2YTczMzc2MzU3Y2VmMmQzYzExZWI2MTljN2I1MmRmYmVlZjQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC9TY2hlbWFXaXJlRm9ybS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDFmYjkyYjRjNDFkYjZjNTk2M2JhZDNjZmY3MDA1MDQ4YmY0MDczNDQ0ODk1ZDRkNTZmMGY2YzQ1NTFkMTViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvVHlwZUJsdWVJZC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1NjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZjg5ZWM3YzU5ZDZiNGU0YmE2NWNiYzI4NmZiOTQyNWU4ZDY0MDIzYTI5NjlkZjg5MzMyY2JmNGFiMTQ4Y2U1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTM4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZlMmM0OTBjOWZlZTg5NzcxYTQ0YmE2ODc1MDI5ZDc5M2JkYWY4NTgzM2ExNmYxNjlkNTg5MTc0MDYyOTg4NDAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC92YWx1ZS9CbHVlTnVtYmVycy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDY1ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxMTdlMDM2ZmZjYmJhYzE1OGQ2M2EzNzZiY2NmNzEyN2Q2MTlmNjhhOTA3NWJiNzYwOGMxYjI4OTY1NWI4NDU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvdmFsdWUvU2NhbGFyVmFsdWVzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc1NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRkODc2ODg4M2ZjNzk0MTg5YjFmNThiNTNkYjM3MzNiYTk1NDVkNTAwZWYxN2RjZjIyZDZjZjg4MDY2MGE0ZGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC92YWx1ZS9wYWNrYWdlLWluZm8uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzAyODU5MTMyMzM2YjZmNDMyNGRjOGY3YTg0NWNhZWI5N2I1YTQ1Njg3Nzc1ZmM4Y2I2M2Y5MjZhZTRmN2VhOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJsdWUtbGFuZ3VhZ2UtbW9kZWwvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL3dpcmUvQmx1ZUxhbmd1YWdlQ29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODcxMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQxMDVkZjc0ZTgyY2ZhMzE1MDM1YTA2MzZhYzcxNWU4MzA0NmRiZjMzMzc3NGMzMTRkYjJlNjI2ZTdkZjQ1ZDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC93aXJlL0pzb25Qb2ludGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjU0ZGQ5OTg5ZDZlYjIxYTFmMzQwMTZhZjE2ZTRlYThlZjQ4NTFiYWI0M2RkNzU1ZmI3MmEzNTcxYmMwZDFlMTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC93aXJlL1BhcnNlZEpzb25Qb2ludGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjM2MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkOGI1OGI4NGQ1OTFmOGM2YTdmYmM3NGU1YzhmNGQyZTdjNzI3NGY4MTA1Y2M1OWUzODVjYTM5N2E5YjgxNWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC93aXJlL1NjaGVtYVByb3BlcnR5Q29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUxYmU0NzY3YmUxMjA5ZmM4OTdlMTkzODM0MzRjNGQ0M2UzMTE2ZGFmNjQzZjEyZjBlMzdjMzU3ODc1NWY5OGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJibHVlLWxhbmd1YWdlLW1vZGVsL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC93aXJlL3BhY2thZ2UtaW5mby5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExMjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNmY1MGZlOWY3ZTEyYWU2MDg0OWI0OTQxMGVhZTNkODFmZDc1NDE5ZWYwZDhmN2ViMjBjMDk5MThhZDRjOGQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYmx1ZS1sYW5ndWFnZS1tb2RlbC9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvd2lyZS9CbHVlTGFuZ3VhZ2VDb25zdGFudHNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImFkYTk0NDExOTViMDhjMDUzOTBhOWViMDVlMzE0M2I0ZDQ2MmNiODllNWU0MTQxNWFiM2U2YWMwMTE2NzlkMzAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQzOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjk0Yjk2MjYyMDA2ZTQwMTc0YjAyZGIwNTcwZmI3ZjdiN2I0OTQ4MzEzMGM2YjkyY2YxOWU2NWQ2YzE1NTc1NTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zZXR0aW5ncy5ncmFkbGUua3RzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWE2YzhlNDNmNjZlZDM1MzQ4OWExMGNkODVkYjJhNjY0MzMyNjNlMTM5NDEyZDcxNjU3Y2E0YjhhZGQxYjQ0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0FwaUJhc2VsaW5lUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgyOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNkZWEyYjVkMDk3NTNhNTljNTI3OGEwNTc5Y2MxZGUwNjAwNzZkYWE1NGExNGQwODYwOTY1YmY1MDhlYTEzZDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9CdWlsZExvZ2ljQ29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2MjVhMjU3Y2MyNDc0OWJkNTJhZDJjYzM5ZTc0ZjNkN2UyNzNiM2YzZTAxZTYwMDU2YjdjMjYyZWU3YzBjNjMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9Db25mb3JtYW5jZVBhY2thZ2VQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDU4NzIwMDQ0ODFmOTZhOTNlNzJjOGE3ZTliMzU0ODU4NTE1OGVhYTM0ZDJlOTVhZWUwYWZmNGQ2NWQ0NzNmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0RvY3VtZW50YXRpb25RdWFsaXR5T3JjaGVzdHJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzA4YzJiZDc2NWI1ZjJlOTI3YmI2MDcyOGUwYmIxZDY5Njk2ZDExNmJhZWE1MGI1YzlkYjg3M2Q2NzQ2NzAyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvRmluYWxRdWFsaXR5T3JjaGVzdHJhdGlvbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWM2ODcyYjRkMjQ0NTY4ZDYxM2QxNDEwNmU5NDJlMGFiNGE1MmU2YzY1ZmE2NDA3NWFiMzI1YjVhMzU2NTk3NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0pSZWxlYXNlclB1Ymxpc2hpbmdQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2OTc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2EzNDk5ZDNhZTlmMTJiOTJmYjQ2NWM1Y2FjN2M0YTFiOGEzYWIwZTk5NzA5NjY2MDQ1ZDliNDg3YjRmMDYwYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL0phdmE4TGlicmFyeUNvbnZlbnRpb25zUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3ZmFlNjIzNDYzYzEyYTQ3ZjIwYWE0MzVkZmUxYzRhZDFkNDJmZWM2NmQ4NmFkN2QxODdiYzhlY2Y1ZmFhNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9KbWhDb252ZW50aW9uc1BsdWdpbi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1NjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NjQ0YTc0ZTc0YjQ3YWM2MTE0YTcwNjEyMTM3ZWM2YzhlMGM5ODA2NDgzOTlkN2Y0MzIyNWUxOTY4OWE4MjBlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvUmVsZWFzZUV2aWRlbmNlUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ4OTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNzQ5ZTQ1MTljOGE0OGM0YjBkM2M3ZDgyNzRhNTVkMzc4Mjg3ZmEyMDRlNTBkNjk4YzM5Yzk2NTg5ODczNmY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvUmVwcm9kdWNpYmxlQXJjaGl2ZXNQbHVnaW4uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGQ0ODFhZmZiYzg0ZmYxNzk4NmZiMGRjMGI4YTYyZWE5OWZiM2JiZTJmM2IxNTI5ODFmMmMxMDk5YTFlODI4MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL1Jvb3RPcmNoZXN0cmF0aW9uUGx1Z2luLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg0MzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5YTdmYTc4NmMyYmY3MDgyOGQzOWJjZWZlNWQzNTMzMTU4NDZmOGM4N2Y4OTNkOGY2MDM1OGZhYmIwZjYwNGExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvU2VtYW50aWNFdmlkZW5jZU9yY2hlc3RyYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTgwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE1ZGEwNTg2NjllNzNlZjhlNTJiZTNjZGVjNjgxODE1MGY0NzY3NWE5MTg4MTg5NWYxNjVmMTczZDUxODU0ZDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0FnZ3JlZ2F0ZVJlbGVhc2VSZWNlaXB0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4MTJiYjVhZjk5OTIxMjg2MDY1NmI1Y2YwNjViNGI5ZDQ4MzRkNTExMWFmODZjOGRjMmFhZDI0OTgyMmJkNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0FwaURpZmYuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjQzYmJmYmRjNDYwNTczNjg1YTQ0OGUwMWFkNzViODVjM2RhOGJjN2Y4ZGMwNjAzNDcxNmM4ZTQzNTFjZWNmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQXJjaGl2ZVJlcGxpY2FDb21wYXJpc29uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzE5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJhMTFjYTkyNjFjODllN2FlNWJjNWJhNDk3MGVjYWRkYjIyODllNmJhYTVhMWU4OTBhM2I1NTA4OTEwNTkxNjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0NsZWFuQnVpbGRFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNzAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2Q5MGIzMDliNzQ2ZDBmYmViZDNjYTg2MTc1ODE4NTM3MGNmYjAzZmZjYmZmNDZjZjgzZmQ3ZGU2OWI3Yzk1YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRGV0ZXJtaW5pc3RpY0hhc2hpbmcuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmM4MjQ0OWIwYzFhZWMxMjg5ODg4ZmEwYmVkNWU4MjFiYTljYzE1NzEyNjdkMThlOWI5NWJjMWFmZDJiZWQwMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRGV0ZXJtaW5pc3RpY0pzb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NzQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JjNmQ3ZWM1YjUyYzQyMTQ1YmRiMzViNDY4MmYyOWYxNWZlNjRkMDM2NDhhNzVlOTE0NGE2MjFkMTZkY2ZjOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRG9jdW1lbnRhdGlvblJlZmVyZW5jZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjYwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI3NDhhMmVjMGRjZDFhNjJkMWYzOWI1Njc2NzA1NGU3ZTdiZDgzYWEyOTJlMGYwYjY0N2Y0YzA1NDM0ZGU4ODIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0RvY3VtZW50YXRpb25WZXJpZmljYXRpb24uamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjA5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY1NzExOGVjYjhkNzBlZmZlYTk1OWQ4MmMwMDAzNTliMzlmNDYzNjE5ZTdjMmNhMzcxNjBmYjAxNTJmZmNlOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0ZpbmFsUXVhbGl0eUV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzM5ODksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyMzhlZDZmNWZmN2FkNDIzODA5ZjI4NjZiMDI1NTgwM2NiMDM1YzA0ODJjODJlOWY0ODU2ZmYwOWE2ZDdhMjFmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KVW5pdEV2aWRlbmNlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMwNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkNTc3ZmYyZjg4ZjE1YWI4NjQwN2EyZDUyNjU0ODhjNTFlN2I2NmRkZDU4ZWExMmNjMTM0YmI3Y2I3NDAzMGIxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KYXZhTW9kdWxlSW52ZW50b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI0NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxM2YwODNiYjgzMzNmMmVlM2FkMGZjZDRiNGNiZDQ1NWJkYWZhOTg2OTRmYzc3Mjg5Y2FhN2E0ZWY4ZWJjOWVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9KYXZhUGFja2FnZUN5Y2xlQW5hbHl6ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjEyNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1MjAzMWVjNWY3YjAwMmQ0OTdjYmU1ZGIyY2Y3MDdhYTUyMWJkNzAzNWQ0YzRlZWJjNWE2MzFiZTVhYzljODgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0phdmFQdWJsaWNBcGlJbnZlbnRvcnkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzAxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZkZTQzM2E1Y2QzMWVkMWRkYTkyNWYwNGYxYjI1YjdlZjU0ZjY4ZTZlMzYzOTI4NGNhNjcxOWVhMDk1ZTEzODMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0phdmFTb3VyY2VRdWFsaXR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3NDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZDZkNDYxOThkOWM3ZTM5OGUzNDkyZDJmZmE4NmViZDkyZmEzZmYyZTQ3NGQzNTE5ZTExYmM2ZDhlODc5NjkyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Nb2R1bGVTdHJ1Y3R1cmVWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWMzNDAwNThkODhiMWYwOTE0ODljZmUzNDU4YWU1MjYwY2U0Yzk0OTk2ZDA2ZTViZTA1YmFhOGM4MjAwMjYzMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvUGxhdGZvcm1JbnZvY2F0aW9uTWF0cml4RXZpZGVuY2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzAzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjEzZmZjZmJjNTVjYzRjZDFjYWU4ZGYwMDQ2MDVhZjY4ODg1NzM3ZWE2NTI4NDk2NDk0OTFjMmJjMmRjZjQwN2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1JlbGVhc2VFdmlkZW5jZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzYwNTgwMDFlZmYyYTZjOTE1NWY0NGY0MDY4MzVkYjI0YjdhMmUzZTk3NTQ4ZWM1NDA2YmFlMDZiNzFjNjY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9SZXBvc2l0b3J5U291cmNlRmlsZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTU4MDc1MmY3MTQ4NTUwOGEzNDYzMmRmZDAzMGE1YzRkN2JlMDZlYzEzNzgxMTA0OWM1NmRiZTlhMDQxNzJiNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvUmVwcm9kdWNpYmxlQXJjaGl2ZUluc3BlY3Rvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMWI3NWE1OTc1NGJmNTMyMmNiZmEzMWZiZDk1YTMwZWUxODNjMGY2MWU0OGVkNWRkOGFjM2U5YTc5ZmEyNmNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Tb3VyY2VEYXRlRXBvY2guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2I5Mzg2MDI3YzhlNjJhNWJiMzU4NGNhZmI2MzlmZDg3NTJiMmNmNWZkMTY5ZWE5ODhlMWE1MjhmYjk1ZWU2ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvU291cmNlUmVsZWFzZUFyY2hpdmVWZXJpZmllci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg2ODMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Y2E4ZDRjYTBjNGQwNzhhYjI5Nzc3NTdjZTg4YjBmNWFmNDQyMTc3Zjk0ZmU5MTBkYTRiMjk1MDlkNTQ0MjdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Tb3VyY2VTbmFwc2hvdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTY2Njc1NDk0MWYxMTg0ZjA1MTQ3NTExYjI4ZTk1YWIzZjAyOGEwYmM2N2U3NGUxY2Y4MzZkZjM4MmU5MGE5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9TdGFsZUlucHV0VmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODA2NTdjN2U0NzgwOWI1YmZlY2UxOTkwMGU2MzUwYjBiZjA1NmExZWViNWM3NjBlMjRlODk2MzQ1MjM1YTc0MiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0NvbXBhcmVBcGlCYXNlbGluZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTE0ZmIzMGVhZTA5Y2QwZjk4YzdmN2VhNjIyZmRiYjcwYTcxZGQ5OGVmNDljM2JhYzE0NGZmNDNlOTg0YTNiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0NvbXBhcmVBcmNoaXZlUmVwbGljYXNUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU2YjMyMzZlNDg4ZDYwMzJkNDdjZWMzMTEzNzViZDgxODRlZTZjZTczOGEyMzFjMmYzNzJlZmI3MDM0ODU2YTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUFnZ3JlZ2F0ZVJlbGVhc2VSZWNlaXB0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZGQwNDkxMWQ1NzA0MzYyODM2ZTA0MDM2NzE1NTRhODRlMGI0ZWY2NzZlMmJlYTg4MTExZGQ2ZWUzZGI3ZGJjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVDaGVja3N1bUZpbGVUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzM2IyMmJmMjg0OTE5Mjk3MTQ3ZmVjYjdhOTI1OTU3ODg4ZTQ1NGNkM2VkYWMyM2VlNWVjZmNjZTRmZDE3ZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUNsZWFuQnVpbGRFdmlkZW5jZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NjY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2NmNmNmZjI5NzYwMGE5MWNmZTY4MTI2MzkyMmJmYzI1OTJlM2I0ODExN2FhNTczMDg2ODczYWJiNmYwNDM0NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlQ2xlYW5Tb3VyY2VFdmlkZW5jZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDI4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjg4ZTU4ODE4YzYxZDJjNTBjZmI0ZGE2YjExNzQ2Y2E2ZWE2MzMyNDliYzRjYjk2NDY2ZjFmMWZhODkwYWJmMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlRG9jdW1lbnRhdGlvblJlZmVyZW5jZXNUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzk1OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhZjkzMGFmMWM2OWZjODQ5N2UxNDlkMzBiMjI4MGI0ZmFkY2Q3MzFlZGYwMmEyOTI3OTY5NjllZDZhMDhiYTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZURvY3VtZW50YXRpb25WZXJpZmljYXRpb25SZXBvcnRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc3MywKICAgICAgICAgICAgICAic2hhMjU2IjogImM0YzE4MWM0N2RiOTZlZjhmOTE2YzNkZDQ2OGQ1MGMyNTEwY2IyNDFhMGFhNTVjZGM5MDE4NWEzNTJlNDc5OWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUZpbGVJZGVudGl0eVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzg2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWM1MjlmNzBjYWMwNGVlNGM3ODQyZGNlMzkwZDBjMmY2YjJhYzBiMTYwYjdiNWEyNGQ1YmE0NmU3NjMxOWY2OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlRmluYWxRdWFsaXR5UmVwb3J0VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzQ2MTNlYWIyNGM2NDc1NmNjNjIzYWI4NWIwNjgyOGIzNmNkZDdkYzZkZjM1MWJmYzFkMTM2MDUwYTNhNDU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvR2VuZXJhdGVGcmFnbWVudGVkUHJvY2Vzc2luZ1JlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDM3NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg1MjI2OWZmYzlhYTk3OTcxY2JiZWJkYzllY2MwNGVhMzBhNDc0ODMyZmRkY2RmOTM3M2I4MTlmMWE0ZGNlYmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUphdmFBcGlJbnZlbnRvcnlUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM0NywKICAgICAgICAgICAgICAic2hhMjU2IjogImZlNDhiNTI5MWE3OTAwODllMGZiYTMwYzNiOWZmMTMwMzAwNjM2ODAxOTc0M2JkNzU0OWYzMTY2Y2MzOTQ1NWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZUphdmFNb2R1bGVJbnZlbnRvcnlUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjE0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2YTZmNzRjYTFlMmY3OGQ1Y2IzZTE2ZmY5MWE3MDliODQ2YzE1ZjQ2OTg3ODdjZTJmNjYzNTA4ZDBiNmU4NjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9HZW5lcmF0ZVJlbGVhc2VFdmlkZW5jZVRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTk1YTRhZjQzYjM1OTRjNWJjNGI2MjE1MTBkNzY1OThmZDcwYTExZGUyMjQzYWUwMzVmMTBhNzE5MjdkODNjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL0dlbmVyYXRlU291cmNlUmVsZWFzZU1ldGFkYXRhVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3Mjc5ZTRkYTgxY2Q2NGI3MTVjYTljZWVmZGJmOGJkM2RmODExZjU2OTFlNGUyY2IzNDZiZmI1ZWMxNDEyY2I3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5QWdncmVnYXRlUmVsZWFzZVJlY2VpcHRUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDAxNiwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4ZjE1ZjIwNWY1MGIzMTM5Mzk0YTI1M2Y1MzFhZGI1MmNlMjY2NzI3MjZhYTdmMmE1ZTY4MDE4NDNiNTQ0NmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlCdWlsZFNjcmlwdFNoYXBlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUyNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzhlMWNlZTk5NDMxMGI0NjYwMmU0YzVlNTIyMzEzMTJjMDBjMTFlNmRmZTQzY2JhYWIyNTY5ODNmNzA4ZDgxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5Q2xlYW5CdWlsZEV2aWRlbmNlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZWJkNjA1MGI5NzExNDc3OTkzZTAzMTdjOTI3NWVmMTRmZGQyNjk3NDBlMjQzN2M4YTViYWI2ZWNhMjFmNTM5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5RG9jdW1lbnRhdGlvblJlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2UzODgwNGRmYjc5NjBiODAxOTIzYzA0ZjFmYTNmYmM3YWJkMzlkMjY3ODdkMTM4YjY5MDE1NGFmOWRjMzQ2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUZpbmFsUXVhbGl0eVJlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDk3NmZmMzgxNThmMjg5N2FmZjYwYWJjNmRlMjUwYjc1YzRiMWQyMjA1ZDIzMjczMDY5YTNiZDljNjczMmYyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeUlucHV0SWRlbnRpdHlUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlN2Q3YjA1YjZlZDE2ZmU4NWZiMTk0ZDZmYjgwNDgwMjEzYTA0NjY2MDMyODQ0NDA1MzRmYzdiNzQ2MzBkNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlKYXZhTW9kdWxlU3RydWN0dXJlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZWU1YzEzNDI3Y2E0NjQ5ZjA0NTdlZThiZDc2YjYwM2Q0ZTE2ODNlOTM2MzA0YjZjYzkyY2I4NjBlOTNmODY0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL21haW4vamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvVmVyaWZ5SmF2YVBhY2thZ2VDeWNsZXNUYXNrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1ODI2YzkzMjMwYmI3M2NhM2RiZDNmOGQ1OTcyZTI1NjUxMzkxZDVjMjUzYTNmMDU0ZjBmNjY4ODg5MTUzZDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlQdWJsaXNoZWRSZXBvc2l0b3J5VGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjk0NWY1OGZhYjQxMDc4NWFkNjg1MTBlZjBjZWJiMTk2ZjU1NGJjYTc0YjkxOGNlZjljZTI2MTM5ZmVlMTI4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeVJlbGVhc2VFbnZpcm9ubWVudFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQ3ZmM4ZTJkNWNlNjcyMDQ2NDJkOTFkZGMyYTgxMWVlY2MxMGQ0ZmQzOGZmZGE5YmY0NjI3YTE2YjVlNDMyNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeVJlbGVhc2VFdmlkZW5jZVJlcG9ydFRhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDAyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmNmEwY2EzYWE0NGU3N2U2YWFhZjE5NjU2N2NkNTNlMDE4ZGFkZWQ5ZTRjNzNkZGNjN2U2NTIxZTI3NWU1ZmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvbWFpbi9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlSZXByb2R1Y2libGVBcmNoaXZlc1Rhc2suamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzI5YWU1NjJiZjEyYzY0Yzk1ZTFiNDNiYjgyY2M0MzE0YzE0YjQ3ZTBmYmViZWI2YzFiZjNmYzliNTdmZTBkOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy9tYWluL2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1ZlcmlmeVNvdXJjZVJlbGVhc2VBcmNoaXZlVGFzay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3MjE4Y2M0Mjg0MTI4ZjBmZGIwNjE4YTQ1ODk0YWIxODJiNjc1ZWQ1Njk2NDZlNmZiNzI4MjU0N2U3ZmU0NDEzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvQ29udmVudGlvblBsdWdpbnNGdW5jdGlvbmFsVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzMDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzAyNDM1MTFjODI3ODU5ZTU3YjRjYmZiOWY4MGZkNjAzZWI0NTIwMmZhOTRhNDc3MjFhZGNhODk3OWMzNWZkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL0NvbnZlbnRpb25QbHVnaW5zVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTU3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDg4YzM3MDI1MGEzMTcxYTQ2ODk2N2E3N2Q0MzJjYWY1NjRlMjZkZTI4OWI1MmYzY2NiMmVmMDA3YjAzYWJmMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL1BsdWdpbkRlc2NyaXB0b3JzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjMwNDI3NDQ0MGY5MTc2YTU1NWI5YzE4MDUwNDMyNTkyYWFmMGY5MzMyNzVkZmIxM2VlYTc1MTgyNGI2MTRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvU2VtYW50aWNFdmlkZW5jZU9yY2hlc3RyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODU5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjhkMjg5ODA0Y2YwNDdkNDRhODFhZGVlODA2MTBjMDMyZWZiNmE5ZGUzMzY0YzczNjgzNTQxNjgzYmJjN2MxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQWdncmVnYXRlUmVsZWFzZVJlY2VpcHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDIxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ2NDRjNTliZTQ5ZjUzZDcxNDk3ZTU0N2NjYmIyYjRlOWE2ODNmMGRlNzliYTUwMmIwMGFkZWVlMWE4MjdiZTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0FwaURpZmZUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzY3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE5NTc3NWNlNjhmZjUwOThjNWMyMzdhNjI3OTYxMzViMWUyZjRlMDk5NzJkOWJkOGJmMmE3NWM4Y2U4NDFhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvQXJjaGl2ZVJlcGxpY2FDb21wYXJpc29uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMzBjYjVjYTA1YTcwODVjY2Q1ZmIxMzcwOGZiMTI4ZjgyMzc2NDc3NjBiNDU3NjcwYmE1OGNiODg2MjEzNzU1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9DbGVhbkJ1aWxkRXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFmOWM5MWVmODU5MzlmN2VmZWIxMmM0N2MwYzc1Y2RhMjBjNzU1OTUzY2FhYWU5MDRlZWJmYWJkMjk4NjRlNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L0RldGVybWluaXN0aWNIYXNoaW5nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3OTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMzY3ODA3NTg2N2IzOTM4MDZhNTljYzRmOTFmNDkxY2UxMTE0NDk5MTgwMTVhZjllNDJkYWYzZWIyMzQ3N2JiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9EZXRlcm1pbmlzdGljSnNvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGQ0NTNlMmZlYmMyZmI3MjQ4MmE3MTZjZGFkZGRjNjE0NDg3MzNjMmZiNzA2NTNjZmJhZTNhNDc0ZGQwOTRlMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvRG9jdW1lbnRhdGlvblF1YWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwODI2YjllNzg4ZGZkOTI0NWMzNmEyMjk1NWNmNmRhOWY2NWEyNjU4NTIxMTIyZjUzMTBjZjkwYmU3YmRmMDI3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9GaW5hbFF1YWxpdHlFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2ODcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDQ5NzJjNWE5NmUyMWIwMDFkZWQ3YmZhMDA5ZDIyZmY4MDM3ZTdiOTgwMThhOWY5MTU1Mjc4ZDFmYWZmMDlkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvSlVuaXRFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDA1MDMwOTYxMjc4MGRjZDFiMjA3ZTY2MjdkYzRhYmM2NjMyZjkwMmI0OGM2NTA5YWMyM2VlZjAzODQ4YjA2OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvSmF2YU1vZHVsZUludmVudG9yeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2Mjk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjM0YTZkOGYzNDZlY2FhNTNlYjZjZGY5MmJiOGU3ZmNiYmFkMzc1YWRiYzA5N2IxYzRhNDU0NjEzMzZjNGVhMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvSmF2YVBhY2thZ2VDeWNsZUFuYWx5emVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNzI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWMxNTAxZDlhMGUwOTAwOWRhZDQxYmUzMWZhODFkMGZjNGNkOTllYzg4Y2E4ZTcwYzc1MjExMDUzYThlYmM0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvSmF2YVB1YmxpY0FwaUludmVudG9yeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTY2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzI0MmVkOWIzNWZiNWYxMTEyN2VlZDZiMTdhYWIwYjgyMzk5MzFmMDkyYjBhM2YwZmM4YzkzYWNiMDdhMGYxMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvUGxhdGZvcm1JbnZvY2F0aW9uTWF0cml4RXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDUyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhZjhmNDliYjdkMDc0MjRiNTM0OGM4OWY0ZGZlZjEzMjkyZTdhZDE4ZDc3ZTM1MGE5ODQ2ZTAxZDQ5MzgwNzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1JlbGVhc2VFdmlkZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzQ0YzA3ZTgxMzk4ZGUxM2ZmYmUxODM3OTZlOTY4NjhjOWRlMGZlNTNmMDMyNTUzODQzYzg1OTZmNGQ5NzMxYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvUmVwcm9kdWNpYmxlQXJjaGl2ZUluc3BlY3RvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JlMDI2YzhiZDcwNjEwMjI4MGExNmQwMGQ0YWI1MzRjOGYzMDVkMGIwYzhlNjRjNmY1MDViZGMyMGY0Y2NhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3N1cHBvcnQvU291cmNlRGF0ZUVwb2NoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYTIxNTA3NTcxYTU4MzllMGZlYmVjNmNmNDQ0YTM2YTEzZDZlMjZkOTc3MDA1ZDFkY2E4NmI0M2M0MjMwODU3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9Tb3VyY2VSZWxlYXNlQXJjaGl2ZVZlcmlmaWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI5NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyOTU4MTEwZGZhOTc5MjI2YjkyYWU3NThjN2E2YTdiMTQ0ZDA4NGE1NzZmMWMzZTExYmNhM2M0MDQzNGI0NmVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvc3VwcG9ydC9TdGFsZUlucHV0VmVyaWZpZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI5NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjIwYWViYzllZDdiY2FlMTBkNThiYWEwZWJiZDk3NzMyYzM3MDUxNzc1Y2I2OTdmMjgyYjVmMjdmZTc1NTYxMzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy9zdXBwb3J0L1Rlc3RKYXZhQ29tcGlsZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjg1MDY1YTZkYTI1ZjVmZjhlOGVkMmM5ZWVlOTJhYTA4NTg2YThmNDk1YWIyZmM4N2QyZDRmY2E2Yjk1NGRlNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL01vZGVybml6YXRpb25WZXJpZmljYXRpb25UYXNrc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjI0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGFhYzk3MWRlZmY5NDc4ZmI3Njg2NDZkMTc2NzlhN2Q1MGU1NzlkYTBiOWJmNjE0MWM1ZjRmYmQxNjMzM2ZjMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImJ1aWxkLWxvZ2ljL3NyYy90ZXN0L2phdmEvYmx1ZS9idWlsZGxvZ2ljL3Rhc2tzL1JlbGVhc2VBcnRpZmFjdFRhc2tzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU4NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOWVjM2RlMzkzODA2MWRkZmIzN2RhMTM2OWZiMTBkNjQwM2NmNmExMTFhNDI2NzA3M2Q2Y2YyYmQzOWFjOGExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQtbG9naWMvc3JjL3Rlc3QvamF2YS9ibHVlL2J1aWxkbG9naWMvdGFza3MvUmVsZWFzZUV2aWRlbmNlVGFza3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAxODM5ZGMxN2UxOTM0YTY0MGViYmFjYWI5ZDM1NDc3NjU4NWNmODQ2M2VkNzdmMDhhYzkwMmNhM2NhZjBkM2YiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlKYXZhUGFja2FnZUN5Y2xlc1Rhc2tUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzc2NiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhmOGQ3MzZhZWJmYjc0ZjliYjQ5YTdlNGY4ODZkNmViYmI3NTZjYTIyNGQxMWQwYjUzOWJmYmMxODdhZDI0OTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJidWlsZC1sb2dpYy9zcmMvdGVzdC9qYXZhL2JsdWUvYnVpbGRsb2dpYy90YXNrcy9WZXJpZnlSZWxlYXNlRXZpZGVuY2VSZXBvcnRUYXNrVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMmY3ZjM4NGM4MDI5ODI4NjUzYzJiMTdhYWVmNDdjMzU5ODUxMDgzZWY0OTYyZGExZWY2N2IwMWM1ODQzNzAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MDI5NDA3MDllZjc1YTBmZThiODIxZmE2M2Y2ZjVlNTMwMGYxMzU5ZWIxYjVkMTJiYTEyNmEyOTFhMjFkNzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvYnVpbGQuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxZWUzYzQ0ZTRkZmM1YTYzOGNkZGI0ZjJiOTcwMmQ1ZWExZTFkYTYyZjRiYWEyZjdhZmY0NjRjY2FkYzRjMGIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvQ29udHJhY3RzRXhhbXBsZVN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImE3ZWVkNzI4YWQyNjAzYTY5OTgwZmE4ZTJjMGMyM2RmMTczNjZjNDIyNjMxZjBiNDdmN2MzZWQzZTg1YTFkNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvQ3VzdG9tRXh0ZXJuYWxDaGFubmVsRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYWQ5NzE0ZTBlYjdlMThhOGUzNTE1MWNhMmY2NTI3Njg1ZjM5MDQyYjg2OTdlZjFkOTk0ZTkyM2Q2NTg4YjM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0N5Y2xpY1NldElkZW50aXR5RXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM1ODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZGFlZGY5OGRlMTkyOWUzZTkyMGZjOTdkZmQ4NjZmMzZiMTJhNGQ1ZjgwYjllMzdiMWY2YjZlZjdlZjRhMDkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0RpcmVjdEJsdWVJZEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjVlYzVmMTc0NDk3ZGU4NzM5YTk4YmM0OGJkMjIzNThlZGEzMjI3MGQ2ZGZhMmIwMmJiMGYyYzJiNGU4NzJiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9FbWJlZGRlZENvbGxlY3Rpb25BZ3JlZW1lbnRFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1MzE3ZjQyOGViMmNjOTMzNmQzMjYzOGZkZjM4NjczNGFkMTQyMTNlMTY2YTg1MzcyZTM0ZjU5YWY5NmUyMmU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0VtYmVkZGVkQ29sbGVjdGlvbkFncmVlbWVudFJlc3VsdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUwMDIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzdhZDY4MzBjYzYzZjY0NDU1MWUxNTU3MTVjMTQ1YTQ1NDNlMzAyMmQwODJhNDAzNGM0Y2ZhMDIzNWYyNGM0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL0V4YW1wbGVTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzZjVkMWU1ODE5NTUxYTY0OGNkNjkzYTJkYjhkMmQxZWFkZmMyMTliNzM1ZmI4ZjZjOThkNzIwOTQ5NTFjYzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvRXhwYW5kQ29sbGFwc2VQcm92aWRlckV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzODgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWZiMTcwNDRjODBiODI3NGFjMWY2NGI0MWEzOTM1ZTE2ZDU2MzdiZTk4M2EyM2UzODI1NGY4NDYzZmVhYzdkNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9JbW11dGFibGVTbmFwc2hvdEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMmY1NTQ4NjMzYjQxOWMxNGFhYjJiYTdhNzAwYjdiNTNjNzhiNGExNTg1NGIyNGM2N2IzN2Y1NGZhZGU2YmZiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9JbmNyZW1lbnRhbExpc3RJZGVudGl0eUV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0ODMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2JkOGUzY2M0YTZiYzJlNDNjNjNmYzFhYmM2MGViZTE4MmUyNTFlMmE2YmU3M2NlZDVmYTM4NDZiM2UzY2MxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9QYXJzZUFuZFNlcmlhbGl6ZUV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODJlMzM2NGJlNTlkYmMzN2Y5ZTU3YWQ5Mjk3MWMyMTk4YjllZTA0YzI4Y2E3Nzc0NmFiYWRlOGQ2OWU5NDdkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9QZXJzaXN0ZW50UGF0Y2hpbmdFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDc4NywKICAgICAgICAgICAgICAic2hhMjU2IjogImU1Zjk4NjQ5NmJmZWE2YTM0ZDlhZmM4YWIwZWE2OGM4YzlkZjI4NGNmMDI5ZDEzMjU1ZGQ5MTYxMzY0YzBjYTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvUHJlcHJvY2Vzc2luZ0RpcmVjdGl2ZUV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MzIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWE1Y2Q5ODRhN2YyZGNkYjQwNmZhOTgxMWUzODk4MGIxOWE5YzY4ZTVlMGYwN2U3Y2ZiZGE1OGIwYjllMDVmZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9QdXJlUmVmZXJlbmNlRnJhZ21lbnRzRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU0MjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMTE5YTE5ZjcxMmFmOTkyMDg0YjA2OTA5ZmY3NDE4NjRhNTI0ZWE4ZWUyMjg1ZGNiYTRjNzNkMTU1NjhlYTViIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1Jvb3RPbmx5RXZlbnRzRXhhbXBsZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYzRmMDJjYTU4YWU3YmMyZTQ5M2MwNDA1OWZlOTJiMjgxNjM0MDM2ODE1OTk5ODgzZWVhZWI5YjQwYjY2YzM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL21haW4vamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1J1bnRpbWVDaGlsZEdhc0xlZGdlckV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMDIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWM2Mzc1ZjFiNTVkYWFiM2QyNTNjZjU2M2Q5M2NiNWU0NDVjNTE5OGQwNzI3MDIzYTMyNjc1ODMwOWMzZWQ4ZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9SdW50aW1lUHJvamVjdGlvbkFuZEluZGV4ZWREZWxpdmVyeUV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzUyMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjcxNGJhMGJmNGNjOTA5MTI0MTg0ZjcwMzMyMDQxNjBkNTYwMmM4ZGM0OWQwYmE3ZjRlZjdiNmYwMTc0Zjc2ODkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvU2VtYW50aWNGb3Jtc0V4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0OTE4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjg2MTQ3YWQ4OGM1NDhkYmIxZjRiNTE3YmQzM2QwODEyOTE3NTliYTVmYWZhZDUxZGY3ZGU5MWJlMzdlMmViZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9Tb3VyY2VEb2N1bWVudEJsdWVJZEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjgwZjg3NjUxNzJlZGU2Y2EzMGZiNTRmNDRhMzRmZTc0ZmJiZWQ2NTdkNGY4MDExMjNhN2VjODlkNzVjNzVhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9TcGVjaWFsaXphdGlvbkV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMzQ0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTg0NzAyMGUyM2VkY2MyMWQ5MTQ1MGM1ZjhjYjIyMjQ1NTFlZmQ3ODE1MDlkZDEzNzIwMzIzODYwZGRkNjU5ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy9tYWluL2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9VbmNvbnN0cmFpbmVkRmllbGRFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjcxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3MWM3Yjc1NTdhODk2YTU4YjAwNjhkOWI3MmVlOGE0MGVhYTBlMmQwMGQyMjBkZjY3YWYzZTBhMjhkNjdmNGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvbWFpbi9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvcGFja2FnZS1pbmZvLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJmOTM5NGViZmMwZTkzYjQ4Y2UyZDAxMGVmYWU5ZTNiMWYwNDkyMGMyY2NiNGZhODhhMGE1MzgzZmYxMGNmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9Db2RlY0FuZFByZXByb2Nlc3NpbmdFeGFtcGxlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjY1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWU1ZDZkY2NkMzZlMjU5ZmI1NTcxODA1YTRiNjNmYzdkZjY1NzJlNmViZTIxNTdlMTI2YjQ2YTAzZTBlYTExNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImV4YW1wbGVzL3NyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9leGFtcGxlcy9Db250cmFjdHNQcm9jZXNzaW5nRXhhbXBsZXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTA5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczMTI2ZTNkOTFlNWE2M2JhMDUxMjhlZjA2MTQ0ZTM5ODMwOGFkMWQ5NWQ4N2E1NDQxZTU5MGQxZDg4Y2Q2YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJleGFtcGxlcy9zcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvZXhhbXBsZXMvR3JhcGhBbmRJZGVudGl0eUV4YW1wbGVzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwNDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NjFjNTkxYTgyYzViY2VlODg2MWY3ODYzNDVkNWUzYmZjZDg2OTAyYjkzYTRlMzc0ZTFkNzNmYjE4MmFmYTI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZXhhbXBsZXMvc3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2V4YW1wbGVzL1NuYXBzaG90RXhhbXBsZXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjgxODdmYzQ5NjYzZGZiODU5NjkzMWQ2ZjI1NjJhYjkwZjE5YTljNmFmNTU5MDhlYmVhNWZjZDAzNTNjN2YyZDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGUucHJvcGVydGllcyIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzdhNmMyMGExMTk2ZmJjN2M0OTM5ZGI1NTBhZDA2NjBlNWI2NWZiODEzZjMwNWQ2YjlkZjJlYTlmMzdmMTkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAiZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4NDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDk3YzhjMmE3ZTUwMzFmNmFhODQ3Zjg4MTA0YWE4MGE5MzUzMmVjMzJlZTE3YmRiOGQxZDJmNjdhMTk0YTljNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiM2JkMjVlZDE2MWNjNGRkMjAxZGYzNzk5MGI5ZGNmYzcxNzNlZmY2ZWE5MTc0ZmY1N2Q1YWNmZGQ5NDU1Y2IxYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogImdyYWRsZXciLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY1NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE1YTVjMTk5YmEwMjE4OWFlOGM0NmEzMzQyMjMzNzFhMjA1OTlkOWMyOThlZjY1ZTc1NDBlZGU0YTNmNzJkNTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDkzCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJncmFkbGV3LmJhdCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODQ4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUzOTY3NmM0OGI1OTZhZmRhNjRjOTYzZWM4ZjdlZTU2YzdiM2ZlN2UzYjgxZDFkYmUyZDFhMWUzZGQ5ZTlmOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNldHRpbmdzLmdyYWRsZS5rdHMiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjExNGRmM2E2MzVhNjc3YmQ0ODcwMThhYjNhMTdmNjRkMmI2NDRlZGU4ZTY3OWE4OWUyYTdiYmNhNjFiN2U3NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNtb2tlLXRlc3RzL3B1Ymxpc2hlZC9idWlsZC5ncmFkbGUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzEzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjI1NjNkNGQ0NTk5ZmI2MzJiYTM2Zjk1YmJiNTNjMzZhOWZmNTY3OGY5OTExODU2NjE4OTVkM2NiMTI1ZTlkNmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzbW9rZS10ZXN0cy9wdWJsaXNoZWQvc2V0dGluZ3MuZ3JhZGxlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkyMzEzMDRjZDRhMGNjMmYyZDk4Yjg4MDIyZGE1M2E2Y2NkZjZjZDQxM2VkODM5ZGM2OGViMmZlNmJlZDQyNTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzbW9rZS10ZXN0cy9wdWJsaXNoZWQvc3JjL21haW4vamF2YS9ibHVlL3Ntb2tlL1B1Ymxpc2hlZEFydGlmYWN0U21va2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzA0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmFiNjMwOGI3YTY2ZjVlZTJkNGJkN2YyNWEzMTA2NjYzYzdlNzY2MGJlOTkyMWEzYzk2OTE3MTUzZTJhOGVhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9jb21wYXQvamF2YS9ibHVlL2xhbmd1YWdlL0JsdWUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzM5MzAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYWJhNWQ0MzIxODMyYTk1ZWI0ZTA4OGY5MWRiZmRmNzUyYmY4NzU5ODE0MzZhYWVmOGZmZjViYWE2NjBiNGZjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUHJvY2Vzc2luZ1NlbGVjdGlvbkNhY2hlQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVjODc2YmU4MzAwN2NjYzQxYmUxZjU1ZDc0NjAzY2NjZTc2ODAzZjBiOTAzZjBhNDI3NjY3YmEzYTMwMzcwMWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvam1oL2phdmEvYmx1ZS9sYW5ndWFnZS9Qcm9jZXNzaW5nU25hcHNob3RQcm92aWRlckJlbmNobWFyay5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmNkZjU2M2UwYWQzZGE0MjRhMDRmZjA0ZGZjODIyNWNiNGYxZDc0ZTY0OWQ0NmUzZWRiMmJlZmRmZmMzYWM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVjdXJzaXZlVHlwZVJlc29sdXRpb25CZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGJkYjU4NTI5NTM4MGFiYjllM2I1OGI5YmY0ZWZhN2QzNjIwNjRjMTM5OGRiNmRmZTViNjg3NzBkMTc2ZDRmNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL1JlZmVyZW5jZUJsdWVJZFZhbGlkYXRpb25CZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQ1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjY3Y2YwYTAyOWUwZjE4Mzg3YmM0NTc5MjliZjUyNWZiMTBiOGQ5YmRmOWUxZDUyZjRmOTAwNzkyOTM1MDI4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL1NjaGVtYVZhbGlkYXRpb25SZXNvbHV0aW9uQmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAwMjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNzM0NjE3OGMyMDMwMTg0ZDk3Yzg4NmI2MTgxNGUzMDg2ZWM3NzQ4N2Y4ZjcyYWNjNDY4NmM2NTYyNDNiYTg1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL2ptaC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RlZXBHcmFwaFBoeXNpY2FsTG9jYWxpdHlCZW5jaG1hcmsuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODE3YjU5OTQ0YzRjNWUzNzNjYjg2ZmQ3MWEwYmM1ZThlMzU4OTEzMmFhYmMwNmFjMTdjMzBjZWZjYTNmODYwOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy9qbWgvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JQcm9jZXNzRXZlbnRDb250ZXh0QmVuY2htYXJrLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhhMzgwODQwZDM1ZWE0MmQ0ODFkMDY3MTZkYzc4NDY5OWY5NjUzNjgyYzcxZmY2M2VhOTJhYTNkNDE1NWM4MWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZUNhY2hlTGlmZWN5Y2xlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDczNjA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjBjODRjZGVhNDYyNjRmODJjNjViZDFhNTU5OWNjMWFlZTE4NzM2NmJmN2MwNjg1Y2JiM2FiNDI3NzkwNWQ4MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9CbHVlQ2FjaGVQb2xpY3lUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1MGExNzA5YTYwN2E4NTBiYTEyMzZlZDgwZmI5NDM3ZDcyM2JjZmM2ZmI4ZGY4MDdjNTI0OTE2ZWRiODMyMmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZUlkUmVmZXJlbmNlVmFsaWRhdG9yRGVwdGhUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjYxMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFhYmRlZjJlNGVkM2IxODhmOTQ2N2JlN2QxYjNkZWZhZmE5MDM4NmE2NDVmYTMwN2UwNzk0YTBiZWViZmIyYmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZUlkZW50aXR5QW5kU3BlY2lhbGl6YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImVlMzQzNGFlYTc0ZWRiMzJiNDcyZGM1ZTE4MTg3ODJmMDMyZDQ5YWRlMjcyNDY3YWJhYWI5ODU2ZjU4Yzc4ZTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZUxpbWl0ZWRPcGVyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQyOGFkY2Q3YzhiMWVhZjU0N2EwY2U3ZmY1NjZhMmQxOGJiMDc2ODIwODAyZGZiZTBlNTg4MmNiYjhiNzQyNzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvQmx1ZVZpZXdQYXRoVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5OTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTQ5ODIzNWFjYzE3NWIzMjZjMGI2ZWZjODUxMmIwOTBmZTUxNmVlN2NiMTI1ZGRlYzVmZmViZTBhODRjZjdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0N5Y2xpY1Byb3ZpZGVyRmFsbGJhY2tUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTYwOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjYzQ0NjA1ZDI2MTA4Mzk5ZTBjODViOTAwYjYwMjg3M2ZjMTI1OWMwODVjM2ZhYzQwYTA3ZDVjMDE3YzMwMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvRGVmZXJyZWRTbmFwc2hvdENhY2hlSXNvbGF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcwMTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MzcwNTE3NjEyNTgxZDA1NTllNTlkMzc5M2JlMDU5OTRlYmI1NDUxY2RjNDNiNzUzZGZiOTAyMjI5NDc1YTQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0RpY3Rpb25hcnlFeHBvcnRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MWQ1OGMyZmU2MTdmNmI5YzYyZDBlMjQwMzEyMzMwODhmZTlkOTBhYWUyYTAxNmM3ZDkxYzBiZWVmOGM3ZjQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0RpY3Rpb25hcnlQcm9jZXNzb3JUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyNTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNTZiMjI3ZDRhZjgwMzI0YTQzYjIwNzg5YmU3ODliM2Q5ZTE0MjRkZmRkMmJmZGI3NDU1MWYzMDNlMDc4MjliIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL0V4Y2x1c2l2ZUl0ZW1zT3JWYWx1ZUNoZWNrZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQxNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjliODAxN2QxY2RjOTVlOGRmMWIxNGIwMTBhOGFjZTA4ODcwNThkNGI0MDg4OWU4ZTRhZTBlMjA4ZmZmODczYjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTGFiZWxPdmVycmlkZVByb3ZlbmFuY2VFZGdlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwODIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZGFkYzYyZmNiMTM4NTZjNTAwY2E3NWM5ZDQzYzlhMDA0NjdiMzc5NjE2Zjk2YWIxZTM2Zjg3NmIyNjJhYmVmYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9MaW1pdGVkQ2Fub25pY2FsUGF0Y2hUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDgyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzZDBiMjQ4MjMyZmE0Zjg5YzU3NzI2NGU1M2JmYjY2NzkxY2YzMDNkN2ZhZTE3ZGVkMzUzYzgyYTI0ZWU0MDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTGlzdENvbnRyb2xGb3Jtc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDQyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImUwMTdkNjAwOGI5OGRhMzYxMTkwOGNlNjY2ZjVmYzViYTlkMGNhNWVlMGUxMjE1M2NkMzI3NjMxMzhmZTk3YTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTGlzdEl0ZW1zVHlwZUNoZWNrZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhNGUxZDM3YmZlZTg2OTg2OTkzMTRjNTMwOTc1MDM3ZDViZTE3NTE0MzE5NTU1MDI0OTNiYmE2YjdlMDEwM2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTGlzdFByb2Nlc3NvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzMzMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmMGEzY2NhNTViOWY5OWM0ZjQyYmM1YTM0OGFlOWI0ZDFjMTlkZjgwOGRlNmY5MWFlMWNiYWZjYTJjODIyMTkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTGlzdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDI3ODYwYTBlNmNhYmRlZWQ2ZDc0NzI2ZTYzNGFmNzIzZTdiNzJhZjMzYTM1ODhiOWI4ODk0OGNiOWRkMTlkNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9NYXNrZWRSZXNvbHV0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMTc5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmZjZjQ4YjIzNjU1ZGNjMGU2MWU2ZWE4ZmM2YjI2NGVkNzQzM2M2MTQ0M2RlYWNhYzIzYTc5YmY0M2QxOTg1NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9NYXRlcmlhbGl6ZWRTZWxlY3RlZFByb2Nlc3NpbmdEb2N1bWVudEZhaWxGaXJzdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzkyMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYzNTliZTk4Y2FhN2YyNGU5NmU0MmUyOGY2ZDg0N2M4ODQzMjkzNTY1NzFkMmVjNjA0MDEzZjQ4YjNiZTY5MTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTWluaW1pemVkT3ZlcmxheUlubGluZVR5cGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA5OTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MjNiZWVhNDk1ZWMxYTI4Y2NkNzU1MGYzOTg1ODFkZTQ5ZmQ1OWU1MGFkZTZhZjhkOWE5MTRlYmI0MzNjYmM2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL01pbmltaXplZE92ZXJsYXlKc29uT2JqZWN0T3JkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDgyNTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMWFhM2M4ODk5NWU4OGRkMGNhZWYyNTQxNGY5ZTY5MjIyNjYzNTVlOWNmMjAyNDM3YmE3ZmJjYjhmOWIyYzllIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL01pbmltaXplZE92ZXJsYXlOZXN0ZWRUeXBlZE5vZGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA3MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNWM3OGY5N2M2Njk1NzEwOGMzYmYxMThiNzY2NjQxMjg1ZTZlYzM4YzY5NmMyNmYzOGVkOTM0NTg3MTcyNmEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL01pbmltaXplZE92ZXJsYXlQdXJlUmVmZXJlbmNlUHJvdmVuYW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOWJmYmMzMzNmY2MyNWQyOTFjNzc1NTc1ODM1Y2ZlNjM0ZDAyNmQzZTExNTJjZTE0NmYxYjBmMjFjZmE5Zjg3MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Ob2RlQ2xvbmVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQ5MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImI5NzQwMDljZmEzMjNmYzgzZTUzNzBiYTI3YmRlOWNjYTkzODk1ZDBjOGU3N2IyNGMxYjcyMTRiYzdmMWU0OTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvTm9kZURlc2VyaWFsaXplclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTc5MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2MjFjYmQwNzcxNDMyM2Q1NjE1MzVhNGRlMjllOGJkNWZhYWRhMjE5MDk4MjE4NzZkYWZlMGZiNmExMjQ3YzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvT3ZlcmxheUJ1aWxkZXJzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxODUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMThlZDEyNTQwOTk1NjdhNWY1Y2U4MTg1Zjc5NmY1ODgwY2E0NWE3Y2RhZWIyZTdlOGQ2MDA2NDJmMmJhYTdhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9QcmVwcm9jZXNzb3JUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwMDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0Y2Y4ZmEyYjFlNDNkM2YxYjQwZGZlMTMyMDAwNWEzOWM3YzE0MTU2NTU3ZmVlNTVkOTRhMzgyZjZlNjAwZWY5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Byb2Nlc3NpbmdEb2N1bWVudFN0YXRlSW52YXJpYW50RmFpbEZpcnN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTg5YWM5ZjMxMmE0MjM4ZDk1MTI3NDIwZTdjZTU0YTQ4M2MyZTgzNDU2N2ZjOTZhYTZlMmY4ZDVkYzU5OTcyZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Qcm9jZXNzaW5nU25hcHNob3RQcm92aWRlclByb3ZlbmFuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjg0NDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzQyNDk0ZjRlNWZhNjE2NTA0NzZjMmE5ZTg1ZmQ5NWY4ZDAzNDRkYjA1ZjI0YzhjMWJmYzY2NjA5OWVlNDhjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1JlY3Vyc2l2ZVR5cGVSZXNvbHV0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MDgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjZjZWM4YTRhZjljM2ExZTc4Yjk5OTI3NDI4N2ViZjg1MjhmOWFhZDBkNzQ3OGZlMzNjNGRhMTZhZjFkYTcyZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9SZWZlcmVuY2VCbHVlSWRSZXNvbHV0aW9uVmFsaWRhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjMyNywKICAgICAgICAgICAgICAic2hhMjU2IjogImNiYTBkZDg0YTgyYjA5ZGU4MTYzMDU1Zjc4MzdhMjE1MTI5OWY3NDA4MzgxNDMxYWY4ZGE5MWIyM2I2MjNjOGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVzb2x2ZWRJbnN0YW5jZVNjaGVtYVZhbGlkYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU4NTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0OTFlNjgxMjVlN2Y2MDkzZjBkZTRhYTU5ZmJkMDllY2Y2MDBiOWRjMDhiMmUwYWQyZThmZGFmNzU5ZTRhZGUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Jlc29sdmVkUHJvY2Vzc2luZ1NlbGVjdGlvbkNvcnJlY3RuZXNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMwMzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0N2MzOTBiNjY1NDNkYjNlNmE0NWJjZWY4MTQ3YmJjMWU1ZjE1YWI4ZjQ2YTQ0ZGVmODVmNGQxNTRmOTQwYjkxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Jlc29sdmVkU2NoZW1hVmFsaWRhdGlvbkxpZmVjeWNsZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMzc5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2NTE1OTY5M2IzNzk2MjIyMGEyYjEyMTJlMjEzNTk3ZmNkN2IzNTJlZWMwNzFmNTFmZjA2MjQ4OGViNTQzMDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUmVzb2x2ZWRTbmFwc2hvdFNlbGVjdGlvbkNhY2hlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ4ODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzZTQ0NWIxZjZjZjY5ODdjNWZkZDc1YmVjOWI0NGI3NmIxOTFjZGVhMThhYWU4MjMyNzYwYjZhZTEyMjQyM2I4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Jlc29sdmVkVHlwZUNhY2hlSGlzdG9yeVJlZ3Jlc3Npb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIyMywKICAgICAgICAgICAgICAic2hhMjU2IjogImZkY2U3MGIwZTc2MGM3MWUwYmIwZmFjZTBmNTU5MWY5N2Q3NWJkM2Q0MWI0YmQ2ZmE5OWVhMjk5NzNhYTEwNzIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvUm9vdFJlZmVyZW5jZVNuYXBzaG90VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0OTM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMGMyNTcwMjRmYzZiZTZkMWRlNTM1MjFkZmIxZTg3MTEwMDc3MzllNGYwZDBlZDVhNmVkY2UyODQ0ZTFkYTFiMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Sb290U2NoZW1hUGF5bG9hZEtpbmRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTMyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE3ZTcwZWFmMzMwZmViOGU0ZmRjN2UxZTBlMjk5ZGFjOThjZTk1ZGI3YjAwODQwNWRkOTk0NzU3M2UwNGMyOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU2NoZW1hVmVyaWZpZXJNaW5MZW5ndGhUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODk4MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImExZWM1M2U0YmU0YTU0ZmYxOGY5YmZlZDI4YmFkMzg2ZTM4ODcwMTVkYWQyZGI4ZTE4NWM5YzVjNzRjZTEzNDEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU2NoZW1hVmVyaWZpZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI5NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4NjlhNTNmMjgyNzZmNjNiNjFmYTQ5MTBmZTMzMGY4ZDY2NTQxOGJkNWU4NWIzZjkyYzE2ODkyNTc1M2I0ODZiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1NlbGVjdGVkUHJvY2Vzc2luZ1N0YXRlQ2FjaGVJc29sYXRpb25GYWlsRmlyc3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzAwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjllMmI4MDIwZGYzM2RhYWI3MTIzMjhjZTZmNzZkYjY5NzRiMjU0MDE3MjAwNDMxMmZkZjBkMmMxOTBlYjgxMWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU2VsZlJlZmVyZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTMxMSwKICAgICAgICAgICAgICAic2hhMjU2IjogImEyYzcyODgwYmNhOWJkYjAwZTNhZmVhZDZjNzZjMWM0ZGFmOTlkMzFiNGJiOWQ3MWZmZDM1ZTA2ODI0MTU2MDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU2VyaWFsaXphdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3OTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDQzYzhkNTBmNTAxMzkzNDc3NmMxZWI4ZDBkNjk1ZDJmZDBjNjY0MWVhYjE3MTlmYjQ1NmViYTYwOWY2NDFhZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9Tb3VyY2VEb2N1bWVudEJsdWVJZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMTAyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjczNmFmNTM1MjdhMmNlMWM5NjE0MDNiM2Q3ZjIxZTJmYTRmOTg1ZWEzMWJiZWQ3MTIyNjAzNDI4ZjY5OTY1NDUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU291cmNlU3R5bGVDb252ZW50aW9uc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDcxMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjZTNjYjZmNzgzNmI2MzgzYmQ1MzA2OTc2ZjNjODBiYTc1ODRiZTNhNGQxZTM2N2NjNjUyNWM1ZTZkM2JiZmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvU3ludGhldGljV29ya2Zsb3dQcm9jZXNzaW5nRml4dHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMzUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNTJjNGVlMGYyN2E5MWRhYWZmN2NlMWE3ZTRkNDkzY2I5YzJhMjg0M2U0YmViNGUzOWY4MjNmYzllMTM3ZjM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1Rlc3RVdGlscy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2N2IyMWMxY2U2MzQzNjZlNTZhZWY0NDRmMWNjZDZmZTc3YjQ0NmVlMWIzZjRhNDk3NTZkMGE1YzQzM2M2Y2M4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1RydXN0ZWRQcm92aWRlclJlc29sdXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAzMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1ZDkwM2ZkYTU3M2I1MDQ1NWUyZjAzYmNiMThhNWU4MjUxN2IyYjc5MzA0MjkzZDFlODM1ODNiZDU2OWE0M2MwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL1R5cGVBc3NpZ25lclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDY0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGQwMzZkOTk1MmQ1ZTcwYzZjZDA3MzJiM2I4MDI4NjFkMjY1OTVhZGFjODhiOTJkMGI2ZDcwYjYzMzFmOWY4YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9VbmNvbnN0cmFpbmVkRmllbGREZWNsYXJhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NjI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzBmODZhMDdlODE5ZjNiMWZkODlhMTQxNTVjMThiOWNiMTBiZDZiOTAwZDU0Yjk5NDBjMTNlZmNmZmUxNTI4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9WYWx1ZVByb3BhZ2F0b3JUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzI1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyMmVjOTY4NmUyOGVmNmYxN2I4OGViZWExODZiMTRlNWFhMTQ1NzAxNmE4ZjhmNzFjMzdhMGEyODAzNzg1MmQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvVmVyaWZpZWRSZWZlcmVuY2VNYXRlcmlhbGl6YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODI4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFiYmI3OWIzMjU4ZTIxODYxMDZmNTI5NzljNTExOWI0MmVhZWExZTM3ODg2ZTZiN2RhNmM5YzNlM2IzZTE0MTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlL0xhbmd1YWdlQ29yZUFyY2hpdGVjdHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTYwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM0ZjAyNWYyNmYwZDA5ZWI3ZmZmNjRlZGRjMjI0ZGU2ZjM2MDQxZTg5MWRiNWYwOWIyY2JiNGRkZjkyYTdhNmIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlL1BoYXNlRm91ck1vZHVsZU93bmVyc2hpcEFyY2hpdGVjdHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NDY0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZhZmJkNTNhMzViYWJlZDNjOWMyNTgwYzE5ODRmNTQ2NTc0ZGVjYTcyNjcwMzE4MDhiMDgwZDRhNzAwMTAwYTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29kZWMvU3RhbmRhcmRCbHVlQ29kZWNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjA1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBjMzgxNWM5NDA5ZTViNzM1YThhOGI0ZTZhZDFiNDJkZDQ2M2VmMGVkNjg3NjA4MmEwM2ZkZGQ1OWRiYjYxYzgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvQXBpTWlncmF0aW9uTGVkZ2VyVmVyaWZpZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzg3MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImYxMTg1NDFmMjM3Njg4MjZjZjM0YzdjMWRhMzY2ODY4MmRkOWExNDBhMDAwYTRmYzc4OTRhOTg5MThjNzYzNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvQXBpTWlncmF0aW9uTGVkZ2VyVmVyaWZpZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA1MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYmUyZWY4Yjk2OTZlMzQ1NTcwNDkwNzBiYjA4MzY4N2ZiNjU5NjNlYjgyNWQzZjBiMTE0YThhMGVkYzkxMzUzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlRW5naW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyMTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjc0OTZlZDA3ODU5Nzk4OWJkNzA4YTY1ZDBhMDI3MWNhODdiYzAzMjRmY2E3YTVhZTM0YmU5YjNmOWI1YzhmZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9TZW1hbnRpY0Jhc2VsaW5lQ2FwdHVyZUNsaS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NzdmYzcwM2Q3ZTQyNDMxNmM3YjhlMDA3MGU3Y2I5YWJlYmQzYjUyZDkxM2FjMzMxZDZlN2FlNjRmM2ZkNTZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL1NlbWFudGljQmFzZWxpbmVTdXBwb3J0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI3NDAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMDYxY2E0YjE0NDdiMDQwNDBiYzY3M2U2MmZlYjc4MDJlZDE4Zjk5YTkwOGVmNDdmYzQwOGZkNmFhYzVhNDNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL1NlbWFudGljQmFzZWxpbmVTdXBwb3J0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE4NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYTdhOTg2NmIyYjYyOTk2ZTgyOTdiYTlmMmNhNTZhMGE0OWNlYTczNmZhZDgxOTRmNGQwYmRhZTRiNjUyMzAwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL1NlbWFudGljQmFzZWxpbmVWZXJpZmllckNsaS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3NzcxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDgwNmE3NGQzMDQ5NzYyNmZhNjZhZjczNTQxYTM3Yzc4MGYwZTE1NzkyYTAwZDAwMTJjZGU1YmY1ZTgzM2Q0YyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbmZvcm1hbmNlUmVwb3J0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIxNzgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTBiZDZhZjk3Mjc3ODNmMzY5YjljYTc1ZmY5NGE3Njc5MjMzOTg3NmIwMmEzNGUyOWNhMzQxZGY5YzA4MGViNiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9jb25mb3JtYW5jZS9hcGkvQmx1ZUNvbnRyYWN0c1BhY2thZ2VJbnRlZ3JpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjUxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjNjNmQ2ZGU0YjBkZmY4M2RlOWM3NzA2MDBjN2U4MmVkOTEwOTA4Njc2NzNiMWU2ZTAyMWY5NDc0MDM5NGZmZjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvYXBpL0JsdWVMYW5ndWFnZUNvbmZvcm1hbmNlRml4dHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDc5NywKICAgICAgICAgICAgICAic2hhMjU2IjogImVhNGMzNTZhNTQ2ODAxMGU2ZWEwZDlkNTA3YjFjOGJhNDM4YjljZmE1MThlMjdmMGEwYThkZmQ1NTMxODkwY2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0JsdWVDb250cmFjdHNDb25mb3JtYW5jZUZpeHR1cmVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2MTgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNmZhMzg4ZDRiOWNlZDE2OTZkZTY4ZTJkYjIwZWI2YjQ0ZDdlNTUzYjhjMWRmYjQ3ZTdmZTZjN2RjMDBmNmI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9CbHVlQ29udHJhY3RzQ29uZm9ybWFuY2VSZXBvcnRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjExNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMDhmOTRjYTBlOGExZGI5N2ZiMTNiYWRmMDdhMDZiZGExMzExMmE2NzAwOGQzMjkyNmY0MTdjMmViYjdiOGNhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2NvbmZvcm1hbmNlL2NvbnRyYWN0cy9Db250cmFjdHNBc3NlcnRpb25FdmFsdWF0b3JUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTIxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMyODQzNzJlNmQ1MTIzMzZiZjQ1YTU0ZWU2YTdlYjgyMTkxMDE0ZTNlMGU3NDgxMWM4NGE4OThmNDA5MTVkN2EiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvY29uZm9ybWFuY2UvY29udHJhY3RzL0NvbnRyYWN0c0ZpeHR1cmVIYXJuZXNzQ29udHJvbFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODEwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVjMjFmN2RiNDBkN2JiZmM1ZjdmNjA3YTM5YmQ3ODI4YmQ1M2JhYzRhNzJjMDk0NzZlNDc5NzA5MjZjNTE3OGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvZG9jcy9MYW5ndWFnZURvY3VtZW50YXRpb25FeGFtcGxlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTE2OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4NDk0YjExZjM3Njc5MGZlY2NjMzdlZTM3OGVkMWZlZDFiOWVlYjAyMjgyMGNjZWMwZDZhMWJhOWVlNGE5NjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvZ3JhcGgvTm9kZUV4cGFuZGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDE1ZmZmYzdjMzExMmY5OTJmNzdhOWFlNGQxZjBhM2MzNzJjMjUyMTFhNGJhODBmODJhNWMzYjc3NTIzOTE4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9ncmFwaC9TdGFuZGFyZEJsdWVHcmFwaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjcyNjlmZGM5ZGIwZjQzZjYyNmVkOGQ1ZGI5ZmMwMzEyYWQ5Y2FjNWU3OTY0YmMzNzY3OGIzN2RiZmY0OTEyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CYXNlNThTaGEyNTZQcm92aWRlck1hcHBlckN1c3RvbWl6YXRpb25Qcm9iZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZTQwN2Q5N2VlZWQ0NDIwNTNmODcyNWI1YjZiNjEyMTk4YWNjMGM2NDQ5ODUwMjU0MmRlYWQyMmQ3NjEzN2VkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0Jhc2U1OFNoYTI1NlByb3ZpZGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3ODE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNzAxYTNmOWYxZDI1MWRjNTc1NTA4ODM5NGM5M2Q4ZTYxNDU3MTQyZTM3N2JkYWIwODdmZWZjN2E2ODA0YzA4NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9pZGVudGl0eS9CYXNlNThUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzg0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2N2M3MWYwNDczOGIxODczNDkxMThjMTNiNjdmZDEzMDcwMjJkZjBmMTU5ZDcyODY0NWYyYmZjNTBmYWU3OWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvQmx1ZUlkZW50aXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5NTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzOTllNDQ1MjIwNjQ1NTQ2MzU0ZmVmYzdkZTBhMGYxNWRjZDIyMjcwNWNjMGEyNDE5Y2U0MzA1NmZlZTk2OTM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL2lkZW50aXR5L0JsdWVJZHNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzY3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBiZjRlM2MzMDE4N2JkYjgyNzkyZWJjNmQ3ZTk0YTY1NTUzOWRiMTliNWNhOTBjMjIwODBiNTgyYjYxOGFkNjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvRGlyZWN0Qmx1ZUlkQ2FsY3VsYXRvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTYwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdjMGJiMzY1OWVkZjg2ZDQxN2M4MjU2OTQyY2RkODU1MmZhZTVhMzZlZjA0ZGY3MjNmZWVhYzdkZTgwNjI0OTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvTGlzdEJsdWVJZEZvbGRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTE4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ0YzVlNTkxY2VkMTBkZmJiZWJjYTIyZDcwZTk2YjIyOTFhMDY1NTM0MTY5YjU0Y2UxNWJmZjMwMmZlMDEzNDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvaWRlbnRpdHkvU2NoZW1hRW51bUNhbm9uaWNhbGl6ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODA1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImNiZDhkOThjODAwYjBhYThhMGMyYTdlZTE1OWUxYzVlY2VkZWFjYzg0ZDUwZTNmN2JiZTYyZjIzNDFiYzdmNDIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9CbHVlQW5ub3RhdGlvbnNTZXJpYWxpemVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU1MjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZGE1YjJhNzUzOWIyM2Q3NTBmMTNkZmYxZTllNmE1YjVjMjU5MzY3ZTJkMGNjNzJiZWI5MGNlODg3ZTBkZDlkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvQmx1ZU1hcHBlcklzb2xhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MDUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWIwNjJjNzkzYmI0ZjQxZDNkMDEwNmY5MDdlZmUwNmMyZjBjMGU0NjgxODEyMzgyZTUwNGMwYTllZjU0ODgyZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL0pzb25Qcm9wZXJ0eU1hcHBpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODQzMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE0MjAzZTM1MTU1ZDk5ZjhiM2Q1ODhjZWVjYmVkMzVlZjY5MWQ5OTZjNGUyYjZmNjA3ODU3ODYzZGQ0MTE5OGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Ob2RlVG9PYmplY3RDb252ZXJ0ZXJOdWxsSGFuZGxpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI0NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjM1N2MzNjU4MjM2ZjE1YzYyOWI2ZDA3MzE4MjEzOTdiYmQ0Y2E5YjIzMDVmODc1NDQ4ZDljNjJmZjExY2ZmMjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9Ob2RlVG9PYmplY3RDb252ZXJ0ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcxNzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2ZWIzZWFmMjBmYjhkODA1NGJjODgwNmQ0ZjI2NjEyMjQzMTEyZGNhZGNiZTBjNDlkMzJlODNmOWM4ZDllMTYwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvVHlwZUNsYXNzUmVzb2x2ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTExNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjBmMTJmMDc3YzVjZTZhYTczZWFmNGYzMjZhYWJjMWY1YmNhYzAzZGZlYjY0OGRlYjQ4OTdlZGNmNDZmYTNkZDMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9Eb2N0b3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5NTg0YzhkNzhlYzZiYzFkOTQ4ZDJkMTdkN2VmNDU5ZmQ3NGNiYmMxNzIwN2Q1YzVjYmRkNjE3YmZhZGI0N2E4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvTnVyc2UuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkYmEyYzUxODY4NmNlNTEzNGRiMzcyZDFiOTdmYjJiYmMwOTMzZmVkYmFiZGI5YzRmOTFlZjA5ZjQ4NjcxY2EyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvUGVyc29uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTEwMDdmYzEzNzY2MDIyMTk3MzAzNDM0YThjM2JkMDNiOGYzZDMxYWQ3NDNiOGRkYzQxM2FhODA5MDg5MGYyOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1BlcnNvbkRpY3Rpb25hcnlFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTEwMDVmMmMxMWQxNDkxZDlmNDljODNjNjJkMzZiYWUzNmIxYjVhNWQ4Nzg4YWZlNmQxZmQzYmFkMDI4NGYwZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1BlcnNvbkxpc3RFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODVjM2RjMzhiYTQ2NjRhNDUwNDBmYjQ4MGE3YmQxYjMwZGJhNzhjNDk1Mzg1YWI3YTZhZWFlNjU3ZDg0OWZmNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1BlcnNvbk9iamVjdEV4YW1wbGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZmM4ZTc4Y2IwMjExM2U5YTczOTJiNzY1NDZiYzU3OWQzYjc0MWNkODAwZjhjZTg3N2FkZjJhMjQzODY5ZGQxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvUGVyc29uVmFsdWVFeGFtcGxlLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQ5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmEzNzYwYjk2ZjVhZmY2ZGE2ZmI1MDY1MzA3MjQ1OTk2NTlmNTI4MDBlMjI3YWNjNDI0YzBlNGZkODUwY2NhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1guamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZjZjYWZlYzE2M2VlMDc3MGZiOWRkYjdlNDZkYTNjMTJkZDc0MGI0MThhYjlmNzQ0NDgxNTMyMzEyYzI3OGI4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWDEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkMWU3OTdlNGYxMGVhZjhlNTBiMzViYmRmMDlhMjE3N2I4MTJkNTkzNTc0ZjRkYTI4MDg4NGM1MWFkNzBlZWQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWDExLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTllMTQ4NWZmNjg4MmQ3NjI3OTQyZWJkMjU0ZDEwMzQzODZjMjk0NjE5MjZhMWVhMGZkZmQzOWEzYTNjMGJkZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1gxMi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI3MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU4N2ZmNTEwZDkzNzdjOTFmOTllMjI2MjNkZDk5NTAxYTAxYTg5ZmUyZDI5NjIyZjJhMDJlMzc0OWQyNjFiYTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9YMi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY1M2Q5Y2M5MDE0M2Q2MDBlMGFkNTlhN2JiNjc2YTYyZWExYjRhYjcxMjBkMjlhMTNhYjIwMDk3MjMyYmI5MmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9YMy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzZTIzMWYzNmZkODY4OGZkYTVjMWY4MzczZDMyODk5OTIxNDExOTc3NTU5ZDBjMDZkNjViYjQzNjk4MWM0MGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9YU3Vic2NyaXB0aW9uLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzQ3ODM4YWRhOWM1ZTdkYThkOTU4ZmRiYTdlY2Q2MzkzMDA2NjAwNmRiOTA5ZjBjYTZiOTNhNDE2YjFjY2I0ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL21vZGVsL1kuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzMzk1YWRhZThjZWE4NTc3NDc4MDA0ZDYzOWRiYTJmYTUwODg0NWY2MDRiMzYxZjZmMjFjYjE1MjVlYzA2YWFiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWTEuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNDEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzODM5NDdlMThiMWJiYjMxYTdmNGM0MzkyOTBjY2Q3Mjc3NWUyMGNjZWViNmFjNGJmZDg4NWY4Mzk1OTQ3NDBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hcHBpbmcvbW9kZWwvWi5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIwYmE4ZmFkZDM3MzRiZGEzMzM2Mzk5YjU0YTBhNzAzZGZhYzZlZDUwMDI1MzQ3ZGM2Zjk0NTJjMWYwOTQ1NGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9aMS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0YWIyMTA2YzhmOTg4ZmIwYzI2NDliMDRmYWZkODE3OWI4M2NiODJjOTIwY2EyZWY0ZTBmMmUzMmI2NDdjNjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWFwcGluZy9tb2RlbC9aQ29udGFpbmVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjMxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTM0MjJhMTgzZTcxOTA2NTZjYzlhZTJlMjA0NWVjZGNkMTg3NzA3YmQzYmQxM2UzMjQ3MDJmZGQ3NDZkNTU1ZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXBwaW5nL3Byb3ZpZGVyL0NsYXNzcGF0aEJhc2VkTm9kZVByb3ZpZGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzNjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjZDFiOWZhOWQwMDM1Y2ZkZDc4YTQwODdkZjA4NThiMzdiYjU1MWU3MThhYTQ2NDY4Mzc2MDQwZjI2ZGI2NjkwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21hdGNoaW5nL0Zyb3plblNjaGVtYU1hdGNoZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTcwNiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVhMDRiNzY4MWM4ZWZkMzE1MzZjZGMyYjc4ZjRlMDA3YTEzZjMwMzZjNGRmZTYxMGZlYWJmMTUyMzNlZTBjOTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbWF0Y2hpbmcvRnJvemVuVHlwZU1hdGNoZXJDYWNoZVBvbGljeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDA2MWFlNmYwYzFlOWQ2N2Y1ODc0OWRiNjNhMTdmNWZkMTExYzdiYTY0YTc0Mjc1MmFmYjBkNTEzZWE1MGJhMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9NYXRjaGluZ1J1bnRpbWVCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDUwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmNhZmEwZWE5M2I5M2Y2ZTg0MGI5YTIzYzNlZjE5N2QzZTE5N2VlZDdjZjMxOGI5MzVlZTgxNTBmMzY3ZWYzYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tYXRjaGluZy9Ob2RlVHlwZU1hdGNoZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNzc1OTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYTkzYWRjMWZiYTBhMDU4NjE3OTExMWZjYmU3Yzc0MGM0NGM1MjE3MWNlYjljNjM3MGNkYTgwZmYxMWYxYzcxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL01lcmdlckludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyMDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjOTJhMmMxOWIwMDVkMGI1MWI0NjRhZTkwNDNiNTJmMDgzMThiMTZlYjY3ZWJmNTI3OGRhM2M0OWMzOTEzNzg5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL01lcmdlclJlc29sdXRpb25TZXNzaW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYwNTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNjU3MDJkNzg1M2E5YTYzYjY1MDg2OGExMTI2Y2UyZTlhOTcyYzg5M2QwZWFmZmU3NWE1N2RkYmQ4ZDA1YTU4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL05vZGVTcGVjaWFsaXplclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTkzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjA0Njk4NWMxYjE4NmNjOTdkMzhhYjFkYWFhYmQxYTI1MDc4MjYxYWE4MjgyZDZjZGQxMTM0NWQ1YmM3MDJhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tZXJnZS9SZXNvbHZlZFJlZmVyZW5jZUNhY2hlQ29udHJhY3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjA5OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYWQ1NTg0YmY0YTM1ZWQxYmY1MmExMDk2MjY5ZGY1NjAyYzU5OTM5OTBiZTg5ZmI2ZGZmYzVkZDE1NGFhMjg2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL1Jlc29sdmVkU25hcHNob3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzcwMzQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNjU3NDBjNzY3ZGI2ZjFkMzExZTAzMzQ3YzUzYjg5MjllYzM4YzVlYTY0ZDRmZDFiNjIzMjhkNjc1NGJiOGE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21lcmdlL3Byb2Nlc3Nvci9MZWFzdENvbW1vbk11bHRpcGxlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEzOTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NTNhZWY0ZTMxNDQ0MmUyN2VkZDkyYjFkNjQyNDQzYWU3ZjZlNDlhYzc3OTZiMDQ0M2Y5ZDdjY2Q4NmNhMTBmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL01vZGVsRGVwZW5kZW5jeUJvdW5kYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIzNjMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0MjdiMjViMTA0MTZlNWUxYjQyZDU2YWU1NjQ3MDVlMDhjZDZkODJiNWY4MjNlYzg0YjUyYWJhZjRkMTM4OThiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL21vZGVsL01vZGVsV2lyZUNvbXBhdGliaWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTk5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY4OWNkNDY1Y2JlYjE4NzcyNzkzZTBjNmE1ODI3ZWM4ZWFkMmIxZDc1ZDRkMzczOThmOTFhZTljZDEzM2MyMTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZUlkZW50aXR5UHJvdmlkZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjFjMmNmMDBiMjlmMjRjMmI3N2NiYjM4NWE5YTk4ZGUzMTcxNTM0ZWRkMjQxODFhZDVmY2RjN2I4ZDAyOTIzNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZVBhdGhUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODY3OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM5YTM4YWM3YzA3NTEyZGZjNWI1Yzk4ZTQzNGU3M2ZhMzAwYmI3Zjg5ZThiMmE0NWVhNDZiNzI1ZTI2MjkwNWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvbW9kZWwvTm9kZVdpcmVGb3JtVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NjIwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTliYWM2MzA0ZTIwNjk4ZmMxMGFiM2Y2M2Q3YjA2OGU1YzBlMjRmZmMyMWY0MjExNWIwZmUxODQzNTQ4ODZiOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9tb2RlbC93aXJlL1BhcnNlZEpzb25Qb2ludGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxMTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNzYwZGMzZTllMTdiMTllNDI4NjFkZDUwNjRmZWI0NzUxYTA2YmRlYWVkMWU1NjM2YjczNzc5NDljM2E1OTk1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvUHJlcHJvY2Vzc2luZ0V4ZWN1dGlvbk9yZGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ1MTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZDUyMjlhYWJmNTJlYjVmMDNjYmQ3ZWRjMTFhZDg2YmVlMjllNTRjZjg1NGU4M2U3MzZkOGUwMWRjNGY5Njk3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3ByZXByb2Nlc3MvU3RhbmRhcmRCbHVlUHJlcHJvY2Vzc2luZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNmUzOTAyOWY5NmU2N2QzZTRlZDk1MDgzYmM0OTJiNmE1OWNkM2E3OGY0YmJkNzQ4NmJjN2NkMmY3MzA1MzBhYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQWN0aXZlU2NvcGVDdXRPZmZCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTc5M2U1MjEwYjM5OWYzYjRiNmM1MWM2MWM3MmI0YzU5MjhkOTRmZTYyMGViNTA0ZmY4Njc3MmZmOGNhMDIxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbENoZWNrcG9pbnRDb250ZXh0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0NTQxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNWE0NGEwNDEyZDAyNTY2ODMxNjFhYjZmNjU2MDk1YTg4MmY4MGRkZGNlZTMzNTE3N2I0NDJiOWNhZDFkMWIwYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbENoZWNrcG9pbnRTdWJqZWN0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNTc2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTYwNGFiYTVhMGY0MDVhNjI1OGY3NmY5MjZjY2ZhOTE4OWRkNjdhODMwMWRlNGMzN2E5YTU3N2VmNWU3MGNmYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbEV2YWx1YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU4NCwKICAgICAgICAgICAgICAic2hhMjU2IjogImJmMWQ1ZTc2MmE5NWM3ZjFkNmZjODU4MTVhMTJjMDczYTFjNTVhYzc2NTNhYTVhMGZmYTk4YWJkMWY0MGFlZWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoYW5uZWxNZW1iZXJTbmFwc2hvdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTgxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzMxODg5Mzg5MDNhYmIyMzBkODZiYzBlMWRhYTcyYjA2MjlmYjBiMGQxMzQwMjhiNzQxNDE5NDZkOWY5YTkxMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ2hhbm5lbFJ1bm5lclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjE2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJmMjc2MWUwY2YyYjczZWI4YTcyNDg0YmZjNDQ3NGMwZDk2ZjM2ZjhkNDlkY2RlOTA0YTZkZDUzODJhOTJjNzkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoZWNrcG9pbnRJZGVudGl0eUNhbGN1bGF0b3JUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDM5MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4ODA1N2YxYjkxNGQ3NDIwMTRmMzY3NWQ0NzUyMzMyOWE1OTVmYWJkMDg2OWJiOTFmODExMjJmMzFjMDc0YWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NoZWNrcG9pbnRNYW5hZ2VyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMTAzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQzOGNkODEwNWMzNGMxODU2YWVjZWEzZTVlNmI5MWEyOTQxZWIwY2NjYTI3YTU2Y2NlZGVmZjM4ZjgyZjA2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RCdW5kbGVDYWNoZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2NTIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTU1MDE5NDgzMWVhMGZiODcyYjAzZTZiZGIyZDllZjQyNDI0OGUyZDYwMWNhOWU3OTBmZWM1ZGNhMWVjZjJkMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ29udHJhY3RDb250cmlidXRpb25SZXNvbHZlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTMzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjUyNTg2NTExMTcwNDYzNjdmZjgxMzRhZDVjZWFhOWE4YTY0MTMzNWE1YzE5ZDJkNTJkYzM1YmZkY2M0NmE4YjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0RGlzY292ZXJ5U2VydmljZXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTk0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ3YjQyODUyOTg2NTJiNmViZmM0NzAwZmMxMzUyZWI2ODJjMTVkNzM0YWJjM2JlZjliNzNiMjZhZmY1ZmE1ZmYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0RXhlY3V0aW9uUmVzdWx0UG9ydGFibGVMaW1pdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDEyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ1ODQyMGVjZTMyZTM2NmI5YzhjMGNhYmYxYmM5MDA0ZTFhOGQwOGI5NmYyNjhjMTkyYWM4NGMyNWRlZmFlMzEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0TWFwcGluZ0ludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDg1MTMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJkZjU4NzRlNGQwZjBmZWM5ZDk2NTRlNTNiYmM2OTRlMDQ5YzE2YmZmOGI3ZWM4ODc0OGZhYWFhNzU4NmQzODI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdFJlY29nbml0aW9uTWV0ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU2MDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyNDdkOGZhNjUzNTdiYzlkMGE0MTlmN2FmMjk1OTQxZjlhZjFjNGQxMWE4OTM0YzIxNzNiMTE4YTQzZWQ0NzRlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Db250cmFjdHMxMEtlcm5lbEludmFyaWFudFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTc3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg3OGE5OWI5ZWE5ZjEwZjFhZDA3MjZjN2NhYmFmZWU5MzU5OTNiYTgxY2I2NWYyNmY0ZDQ4NjM3MmI1NDI2NTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0NvbnRyYWN0c0tlcm5lbEFyY2hpdGVjdHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NzU4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTliMzc5Y2FhYzYxOWVjYWNiMGVjYjU3ODkyMWY0MzZkMmZmNjQxNjU1ZTkyNDM3MDg3YjcxMTk1NTVhODIzNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvQ3ljbGljUHJvY2Vzc2luZ0JvdW5kYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzMTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NzJhYTkzOWNjYjRmMGU4ZjVjZDRkMWVjMzZiNGFjZDQ3YzZhMzZlOTgwYWM5NTUzY2IxZjVlNDBmYTg3MzNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9EZWVwR3JhcGhQaHlzaWNhbExvY2FsaXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTU5MTM3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzJhYzQxNWZlMWVjMzdhMDZhY2Q0M2ZhNGRhOGI2N2ZmOTUzNjdmM2QyYThmZDgxMDdjZDZjNjE3ODU5MjBjNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRGVmZXJyZWRTbmFwc2hvdFByb3ZlbmFuY2VQcm9wYWdhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDc0ZTE1OTFmMTlhYWU1YjRjNWQ5MTc2ZDg3Y2JmZjc1NWM2YTViYzc5NzNhMjBlMGFmOTQwNzc1MzA5NDRiOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUmVzdWx0VGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDJiZjYzNWNhMjcwZWYzMDI2NjEzNTlkM2I1ZDU2ZjQ0ZjU0YzQ4NDI4NGQ1ZTk0OTA0NDRiZWE2ZTU3YjA1NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUnVudGltZUJhdGNoUGF0Y2hUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcyNjUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhMzBmODc3OGNlZjM4Mjc4YjEyOGEwMjk2NmIwZjg3NzE2YmFhYmE5MTg5NGY0ZmU0YmVhZGJmYjdmYzE3MzQyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NpbmdSdW50aW1lQ29tcG9zaXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjA2ZmQxM2MxNzBlYzhlZGExNjcxNzAyYzY0YTAwZDUxMjkyYjQxNWU2NWM1M2Y4OTljMDJmMjUyM2FmODlmNWYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc2luZ1J1bnRpbWVEZWZlcnJlZFB1YmxpY2F0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNzMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTMxZmY1OGM5ZDZkMzc2MzRmYTBhMjZiY2Y3NzcyOGVjMGFhNzdkMTk0YjU2MzJhZTUxZDJiNmRjNmY1ZDNlZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzaW5nUnVudGltZUpzb25QYXRjaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDczOSwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ2YjQwYWY1ODE0OTMxZTRkNGQxYjI4YWRjNzJhOGM2ZGMzNjQ4ZTBiN2QxMGQ1ZmRjMDIzNjhiMzk5YmUzZmUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc2luZ1J1bnRpbWVPd25lcnNoaXBUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTAzNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlNzhmMmE4ZDNhZWJlZGY5ODE2ZjY0N2M3YjUwYTk4YjkyNmQxMDk3NDVhZWM0MGJjMDg4NjI3YjFhNWQ5NTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc2luZ1J1bnRpbWVUZXN0QWNjZXNzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjJjNzQxYzljZjU3ODc5ZGEwNzE5Y2JhMTZkODY5MjEwMjU0MDMwMDgyMTg5MmM5NmY2YmQxMTk3MmRiZGY3MTEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yQmF0Y2hQYXRjaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzA2MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImViODg0YjFiNjQxZGNkZWZkMmE5MzdlOWY2YjlkMmUzYmVjZGRiYzU3Zjk0YWNkNzViYmNhMTQ3M2VlZDYzMzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yQm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjY5NDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlMDMyYzFlMTdiNTcyNjczMmQ5ZGU0YTdlMGQzMjY0MGNjZGE4ODIyYTYxNDIwMjc5MGJhMjQ1N2NlZjA5NjQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckNhcGFiaWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTEyMDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4OWRmYzA2ZDRkODEzYzY4Mjk3YjliYjkwZDU2ZWY3ODRmMDM2ZTdlNjBjZTJhNDA4NGI5ZGVhZmRkODEzYTRjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckNvbmZpZ3VyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAwMCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjY2NzQ2NTc2YzdhYzk0ZDhmMDk3NmNkODA3MWRhNjBmOTk0NTRlYjZmN2VmNjExY2ZhYTE5N2Y4YTFhNTg0YWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29yRGVmYXVsdFR5cGVSZXNvbHZlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMTk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZWFmMDUzMjdkMDBlMWE3MzE2YjMwZGVmZGI3MjhmZTg3NGJkNTVkNDMxMTU2NDk4MGExYmFlYzBmMTEwY2ZjMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JFdmVudEltbXV0YWJpbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjYxMmRlZDZlMjY2MTYxYWQ5NWJiYTA4YTIzNmFmZDY5NDUzNzhlOWM2ZGRlNDkwZTAwNTMyNTBjMTdlZWUyNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JHYXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUxOTAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNThlMzgxYTcyMjZjYjQzYmI5NmIwNDU3YmFlYzdhNzJlZjAzMTI5Y2Q1ZjZlZDg4NmQyMGE0NWQwNzFjNjYxIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvckdlbmVyYWxpemF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUzNTgzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdmM2FjZWIwYWIxNWJmZjA1MjllNTFjY2JhNzY1MDY0ZWFiNDc4MTY2NmE3ZmI2M2M0MzZjNDhjZjRmYWFkYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRQcm9jZXNzb3JIYW5kbGVyRmFpbHVyZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMTIzNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImIzNzgyZjNjZDQ0YjM0ZGExNTcwODhkZDBkMjc0NWIxZGM1ZjZmMzQ4MTkzMWI4NGQ5MzZlMjY5OTg1NmZiNjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50UHJvY2Vzc29ySW5pdGlhbGl6YXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTI4MzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxYjc1YTYzN2NlZWYwZjgzZTBiYTM5OWYxMDNjNjk5YzQ1NzYwNmRmZDI4MWM0MmQ1ODRjOWVkNDRkZWEzNjJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvclJlc29sdmVkU25hcHNob3RQYXJpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjcxNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NmM3YjY2NzMwNTUxYzE5ODA1NzliYzg1YmRkYzZiOTAwYmI4OTI5MmRlZDhkNWRiMWVjOTc3YWMxZmFiNjI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvclNuYXBzaG90VHJhbnNhY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDkyNjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwYTAyNzkxYjA2NzhkZTBjNTRjYjE3MGI0MzgzOTFjZjZhODA4Yzk3MzYzYjVjMjIwZTY4MmJhNzZhNzU4NDdiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvclRlcm1pbmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjYjIzMDI2OWMwOWZkOTMwZmFjMDhiZThkZjQ0NDM5MjA5OTc2MzFlOWY5YjI5MTk0YzYyMjBiNzhjMWM4NTdlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Eb2N1bWVudFByb2Nlc3NvclRlc3RGYWN0b3J5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI1OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjYwYmVkMTQxZjFiZTM3Yjg3OWI4ZjA2NGYzYjE0YWUyZTEyY2MxZTNkOWFkMDE1YjI1YTExMjQ3ZGQ0NmE5ZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50VXBkYXRlQ2hhbm5lbFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDU5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjU3NmY0YzIwMDY4M2ZjMGFkMzBiYjljM2U3MzUzNjg2MGUyMTE4MmI5NTA0NmQ1NjliNjZlMTVkZWFlZDAwZjkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0RvY3VtZW50VXBkYXRlT2NjdXJyZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzMjcwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzMwNDQ4OTU4MmU4ZTc2YzlmZTNhYjliOTkxYWZjMTNhNmVkNTNjYmI1NWNjZWJkOWU1MTJjODhjMjI1MmNiNSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRG9jdW1lbnRVcGRhdGVSb3V0ZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjEzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImQ4ZDZhNWI4NGI5NGNmNWM5YWMzMjE1YzM5ZjkyMWIxMGJlMDQ0OThmOTk1ZjhiYWY2MjYzNzY4YmQ5ZTg0MjAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VmZmVjdGl2ZUNvbnRyYWN0UmVmcmVzaEFuZFJlZmVyZW5jZVJlc3VsdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDA2NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0NDIwNzBjZjFlZGNhMmRlZWQ4MDczM2U5NjdiMjVjM2M3YTEyMDZkYzRiNjQ5YjI0ZmE3ZDhjZWM2NjdkNTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VmZmVjdGl2ZUZyYWdtZW50YXRpb25DYXRhbG9nVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxNzcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjg1NDA4ZDA2OTI4ZmFlODdmYmJhYTEyZmMzMWI1MmZjYTg2YWZmOTU0MzE1M2YzNjM2N2MxNDI4NTljODhkYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRWZmZWN0aXZlU3Vic2NyaXB0aW9uU3VyZmFjZVZhbGlkYXRvclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjIwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImFlYzVhYjUxMjlhNjlkZmNjNjgwNTZlM2JlMDhhZTE5NDExNGFjNjAwM2Q5N2I3ZGQzMzNlNTRmMmFjYTM1NDgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0VtYmVkZGVkQ29sbGVjdGlvbkxpZmVjeWNsZUludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMDQwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDNhYWY2YjNiMDA1OTIyNzJmYTlkNjdhNjVlMDk3ZDg4ZTA5Mzk0MGE1NGUxYmExMzdkMzNhYTU2MmZlNzMyMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRW1iZWRkZWRTdXJmYWNlUHJlZmxpZ2h0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk3NDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNThhMDQ0YTQxNDU3MTRhNjc4NmYxMzZiZmQzZjY5N2E1NWQxNzc4MTlhNTQwY2Q5ZjExMTYxMDVhMDhmN2FmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FdmlkZW5jZUNsYXNzaWZpY2F0aW9uVmlld1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTYwMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImMzZTY0NDRhODliNjVhMDIwMDI1Yjk1OWZkNDBjMDc1ZGJjODVlM2RhODBjOGUzMGRkZmE4ZjNmZTZlNGY2YTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4ZWN1dGFibGVCb2R5RmllbGRNZXRhZGF0YVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NzEwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjg0NTljMmJjM2IwZGM5NzkwMzRkYmMwZTc3YmJkNWY2YzJhM2M1YWRjNTNmZjU4YzFiYWM3YTQwYWYzMWIxMTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4ZWN1dGFibGVCb2R5UGF0aENhdGFsb2dTdHJpY3RMb2NhbGl0eVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MzU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTgyYWNkZTM3OWExOWFiYmY2YTcxYTY3YWY2MTcwODBmNzQwYzYyNDc4OTI0OGUzNjA5MzM4ZjMxNThiZjkzMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvRXh0ZXJuYWxDaGFubmVsQ2F0YWxvZ0NvbnRleHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU5NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwN2IyYTQwMmU5NmYzMzJjYzViOTU4NmExYjRkNTM4YTY0ZDdhYjUyNWFkNzJiNGI3NjljZGU1NDY0NGFhMGE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxEZXBlbmRlbmN5Q29udGV4dFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3NDQ0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImE2N2E5OTE1MThkYmMxNWI3YmYwYTNiN2NkMDY3NWFjNWE2YzNlYWVlNWM3NDI3N2Y1OWNiZWNkNWRkZGJlNGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0V4dGVybmFsQ2hhbm5lbERlcGVuZGVuY3lTbmFwc2hvdFZhbHVlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4NDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWZmYjlhODE2MGJmMGM1MTlhNjFiMWYxNzFhNzVhODg3NjQ4ZDAxNzI1NTZlNGQwYmU0ZDYyYWM4MjYyODA3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxIb3N0ZWRPdXRwdXRBZG1pc3Npb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTMxNzcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMWM3OWUxNzIyMGVmMjMxNzI4ODAwMmQzZjNjNzQxNTk5NGY4NmJkMzRhMWVlMzA1YTEwYjcyMmY1NWM3YThjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbENoYW5uZWxQYXR0ZXJuTWF0Y2hpbmdUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjM4MjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwZDc0ZDlhMmIyYzE1YThlNDM5ZDM4YjllNmZiY2ExMGEyNzM2OWY2OTFmNWY3ODE2ZjFlNjQ3MzFkNjU3ZWQ3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9FeHRlcm5hbERlbGl2ZXJ5UGxhblRydXN0Qm91bmRhcnlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQzMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhNzQxM2ZmY2I0YjYyMjEyZDdjYmE2NzBhM2E3ZDg5OTNmNzQ1NmVkOGZmOTE1MDE3NjVhYTRiNzE2NzU2NzcwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9GYWlsdXJlQ2FwdHVyZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyOTEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZmZlNjM0ZTVkOTYwZDlmYmNhZGJjNzZlZTczM2ZmODE4NDAwYTE0YTQwYzY3NzE5NzRkOGJmYmFjY2I0ZDEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9GcmFnbWVudGVkUHJvY2Vzc2luZ0ZhaWx1cmVNYXRyaXhUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQyODYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhOWYzZTRlMDA5ZWYwOWM4NTgyZmMzNzA2Y2UxMjYwMjNkZDkyMjhkYWU0NGEwNDNkMjM5Njc2OGIwMDJiZjE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9GcmFnbWVudGVkUHJvY2Vzc2luZ0xvY2FsaXR5SW50ZWdyYXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjQxNjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3ZTk5NjdkN2Q0ODI5YTIyMzczZDlmYWFhMDU0Yjc5MDJjODM0MDJjMjYxMjQyMGFkMmFiNDBhNjFmZDdiYzhmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Gcm96ZW5Kc29uUGF0Y2hBcGlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjU5ODUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNDYyZDhmYTkzM2E1NTY1NjMwZmE4NTI3MWQ2NTYyN2MyNzJhODI2ODM1OTcwMmRkMjQ2M2UwMDI0MzJlNDE0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9HYXNSZWFjdGlvbkJvdW5kYXJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMyODMzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTBlNWEwNWRkMmJiNzlkYjc1YTQzYzlkMGI0YWM4ZTQ3NjY3ZjQxMDg3OGFmNDFmODMwZDY4ZDI4MDUyNGM1NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvR2FzU2NoZWR1bGVUZXN0Rml4dHVyZXMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTk5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzM2Y2IyZGU2M2NhZTkyNjk5Zjg0MWMwMWYxYjMzMTE4OGJlN2UwNDM3ZWVlNGU2MGNkMWRlYzg2NWRhMWNlZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSGFuZGxlck1hdGNoQ29udGV4dERlY2xhcmVkVHlwZUxpbmVhZ2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTU1MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MTUwZTc1MDJkYTZjNmI4YzcyYzFmYTBhOWUxYjNkMzM1ZDczZDM0NzkyNjAyYWJjNDNiNzVkYjc0NmY3MmQ0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9IYW5kbGVyTWF0Y2hDb250ZXh0RXhhY3RSZWZlcmVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDg1MiwKICAgICAgICAgICAgICAic2hhMjU2IjogImM3MmQ5OWYwNWEwODA0YjM4OTUxNDlhMWU1NDJjNjNkZmRlZmU5NjVjY2JjZTJiNGIzZTk0MDAwMDJlYjM2OTgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL0ltbXV0YWJsZUpzb25QYXRjaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1OTg1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODNhZWM1MTMyYzI3MGNiZWYyZWMwOWYyNzU2ODVmNTljMDNlNGQwOTExYWE3ZjFlNDM1NmJhM2QyNWMyZTYxZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW1tdXRhYmxlUGF0Y2hQbGFubmVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNjc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTlhNGNlZDViZGJlNmJjMjI2Nzg4ZTM4ZDdmMTQyNjdlMDM1M2VkZTg1NmVhY2ZhMDJlNzQzNmFkMzk4YmUxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW5kZXhlZERlbGl2ZXJ5RXZhbHVhdG9yVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2MDgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2NhMjE0Y2MzMDVjMTViOWI2NmU4Yjc1NGIzNmQzYTc5YzQ5MjBmNDViNTIzYjI5YWZlNTI0MzAzNGY2YzI5OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvSW50ZXJuYWxFdmVudE9jY3VycmVuY2VGaWZvVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwMjI1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTdjYzdjNjUwMjZjMmJmOGU0OTc3MTA2M2IwNzUzMDdmZjJhODQ1Yzk1Mjg5ZjdhOTkwZjc3ZGUxZmI5ZmYxMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTGFuZ3VhZ2VSdW50aW1lQWNjZXNzQ29udHJhY3RJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTMyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjc5M2E4OTI2YjJlOWJiZjkzOWQxYWY1YzE2NjhhZjA1ODgyYWRhZmViZTIzOGUxM2M2ZTczZjc1YzU3NWM1YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvTG9naWNhbERlbGl2ZXJ5Um91dGluZ1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTI0MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjRhN2RhZTU0OTlmNTNjODU5NDYyMmI1NWY1Mjg2ZjI4YjcxNDM2ZDBlOGE2YmQ1MWFkYmU2ODFhNTg3MDAxZGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoSW1wYWN0SW5jcmVtZW50YWxSZXNvbHV0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM5ODk3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTVkY2RjYjY0NDJhZDU2ZDliODUzNTM1NzM4YzA5ODM2Yzk3OTIzNTZjODRmZDljZWFhMGU0NzQ2NzFhNzVhYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUGF0Y2hQbGFubmluZ0VuZ2luZUNvbGxlY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjE0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3YTg0NGNhMzM4Y2IwZGRjMGU5ODg0MWYwZTlmODY5OTdmY2FjY2YwMmQ1ZjNlMzE2ZTMyYmJlMGU3NzNhOTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1BhdGNoU2VxdWVuY2VSYW5kb21pemVkRGlmZmVyZW50aWFsVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkzNjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NjBiM2FhYmU1ZWJiYWQzMjQ4ZmViZWM0ZGI1MjQwNWQyZGQ0ZTZiZTkzYjIzZWM4ZWU5MzY1MTEyNTEwMzU2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QYXRjaFNlcXVlbmNlUmV0ZW50aW9uU3RyZXNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ5NTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOWE2ZDA4NWM3Yzk1MTExNTI3ZGU3YjBhMGY4YTZlOTY3NDJkYWZhMzgwNzY1N2Q1YzQ1YTc0YzIxNGY2OGI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QZXJzaXN0ZW50TXV0YXRpb25Qb3J0YWJsZUxpbWl0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE1OTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMmQ1NmFkOWM3YzY3YmQ0NjYyM2IxZmQ1NDNkNjA1NzVkOThiMjFiZmU1NDc5NGUzNzUzODk5ZTc4MDI5NmVjIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9QbGF0Zm9ybUNvbW1pdENvbXBhbmlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1ODkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDFmYzIwOGJmYjkyNGVjOTdjMmE0NjNlOGJiODU1NmQ3NjZmMjBhMzhmNmUyMDFlYjZkMWQ3MDc3NWVkMTI4ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUG9ydGFibGVMaW1pdEdhc1ByZWNlZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU0NiwKICAgICAgICAgICAgICAic2hhMjU2IjogImRmZDJkZjVlZWJhNDA0ZTgxZGFiN2RiMzMyMThmNjQ1NjNmYjU0MWI3YTk1ZDQxMTUwOWZhYzUzZDliNDJlMGUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Bvc3RBZG1pc3Npb25QaGFzZUV4ZWN1dGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMjY3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjM3NWI3NjJmMzQyODliMDY5MWRiYWY0Njk1NmNiMjFmNDQyZDdmYTRlNjI0OTEwZjM0MThlOTUyYTBhZTY0YWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1ByZXBhcmVkUGF0Y2hTZXF1ZW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzM2OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdjMDA5MGY1YThhZTcxYzc0MGJhYmVjNzY0OGVlM2I0ZmU1ODg4OWUyYTFiYzBjNDJmNzdlZTJhMjY3Njk5OTQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NFbWJlZGRlZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTk0MSwKICAgICAgICAgICAgICAic2hhMjU2IjogImYyZThlODU1MjA5ZTU2YWNiY2RiZmYzMThjZTNkYmY0OWVkODQ4MWZjNmMxMmZkODljNzFlMTNjNmE5ODMyYjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdJbnB1dEFkbWlzc2lvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDA1MCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjhlZDVmMTNhMjRmZjBhYjk1ZWMwMDRkOTBiNjVhNzYwNjM0ZjU5NGFlZDc0MTNiZTg3ODVlZmNkYjYzZDkxNjEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NpbmdNZXRyaWNSZWZlcmVuY2VDbGkuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI3OTNhYjA4NGYyMzA5MTIyYjRjZmExNWFlMDIxOWVhNGRkYjI0ZWI1ZDk5YTAyNTY1NTZkOGQ5OTcwYmM1OTJhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nTWV0cmljUmVmZXJlbmNlRG9jdW1lbnRhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDg3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNGI3OGZiMGU3MTliYzM5NTgzMjA0OWVhYThlYTFmODM0NDMwMDZmNzk3Yzk5MzAzN2M5MmE2ZmMwNDk1NWUzNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ09ic2VydmVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkwOTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjMTA5ZmI1ZjJiMzNjMTAwYmQwZmUwOTgxOWVkMDg4Yjc5M2I0YjcwM2Q5NjMxNTE3ZmM5ZjMxNzVlM2E4NGI2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzaW5nUGhhc2VQaXBlbGluZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzE2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWQwYjJkOTQ5ZDljZTI2ZWU4ZTVhZGVkOTM1NTE2MDRkNWE1OGUwMjFlMTVlMmEwOWUzNjc0ODA3M2UzZGVhNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1NuYXBzaG90Qm9vdHN0cmFwVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjhmZGU0Y2MwYzRiODlhZmQ0NmUwNjU1MTUzMzJjYTVhYmZlZDlmNWQ4OTlhZmJmZWRhYWU5MzNiMGRkMzIxOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1NuYXBzaG90TWFuYWdlclByZXNlcnZhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTRjZjVjMTEyYWMwZmYxYzQ0NTRiM2IxODQ1NGE3M2JmMTE4NmU1M2ExOTQ5NGYzZTc5ZDJjMGQ2M2QwYmUyNyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc2luZ1NuYXBzaG90UHJvdmlkZXJQYXRjaFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MDkyMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjBlNTE2ZmRiYWU1MmJjNjIyZmUxMzI5N2M4NWFiZDFiZjJkYjk4YWYxYjcwZDM5ZmYyN2NkNjc2Mjc2YzBkZWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvckV4ZWN1dGlvbkNvbnRleHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTgxNjYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwNzE1NmYxZDViODU4YThhYmIyMDM4NjY5NGExN2M0NDFhYzgzOWIwNWRkNmJiMGVmZTY4NzFkNzEwNTNmMDUyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JMaWZlY3ljbGVTZXJ2aWNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyOTQzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYmY2ZGEwNjNmNTllMGVkZmNjZDQ4YmRmMDgzMDg3MjA2YmU4M2E2NDU3MGY4ZGNhZjNkYWRjODJiNDU4NWIxYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yT3duZWRDYWNoZUxpZmVjeWNsZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4NjAxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2IzMjYxYTU3YWQxNGE1MmExZTM0ZjM0MTBmOGY0ODc2M2JjYzc1MTU0OTY0MmY2ODBhMzllMmRmNTQwNWUxZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yUGhhc2VQcmVjZWRlbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI2MTgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODFjYzEyNmMwZTIyN2Y1NjgyOTU0NzNhYjQxYTc5MDZkZjg2NjU5OGE0YWNjMWQ4OTA4MWFmYzlmOWZiMjlhMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yUHJldmlld093bmVyc2hpcFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNTI5NCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE2Y2M3MjBkNDQzYWQ2NWJjNzRiMzAzOGM1NjU1MDMwZDg2YjU1NTFmZmMxMGI2OTVhMjQyOWI0OWI3OTdlOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Byb2Nlc3NvclByb2Nlc3NFdmVudENvbnRleHRUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDQwNDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlZjYyMTY4MTVkM2UwYjg4ZjIyNjNmZTczM2Q3MzM0N2I2NDhjMThiNmI2Y2IwMDYxYzVkZTEzZjkzYzQwNDA4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9Qcm9jZXNzb3JSdW50aW1lQWNjZXNzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4OTgwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmMwZDE3YzYzNzA0Y2UyZjA3M2U0OWY3MGEyZDI3ZGQ5OWM1YWJmNzRiZDcyZDQwY2ViZDFlNWU1NGM5Y2YyMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yU3RhdGljU2FmZXR5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwMzA5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGY3ZTczM2VkZmVlZjcwMzUwZmE4NTA5YTE2MzY0NGFiZTZhMGUzODQyYzhkMTVlYTdiNjQyZWQwMmRiYTljOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdFN1cHBvcnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDkwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTdlZDJjYzdiZGYwNjNjN2QzNzkyYmRlNzIwYTBmZTEzMjIyNGQ3OTU0ZGZlZWJkNGQyYmE0YWY0YjYzNzAwYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUHJvdGVjdGVkU3RhdGVHdWFyZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNzQ3MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJiNmFjYWQxZjFlNTU0NTkzMDJjMDVlYTIyYjgxMmIxZTE4ZDk3OTBkNjA4ZTYzZTc3MzMzZGUxZTAxNDIzMzciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1B1Ymxpc2hlZFNuYXBzaG90Um91bmRUcmlwVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1NjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZWI2MzJkYTU3ZjVkNzgwZGMyYWQyNjUyZTUyMDk3YzJiMTY2MWIzOGQyNjdhNWUzY2RjZjc5ZjgyNmNlZmRkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SZWNvcmRpbmdQcm9jZXNzaW5nTWV0cmljc1NpbmtUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjk3NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjI5NTY0YTY3ZDU4MmM3OTAwYzIzODkyZWZlNTJjOGExNmEwNTk2ZDY3NWIwNzA3OTdhYTJjOGRiMDZkZWYyMTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1JlZ2lzdGVyZWRDb250cmFjdFByb3ZpZGVyRXZpZGVuY2VUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTQ1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMTJmMWIwYzllZmViOTY3NmE1YTNhNmI2MDFjNDM4NmM3NzY0MDQ4ZTMzNTNiM2IwM2E3NDI5NGI1OTIwMjgwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SZXNvbHZlZFNuYXBzaG90UGF0Y2hUcmFuc2FjdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTQyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImU4OTgyYTk5YjllZDgzMGZlYjVkMTI2MjY3MTMyYzI5NjI4NTAzYzBlYzQwMDRiY2IwMzQzNWI3Y2YzMmY1OGYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1JldmlzaW9uQm91bmROb01hdGNoUHJvZ3Jlc3NUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzIwNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImZjYjM5Mjc5NzY3MGExYzcyNTAwNzA4OTBhMTJjNWQ5NWVjN2VmY2U4YjVhZmY2NDNkNWI1YTE4YzBmN2FkMDkiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1JvdXRpbmdEZWNvbXBvc2l0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQzNjgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxNTNjNGQ1NDA2ZmVkYjVhYzQ2MzUwZGZkZDEyYTliYzhmOWU5MzUzODRkMzY1NTI2ZTRmYWVmY2M4YjVmMzQ2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9SdW50aW1lVHJhY2VFdmlkZW5jZUNsaS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDMxMTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMWRmMTllMGZkZWYxZDIwOTAzZGY5MTgyMzczYjJiOGY2NjRiYTViMmI4MTZhOTg5ZTg4YWQzODdkNWU5Zjc1OCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvUnVudGltZVdvcmtTZXNzaW9uUHJvY2Vzc29yUGhhc2VJbnRlZ3JhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNTQwOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQzZWRjYjYwYzkwOGJhMmE2NTBjMDRlZDg2NWE5MTVjMDg2ODM5MGE4ODQ3NDlhZTEzZmMxMmIwMzIyNGE2NWUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVXb3JrU2Vzc2lvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDkyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjYxNWI1YTdkYjgwMDk2N2QzOTNhYjk4MTAyNmMwMmFlM2ZmYWY5NjkwMmQwZTYwMDRiYzZmMWM3YTk5MGQ4MGEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1J1bnRpbWVXb3JrU2hhcmVkQnVkZ2V0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDcyNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiZTM2YjQzOWNlMWJmMWRlNWQ5MmJkMzIzNzA3MjYzZjM3Nzc0MDhiNzUyYzQyZGMxOWU2ZWI4ZDYwNzg5NWQ4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TY29wZUlkZW50aXR5RXJyb3JNYXBwZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDA5NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjUzNmRmNzIxYzYwODQ1MjUyNTI5NWE5ZmYxNDA1Yjc0NWU0MTkyYmY4YjA2MzljMGI5ODc0N2VkMDQ3ZDljOTMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Njb3BlTXV0YXRpb25TZXJ2aWNlc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDIzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk2ZTFhY2M4YTgxNjVhNzI5OGRlNzlkYWFhMTg2NTczZTRkNDQxNGEyYWJlMjk5MWU5N2VhY2ZmMjVmODRlOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2NvcGVTb3VyY2VQcm9qZWN0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM4NDE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTI1MmU2MDgwNjhmMjI0MjJlOGUwOTE2NjI2MGY2NzQ5MzMwY2VmM2E1NjliMTc3YzRiZmFjNWM4MjQxYjRiYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VsZWN0ZWRFeGVjdXRhYmxlQm9keUNhcGFiaWxpdHlUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTUwODAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4MDg5ZjRkZGVhMjhkMTNmOGVjMzhkMmI1N2ZhNmExNTAxZjI0ZGVkYTgyOWQ2ZjE1ZDExMWU3YjQwZTc3NmE4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZWxlY3RlZEV4ZWN1dGFibGVCb2R5RGVtYW5kR2FzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDU2ODEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwN2Q1ZjdlODZhYmZhOThjZWZmNmQ4OGU4OTdhOGVkM2M4MDUwNTI5ZDRhYjFhNzBkMmQxN2VlNTYwZWY0YjczIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZWxlY3RlZEV4ZWN1dGFibGVCb2R5UHJvdmlkZXJQcm92ZW5hbmNlVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE2NzkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzU2YjJkMTJjOGRlZmZhZjdjZGI5ZmM2NzgyMzgwODYyYTdlOGQ3YjUzYzhkYmJjNTliODMxYzA2OGM5YTkxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VsZWN0ZWRTY29wZUNvbnRlbnRCbHVlSWRGYWlsRmlyc3RUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzA4NTUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjNzI5NTRiNGVmMDBkODY2ZDVmMzMyYjE2NmRkODZkNzU1MTM1MTliMDZiNDE0Yjc3MGM4NDA4ZWI2MWMwYjQ1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TZW1hbnRpY0xvY2FsaXR5RXZpZGVuY2VXcml0ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzczLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQ4MWY0YWRjNTExNzVlNzJhNzYzODY4MGI1ZWY1YWRjMzcyZGQ1OTc1ZmJkODc0Y2ViMTk4ZTBjY2ZmOTRhMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU2VtYW50aWNPdXRwdXRCb3VuZGFyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzE0OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImQ0Y2IyMjRiNWMzNjdkMzIwY2Y2MGNkNzBhOGY0OWYyMzNkNmNhYjg3NGU2MzFjMzVkMTgzZTYzMDI3NzY2ZTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1NlcXVlbnRpYWxQYXRjaFBsYW5uaW5nU2Vzc2lvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA4MTI2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiN2U5ZjdiZTA0Njc1ZmI5MzdjMzNhOGRjMDIwNjRjYmY1NjM2M2VkODhhNWM5NWJhN2FhZjFmNjU3NjA2MGU2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvU3Vic2NyaXB0aW9uU3VyZmFjZVByb2plY3Rpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjk1MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NDk2YzQ4Zjg4MDhiOGVmZWNjNmQ5NTFiMTdhNGYyMDM1NmNmNjhkZjdhNGNjYTkwNjhkM2NiOWFlMDQ5MTM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJzY3JpcHRpb25WYWxpZGF0aW9uU2VydmljZXNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTYxNDgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI0NGEzYjY0M2ZmYWRhYjMxM2Q4ZWNhYTMwMDI5OGU5NTkzODc5NGIyNThlODg0MTZjYWE0ZGEwNzQzYjUxYWExIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9TdWJ0eXBlQXNzaWduYWJsZVByZWRpY2F0ZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3ODQyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDYwYTgyOTFkNWQwYTgzYjU2MGM4NzY1MjRjZmUzNzljOGQ1OWVlMjQ4YTU0MTIzNzIwNDMzOTE0NWU5ODdiMyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvVGVybWluYXRpb25Db25mb3JtYW5jZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0MzY1NywKICAgICAgICAgICAgICAic2hhMjU2IjogIjJkZDU5NjY3OTMwNmM5Nzk5OTE4YjczY2EyYjAzZGRlZGVhYjM4NmY2NWU4YTA4YjQ1Zjg4ODFiOTVlYTQzOWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL1Rlc3RFdmVudENoYW5uZWxUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTc2MTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmMDU2YTg5NGM5NTk2MDVlNjY0ZGJmZTc5ZWY3NzljZWUwMDhiOTMxYWMwYTc4ZWJlYWY5YjI0YzI1NTBlOTA0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb25mb3JtYW5jZS9Db250cmFjdHNGaXh0dXJlQ29uc3RhbnRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTA0MjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYzMyMjkwMTAwOWEzYTllMWJkMDUyNzc4MmRkNWU4ZmE4ZjViNjhjNDU1YTk2NDNhY2UzNzZlMmI0NzU5Nzc4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb25mb3JtYW5jZS9Nb2NrRXh0ZXJuYWxDaGFubmVsLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTg0MywKICAgICAgICAgICAgICAic2hhMjU2IjogIjc4MWM4N2Q2OWExYzNjZjA2ZjQwNWU0YTkwMzRmYWMwZDRlMTNhZjlkNmM1ZTZmZGY2MDA3OWFmNTcxNmE2MGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbmZvcm1hbmNlL01vY2tFeHRlcm5hbENoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDIyNywKICAgICAgICAgICAgICAic2hhMjU2IjogIjNkOGRjODdhYjUyOTE0YmFhZTRkNWNiNzAyNjM5NzMzNjNkZTQ1YzA0NjAwMDA1YmQ4Mjc5MTYzYjM0NGM1MzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbmZvcm1hbmNlL01vY2tIYW5kbGVyLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTAwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZjdjY2YxMTJiODVjOThiZmQxNmRmZjg3Y2Q4ZDY0YThlMmM4NzlkZWNmNjgwNDdhYjA0YWE5NTUxOGVhZmU2NyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29uZm9ybWFuY2UvTW9ja0hhbmRsZXJQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMzY3MzU3YjRlMDgyYmIzMWI1Y2E0ZTRmMmJlMDdmZGIzYTQ2NzA1ODdlZDMwN2IwMzA2YTE5M2Y4ZDgzODU1MyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29uZm9ybWFuY2UvTW9ja1R5cGVCbHVlSWRzLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTUxLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjhjZDA5NGE0Y2ViNWVkMWI0ZWIzOGEwYWY4MzVhZDlkYmExNmJmZjk3ZDRhNTdmYjkyZGEzNjE4NDQyYWQxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29uZm9ybWFuY2UvU2NyaXB0ZWRDb250cmFjdHNSdW50aW1lLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjI2NzgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5ZTQ1ZDFjMWE2MTRhZDkxMjc1NzJlMDg2YzUzMThlZjQzYjc0NzRjODljMTgzNjg5ZmM5MWFmMDRiZjAwODBhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvQXBwbHlCYXRjaFBhdGNoQ29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjA4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTBlNTA4NjRiMTg1MmE3N2JjYzc5YWJhM2E5YTlkNWJkNmZiOTliYjM4MTI3OTg4Y2Y1NWExNWZjMTdlNDYwMiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL0Fzc2VydERvY3VtZW50VXBkYXRlQ29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzI5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDU1OTUxYWU1MmQ0NzZiYzM5NGE3MWY1NGM2NmM1NGY2YmZiMDU2Mzk4NmNiM2RkYmRjMTAzZTU1ZGQ2MWM4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL0N1dE9mZlByb2JlQ29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjkyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWZmYzhiMTNhMDA3N2Y2N2VjMTg5YjU2ZTRiZDM0NmVjM2VjOTRjNGFlZmY3NjYyNjNhZDI5YWRjNjBiMDU0NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL0VtaXRFdmVudHNDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE0MTcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1YTU5OWIxMmJhZjc3ZGQ5Y2VlY2I5NmVlNzQwMTIyMTFiNjgxMmYxNjgwNjg5MjlkNzcwZDUyMzA5OWU2YTVmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvSW5jcmVtZW50UHJvcGVydHlDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIyNzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNTZmZTAzMGE2ODhkY2EzOWRlNjc2MmFmOTcyNjJjNDk4NzgxYzc3YjFkNGExN2QwODkwNTdiNWViOTUwNmI0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvTXV0YXRlRW1iZWRkZWRQYXRoc0NvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTE5OCwKICAgICAgICAgICAgICAic2hhMjU2IjogImM1YzRkN2M2ZmQ0MjM3ZTFlOTQ1YzRkMzNiODNlZDM1N2E5NjFkYmZiMWRmZTFjYTQ0OGEzNTQ5ZTE3OTQ5M2IiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9NdXRhdGVFdmVudENvbnRyYWN0UHJvY2Vzc29yLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjg4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDg4Njk5N2EyY2NiOTA5ZTQ3YzdkMWNjOWY0NDk4NmFkN2E5MzE5ODkxZDgzYjM3ZTZkNDM5MTRjYjYyZmMyYSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL05vcm1hbGl6aW5nVGVzdEV2ZW50Q2hhbm5lbFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI4MDYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MWE5ZmZkMDBlOWNhYzJkZTUwMzI0YWU2NWEwYTQwNDlhNWIwNjMyNzI1YWY5Y2EwYTFkOTRhYWRmYjMxYTNiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvUmVjb3JkRG9jdW1lbnRVcGRhdGVDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQwOTdjOGMxNzk0YjZiZWFkMTMzN2VmNGVhZmQ3NzEzMjUwMmJjMjQwYmIxODc0MTMyYjUwYTk2OWVjNTg3MTIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL2NvbnRyYWN0cy9SZW1vdmVJZlByZXNlbnRDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwNDcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmZGUyMjY0MDFhZjE2NDBhOGI5MDIxZTA1MzNlNmU0N2ZlYThiMThkN2E2MTIwMDc0NGFjMmY3ZmQwYjVkNjA1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvUmVtb3ZlUHJvcGVydHlDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExODcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5MWUwYTFlYzNlMWQxYzdiYjFjZDg3NWU0MDk5MzQ2ZTIxZmZmZGUyMDQwNTgyNTJjYzIwYzk1YWU2YjVlMTY1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvU2V0UHJvcGVydHlDb250cmFjdFByb2Nlc3Nvci5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE5NDQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI2MzZkODJmNjU3ZjkyNmRjMGYzMTVmNDJjZDlmYjVjODU3NGQ2MmJmZDJhMzM1NjQwMDRmZjMyZGU1YmM1YjZlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9jb250cmFjdHMvU2V0UHJvcGVydHlPbkV2ZW50Q29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZDUwNjlmN2FhNDVlZDdmMjgyMjRmMjBlMGEyMGE0YTZhNjNjZGE1MThlNzIwMTY1ZDk0NWY1MDJhNDVhYjI2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL1Rlcm1pbmF0ZVNjb3BlQ29udHJhY3RQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDE0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODg2MmZiNDE2YzRjOWM5NTUzNmFlMzM4MWFlOGI5MzczNWQ4MWY3M2JhNDk2OGY3MmY3YmRmOTBlZWYxZThlMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvY29udHJhY3RzL1Rlc3RFdmVudENoYW5uZWxQcm9jZXNzb3IuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTUyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGU2MzkwNjc3Nzk3Y2I5OWFjMDQ2YjhhODFlYmU5MmUzZDZiZTFmMzFlODkyODFjYWI0MjliNjg3NDVmMTgyOSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvZXh0ZXJuYWwvRXh0ZXJuYWxDb250cmFjdEludGVncmF0aW9uVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQwMzA1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODA1YmJkM2IyOTAyNGJlZGU1ZGQ4NDdmNTcyNTgwN2NlNDA5NzU5NmU5NWJiZmQ4OTI2YWI1YjAyM2QxZjEzZiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQXBwbHlCYXRjaFBhdGNoLmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTcyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYzljN2NiNGM3Y2VhNDZlM2Q5YTI1MTE2ODU0YWU1MmVlZjVkYmJiZTIyZjViZDEwNTk0ZDA0ZWQ5NjNkZDdiMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQXNzZXJ0RG9jdW1lbnRVcGRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNjYwLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWEwOWJmYzA1ZjFjMzYwMGI5YzhkZDZmZTdiMGZlN2Y3MjdlMDM0NGIyZTJhNmIyMTUxZWE2MzVmODZhYmY2YSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvQ3V0T2ZmUHJvYmUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyODk4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNTAxZmQ5MWI4MWVlZTZhMjFhMDZjYzYzMmQ0MDhiM2U0MDM5NzliMDZmM2I3OWVmYjMxMjgwZmY3MzI0Mzk2NSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvRW1pdEV2ZW50cy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk2MiwKICAgICAgICAgICAgICAic2hhMjU2IjogIjE2YWU1MTg1MzEyNTg4ZmNjN2E5NDFlZDZkODFkMWFlZTM4ZTEyZWE3NDY4NjBkYTI2MGNkODk0YmQxZTA0ZDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL0luY3JlbWVudFByb3BlcnR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDU1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOTQ5MWNlM2Y5YWNiOWQ0MWQxMjk3NDgyNWRmN2I4ZTY5ODczZDA4Y2RkNDRjZTAzNDAzODQ3NDEwZmE4OWE4NCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvTXV0YXRlRW1iZWRkZWRQYXRocy5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDI1NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZiYjc2YTY0OWExNDc3MzVlNDUzNTUxN2YwMjgwOGJmNzRkNjUwMjA0Mjc3YjlhM2Y4OTdjNzk1MWViM2IzMWEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL011dGF0ZUV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjM4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiODQ4YjJhMGZjZGQyYmU2OWJjOTZjY2M0N2Y5ODJkMTY1ZWRhYzIwNjQ0NDk2ODlhOWQyM2U1ZTNjYjI4MzExOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvUHJvY2Vzc2luZ0ZhaWx1cmVNYXJrZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MzMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIyZGI1MWE4ZWU5NTJhNGNhOTliYzI0OTdiNjI2MzQxYWQyMzllMjM2NDE5MWI4OGViYWNkN2NkOGE4MmU4N2JlIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9Qcm9jZXNzb3JUZXN0VHlwZUJsdWVJZHMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNjQ3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmZhNDU5ZDc1Nzg0N2Q1MTY2ZDZkNDg4ODJlM2Q4MWJlOWRkNTFiY2MxMWIzZmViMDhkNjFkYjk0NDAwMzBhNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvUmVjb3JkRG9jdW1lbnRVcGRhdGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmNjg0NjJjYWU5MjBhZjg4MDIxNTFkNTc0NzNkOTIxMmFiNjFiZTBhMDQ0MTU2Y2M4YjAyOWUwNThlMWZmYmMzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9SZW1vdmVJZlByZXNlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1MjcsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmOTFhOTU2Njk1ZTk0Y2ZlM2E3NWNlYzQ0Y2I2Y2UxNjAxOTMzYmI0YzNlOGQ5MmQxMjRhMmY3OGUyNTMxNGU0IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9SZW1vdmVQcm9wZXJ0eS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0OSwKICAgICAgICAgICAgICAic2hhMjU2IjogImU3NTA1ODcyMDE4MzRkZjk2YzhmZDI3ZWY0ZDQ0ZWZkYjFkODAxOTNkOGMwYjFkNzZhZmUwNDA5OTM5YTViMjgiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL21vZGVsL1NldFByb3BlcnR5LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogODA3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTk2YmUyMDY5MTBmZTEwZmUzNjNhNThkNjY5NzlhMWNkMzg0ODc4MmI5MjE5NmJmY2UyNjk5M2Q2N2RkMmRjMCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvU2V0UHJvcGVydHlPbkV2ZW50LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogOTc1LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZmQzZTk5ZGE2ODExYjg5ZGZhY2FkMDRlMGZmOTM4ODZhYTA0ZTNmYTQ4YWZmMzliNWNiOGIwMzM3ZDNmMDc2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvVGVybWluYXRlU2NvcGUuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5NjAsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiY2RjZmQzNmIyMzk5ZjhiZjY4MDE0ZWY1Mjk0OTFhOGQ2MzUxMTMwNWM1MTdiNGUwMmEyNTc3YjY2OTk1NGJkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb2Nlc3Nvci9tb2RlbC9UZXN0RXZlbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNDIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTMxZmY2NDllNjMzMzhhMzkwYWUxZGQ5NDdhYjBmZmYyZDZkMmQ3M2ZjMDlmMjZiNjk0YWI0ZmI4ZTg3NjY4NiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvbW9kZWwvVGVzdEV2ZW50Q2hhbm5lbC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ0MCwKICAgICAgICAgICAgICAic2hhMjU2IjogImI2OWZmMzYxZDU0NGNhMzk4NjNlN2RjMGVjOWRhOWVkMDE5ZDcyOTViZDVlYWZhZWUzZDdlMjk0M2QzYWU0YzMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3JlZ2lzdHJ5L0JsdWVSdW50aW1lVHlwZVJlZ2lzdHJ5VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODExLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDczOGFkYTg0YWE4ZTI4MzIwZDI4N2FmYmQzYjQ4OWE1MjFlZTkxN2U5M2YyOGIyMzA0YTgwZDI2NDcyOGIxNCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm9jZXNzb3IvdXRpbC9Qb2ludGVyVXRpbHNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNDMwMywKICAgICAgICAgICAgICAic2hhMjU2IjogIjA1NzliYjI4Njk3NDlhMGQwZTJjOGI4ZDJjYTg0NzcyMjkyYjViNWE4NmJlNGE2YWZiM2E3MmM3Y2IxMDE3YzQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvY2Vzc29yL3V0aWwvUHJvY2Vzc29yUG9pbnRlckNvbnN0YW50c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyNjEzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTQ4N2ZiNjZlYzIzNGM1OWQxYmQ4ZjNlNmJhMDdlNzVjYWY1MTY2MmU0MzdkY2I2YTgyZjlkYWExNTBmNGRjMSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Cb290c3RyYXBQcm92aWRlclZlcmlmaWNhdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA2MzE3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMTQyZGU2NzY3MjFkZjFiYzE0NzE0ZTc3NDkzYTJiYjhkMWU1NjA1YjM2MWRhNWE2MjhlNDNjM2U2ZDUzMjM4OSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9DYWNoaW5nTm9kZVByb3ZpZGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkxODIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIwMzIwYjI0YjQ0NmU4ZTE0MjVkODJjYjM1YjBhZGIxMGVkMDE2ODM0NWY2YzlkZWRmZTAzMjUwMzQxYTM2NTEwIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL0RpcmVjdE5vZGVNYW5pZmVzdFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNTU2LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNDA0NTU1ZTkwZjcyM2Q5NWY3ZGYzYTA5NTQ3NmRlMjc0OTcyMmE5MjM4YzM2ODFiZmU3ZTQxMTg4YzAyMDVkYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9FeGFjdE5vZGVHcmFwaEZyYWdtZW50c1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNDM1MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjZjMDg5OTAyMDU0Nzk4Zjc2ZTZjYmFhMmJhYjQ2M2FhYTE3NmJlZWYxNWYxMmMwZTgyOGRjYTI0YzQwNmYzMGMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvTm9kZVByb3ZpZGVyV3JhcHBlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA0NTc0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWE2ZjYyMGNlMWNkZWU0ZDcxOTM1MzBhYmFhMjJmM2M2OWU2MzAxYzg3NDYwOTI1Y2IxMmJhMGM3ZTkxYTE0YiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9wcm92aWRlci9Qcm92aWRlckNhbm9uaWNhbEluZ2VzdGlvblRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDYyOCwKICAgICAgICAgICAgICAic2hhMjU2IjogImRhOTIyNWQxNTAzYTUyNzVlZTU3MzA2NGZjYzQzZjhmZjE2NTU1MzIxZGM2MGVlYTA0N2QxOWZjNmE3NDllZjciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvUHJvdmlkZXJFdmlkZW5jZVZlcmlmaWVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDk1OTIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiNzNlMTMzYjQzZjU2Nzc0MjJlYzBkMGZhOTk0YzA5ZTYwZTM2YTUwZjY2MDUyMjNhNTFkYTJmZDY1NGRlZmVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1R5cGVzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDUxMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4ZmVlZjBhN2QwZGIwZTFmYzcxYzc4NWJjZjZjMmFlYWQ2MDg3MjUxNjVhYzZlOGYwMzVkYzBiODg4ZjFkZjE2IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Byb3ZpZGVyL1ZlcmlmeWluZ05vZGVQcm92aWRlclJlc3VsdFNlbWFudGljc1Rlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAyMDUzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogImE3MzZjNDU2YjlmMjU5ZWVjMDM5ZThmM2QxNDhiOTI5Y2Q1NjJiMWQ2MGM2OTBmNWZiNmVhOGM2ZDAyZDBlOTciLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcHJvdmlkZXIvaXBmcy9CbHVlSWRUb0NpZFRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA1NTY4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiOGZmMWExOTdmNGJkNDQ5ZDgyMWQzZGVhMDA0ZjVkOGRiM2JmNzkyYTI3MzMzYjdlM2UzNTcwNDBjMjBkZmNjYiIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9yZWdpc3RyeS9CbHVlQ29yZVR5cGVSZWdpc3RyeVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzc4LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiY2U5MzZkZWIwODRkNDkyNDIxNzZlYTcyZjhhZWNhMTJhM2I1MDAzNzVmNjU1ZTBlN2I4N2MyZjVmMWIxNWI2MSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL05vZGVUb1Jlc29sdXRpb25MaW1pdHNUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNjEzOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjMxYWE4MTQxZDJjMzMwZmJlOGNmZTA0ZTBhYmUyYmRmY2E3OTQyOGU3YTQ0NTUzZGFhMDE4YmFkNTdiZDA5YjYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2UvcmVzb2x2ZS9SZXNvbHV0aW9uTGltaXRzVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDExNzE5LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTgxNTkzZDgxYWRkNDYwNWNkZjEzMDUwNDYxMDk0MjU3MGVjMTAyNDRjMDgwNGNlZTljZTZiNjUwMjhlNDM2ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9yZXNvbHZlL1R5cGVTcGVjaWZpY1Byb3BlcnR5RmlsdGVyVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc1MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhYzRmOWE1OTg3NDc0YmQ1M2M3YzIxZTYzZjQ2NTEwNDA3MDFhM2U5NDVlZGI5ZGI1MWM2NGY2OGZjNDEyOTgzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvQmx1ZUxhbmd1YWdlQ29tcG9zaXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTAyMjIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlYzlhNWI0ZDMxZjY5MjI1ODIxNzc5ZTg3MDFjMTNmOTVjZWFlZThmMTJiNWZkZDY2MGVkYjc4ZjY5MjhmNmQzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3J1bnRpbWUvV2VpZ2h0ZWRMcnVDYWNoZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzOTYzLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYWRlYTc1YzkwZDAyODkyYmE2NjY2NmZhMjVhOGVkNThmMWU1NzQzMjAzMmU3YjQ1MTUwM2ZhOTA0Y2MzMGIzYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zYW1wbGVzL2lwZnMvUHJpbnRBbGxCbHVlSWRzQW5kQ2Fub25pY2FsSnNvbnMuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMzgyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMjlmNjk4Y2U0NmNkNzMxNDVlYzEyODEwNjRmNmI3MzVhOTM0OTNlNTZmZDAwMWYzZmE1MjUwYmYzZWQ0YzBhYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zYW1wbGVzL2lwZnMvUkVBRE1FLm1kIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3MTksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIxZTIyNWI1ZmViYTJkNTRmNDk1NTA5MWZjNWE3ZTU1NTYyNWQ2NTYwODkyOWQwYThjYjZjMzM5YWEzZjI2NTdkIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NhbXBsZXMvaXBmcy9TYW1wbGUxUHJpbnQuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MDMsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YzE3ZmY0MmE5MjkxMWE1ODllZWFkMDJmZjRmNjQyNzAxZWEwZmEzMTJiY2Q3YTQwMTE5MTUyMDFlZjg5YWJiIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NhbXBsZXMvaXBmcy9TYW1wbGUyUmVzb2x2ZS5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDc4OSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjdlNTNjNTUxYTQ0MjRkMmY1NDNmZWI4ZGMwNDhmOWRhYjkxYjliMDk5YTNiNWQ2MGRjZGVkMmI1M2U2Y2Q0M2UiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc2FtcGxlcy9pcGZzL2FkZC10by1pcGZzLnNoIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQxOCwKICAgICAgICAgICAgICAic2hhMjU2IjogIjc2Y2E0MGQyNGUyOTY3YmVjZTQ0MTA5Y2VkMmU5MGFkZDVlNDlmYzRlNzYxMDkxMDlmOGZkZjEzMWRjZGU1MWQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc2FtcGxlcy9pcGZzL2lucHV0LnR4dCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMDUsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI4YjJlNDgzYTk0YzAxYTdkMDZiNjRhYzM4OTQ0MmM0YWIzYWU5YjdiZjMyOGJiMTU3NDc3MzNkMjUwOGRhY2QzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NhbXBsZXMvaXBmcy9zYW1wbGUuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjkzMDg5ZWU1N2VmZmE0N2FkYjFkYjZhYmE1YTcwYmVlMmM1NTIxZmI0YmI3ZDc1Y2JiY2YyMWE0MzRkMTAzMDYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvQ2Fub25pY2FsT3ZlcmxheVBhdGNoRW5naW5lVGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyMjc3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYTVjMGM2YWFlNDIyOGQ5NDNhMjU4ODgyOWExZTIxMTYwMzczY2UxMWE1MWM4ZmYxZTVkZGE3ZjI4ZWFmZjRkZCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS9zbmFwc2hvdC9Gcm96ZW5DYW5vbmljYWxEaWdlc3RlclRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzQ3NSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjVmYzc1MDE4ZjU3ZjA2NDQwNjI0MTY3Zjk2N2MxZWI4NDRiOGNjZjFmNmRhNWZmM2NjZjg1MmQ5MGUxYThiMWMiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZURlY29tcG9zaXRpb25UZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMzQzNywKICAgICAgICAgICAgICAic2hhMjU2IjogImZjZTU4NmQ4MmQwZDViN2Y1OTNmMGEyN2VkOWMzNjZjNDI3YmJhZjM3YTA0ZWY0NzNlMzRmY2VkYzA2Mzk3NTUiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9qYXZhL2JsdWUvbGFuZ3VhZ2Uvc25hcHNob3QvRnJvemVuTm9kZVJldGFpbmVkV2VpZ2h0VGVzdC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQ2OTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJlNThhNjM4ZDlmOWViNzJjYTIwMWE2MmQ2M2Q5MzdkYTdkOTVjMjVmN2M2ZGM2Yzc0NzAwMGExOGNlZGEyYWEyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGVTdHJ1Y3R1cmFsSW50ZXJuZXJUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTY4NzYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiOTVmYWEyNDQ1ODkxZTgxZjMxMGUwZjhkMTE4MDdiNmM1ZjVhZGJkZGQ0MTFiMzdkYzc4MjQ2ZTEwYmE4MGVhIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3NuYXBzaG90L0Zyb3plbk5vZGVUZXN0LmphdmEiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogNTM5MTQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzMxOTY5MTBmNTFjNGJiN2EyZGUxMTc4MTYwMWMyMjJjMDE4ZmMyMzU5ODEwM2NmYjE1NDk1NGY5NmEyMDAzIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3Rlc3RpbmcvUmVwb3NpdG9yeUxheW91dC5qYXZhIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDQyNTYsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI5Nzg1OGI3YzJhNmI5MWQ5OWIxMWY5ZTMxNWVlYjMyMzQ1ZmJhY2QxODM2ZTVlMjlhN2I0MjA0OTk4MDNhZTM1IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvamF2YS9ibHVlL2xhbmd1YWdlL3V0aWxzL1Byb3BlcnR5TmFtZU5vcm1hbGl6ZXIuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOTIyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiMDllNTc0MjA0ZDU4MTYxMjc0MDJlOGQxOWI1MTY2ZGJhNDNmNGI5OTQ3N2JlZTdkM2M5NjQ0MjNkM2JlZDU0MCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L2phdmEvYmx1ZS9sYW5ndWFnZS91dGlscy9SYW5kb21NZXJnZVRlc3QuamF2YSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA5MjEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJmYWFmYmExM2JkNzM5MDc3NWJmZjgyM2NjMTZmNDk3NzgzZmYxYWJiZWIwYTFkM2IzN2MwOWVhNmRjMTNkYTU5IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3Byb2Nlc3Nvci9jb250cmFjdHMvYWxsLWNvbnRyYWN0cy5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEwODgsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJjM2UyOTk2OWJjMzRhZDVlYjRiZTliZjRkMzgzZDgyNjM1OTZmZjRlNGM5NWZjMThlMjFjODVmNDQzMWZjYjM4IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDEyNCwKICAgICAgICAgICAgICAic2hhMjU2IjogImY5MDY2MTYyY2NjNTFhOGFhZTRjYzJiNWY4ZTViY2UzMjRlMmU2N2FmODJlYzBjMWMxZmI4YjdiOGQzNTk3MGQiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy8xLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMjQsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJhZTdkMzU0MWE2YmMwMGEzMTZiYWY3MGUxYmFhNTRiNDEwMDIzN2Y5MTg5Njg2ODIzYjIyZWZlYTI2NjQyYmE3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvMi5qc29uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDM0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjU0YjQyODMyN2FiOWVjOTRlZTM4MmNkOWFkMGJiYjIwOTY2Nzc5ZTE2YTA3ZWRiMTUzYjQ5NDkyZGJkZmYxOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzLzMueWFtbCIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxOSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjQ4MTFhZGZjMjI1MmJkNGRhMDVjYjNiYzhjNWRiNWU1ZDU4ODY4YWNkZWU1NjU5YThiNjdkNjBlYjVmZGFkYTYiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9EZXRhaWwuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiA3MSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjFlYjlkYzlmNzBhMTJjMTY1MmIxNGE0N2QwZDI3NjFhYzcxYjNiMzhiOTMwMmRkNmIyZWUwMWMwOTc4Y2Y1YWIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9IYXR0b3JpMS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDkyMiwKICAgICAgICAgICAgICAic2hhMjU2IjogImZiYjA4M2YwNjI0NDRhZTIzYzhiMzJmYzI3ZDEzYTdlNTVjOWNmOTIyY2RiNWY4OTc2MTEzMjllNjQ3NjdjYjIiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9IYXR0b3JpMi5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDE3NzksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICJiMWUwMjAxMTQ2YWRkNmQ4NmQwMWJiNDMxMWUxY2Q0ZjU0NGRlYmNmOTIyNTk1OWVmYzNmNDgxZGRlOWU1ZGM3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvSGF0dG9yaTMuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxMjksCiAgICAgICAgICAgICAgInNoYTI1NiI6ICI1NTI0MjlhMjM2MjljODFkMTFjYWM2OGRlOWU4NTRlYTM1MWYzOTAwOWRiZTY1NDI0YmEzZjQwNTE3OWU3ZDcyIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvSW5ncmVkaWVudC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDgwMSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjIzMGQ4YmExOTFlNTc3OGE0MzU1MWIzMjExZGYxNDQyMmRkMTY1ZjVlNzVkZmUxZTZkY2Y5YTZlMzA4ODMzNmEiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9MaW1pdHMuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAzNzEsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzYzE5OTRkOWExYmExMDBlZDAwNzE5MjgzYmI0MmM3OTU5MjdmOWZkOWUzMzU3MGIxMDdjNTQ4YjUwNzJlMDY3IiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvUGVyc29uLmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTI3LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiNjJmN2Y3MGY5ZTkwYzQxNTkxYzQ2NzU3NGMxM2Q1MmYzNTAwYjZhOTVlMDE5NDFjYWIzMmI3ZmQwZDVjZTdhOCIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL1BldC5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDIwNSwKICAgICAgICAgICAgICAic2hhMjU2IjogIjAyNGU3N2JmMTAzMDRhMWViNzA4OTUyZDZkZDAzY2IwOWU5ZTc3MzE2ZmZkYTIwYjBhOWMzYzgxZWM5ZTI5NTAiLAogICAgICAgICAgICAgICJtb2RlIjogNDIwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAicGF0aCI6ICJzcmMvdGVzdC9yZXNvdXJjZXMvc2FtcGxlcy9QcmljZS5ibHVlIiwKICAgICAgICAgICAgICAidHlwZSI6ICJmaWxlIiwKICAgICAgICAgICAgICAic2l6ZSI6IDYyLAogICAgICAgICAgICAgICJzaGEyNTYiOiAiYjY4OTU4YTAzMTI1MDk4NTkzOGI3MDFjYjE0N2JlMTI5ZmIwZDI4NDZjY2IxMzg2YmZkY2ExMmI4MzA0ZmRmYyIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICJwYXRoIjogInNyYy90ZXN0L3Jlc291cmNlcy9zYW1wbGVzL1Byb2R1Y3QuYmx1ZSIsCiAgICAgICAgICAgICAgInR5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgInNpemUiOiAxNzIsCiAgICAgICAgICAgICAgInNoYTI1NiI6ICIzNTkzN2UwN2Y5MjJjNzQ5NjU4Mzc0MWY3MTBmNmEwNTUzMmI0NDhlNjE1M2M5MTcwZDdhMTQ1ZmQ5NzE2ZmZmIiwKICAgICAgICAgICAgICAibW9kZSI6IDQyMAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgInBhdGgiOiAic3JjL3Rlc3QvcmVzb3VyY2VzL3NhbXBsZXMvVG95LmJsdWUiLAogICAgICAgICAgICAgICJ0eXBlIjogImZpbGUiLAogICAgICAgICAgICAgICJzaXplIjogMTg0LAogICAgICAgICAgICAgICJzaGEyNTYiOiAiZTViMDU3NjhiYzNjYmI4MmQ5YzRiM2Y4NTVhODZmNWYyOGM1YTc2OTAwYmZkOGYxMWYyNDZkNDM3OGIzMTM3ZSIsCiAgICAgICAgICAgICAgIm1vZGUiOiA0MjAKICAgICAgICAgICAgfQogICAgICAgICAgXSwKICAgICAgICAgICJzaGEyNTYiOiAiMzBiNjczNzkzMDg0ZGVkODFmOGFiZjczMzE1ZDZiMGQ5OGM4ZjAwMTM5OWZiYjY2OGQ2MDU0NmFkZTllNzIxNiIKICAgICAgICB9CiAgICAgIH0KICAgIF0KICB9LAogICJiaW5kaW5nc1NoYTI1NiI6ICIwODFlZDdmOTU2OTZhY2E3NmU2YmY0NGY2OTdjODMyM2E4MWY2ZTVlNjhhNzliMzBkZTYyODJkNTY1MzdmYTc3IiwKICAicHJlZmxpZ2h0U2hhMjU2IjogImZiNzdhY2ExMjVjMzI0MzgyZDExMDEyN2M5YzEyNWY2YmRiMTFiMzQ4Y2YxN2JlNTQxMTNiODhlYWI0YTBhMWUiLAogICJjb21wbGV0aW9uTGVkZ2VyU2hhMjU2IjogIjY2NjIzZjYxYzk5NWExMjJiY2VmMmQ1ZWZkYWUxMmY2NDU4N2Q0MzgzNDllMjE0ODA4YWVkYTlkNGE5YWVhZTQiLAogICJjb21wbGV0ZWRSb3dzIjogNjAsCiAgImZpbmFsTGVkZ2VyRW50cnlTaGEyNTYiOiAiNzJkZDg3NDgwYjFmMmUyNTExM2QxOGRiYmM3MzIxYzZlZDU3MjcxMTE3NjkyZjBlNjNlYTdjNjg1MTJkYTE5ZCIKfQo=", + "preflightSha256": "fb77aca125c324382d110127c9c125f6bdb11b348cf17be54113b88eab4a0a1e", + "completionLedgerSha256": "66623f61c995a122bcef2d5efdae12f64587d438349e214808aeda9d4a9aeae4", + "postflightSha256": "456fd924aa7134a68523f675a566dc45540467e09f84ac2d22295a25874a2c56", + "bindingsSha256": "081ed7f95696aca76e6bf44f697c8323a81f6e5e68a79b30de6282d56537fa77", + "importerSha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50", + "receiptGeneratorSha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50" + }, + "runner": { + "path": "/Users/piotr/data/blue-contract-java/scripts/run-round13-same-machine-ab.sh", + "sha256": "996210570704b32caf3a3886044f8f1b34c69824c7ba4a0f4518fea2352c7b5d", + "dependencyMode": "local-composite", + "testJavaVersion": 17 + }, + "runtime": { + "javaMajor": 17, + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "identity": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "jvmInputArguments": [ + "-Dblue.coordination.round13.warmups=3", + "-Xmx2g", + "-Dfile.encoding=UTF-8", + "-Duser.country=GB", + "-Duser.language=en", + "-Duser.variant" + ], + "availableProcessors": 16 + }, + "preflight": { + "identity": { + "javaVersion": "17.0.10", + "javaVendor": "Oracle Corporation", + "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "osName": "Mac OS X", + "osVersion": "26.5.2", + "osArch": "aarch64", + "availableProcessors": 16 + }, + "settingsSha256": "f60281f24fa64319c02e63309c9b3541de75f4fd458acc237870b8a69cba2c10" + }, + "bindingSha256": "aea897270506f86205e0b7e0b9ee3c76c4c3bef33c8dba19d1d8308b0e0117d4", + "sameRuntime": true + }, + "gradle": { + "distributionUrl": "https\\://services.gradle.org/distributions/gradle-9.6.0-bin.zip", + "preflight": { + "baseline": { + "output": "------------------------------------------------------------\nGradle 9.6.0\n------------------------------------------------------------\n\nBuild time: 2026-06-18 23:19:03 UTC\nRevision: 3f750f03d77e42327c5f9fcb9992110088330a32\n\nKotlin: 2.3.21\nGroovy: 4.0.32\nAnt: Apache Ant(TM) version 1.10.17 compiled on April 6 2026\nLauncher JVM: 17.0.10 (Oracle Corporation 17.0.10+11-LTS-240)\nDaemon JVM: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home (no Daemon JVM specified, using current Java home)\nOS: Mac OS X 26.5.2 aarch64", + "sha256": "5443ecca20b7e7f9b46183e00cec31b2f8c0db2fc0d0c5a8b1acf89a79e8d850" + }, + "candidate": { + "output": "------------------------------------------------------------\nGradle 9.6.0\n------------------------------------------------------------\n\nBuild time: 2026-06-18 23:19:03 UTC\nRevision: 3f750f03d77e42327c5f9fcb9992110088330a32\n\nKotlin: 2.3.21\nGroovy: 4.0.32\nAnt: Apache Ant(TM) version 1.10.17 compiled on April 6 2026\nLauncher JVM: 17.0.10 (Oracle Corporation 17.0.10+11-LTS-240)\nDaemon JVM: /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home (no Daemon JVM specified, using current Java home)\nOS: Mac OS X 26.5.2 aarch64", + "sha256": "5443ecca20b7e7f9b46183e00cec31b2f8c0db2fc0d0c5a8b1acf89a79e8d850" + }, + "sameWrapper": true + }, + "baselineWrapperSha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9", + "candidateWrapperSha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9", + "sameWrapper": true + }, + "harness": { + "sampleSchema": "round13-playground-sample-v3", + "helperCampaignSchema": "round13-playground-campaign-v3", + "baselineHelperSha256": "cbb936435d13c4bf5678fc6addedbf625801a4edc52c453c8a441caa1a2bf8d3", + "candidateHelperSha256": "e0ad65c7f1e7cd1e58eee1c6cd31d4932ae0b9336d29177f6e13cdc254f5982c", + "candidateSurfaceManifest": { + "algorithm": "SHA-256", + "includeMode": true, + "files": 118, + "entries": [ + { + "path": ".cz.toml", + "type": "file", + "size": 157, + "sha256": "9a4d68a699e78ff604c2e909bf6d7ecd82bd20b4f365ea85ad666d88bb1a0610", + "mode": 420 + }, + { + "path": "build.gradle", + "type": "file", + "size": 131371, + "sha256": "3f3e494b9f3d8510d0400b7c388113a5b44e7a84866d1f2545f4f0b8ed55134f", + "mode": 420 + }, + { + "path": "gradle.lockfile", + "type": "file", + "size": 6364, + "sha256": "29a6e1996f88f07ae56e4c720409c092440bc6ada197125a0dfef01722c3e94c", + "mode": 420 + }, + { + "path": "gradle.properties", + "type": "file", + "size": 149, + "sha256": "fd73e91317a576be9fd707ad36cef2eeb5ff5dd0cba71163d8cc308fa65827c3", + "mode": 420 + }, + { + "path": "gradle/bex-source.lock", + "type": "file", + "size": 153, + "sha256": "01c96c7e76c1a75dd6a0dfd09656d6449957fb144dd363f78756fc55685db414", + "mode": 420 + }, + { + "path": "gradle/published-artifact.lockfile", + "type": "file", + "size": 7929, + "sha256": "b4e7b78bcd7ae92959b61f882a0c762a56484a57d8d6a1388c1ffabb962bb157", + "mode": 420 + }, + { + "path": "gradle/repository-source.lock", + "type": "file", + "size": 399, + "sha256": "fd3b055108ef65a7d54e09c9d9c619c208a3e1f7518b6e1f514b75d41637fff8", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 281, + "sha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9", + "mode": 420 + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59", + "mode": 493 + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8", + "mode": 420 + }, + { + "path": "scripts/round13-ab-evidence.mjs", + "type": "file", + "size": 65897, + "sha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50", + "mode": 493 + }, + { + "path": "scripts/run-round13-same-machine-ab.sh", + "type": "file", + "size": 3196, + "sha256": "996210570704b32caf3a3886044f8f1b34c69824c7ba4a0f4518fea2352c7b5d", + "mode": 493 + }, + { + "path": "settings.gradle", + "type": "file", + "size": 1401, + "sha256": "a7ca5851f9f6632071ce12cf0f62098d995ec9ac2462ee003a187c23b62dd6cb", + "mode": 420 + }, + { + "path": "src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java", + "type": "file", + "size": 16844, + "sha256": "94ee77eb48ad3c4693ae57e80d1ad25e26e47f71ec82a49703438d6db2e8f498", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java", + "type": "file", + "size": 3011, + "sha256": "f6f17f73e85184800c11634a7e60b0528c4585cd7b4c44220b4b7cece8bf9419", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java", + "type": "file", + "size": 4976, + "sha256": "9c1e965de37749ef7f36607cdaaeb4962c2c29ef02fdd0f78f5dab9a4d128b60", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java", + "type": "file", + "size": 514, + "sha256": "380b431289752f6665ca59fda1f325429730b5bb684fff944ba2df74543e4ded", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java", + "type": "file", + "size": 4680, + "sha256": "d0a273adbc99c0c18a4fc7ff3a64026cb43c387998b4ad1088c3f2286638f201", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java", + "type": "file", + "size": 10221, + "sha256": "2c942d0a6bd84d3a1987e352642e7b4442798899bf4b6e2027e6b397bb407b1b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java", + "type": "file", + "size": 9870, + "sha256": "e23826a96e7b599bb7f9feef8e807125e08417add80b486cd9ecc2363d618e29", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java", + "type": "file", + "size": 6706, + "sha256": "3104429a73c3a3b23251bc79472f203550aae28d0e884715b23a290ada46c93b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java", + "type": "file", + "size": 10201, + "sha256": "328b69fc78772bfe088c74cb6512a564acd76a735300303b940eb56f5c02a10a", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java", + "type": "file", + "size": 4593, + "sha256": "e2bfb328a215690bd46d2e0be00aa8aa5ee2508309fa3ae0e537611d3bf8d2a7", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java", + "type": "file", + "size": 4675, + "sha256": "f82870e379becec8d97c9aabd8e64ed161d98955f71c3c139d79478dff7e281b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java", + "type": "file", + "size": 1441, + "sha256": "12f539f7f7abb65684638edf2f27454c03942d1be926bfb1251609a5f2c05be3", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java", + "type": "file", + "size": 5192, + "sha256": "e0abdba40898c7b32d6a6e144671465d50a4f55616ff00fa80dbde5126620750", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineMetrics.java", + "type": "file", + "size": 451, + "sha256": "e6e29db83c762bb3e3f8d31cd8135829162093442790de0099d99d291bd3c0fe", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java", + "type": "file", + "size": 6240, + "sha256": "747f6475b5bee3ac857e6106be4e492b5897c654f8f098c890e1f4e7113dddc0", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineTestSupportMetricVocabularyTest.java", + "type": "file", + "size": 2671, + "sha256": "8ee8e62bf1bdb07ab728a61147d3b2399c3805f9b39400e4c07b557aeb7e5980", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java", + "type": "file", + "size": 4375, + "sha256": "bdd966ee344b2408f3928e36aeaf468a08d04ffcb1f3ded080f695748975087b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java", + "type": "file", + "size": 22201, + "sha256": "670730a7c01fa0954542096d9a871bbfe27a4345f20e3d7b1feeb0282347d318", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java", + "type": "file", + "size": 6789, + "sha256": "ccff385ab6725a464275bd091f4473ad112995457e96c5c15386ddbfa2da0e5e", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java", + "type": "file", + "size": 7710, + "sha256": "17fbdba43aecd38bd7bb962ec72e3430dcb94104484d0224f8deadd4566b263a", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java", + "type": "file", + "size": 19999, + "sha256": "83a6f2bd173c345ab02a2bd3d75342fc13099aa59b27913b794e21d2b634602e", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java", + "type": "file", + "size": 5891, + "sha256": "1e6fec04d5e15a32c87e73dc4edeac38ab5527181b8892c7f14eaf3ec9ed7752", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java", + "type": "file", + "size": 7047, + "sha256": "985bd959dadde30b676465fe632ba278b19715c9c48226445ba8bdbbbf9cac65", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java", + "type": "file", + "size": 3532, + "sha256": "0a948ecec4c6f6055aaa904d691dc463ad5348859e900ef3cc3e17cfec57c91d", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java", + "type": "file", + "size": 4414, + "sha256": "a4feb1e24a26bbf9e27b47de7ee3b543e9e0f957255319e873b271ebb23ef177", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java", + "type": "file", + "size": 10487, + "sha256": "e77d51152af77ac8ac596ed9a05ed716847637a026163b023c25db075ea6c959", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java", + "type": "file", + "size": 5759, + "sha256": "cbdae0f75ebbe6f6025f99b94acc7b829ad4f618a0ede82002c34126b2c28209", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java", + "type": "file", + "size": 4670, + "sha256": "508e313ed7301271c77d05f0309f37db0d23e30fb9fc0e553820ce95d4cd5d2b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java", + "type": "file", + "size": 11619, + "sha256": "d18de80ec40d21f356a90fc35d3853b73739dfb5776af3e62f2b58c23e7b7f90", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java", + "type": "file", + "size": 6796, + "sha256": "31f83a4d27f5b1f3f6e5e883872a1a856ba0d5c8ad118457191ebf33be48f47c", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceCorrectnessIntegrationTest.java", + "type": "file", + "size": 14879, + "sha256": "444e84794b483224a5b9ed272058f59709f9492eaf76588a0953dfd47fe31cdf", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java", + "type": "file", + "size": 5771, + "sha256": "f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceRetryTest.java", + "type": "file", + "size": 6015, + "sha256": "b700e3d7473bb3959ddb47a3eb27195a7587aecc0d3545ce762217c09a7204bc", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java", + "type": "file", + "size": 5511, + "sha256": "4faa69118ee5ca0e702e65bf4f082c3c165887ed7c97e7a820bac1b85958c97c", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java", + "type": "file", + "size": 25437, + "sha256": "585e261777a66d55e484588de93bdde693b520d92246e16791f1bca69d004691", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java", + "type": "file", + "size": 8418, + "sha256": "ba3ed3185ea834f29d82146b647fe542ea7243f27dc06777d0ae7f533e5fd902", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/RetryStructuralCountersIntegrationTest.java", + "type": "file", + "size": 5733, + "sha256": "bb29b66c70ba9e9dcde072712ab75d7324f66b4794593c0c1dfacb2d789c40e4", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java", + "type": "file", + "size": 23996, + "sha256": "40ed6760d0154c23546d8cdd56c55fc10ebb9e4a238dbbe642a95d8b6e528467", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "type": "file", + "size": 4285, + "sha256": "294e2090b5b6a1cf268d0023d75dfc14d4f6e50ed05c1a7a91ef1601536c2cc3", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java", + "type": "file", + "size": 6508, + "sha256": "faf106c2f001f8a1ca3718ceeeabb7b0ced02dc89d7ae5a272907a448961deeb", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java", + "type": "file", + "size": 5467, + "sha256": "fa70b05d2a41d1c3d4a2ec75b3f14f1a46f5aa24bfc4a9e922df8886a5932d77", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java", + "type": "file", + "size": 14000, + "sha256": "d91349d08b0de841c13a30060ee744034190b191fb219c7aba6d169ded7c73b5", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java", + "type": "file", + "size": 6939, + "sha256": "efce315cf3fc73fd61f20e6782dbf27d533bd76e1e66909b20c9bce614ff3812", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java", + "type": "file", + "size": 2896, + "sha256": "2b2ccb52f2022b45ead879d43800be38d5999e84f892f3b6590416c26427f46d", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java", + "type": "file", + "size": 13917, + "sha256": "1d53341ee4e10fb4212071b0df50a1ef3ae285e171e8a0feb64499e41da41550", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestEngine.java", + "type": "file", + "size": 10657, + "sha256": "db89b8b927f862fc5d1a50a7df22bd3e95b30542b36a51262a6900e37d019e0a", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestResources.java", + "type": "file", + "size": 623, + "sha256": "f009e1f1f06ee77532dd0d4ec6a0060d788e6cc269332c57c9764bd4b12cbdcb", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java", + "type": "file", + "size": 3800, + "sha256": "c78ce197d92e6c188a1f2e5ceccb6b989f5b8b7e568ed95784ee609e4ce56361", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java", + "type": "file", + "size": 9668, + "sha256": "e98771126befedcf8bdce2bbc48dba401493331af0c2d8305ba332a62af35834", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/internal/EmbeddedReceiptRetryIdentityIntegrationTest.java", + "type": "file", + "size": 7947, + "sha256": "29d139b65a366a095f5616cfc427430ebac971905c984561f3deec1b5982167e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml", + "type": "file", + "size": 1016, + "sha256": "8e742418d6770518666c73e5df73ee997b6457d6524b89742fee8d09afc4de14", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/composite-routing-counter.yaml", + "type": "file", + "size": 1067, + "sha256": "e459db2cb88face8f3d0b59b968aab5521f378506b97aad0bcef7f8d9e2f98a0", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/counter.yaml", + "type": "file", + "size": 1781, + "sha256": "11fa9fc75576aed46469325b0277833cd906c37ed2c65065c3a8b95a53e7bc2b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml", + "type": "file", + "size": 2473, + "sha256": "b54ccde1413c39cbf4d1f5b3443e2e358bc44deb9cd87c67c43b257d179e02d5", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml", + "type": "file", + "size": 712, + "sha256": "53ca74bee658d05133e4aeb58bfc7d9abb4b937b6c031d2ebc81c47a5d15cadf", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml", + "type": "file", + "size": 2858, + "sha256": "0d46e54b59e3e066e51c133ec37da101201c8084746da3f4216bdebf1cb755fb", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml", + "type": "file", + "size": 3815, + "sha256": "0d8d6e8dcd4e9336af0c2665ce007bf49b3215dd1c3bff8ba40fee1f48e5aab2", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml", + "type": "file", + "size": 1387, + "sha256": "a6ee31e05a0315d5b76c3317eeb87fb2001bb351274d12a2f100c19364d79b9a", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml", + "type": "file", + "size": 2232, + "sha256": "55b4039a06c5122af2673a8df0fa4ce24999a272ca0c8d97d97113017e513794", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter-B.yaml", + "type": "file", + "size": 685, + "sha256": "c279094dbc51e6808b57df32900d309128c4a208ed1cf4ead18d3e429e573b76", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter.yaml", + "type": "file", + "size": 861, + "sha256": "b316afb6cfb8916d39a7fd7238949e4b0a58b4d72a0b4b4841459ee40895013e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-middle.yaml", + "type": "file", + "size": 1636, + "sha256": "f8ff02ba4b96ecd15e6a37a97c8b0bd823ddeb759ea98009752c33fbb453de9e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-parent.yaml", + "type": "file", + "size": 1806, + "sha256": "6b59cc2ec0caa942519d8dd3acc8551f2ccd304e0bd62546d316694168494bf2", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-root.yaml", + "type": "file", + "size": 1667, + "sha256": "6867661338a8aad572a175cd2c17583232638d630e8f1ed7778229859c82a7c0", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-state-parent.yaml", + "type": "file", + "size": 1721, + "sha256": "1fdb042ca076370a728fff9f85d17d4943e0a02b9ef69a2ed49f4c30fd980f8b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml", + "type": "file", + "size": 2298, + "sha256": "55df230d6bf92d2bdbfa6b183bc4c251f6b973405fb7d0e663f4b0f29f7b5bff", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/large-order-host.yaml", + "type": "file", + "size": 61233, + "sha256": "fef41c534a7d17857e9d16b96431caacb8bfebda48c9f0d4319bcea6e27de12d", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/large-paynote.yaml", + "type": "file", + "size": 46821, + "sha256": "717bbb6eb03c0a9152a02bbcea1fc7d7ba8c8cafdbdf891ef2d23a7a0e2ca0ad", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game-host.yaml", + "type": "file", + "size": 3088, + "sha256": "4b5dde50c0f4c207df1565a21f23236cca7fc235be0fbebab518676d123c8223", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game.yaml", + "type": "file", + "size": 2743, + "sha256": "b14276e9dc6a4b466f6c8b5768adea908debe5cf0e824505fdd044c3b60d3364", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-round10-slate.yaml", + "type": "file", + "size": 4543, + "sha256": "cd901c6ea01cd88d076bf6e8059e8d9cab0771aebf8a9f17e869b4b3f16678f9", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-statistics.yaml", + "type": "file", + "size": 2075, + "sha256": "995d90a08f8e2aa44a5909c96e7f3cc55251f96ba9ad658966ff3d1ffe8a0e2b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml", + "type": "file", + "size": 1962, + "sha256": "ec74999d4773a7b2b295e4283fe46b6736aaf9edbf28610690e2083035b3cdec", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml", + "type": "file", + "size": 1688, + "sha256": "68eeec3a735088787f2d51975fc5302cef23b6acd93881aee9f805134b627a5f", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/ownership-parent.yaml", + "type": "file", + "size": 2131, + "sha256": "89553db67b23c3f8cb1b0afbf858a508c67ae7540058f6ce2d1abf1143c2e6d4", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/package-paynote.yaml", + "type": "file", + "size": 35820, + "sha256": "bb8c0e1baa6575c39b60d9479684661e66a8499c408d770dbee3ccadfcb4d964", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-child.yaml", + "type": "file", + "size": 634, + "sha256": "42c20ca938631c29e49ba00e50a307ff50699e19f35493b106855f6bc5457555", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-parent.yaml", + "type": "file", + "size": 2425, + "sha256": "2ff67f0de3a2062f3944a1b9f01db25c92ed71ef78496e984a4cefe990510b2e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml", + "type": "file", + "size": 1663, + "sha256": "7b0a2b7df4a5b12c3ddc7903a1a37d5300da408570329787d0d66f04f48faac9", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/three-child-history-parent.yaml", + "type": "file", + "size": 1835, + "sha256": "de40d09653378aac24047833db002198a3721a3f44a22038fa344bef2f7bb307", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/whole-request-sink.yaml", + "type": "file", + "size": 1195, + "sha256": "09987601d39a2797dcfd3498c7025b53731d9c2180e9317b6465a16be202d8f1", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml", + "type": "file", + "size": 6798, + "sha256": "b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml", + "type": "file", + "size": 4278, + "sha256": "bb3ce407a600e8abd4157b33a82958076a60429dc2f9b14a90e4ca426f31a9a7", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-path-host.yaml", + "type": "file", + "size": 2912, + "sha256": "aced734ec5af1bc2328074ae93d304bf95400e7de26e2efc1de864af640ba837", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml", + "type": "file", + "size": 1000, + "sha256": "e07e98fd746bc23b42e398d9026acdec297a5a9adc861314a64f9e7793e96694", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml", + "type": "file", + "size": 3371, + "sha256": "28756bc4bb33918219fbb7196ae648301a480af19f1f4035ab181612d372edd0", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml", + "type": "file", + "size": 900, + "sha256": "03944ca9332879ce65f9b407d0711a64d943e2f81100ddf087a855260d7e8b3c", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml", + "type": "file", + "size": 2498, + "sha256": "975eca38288929d7340190e7310bb45f72ec2ea2bd5553976c4aec7165c31df7", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "type": "file", + "size": 3386, + "sha256": "bf1b7998dd9064f32f04d2ba285b5afd449643abf77f3e3563b60f472e3e9121", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml", + "type": "file", + "size": 4314, + "sha256": "12ce455c643098c28af4baf9356a4d1d6893809a2f838c7bb827044856143900", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml", + "type": "file", + "size": 5185, + "sha256": "a0f5279b934197fdf260b3e0d08b06b6d24abf8004e02c3b09c6e3817ae1049c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java", + "type": "file", + "size": 5673, + "sha256": "9afcaebcc2a8a84b380c65d1b9ad3a4a9ecf733b6164418f1fb9e752712714fc", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java", + "type": "file", + "size": 5025, + "sha256": "e8e0c69f50d162da46b1c96193fbcf0fcf8d69282cf83dc78225b755075c4df1", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java", + "type": "file", + "size": 10706, + "sha256": "6c8d4f6cdb5dd5c0d83b04b1d82bcab34786775aa46458df5e1dfeb420c1776e", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java", + "type": "file", + "size": 14580, + "sha256": "f12a5139bb97b4cda738c4e4e3f3959617276949ddfbd3c9673389081d8432a9", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java", + "type": "file", + "size": 9237, + "sha256": "7be29715cdbc26c629c3dda3383405be0fcb4ccfa907d7ed234095e5030f854c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceDeterminismScenarioTest.java", + "type": "file", + "size": 8761, + "sha256": "b2cfa67b28a17b1f8b24cbc427699c7fc151c6cde858a4c2a81944175de49851", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java", + "type": "file", + "size": 34953, + "sha256": "e0ad65c7f1e7cd1e58eee1c6cd31d4932ae0b9336d29177f6e13cdc254f5982c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceInitializationTest.java", + "type": "file", + "size": 5248, + "sha256": "741836e3fe22cbf4df814f6df99c920af5da6a4f08dc53dd172f7aa805a21481", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java", + "type": "file", + "size": 19368, + "sha256": "7753fae42dd382d21556057113bba58ba762fe5d24cd331064044b1589b39681", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java", + "type": "file", + "size": 24321, + "sha256": "98887e7b42b7f1c15f550dff7178ed241bd53e44c85b4702a2abe2106f45c07c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java", + "type": "file", + "size": 2532, + "sha256": "92519fb69108da319a8adaca915257bce64bc05db94a97046e3a42f48970343f", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java", + "type": "file", + "size": 31675, + "sha256": "ca6b8ee53c6c328c59dc0092f376ba5d16662dd8a4208a8b9415dd7a4bda2a29", + "mode": 420 + }, + { + "path": "src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java", + "type": "file", + "size": 10025, + "sha256": "273ebc45d5b53e72265d44f99e50810ffa627ed7b9dbdd3fb52a34ec6acb46c7", + "mode": 420 + } + ], + "sha256": "caf48921e7d2319a96d80b893d465f0820e64552f2f1ba1617d056c476ae60ea" + }, + "baselineDifferences": [ + "RETRY_COUNTERS_UNAVAILABLE_NOT_ZERO", + "APPLICATION_PATH_FROM_READ_ONLY_CATCH_UP_PROJECTION" + ] + }, + "locks": { + "baseline": [ + { + "path": "gradle/bex-source.lock", + "size": 153, + "sha256": "01c96c7e76c1a75dd6a0dfd09656d6449957fb144dd363f78756fc55685db414" + }, + { + "path": "gradle/repository-source.lock", + "size": 399, + "sha256": "fd3b055108ef65a7d54e09c9d9c619c208a3e1f7518b6e1f514b75d41637fff8" + }, + { + "path": "gradle/published-artifact.lockfile", + "size": 7929, + "sha256": "b4e7b78bcd7ae92959b61f882a0c762a56484a57d8d6a1388c1ffabb962bb157" + }, + { + "path": "gradle.lockfile", + "size": 6364, + "sha256": "29a6e1996f88f07ae56e4c720409c092440bc6ada197125a0dfef01722c3e94c" + } + ], + "candidate": [ + { + "path": "gradle/bex-source.lock", + "size": 153, + "sha256": "01c96c7e76c1a75dd6a0dfd09656d6449957fb144dd363f78756fc55685db414" + }, + { + "path": "gradle/repository-source.lock", + "size": 399, + "sha256": "fd3b055108ef65a7d54e09c9d9c619c208a3e1f7518b6e1f514b75d41637fff8" + }, + { + "path": "gradle/published-artifact.lockfile", + "size": 7929, + "sha256": "b4e7b78bcd7ae92959b61f882a0c762a56484a57d8d6a1388c1ffabb962bb157" + }, + { + "path": "gradle.lockfile", + "size": 6364, + "sha256": "29a6e1996f88f07ae56e4c720409c092440bc6ada197125a0dfef01722c3e94c" + } + ], + "bindingSha256": "9023cfb2328fbbfddfec5b0effc7a0f692e7d83c12255a1b1cf9c13e8d6e1abe", + "sameLocks": true + }, + "fixture": { + "baseline": [ + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java", + "size": 5771, + "sha256": "f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "size": 4285, + "sha256": "294e2090b5b6a1cf268d0023d75dfc14d4f6e50ed05c1a7a91ef1601536c2cc3" + }, + { + "path": "src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml", + "size": 6798, + "sha256": "b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b" + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "size": 3386, + "sha256": "bf1b7998dd9064f32f04d2ba285b5afd449643abf77f3e3563b60f472e3e9121" + } + ], + "candidate": [ + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java", + "size": 5771, + "sha256": "f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "size": 4285, + "sha256": "294e2090b5b6a1cf268d0023d75dfc14d4f6e50ed05c1a7a91ef1601536c2cc3" + }, + { + "path": "src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml", + "size": 6798, + "sha256": "b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b" + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "size": 3386, + "sha256": "bf1b7998dd9064f32f04d2ba285b5afd449643abf77f3e3563b60f472e3e9121" + } + ], + "bindingSha256": "b34c0ea1230dff0de06a5415ed76240259a373187fc23881428af068e88d05ad", + "sameFixture": true + }, + "compositeDependencies": [ + { + "name": "blue-bex-java", + "path": "/Users/piotr/data/blue-bex-java", + "commit": "3ebd2d93be7f24ce44840f0aba02b1c40c27f5f8", + "executionSurfaceManifest": { + "algorithm": "SHA-256", + "includeMode": true, + "files": 582, + "entries": [ + { + "path": ".cz.toml", + "type": "file", + "size": 228, + "sha256": "2dd317fbe362561f0e9827c705ff6260fd6df26c16518e0acce99ecba595a4b1", + "mode": 420 + }, + { + "path": ".github/scripts/compare-independent-builds.mjs", + "type": "file", + "size": 9175, + "sha256": "794a0ff7d6758bed3c56a310c72c9a0ef60f09570f330236be7d463002a7eaa2", + "mode": 420 + }, + { + "path": ".github/scripts/compare-local-published-evidence.mjs", + "type": "file", + "size": 3088, + "sha256": "ed70c4f46b1721d9cd4c89996208d730681671078124d1e4391a111d6d70ac4c", + "mode": 420 + }, + { + "path": ".github/scripts/prepare-rc-release.js", + "type": "file", + "size": 3519, + "sha256": "93553341292d4b36a25e4e999888ab76049dcc9e0686e9c4cb1e6f82536c18d9", + "mode": 420 + }, + { + "path": ".github/scripts/run-final-publication-gates.sh", + "type": "file", + "size": 10127, + "sha256": "b7d04859a9d4eb9df4c058c8481ba1cd56ab559b99f140467876cf318821c457", + "mode": 420 + }, + { + "path": "blue-bex-conformance/build.gradle.kts", + "type": "file", + "size": 25114, + "sha256": "8e8e5843fe2b9f37052768b3ddfcd6a789d9c795d5d0898ff768cb5ca8e6535d", + "mode": 420 + }, + { + "path": "blue-bex-conformance/src/jmh/java/blue/bex/benchmark/BexBenchmarkSupport.java", + "type": "file", + "size": 5795, + "sha256": "ca5cc55caa59b3916e08a99b5920a11064c8ae83535e42b3bcbe0f700954b061", + "mode": 420 + }, + { + "path": "blue-bex-conformance/src/jmh/java/blue/bex/benchmark/BexCoreBenchmark.java", + "type": "file", + "size": 19915, + "sha256": "8fff493dcae4bcc716b38b49b1743817d80de139afe948bd6762955d2f574776", + "mode": 420 + }, + { + "path": "blue-bex-conformance/src/jmh/java/blue/bex/benchmark/package-info.java", + "type": "file", + "size": 392, + "sha256": "60ee0af4a3e0a72f0937b3ae03ec545c575eec9a22be5dd32a031f8ffcc58b1a", + "mode": 420 + }, + { + "path": "blue-bex-conformance/src/jmh/java/blue/language/processor/BexHostedGasBenchmark.java", + "type": "file", + "size": 5855, + "sha256": "641729dabe4f82b980134eaa8a9e4810adfe33cc56d3877ac97c2f6b5961ac7e", + "mode": 420 + }, + { + "path": "blue-bex-conformance/src/main/java/.gitkeep", + "type": "file", + "size": 1, + "sha256": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "mode": 420 + }, + { + "path": "blue-bex-contracts/build.gradle.kts", + "type": "file", + "size": 517, + "sha256": "ff59e13a749d4b2e511710ed77158a4e91d7fb328e52864709b593b6df51536c", + "mode": 420 + }, + { + "path": "blue-bex-contracts/src/main/java/blue/bex/contracts/BexContractsExecutionContext.java", + "type": "file", + "size": 2666, + "sha256": "68459daad9f7378139f3c75e8cb202765d8dd3b77953bbb5ea18b34a74f88ab7", + "mode": 420 + }, + { + "path": "blue-bex-contracts/src/main/java/blue/bex/contracts/BexContractsFailureBoundary.java", + "type": "file", + "size": 3308, + "sha256": "eeecc0f8837f96f20f1ac7e33d7417dcaeed2d3dd68a40a58066faf7d6a6abca", + "mode": 420 + }, + { + "path": "blue-bex-contracts/src/main/java/blue/bex/contracts/ProcessorExecutionContextBexDocumentView.java", + "type": "file", + "size": 1630, + "sha256": "5a9968ac9003918dbddfbaa5c6b6d9e3a9700cd1f671e3aa7d0d128d8e6eefd3", + "mode": 420 + }, + { + "path": "blue-bex-contracts/src/main/java/blue/bex/contracts/ProcessorExecutionContextBexGasLedgerHost.java", + "type": "file", + "size": 9727, + "sha256": "40848bc2e4ae347f29f9a3838106373d95edff57cbe13352d234946b67b6b102", + "mode": 420 + }, + { + "path": "blue-bex-contracts/src/main/java/blue/bex/contracts/ProcessorExecutionContextBexSemanticIdentityBoundary.java", + "type": "file", + "size": 1057, + "sha256": "8583638cdd9b8562b27a4cd114f4acef1ec4f436b68bc93a77e9bad6af8666f7", + "mode": 420 + }, + { + "path": "blue-bex-contracts/src/main/java/blue/bex/contracts/package-info.java", + "type": "file", + "size": 709, + "sha256": "95b8fdb05638e13ef74fb7ae639e3e20dd2d3166ae4cc4d8c2c9b46ec73787e3", + "mode": 420 + }, + { + "path": "blue-bex-core/build.gradle.kts", + "type": "file", + "size": 544, + "sha256": "c7f40ad76fba4ce534393bb7dd5b0c2bd21d70f1bdfdd2dc9cbc0faedd432e74", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/BexException.java", + "type": "file", + "size": 1250, + "sha256": "effdfb90201ac7834276e46d1e9a4b23a7c91771760b10cdb2f5bff1b72362dc", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/BexExecutionEvidenceUnavailableException.java", + "type": "file", + "size": 1409, + "sha256": "a4cfc613da074fde61cdd1d1192f165b114be4a52bfc8f491db1a1bb3a591dcf", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/BexInvalidExecutionEvidenceException.java", + "type": "file", + "size": 323, + "sha256": "7d6055ebb9121e01cb2c5c4c06aa3e4f222181868504cdc68b1bfe06b0ff5a8d", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/BexSourcePath.java", + "type": "file", + "size": 1761, + "sha256": "8bbec6b9396fad9216056ee79b0787f7c8ffd80189ff680a9ee1d3e893e539b0", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexDocumentView.java", + "type": "file", + "size": 607, + "sha256": "15494a5b42400a94f46b588cd5ad0b31ba9eb92f9213157c1ec164357e1c2526", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexEngine.java", + "type": "file", + "size": 9764, + "sha256": "830851385d6a73089ac6106106eef39e2fc4ab949ca4ab334833b39cc17fce30", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexExecutionContext.java", + "type": "file", + "size": 22993, + "sha256": "5e4e851a9abcdee9eb076c3cdbe5a4d877b6de33b27467bba4bb37abcc9c3c68", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexFailureBoundary.java", + "type": "file", + "size": 2917, + "sha256": "7255b139bf31acf69579cbbbe2414a3521d4f0d17968fca3010eb690691b5e31", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexGasLedgerHost.java", + "type": "file", + "size": 5327, + "sha256": "c4f1f1a2365cad0cefa8088db32927aad4b90ced4cc1f1ea3124f2d0f0d9d36f", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexIntrinsicInvocation.java", + "type": "file", + "size": 3837, + "sha256": "c9f5c4dfacd54dd7a8a771838aca6126886d6a6c0b5b32d0f1d3d014c2720cae", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexIntrinsicProcessor.java", + "type": "file", + "size": 247, + "sha256": "3b83e0e8fcc23a021ce9a25a50cb772793b782f8e0114208666fae62434f00ff", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexIntrinsicRegistry.java", + "type": "file", + "size": 17280, + "sha256": "2d074b58b008eb62f4e8680bf663fda9538318efa087a3b3a384b0f26fa540b2", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexMetricsSink.java", + "type": "file", + "size": 352, + "sha256": "d12c042a206b9652bb13a1c1bd8004208ce03cdb27e23782945273cb23ae9e9a", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexProgramSource.java", + "type": "file", + "size": 2087, + "sha256": "4f4437c2cbea963bab0c541269eb697d3c868a0c57b548cce6454876e563d4e0", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexStepResults.java", + "type": "file", + "size": 1504, + "sha256": "611a9b123ea986c081ab69e760e6f864be65d51ad5d95868f582692f1215823b", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/BexTypeBlueIdResolver.java", + "type": "file", + "size": 641, + "sha256": "a01a4d7944333ce101a3d8a45e18f721d896d7e7bff38d01e9701a9b13b83594", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/FrozenBexDocumentView.java", + "type": "file", + "size": 2398, + "sha256": "56662e9b33979c885c1d9ab1c9be55dfa3ee7cba85adbefd23a085469d70a4dd", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/api/package-info.java", + "type": "file", + "size": 710, + "sha256": "c7192aa3cac35cdaaaab37ae9d4fbdf4c35814c98c1790bb8d3fb14d15059b6a", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompilationInput.java", + "type": "file", + "size": 695, + "sha256": "7e96bc7ebb0e7cafa626978f37c88cccb81d33089b0ced0821e28c88ccbe371a", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompiledProgram.java", + "type": "file", + "size": 7676, + "sha256": "9d10b31577a92574f5f86d4639ebbe8efdaa2099d1fea17a0179cd757a639608", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompiledProgramCache.java", + "type": "file", + "size": 196, + "sha256": "cf8c03fa386a01974f4588b3c1e99e1b1a66b0e4ede557fc63810ffd7ddd4b0c", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompiledProgramKey.java", + "type": "file", + "size": 3716, + "sha256": "4b012dc8fb3231389b1ab2774841da59604c161b12b59422db79291efed2b462", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompiledProgramRuntimeAccess.java", + "type": "file", + "size": 850, + "sha256": "4fe8c28308f6288d15df77f1395730ceb5a189207d397fa99e43e1c20f3d1473", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompiler.java", + "type": "file", + "size": 709, + "sha256": "f8753f30030794225eedc2b79ef5bb73fcf9982231a2a2e30732a1dcfa1f2b1c", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompilerRuntimeAccess.java", + "type": "file", + "size": 592, + "sha256": "5bcd750f11696bf305e46c6468af619dcdd558d2c2da76be633efb59cdfbd12c", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexCompilerSupport.java", + "type": "file", + "size": 16827, + "sha256": "5b7ccc10280da2eb09f47b61b3b49405ee2c24153cbc98fd14aa0eb7934fc516", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexContainsCache.java", + "type": "file", + "size": 3583, + "sha256": "265ce2e5afad46b560bafb05e8b36330dbacd6fb3e9a299db7786eb98c9e5cf9", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexExecutionMachine.java", + "type": "file", + "size": 1981, + "sha256": "c9c2247eaea495719a8a51c1651d3ea20bd598b213f6047ca140dd4815ddbc49", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexExpressionCompiler.java", + "type": "file", + "size": 37810, + "sha256": "c49b08ff6116d9ebde374a2d0807873823563cf01ba558983db22c095ed94821", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexGasWork.java", + "type": "file", + "size": 26911, + "sha256": "fb5c217f78065ff2de0caaeb1e1928867cfe9687a2a9f959a21c4b542e3034f7", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexGasWorkSupport.java", + "type": "file", + "size": 19046, + "sha256": "72e7b17d7ccdf1a8cd47c06d62a1462e0513239528660927c514e2bb5184eb4d", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexIntrinsicCatalog.java", + "type": "file", + "size": 397, + "sha256": "b08bc284aa96af3352c26a93eaad1356ee2c47d6cb0ed97a7dce0b26f59de394", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexNodeFingerprint.java", + "type": "file", + "size": 6558, + "sha256": "26d734a09dd3a1d0f3d090042e76f7e5cc38cee4aa1cb1aa8c64eccde048978f", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexNodeIdentity.java", + "type": "file", + "size": 982, + "sha256": "864d1fc3766bb67e5e8d4da866ec70b82b067b7e01ff020e52a3a2b6e7971e25", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexOperands.java", + "type": "file", + "size": 5388, + "sha256": "1755b10806454e31aec6bd26ca7774edc05daebe308d3c461ebf0c9d03d87ba7", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexOperatorCatalog.java", + "type": "file", + "size": 40621, + "sha256": "5f33ef153986fea8e4d08b8e4ba557f4e05fc996416a41b863a961ffb3463e07", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexPatchEntryParser.java", + "type": "file", + "size": 2146, + "sha256": "d6c368afe2936c4b62c18d6a7da37637789cb8c3f18feae6890932f2291ae808", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexProgramCompiler.java", + "type": "file", + "size": 16400, + "sha256": "900683bfe899b0815b01818e60b5bd167d31991228c70db46aed72149993e757", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexStatementCompiler.java", + "type": "file", + "size": 12382, + "sha256": "343bee1b334867842214b7e219827a8a15f7f4fd7e60f7c5f3f33367c8a61f69", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/BexStatements.java", + "type": "file", + "size": 12488, + "sha256": "5d15c6d048603c7bd2e020eb709e73096e79fb4e5778ca402b0fe21af76ac049", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/CallExpr.java", + "type": "file", + "size": 1085, + "sha256": "4d7d541b5716fc6cff6e5c9b83db6bc4ef228588a09e5b23bf97f719d7367e69", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/CollectionExpressions.java", + "type": "file", + "size": 18133, + "sha256": "be99e1c3026e206c522e02522752dbcea9efe9520de024397eb97e14960693bd", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/CompileScope.java", + "type": "file", + "size": 2352, + "sha256": "4949c361a462545ebedc8d896beedb1c5fa99b01e18374382d2696a0e574ccae", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/CompiledExpression.java", + "type": "file", + "size": 200, + "sha256": "4e49f6eb061b3f61692102e1adcd794fe1e00986aa41b73d9a4f1b99ccd2f207", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/CompiledFrame.java", + "type": "file", + "size": 3529, + "sha256": "1a50e78e28cbb6a5500aa7de653ccce2886ddd41cd505cff3a6a351be1e8254f", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/CompiledStatement.java", + "type": "file", + "size": 164, + "sha256": "d92c3f7849d42a7dee90d894a3b19ab59f66060809f3ec5f528e7cf8be1cc6f3", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/ConstructedExpressions.java", + "type": "file", + "size": 3779, + "sha256": "efa616dda382ac6ed3d918868f93b589cd00d8347b5bd126e2359cca2bd3d4bf", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/Control.java", + "type": "file", + "size": 126, + "sha256": "8fded2a1c83a1c3d37399ba3cfa4ba654880b2c3df8174d88d628d671275ce71", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/ExpressionBase.java", + "type": "file", + "size": 2212, + "sha256": "478f0eee1cce30a5db9b9eb2f96ab20d7dc2597229a9f5a78a4f0347c9a0006d", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/LogicNumericExpressions.java", + "type": "file", + "size": 8144, + "sha256": "9c7a1abe501b41a172245109a8ceb3283cbf99015c3953537b5193aa3ec16a0f", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/LruBexCompiledProgramCache.java", + "type": "file", + "size": 1005, + "sha256": "33936d2b2df5939258dac13f2a241d59eb7099867b4c3c5e954da75b80fc3cb6", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/ObjectResultExpressions.java", + "type": "file", + "size": 9054, + "sha256": "4bd689c73b03cc96a99d78c602d4c12367b6556a20fecfddcc9cd1d81d47b2e2", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/ReadExpressions.java", + "type": "file", + "size": 4259, + "sha256": "b8cacc8971f597965436ccbcc3ceb403a906ab2beaddb92c4fa19d428cbbd770", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/TypeStringExpressions.java", + "type": "file", + "size": 16572, + "sha256": "2ba8a9fab94704c3676c3c8203bd0386fbc0ed35fa7a0f3730126e7886144e05", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/compile/package-info.java", + "type": "file", + "size": 603, + "sha256": "8bc195f8adc0f834106e3b4fc1f618e2d0c2ec007529668ea40311a4a3d705a0", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasAdmission.java", + "type": "file", + "size": 5016, + "sha256": "5fc5c46610aac7e88ee74ad46b3a99295b7d6a71c644391a3e2910ba42068af0", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasBudget.java", + "type": "file", + "size": 1446, + "sha256": "5505175843b44de4ca467f43d20ffdef3eb5e42320d490dccb26b27b6a4b1295", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasCharge.java", + "type": "file", + "size": 9217, + "sha256": "568466043cc86a241bcbd461650118bd19a5b0eda9081937492b0ea8200b000a", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasChargeContext.java", + "type": "file", + "size": 1305, + "sha256": "09e6126e6ebbc1ff6332d3727e2b24c30abe385e5ded061bdba0180c19e165c4", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasCounter.java", + "type": "file", + "size": 4724, + "sha256": "76b8d47c74a1b9c96104bea708aa109d13669585ad82a75f2758aaee1f7351f3", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasCounterCatalog.java", + "type": "file", + "size": 4699, + "sha256": "602836a2e0a4d6330eb7baae2d7bfb3102a11d8f0ce0391f5a2c09a225c50daf", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasHostSession.java", + "type": "file", + "size": 8045, + "sha256": "fcf8f4dec1c98fd2ac4949e9838237ca784527a9ff0f5ddd966c14e7e438f818", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasLedger.java", + "type": "file", + "size": 6390, + "sha256": "33eed3464ba8ec7b49ef3d917f6a47e9e0b3e825244f23df690beda9e4c3800b", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasLedgerCapability.java", + "type": "file", + "size": 502, + "sha256": "9fd2dca140e7170f89d539ee59a36a2f6f12a8ccd23c2781eb589aec62148c1e", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasLedgerLifecycle.java", + "type": "file", + "size": 1777, + "sha256": "96438cb8abd3a68a36079f3e66715f86a905b0dd152eae179761df021ea5b9c7", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasLimitExceededException.java", + "type": "file", + "size": 4644, + "sha256": "723ccbfea1668ce9ef391c79df070859fa0fffc21578021549300407492ef720", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasManifest.java", + "type": "file", + "size": 7783, + "sha256": "de26a85217cdd15917aaf8036e1059aa529d7d5437034d7b65a6f8ea86e83a09", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasMeter.java", + "type": "file", + "size": 17229, + "sha256": "ac2cf09ded890458e1177ceb1205363aae44edfdba9bd65800866e5e68afae39", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasSchedule.java", + "type": "file", + "size": 12924, + "sha256": "e9e47c748ea3b612896a6d4dc51f644707ed4ef4d8fa52bc9835c7cc59026015", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexGasTraceRecorder.java", + "type": "file", + "size": 1325, + "sha256": "2bf5fd8ad2f9337f9a40677b4cfe3f747fc4450e20dff97e760eeef466d2ada5", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexHostGasExhaustion.java", + "type": "file", + "size": 1688, + "sha256": "4d884ffe33e2d851dd48b066ae599d8bef866897b5374c7920f012e30edd4ac1", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/BexSharedGasBudget.java", + "type": "file", + "size": 206, + "sha256": "cc2d6d746dc9185d1d1b11c7faf93c522eef9d02b6c66439bd5b3f8c73fd6a28", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/gas/package-info.java", + "type": "file", + "size": 726, + "sha256": "53b615fc0d3c48eeed79a3c91f8b4ce747cc0984cc2637913049a4a4dc79dbe0", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/BexAdmittedValue.java", + "type": "file", + "size": 1769, + "sha256": "93ccad6cf0feb0ddd5af147fd0ec5a3349be8d301e62e4085c5a49bd9ca2d006", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/BexEstablishedIdentity.java", + "type": "file", + "size": 1011, + "sha256": "35907782771a73c60b4f0cd31a7d1858ca4c1edd255f0582b1f4e71d7544c2d9", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/BexFailurePolicy.java", + "type": "file", + "size": 1658, + "sha256": "b9257c9c14f353876dfc8817af200496303b9f3f8e1af68dc435b0404f7bffea", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/BexOutputAdmission.java", + "type": "file", + "size": 5139, + "sha256": "d070ef9bf7bc8f5d725a196768f078f91c1a9e4f0d89b4ec4b44246db70c21c8", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/BexOutputKind.java", + "type": "file", + "size": 454, + "sha256": "586ba45abf15c8e83d85433e50608f59e5a37db5397d91812332584e99f98ea3", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/BexSemanticIdentityBoundary.java", + "type": "file", + "size": 892, + "sha256": "68a4d83fb3c97185617f0a4bdef4d79a97fcfba9028c4320b0993163450981d7", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/output/package-info.java", + "type": "file", + "size": 648, + "sha256": "72296f17efe379f5ab0f3af15817387e186bc56c926610cd1f4b70014a341c2f", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/package-info.java", + "type": "file", + "size": 607, + "sha256": "23ebdee405569b9c8fe392ce6970d0012f86a45e2d881a51fdf3e2fe5c6b023b", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/pointer/BexPointer.java", + "type": "file", + "size": 1764, + "sha256": "a6b8868cd2e15f0abf0ab4069a7f448e6e48cbe16e30cceca75cfc19906a0795", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/pointer/BexPointerCache.java", + "type": "file", + "size": 1350, + "sha256": "86e2ca483cffabb7194a6e669aec074b4dd9ddf47dc0411162530f2aef05431e", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/pointer/package-info.java", + "type": "file", + "size": 537, + "sha256": "2d31a7b0a790e2d415e07a8ba03d5ee8f2a6a3e6d7f2490ede3bc088a73fc6f2", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexChangeset.java", + "type": "file", + "size": 1331, + "sha256": "cc512673edfe105c4dc19bd8095e2cbe2feaafe8a08e1135d4c01538eab202b9", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexEvents.java", + "type": "file", + "size": 1421, + "sha256": "bf6074ebc84346f785358a1fec36d5ebf7ca7a1ae5c7cade03f1b158b2e8c759", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexExecutionResult.java", + "type": "file", + "size": 3511, + "sha256": "fc76bb8e1d70002aae4e18771c8df52afabdffc0a1c14fb2121880f580d6e4f1", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexMetrics.java", + "type": "file", + "size": 3275, + "sha256": "93d67cd6a407ab72c556b792c631e4ac7b7811d21564badfaf11da78dd77d187", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexMetricsRecorder.java", + "type": "file", + "size": 7658, + "sha256": "119401b08f589fecc4613a2b53a03ff980ea273d2e8963c61d39fa6edb9dbf7b", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexMetricsSnapshot.java", + "type": "file", + "size": 3406, + "sha256": "90600074ee1355794e1ca29cd5f2bf1d986b9fc93d7baa9bb0142f55831eb30d", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexPatchEntry.java", + "type": "file", + "size": 2355, + "sha256": "e8efe24edcfdee40e5ed2aa08adb05dd45a8b5629d2d0342e1567c47dc25120b", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/BexResultOverlay.java", + "type": "file", + "size": 4043, + "sha256": "40e074df7ffd062b37f9102b4f39e04113cbe051c7b7194dd12ea22b18a81440", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/result/package-info.java", + "type": "file", + "size": 642, + "sha256": "ece51ec316f61540edc4ccb1ce25ac0a083c48afcf2cf1bc7cbddeb7a1f9cd67", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/BexExecutionAccumulator.java", + "type": "file", + "size": 2481, + "sha256": "057e4e4d0a44fe39e8249fafcbffdd5d44601699a4c4c705cb4581fc50541a7c", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/BexRuntime.java", + "type": "file", + "size": 10619, + "sha256": "289678506e6f405791e73b0ab3821f82d6518ce88ef878f14d800bb21e1317e3", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/BexRuntimeContext.java", + "type": "file", + "size": 746, + "sha256": "d3bf9f570ee28b0469194acbaa0aa08a46b842505277b7d489f7ac43cacc4321", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/BexRuntimeGasSession.java", + "type": "file", + "size": 10057, + "sha256": "2b772dc28839ab0efbee31af578e09075f845cffc9eb3df33684c8a44c579660", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/BexRuntimeIntrinsics.java", + "type": "file", + "size": 1496, + "sha256": "02f30fe2186f30007743d93b2848d615446d5afa703cd8d5567ce5e17acab78f", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/BexStepResultView.java", + "type": "file", + "size": 211, + "sha256": "d02211eb7b9ab0747f1677a1dd2d34e8f77b75889e9ce146a60f91aebcba63b5", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/runtime/package-info.java", + "type": "file", + "size": 761, + "sha256": "7e375428a0f638191efcdf55d2e16bd29ad07e31db54853f5f6a7a52a0590eba", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/spi/BexDocumentAccess.java", + "type": "file", + "size": 355, + "sha256": "fa823b2e709c30397f56f517a0b072ba4d89a70173f5d6ad936e48e41a86170d", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/spi/package-info.java", + "type": "file", + "size": 511, + "sha256": "4418afc5d4ee218682945d5ca09c3b66c106550ac02c6c63113e7c051c4cbcf0", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/type/BexBlueTypeMatcher.java", + "type": "file", + "size": 711, + "sha256": "24728e8e231fed94a5b289df9a862193e61c49a602b50d816998b4b9adc2b50a", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/type/BexFrozenTypeMatcher.java", + "type": "file", + "size": 5517, + "sha256": "1439d2880df5572fa016fa7cb62b9d6e543af5f4176be71b061810a0ef557574", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/type/BexPatternValidator.java", + "type": "file", + "size": 9464, + "sha256": "3c71fe883a3398cea4d44a8833a3bae7515dc9eae8a73260b58b9291f57fdd10", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/type/BexTypeMatchWorkRecorder.java", + "type": "file", + "size": 4009, + "sha256": "6bc83c5b56ca19ee04b947e6a262246b3fb15d1f986c21f2dbb47b6b04546e36", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/type/BexTypeMatcher.java", + "type": "file", + "size": 13535, + "sha256": "64e7032c6736c122a3ff43e26ac3bccd710fa909e133862f2d49d08214b588b4", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/type/package-info.java", + "type": "file", + "size": 583, + "sha256": "8f4c874f4ab5f00b25128279424bfad1ca1234f3e19b9f950119ccaa3b28be26", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/AbstractBexValue.java", + "type": "file", + "size": 3456, + "sha256": "263f69226fce4d0dc7b3fc4bd7c37d0b50cf2ea945a1292d5140f34c35bbe5d3", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/AdmittedExactBexValue.java", + "type": "file", + "size": 5513, + "sha256": "c742a1997143eceb72989abb87a71cd65878faabac70fea8e655db7ab3f69a79", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexBlueNodeWriter.java", + "type": "file", + "size": 17235, + "sha256": "b3ae0324adca38ebdb9e6a59bfdd2a9a03edaec764e65b9ba38c2811161139cc", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexBlueValueImporter.java", + "type": "file", + "size": 2940, + "sha256": "b22d5efd6ba4fd2faabe5042bb61f1a394db630a5df0507310941d9432371d1c", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexChangesetValueView.java", + "type": "file", + "size": 216, + "sha256": "65fbb77e0c78f1e0f70c3fc01983ef87dd1dc34ae7de44250054289f9e8dd048", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexEquality.java", + "type": "file", + "size": 2544, + "sha256": "9c5bf4178e1a6ad9d97ded1546e92143a77fd5e8d688f308c5822d3c23939219", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexEventsValueView.java", + "type": "file", + "size": 181, + "sha256": "0333258fa7bc88088c286699a275104885e7269c57ccb27b689849d1b0298525", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexFrozenWriter.java", + "type": "file", + "size": 1188, + "sha256": "e50a3db793653a23ef1646aa4bce3afdc905a900a6f8739af1faf3edb3a3f227", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexNodeWriter.java", + "type": "file", + "size": 301, + "sha256": "d26dde7e97ffbe2c821aef064f3c78c2a4ea3575e24289e91b63f1ae66b3fff9", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexPatchValueView.java", + "type": "file", + "size": 197, + "sha256": "255fb4cb0d52418006703402d06f7b8c421c9ce3d77637be8775496678b7b6df", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexSimpleWriter.java", + "type": "file", + "size": 1295, + "sha256": "f689660c5841470b0a9cdab78566a92fed3e75c307d63caf41ef8e7e2c0294f4", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexTruthiness.java", + "type": "file", + "size": 615, + "sha256": "2f78bb0652a258c9e3647edcf29ca5e455e253060ca917571a68c087b86b0983", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexUnicodeOrder.java", + "type": "file", + "size": 4976, + "sha256": "cb8b0723f076e74fa690e9c7edc43695d5858db948c5e5ba8ac199e6671f97a4", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexValue.java", + "type": "file", + "size": 1895, + "sha256": "11f9482d2a08a83aeb815bcce55d892dc35cf6d7636b1dac912e0cfb33d30d2e", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexValueKind.java", + "type": "file", + "size": 587, + "sha256": "e506212ebadeb57483af45ea45db3ee0fbece2cb6d29807e1636a1e2a8ab17f2", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexValueMetrics.java", + "type": "file", + "size": 215, + "sha256": "755cecfe0dd866bd371772f1a6f55925042cd9f89418b5e5bebbd9c2b2bb7367", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/BexValues.java", + "type": "file", + "size": 14696, + "sha256": "d8b0c79b42cb91329b97fd6e826318eefc3c6fd10fd87f92a7455425e12fee20", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/ChangesetBexValue.java", + "type": "file", + "size": 1078, + "sha256": "369dcf5562eb44c61fa9a8fdc46d6197954068b2e6b45abd57e8b58530ece193", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/EventsBexValue.java", + "type": "file", + "size": 1013, + "sha256": "c728f7038a6e1beed546b527e564ea1e32ea4121b053af14dff3b9ead58ca8c6", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/FrozenNodeBexValue.java", + "type": "file", + "size": 19142, + "sha256": "49053bab36a93a8dd887bc15b4fd088439368dd06ec50e9c276520b9bb3f924b", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/ListBexValue.java", + "type": "file", + "size": 1825, + "sha256": "a06b365a2de94025a9a8e52dc7a27dd64ecae149c6e5e4139c7a252484e74d6e", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/MapBexValue.java", + "type": "file", + "size": 2028, + "sha256": "9c648a185f45cb78325673b293a17ff73d0d28bb7b40ac90b75f5a992c1191a5", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/NodeBexValue.java", + "type": "file", + "size": 8501, + "sha256": "54d1c0c66395a075b87615c00371b48ca026f11edc621dfd6f6f4ed0c24ec1d8", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/NullBexValue.java", + "type": "file", + "size": 633, + "sha256": "c3c9d6b4cedb1ab7d6045111b3fdcaecd3c52f9766c3add46efcaabc13a22d05", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/OverlayListBexValue.java", + "type": "file", + "size": 1834, + "sha256": "b13abaee366ba8c7bfcc4882bfca6b8f3497472c5769f355ebbdeae15abf7ca8", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/OverlayMapBexValue.java", + "type": "file", + "size": 2823, + "sha256": "470d30a753e96368273dbe41054885a896db7d15890cfab956b5b0e810f3754c", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/PatchEntryBexValue.java", + "type": "file", + "size": 1382, + "sha256": "aa772d1cc1e4c26ef5eafa47d7ae53911f3ce235cc1456f295674995b169cc6d", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/PointerSetBexValue.java", + "type": "file", + "size": 8538, + "sha256": "8b85a1bf61d8e4a8516daed8184884162a0fa3dd919ad58fa6525480c3c479b8", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/ScalarBexValue.java", + "type": "file", + "size": 2607, + "sha256": "10f0caf4fcad6077b07d40c2cf5860dae8cdeedac8f7e98b8605b8c09f1639d3", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/UndefinedBexValue.java", + "type": "file", + "size": 1124, + "sha256": "9682627832953f7f7bf860badb0a5ac475fabc3e4bd8a48b28e10baf3d87eaf4", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/java/blue/bex/value/package-info.java", + "type": "file", + "size": 728, + "sha256": "56c5d59ad8b1c818c40831a3e8b85407e444dc8f2aa48593893c7148eb8e6fd7", + "mode": 420 + }, + { + "path": "blue-bex-core/src/main/resources/blue/bex/gas/blue-bex-gas-2.0.yaml", + "type": "file", + "size": 3249, + "sha256": "1f689e0cf51b0f9afa6b18a640e0c755470921a7b0d66f62bfc2206679de640d", + "mode": 420 + }, + { + "path": "blue-bex-java/build.gradle.kts", + "type": "file", + "size": 501, + "sha256": "a993c6bcb6f3b19118e70cd3302e8e30187bd204b0a5fee096a9edf2f902cf19", + "mode": 420 + }, + { + "path": "blue-bex-java/src/main/java/.gitkeep", + "type": "file", + "size": 1, + "sha256": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "mode": 420 + }, + { + "path": "build-logic/build.gradle.kts", + "type": "file", + "size": 2397, + "sha256": "c2c3a2640efe8a48beef74b4b1173002d404d57d63d5dc6309345a6e42dc6fc3", + "mode": 420 + }, + { + "path": "build-logic/settings.gradle.kts", + "type": "file", + "size": 42, + "sha256": "d19f10bdb41abd71e9f091ebba2e80ffb1d3b248ba73690093f6b816043895b0", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/ApiEvidencePlugin.java", + "type": "file", + "size": 2390, + "sha256": "e5e9089d5788e805059d9d65ef7199085ae5fe58d5c26a910033419e8817d063", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/ArchitectureVerificationPlugin.java", + "type": "file", + "size": 3042, + "sha256": "564486c31c91ac31c04d506f67da0ef78ddf082663eb3d3fd204740cb83760b4", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/ConformanceConventionsPlugin.java", + "type": "file", + "size": 959, + "sha256": "42637a130c305b3e09d5959105bc9cef3a4a5475d41dc10fca0e51787669709d", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/Java8LibraryConventionsPlugin.java", + "type": "file", + "size": 4445, + "sha256": "b1c53c9d435d0dba8f7d5ede0f3cb5fee8d09ad901151950742c6e8ac71816a4", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/JmhConventionsPlugin.java", + "type": "file", + "size": 6011, + "sha256": "20b6aa55875d6cd2b379284e8770d672537783f6e36e2bf6b978ed85c86f15c8", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/LanguageDependencyModeExtension.java", + "type": "file", + "size": 689, + "sha256": "58e9db2f29e32c02320b025447fffed07015f0fdfa6d51165c700867d26d6c8b", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/LanguageDependencyModePlugin.java", + "type": "file", + "size": 5983, + "sha256": "dcd1636eed99558d6690616ee4530d6870133f4b0c562fa87f8ea37f858752e9", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/PublicationConventionsPlugin.java", + "type": "file", + "size": 4314, + "sha256": "1f55daad5a255db66bfcc03d77915309a6e723c9e27f599d4284fc6930c5f66c", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/ReleaseEvidencePlugin.java", + "type": "file", + "size": 5229, + "sha256": "862bda9b9a47eddc6543ba16cd91cf1dfd375c84228adf5cefb573a3840e0b01", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/ReproducibleArchivesPlugin.java", + "type": "file", + "size": 5341, + "sha256": "4cdcb99db90de28b3c1eb2d0aeac12a156c4eba756301e0583370e94eb91ce08", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/RootOrchestrationPlugin.java", + "type": "file", + "size": 30028, + "sha256": "7516a92148775c5d2452ffe39796bb0f2a880db4fa4484ebe889974b0074a3f3", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/package-info.java", + "type": "file", + "size": 624, + "sha256": "30e5d17a2c9e6d96510e2fd4e32e779bc7d45eb21c05a16c7a958812e8ae6ac1", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateApiClassificationTask.java", + "type": "file", + "size": 8157, + "sha256": "381b1806eb860154039563889c0d4f1b8bc85dc8888c4cbe1632ef077a5dd3ae", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateBenchmarkEnvironmentTask.java", + "type": "file", + "size": 2366, + "sha256": "1c55bcbcf8ecde993789dab8fe84938eabdf9fe2e442346d58ae9c596a5002de", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateDependencyEvidenceTask.java", + "type": "file", + "size": 7309, + "sha256": "89c677fa945d1c0016f1a3078dee32b69e23246098aea12ca78ebd76e170affb", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateModernizationReportTask.java", + "type": "file", + "size": 25623, + "sha256": "bf2f73af3266363c1198d17e2270c545a8c99a33552e77fdd0d2d8f161495ed3", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateReleaseReportTask.java", + "type": "file", + "size": 10397, + "sha256": "43d73c7fb559fb1469990549b4a6ad822a4aa0d8093292db1a3a48a82ea0824a", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateSourceFingerprintTask.java", + "type": "file", + "size": 6907, + "sha256": "d062a41ece8a52b63e427e3af291d7c76cdbbb044b0e4ed6c05261ffc94b49a9", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/GenerateWorkingReportTask.java", + "type": "file", + "size": 33363, + "sha256": "f70eeed0768d67a9584bcc6f59fa5906b0c21270845c5e5d0b0575f428e8b8d5", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/ReleaseEvidenceJson.java", + "type": "file", + "size": 20127, + "sha256": "c394c45fcbac3a4568eb9d6c68233763977b14a15e440c9133a7fa5e587141d9", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/StrictJson.java", + "type": "file", + "size": 11731, + "sha256": "2515d0ddeeae2718807eb73518b0834bdd8fa04a9fd752c607c13878810fe58d", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/VerifyBexArchitectureTask.java", + "type": "file", + "size": 14409, + "sha256": "c9b82652857e125e138b5cb90a8c25e17fb4599b1a48b97b6af3a7acd362272a", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/VerifyJava8BytecodeTask.java", + "type": "file", + "size": 2712, + "sha256": "d47b1deebacadc83e9b3ddb4b7da014a369f3a973415350d5e2d7556e2a6d7a7", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/VerifyLegacyLanguageImportsTask.java", + "type": "file", + "size": 2714, + "sha256": "d603ea98b018d8276d6a39eb01e62a864bc554f384ef01c54aa90ff62b0a01fd", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/VerifyPublishedLanguageTask.java", + "type": "file", + "size": 12911, + "sha256": "a2be4c907d90f42844a8396ff6fac3666d82b84189d9220212778733a96d7a2c", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/bex/buildlogic/tasks/package-info.java", + "type": "file", + "size": 514, + "sha256": "daccc1edb860910c8120487cbc68d11ce055f1f113357f409af451d9ef3217a0", + "mode": 420 + }, + { + "path": "build.gradle.kts", + "type": "file", + "size": 1655, + "sha256": "c668a3b1e1bc09498a1205ac01aee414e8bd2be411087bb716b90aef8ad4ab79", + "mode": 420 + }, + { + "path": "examples/build.gradle.kts", + "type": "file", + "size": 676, + "sha256": "6c216295f6c29d58f054546e812168ba03ccad553ccff9ed2460eb2700d01df8", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/bex/examples/HostedBexExample.java", + "type": "file", + "size": 2336, + "sha256": "4ba49f33fa36931eaa80f54086c453d1a201cff48f6cc9dbed1b495b90acc4f3", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/bex/examples/HostedConsumerSmoke.java", + "type": "file", + "size": 12371, + "sha256": "a0b78575d767ffe5746d983f0a1d5c74d9bb08620ab0e5d86d5c2c34d940f86d", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/bex/examples/StandaloneBexExample.java", + "type": "file", + "size": 1761, + "sha256": "30dce9b0d7205aa3fae2d9a7c4e0beaa2a46067597545bbe9569188298cf2886", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/bex/examples/package-info.java", + "type": "file", + "size": 464, + "sha256": "c95bba4d1a3873826d9c83b1ac78e7680e778827cc06cc585807dc85b3c0798d", + "mode": 420 + }, + { + "path": "examples/src/test/java/blue/bex/examples/HostedConsumerSmokeTest.java", + "type": "file", + "size": 706, + "sha256": "1e026d026d45432aea88d5df6cab65603235e49c899d2597d0ae95fda8cc4164", + "mode": 420 + }, + { + "path": "gradle.properties", + "type": "file", + "size": 132, + "sha256": "f77a6c20a1196fbc7c4939db550ad0660e5b65fb813f305d6b9df2ea9f37f191", + "mode": 420 + }, + { + "path": "gradle/verification/api/modernization-added-descriptors.txt", + "type": "file", + "size": 70177, + "sha256": "5cb3e8a2ef872d5f2334e9251feca3c083f5c887a76549ce3dd60e2b40a03987", + "mode": 420 + }, + { + "path": "gradle/verification/api/modernization-removed-descriptors.txt", + "type": "file", + "size": 32704, + "sha256": "7d3ba5a5e69ddf8e2fee0d92c924cae3c4dd36d42e465dc9931c550a99db2d99", + "mode": 420 + }, + { + "path": "gradle/verification/api/working-checkpoint-public-api-classification.json", + "type": "file", + "size": 4268, + "sha256": "0c3486c3bc2e7f4426e8e3973e74a2319457ccb911bb6da5ab03e6ea23f4a742", + "mode": 420 + }, + { + "path": "gradle/verification/api/working-checkpoint-public-api.txt", + "type": "file", + "size": 53857, + "sha256": "43aea6ae9de6f39729f93c146ff5453887da9a2303f6f4f33573ba47f37d5be0", + "mode": 420 + }, + { + "path": "gradle/verification/latest-language-baseline.json", + "type": "file", + "size": 6283, + "sha256": "37f0aa9141e53d2ce77f15b5ac4bbea4465be44076e99f0a4a1eacf056680a79", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 281, + "sha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9", + "mode": 420 + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59", + "mode": 493 + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8", + "mode": 420 + }, + { + "path": "settings.gradle.kts", + "type": "file", + "size": 2275, + "sha256": "7bc0cf50e5a8f56db2bf391aa13e18afa3a1b3501f11ba90e7ce18a4db8632b0", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexAccumulatorPointerConsistencyTest.java", + "type": "file", + "size": 9900, + "sha256": "2328936f901c1f04e17b9fb010f56f752b46b951ee9a2029eaa7984fd2986bfc", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexBlueTypeMatchingGasTest.java", + "type": "file", + "size": 24660, + "sha256": "40424359601c8fe4e9ae762ba4ca2aa08231d162b81c714c3de5447f2499e242", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexBlueTypeSupportTest.java", + "type": "file", + "size": 32052, + "sha256": "fb4f4d79363c5b38bc5b7ab350466f524de781c88f027b3ab745fcb804053994", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexCompiledProgramCacheTest.java", + "type": "file", + "size": 10004, + "sha256": "b169ebe96c7e9dac0d7521f2b485c494888311869f2a2012fbdce94e9bff0cf9", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexCompiler20Test.java", + "type": "file", + "size": 9531, + "sha256": "4989b31284db86b19eea368dee78e62dc5e1d03214c9b8645c7efb022737fb10", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexCompilerScalarNormalizationTest.java", + "type": "file", + "size": 3992, + "sha256": "9fdb788c2317dca15a4f20a20098a6eff2e27e99578f3a45fc1749a2d3148bf2", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexCompositeExhaustionEvidenceTest.java", + "type": "file", + "size": 45647, + "sha256": "605f450d647359795aa29bddb83e8e07096bb0315e9184d6a844fd2d796afd40", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexConcurrentEngineIsolationTest.java", + "type": "file", + "size": 7498, + "sha256": "d35de55b920d72567056cd48d7c9b9c37c3102c7d0aeab4dd43c2cca0758d80c", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexContextReadTest.java", + "type": "file", + "size": 812, + "sha256": "ddd7955472ee5f6ad478d2e63a1f4d760a68fb295a7dfcf1efe483f17b5f795f", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexDependencyBoundaryTest.java", + "type": "file", + "size": 1984, + "sha256": "f71e093595c69b91319f420423a0ca2ea5c8e31ef78f2eae9ce347b57d205d17", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexDiagnosticAdmissionOrderingTest.java", + "type": "file", + "size": 10589, + "sha256": "ee8634a831f9592dbee342ff8c4587cb7355833d6f5fcd61ada2cc64ee625902", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexDiagnosticsTest.java", + "type": "file", + "size": 2157, + "sha256": "70a89088e3e66af7493a5528a8d3aafa03344af495d70c7c78095443d680837e", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexEngineConformanceTest.java", + "type": "file", + "size": 31919, + "sha256": "2bdbd863535005bb5f498d1e2c2f30d3763f28070bc722c3f4cc96c72a375ffa", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexExactGasRuleTest.java", + "type": "file", + "size": 12745, + "sha256": "9d35cef7c158576b64c45bb8636c557a5d84806c513bb029e7f385823679152e", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexExactReferenceDocumentTest.java", + "type": "file", + "size": 22084, + "sha256": "34eb55d0ede1ba501f864204459373a37c604316e806b6335a8157f10494bcce", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexExecutionEvidenceLedgerTest.java", + "type": "file", + "size": 11086, + "sha256": "22e2b7b93e6fcd22c7ad722feb35134eef1701cf7fdab32b039c5b8107c8063f", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexFocusedConformanceTests.java", + "type": "file", + "size": 16720, + "sha256": "6ba4241cdb0e06db3a1fa835897086966859f80ea8e4f8b65bab868a64699787", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexFrozenValueTest.java", + "type": "file", + "size": 1041, + "sha256": "ee7a7c6cfe037cd458d6ec0eded7d5e332508947191deeeb80f13c6674abbc4f", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexIntrinsicTest.java", + "type": "file", + "size": 25356, + "sha256": "f1247571c740f194324c341539b71dd2f667eedfa6487e83ac8a8eef42670210", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexLazyBindingTest.java", + "type": "file", + "size": 37694, + "sha256": "304c66591a1a874b922be373284d92ceb862b0088d263493fd735eb9efa51d6c", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexLocalBenchmarkTest.java", + "type": "file", + "size": 1133, + "sha256": "6cf6b4c60bc1004e18b0633212862035331edeea23b3c5db6adf595ec86a0cbe", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexNodeCursorTest.java", + "type": "file", + "size": 1509, + "sha256": "b89d920ab627417c41aeed86250b805f57289b31e7e704ef24f90f38b67e0cc7", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexPointerSet20Test.java", + "type": "file", + "size": 7218, + "sha256": "e62a35ac859da7a2b6dacc2e50fa962630ba4dab72ad54bb949c42428fa8a4d7", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexPrimitiveExhaustionEvidenceTest.java", + "type": "file", + "size": 2742, + "sha256": "f0c92e60dc3f2f65b24d0cda13924bbd3bf435cb554d58f2327930d7eb837684", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexProgramParsingBoundaryTest.java", + "type": "file", + "size": 1645, + "sha256": "039a78ca689a95d7a80455c3594ebb918471d7ad7dd0a659e01be429f3dba1ce", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexRichFixtureTest.java", + "type": "file", + "size": 24091, + "sha256": "e18f08409a4ead882a4374e2ae2fea567d6ee5e36d6ac975696b6e91507db385", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexSchemaValueTest.java", + "type": "file", + "size": 3905, + "sha256": "162ef654bb38820fd7a3568895d36de8b4ad320fa1309a5139fb71ad9aed35e3", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexStructuredReferenceEvidenceTest.java", + "type": "file", + "size": 7645, + "sha256": "caae93426d5bbc1cb8d4684a3ec8952b3bee9925366d343b0294941eb678f67f", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexTranslatedCorpusTest.java", + "type": "file", + "size": 37928, + "sha256": "d76da221a03f0f0a2feca42df20214c3164e756c0d53ea7a8cbe184e301670f5", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/BexUseCaseConformanceTest.java", + "type": "file", + "size": 17488, + "sha256": "b4dbd5b4672ea4e7278ca5120e4eaed83ff47f596cfb1142d4501c8e23c87a7f", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/ExternalCustomerPayNoteBexFunctionTest.java", + "type": "file", + "size": 9829, + "sha256": "7175050f262fbc95fed91d3bb0e7c9074adc14bff9b9f7c1fa3145e875a67799", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/api/Bex20ApiSurfaceTest.java", + "type": "file", + "size": 11295, + "sha256": "2220e12453467c8fbe8d54567d7dc6985ed226b737b4c1926c6e9304ea50aec6", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/api/BexEngineBuilderValidationTest.java", + "type": "file", + "size": 771, + "sha256": "67c703cb5877cf406d8c4dbfbdc4c098f4615843993c20a9abb5d0823c0a8982", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/compile/BexCompileBoundaryTest.java", + "type": "file", + "size": 3533, + "sha256": "d26dd0a5a97152f0635e750557745d50defd10c50928625cd7783d077876a1b7", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/compile/BexCompiledIrImmutabilityTest.java", + "type": "file", + "size": 10190, + "sha256": "26f3fe9ec6fdd2848ad09e48698556165f1ed3c504a9baf466a21f828a30c991", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/compile/BexOperatorCatalogTest.java", + "type": "file", + "size": 11260, + "sha256": "8ba16202e7dd31682ba1d65a49b46021d5bd13eed4e070bf6bf33bfad60d9412", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexBinaryApiManifestMain.java", + "type": "file", + "size": 9006, + "sha256": "ef2f105f3331a524d31361a630fc13440365d6625ddb764a889535b5991f698a", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexConformanceDocumentationConsistencyTest.java", + "type": "file", + "size": 5041, + "sha256": "64371c182c009ab62b7962cf23b0d7f0e44b16fda5c9bb3b17120803e6ee9c16", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexConformanceFixtureTest.java", + "type": "file", + "size": 1177, + "sha256": "f74207dffc9ec85c929be428ebd5791faeefc6d4304e844b03f904d5fd4a1a71", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexConformancePackageIntegrityTest.java", + "type": "file", + "size": 25509, + "sha256": "d6882178a9d3def44e1ab7e28a91c7b64a3195a11ca71a692be89ea0a851d488", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexConformancePropertyTest.java", + "type": "file", + "size": 12293, + "sha256": "8c0fbcc8eee84e2054a73beb80c861f2554fde23e8aa4f40817d292aec93e4c5", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexConformanceReportMain.java", + "type": "file", + "size": 236997, + "sha256": "12283aa9d744cd043cf24880cf24dce276ae5e7b12f40065c550a1c41b909bd9", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexConformanceReportTruthfulnessTest.java", + "type": "file", + "size": 16757, + "sha256": "468b1a34be15c2f20cb90c8e0e01af7d3f4ddc5406e8cf94611ccd99e689cdd8", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexEngineFixtureAdapter.java", + "type": "file", + "size": 29065, + "sha256": "013300adbf2f606919077e94191706a2ad57b41f99890dd31f11bbae9df33b20", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexFixtureRun.java", + "type": "file", + "size": 6360, + "sha256": "43d60bfd7eedab8f554d6996f0ddf203b23aa7dd19e7662db7fd437e26bde14f", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexFixtureRunner.java", + "type": "file", + "size": 31740, + "sha256": "e07f860bc20a5a1c5dca4578f65ab228bd4a5e12ad6294ab5cc8d4e890ab9a96", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexFixtureSchemaValidator.java", + "type": "file", + "size": 15439, + "sha256": "310274a76e37dd0cb62584bebb50de48533b4102a4117f19e715c4126bf81593", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexGasMicrofixtureTest.java", + "type": "file", + "size": 4515, + "sha256": "1b74e221bff2d3fdc55b536bcbc7d1206d1ef15251cb80490b782985e3f2c82c", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexModernizationPropertyTest.java", + "type": "file", + "size": 15202, + "sha256": "f61645a4d7905685f75e61a06034e133a046cc8c3f9c0c0810a37398562b82cb", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/BexRepresentationInvarianceTest.java", + "type": "file", + "size": 33320, + "sha256": "0169ba43beddd14e5367b4e36da9b1b26a3b4efffe33856e395db8baff3e6f4c", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/conformance/ConformancePackage.java", + "type": "file", + "size": 21992, + "sha256": "af11aa4c82bcb14b1eeaade022c1602c6cb2408d7b58578317830a7f12c159b1", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/gas/BexGasPrimitivesTest.java", + "type": "file", + "size": 15708, + "sha256": "ff363a4ecf8ec9ae94d9fd2811b3b4e46df193245663e8ea17e1c49f1bf2956c", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/output/BexSemanticIdentityIntegrationTest.java", + "type": "file", + "size": 30206, + "sha256": "3679e1768be8f9db10902bef364e4c7b6388ea1ce2ca9119da774fabcc14a5df", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/test/BexTestFixtures.java", + "type": "file", + "size": 4988, + "sha256": "7247f381a44803d2b60e741b8cddfd82ae785f08a7bf044770c3379a45db9afc", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/test/BexTestSupport.java", + "type": "file", + "size": 175, + "sha256": "a6d578c41980acf8afe6a337e71026e72de21ee89604251aef5bdf36df2df9df", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/test/TestBlue.java", + "type": "file", + "size": 10550, + "sha256": "176724a179560b8bf2cbd95e5e08a95e7d35fc8113dc3091cea42298ba40cfa8", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/test/TestGasLedgerCapability.java", + "type": "file", + "size": 2334, + "sha256": "a9ff2123a4f618236483c76044d799c9b8e9ff419cd887a95cfb0869e82bc237", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/value/BexUnicodeOrderTest.java", + "type": "file", + "size": 5655, + "sha256": "d30427b7d329976be3ba2a1a81c1c0f654128955f43adfc5b36a05f7015789d0", + "mode": 420 + }, + { + "path": "src/test/java/blue/bex/value/BexValuesIdentityValidationTest.java", + "type": "file", + "size": 2672, + "sha256": "2b1588258f45917c0ae701cad43d1f4850768042b42bb59169d2aa7e1c768048", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/BexHostedRuntimeWorkSessionTest.java", + "type": "file", + "size": 72873, + "sha256": "381b0862a91b951925979c31f767be1454927a229b30cb91f093da4dcf83da1e", + "mode": 420 + }, + { + "path": "src/test/resources/.gitkeep", + "type": "file", + "size": 1, + "sha256": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/HARNESS.md", + "type": "file", + "size": 6357, + "sha256": "13d8124d59aa495f41cdc40f68d38be0299dc61765b4b7271978d728e8376b03", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/README.md", + "type": "file", + "size": 562, + "sha256": "a0776a0e1f3c21b388369a7ac92506d2ceca34d3d813cced09f627d253cb42f9", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-01.yaml", + "type": "file", + "size": 410, + "sha256": "ee53d235ef84975ebfa07522703376ddec0a1596510e90704e923c91122a7208", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-02.yaml", + "type": "file", + "size": 366, + "sha256": "7048150c8ada99b6ca8b0aec03207c64ce36dc0467f4dd5cebc1e5ffe4a8f32d", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-03.yaml", + "type": "file", + "size": 548, + "sha256": "09ea76a45dcb6050f6d37583cc0e5150fd558579d7437d4d54d326a5dea344ed", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-04.yaml", + "type": "file", + "size": 532, + "sha256": "a35e4bc4085fac1b9165405d99bbabbac99072c04285617d1c4c78d669227da9", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-05.yaml", + "type": "file", + "size": 401, + "sha256": "4cd913396f64323b143c215c4bd6c1128eb010cb351d5f032f7ae80392f3e70e", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-06.yaml", + "type": "file", + "size": 395, + "sha256": "8a33c2f91a2c60b73c14fc56d30bf409e92b4534352265b7e56e3d1fbbb74da1", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-07.yaml", + "type": "file", + "size": 394, + "sha256": "f54f939c684f63b4671a02513ac41bfc89cbabcb78e47a4047c159a12d07bcc0", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-08.yaml", + "type": "file", + "size": 545, + "sha256": "d5bc2709eccc3c563268947024f56ecaf57fa460ca8339d3941d101da9437e71", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/c/bex-c-09.yaml", + "type": "file", + "size": 702, + "sha256": "eebecf5d37c7ae74864d02253cd9b10c3b11b51e81efe431cd2616b934b0e745", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-01.yaml", + "type": "file", + "size": 488, + "sha256": "836858985f3f236ff0991e9e2ef3474bad63b76cfd205a4c3410014a95579b62", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-02.yaml", + "type": "file", + "size": 950, + "sha256": "3d4b27d8c14ebc7d3140b01a5cd7639f9ec58d89674d7703bc9c724722c1a115", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-03.yaml", + "type": "file", + "size": 438, + "sha256": "61e1a9a5bf0e94ec2e185c0c6209f14fa5730cb3edbcd1e2dc84b3e5358c442b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-04.yaml", + "type": "file", + "size": 358, + "sha256": "f87ab28a19edc630a9a1344e90490679b629bc1c5d2bff9d7bef5ceda4401192", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-05.yaml", + "type": "file", + "size": 569, + "sha256": "f3950c865c676c86fc79570dec67f89a9da856929319ad26f6bdd06a61d2927a", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-06.yaml", + "type": "file", + "size": 532, + "sha256": "eaf1fd4df0d4c1ff612d1dd0c769dd2954388fa7437e9886ca6dc36286964862", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-07.yaml", + "type": "file", + "size": 465, + "sha256": "9af6cb4552f1fd4bb12131c572dcec702caa90c39ce22d41ec269306081aca2e", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-08.yaml", + "type": "file", + "size": 556, + "sha256": "e0871e785c2e8db89e43a5aa3524659b7d548c2d1fce00712f4366b1d3e9f991", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-09.yaml", + "type": "file", + "size": 432, + "sha256": "ce8d3c066e4b4767488a28bae0f276bde1736e09a73a9ac62f957d787351f18d", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-10.yaml", + "type": "file", + "size": 630, + "sha256": "e3c138103cb2aa3911a1f0385851c3c085ce8ec7a817cc8ed00645b5e4b21022", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-11.yaml", + "type": "file", + "size": 539, + "sha256": "75be7b11c8d80cc6c93096eb26c4c77ee4786dcc5f7fc9322a0a1e9e200e9a51", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-12.yaml", + "type": "file", + "size": 459, + "sha256": "d783cb9f47b7abe6e509646b8d42eaac3c8c4d6392811b000aa82a8be86ec34b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-13.yaml", + "type": "file", + "size": 619, + "sha256": "76233a657a1d4f54e0263d6e8e8ad14c4ffb902496791643dc4b50fc08ffbad1", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/e/bex-e-14.yaml", + "type": "file", + "size": 577, + "sha256": "92f074b34268640dba1c9e1572b8f14acab6c3199afa2ad3da43f8072f60cd04", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/fixture-schema.yaml", + "type": "file", + "size": 3062, + "sha256": "a808d5fb6fe7f7596fd12b17b8c10873f01c0b8d731c845c3bfda2c0e570b6dc", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-01.yaml", + "type": "file", + "size": 405, + "sha256": "fecea8ce022312ad088d896a2a74ecebe65eb98812bb65c94e9178e76b73a8fe", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-02.yaml", + "type": "file", + "size": 479, + "sha256": "ea3d4ccb6875b028f0450ba544a5ff3fdafc5f61a395134aa0aa99f07ee15f58", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-03.yaml", + "type": "file", + "size": 431, + "sha256": "12c4988e7c1fe5f6192cab1fb1edbd141d589d7e2ad3272a4c366c4bb46f9e55", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-04.yaml", + "type": "file", + "size": 455, + "sha256": "13431d270811c4bbffe5e97a81efb9b2d7039618f6696493972bb2a8dcdcae42", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-05.yaml", + "type": "file", + "size": 504, + "sha256": "551bd8e30d73ab0ac1648f7cd454db8d59a4f5a9fc7f330802eca42b62d2fd97", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-06.yaml", + "type": "file", + "size": 426, + "sha256": "11d24cbe5ef1638467c6fdf7894642ae35cba21401594914d486af2ce14ab09c", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-07.yaml", + "type": "file", + "size": 566, + "sha256": "d8a573d9da4908d4ee31de5c9f42125cc0cacbf6cae8eff4ea52809966c04fb9", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-08.yaml", + "type": "file", + "size": 630, + "sha256": "42c1233c24302a8bf024bcab2fcb928326642bc630efb9020981044e80ba92d9", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-09.yaml", + "type": "file", + "size": 529, + "sha256": "6714c4d282e84f519c79184d5fd107c079b2292350a4ad0c7503dd9a0e5269fc", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-10.yaml", + "type": "file", + "size": 446, + "sha256": "3acc46272cdf689fc8a056b076a983f2127574e29642ae389e46800ed7c5c952", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-11.yaml", + "type": "file", + "size": 734, + "sha256": "9aabc381fcaa664a604677ed9443468e9064c1c7d11e3bce4a43602aa5c7d074", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-12.yaml", + "type": "file", + "size": 471, + "sha256": "9786cf7d092d88301d07bc894cbc662fdc28c140c9dbe753a55a7a803e190e45", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-13.yaml", + "type": "file", + "size": 505, + "sha256": "d0e220e81a34507de62c6158acd704b3ca94153d888dfe749416220a54f07b61", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-14.yaml", + "type": "file", + "size": 559, + "sha256": "e06fcda179f2328eb572b4f219ffcb8cb7b83ba1d562e51b9efbac9a7802c7b5", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/g/bex-g-15.yaml", + "type": "file", + "size": 1611, + "sha256": "6c8ac6135a3e084b565d7b5a95ed25f40b264ee4067431373b6fd58345aafae9", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/bindingRead.yaml", + "type": "file", + "size": 294, + "sha256": "48c74333edf208948399697fd2cf9f2756a7214638184d3d1a59f01f3ef91396", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/blueOutputBoundary.yaml", + "type": "file", + "size": 317, + "sha256": "856d77bbad92e0e7a2cd127ee9383623ccc6bc1bd6367c246046ae4c62c7f399", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/collectionItemProduced.yaml", + "type": "file", + "size": 327, + "sha256": "2423546ea05fdddb8c3accc6bd1e7741c3ca45e07d82e24861428de6fad458ac", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/collectionItemVisited.yaml", + "type": "file", + "size": 324, + "sha256": "96b841734fcd7297ac9afe59142c1ce1938a03ef124201d63ad8d5abbf655fbb", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/comparisonNodeVisited.yaml", + "type": "file", + "size": 324, + "sha256": "dd9883f1822d0c16a468d158baa1374222856469d61342d17969cc9e0e154f8f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/constantRead.yaml", + "type": "file", + "size": 297, + "sha256": "c0ad6db3ae4b5e8d09632b07ab5cce216ac70029227938a38301d6c88dc111d9", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/currentContractRead.yaml", + "type": "file", + "size": 318, + "sha256": "b47c2984e10c9b375ec113f1764327207e3559fa0c2eb6cc64ee45a967f103b5", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/documentRead.yaml", + "type": "file", + "size": 297, + "sha256": "a78abe1756f3310c13954645e6bdd07efc8854adeab5429b057798417cbda087", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/eventAppended.yaml", + "type": "file", + "size": 302, + "sha256": "804e72243b0feedf1cd25593236f5bdbfb036b7725b969e29d4c3d42ca0c83b6", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/eventRead.yaml", + "type": "file", + "size": 288, + "sha256": "d3b632611e719f744d33276db44bf5e3a0425282d202e9f5874f40ee65136bb8", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/expressionEvaluated.yaml", + "type": "file", + "size": 318, + "sha256": "9e7c410124a827f3db400df5c0f698ad3cde21b8497c6046dd371a99e141ae2b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/functionCalled.yaml", + "type": "file", + "size": 303, + "sha256": "a869fc9365e7a6c051807ef5060fd5cc0cb8a226af1b88d5f2b9755f16da8cee", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/integerLimbOperation.yaml", + "type": "file", + "size": 321, + "sha256": "a81c5f5a9bb88f555cc1af3dc42c86d822e3fd92168f85390d42810fb8ea875e", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/intrinsicCalled.yaml", + "type": "file", + "size": 308, + "sha256": "6496f03c3371fde3c35f8229bb974ba1b445aaca8f501ad6a7c549c08d58f887", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/listItemRead.yaml", + "type": "file", + "size": 297, + "sha256": "9053b1b4cf7276cf8b61cfdf7a246289dcada9c4865002dc022f8f519f7f28c7", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/nodeIdentityRequested.yaml", + "type": "file", + "size": 326, + "sha256": "811c14244cd6229fb3e74cf3f2f85cd10962f50c5b55fa5c474549e6b19e38b7", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/objectMemberRead.yaml", + "type": "file", + "size": 309, + "sha256": "5f78e274b30ab1ffbd42798ffd729e597a60f97dd34c29ab4d554afe69061f10", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/patchAppended.yaml", + "type": "file", + "size": 302, + "sha256": "39d96690e7a9a74cf773386d586dd9304cd4e3a475665e618546ef3e8b831b52", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/pointerSegmentRead.yaml", + "type": "file", + "size": 315, + "sha256": "6aa9d690cc679825796435fbb1400dbfb181026c2fcda59e4b84b618fd931bb0", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/pointerSegmentWritten.yaml", + "type": "file", + "size": 324, + "sha256": "af83965183b70e61e79c2ad85c81e927fee225ccbf5e90a40ad06f9bf2027b12", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/processingEventRead.yaml", + "type": "file", + "size": 318, + "sha256": "faf6ee6581f3af0c4e619c2c7f98fee4f3d271ad2c08503c090a91275835034b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/resultValueRead.yaml", + "type": "file", + "size": 306, + "sha256": "c8e28ab6fc2e25a77325ded00233a3e22552868b20f24207da24d2128b4eccd1", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/sortComparison.yaml", + "type": "file", + "size": 303, + "sha256": "a6c017e9782ebf33d665452a6e765c1357f2f95d786826fc04b5598b69fe8f99", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/statementExecuted.yaml", + "type": "file", + "size": 312, + "sha256": "4a6f3328dc3054266af6f3fd9bbf7cdda4bbd4c7d8af2da661979d363731e2ea", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/stepsRead.yaml", + "type": "file", + "size": 288, + "sha256": "dbb8b6fd022d2552466f4f19f0d854fd4aae21cc4521a64f8d4b4b462d241904", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/textBlockConstructed.yaml", + "type": "file", + "size": 321, + "sha256": "19af7af1641a13f9c861ec3125c1ac02631af263773cac338b7c1a0501227bde", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/textBlockExamined.yaml", + "type": "file", + "size": 312, + "sha256": "45add971e3c0193615050e6fd2bb4c759e6dc3fe0cbf6e9b4c70b5ff21c8f7af", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/transientListItemProduced.yaml", + "type": "file", + "size": 336, + "sha256": "e709abb607253b9d669e204580a7a4441bc4cf8559fee932a75ce88a5048c28f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/transientObjectMemberProduced.yaml", + "type": "file", + "size": 348, + "sha256": "87dd0f408f5fde60f555aa04d769e533e30e744fd6aac65c06077083ba059e9e", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/gas-micro/variableRead.yaml", + "type": "file", + "size": 297, + "sha256": "fa36b05b04d05b44baa3e5e19ab0e25383a32d56c14d6749e1bc6502e865dc60", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/h/bex-h-01.yaml", + "type": "file", + "size": 1543, + "sha256": "dbcbff932acb97e02345430fac468a6e4cfd4f561f1e1af66afb70aa676a44d0", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/h/bex-h-02.yaml", + "type": "file", + "size": 679, + "sha256": "e973d8bbf330beebd653544e5f17fea45939028075ac3475c6481886c7450384", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/h/bex-h-03.yaml", + "type": "file", + "size": 506, + "sha256": "348ab512dfc061b5ddd98b1d709bfd2ea41e7cb5f238d270bf91d06c4c423c59", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/h/bex-h-04.yaml", + "type": "file", + "size": 476, + "sha256": "2c9718b445a5b538cddbeb1b5fb7207ffa5dc974321987ec3cd361e91544778f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/h/bex-h-05.yaml", + "type": "file", + "size": 557, + "sha256": "e95611f3f5f3add44c305d4ae5d55d9f96273ee9171e3e11b429733b3e98622b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/h/bex-h-06.yaml", + "type": "file", + "size": 751, + "sha256": "ae59f52d1d227e16472c86df67707a0f333145fe7c1101eb88c9749bb81f72c6", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/manifest.yaml", + "type": "file", + "size": 20984, + "sha256": "b31e6f483bb8f16a6ce94db5aa99fa3db355b592ef669616ecb64189ea4d7f60", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operator-coverage.yaml", + "type": "file", + "size": 6859, + "sha256": "98219b5987057767e498096d42242e9b8326fb631aa429efc820126d3ba216fd", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-add.yaml", + "type": "file", + "size": 355, + "sha256": "fced17f3d8f26a4166932871348c6b7486c9732cbf8fd7fefd9047af21edc99f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-and.yaml", + "type": "file", + "size": 384, + "sha256": "f80d2d38e47689029ebd536897c312754cad597c8d6849a8eafc04075415b4c2", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-appendchanges.yaml", + "type": "file", + "size": 496, + "sha256": "da672a99563b05a76becb74e0fe082f1ff3da5ba75d73d368b679750986084c1", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-appendevents.yaml", + "type": "file", + "size": 398, + "sha256": "33bf1626ed3ffe4abe0eeeb189ac0acbfc3a4585bf91ed2b2876373ee4f877a0", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-boolean.yaml", + "type": "file", + "size": 353, + "sha256": "04bad12d51f721d82e8da635d76240ff40ed59b5fc8dacc9526b3675c156f842", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-changeset.yaml", + "type": "file", + "size": 509, + "sha256": "a6da9c756f899d0c61ae7b38794cd46c32872a1dc3112319c41cba68fe8f9e46", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-choose.yaml", + "type": "file", + "size": 411, + "sha256": "826db21a5d434a50e3cd84f5a125b0e19450e6994aa8e0681d4096fd903519b2", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-coalesce.yaml", + "type": "file", + "size": 415, + "sha256": "67f020de02ef65ec9bc54fa2de01816a3be7043600e72e37e5aa5abbfe20c513", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-default.yaml", + "type": "file", + "size": 391, + "sha256": "450a01b05f017a987c8b47eeeb3f3005974a53fa8e74749fabd6b1357495b1c6", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-empty.yaml", + "type": "file", + "size": 343, + "sha256": "96e6e2b756cd1800782c47bbd0d0dd0687ca3ab94f3fc8fa675814f81d9fd7b2", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-emptylist.yaml", + "type": "file", + "size": 355, + "sha256": "7d4df963252a887e354b640c70a97e04da1ef6bd2ab391111df4480e13df6f31", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-emptyobject.yaml", + "type": "file", + "size": 361, + "sha256": "460fe85577a38d572db7043cbb87a43dd7dc52cd261935e8d4340783e09e0947", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-entries.yaml", + "type": "file", + "size": 407, + "sha256": "9bd4d453c675f7d60d5f9ebc0bf5aeff020d172e82c7e53b401a50e48d2bef9a", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-events.yaml", + "type": "file", + "size": 416, + "sha256": "2a5aa1561eca672137f752a983fd9f1ef266a0f9cb4b0681859774a2dc28a1b2", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-failif.yaml", + "type": "file", + "size": 414, + "sha256": "c10947dec63fd1021b4bd33f4ee4a5c204331c23d25b897411707bee7094c3ce", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-filter.yaml", + "type": "file", + "size": 460, + "sha256": "28ac4fdbcaafe00fdd582a8c3f419462cae8952caf94644b573b3b7b8d13e4fd", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-find.yaml", + "type": "file", + "size": 444, + "sha256": "8e1f1509c0a7b3dfbbce4b65aaa6eae7d89e09414e655703603c957cbad12375", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-findentry.yaml", + "type": "file", + "size": 488, + "sha256": "e9edd0158af743933b37d1659702bd2ae9e3a3d0f4fb217f6786819e45c24420", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-flatmap.yaml", + "type": "file", + "size": 453, + "sha256": "3adb2b973f48c30d2c551f3c5ffe2beed4a284b2840e09c3f1f2ba5d9f0fde3f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-get.yaml", + "type": "file", + "size": 371, + "sha256": "a7b1fcf6fb15040863c1b29f0255714c049d22a6d63eeb910147d839c82742f5", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-gt.yaml", + "type": "file", + "size": 347, + "sha256": "bada572ba6be2d1cd0fe73f2d67bb830335b0e65a504e462ef722bd1cdb65d25", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-gte.yaml", + "type": "file", + "size": 350, + "sha256": "15f8d2a09dc28063cae4064a72c335b749ba208551bb0b2ed526d85b4af98db3", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-haskey.yaml", + "type": "file", + "size": 383, + "sha256": "d06db2bbcb4eaddbe574eab9be04179323173933590d43c5fa1aa83b44fc30c3", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-includes.yaml", + "type": "file", + "size": 394, + "sha256": "5c525b7a3969c0990b438e9118f58e70a34856a1595c7fa4152e441e95060165", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-isempty.yaml", + "type": "file", + "size": 349, + "sha256": "5f7bc6d8662c2d85f1fb3c416540c41bf16e288a847a2ef3ec8d26d90aadb8ba", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-iskind.yaml", + "type": "file", + "size": 399, + "sha256": "06d9522c7c12fe1442e8742402dbb494aa8b6d7414fc19e5bdd6fda72c4eba03", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-join.yaml", + "type": "file", + "size": 401, + "sha256": "36696057002ba4324d5c6b4ccdb4e218696fbee7a9ce27042767c9e83d467a36", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-list.yaml", + "type": "file", + "size": 340, + "sha256": "52537399e1697d3f00994e5af99f8e09ef0c3ae246e56b5cb976d2dfd38b31a6", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-listconcat.yaml", + "type": "file", + "size": 398, + "sha256": "f366feac444369710b7a64bed32f0d9724f1d0edea4dbcc0300d32e40df10b98", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-listget.yaml", + "type": "file", + "size": 390, + "sha256": "b3e9d08b660837df638801faed738e226d3daaf822c1aa79c8763efd2a762c82", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-lt.yaml", + "type": "file", + "size": 347, + "sha256": "625dd2caee9465bd9b75312676baa0be547192ee035fbf4ec936f2d074e42e4e", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-lte.yaml", + "type": "file", + "size": 350, + "sha256": "66a58976577f9fe940e630c0fe777c2cab25858eb47b08071b2828c78789361a", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-merge.yaml", + "type": "file", + "size": 386, + "sha256": "994845cc53b16858fbd0b73373583e85a3f0bfa921ca3317ebde3704b951530f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-ne.yaml", + "type": "file", + "size": 347, + "sha256": "d9224e5dffe307ed67d1fac7e483ca07e302b4446789da0eceb6e161a3127b31", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-not.yaml", + "type": "file", + "size": 340, + "sha256": "44128f91ab89d1fc80b2a3b6d68ed2b313f017758990dadb87e078ca5a7f4f9c", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-object.yaml", + "type": "file", + "size": 346, + "sha256": "ea2d7f40ef32b88be59cf8a752c08f4af41418fc2ec1166319c854609ed934b5", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-objectfromentries.yaml", + "type": "file", + "size": 441, + "sha256": "b1a9d4bf2a0abaf162709525028c8b726bb78d17e43780f034d7ce4ba78a064d", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-objectset.yaml", + "type": "file", + "size": 418, + "sha256": "51a95b9b91a448ee9487e2561b373b294cadeb7c02073c10034bb6f8758b7964", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-reduce.yaml", + "type": "file", + "size": 487, + "sha256": "f8e1c91188e86bec596c6b681fd951f531b004bc78fa985a9d03d255615f9a50", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-sliceafter.yaml", + "type": "file", + "size": 389, + "sha256": "93a5977dcd6694331769d11ff975965f77f668dd2210fe21854781ac30036fde", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-some.yaml", + "type": "file", + "size": 447, + "sha256": "5839dedf9932e3a54ffeb8e932df29b29269d44f5aacc647ff9c241ed8d2fa01", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-split.yaml", + "type": "file", + "size": 403, + "sha256": "631c17b4399f4d532a23e0c09a70eafceaf2bf251c4ee8c97521ca60cdab6d54", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-startswith.yaml", + "type": "file", + "size": 388, + "sha256": "0d26efdfa9e52d248cfbd9b4e93c5d0e2672f4e73ebf045dba3811b6d0802a8a", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-subtract.yaml", + "type": "file", + "size": 370, + "sha256": "cbb311a97da9125691eeac75025fff6b878e158a50db92ab99008b6099c319b7", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/operators/bex-op-unwrap.yaml", + "type": "file", + "size": 370, + "sha256": "c3444cd7ec3c4b49787f811d4456b85603cda485d8bd0ab72dafe7862a5d8d5f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/projection-catalog.yaml", + "type": "file", + "size": 3789, + "sha256": "d562daf891e62840596cd5d51fe41fda05ed428d67315cce0ddd9d49d883c8ea", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-01.yaml", + "type": "file", + "size": 839, + "sha256": "5f5466a3d0cbefb69d1c5820cf98066ff84edc780fdac1828f62a979b6c88a1a", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-02.yaml", + "type": "file", + "size": 1661, + "sha256": "aa63d39ddd63cd14bb812a655ba8b9776c34de611fe167490f6c833c4ac93f40", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-03.yaml", + "type": "file", + "size": 561, + "sha256": "927b09a71bc1995c75fb4af5cc5e0718ee172926f7bb1acde45217750d4cb40f", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-04.yaml", + "type": "file", + "size": 700, + "sha256": "caee85a57652734e0b95e5f1921e8ff7bef2a64f280d083f22665e5524615a15", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-05.yaml", + "type": "file", + "size": 684, + "sha256": "037b46f50d8587961f9d5ae5a698198811d1bcdd0e5979e1f9271e1c485579cb", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-06.yaml", + "type": "file", + "size": 812, + "sha256": "522744de0d426baf09e35ab869cbcb9f19c1aaec7948f6001e4ffa48b2f3eecb", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-07.yaml", + "type": "file", + "size": 798, + "sha256": "20decce24be6a9c433cc4a0982c6eb71ebec507d2843049f1fb56a2af8d8cf27", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-08.yaml", + "type": "file", + "size": 819, + "sha256": "424e372a1ac81fb897ced8f1a404038e028129ee802e8442ca36ec1a8de54410", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/r/bex-r-09.yaml", + "type": "file", + "size": 660, + "sha256": "4caeb4145d4632ebc6524d7c26316f63ded2ce17309dd5a894902ecc7d28c218", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-01.yaml", + "type": "file", + "size": 651, + "sha256": "22951c3b8f7cecab07a5e65333c348cd6e4ac0fcfe9be46965fd88accc88e076", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-02.yaml", + "type": "file", + "size": 504, + "sha256": "a5aa0e581d57f7fa8c3cc0e7fb5a4a34ba6dc7396b11da9f73491ba019e2874b", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-03.yaml", + "type": "file", + "size": 533, + "sha256": "504737bcab22cc6978a79c3c9fd47f34c6830a5630715d23b4a7a61163fbb1fb", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-04.yaml", + "type": "file", + "size": 427, + "sha256": "719b1fcad2b39ae79b0d3767f7b90a82dc82c505d45a01152155e07c9690ad4d", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-05.yaml", + "type": "file", + "size": 600, + "sha256": "f8821096153f36159f357bf20209274e5e9c06080c6aa4ccddcdee97df5f852d", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-06.yaml", + "type": "file", + "size": 429, + "sha256": "628269f621348f4609794b3c79a2c821312ef408d65041f2caecd749613171e8", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/s/bex-s-07.yaml", + "type": "file", + "size": 579, + "sha256": "3d02069db067dd2d615d0d4c00f4630dda1a0a9faf8c0b281add51472fb91b72", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/fixtures/vector-coverage.yaml", + "type": "file", + "size": 4570, + "sha256": "ded406cbf28e659ff2b0b7ab37bb839b1b64a2595555a3682cdbb978d922f8d0", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/gas-manifest.yaml", + "type": "file", + "size": 3249, + "sha256": "1f689e0cf51b0f9afa6b18a640e0c755470921a7b0d66f62bfc2206679de640d", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/registry/Compute2.blue", + "type": "file", + "size": 723, + "sha256": "b4f00a1f953e337982fdb668eee1e9fa987143c1fcfaba91cebd62a0a35956fa", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/registry/FixtureIntrinsic.blue", + "type": "file", + "size": 300, + "sha256": "8cfaf7cd9ff8bb4b833692001f2f68cda50179112d58e8f2e98fa2bfce72f4ea", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/registry/SortFixtureIntrinsic.blue", + "type": "file", + "size": 274, + "sha256": "243833c0ac8a34a11c976c20199c6a89e815361447b1578e86e526b2942ea18a", + "mode": 420 + }, + { + "path": "src/test/resources/conformance/bex/registry/manifest.yaml", + "type": "file", + "size": 1234, + "sha256": "1e6456aaa848a637107280de9135b4ddbdaa951436810f202be0b1cadd41ccfc", + "mode": 420 + }, + { + "path": "src/test/resources/fixtures/customer-paynote-snapshot-bex-functions.yaml", + "type": "file", + "size": 25701, + "sha256": "b0bf5c7e4f1a1d4088560fa2179fc8debba0de9cf631020dfeba226a9fffdf41", + "mode": 420 + }, + { + "path": "src/test/resources/fixtures/customer-paynote-snapshot-event.yaml", + "type": "file", + "size": 380, + "sha256": "355259503ff412e52b54d92f204c33e978c3490827eb496079644e233a94825b", + "mode": 420 + }, + { + "path": "src/test/resources/hosted-release/baseline.properties", + "type": "file", + "size": 1176, + "sha256": "cad18f411b69b890c7e1a2d23eb54bd602218e6764bdc32a20cae5049153e1b6", + "mode": 420 + }, + { + "path": "src/test/resources/hosted-release/gas-exhaustion-trace-examples.properties", + "type": "file", + "size": 1979, + "sha256": "6e1cddb47f31bbd06c0956878b4a2d6670911d6eab5db7187b79246cceb2905d", + "mode": 420 + }, + { + "path": "src/test/resources/hosted-release/published-api-inspection.properties", + "type": "file", + "size": 1712, + "sha256": "f889b0d1e67821cbfccb4fe16e310a2762f10d753cdc383e3590c0829cdf8241", + "mode": 420 + }, + { + "path": "src/test/resources/hosted-release/required-public-api.txt", + "type": "file", + "size": 69568, + "sha256": "5acb4712e3e03c5ba9a58d87b4a40bed4e1dcca76ed58ef355a77f0efc9d3c92", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/01-is-node-primitive-true.yaml", + "type": "file", + "size": 1393, + "sha256": "3fa086dc3f81bc6c54de745c96368606b039b121166d44201f312c85874ba03b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/02-join-list-success.yaml", + "type": "file", + "size": 1409, + "sha256": "17a3d21519270faab608a5b5009119ad71d95bb94c84901fd7a68cf08e2c77b5", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/03-const-known.yaml", + "type": "file", + "size": 1378, + "sha256": "86b781b6a8eec10b395bd812b9f5bb1a4e4c8ea7491c9bed54b0fbf1329bb8ed", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/04-const-unknown-compile-error.yaml", + "type": "file", + "size": 1424, + "sha256": "9dc9a9671642b42ed81dbd55219762feff77000c8aa0f16bc5516cdb181ee0a3", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/05-literal-preserves-unknown-const.yaml", + "type": "file", + "size": 1411, + "sha256": "0890d9c8e732685aaf7b73bb606fdf694f3524ff54d13918ebb7a3e833a7950f", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/06-literal-rejects-bex-in-type-field.yaml", + "type": "file", + "size": 1518, + "sha256": "b5e62cf5001deede7be5bdffe709c17cbbd81cc45655480f02bfc3898e9caf28", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/07-function-typed-integer-pass.yaml", + "type": "file", + "size": 1509, + "sha256": "e7ae008b83c2000136881ac595d7e5d225fa502096a98c26749a6433b2c87e56", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/08-function-typed-integer-rejects-text.yaml", + "type": "file", + "size": 1578, + "sha256": "1361a13e60822e3d1b2856d67ead0d059d2f4185ceb3c658f05b83b7daab1124", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/09-function-structural-pass.yaml", + "type": "file", + "size": 1980, + "sha256": "4b15a3f52374679d0cab84da9be8afb69f770e3836b21868d2df4e823d1e898b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/10-function-structural-missing-required.yaml", + "type": "file", + "size": 1677, + "sha256": "85f6f58082befc683770fb405b85c676d6882e7c9053d947beb85334a548a42b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/11-function-extra-arg-compile-error.yaml", + "type": "file", + "size": 1562, + "sha256": "0c440cc867e91f0223458a006f9e908c8832f82cc1f22bb2851a1169a1ea0d3b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/12-function-missing-arg-compile-error.yaml", + "type": "file", + "size": 1533, + "sha256": "d584d03270d9ab225109117bb921e1fd0aa8bfa346767b43cdd0e19c7b054905", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/13-function-reserved-arg-name-rejected.yaml", + "type": "file", + "size": 1506, + "sha256": "cbff2c6e4a759a6db30c4aa59a2d26b0f19ead390830e7974450ac005046563b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/14-is-blueid-typed-node-true.yaml", + "type": "file", + "size": 1637, + "sha256": "a3917e0d300ae8c955cf7f8dafa02174c28d5154ebeeb8eebf9bc35f4ba99abf", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/15-is-blueid-wrong-type-false.yaml", + "type": "file", + "size": 1721, + "sha256": "f0ae17bd3cf4d22ca1d14751f7abf992ab649b6a6a04e8d7423a91e882d7ca5b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/16-is-pattern-with-bex-rejected.yaml", + "type": "file", + "size": 1526, + "sha256": "b15cd404262537345579055ad074c294a28a6da11081341746f8f08110fb80a8", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/17-document-scope-relative.yaml", + "type": "file", + "size": 1485, + "sha256": "d777d88522a9cb123334706d441997d973e82a908c9946f3ad658a8aaa96aa5a", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/18-event-value-local.yaml", + "type": "file", + "size": 1488, + "sha256": "23368771f9c02aa292d71ab9ddeac74a0f70d1702acb1867ee26de19baaee7c1", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/19-current-contract-value-local.yaml", + "type": "file", + "size": 1441, + "sha256": "fa3802e8d337ced2bdc05df03ad1df93ba136992cba5bcbf393ec8e7bece869e", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/20-steps-object-value-local.yaml", + "type": "file", + "size": 1456, + "sha256": "45cd25ec43d9efece1340c3cdaf93879d0d6b9c46150ce7cc5fc5e2997004003", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/21-pointer-get-value-local.yaml", + "type": "file", + "size": 1421, + "sha256": "3b260410a971a4460241496d4f172d4f0ad46bb4636e36d78344d1379c806299", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/22-pointer-set-value-local.yaml", + "type": "file", + "size": 1461, + "sha256": "e9727b5a3bbf4d76a863365268420fe27d2085a201856f2135bf760a0bc8b46e", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/23-dynamic-pointer-missing-error.yaml", + "type": "file", + "size": 1536, + "sha256": "39bfa38c3907238f933e94316c95c6768eef23d96bb48296a6008462e464c97d", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/24-pointer-join-escape.yaml", + "type": "file", + "size": 1432, + "sha256": "bc93fc783eda7842fd5c92e34b5c75a0bb97a78a33f3fc7b127a2e126631ea13", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/25-append-change-valid.yaml", + "type": "file", + "size": 1513, + "sha256": "ef5123f1a252fc8cb62d19914a6e9d582067af609dc535a9885e3d8428eb2260", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/26-append-changes-bad-op-error.yaml", + "type": "file", + "size": 1454, + "sha256": "031f719b1c50686de7bd749eb5c9455b0e3f14b4842e22c77b6af079a3d913af", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/27-append-change-missing-val-error.yaml", + "type": "file", + "size": 1408, + "sha256": "dd9ff303d06c1d91bfe7b5c4ed4e816d0c0fc95e9f4df2aea8079175339daa36", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/28-append-change-remove-no-val.yaml", + "type": "file", + "size": 1484, + "sha256": "2017fd4a6372ed0b907c670fe6d77ded9f4694c0fba9d98e6135e3c66ab458bb", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/29-append-events-batch-success.yaml", + "type": "file", + "size": 1460, + "sha256": "a7d81dcbdc8b33248e37f4259aee2a68ae80e6fd09a45c8f42f2da5896f108ec", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/30-append-events-undefined-error.yaml", + "type": "file", + "size": 1437, + "sha256": "bfb0172c74c99cd3ea93f510c163b3b5db53c4f9da40baa4f678a9245440cec3", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/31-result-value-exact-latest.yaml", + "type": "file", + "size": 1632, + "sha256": "fc11b725808bc6d8f40f0bf1c9311c731f564576353d20b2e89d73c8e33e4c3c", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/32-string-operators.yaml", + "type": "file", + "size": 1799, + "sha256": "06ad6da3a7efbd59fabaf41926cf07cdc643eca8bb696a71216b0f67109ae036", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/33-logic-truthy-empty-coalesce.yaml", + "type": "file", + "size": 1640, + "sha256": "5121257d5196d84bbdbbb79a25c1f29fc1bf37b70cd3137b020577e82e187e58", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/34-numeric-operators.yaml", + "type": "file", + "size": 1718, + "sha256": "18198f6c9f0eaa31de3b9d27c5e90dee436ec507f5ee4fb5f0c5ccef871554d1", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/35-numeric-nonexact-divide-error.yaml", + "type": "file", + "size": 1383, + "sha256": "7ea2ee2048930638ba758a98d62ff8b23dddc0d348babdc3ac3685e259cbb496", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/36-object-list-operators.yaml", + "type": "file", + "size": 1702, + "sha256": "ada162f757ae53a1be4abdf6f5207b28a23c58251f4e31fd64d930fe4018c322", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/37-blueid-sibling-output-conversion-error.yaml", + "type": "file", + "size": 1455, + "sha256": "41a48b286fde199e8f6e0f78d44bcafd701f1adc991cc5d83dfb7cbaba0b23fb", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/38-hotel-confirmation-use-case.yaml", + "type": "file", + "size": 1919, + "sha256": "601cf7c33b9d3666745ecc8e0b65754738f1e5e1a8b7f9f468b39586486d8665", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/39-paynote-capture-condition-true.yaml", + "type": "file", + "size": 1983, + "sha256": "6d08176d162d2d22f1ba0d3b817072c1a2687b274e8b4f840a3aaed5bc3bf272", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/40-paynote-capture-condition-false.yaml", + "type": "file", + "size": 1815, + "sha256": "432303d8d9ff058eb736fa450c09867f418be3cbe0a814385f54eb83695047ed", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/41-exists-missing-false.yaml", + "type": "file", + "size": 1706, + "sha256": "d1e8b123840047cc56787d359d901ab6136057855955daee687e9c10d48ad65d", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/42-optional-note-validation.yaml", + "type": "file", + "size": 1452, + "sha256": "436c8a53f466451995b49320516906afd28fb64949e84cc814bd0cab1a7614ee", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/43-foreach-list-index-patches.yaml", + "type": "file", + "size": 1734, + "sha256": "5526814f08cff3f3b6770683d5a5e2bf8ce1167c1c9da40f2cb0281c873489fa", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/44-foreach-object-key-value-patches.yaml", + "type": "file", + "size": 1873, + "sha256": "f4000d0acf31dc5316eed25add769dfcc79b1f81391fcfdb35dcbfbc9faad2ac", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/45-dynamic-text-object-key-missing-error.yaml", + "type": "file", + "size": 1510, + "sha256": "cc5e1ec2652484d8068f240a08edbc5236069e1e73d1a2e3d83dcaf9afb388c9", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/46-dynamic-text-step-name-missing-error.yaml", + "type": "file", + "size": 1453, + "sha256": "b36d8df5dd078e9c2596c9a0982b8eec4c24344802424c5ee526823e058fd8fd", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/47-resultvalue-parent-child-replace.yaml", + "type": "file", + "size": 1599, + "sha256": "016d20188f1b4bcab823a8a1e68946945adebe5967d09eed8d2f58f94c14a390", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/48-resultvalue-parent-replace-then-child-replace.yaml", + "type": "file", + "size": 1713, + "sha256": "acb3ab580051dc1c18d81f66de15b4607a582722adee1b8e597b55b024680459", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/49-resultvalue-parent-child-remove.yaml", + "type": "file", + "size": 1550, + "sha256": "f5be716acdc69f55f8addca9d0269f27e73c8ebae9d58ee1224337a0ff3ff161", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/50-resultvalue-list-index-replace.yaml", + "type": "file", + "size": 1585, + "sha256": "fe8761b1d332ffdb3d3b172f5d7818aaf3c07189b6c790095fa40a16bdd3d14b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/51-gas-large-output-costs-more.yaml", + "type": "file", + "size": 1707, + "sha256": "695ec27bf3282c70af3d280cc69fe451b41f65b733a9367d10a601723cae8a52", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/52-ergonomics-guards-kind-path-let.yaml", + "type": "file", + "size": 1298, + "sha256": "49093ff52887fe03d193ccf518a488f3518531ec1bdbd82fccb40dcac9f40b47", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/current/53-collection-query-core.yaml", + "type": "file", + "size": 2327, + "sha256": "4f99042a1f357f835bf497e1ec3b2d4d1f409ee36641a3079dca40866601156b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-001-root-expression-literal.yaml", + "type": "file", + "size": 215, + "sha256": "4738790264216abb0d355e07dd02e7c4c56313285cb573c21a4fe7a2b8ab28c6", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-002-empty-do-body.yaml", + "type": "file", + "size": 180, + "sha256": "578e0863ecf44e5ee9c10d9f7b54a48f1621fa28fe9c246bfaadc55ac5734322", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-003-return-literal-statement.yaml", + "type": "file", + "size": 232, + "sha256": "29b14fdd809e1392cef8b12e2d153b57ca96952b22314312bb2937bd0f480f27", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-004-custom-expression-base.yaml", + "type": "file", + "size": 237, + "sha256": "0344c8d20ecbfb229aad2962f862813b905815be59cb74221349f506251ad113", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-010-document-read.yaml", + "type": "file", + "size": 268, + "sha256": "0101064afba3118df85d2874a2767a555aac7d7dd7d31cbb806daa24915c2097", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-011-resolved-document-read.yaml", + "type": "file", + "size": 331, + "sha256": "1729bc6159cb41849ce6b2240b6ac8c773fd20adc58d27387fab8138ba7547ba", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-012-event-read.yaml", + "type": "file", + "size": 287, + "sha256": "f0006ba67968d4104a4259e2615c9a14f53b9979ba5666177596f3514ef16059", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-013-current-contract-read.yaml", + "type": "file", + "size": 307, + "sha256": "4f6256eac3e3daf8059442b6d5bea3f665512d5c863d44664e21cb2fe61909a2", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-014-steps-read.yaml", + "type": "file", + "size": 255, + "sha256": "7ab25cee53112b9f4ec9f84bb60eef05d6eed1e26346b498a5ddaf63eb285c33", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-015-binding-read.yaml", + "type": "file", + "size": 295, + "sha256": "7235351e910f275ef143edb17544643d680720e21ce9a39456b1bfe6b553df74", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-016-var-read.yaml", + "type": "file", + "size": 254, + "sha256": "be10406829b342d93b14c48f22856754f8d35a681c40be8dce35893483cf2763", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-017-result-value-read.yaml", + "type": "file", + "size": 278, + "sha256": "ae238a2d89418bd1dc0ebbe2b8ce03342301e356b02379bb11483f3cc7ac7bbd", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-020-unary-integer.yaml", + "type": "file", + "size": 223, + "sha256": "c585829095c83c36f04b1332178a66fb92d255c9ee356be1c62549328aa4dc51", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-021-is-static-pattern.yaml", + "type": "file", + "size": 276, + "sha256": "f64da6b067ee9b8a32ce8ec843e22c80eae816d9a215f23e255d415bb702a417", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-022-compare-eq.yaml", + "type": "file", + "size": 225, + "sha256": "4d5f0ea50acae3b803733a7c596eef2c63a92ac0b18450259f55a5d27d48fbde", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-023-numeric-three-operands.yaml", + "type": "file", + "size": 231, + "sha256": "4e3bdd14036ff22862a3198b920d8341a9b3d305f19c3da684335c99832befde", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-024-concat-three-operands.yaml", + "type": "file", + "size": 224, + "sha256": "26c191f6d29765dc15636559a996c1dec4d1087cdb2a01e6abe19087c3ce5933", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-025-join.yaml", + "type": "file", + "size": 267, + "sha256": "82b6954dbe2ca1a151025f727bc53e1da7dc996d1a3ee79381f3b5c062903802", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-026-split-no-limit.yaml", + "type": "file", + "size": 275, + "sha256": "e7df61de3ec2fae9c793a7155036a765b8c456aee82411a92631ffa962e140de", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-027-split-with-limit.yaml", + "type": "file", + "size": 283, + "sha256": "191a2d27064fbbc2feaf9392344344b1745e0b9881be8b1cb0ac03fbb8f7ac14", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-028-pointer-join-three-segments.yaml", + "type": "file", + "size": 271, + "sha256": "b16245eda372a0f26347736de175fbe46ac7fe9706b43c297164d7c230b1208f", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-029-keys.yaml", + "type": "file", + "size": 237, + "sha256": "f5614f94b74d4e550f41c58f2ccd9c00263f49596b332c20beb9ff248fc0f90a", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-030-entries.yaml", + "type": "file", + "size": 279, + "sha256": "517638af106d9e2ca20564c0821065993dea425f30e64afba0b25c17ed497693", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-031-size.yaml", + "type": "file", + "size": 214, + "sha256": "ee4078b4c5eac6bc13e4425597bad882bc511c4bb54ba70807dd43465c393ca7", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-032-list-concat-two-lists.yaml", + "type": "file", + "size": 260, + "sha256": "e10eb302d3a0f926f491d5199bd79d0f3e583d6e85cfff8e9c7c17e172ec4838", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-033-merge-two-objects.yaml", + "type": "file", + "size": 239, + "sha256": "af13aa6228a6653410d42b9bf20977bf697d6d64e47202ec1828ca6f31b845c3", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-034-static-object-literal.yaml", + "type": "file", + "size": 233, + "sha256": "4a3f1cca808e9d5bfe585148f719f27b7187401f1709944c8d0d6e23977e8864", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-035-dynamic-object-literal.yaml", + "type": "file", + "size": 290, + "sha256": "84c47e515cec74a2d4f814c586d448ee86cb0956dd6dd0b38fe8c59e8b127dbd", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-036-static-list-literal.yaml", + "type": "file", + "size": 227, + "sha256": "66670c361a5cf5f96d58c6775de545342169b015c8cfa9cc90108e31369a097a", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-037-dynamic-list-literal.yaml", + "type": "file", + "size": 268, + "sha256": "1cde28316f7d704de1e141e74e9c7f3baba5de97d10b1a844a9209c8995bd008", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-038-get-static-key.yaml", + "type": "file", + "size": 247, + "sha256": "e54973f8d38868a7129bcea184c22a5f3b13bf62f2ce8e006cf3184c262db407", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-039-get-dynamic-key.yaml", + "type": "file", + "size": 263, + "sha256": "cfc6b291f8dd0cfb303a56c90807d12efc758066e687aedf308200e017c35403", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-040-list-get-hit.yaml", + "type": "file", + "size": 264, + "sha256": "07168e0307960fbe98b15519ba0bd3884602e20ba2465912d8e887187458deb4", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-041-list-get-default.yaml", + "type": "file", + "size": 294, + "sha256": "e0133fecc2a17b1bbb3a6a9036c3f63b6fcccc9693286c69c10ec15ab3706c1e", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-042-object-set-scalar.yaml", + "type": "file", + "size": 293, + "sha256": "1b7332d41f09503b95f5e826d0e7bb1958be4d0c336aef6aea3627b7383baf11", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-043-pointer-get-hit-two-segments.yaml", + "type": "file", + "size": 272, + "sha256": "e61f09c1494f60ab8607f4f8df4e4b61653af9daf5f46abc48de26e2f758cdca", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-044-pointer-get-default.yaml", + "type": "file", + "size": 313, + "sha256": "ab0fa2f6f7584584d8bfe272cc9a7b1bd5ff731414ab841dcb55126656bc3550", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-045-pointer-set-value.yaml", + "type": "file", + "size": 304, + "sha256": "0a6272c3fed7529826980e1d14b604aeb1fed19f0e22861fd75c7b04ba9c7135", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-046-pointer-set-remove.yaml", + "type": "file", + "size": 358, + "sha256": "8711c5ae572e1b8b38801e4b1b441e4b5d7e4a04b8d2e1e396b3df3d3027c526", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-047-changeset-expression.yaml", + "type": "file", + "size": 223, + "sha256": "3858d4b256e86ea58aac1b5e1d5737129e9b5198343029c58e74b6f8d7d82aa2", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-048-events-expression.yaml", + "type": "file", + "size": 217, + "sha256": "7e211794839291ce86f1d0bc2ab395b2ec1f627b5b572922e71ccf0466464f3c", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-050-and-short-circuit.yaml", + "type": "file", + "size": 314, + "sha256": "9a4f2b3a261815d78a3061dd381f595efb3c9ba637c685df5063f3fc4197888b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-051-and-full-evaluation.yaml", + "type": "file", + "size": 316, + "sha256": "6d4c18d76da050e932d0573f4a02b1f9e5fa284e3a8335da75c9d91cbb0bdaeb", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-052-or-short-circuit.yaml", + "type": "file", + "size": 310, + "sha256": "10643ce1cbc07e2a174938bf095cca08a8a1d3a12c6486d5903dd8f014a4ba92", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-053-or-full-evaluation.yaml", + "type": "file", + "size": 314, + "sha256": "fda63e0b55142d4599c54978663ba43deb185b3913a4b604a0d0f97b108fecdc", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-054-coalesce-short-circuit.yaml", + "type": "file", + "size": 307, + "sha256": "777c525e1b784aff4fb3a1fe273f6d72fe58666fed4dd430038370ba098dda9d", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-055-coalesce-full-evaluation.yaml", + "type": "file", + "size": 326, + "sha256": "7afdbc061772d34e99e9d16151f44d696bffee7696731bd4044c0f2b5797361c", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-056-if-selected-branch-only.yaml", + "type": "file", + "size": 334, + "sha256": "0612a27e2eef744cdded818392409d9c494cefc17f5b61e17e32a013431aef2b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-057-foreach-list-empty-body.yaml", + "type": "file", + "size": 287, + "sha256": "77e088cce6bea451b4daf10a49cfa50083e5c1dcebc4d55767fc919ebd59d517", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-058-foreach-list-body-append.yaml", + "type": "file", + "size": 323, + "sha256": "660ead62390b3dcb574d247b486fdc6586c93796cb787ad18c7aa905e5d4f53b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-059-function-call-no-args.yaml", + "type": "file", + "size": 294, + "sha256": "939158d4b8d3da7ecc7c31465c20977897d3d277888345caac705dbe424b65ce", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-060-function-call-typed-arg.yaml", + "type": "file", + "size": 383, + "sha256": "396741d69334c36b04f3e2666d26a3618bcd8d0866ae9731c1199614f74f5c8a", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-061-call-statement.yaml", + "type": "file", + "size": 268, + "sha256": "58147ca4614968658b92bc408d7c1e00cc96382018cae89f5e65554fcc15dfa4", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-070-append-event-null.yaml", + "type": "file", + "size": 238, + "sha256": "7bad09fbcb5f7d83115365d832122c27718bc95e2d1a26b46790d233bf34b255", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-071-append-event-string.yaml", + "type": "file", + "size": 233, + "sha256": "4749a933a0ffdad06a8e929f5b0e91142e46a931ca7e5ed0b6bf149c705673fa", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-072-append-event-boolean.yaml", + "type": "file", + "size": 220, + "sha256": "8fb2c5011beebcd63c40241e9172113f5779524ed5c494aa63ac33567835683a", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-073-append-event-integer.yaml", + "type": "file", + "size": 222, + "sha256": "8a44927ce55704046c584c5fcacc84eb5ea0c13613a07be776102244d57d5198", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-074-append-event-list.yaml", + "type": "file", + "size": 265, + "sha256": "622b40eeb4c838caeba1ec4e096cd52ceffbbea863c1ec6b0c5f033b7fdd4d13", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-075-append-event-object.yaml", + "type": "file", + "size": 281, + "sha256": "50f6e4a919fdb583754710c81399d6a5ff530fbb1dd9d9a5223dba5282e3f09f", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-076-append-events-two-scalars.yaml", + "type": "file", + "size": 253, + "sha256": "efb58a1e988ac7fd63a3242849e3e44af2b9895e9d2781ba96a7c49830899fe3", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-077-append-change-replace-scalar.yaml", + "type": "file", + "size": 335, + "sha256": "21fdbfddc4b754b699198b7f409fc10014ce9afaa81d435c01379f9d0b3134ad", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-078-append-change-remove-lazy-val.yaml", + "type": "file", + "size": 357, + "sha256": "a736f5f39684758a33c37051c48b9673f43679174a1809c0c79ef6fda010e39c", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-079-append-changes-two-entries.yaml", + "type": "file", + "size": 428, + "sha256": "3daa867ede4913c8b5467e09b5483e51660ab518f9a75357f040f564f8167182", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-090-expression-gas-exhaustion.yaml", + "type": "file", + "size": 243, + "sha256": "416cb07933177e9570daef204f0f68fc55e060d9c7aa561bc2e6c26ed32ed897", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-091-output-size-gas-exhaustion.yaml", + "type": "file", + "size": 275, + "sha256": "dc3a0c260087a26e818b56636783e3c1047057f182315ace44b083e9cd938358", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-092-literal-expression.yaml", + "type": "file", + "size": 276, + "sha256": "740a37177598e6513d10b0f23be21f0f8de906887851eff65cedaab801313a0b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-093-const-expression.yaml", + "type": "file", + "size": 247, + "sha256": "89c3ae56d6a17c53bc9fb424094b5ba2f18742d312f7959923af5f8af5ff28e6", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-094-unwrap-expression.yaml", + "type": "file", + "size": 219, + "sha256": "4fc74e2413fa4ae892351f1cb31214c601c1b6105690fde95bcc85347902f8be", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-095-text-expression.yaml", + "type": "file", + "size": 211, + "sha256": "818ecf3d6c02a698055c25b2cd94147e664070323032c13d5e95de9c93b22f83", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-096-number-expression.yaml", + "type": "file", + "size": 196, + "sha256": "3c83d72c94de24c9039e60f0ab0b2c29758cbf1ad3607b03930c3ebcb15fc3ff", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-097-boolean-expression.yaml", + "type": "file", + "size": 219, + "sha256": "150dadd726438b1494e52ac9c4c56e3368fcb40ddbe287d2b29c1c1b70ffb609", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-098-object-expression.yaml", + "type": "file", + "size": 227, + "sha256": "399c18c76dc0f020b440a541774b25e1559ac19f2694922a2718f076b9e0b1cb", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-099-list-expression.yaml", + "type": "file", + "size": 221, + "sha256": "fefa3c89f42f662db7d22a8220da2d883fd2c5bb56edb7e490a1c370e947d844", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-100-truthy-expression.yaml", + "type": "file", + "size": 214, + "sha256": "b89848e440dc2382a27913deea0b9473c5e24b26f2eadea7dd162e8600b4d5f9", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-101-empty-expression.yaml", + "type": "file", + "size": 213, + "sha256": "90c5d3784530cee1dc5413127b6b36847f56e9b549a574eb62c178fd3b1b2410", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-102-exists-expression.yaml", + "type": "file", + "size": 238, + "sha256": "f13c50cab1d050b342322e177a2b2f3e089eb183e2b6b6af64c6a09a57f2e479", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-103-not-expression.yaml", + "type": "file", + "size": 201, + "sha256": "9d3e4d967d3faae00780c58e9f67df414883ee579b419082cf93950b64f74968", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-104-default-expression.yaml", + "type": "file", + "size": 260, + "sha256": "9a22f61df4fdd91adec177a3662415e7ddafa2b6b193a67889319a1b0f9f035b", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-105-starts-with-expression.yaml", + "type": "file", + "size": 225, + "sha256": "2cfae7a808fa2e9f63a4ea37c07ce1dc53d7070ba45f272a8fb7ac81cd04721f", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-106-slice-after-expression.yaml", + "type": "file", + "size": 223, + "sha256": "6f27e301b836baa350665b3ce01f558ba06bbeb7d90c4ca70fc2e646631f1a45", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-107-ne-expression.yaml", + "type": "file", + "size": 226, + "sha256": "7629fa4f86096223c6cc2172bbec47283db596b58632e6d218484c445f3710b0", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-108-gt-expression.yaml", + "type": "file", + "size": 229, + "sha256": "62ebb5ba87bb970f811e038c709dcbe684d2927896645b3205614f45c4f32aab", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-109-gte-expression.yaml", + "type": "file", + "size": 234, + "sha256": "21da02bd22ab98a2f72aecc3b9201e0cc7624701c02c541f58662ec68e887856", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-110-lt-expression.yaml", + "type": "file", + "size": 226, + "sha256": "cc51b3bd98790b8807dd023081c3836cdaafd9ff52734e04f054bd64541701c0", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-111-lte-expression.yaml", + "type": "file", + "size": 231, + "sha256": "a4d7616f8587abf8ed93c3ca3d09b178473cfa8d88bd2940802e2171e4708478", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-112-subtract-expression.yaml", + "type": "file", + "size": 227, + "sha256": "d05f02aaa890ca06a216e5880529eaf0192e31c20a0eee300ab31645b65447de", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-113-multiply-expression.yaml", + "type": "file", + "size": 227, + "sha256": "67bf568105afb637597b2e00c5ca13f495d84a3e42caed42ce7bc719fc100c51", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-114-divide-expression.yaml", + "type": "file", + "size": 222, + "sha256": "e070d730234c3cd3a92ebce340b70f9488a78309340e752d1fb07932148ed643", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-115-choose-expression.yaml", + "type": "file", + "size": 301, + "sha256": "22c470eaa4c594f561d7adc364c3b685bd9a60890f33e64c4070827d5850c449", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-116-set-statement.yaml", + "type": "file", + "size": 324, + "sha256": "14de27cd9b35a0a0bdd3ca68dea483d1ec42184f26173523b68aadc3f6e7ffe3", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-117-append-change-add-scalar.yaml", + "type": "file", + "size": 319, + "sha256": "7b3ac1ccac2171366b98722532ca8abd524d50404e625155757744cfffeeb630", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-118-append-changes-remove-entry.yaml", + "type": "file", + "size": 315, + "sha256": "605726ff3867b0a68cfb9d27d9906e550c2775a68e272746212bb2f6145aa552", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-119-dynamic-pointer-expression-cost.yaml", + "type": "file", + "size": 316, + "sha256": "fa5ebb68d80ca7ce9b844894dd649b52a04c59752411dbeb23e7e7a521f6be10", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-120-dynamic-text-expression-cost.yaml", + "type": "file", + "size": 276, + "sha256": "309bb22bb0c0556a653eeebf538560e9f3df6bdb58fab21a84f3cdebafad2ab3", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-121-custom-function-call.yaml", + "type": "file", + "size": 227, + "sha256": "a2310a449758fc70f515e4538574f9cce8e78c8e872025bbdeb0d041c37182a0", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-122-custom-statement-base.yaml", + "type": "file", + "size": 246, + "sha256": "2af78e618f89d53e1e21d3c7b57108f90e3a2ec43b290d4b4b00873e738f8203", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-123-custom-append-event-base.yaml", + "type": "file", + "size": 243, + "sha256": "3d34c10fdc07fc552a9a5da85522c86773a71bb265f0e7f8fc0adc9479f51b66", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-124-custom-append-change-base.yaml", + "type": "file", + "size": 345, + "sha256": "38136522cc38076f80d124e7b841e4e54cac96fb2519dfabae8639582b1e1bf2", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-125-custom-document-read.yaml", + "type": "file", + "size": 303, + "sha256": "fe78c1665bac835b112da5bae394a5b6329e48f75220f8f2255aaa5bd59001a8", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-126-custom-pointer-set-base.yaml", + "type": "file", + "size": 342, + "sha256": "3cc82726299f4f54f2589353e0c58aa6d71f97669cfdd4931a7142686c754bb7", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-127-custom-foreach-item.yaml", + "type": "file", + "size": 323, + "sha256": "0d10507d3ed8a36e0c941ba0a08f7d3f2799c44e19784129dd214a042f01f900", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-128-map-two-items.yaml", + "type": "file", + "size": 311, + "sha256": "da5799738874bf305698bd0bec6ee16f7a7bf910fb9f450e1e9d01e9516f4da7", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-129-some-short-circuit.yaml", + "type": "file", + "size": 315, + "sha256": "a6d24fa9458a8073470d97b32365757f57305fc3bccc7e07537d5e80c5b20410", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/gas/gas-130-document-schema-append-change.yaml", + "type": "file", + "size": 563, + "sha256": "9320095c8208ee67eb1eb055a4b59ad7b9d4831618bd4c7935a922bd9f09b4e1", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/manifest.yaml", + "type": "file", + "size": 11481, + "sha256": "d641f2ab451fcfd26cf868e62e4ecb5db0b01607a3f6cd9189df72f96df02309", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/parse-errors/01-invalid-is-value-shape.yaml", + "type": "file", + "size": 493, + "sha256": "e8a48cdc7e8588dfae3595b4b2e8c577bfb60c9bc9cfc394a7aa2e0fcc2e80d4", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/parse-errors/02-invalid-join-items-shape.yaml", + "type": "file", + "size": 501, + "sha256": "17f1e1567e560b97c86b8248e9cb33b19ed9dd83e53feb12092c72f7532f921a", + "mode": 420 + }, + { + "path": "src/test/resources/rich-fixtures/parse-errors/03-invalid-blueid-with-siblings.yaml", + "type": "file", + "size": 512, + "sha256": "bbbe977905891c7d4f788564333a370087da61a6ee7cd00d27f8c42b007f632f", + "mode": 420 + } + ], + "sha256": "48129eada86f56fd7eb7671b027d2faeaba28b87abfe3445a7ae3a4f9a8c0564" + } + }, + { + "name": "blue-repository-java", + "path": "/Users/piotr/data/blue-repository-java", + "commit": "23799b1c60c9372252f3e9c73c01ba292b052e02", + "executionSurfaceManifest": { + "algorithm": "SHA-256", + "includeMode": true, + "files": 2247, + "entries": [ + { + "path": ".cz.toml", + "type": "file", + "size": 158, + "sha256": "2cbf4c9c13ac9685005151fd4a79aab5e5a5ae6d1799197a4b7c6ddea6c6273f", + "mode": 420 + }, + { + "path": ".github/scripts/prepare-rc-release.js", + "type": "file", + "size": 3519, + "sha256": "93553341292d4b36a25e4e999888ab76049dcc9e0686e9c4cb1e6f82536c18d9", + "mode": 420 + }, + { + "path": "build.gradle", + "type": "file", + "size": 15237, + "sha256": "6497f4b5b2b50172106bd5738237782215cdb2fce773cdc75f06a06b4f8a1cb5", + "mode": 420 + }, + { + "path": "gradle.properties", + "type": "file", + "size": 132, + "sha256": "f77a6c20a1196fbc7c4939db550ad0660e5b65fb813f305d6b9df2ea9f37f191", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 281, + "sha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9", + "mode": 420 + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59", + "mode": 493 + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8", + "mode": 420 + }, + { + "path": "settings.gradle", + "type": "file", + "size": 900, + "sha256": "a16666d9013da0a96199e55d7d9524ff626c5db25db06c0d5a0dc8e650334300", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/BlueRepository.java", + "type": "file", + "size": 5711, + "sha256": "fdc998f45167b1a9aa3e611c4cc5d3798806b9c8da327a75b5913c28372bed2d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/BlueRepositoryModels.java", + "type": "file", + "size": 220610, + "sha256": "35439e5343d33c63318c47f25be7d2286f88082708fc389e5e3b6b24e79c4bf9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/RepositoryDefinition.java", + "type": "file", + "size": 3038, + "sha256": "b0fea5fabca173386db6028aca47e0b82b131db5fad00e334af96f7a0566bfe0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/RepositoryManifest.java", + "type": "file", + "size": 7498, + "sha256": "eaa6216d064af0d1d892568d7f6e450e405abd2338f77e993b22b5d6383af135", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/RepositoryType.java", + "type": "file", + "size": 2391, + "sha256": "30e5110b289cff1c216bb0fa649d7416a0cbe421fc7ad145741f869ce782118a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/RepositoryTypeDictionary.java", + "type": "file", + "size": 2233, + "sha256": "7b2f8cf9df6e851e23740d956059091728926f5fdfb7914535fab73cd6c79b18", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/DocumentBootstrap.java", + "type": "file", + "size": 1987, + "sha256": "fa2e4be5ae24898a41103547c87f094f13ae4bf45935e7034f4f261d626e729c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/DocumentBootstrapCompleted.java", + "type": "file", + "size": 1442, + "sha256": "1ee04729322fa5711fae51a5a3dbdb7971b748e20c82c0153e7672b09b335636", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/DocumentBootstrapDeclined.java", + "type": "file", + "size": 1258, + "sha256": "f80d560e866004c61e73cc54e6f6bd31768e90cb92f33f409467b65587106c2b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/DocumentBootstrapFailed.java", + "type": "file", + "size": 1239, + "sha256": "38f9b99b0c6ee451a98a88f38743ed686cf02b8278116747be8ce5bb33629040", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/DocumentBootstrapInProgress.java", + "type": "file", + "size": 1059, + "sha256": "bfc410c14ec9c8a3582c5dfbe87a1cbab8d5dd040bd5270be8fd74e83b182e75", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/DocumentBootstrapRequested.java", + "type": "file", + "size": 2260, + "sha256": "a268dc31cc51acdd317882d685de1ed0c0303bf345620ef5c571d7eea37d2f5d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/bootstrap/ParticipantMapping.java", + "type": "file", + "size": 1617, + "sha256": "aa291d1a953869a32a6777ea1e4d260ad0025772fc97c5a2dda386cc25e8f7cc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/CryptoEd25519Verify.java", + "type": "file", + "size": 1614, + "sha256": "e1ac5dbf5939e016267904064c7d5a3444c7fb9a4afd7c878b4e6da946e4113b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Currency.java", + "type": "file", + "size": 906, + "sha256": "1377a9cff00d22c6d34ad187d4e68af62b5dd1ab9f53c9cbe083859a165a19e2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Document.java", + "type": "file", + "size": 1086, + "sha256": "c76daf7e64ff5c2a591330fa71b45588bfc416ea530cb116e34b5d3fc30b283b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/NamedEvent.java", + "type": "file", + "size": 969, + "sha256": "6e2880c9c29a304b747b40fee07109d2ae03424ad4e0c4d44e82a8bc0fd64f04", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Payment.java", + "type": "file", + "size": 921, + "sha256": "d3d3f3c21810891fc258f1dd84a21405ff46af858c92488699250f6af4fea7e9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Profile.java", + "type": "file", + "size": 921, + "sha256": "c93b1c66889f1114cf5cbe17e4abc45d1e7f50a843a9fa631e4f5b9a3a879b4b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Record.java", + "type": "file", + "size": 917, + "sha256": "c0990d86ccec7c86805e6ea19b5ed4026be2fa77f86a4e601fa144149e75f042", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Relationship.java", + "type": "file", + "size": 941, + "sha256": "1ebdf3be3acf6877703a49fba6c8a03bf7a1d2aaee5526d50dac6db176708730", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Request.java", + "type": "file", + "size": 921, + "sha256": "269e83df5044fa52894b8969cbb577b073e1f2274554c08e5afd0b6d5bde6a9b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Response.java", + "type": "file", + "size": 925, + "sha256": "af81caede2b94aecd8bd5b86404c58f298a925ec25fa15750c8f89bc19879e38", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Service.java", + "type": "file", + "size": 1181, + "sha256": "0ef02aa3489c52cdf63ecc715c4276438c94aeefbd2a2db1f1c07d6c26539834", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Space.java", + "type": "file", + "size": 1109, + "sha256": "7d26e3081b70ce26d31b4f81d185fc72074889a6af45cfd0b8c634c1fec16866", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Task.java", + "type": "file", + "size": 909, + "sha256": "77e4fc9eab67840be79f0e1f96740f9c8a4a9c9a180cb2554c7d94b34fe97ec8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/common/Timestamp.java", + "type": "file", + "size": 912, + "sha256": "2affdffb15f8a2ecdd7466d7157ef4e460face3a442678aec624c4f39db907e0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/APICall.java", + "type": "file", + "size": 1150, + "sha256": "d0c3055b164bd797526997a4a47656143584eb26a9d39be076352546726ac54c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Actor.java", + "type": "file", + "size": 920, + "sha256": "e8155e4f9cec8ad9da015bae13b09fc43a084e4b08b4bae1604dea41299a7ae1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/ActorPolicy.java", + "type": "file", + "size": 1277, + "sha256": "7bbdadc8d0f5ead3c5b96dc5c1bfe38fe17492e2c590b5210ee45547dcb82e52", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/AgentActor.java", + "type": "file", + "size": 1175, + "sha256": "0e9d41267a55cee9736a683a85ebf8b5750adbf2dfdea06da4a2a3bdd2fdfe72", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/AllTimelinesChannel.java", + "type": "file", + "size": 1034, + "sha256": "6d9730070e278296abaf5ac6b11edc6fb84e865839f9353c27c44fbbf30e7df4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Authority.java", + "type": "file", + "size": 936, + "sha256": "686e0018ed6023acc94311545f88bbce61278f0c0c909d376d136fdeef72571d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/BrowserSession.java", + "type": "file", + "size": 1227, + "sha256": "50d96cd367223d876ecafaa0d7272f81f0de2ca57976bb3666b231d8527a63f0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/ChatMessage.java", + "type": "file", + "size": 1164, + "sha256": "16a4d5465c8f1013955f0ec7eb268df7a4546db02ab675d9536727e6928ee3db", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/ChatWorkflowOperation.java", + "type": "file", + "size": 1024, + "sha256": "dbf9b0179364afec888cac1205d546f29abb33178b33f86ab443fc0106d9482b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/CompositeTimelineChannel.java", + "type": "file", + "size": 1317, + "sha256": "c945a74a8950b522822bbf91f17eda74cdb7721a90483158752535ae76b031f3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Compute.java", + "type": "file", + "size": 3093, + "sha256": "60b21e699413fee017366b4dfe1630fe72da11f9f48aea2391973285ac341503", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/ComputeDefinition.java", + "type": "file", + "size": 1555, + "sha256": "f568ac25732bfcb48cf23c273bbf71b3df1013868c6017b24cbff734611377be", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/CustomerActionRequested.java", + "type": "file", + "size": 1675, + "sha256": "660b52f5f5cc3b36b15da3eede10830719ed7f9e320370b7cda4ee39344c3835", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/CustomerActionResponded.java", + "type": "file", + "size": 1735, + "sha256": "834bd4d4336eae7b94aa19ccccff5444f084d9800a9fffed6462a18354c875d0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/CustomerConsentRevoked.java", + "type": "file", + "size": 1483, + "sha256": "b3e1c8e8fc4e58c6441c36fa845ee67ce8d3039bd76495109691d0d620a0f3a0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentAnchor.java", + "type": "file", + "size": 1162, + "sha256": "0117d9a03266c93ca7aa81e6d961b8e8cf7687e3127b62696dc760757f401309", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentAnchors.java", + "type": "file", + "size": 1015, + "sha256": "649d1f26c63a67f7842880b18ca3dd6817cd8cf6ae55eca1799fc98bd0cd1394", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentBootstrapCompleted.java", + "type": "file", + "size": 1263, + "sha256": "d4830cc3966d5e7dce272225174badd4a5330ece12c85d49308ff3600f878b85", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentBootstrapFailed.java", + "type": "file", + "size": 1220, + "sha256": "c97dc782a97103ae8324cd1c1dfb5a7e62b25863af4ae560f662f6e1cfea3b22", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentBootstrapResponded.java", + "type": "file", + "size": 1445, + "sha256": "32140153b2a8af7116b5ee76d5eb8636ce9c542255de2d7f3283fff334eb95ab", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentLink.java", + "type": "file", + "size": 1399, + "sha256": "a8b4dae5f8237e65e28566a85011b7062aa8cc6f63bc29d16a3564ec22385f63", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentLinks.java", + "type": "file", + "size": 1007, + "sha256": "0097469e641f8d8a55e23e2d2fdafc70f611f9f7bef0a1c0901ead4b581e0689", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentRequest.java", + "type": "file", + "size": 1437, + "sha256": "db96896a7160ae75e257ddebc0ca7c3265dc5618e6402a6b1b7a5b19230bff43", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/DocumentStatus.java", + "type": "file", + "size": 1142, + "sha256": "6a4b598f5e520484191c77394e678ec7e3a9490fcae7a9dfd698380964a05bb1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Event.java", + "type": "file", + "size": 920, + "sha256": "e3e1a3cbfa2c6fa3fd30ba9298ed5980f189cae92622c853c47ccf02653d9be8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/InformUserAboutPendingAction.java", + "type": "file", + "size": 2179, + "sha256": "08f14f6cce3cdf4d304c9cd1e32930e42fba0e3736bc4a27bd9c1987c39bcbef", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/LifecycleEvent.java", + "type": "file", + "size": 972, + "sha256": "47ff77610ebcf2d5e5de751b201607d389aba7840639312a9d8fbeb94f1688fe", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Message.java", + "type": "file", + "size": 1847, + "sha256": "b582164902752a0de184bdabdddb27722994bf086a5a44c9d14f38292218eb60", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Operation.java", + "type": "file", + "size": 1184, + "sha256": "89d5d1a9b253b7ae0245e7a8cc7cc47b17db92de14841a67110e2619bafa9ab8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/OperationRequest.java", + "type": "file", + "size": 2169, + "sha256": "8282ad79e1fec00d1225a4bd20e2d9feaac3af0cc8dde2b6b9302a1bcf8dfbb2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/ParticipantPurpose.java", + "type": "file", + "size": 1509, + "sha256": "f07668a00dbfcb6e233a4ab83a1f9d0f0d7ea3770c335246ae7a6e51db917d26", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/PrincipalActor.java", + "type": "file", + "size": 972, + "sha256": "b24b85fdde937464b24c6999aeb533ee3e8642b95fb14d28c60dcf01a15f56ca", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/PurposeStatement.java", + "type": "file", + "size": 1889, + "sha256": "390ddb6a2c8446a0582bdf9b3ffa643d7ce3a6b5ca303fe0fc895279b336a7aa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Request.java", + "type": "file", + "size": 944, + "sha256": "d417ef1fbcfe9fa156182b555f7d97cea84e4a406890688edb1ed6038d8e456e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Response.java", + "type": "file", + "size": 948, + "sha256": "d4e61c8cf4e160867b00449b6dbe423b5b5b7151669cc3b75a25ff2127ab867a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/SequentialWorkflow.java", + "type": "file", + "size": 1312, + "sha256": "68d9ff5256e6c4c41ba6a5164045f9aacd1b0ed2fe5952143ed771076d8ac133", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/SequentialWorkflowOperation.java", + "type": "file", + "size": 1323, + "sha256": "6d82b6bdc0bf9a0d271411760f06b6cd8d3b8702504c230f154aedfbafa4a05b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/SequentialWorkflowStep.java", + "type": "file", + "size": 992, + "sha256": "41fefe205409f8f982b976046ef49247f790b518069147a81e2b979b2ecc8c33", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Source.java", + "type": "file", + "size": 922, + "sha256": "4e59feb0ff5fd733cc0bce7c243d88b38616371682bd3453573a1bad651d12b9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Status.java", + "type": "file", + "size": 947, + "sha256": "ab3fc1fee4ad58d00321d7dca79b9700aef844bb94b5e8255457e49a29b54026", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/StatusChange.java", + "type": "file", + "size": 1160, + "sha256": "3761551fe4b56bd9ebdc99a821b512a60705cc147ba99cbbca53fb5071374614", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/StatusCompleted.java", + "type": "file", + "size": 977, + "sha256": "85d2dc2e0c57336bdc715bf67f43e79f231cdf76044f05021949585c139458f7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/StatusDeclined.java", + "type": "file", + "size": 979, + "sha256": "438d2018383b3c576130f52740b91b9c445c90a62481cb477d8e9c240106be1b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/StatusFailed.java", + "type": "file", + "size": 965, + "sha256": "a95650a3e7bae4a1e9e54799e0be0533dc83ff37266dc6cacc0bc0fbf3791c73", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/StatusInProgress.java", + "type": "file", + "size": 983, + "sha256": "70600bd36f3fee758381651c1ab571795617830df14b69bfd890941f912403bf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/StatusPending.java", + "type": "file", + "size": 969, + "sha256": "410d3a153529cf0742ad5aa1d3d214c86a6727215cdfbdad6ea5b818c7c00593", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/TerminateProcessing.java", + "type": "file", + "size": 1212, + "sha256": "a49caf20df9e670a9f9ce1b6742988f8756ef75300e64cead04119a484b1cff3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/Timeline.java", + "type": "file", + "size": 1150, + "sha256": "3d8d24f208aa32aae85f034968397527db78f74d04b0ce3625f349155790b115", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/TimelineChannel.java", + "type": "file", + "size": 1424, + "sha256": "f60c98d5ab7006c47ce609855ec0c239d7eef7956d7f9598cac409d7766a9b29", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/TimelineEntry.java", + "type": "file", + "size": 2458, + "sha256": "fe8833fb9098d2915b9c6caf0678a7916934423665ef046b1745d2b39f6bd2e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/TriggerEvent.java", + "type": "file", + "size": 1164, + "sha256": "111de8e1c8ef7236614b81ccdb921ff92fae89e0f2fa28861c9514c16b8eecb6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/coordination/UpdateDocument.java", + "type": "file", + "size": 1243, + "sha256": "94713fa22816064d9ddeff2b6658ac1829d5f7d542075da18850ded2120c37de", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableDate.java", + "type": "file", + "size": 2528, + "sha256": "e20bdcae809569c95cb4e4ff1d4a4c886d4dff5b63d4c04dfe3a69e47a25337e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableDates.java", + "type": "file", + "size": 2081, + "sha256": "9650076a34439baf97a9feb0f321edb9ccc25dcc04845e48d578b48b1bc64761", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableOrAdjustedDate.java", + "type": "file", + "size": 2085, + "sha256": "5cc6d8e727e20f1fa67fb28a654bd87a9b7ee595b7b23398290eea1f74476369", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableOrAdjustedOrRelativeDate.java", + "type": "file", + "size": 2511, + "sha256": "85efca576592984cf1493c686ceff1d2bd737742672995d6fadf39e76b7d21d2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableOrRelativeDate.java", + "type": "file", + "size": 1796, + "sha256": "43e7199258f8433ff89433ba08c8947b84710158efb1e4576eeb8dd0a424c489", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableOrRelativeDates.java", + "type": "file", + "size": 1780, + "sha256": "871d01b2327ee4e409ed8673e7fc69569338550422b65907cf1dcd35b3cfb048", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustableRelativeOrPeriodicDates.java", + "type": "file", + "size": 2175, + "sha256": "d39bd10baf1d20d456cd5d8fd7c219d376e99c36a54b37a1b047b2825a0f103b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAdjustedRelativeDateOffset.java", + "type": "file", + "size": 4403, + "sha256": "5c0cf1dda3b54e41761003509a77d5b62f657315a25f5166b306558f75217f0e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeAveragingSchedule.java", + "type": "file", + "size": 1955, + "sha256": "6b3e67591891e662e9d2d11ee167cbca40c9af04e31da55768e043ec024a669c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeBusinessCenterEnum.java", + "type": "file", + "size": 1054, + "sha256": "d3bcd67f32b6de1e54cae7bb9e98cc90d5c751dbfa8c6ca48e1d4894a880828b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeBusinessCenterTime.java", + "type": "file", + "size": 1720, + "sha256": "5f0f2228e90bf19ab7b0e3db5032f835aa8ee7d8d8a44ec3bf77bdbed673eac3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeBusinessCenters.java", + "type": "file", + "size": 2484, + "sha256": "3b0803fa24a4b7bc314e6b4456b90268a8dfc09af61411cde99ed813e2efe2a4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeBusinessDateRange.java", + "type": "file", + "size": 2284, + "sha256": "7ab4ecb186b0a51946912ddeac2bae64180f6ea47d0198a898c08a0fb47689e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeBusinessDayAdjustments.java", + "type": "file", + "size": 1854, + "sha256": "96529b506d02b28498b29bc17d483fd644e66a168afe24812f481b609dec79b6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeBusinessDayConventionEnum.java", + "type": "file", + "size": 1082, + "sha256": "a9a89509f521576b901071519bf27ff73ef5e33184ec8fe0690bcf5e50ff290c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeCalculationFrequency.java", + "type": "file", + "size": 3373, + "sha256": "4effc91c1f2397faffa510f6b4f12abce4e851f48a88ac90a7bf3f2609a3d737", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeCalculationPeriodFrequency.java", + "type": "file", + "size": 2416, + "sha256": "fd0b17dd18bf815161b6ea9b0955ea31622387436d8382290acb5180a26e04a8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeCommodityBusinessCalendarEnum.java", + "type": "file", + "size": 1098, + "sha256": "b54a17570a1e5cd0a0ef75e5aae740d21257b6ff001f3ea5dd43a97a2accf3ae", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeCompoundingTypeEnum.java", + "type": "file", + "size": 1058, + "sha256": "63201665f0208532b2d516cec2a9987bd71f0635bfd15bd627f1a271a98edb0e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeCustomisableOffset.java", + "type": "file", + "size": 1596, + "sha256": "e4b909c734cd4c25a24ebdcfbceb8453acc2d29045457f30c7d299cfa420169e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDateList.java", + "type": "file", + "size": 1248, + "sha256": "7c01b344a920b83d03b13794529cd5218dfcc6b48b24c80a4bfd06569ae65df0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDateRange.java", + "type": "file", + "size": 1460, + "sha256": "78e695d4c0ffbc06a964fc938e16c2dd72785c54fc30c1c09bc4e8fb12a953e0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDateTimeList.java", + "type": "file", + "size": 1294, + "sha256": "de0a74c50159fa977f76d6ff9a29c83252552c50a5e11c4f7b90bd190475e367", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDayOfWeekEnum.java", + "type": "file", + "size": 1034, + "sha256": "1e26138e04a5c30bfef676f9700737beb122c2ee5a368a634d4b1995eb0ab415", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDayTypeEnum.java", + "type": "file", + "size": 1026, + "sha256": "45ff57c720bd1f99d009f09a1ddb0118bc63133245db3e5cc9aea1226dcab816", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDaycountDayCountFractionEnum.java", + "type": "file", + "size": 1096, + "sha256": "3de5816ff2bb222f43ac318a5545bf4fbb6d5f996d1e29fd10a166ab256ce02f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeDaycountFieldWithMetaDayCountFractionEnum.java", + "type": "file", + "size": 1791, + "sha256": "b45272d54f4298eb6a3c53e7397d0c0e19f58153a1bd40c539654c9f25696e43", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeFieldWithMetaBusinessCenterEnum.java", + "type": "file", + "size": 1699, + "sha256": "f531e26648ba142decd8e2a4618ec133e057f7deb27627cea1d8eee0f18ec59d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeFieldWithMetaCommodityBusinessCalendarEnum.java", + "type": "file", + "size": 1798, + "sha256": "9f59b28b099d2dfe0dc784d6d5b2b2d3e0a71c701a46906462ef43484493ade7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeFieldWithMetaTimeZone.java", + "type": "file", + "size": 1609, + "sha256": "13f984943df34d79e2fd2203e30e0e25d9a7d09792f11cb91b2867ad895b4123", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeFrequency.java", + "type": "file", + "size": 1626, + "sha256": "3cfe927584b4b3ab59e71e35d2a17be112e2d36482ee3acaf7a3586bbdeef160", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeMetafieldsReferenceWithMetaAdjustableOrRelativeDate.java", + "type": "file", + "size": 2160, + "sha256": "d5b36a52f9e867990616683b2456e934917f46390742c466df610398f7903704", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeMetafieldsReferenceWithMetaAdjustableOrRelativeDates.java", + "type": "file", + "size": 2167, + "sha256": "b73822f4135e536a27c805d4119e2a0eb16bbf3158526531537f8e531bd2fb92", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeMetafieldsReferenceWithMetaBusinessCenters.java", + "type": "file", + "size": 2097, + "sha256": "75b3f0b1c8cd8d8e0a5e1ceb571ada88187ac2c7216d4c231969c67cea59bcb5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeMetafieldsReferenceWithMetaBusinessDayAdjustments.java", + "type": "file", + "size": 2146, + "sha256": "280e0db02ae4679e7bbcb4f1ec51f1ea1f1a723aa7ee306c37b2bbf67cee140c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeOffset.java", + "type": "file", + "size": 1856, + "sha256": "b467f491274ed24fab790cbc59f7861972cfc714e60a7823fa0ace398872687c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriod.java", + "type": "file", + "size": 1584, + "sha256": "9a7276e108d7ae3e8fd1c4f1b2a3cd6d95a8a0e84366e4d8bc4a5c6694095261", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriodBound.java", + "type": "file", + "size": 1515, + "sha256": "ea36b5c8b2c9d281994e4e7288dd8fc1c2a253a1bbf9f3647bf8a4bec1106411", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriodEnum.java", + "type": "file", + "size": 1022, + "sha256": "56604f898a32238400726f26b20853caedbb145196915d8090096936bbcffbf2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriodExtendedEnum.java", + "type": "file", + "size": 1054, + "sha256": "b7a4c93f49133ba2a348e66a3cd02360fa221148797552827f0e855cbaf99ac8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriodRange.java", + "type": "file", + "size": 1622, + "sha256": "ba76748701993c3cc653d24a5d0507c87ec30c759f70df62498e35d5ab8fa285", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriodTimeEnum.java", + "type": "file", + "size": 1038, + "sha256": "3cd0f7c3c841f28dbdfa9afc8e4e2e8b46e92273629253cb14bcc0e835e7a1f0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimePeriodicDates.java", + "type": "file", + "size": 2760, + "sha256": "75490ba84a139d221061a5a4b64681a6af0567c533c28ea2f492efc5d4651672", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeRelativeDateOffset.java", + "type": "file", + "size": 3870, + "sha256": "58a3305c7f7f844df0a380b3648025bf8ea51f9b8fad1452d7a02bf6918529b3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeRelativeDates.java", + "type": "file", + "size": 4384, + "sha256": "18caf957e38b8ded13a8e6f17efe2b7750d9ef20ac138e3818eab4923774dbe3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeRollConventionEnum.java", + "type": "file", + "size": 1054, + "sha256": "b0396e96e8186e713fbc43c265642cc96ab3edfcc898c8dfaf3c1fdfe9a04dee", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeRoundingFrequencyEnum.java", + "type": "file", + "size": 1066, + "sha256": "a767d8ac998260e5bf447fc5c701a3c8f74e3a07bd04015ce1dd6d70a8875285", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeTimeUnitEnum.java", + "type": "file", + "size": 1030, + "sha256": "c5350d45548d3662c54010664a1dc2e3f41bf93a3f031f3816201834895bc95f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseDatetimeTimeZone.java", + "type": "file", + "size": 1512, + "sha256": "67e1fab1120a7cfd403885e5b9d3a1e48fc8932a75aabd4d7bc82ef07c8f3c90", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathArithmeticOperationEnum.java", + "type": "file", + "size": 1058, + "sha256": "912a505b9057ddfad14ba2794d94f1c43b01a1bd23429c24bc80741174b67587", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathAveragingCalculationMethod.java", + "type": "file", + "size": 1725, + "sha256": "d43452c510793bb679cce153f183ec4676d474be1b07ae798dc4b93558503883", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathAveragingCalculationMethodEnum.java", + "type": "file", + "size": 1086, + "sha256": "a7eead4f8cae5a27531b4adf6b0df30b5422a99b914b64a177d9b988ac1f2543", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathAveragingWeightingMethodEnum.java", + "type": "file", + "size": 1078, + "sha256": "f6fff3abfb6c2b010e0d67eece30d32f2cabd0ec317a881a6e804e345a1caa6d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathCapacityUnitEnum.java", + "type": "file", + "size": 1030, + "sha256": "8a6767c089aade57278b87ac3e06484c628af8c282e861e189acc2e70cbb65e2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathCompareOp.java", + "type": "file", + "size": 1002, + "sha256": "9d79a036ebbb3676b6faa99ce4c15f9f4579bc0a00fbf16334dd0f7089f7208c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathDatedValue.java", + "type": "file", + "size": 1381, + "sha256": "80dfd9c09db99ee0326a81d6204c126dd027dee6c4b551a43d4bac312b164585", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathFieldWithMetaNonNegativeQuantitySchedule.java", + "type": "file", + "size": 1744, + "sha256": "611fd21b268bfae31f5d581e3bf6886dcd0213d91c3ad59a9f64fcc2444c735e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathFinancialUnitEnum.java", + "type": "file", + "size": 1034, + "sha256": "3d9491cdc5f760a059ef2d788009c393bbf401d54c308aa6d86ee55d8e4d69e0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathMeasure.java", + "type": "file", + "size": 1402, + "sha256": "6010bf110dc445b3f0b2f45908f5536b21194fae17dbffa733f65793a8ca305f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathMeasureBase.java", + "type": "file", + "size": 1426, + "sha256": "7a889a1635ef2b14d4c235b637b256fb1a8569a861523a6034658fe5688f8947", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathMeasureSchedule.java", + "type": "file", + "size": 1774, + "sha256": "17f4d6545fbc3daead698dfa088ff4558a64ef7397c124cee73c798796dd1d58", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathMetafieldsReferenceWithMetaNonNegativeQuantitySchedule.java", + "type": "file", + "size": 2153, + "sha256": "1beea8c02cfa587d43adf1ac178d428c6d82b7bcdf46511f370fd9c2ffaa9e6f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathMoneyBound.java", + "type": "file", + "size": 1484, + "sha256": "f7e2039fdcae3f01d06024adc6be14afe5bfe1b1d34bd08c21a3ddf6b8baa1b0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathMoneyRange.java", + "type": "file", + "size": 1560, + "sha256": "0633dbe07667b09575846001cb1a003a05e161e9d9324777be3f4eec43b392c3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathNonNegativeQuantity.java", + "type": "file", + "size": 2369, + "sha256": "005c6cda980408825981085f509ed1a89e2cfb0dbd31f852becd91c1e7229c30", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathNonNegativeQuantitySchedule.java", + "type": "file", + "size": 2441, + "sha256": "1d225cc36a7d5c6838ea71be265e858a4a945abf76c37e6316ee6394a5b5ff06", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathNonNegativeStep.java", + "type": "file", + "size": 1481, + "sha256": "757a15a5b17b50ef28b282f41de1993b2c37e4eb5498b91b7d1729fb899a3069", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathNumberBound.java", + "type": "file", + "size": 1446, + "sha256": "6fbee1b86c5ae9088709f59ebd56bc9822766f5b46a081da981dee608e381fc7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathNumberRange.java", + "type": "file", + "size": 1574, + "sha256": "e9db6e11b85dea27302b5efed35950369290d7874a932c0baac02bbdf8364e42", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathQuantifierEnum.java", + "type": "file", + "size": 1022, + "sha256": "2f034e7d023d228c6e6d819a0741407b3738071ef23db18323650a5925ede551", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathQuantity.java", + "type": "file", + "size": 2270, + "sha256": "407fa0a3399306198fce98c8af8582d860bfd6d3c3a9daa45cf01c4558162caa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathQuantityChangeDirectionEnum.java", + "type": "file", + "size": 1074, + "sha256": "b0cebf1e155ef679248f71f8008bb175800afb4be95bb9e3719a4cc204b1e2e4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathQuantitySchedule.java", + "type": "file", + "size": 2342, + "sha256": "42c01e2ee2d8413ccf7fec92a13c0419ba6909a70d55e51bc543cfd6a07479a9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathRounding.java", + "type": "file", + "size": 1621, + "sha256": "297a7646ccca7d110329584f697ba0e95bfd6b5faabd7fff8fb884ee46bb6878", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathRoundingDirectionEnum.java", + "type": "file", + "size": 1050, + "sha256": "9f99617955516bc9b3299be9a7c3e72332d2ef8ae424e09428464cc84a92e2f6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathRoundingModeEnum.java", + "type": "file", + "size": 1030, + "sha256": "86db40841f977ece530064182019035b45d58a27c59616323b75325d2f89a366", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathSchedule.java", + "type": "file", + "size": 1497, + "sha256": "a047de4e1ce9fa40e3a7c667f37c9814f265ac2c9a60a0e2bba3dacef0d39c8f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathUnitType.java", + "type": "file", + "size": 2223, + "sha256": "56161d39e99e57fb49958d53e01dfb155d18957cbf608a82ec5a019563788216", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseMathWeatherUnitEnum.java", + "type": "file", + "size": 1026, + "sha256": "229ea3d295adaa2542a5dcebcb63e8b0b8c703f1f00cbb1594f9cf8637ffb949", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAsset.java", + "type": "file", + "size": 2732, + "sha256": "2e586060e9b7f18a71deaeb7968e44a848469608715f66ecc2f850c8bf17dfe4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAssetBase.java", + "type": "file", + "size": 2811, + "sha256": "2b2d5599e7a80842c950f71092a1b5f582f839a236ce797524fe22d687d4e2db", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAssetClassEnum.java", + "type": "file", + "size": 1094, + "sha256": "96e22e7e5324a70d90de60c75704f00c08d80008076512e5aa91418961f88921", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAssetIdTypeEnum.java", + "type": "file", + "size": 1098, + "sha256": "d89bf9162f8ff6db30ca47dca80683f1bc5b75098cdcbdf2d621f2ef8e3a2ed8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAssetIdentifier.java", + "type": "file", + "size": 1831, + "sha256": "73342a164db42f4909796401a318c1321c14290ed4d68c00a2dc524d6710a4f1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAssetType.java", + "type": "file", + "size": 3162, + "sha256": "070b8faeb97ccb7cec342a2a9b2cd385e025add03cdc4328dbb59d9e6b45aef2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonAssetTypeEnum.java", + "type": "file", + "size": 1090, + "sha256": "a94c559bd1b5680a7e1471646a8fc30bddcf4f551ff2c6c274fe444cdbc2d11d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCash.java", + "type": "file", + "size": 2766, + "sha256": "f0aa69d37e5050584b8fb29a42eefebc98b87b7adc3cc94c1c197208a688333e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCollateralIssuerType.java", + "type": "file", + "size": 3424, + "sha256": "de37033fa9401877e5e0ef62005953b0b7793418d23ad1ebcedfad3be510ab85", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCollateralTaxonomy.java", + "type": "file", + "size": 1930, + "sha256": "5832c0533681c207edf350e86abd3539d72c40f587fa94fca093daa4cd9aae51", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCollateralTaxonomyValue.java", + "type": "file", + "size": 3630, + "sha256": "4ffb0d82baa1650d42dde72876ee870c109bbf8b3aeb292e63885e4b8c5c6cb9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCommodity.java", + "type": "file", + "size": 4138, + "sha256": "b53d77941d7102934f85201709b12144cebf038c549b737afaaff7d53a3b29d8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCommodityInformationPublisherEnum.java", + "type": "file", + "size": 1170, + "sha256": "74478232f0b8cecf749212cbb02331a9909be9de6e73ac4a0bf6df0bdd237405", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCommodityProductDefinition.java", + "type": "file", + "size": 2848, + "sha256": "971a662760d7a5df54ec61a0ad3cc981d823626334b7bd879c682eef88e19ebb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCommodityReferenceFramework.java", + "type": "file", + "size": 2449, + "sha256": "3f0cfb97571bd6b4fc165ca164517228edf0be997fdeec11a0ab079145057eb5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCreditRiskEnum.java", + "type": "file", + "size": 1094, + "sha256": "2d94711518c8169fef0c33d13e6d8533580beffb08d71bb86fa7d7c8ddadbb79", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonCurrencyCodeEnum.java", + "type": "file", + "size": 1102, + "sha256": "fc6be72a8ab874d0b9cb05cc3fe7c2d57f121934c890a1bdf3086d8e48fa7bf0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDebtClassEnum.java", + "type": "file", + "size": 1090, + "sha256": "66d5eff5428ba1cf91fe5f8b2fb6a7490d2849b37c4103c971ad32230477c52a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDebtEconomics.java", + "type": "file", + "size": 2253, + "sha256": "86a0df9f508cc86c84c4cb47b8d62e3b0af7d8abb415006d3696c9edacbd8aec", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDebtInterestEnum.java", + "type": "file", + "size": 1102, + "sha256": "a7173db5d2b2c28524adbcc7a30e98fd01ff8fe995bbf4a207adc6c7e8b314f0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDebtPrincipalEnum.java", + "type": "file", + "size": 1106, + "sha256": "7f078f470d612f342d3d8e8a1e0633ce8ea84da64479bae77e935a6a2e049a0a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDebtSeniorityEnum.java", + "type": "file", + "size": 1106, + "sha256": "ed13659166b87962474a6be94fcb7422ec3250bf50edd73d7dff4000d02f8eb5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDebtType.java", + "type": "file", + "size": 1831, + "sha256": "1bba4cfa46025db504b41ad8d8acf10b68f35c8b4b8c4e867ad5ccdc39820626", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDeliveryDateParameters.java", + "type": "file", + "size": 2686, + "sha256": "0eb393c5a78331f1a56ddd2360a409f87f3a20b6f46e864b6b3e8829fca0e5fb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDeliveryNearbyTypeEnum.java", + "type": "file", + "size": 1126, + "sha256": "77c8d5c61de3fa4bab22920d3d407611e7ce9c2b904051a9ba7ef4dbd322e482", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonDigitalAsset.java", + "type": "file", + "size": 2838, + "sha256": "6869e5afdaa9e6928f1a9f5d531ea2025f5e3a7be33ed558eb05b41d45bf5990", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonEUEMIREligibleCollateralEnum.java", + "type": "file", + "size": 1154, + "sha256": "5154c6e8f8427f25e9585fcd5fefd9295fa34a502945f77d353a08941073b56d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonEquityTypeEnum.java", + "type": "file", + "size": 1094, + "sha256": "02f7ba1d07e4e966a9c391ea6236295f81850f63ad3c0e848d737aa60115f650", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonFieldWithMetaAssetClassEnum.java", + "type": "file", + "size": 1784, + "sha256": "aca9066e8d50b35aafecdbc2e85001ae1ff74cb9d465c5857d43f96370afecdf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonFundProductTypeEnum.java", + "type": "file", + "size": 1114, + "sha256": "73da197ea4881640828f31412d05ca295ea204a83a4cbcc48f16ea36d3f2a0c6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonISOCountryCodeEnum.java", + "type": "file", + "size": 1108, + "sha256": "b64eb870bc1dae2da543bf987220d33a05a6a5f24eba35fd3847638f0295e89c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonISOCurrencyCodeEnum.java", + "type": "file", + "size": 1114, + "sha256": "3873aae12e41224c2914a0ef5a2460ac73ff2066aaf5083cc3830dee96e2ea1e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonInstrument.java", + "type": "file", + "size": 2383, + "sha256": "139a921d7d39f5eaacbed334374b2fb2e62a3c3b7c5699362b50e8b69ad405cb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonInstrumentBase.java", + "type": "file", + "size": 3258, + "sha256": "ad63a24bec33db2be3688849fa3a51bf604f713450508cc8f0146afb502bcc33", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonInstrumentTypeEnum.java", + "type": "file", + "size": 1110, + "sha256": "7ebb6f59c65ff7dc4312dbc07856638a3d1b6a4e988b104ed60cbe9365d80030", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonIssuerTypeEnum.java", + "type": "file", + "size": 1092, + "sha256": "298287d0e16a4be98167726c97a40e24d54793a0c44a3d01e51f1057108c5050", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonListedDerivative.java", + "type": "file", + "size": 4131, + "sha256": "4586bdc4534239c605e7f5f04dd8b08062fc8cf766b15f99be503e2911fcfaab", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonLoan.java", + "type": "file", + "size": 4729, + "sha256": "3318f4152470317e3f4fc888bf37236fdcaa1e2fe8089e1214ff150a21acc201", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonMaturityTypeEnum.java", + "type": "file", + "size": 1102, + "sha256": "afc75ebfc22d8af1f917a103272805271335d9e140a60db996b4d1bcb8ba9398", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonMoneyMarketTypeEnum.java", + "type": "file", + "size": 1114, + "sha256": "8ceca45b26a0fb48e22927c762be9754b4d1438ca5c4ff5110e791765d3469c1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonPriceSource.java", + "type": "file", + "size": 2352, + "sha256": "6893d77ac9bf6c1e31173d9519e35f12cad6245cbb4ca3b655003b0b31c9ed4a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonProductIdTypeEnum.java", + "type": "file", + "size": 1106, + "sha256": "2b45205b09866b6ea7084f7fdd381128b9aede042fc0778bf17c1fd97b0fecf2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonProductIdentifier.java", + "type": "file", + "size": 1793, + "sha256": "e4b07fbf987fb50f55fd9c75cff9d4fe1d9f2b421054db82239bab4c1275fd4d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonProductTaxonomy.java", + "type": "file", + "size": 3008, + "sha256": "cb1833c312f7e0520f17d1401428557f95874c9956c8dfe85b29f25e11c46067", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonPutCallEnum.java", + "type": "file", + "size": 1082, + "sha256": "b64eaee8e5d7c0b9d55118c6f1b62d552a610ba83d39516e2eff33988264e85c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonQuasiGovernmentIssuerType.java", + "type": "file", + "size": 1758, + "sha256": "d41deaa4d6b0caeae5fa05a8f256570d0dcfdfed6695f91b2b760b0c917dac12", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonRegionalGovernmentIssuerType.java", + "type": "file", + "size": 1470, + "sha256": "e6f6116659315b46969a9faf58a056db9982bca313bfe5716c6f12eca65186c2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonSecurity.java", + "type": "file", + "size": 4235, + "sha256": "b4d293f5ab160edf5c1e94a024a7856428407d1059bd4f1242366b0b1ab3951a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonSpecialPurposeVehicleIssuerType.java", + "type": "file", + "size": 1541, + "sha256": "6b723b86a4448ea52368f2184db3dca34a5d6af76771a9ef4e559edc95dc8f7d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonSupraNationalIssuerTypeEnum.java", + "type": "file", + "size": 1144, + "sha256": "27a1bb8a641b1a161c64ba08a8b2ebd67786fee49c5eefb43c8c4e35563e9118", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonTaxonomy.java", + "type": "file", + "size": 1714, + "sha256": "4e2dd500506473c12daf0702d6c1001c90f845b213f6a1b96b5c0a55acd2c43c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonTaxonomyClassification.java", + "type": "file", + "size": 1876, + "sha256": "a68b4270ab241ba88c37256361269b05e5723758bca8e1838bd14b0b02a17101", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonTaxonomySourceEnum.java", + "type": "file", + "size": 1110, + "sha256": "ece653faba7c62fadd0f12b7f1c0505290d944c2e4d039bceb73f9e05d420885", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonTaxonomyValue.java", + "type": "file", + "size": 1542, + "sha256": "b2178852957383ae9c080acd46d03c502599d65c9c6db2e7d573a5cf39c5c971", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonUKEMIREligibleCollateralEnum.java", + "type": "file", + "size": 1152, + "sha256": "991e32d7776c17f447ff364e42d7371726e68b6fb29f2e37dd8d69aff5224a80", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCommonUSCFTCPREligibleCollateralEnum.java", + "type": "file", + "size": 1162, + "sha256": "036ca250afce363994ab065267afb2571079c9d910a75fd5b84505c2a6fb6f9b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCreditNotDomesticCurrency.java", + "type": "file", + "size": 1705, + "sha256": "9993a4d4a35fb89fcfbd002b46b05899d202d0371cf0f41cee99093f0cd9f1f4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCreditObligationCategoryEnum.java", + "type": "file", + "size": 1126, + "sha256": "0e5ae45b3ab09147a797ed5ed22bb4d0900554840d4142cf4b0785981d7e1ee7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCreditObligations.java", + "type": "file", + "size": 7058, + "sha256": "ee79ac35fd825e3056f2a132105492a93b6c30313ec8e86f1323a2767de4f597", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetCreditSpecifiedCurrency.java", + "type": "file", + "size": 1693, + "sha256": "12909ede2a9d87fe5f9831fafec94a60a8d8267430c5f5812e6ec9f1a194cc44", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetRatesFieldWithMetaFloatingRateIndexEnum.java", + "type": "file", + "size": 1838, + "sha256": "639812a89190b93e061915dac729cf40c0e9e040995fb1eb8333ad87a9559609", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetRatesFieldWithMetaInflationRateIndexEnum.java", + "type": "file", + "size": 1847, + "sha256": "ef3792e0035f1319d023f16da582ece1ae319d70011422e3e46e8f529cca3bbb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetRatesFloatingRateIndexEnum.java", + "type": "file", + "size": 1116, + "sha256": "6e15033dda38686552441eed327b3b02e29ef77c60c48522b006f6c20ce6f14a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataAssetRatesInflationRateIndexEnum.java", + "type": "file", + "size": 1122, + "sha256": "f0fddb6c9b6d47d1e7728b586ee69317247d84a5c0913e2f5dfd464eb96321d7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierAssignedIdentifier.java", + "type": "file", + "size": 1722, + "sha256": "99853f884ad94151a0b55d6fbe6c4e6e017fa068da13186d4b07994ab884f1fe", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierCommodityLocationIdentifierTypeEnum.java", + "type": "file", + "size": 1172, + "sha256": "84d47672bd034dffb3226bca9ece6b2b3e3b89ca650b30a9caf70f8bf3f99400", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierFieldWithMetaIdentifier.java", + "type": "file", + "size": 1737, + "sha256": "e09db2017131a44a75cdcf49dae7810aa630de5563f59b09fc2d8329308f9373", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierIdentifiedList.java", + "type": "file", + "size": 2069, + "sha256": "0d012396794dd99606777afef87a7ffeccd757d3c159ba0369b35753ef727d97", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierIdentifier.java", + "type": "file", + "size": 2268, + "sha256": "eb56e4f674d0792fcd4068f1591f24d9575e78e0e266d02a03b12278fe85f184", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierLocationIdentifier.java", + "type": "file", + "size": 2833, + "sha256": "88f99ae929b1edcd9123d97a84492245ea687a0078695e2ef0a91345746ab046", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataIdentifierTradeIdentifierTypeEnum.java", + "type": "file", + "size": 1124, + "sha256": "a7a7adaba9ccbaa242b03853af4dc4366cea4d3c5cdbafe12e95954a5ec5ac4b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyAccount.java", + "type": "file", + "size": 3365, + "sha256": "3e7d8155a0b75eae5beced45bd1f18abc94f144174fa34bc8a7a74cbb11a9ddd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyAccountTypeEnum.java", + "type": "file", + "size": 1072, + "sha256": "360105697fa76628720fe4f2a15e4f6c4cb3fb5b163fc73b8fe5e9317c5b7def", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyAddress.java", + "type": "file", + "size": 2244, + "sha256": "3279a10f605119400f4b26e570b2817f6d232d09e98ea9c25bb5e6d955d49588", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyAncillaryEntity.java", + "type": "file", + "size": 1785, + "sha256": "58108a5632587588ceaa0fcd114ffdac5db5141bf3702333e19736a0234b4ce0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyAncillaryParty.java", + "type": "file", + "size": 2190, + "sha256": "3a4daab7bc6c543f85a347cff601897a5b9b76f761eb64cef2643d1e63f6e01b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyAncillaryRoleEnum.java", + "type": "file", + "size": 1080, + "sha256": "1777af0c61ac9cedd4b625abd000e6f09860a7ce5a7df733b138edff06e6274a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyBusinessUnit.java", + "type": "file", + "size": 1803, + "sha256": "7bb3a3eb6f231f760f3aaff2cee9f7f74c0b5f099b41b464d7e13595e89792a0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyBuyerSeller.java", + "type": "file", + "size": 1699, + "sha256": "b2ce8aa2254711fff9e508275f16b2eebd1586f49fd8070d651794ea8f846f23", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyContactInformation.java", + "type": "file", + "size": 2265, + "sha256": "0dda89598a27ad7b8198e792471d3c0bde6b85d80c1f59ddbc7eaa14186b43cd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyCounterparty.java", + "type": "file", + "size": 1790, + "sha256": "bceb2a7f2492db9bcef06a0ef69dd7fd00ed475f6f1083e84edd156957d0e795", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyCounterpartyRoleEnum.java", + "type": "file", + "size": 1092, + "sha256": "755c8929233a179280a27cf558b9d4d04007dabcb75f3dd0faadbcc2bac7eaf8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyEntityTypeEnum.java", + "type": "file", + "size": 1068, + "sha256": "91c2e31a63ad03bab506dab27134c726e717cc75b481cfb0bbf79a34735aad4c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyFieldWithMetaAccountTypeEnum.java", + "type": "file", + "size": 1737, + "sha256": "a4971b03fedfad6afd3bb8e7a1665ff97a928f3a8d80896285cb280574727745", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyFieldWithMetaEntityTypeEnum.java", + "type": "file", + "size": 1726, + "sha256": "e26967fd60bc6698a1cb1a1802b67e33af23de387cac0f7e39456088c30d8706", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyFieldWithMetaNaturalPersonRoleEnum.java", + "type": "file", + "size": 1791, + "sha256": "dffbe18b0be6d0f2c3e5a0ed060ebfcb48cfe4fbb0f1040de1d8e75e0caaaf20", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyFieldWithMetaPersonIdentifier.java", + "type": "file", + "size": 1746, + "sha256": "02fe878f3661a86704bb1d0b53ec8c89e482404628c8ee8210d371165dffa0c0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyLegalEntity.java", + "type": "file", + "size": 1412, + "sha256": "53f5f8f16048ecbeab5b880b0e6f1d297a95ca3e5dfdca314c3e69b3f932147c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyMetafieldsReferenceWithMetaAccount.java", + "type": "file", + "size": 2092, + "sha256": "8b5f953af5f384069af39af2fcc638ae2d74e14c56b4b464d520a6d7f47b0697", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyMetafieldsReferenceWithMetaLegalEntity.java", + "type": "file", + "size": 2120, + "sha256": "bd7042851074fc9a8295e71ee3bda3c18ff6136b6046d070120fe44f31433232", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyMetafieldsReferenceWithMetaNaturalPerson.java", + "type": "file", + "size": 2134, + "sha256": "c3d69c4b7ebc744539bf18b2f4de54b3ce271813fdbbf0a8a8033a9e805a55c5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyMetafieldsReferenceWithMetaParty.java", + "type": "file", + "size": 2078, + "sha256": "fb86008f29bc86d470439bfe559eeac5d3eca34afd5bfd39035258bbdf419d76", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyNaturalPerson.java", + "type": "file", + "size": 3566, + "sha256": "d45b2053f9fc59fd456a1af39a27da8cd8a2d17f17f3ee68f3f37fd6d9d7a77c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyNaturalPersonRole.java", + "type": "file", + "size": 1934, + "sha256": "b1bf3e7b9acb8cd47bddc3a10ec4e43820f8417c20b69947acc3e1c93e5fbd95", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyNaturalPersonRoleEnum.java", + "type": "file", + "size": 1096, + "sha256": "d04d051a12d371494cefc728f14fae3d49e835d3b32c788a643d1ab25ffe7531", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyParty.java", + "type": "file", + "size": 3095, + "sha256": "9a40dd43726e063c892943a8a867f745c4392dec2b93756738b4b745917d55ea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPartyContactInformation.java", + "type": "file", + "size": 3012, + "sha256": "4f30175c6bbf9162459d96ea9182f13b89bf6e939bf566dc41c792f2954b62cc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPartyIdentifier.java", + "type": "file", + "size": 1799, + "sha256": "5dbd66b743360bc73489cfb6edfe76fdf203fe713a81c0e1cfd2b4b5d335262c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPartyIdentifierTypeEnum.java", + "type": "file", + "size": 1104, + "sha256": "dbc112b4a12726079cebe15f0fb732c3d8272c41c2ffa9f93663667bb783d145", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPartyReferencePayerReceiver.java", + "type": "file", + "size": 3074, + "sha256": "25af0aeb519baf88fb86cf8ac54bc00a315b97d28b1dfcc4ebb9de6ad3767cc5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPartyRole.java", + "type": "file", + "size": 2229, + "sha256": "3cbb131df9d429e007d1ecf3037ee74321dd4b99e146fbab7d0abc0cfab3164e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPartyRoleEnum.java", + "type": "file", + "size": 1064, + "sha256": "d85546ee1e3263f3c0b6247630253a6adbbfe3b5f206697ab66511a53631e0ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPayerReceiver.java", + "type": "file", + "size": 1725, + "sha256": "0cf0deb258d21639c9d364f494093637b671ff03e291b50a539ee0294565512a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPayerReceiverEnum.java", + "type": "file", + "size": 1080, + "sha256": "1c027ac388e94a531910e8743a11cc5020e101933d28e26ecdcce0d72bf07542", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPersonIdentifier.java", + "type": "file", + "size": 2121, + "sha256": "3fd72f953045a7da0d8dd3a6e52697f5818a4d49d284ba3ec2066fa4aebd1f2d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyPersonIdentifierTypeEnum.java", + "type": "file", + "size": 1108, + "sha256": "f50eba0a788c764da65ffe83d27a1eadbac8fda8dbba903902885cde5e291bc2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyReferenceBank.java", + "type": "file", + "size": 1726, + "sha256": "bc6d667aaf11476cea52f8592612513e3889922aad7d4c133f65a0aaa140b7d0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyReferenceBanks.java", + "type": "file", + "size": 1465, + "sha256": "2224d2284b1f3c09abf8521f62c79735b115a45a778169971c1a58f61c3639e8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyRelatedParty.java", + "type": "file", + "size": 2207, + "sha256": "15d2e2f5472f50fa4523cd64b0a3656d0d3c8705b2aeca15227b7666057a8ba0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyTelephoneNumber.java", + "type": "file", + "size": 1704, + "sha256": "ef6fed6d36dbdc90cb611c1f0aa28d9bd8495526b92c8f61602bb1b8f8fa402b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmBaseStaticdataPartyTelephoneTypeEnum.java", + "type": "file", + "size": 1080, + "sha256": "98743b3159292c407977fc246e71d3268e13f19d8c47b9be8ceb6503de0592ad", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonActionEnum.java", + "type": "file", + "size": 1018, + "sha256": "fcd4028b0b325507f63ce1e0141c781b8c7b55ccef89553e1429e558785324aa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonAffirmationStatusEnum.java", + "type": "file", + "size": 1062, + "sha256": "0e359ab6a66472a64b8f8a70c1e02e3cd934988180639a64a609621801ba16ab", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonAssetTransferTypeEnum.java", + "type": "file", + "size": 1062, + "sha256": "f940fb73121777cee55f34aefcc3eb5f1ffa2d8da0461f1fb4a626b6a06a2631", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonBillingInstruction.java", + "type": "file", + "size": 3132, + "sha256": "0f37e50eadfb9d1f2d2282936333dc13fb29d68f1066754fc03ce342c87b57dd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonBillingRecord.java", + "type": "file", + "size": 2543, + "sha256": "c5117a4c1359d22dde5bb70e62f60dca6d43935a2f72d5614cd513c40defd1c2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonBillingRecordInstruction.java", + "type": "file", + "size": 2660, + "sha256": "a9efcc02193c37c673165cd346870b7667ea717bc3aad248aaa32a463d722eeb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonBillingSummary.java", + "type": "file", + "size": 1730, + "sha256": "916131c654af1d6ded96742b6e54c643044376e236f81da16f824ec5c1f01e46", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonBillingSummaryInstruction.java", + "type": "file", + "size": 1462, + "sha256": "0b6d9162c3c0dd8ed1b663df383749866c3a62d29870b7e940a2d26a5a471a5b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonBusinessEvent.java", + "type": "file", + "size": 3498, + "sha256": "8a2d0e7073b318c5219a36995e9cd05649446187c19c1bd306a752d401545d27", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCalculateTransferInstruction.java", + "type": "file", + "size": 2918, + "sha256": "683d1da1f9af4cc5384b4d0fdc972dd9a6faa51eb721cb7652c0e238ed5a6be6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCallTypeEnum.java", + "type": "file", + "size": 1026, + "sha256": "0250ad4620b7d756996e1d2a1b3019b52b1ca49fb6304cad57a72a2a3fb13a67", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonClearingInstruction.java", + "type": "file", + "size": 3176, + "sha256": "a6850259ff7257088ffe42fbdef9d6bdbdd786876bb4efc43dfd629733dcb44c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCollateralBalance.java", + "type": "file", + "size": 2576, + "sha256": "fc2fd6702097b07eaf7b86da63a9f20054cec69795fd81677f290354746ee59b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCollateralPortfolio.java", + "type": "file", + "size": 2721, + "sha256": "4c09df7ba730d2b101e6960b93e2e830c35adeeeb6f6e381bf571cf860d51aa2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCollateralPosition.java", + "type": "file", + "size": 3182, + "sha256": "e8905a2a579b9699331d44669bb5337d0a7a6d43ce35613049a45ead39ff98d0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCollateralStatusEnum.java", + "type": "file", + "size": 1058, + "sha256": "2a1908699e6b5b23f6c7f591014bef645732d0841e5cd37d68b47e0bbe42aaba", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonConfirmationStatusEnum.java", + "type": "file", + "size": 1066, + "sha256": "9792b5d1d3628e7dcb34d8c2690960c7c10cf51fae6621672ed01519aa62b3bc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonContractDetails.java", + "type": "file", + "size": 1851, + "sha256": "f19a10d32bb865baf9d714b8f436ac29f3289e33bd4d67174f8d6ba7a1e9daf5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonContractFormationInstruction.java", + "type": "file", + "size": 1518, + "sha256": "73f3fd7c51d73190dbf51754e7b0bf8638fb43ff4b8bffb3e4611b821038ed5f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCorporateAction.java", + "type": "file", + "size": 2165, + "sha256": "f1c7876cfc401bbf7c5617b291b86e8c9dbb2d155f0a9db2273d2466d66dac14", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCorporateActionTypeEnum.java", + "type": "file", + "size": 1070, + "sha256": "305834b6378d2a8e09779ffe872f8493da4e0e9bf02b1b493dc7e858a77f40c7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCounterpartyPositionBusinessEvent.java", + "type": "file", + "size": 3179, + "sha256": "6ba771497a20de2de4581a28e1894915c4ed92ccfa82fef1ae0a6b7d618bfd16", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCounterpartyPositionState.java", + "type": "file", + "size": 2526, + "sha256": "ae19f15e0b3979528e0523280884aa87dee869a8b78a6e616a7096998522790e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCreditEvent.java", + "type": "file", + "size": 3385, + "sha256": "2ea65849c91aa04d2d02cfd7ca02bc6de38dc3d8b9941e913937e753b0541489", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonCreditEventTypeEnum.java", + "type": "file", + "size": 1054, + "sha256": "caf1ae55baff8ef5519ca3291a15bd3968446578e5439849ecda765e5a0064fb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonEventIntentEnum.java", + "type": "file", + "size": 1038, + "sha256": "fbac19ab2df970281f8998e4d27bcbe435c7e02c1743e580438d7509f4dc3194", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonExecutionDetails.java", + "type": "file", + "size": 2120, + "sha256": "3de07434b65faef2491ddba91eb9175e74d7301ca16bea750c1672285e5becc0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonExecutionInstruction.java", + "type": "file", + "size": 5213, + "sha256": "81415694db1fc9699c078334ba18cfee2457232a263f2b39014ed44801a1bb44", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonExecutionTypeEnum.java", + "type": "file", + "size": 1046, + "sha256": "8e7293c55c41c27aeb559aed9e4c32bd3e407e39a057d3474f465a62725bb86b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonExerciseEvent.java", + "type": "file", + "size": 2932, + "sha256": "43fa7aa3af6e6d95f8d84035fb2da0b2df46c6c1ef84b1dc6911f436a8192cec", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonExerciseInstruction.java", + "type": "file", + "size": 3020, + "sha256": "ffeb149f072c05235f136a96b2c2f737d2912913000cf86f288012cc2ec326be", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonExposure.java", + "type": "file", + "size": 2318, + "sha256": "1132c0ceadb9616af5f4c999ce8c87fb555797fe00e9bf5cad7e39c5dc355d49", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonHaircutIndicatorEnum.java", + "type": "file", + "size": 1058, + "sha256": "34926db412caa515e39187bbc2288075796e727ff1dfc25a881b83cb30c21094", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonIndexTransitionInstruction.java", + "type": "file", + "size": 2058, + "sha256": "910313e2e210ab85ab60702a1d4b62c398dcaa9df14a636818fcdf090aa277fc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonInstruction.java", + "type": "file", + "size": 1757, + "sha256": "7fd57751eaf86c12c321f16346e7c92dc157f3c52ffb811c513048c65600eeb2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonInstructionFunctionEnum.java", + "type": "file", + "size": 1070, + "sha256": "e631792055c96a688f855d1df955c7e2b84990a91de0130e5d7c0c66061bdc16", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonLineage.java", + "type": "file", + "size": 2349, + "sha256": "8cd67c582565f6c9d495fceb57d144d8f3c8273578eb60a4dd75109c634f3f58", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallActionEnum.java", + "type": "file", + "size": 1058, + "sha256": "99e85aec4cbfa1df3a1b6657c32fb8f2ca4d2a3511ead013c67c3f3212e5197e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallBase.java", + "type": "file", + "size": 6142, + "sha256": "cce47c6e9894e3af2c4c983a6a33ca542ada55436463a3a0a385c3703cc554e6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallExposure.java", + "type": "file", + "size": 7241, + "sha256": "a565ca5140fc4585cca168546f5ce85c32a9410825abe03d2406096904e01d29", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallInstructionType.java", + "type": "file", + "size": 1692, + "sha256": "07fda6aed6c8214520f4a60912642d782effd900d44e7f2f641bc6847d414586", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallIssuance.java", + "type": "file", + "size": 7157, + "sha256": "f38388a4e1ff0848843684322d5e7592d0b483f6e96259da5f97abaf5a4ebabc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallResponse.java", + "type": "file", + "size": 7465, + "sha256": "5b0f618d79a9bbc36e733fea8b588d8d1bc70932fd389bcba65f2bfdd3c46a7b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallResponseAction.java", + "type": "file", + "size": 1938, + "sha256": "9aecc38e944853ff174bafb2a62922d787133fa060b9196089d1ea75442d3494", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMarginCallResponseTypeEnum.java", + "type": "file", + "size": 1082, + "sha256": "38aea7363b5f673b908050c4a41c6e65150993c03788f9ab149fc69f7206555d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMetafieldsReferenceWithMetaCollateralPortfolio.java", + "type": "file", + "size": 2118, + "sha256": "cdbeca9a5054bf933645c304d7c4d2a72e79a7b762489bb84e643b2c40a23b1b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMetafieldsReferenceWithMetaContractDetails.java", + "type": "file", + "size": 2090, + "sha256": "acfdd666e505fd897cdc9298bfe9e7dc7277ae3f22170e0f1681680b9d81b825", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMetafieldsReferenceWithMetaExecutionDetails.java", + "type": "file", + "size": 2097, + "sha256": "86f7f90bde22298d63bf52a88382f5820c52e628d40a5b09c99b64d20720c627", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMetafieldsReferenceWithMetaTrade.java", + "type": "file", + "size": 2020, + "sha256": "f327aecd233f2394836c3592431e2f50907b75263b0040a8d566e2231b41d35d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonMetafieldsReferenceWithMetaTradeState.java", + "type": "file", + "size": 2055, + "sha256": "030e29c092fac03e72859de1fb9ca89de078e1472881c04101d6c8ebeb63f119", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonObservationEvent.java", + "type": "file", + "size": 1694, + "sha256": "88a45a35768a262cdfb8948a620907079b8b76e3c501f0cc486f8dcc305cf6aa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonObservationInstruction.java", + "type": "file", + "size": 1428, + "sha256": "9cf9459443bfff0d743b58e9902263951c788882c16c1595420a78e4f8a76934", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonPartyChangeInstruction.java", + "type": "file", + "size": 2431, + "sha256": "715355ebdb928f375864be0edaedab70642cb148d979f807c094d9ee7d607fcc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonPerformanceTransferTypeEnum.java", + "type": "file", + "size": 1086, + "sha256": "5398789123e8e6869f89d147f3ba0756784794a78a9334b6e3f736ffe0ce456c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonPositionEventIntentEnum.java", + "type": "file", + "size": 1070, + "sha256": "960d15674dfc2d9524281fe376d19b7635976ab62c014f78ddaba7c10b994a48", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonPositionIdentifier.java", + "type": "file", + "size": 2635, + "sha256": "ae4ba329282e7c9c4ce07b233f2283804c6b66989296bf5f70a6dd95f970d801", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonPriceTimingEnum.java", + "type": "file", + "size": 1038, + "sha256": "1d611cccd9655521bd7d3130d7762ddb7cae2b54cd08ba027871087fd56ca626", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonPrimitiveInstruction.java", + "type": "file", + "size": 5421, + "sha256": "5cf6e0cc2534474287582a728111f89709559d14025b18eaf5dc54c8ca0df7f6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonQuantityChangeInstruction.java", + "type": "file", + "size": 2140, + "sha256": "81bf847fcdc98513ee4c73a2da95f948a6d0f819fa97aaa49ae1168c82c7b081", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonRecordAmountTypeEnum.java", + "type": "file", + "size": 1058, + "sha256": "6c7476cbae7ae3db09bd2f4cfeba9baa0ed7b0df4f64bbda7a1109ad1716923c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonRegIMRoleEnum.java", + "type": "file", + "size": 1030, + "sha256": "a27c7c814dea3bc7fed931abb81fa45361079797b987af2aaee6f45a63cf67f2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonRegMarginTypeEnum.java", + "type": "file", + "size": 1046, + "sha256": "ef41ed57b91ce5f7b6c2b7eae2d37384c91f2420c7ac90b2add1d62dc45d62db", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonReset.java", + "type": "file", + "size": 2596, + "sha256": "04a7dd13f54a4fe84c00cf425383711a55bf23a123b27b857b764511fec7f8e6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonResetInstruction.java", + "type": "file", + "size": 1937, + "sha256": "4727f02f62fd9bb77af55544a8f59ce3c1684619ae1249167042ef54979098ed", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonReturnInstruction.java", + "type": "file", + "size": 1355, + "sha256": "3378b0d2f407c5d9d214310a195f65ee9e0668a60c614c4ae7eef52be03494ab", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonScheduledTransfer.java", + "type": "file", + "size": 1881, + "sha256": "4483b133413656017eab81553a8895047c5ce165c2ba9a7aa4f2947f9ed4346d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonSecurityLendingInvoice.java", + "type": "file", + "size": 3029, + "sha256": "571b5cb21020bd26abfcc3e389c04407166dbf562c3d0e816f2e863e1734a499", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonSplitInstruction.java", + "type": "file", + "size": 1406, + "sha256": "6a4dd9cd93c73287d58e3cfe3c17f263a1cb73a6dceb772f33226993b16a4048", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonState.java", + "type": "file", + "size": 1668, + "sha256": "6d950f79697fd20923435ec5a6d929699a75d4431812a7d576c9948c0d09d632", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonStockSplitInstruction.java", + "type": "file", + "size": 1612, + "sha256": "0eae5a0f2c9c14f759fdd2ce9b5240ae4821dc61237122e1dbcff0d9a791a3c4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTermsChangeInstruction.java", + "type": "file", + "size": 2146, + "sha256": "715ab367bfd33e2380a788b6259aba27a9f8ae8aa5b49d31045c44972400fda8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTrade.java", + "type": "file", + "size": 5756, + "sha256": "9313e2ea16de0fc255273d01822cc1f944d33680865172a574ace718eaff18cb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTradeIdentifier.java", + "type": "file", + "size": 2611, + "sha256": "d93058744fdbfbddb5f424e34772f8ceddd88c9052f9f11fb6bcf60a19b4668b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTradePricingReport.java", + "type": "file", + "size": 2012, + "sha256": "29b75fe9602b242e9b8ced6b1b4cb28738b8c0bcfa34a330803a6e0723f1c1ef", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTradeState.java", + "type": "file", + "size": 2909, + "sha256": "fad4b154bf008d317409b827e4cc213bef3ec08dddf4163104eb33f2d9e168fc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTransfer.java", + "type": "file", + "size": 3823, + "sha256": "c8748868064abdff5f9f72c133c8ba130d3731ba34f40e05d28f3ac78a320fba", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTransferExpression.java", + "type": "file", + "size": 1752, + "sha256": "0ca305a948bb6400e6be4ff9ab015d3cb5742cf7bb0dbe90afdb78364fb11013", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTransferInstruction.java", + "type": "file", + "size": 1422, + "sha256": "5d9748afebfd3a9055b424ac6e1bf670370192dfd8e4edf810460a642e1069e4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTransferState.java", + "type": "file", + "size": 1648, + "sha256": "90a95e8706575772743aeb1b5c25bdec11889853eb7e01c6ba85c511c28d46de", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonTransferStatusEnum.java", + "type": "file", + "size": 1050, + "sha256": "37f1d7fa851933e47a0f56f5b3f10d0a9756147611b13586393b2bc124f55526", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonValuation.java", + "type": "file", + "size": 2923, + "sha256": "4a44594229172ad5a94b10aec4c31d970f6279517d9fc7075dd14f79aa30ca88", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonValuationInstruction.java", + "type": "file", + "size": 1617, + "sha256": "2d458c223ca534d4b57cde1e8260c74d8e749bb45779018f19791ff6e727eb9b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonValuationSourceEnum.java", + "type": "file", + "size": 1054, + "sha256": "da03df61f45c7482c4be2706591f508e89832b05b9d7e85e177633af9ebf45f4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventCommonValuationTypeEnum.java", + "type": "file", + "size": 1046, + "sha256": "df0b2051a87f213741ced01026809367f5270867dfb2e4398c33a716d70ccf9f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionAggregationParameters.java", + "type": "file", + "size": 3410, + "sha256": "08fdd8008248c070afd622589eb732d65d63df1fd5745880a09c076fae4bcf7d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionAvailableInventory.java", + "type": "file", + "size": 2993, + "sha256": "aeb5961533d304f76c23861e4790defb0d9697d57b73c0349f29767cfeb99b73", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionAvailableInventoryRecord.java", + "type": "file", + "size": 3407, + "sha256": "04b0b5fa3e3322571ce42d95a05f198103db6d86744314546620ac5af92c846d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionAvailableInventoryTypeEnum.java", + "type": "file", + "size": 1090, + "sha256": "05056b747c246b2f7231db17a51e72a86843754c3895f9ffb530155ca30b7fe4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionContractBase.java", + "type": "file", + "size": 2287, + "sha256": "f5f5c3a8730618d9602764f8674a8712f3fae6a3013148c6180af9baa0fae687", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionCounterpartyPosition.java", + "type": "file", + "size": 4428, + "sha256": "736965f090dc6d02403faefb89825ffae525b8dbc635fabf243f4199f7136221", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionInventory.java", + "type": "file", + "size": 1408, + "sha256": "834189fd78dad43fb0cfee25e7c84d712d77795c878d561ad607a76b8b2bf77a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionInventoryRecord.java", + "type": "file", + "size": 1716, + "sha256": "48e7dd22f193b4ce3896e547575d7005374c8321a680704019ebcab76b7981cb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionMetafieldsReferenceWithMetaPortfolioState.java", + "type": "file", + "size": 2097, + "sha256": "8863624c5f706a2ee96401a2307b11e4290fd271648132e9b27e77794e8ec2c5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionPortfolio.java", + "type": "file", + "size": 1766, + "sha256": "7572cd310f547d2c60842e263f60511fecd78cb6cbd6504d610cc26851c7c3f9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionPortfolioState.java", + "type": "file", + "size": 1638, + "sha256": "0984b5ef5fb24f78e464ab558bcfc8790122e5282eafe95caac4c65a1753a91b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionPosition.java", + "type": "file", + "size": 2356, + "sha256": "776184989f7480c9943f7ca59945c3fcd8ee16af9e6dc01537336b3313396fbf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionPositionStatusEnum.java", + "type": "file", + "size": 1058, + "sha256": "d38c7701816a26d787d1d4ea1d2ed1b00aae5411cffa6da222aedfddcc63af60", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventPositionSecurityLocate.java", + "type": "file", + "size": 2957, + "sha256": "0f6fdd4eeafddca4dd8ae271b805f467238d9285da8951b7f5ac5084639881d9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowCreditLimitInformation.java", + "type": "file", + "size": 1499, + "sha256": "6951dc0a681aa59680370711b6fffe4b5f47f1ff7964c259e6af745acb36eb57", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowCreditLimitTypeEnum.java", + "type": "file", + "size": 1062, + "sha256": "51f0688218bf183732890ef9ead17fb190d178674d1e8451a052649a0907e46d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowCreditLimitUtilisation.java", + "type": "file", + "size": 1779, + "sha256": "39c7daaea5226d83d9499da0cad0627fb52d1e4f2c949abaa473c12e31505c7e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowCreditLimitUtilisationPosition.java", + "type": "file", + "size": 1887, + "sha256": "482a762be8c5ff9fd8c760d5c5444e10cbc7d7f7eeb3bdd15f3d3d4b9e278f2b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowCustomisedWorkflow.java", + "type": "file", + "size": 1529, + "sha256": "fed2693e84c908eb8cfb67e28171faf9a5299f97a9aeebba6dc62c73460d59e4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowEventInstruction.java", + "type": "file", + "size": 3005, + "sha256": "7a3f7ff092a110997ef18aabdc6aac5346484cad9929596e55eb8130b324dc74", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowEventTimestamp.java", + "type": "file", + "size": 1656, + "sha256": "2639b5103fefc475c3f2810240e8de54e491493439d8e6fa01beec29a309951e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowEventTimestampQualificationEnum.java", + "type": "file", + "size": 1110, + "sha256": "d27d32eb426c1ab71c88c19c33416c545dec278a6428b717f8746d42424c7ac6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowFieldWithMetaCreditLimitTypeEnum.java", + "type": "file", + "size": 1715, + "sha256": "d94d927ba67beda69984978d2ad1d50a5786fd8f1caf6c6b8b6313934bd922ee", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowFieldWithMetaLimitLevelEnum.java", + "type": "file", + "size": 1672, + "sha256": "a543f58c7d538ea3b77f6b61f635fe36742bdd321f82ade401226c43c46ff52b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowLimitApplicable.java", + "type": "file", + "size": 3169, + "sha256": "9095a94d8a58aeca40f2fbddc1789195449a8a4eb3d66ea20828612a84637310", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowLimitApplicableExtended.java", + "type": "file", + "size": 4205, + "sha256": "d1b1bf6b0435e3dbaf01a70fc164cd3cb31d587306ebb1de9b833d403db7c3f9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowLimitLevelEnum.java", + "type": "file", + "size": 1042, + "sha256": "8450aae8c89fe64d6accac2efb023c39a61083a0cbece5794de2e23e1bf0ba13", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowMessageInformation.java", + "type": "file", + "size": 2346, + "sha256": "663da6f5a7309aebe025e59ec063b3747a06561b6ee0589288cf75d0fa3cce29", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowMetafieldsReferenceWithMetaWorkflowStep.java", + "type": "file", + "size": 2083, + "sha256": "8b75c35480d5a180b3b790a0783c2bc3fc66543af538cc5d395a32d15304854c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowPartyCustomisedWorkflow.java", + "type": "file", + "size": 2177, + "sha256": "ba239be91c469763e42928ac28508c0c3653ce0e6ad459ed29345342cf96b7db", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowVelocity.java", + "type": "file", + "size": 1614, + "sha256": "5f2f483d1011bdc54209096689d8077c9b0b18f8e2f33a2cd817718f90c75ead", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowWarehouseIdentityEnum.java", + "type": "file", + "size": 1070, + "sha256": "7ad935a9f813463136a494b2423536496b2630ef81ca50961f4a76a6509e979f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowWorkflow.java", + "type": "file", + "size": 1326, + "sha256": "e6ef5c04a978a11548199a2826ba8cb9341e6aee1a97eee7dcbe24a6ac53d068", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowWorkflowState.java", + "type": "file", + "size": 2466, + "sha256": "a4418004d3cb6df1c42e36b736d784b62c49913ed4bf6d16d79c3df5d8994b1b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowWorkflowStatusEnum.java", + "type": "file", + "size": 1058, + "sha256": "4c21d430e88bebe124adab32138cc9f76391f6872b39b466f0dc8adc03b4de68", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowWorkflowStep.java", + "type": "file", + "size": 6536, + "sha256": "fd1552dc4d4ca3e3dd9f79be072f3fbc9ecfec09bf7d8421bb2ef3a42477d45c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmEventWorkflowWorkflowStepApproval.java", + "type": "file", + "size": 2249, + "sha256": "c7b29b6e49d903b9efc24c1194bd548cf9faa1496736f1e99b052ae929bf8021", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonAddressForNotices.java", + "type": "file", + "size": 1932, + "sha256": "3a5c4d0d6839c695ddf7d9961acb8bf7a2217b3bd3d701264045ec224b9f5646", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonAgreementName.java", + "type": "file", + "size": 5928, + "sha256": "25be851df5ea2e80cbdc8f1149d490edfbe671b29de35744aac85470cadedd3a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonAgreementTerms.java", + "type": "file", + "size": 2097, + "sha256": "fdf01e074f3f6e4bb0e49f061803597d0e844513f30322c19e3e7fafdd0b866a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonClosedState.java", + "type": "file", + "size": 2217, + "sha256": "f579b9cabbb199e6ec4860064e54d746d784d6bd0c6c7097679b64040238eabc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonClosedStateEnum.java", + "type": "file", + "size": 1090, + "sha256": "dd9ba9c2f7e44aacfce9f7b37f3ae7277e598f728218cdec23d4e4890883f5e0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonContractualDefinitionsEnum.java", + "type": "file", + "size": 1134, + "sha256": "19a7dda914707f6d98022456bfb0e470612a1322dea4963054a91dee348e0dad", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonContractualMatrix.java", + "type": "file", + "size": 1898, + "sha256": "094b5bca5739c177a9baa76724679d9eaab4dc79490dc6c9a8ba24886b254c02", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonContractualSupplementTypeEnum.java", + "type": "file", + "size": 1146, + "sha256": "0b2e0bd94576e2054682776e2a5d5f4e7843336fe309876928b4a77304fe409e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonContractualTermsSupplement.java", + "type": "file", + "size": 2028, + "sha256": "76b21a2573aef4850956495615e996078439319ac67989bc52b145932483f739", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonCreditSupportDocumentTermsEnum.java", + "type": "file", + "size": 1150, + "sha256": "2f229bf513a9a9fd8b4bb4570375de85a21be273055ccd7297bbc28110befb3f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonCreditSupportProviderTermsEnum.java", + "type": "file", + "size": 1150, + "sha256": "6f2acd7c8896d7257715fe799e7ad874227dc075ca031e573c8b16768bee89ba", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonExecutionLocationEnum.java", + "type": "file", + "size": 1114, + "sha256": "53b429f0a7ea9a00646b8972f52763137c27eee1edd7d36828b93922fdcf9ff3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonFieldWithMetaContractualDefinitionsEnum.java", + "type": "file", + "size": 1879, + "sha256": "e22683798a086bfb0548e40133411c1fe6373232970e3530ff24751ac7e8ffb2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonFieldWithMetaContractualSupplementTypeEnum.java", + "type": "file", + "size": 1906, + "sha256": "e40e90f4c95abd5bac18ee9dc3c38caa7df4dcbca754f132a96cc27484ac09f4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonFieldWithMetaGoverningLawEnum.java", + "type": "file", + "size": 1789, + "sha256": "814d91ec697e0c754ad42001f60bf1bd16b6b812c65a059d8cbb1dcd6432a0be", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonFieldWithMetaMatrixTermEnum.java", + "type": "file", + "size": 1771, + "sha256": "1e6a28d13d61308c7145cbb955ed7e912ec0927f04328212dba45610bd84f68e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonFieldWithMetaMatrixTypeEnum.java", + "type": "file", + "size": 1771, + "sha256": "48d21ea7efd06e0514479cf9e9846c36d76c825f95cb893fa813c8e59cbe9b50", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonFieldWithMetaResourceTypeEnum.java", + "type": "file", + "size": 1789, + "sha256": "6365aab4a0deec7f73e0e6fc9590326c647bd4ff32cafafb58148e7b9298edc8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonGoverningLawEnum.java", + "type": "file", + "size": 1092, + "sha256": "bc9aa54fa1e7564726dfd5ac3f5f1dc35dcac16a5387593d8a80c4ca0b2c5cc1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonLegalAgreement.java", + "type": "file", + "size": 4939, + "sha256": "8a52ea75975fe9bbf70253ffb763e3910e83729ca749a2817aa34caf75d70eb8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonLegalAgreementBase.java", + "type": "file", + "size": 3752, + "sha256": "c58421c08c7df8afa4b57bc0f3537a144f03c752e1edc57809ff101621e688fd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonLegalAgreementIdentification.java", + "type": "file", + "size": 2615, + "sha256": "f2c1634e250218e8cca72dc86eac29ce4255f58b1d25647f4d4150027b750148", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonLegalAgreementPublisherEnum.java", + "type": "file", + "size": 1138, + "sha256": "d8010a7e14ecd77b9a433e4fe02ff34076dd1d9d316078e0ca36214336b97412", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonLegalAgreementTypeEnum.java", + "type": "file", + "size": 1118, + "sha256": "c4e05a80d9beb54f3db7234ba2405d52c3a1d28644e7bdf0406eb8fbe6825be7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonLengthUnitEnum.java", + "type": "file", + "size": 1086, + "sha256": "dad2b38756a39144324db4b601eb43a9de6728fbde225a8df58f5b4c76337544", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonMatrixTermEnum.java", + "type": "file", + "size": 1086, + "sha256": "1edcaea71b0628ea784a56f628781257230f41239598f456903415211ed94212", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonMatrixTypeEnum.java", + "type": "file", + "size": 1086, + "sha256": "feacbb2d83f4ca8d98a7de7f825469fc039b312a83046fc1b47349b35aff4271", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonMetafieldsReferenceWithMetaLegalAgreement.java", + "type": "file", + "size": 2174, + "sha256": "f503a9e46d3d0a13293e9fb13cbc38d8db9fad77a1faba280f9934d73951d783", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonOtherAgreement.java", + "type": "file", + "size": 2343, + "sha256": "391bfa69263c56917657f52b9c8e100e7580d3827e4bbc32e9ce118b448f3efd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonOtherAgreementTerms.java", + "type": "file", + "size": 1653, + "sha256": "e4356d929cd712be9adf5fbe6a8cf2f36a9a97b17a36d28057a5bec30e1136a2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonResource.java", + "type": "file", + "size": 3666, + "sha256": "7ed7b68283892ed9e85833d0ee661775086bd499871f49ba5576a9fa5c6e5da2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonResourceLength.java", + "type": "file", + "size": 1704, + "sha256": "7cb733390120c5b79a6b37d3382654e36c08f879ae7f5f84f7fe1b705cb811c7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonResourceTypeEnum.java", + "type": "file", + "size": 1094, + "sha256": "1d724b5872e497a125b8f6b57446ccd76ba77392f12819aaa3dc86dea063e9a5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonSpecifiedEntityClauseEnum.java", + "type": "file", + "size": 1130, + "sha256": "4be30540e984339cd5f85d03bc75a821a05f4e9ad59cd8fef9e9f9e8da2e4a39", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonSpecifiedEntityTermsEnum.java", + "type": "file", + "size": 1126, + "sha256": "704def2292276d4d9b264e2453d868dbd69a4a911486cfacf731803e7a08880b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonTerminationCurrencyConditionEnum.java", + "type": "file", + "size": 1158, + "sha256": "76d9459de86b0e2523125c1eeef353e5f1c9ff0672f3e0e43a4b3d1d543e16ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonUmbrellaAgreement.java", + "type": "file", + "size": 2021, + "sha256": "9a3cb36428bdb4a36a4096a558027543a80cc3390a95fb474efcef2e249e33c0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCommonUmbrellaAgreementEntity.java", + "type": "file", + "size": 1722, + "sha256": "0b8ec27bdaac7d73f7d42e81598f49cf83704d476ec1000a69f5394513ea404f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationContractAgreement.java", + "type": "file", + "size": 3682, + "sha256": "4ed2e9907d5f0f239ee16f8841221f68babb8e520140294f0e677d60b4ee7229", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCsaCollateralTransferAgreementElections.java", + "type": "file", + "size": 1162, + "sha256": "5dc38f5f48a9b5ede4351ec7f75a598da03ccada3db7f4abb715923b2cf01741", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCsaCreditSupportAgreementElections.java", + "type": "file", + "size": 1142, + "sha256": "0efb115236ab42df4a622dc495460ea0cd45b4007309f51a5d72d9de778ec092", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationCsaSecurityAgreementElections.java", + "type": "file", + "size": 1122, + "sha256": "7fc07ab286cd0c4912ca388669d91d5d5278b999481425ab0d8e6e88d758359f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterAdditionalDisruptionEvents.java", + "type": "file", + "size": 5287, + "sha256": "1c8eaf4dcf4cdbef00f3a40d410fe7cbecfd96d33eda169e7d258e6e227c267b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterClause.java", + "type": "file", + "size": 1901, + "sha256": "3bcca18941bf6899eae427a52239b434df2b24c1def27ce35341897fd3862cc9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterDeterminationRolesAndTerms.java", + "type": "file", + "size": 1134, + "sha256": "8ed3bc612b9df2d845ddc48987639d19e13f85b2b70b510a52d8cb929fb52857", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterEquityAdditionalTerms.java", + "type": "file", + "size": 2545, + "sha256": "5384b0cb7cd56c88dc55baf2558c7c1192fed9df7d908fe39d48da3aa62afe8f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterEquityCorporateEvents.java", + "type": "file", + "size": 1114, + "sha256": "72ea1cc5aebab9d8b14e242be6789bee5ec4ce0f2c38d7c016111f1113fdef09", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterEquityMasterConfirmation.java", + "type": "file", + "size": 1126, + "sha256": "8862995cd46aa488cf73899245b592504f5f0faf3cf8514085c9ebfa34f3078d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterEquitySwapMasterConfirmation2018.java", + "type": "file", + "size": 3726, + "sha256": "bfe73a053df4239fbd997a4aaaa3701df38f5908e74eafeb087b686a008a47e8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterExtraordinaryEvents.java", + "type": "file", + "size": 5542, + "sha256": "40b0a8281e56ba63660271fac637785a81d54d32edab117b4e095e5517054b10", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterFieldWithMetaMasterAgreementTypeEnum.java", + "type": "file", + "size": 1852, + "sha256": "0db6da72ccf9851bd9cf21824713e48991917cbec375b92fdafa17fc0edd2685", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterFieldWithMetaMasterConfirmationAnnexTypeEnum.java", + "type": "file", + "size": 1924, + "sha256": "f552761e0b64b383d19758bf80389cea512185064d00e7e60cef5dd2c0c4b639", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterFieldWithMetaMasterConfirmationTypeEnum.java", + "type": "file", + "size": 1879, + "sha256": "33b4044b43d8af68b78a329598be130681e096cdb7ed5edee4d8e26f15b63d97", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterFxAdditionalTerms.java", + "type": "file", + "size": 1098, + "sha256": "25bbf8eecff3afe2882047396d21a7e0cca53f16cd867fbf22e1b58096805300", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterIndexAdjustmentEvents.java", + "type": "file", + "size": 1114, + "sha256": "ac52984504d3abda0ece9fb2525e4c2a1316f2d7ed2ffd5f2efaef4c3c3db176", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementClause.java", + "type": "file", + "size": 2727, + "sha256": "cbcd3fe94c9c1aabaa6d00029a679eb5fc5f4061031aac8067dea71ecd6ced67", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementClauseIdentifierEnum.java", + "type": "file", + "size": 1170, + "sha256": "b20d7260b67dcce9cf96df0dc9102269fc1bb5256bbf28e33ac94c732d8292b4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementClauseVariant.java", + "type": "file", + "size": 2815, + "sha256": "eaba14ac0ef45979e3c1a9f7ec7cac93fd1ab08c46843c703cf4046ef1f6626b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementSchedule.java", + "type": "file", + "size": 1523, + "sha256": "836fee067c9666f1db14f784604721af04e28b122fdff2bcb85b413437afe69e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementTypeEnum.java", + "type": "file", + "size": 1122, + "sha256": "4b80e5fbf31de28db7d073e918a50d263e09aec78df3d4254d2d9dcb01c37d74", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementVariableSet.java", + "type": "file", + "size": 1808, + "sha256": "cfc4b8b7edcb09cb2b381dfd944f507521d2c1d3b8ee418f8635b2cc3342b1ca", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterAgreementVariantIdentifierEnum.java", + "type": "file", + "size": 1174, + "sha256": "8f8595f2742261f254d253f1d93c459fa33f865bf5657906c30c64302e6b4dad", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterConfirmationAnnexTypeEnum.java", + "type": "file", + "size": 1154, + "sha256": "d7b5e85d15f2ec717ef1d30d12580c1e18231305ccc44bf234a71187de79d0a1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterConfirmationBase.java", + "type": "file", + "size": 1118, + "sha256": "b248aade4141414daf6b6e3f04285b5108b6631a636477ba49d0263fe79038d1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterMasterConfirmationTypeEnum.java", + "type": "file", + "size": 1134, + "sha256": "47d761e2a179d13f8745616f401005ba542ad4e1d3b1e02b7bc81f922dde0b42", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterNationalizationOrInsolvencyOrDelistingEventEnum.java", + "type": "file", + "size": 1218, + "sha256": "67e01b849277405ea1e900ed542f71bfb90d6916f2642c3fbcfb19d7c77574d4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterRepresentations.java", + "type": "file", + "size": 1090, + "sha256": "98d9e3479f84562f7a48d81dd360182c7f3d5e3aee915095fd41897117ef4c79", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterTransactionAdditionalTerms.java", + "type": "file", + "size": 3608, + "sha256": "c2bec164529f02a257ce6d1f3168273a20a04e708c8af9c6c7a9eac2fcc2d53f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmLegaldocumentationMasterUnderlierSubstitutionProvision.java", + "type": "file", + "size": 2993, + "sha256": "9ff1f0c86609c11239d7c8b22a423de40ef68487523a85ab5e1247ef9ae1d743", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmMarginScheduleStandardizedSchedule.java", + "type": "file", + "size": 2668, + "sha256": "2d5831170316a601facfddd9f04d9d50e7e1e3fa3807b20996a3cc2100536471", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmMarginScheduleStandardizedScheduleAssetClassEnum.java", + "type": "file", + "size": 1126, + "sha256": "a049ff1c10dbb9ec0467ffc8323a3da076634b55f971b3bed2fbe4c8156f9a51", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmMarginScheduleStandardizedScheduleInitialMargin.java", + "type": "file", + "size": 1893, + "sha256": "1f9a28a182e1f57c58517b266981d9373ba883e6ce88a4c34e14b5e0c9e3faed", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmMarginScheduleStandardizedScheduleProductClassEnum.java", + "type": "file", + "size": 1134, + "sha256": "5093a5f296bea8217aacfdc614bcb845a06a47e210fea9f099ba24c6e722b1b2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmMarginScheduleStandardizedScheduleTradeInfo.java", + "type": "file", + "size": 2635, + "sha256": "a5e53f771a648c70a8171ac88a7d4dbfc43864f016f768cfb3619b0b8adc4e81", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetBasket.java", + "type": "file", + "size": 3123, + "sha256": "17f6f6f8db7e85bca7d51dd6b04bd2a382b1d0b818727411da7dca6a7e773b6b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetBasketConstituent.java", + "type": "file", + "size": 4089, + "sha256": "b99dba9549412c39eae9d885bed6ab02e34287e11b766394c4852834d37ca4b6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateCalculatedRateDetails.java", + "type": "file", + "size": 3406, + "sha256": "d63f552f076716225569287289ef9624f79392c51bb637a70e673d63beab6a06", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateCalculatedRateObservationDatesAndWeights.java", + "type": "file", + "size": 1860, + "sha256": "efe886019c327b926ae20410bfabf725b01f8de47e350dd9d4a3f796272c6dd6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateCalculatedRateObservations.java", + "type": "file", + "size": 2401, + "sha256": "f57e1495d427b394ac07bc083706a7a9c7a9844bca4747fa5505198df840eb57", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateCalculationMethodEnum.java", + "type": "file", + "size": 1136, + "sha256": "721ade873a1f66570bc0c174522afdee841eb5392ecdb9cd468de687a029a263", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateCalculationShiftMethodEnum.java", + "type": "file", + "size": 1156, + "sha256": "58e6f5e231ed3c7a269962056de38656becceae36eec1123f3f8dd1e4fd79d96", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateFallbackRateParameters.java", + "type": "file", + "size": 2696, + "sha256": "856200566ce4bfac1a3b5e46def5d2904c9b8f9c15a822f735edd9c1f6ea31be", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateFloatingRateCalculationParameters.java", + "type": "file", + "size": 4065, + "sha256": "724b8d8a1107c5f7e35d55e213a590a63979248118823de90b9a8182b6a664b6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateInflationCalculationMethodEnum.java", + "type": "file", + "size": 1172, + "sha256": "5cc07cc6e93446892531c16c92c77659bb6464e200b39926155f78cac5053887", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateInflationCalculationStyleEnum.java", + "type": "file", + "size": 1168, + "sha256": "5e0b334392ad7a1585ae7bcd1b55beb9623deaef667b759fbbb4f5fcade33de7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateObservationParameters.java", + "type": "file", + "size": 1792, + "sha256": "51f90f65bd32ade4a8f7b3584f24e12936714d816d68a82fe65ed030e225f9fb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateObservationPeriodDatesEnum.java", + "type": "file", + "size": 1156, + "sha256": "8106f1cbb354fc05b4492fcffefaf6ba2ae7a2175bd1219f0ab49b23307b7b2f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateObservationShiftCalculation.java", + "type": "file", + "size": 2361, + "sha256": "a260c5bda9e23fec7c3149b0e2c0359050dda4809ceec47f23a6ba2f90d3b587", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculatedrateOffsetCalculation.java", + "type": "file", + "size": 1422, + "sha256": "19905f9e1870686673bb52b19ec7843738bad491babd7b6fcc207c2e3610a077", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCalculationAgent.java", + "type": "file", + "size": 2439, + "sha256": "94f8e71afc43ff355d2bee64096b98e7bb632837f5e93e20cabf884989d29bed", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCashCollateralValuationMethod.java", + "type": "file", + "size": 3509, + "sha256": "aec80dc2d8f229ac85e269bf3b08b787e6dc87730e7a46a3797af8c74c18544c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCashPrice.java", + "type": "file", + "size": 2039, + "sha256": "e19bd4716ab6e45bfba41bf81cbeb2db9325ade9448675c352eb030fc8295740", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCashPriceTypeEnum.java", + "type": "file", + "size": 1062, + "sha256": "c41e0826c23fabb20eb280428dd8275aa2522ef0d1da5d50b20130fd53524f54", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCommodityReferencePriceEnum.java", + "type": "file", + "size": 1102, + "sha256": "89ba397f8cb2494e70697295e1bf26ca3331089ba72d63a1f629dab1583d6b56", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditIndex.java", + "type": "file", + "size": 6320, + "sha256": "acb213963bbeb112bc10caf00ceb1a2c5b18e6e087a598ac0ff7c27f4084c49c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditNotation.java", + "type": "file", + "size": 2957, + "sha256": "b724ce95f944d8568571757b6e88bd367f075e12698c4895d9c15c45f74d5ec9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditNotationBoundaryEnum.java", + "type": "file", + "size": 1098, + "sha256": "461803a2d7fae84311357efeb6651c309492733dea0f6df9811788a0eb271cd8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditNotationMismatchResolutionEnum.java", + "type": "file", + "size": 1138, + "sha256": "aac094371d927759bcd4bf1e2fccfc24027eb4e836c8e3d8c37caf798e8b3d83", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditNotations.java", + "type": "file", + "size": 1790, + "sha256": "f8564beb073e73f1e4e9bb48413ffe0d15910919316f83fde60973479b0cf962", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditRatingAgencyEnum.java", + "type": "file", + "size": 1082, + "sha256": "5bb19f48324d80b0c1c1f9f78555e5d485495ae8219b001476d909627abd969f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditRatingCreditWatchEnum.java", + "type": "file", + "size": 1100, + "sha256": "db8c983373cfe6497aacd8a5c652b550399793d58ccfcef9b700744e4c6d7337", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditRatingDebt.java", + "type": "file", + "size": 1700, + "sha256": "6e4ccf9d7e7fe5a52b56e1dc8ec612fb4b5230b4b6da4b0c3592626fd471773c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCreditRatingOutlookEnum.java", + "type": "file", + "size": 1086, + "sha256": "813b50d17d76a1ff9ca85933ae6adf21b77644c2474fc4fac83b6a8373a53e9d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCsaTypeEnum.java", + "type": "file", + "size": 1038, + "sha256": "5456c745a8be9d3af33114c7aa00cd2fbbae558fe25f70470b2c7ee8c2bd9631", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetCurve.java", + "type": "file", + "size": 1804, + "sha256": "ccea663888ac57ed77b75d7dceaf146a9f51e64012101ac79a15c70a4d86157f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetDividendApplicability.java", + "type": "file", + "size": 2015, + "sha256": "178d7fd1759cf96f1e172a58387b8d6fa3b5b74226744120d2cb7a8979d7a866", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetEquityIndex.java", + "type": "file", + "size": 3392, + "sha256": "e53459278fbec9b1159c5491c491e011d64485e9e4de1b90a33cc6d06451d85a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFallbackReferencePrice.java", + "type": "file", + "size": 2973, + "sha256": "661bb4e7b81aeacd347b98d5f965aaf8335bb48d3298c4df3d45c65ddf9263b2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFeeTypeEnum.java", + "type": "file", + "size": 1038, + "sha256": "e4abf7c2087d454f688e04177693b174ad759d0df693af9a1e5e54da13e633d0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaBasketConstituent.java", + "type": "file", + "size": 1721, + "sha256": "490b2d8c08441d97ce424cb4e225ca31f9aa1bb825add570dc99f134c0fc48c9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaCommodityReferencePriceEnum.java", + "type": "file", + "size": 1807, + "sha256": "edc3f8bcf0340f7e54f0db0ff703ae6cf2a5618d53e599b7f9c602e81330c0a6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaCreditNotation.java", + "type": "file", + "size": 1688, + "sha256": "371a623337fd96cf65ee5c338a633b28ebd95220205d98836c2b8a1f258a33a4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaInformationProviderEnum.java", + "type": "file", + "size": 1771, + "sha256": "f566d4ebc3a6bc31afedf2c8eaefea7a08c82be3f93c1854c57b008ff8980545", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaInterestRateIndex.java", + "type": "file", + "size": 1717, + "sha256": "c193ae6af321497f1792e0c20b149e4487f3a576215d27ae7946e76dea898a05", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaInterpolationMethodEnum.java", + "type": "file", + "size": 1771, + "sha256": "d9d283dd6953bbd92758db50953291dded041566e99f54f89f64408e399541e5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaObservable.java", + "type": "file", + "size": 1654, + "sha256": "2000e18c34ef403b38876c1e7a0006d236044ebf5bffb6c9fa040675b4c65283", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaPriceSchedule.java", + "type": "file", + "size": 1681, + "sha256": "6e139e8b5d4c151dc800ba019e9d6ba9a71317edb1aa7dd07ec43eff0ab68d60", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaQuotedCurrencyPair.java", + "type": "file", + "size": 1726, + "sha256": "996d6526a6c71767c239c8f58ee651aeb92adb09c4a13163deaa0534ebecb8d7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFieldWithMetaSettlementRateOptionEnum.java", + "type": "file", + "size": 1780, + "sha256": "4a87c6eb2bf7774950d82eb5c2b164188965e876868d5a8cf58fd42745aae5b4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFloatingRateIndex.java", + "type": "file", + "size": 4211, + "sha256": "366504a291f8f720afb67f9ae7c141a80640c1da15f85b1c54c766dcba58d21a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetForeignExchangeRateIndex.java", + "type": "file", + "size": 4852, + "sha256": "023aad2c15a26458df12c4c92ae375963ff3d85e01d19fa4a841f5a8b1056a31", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFroFloatingRateIndexCalculationDefaults.java", + "type": "file", + "size": 2331, + "sha256": "b3c67f8bde7947f50d474a1a2b4aa1502b1c9b5c2c4ddd539e0b270f48f12db6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFroFloatingRateIndexCalculationMethodEnum.java", + "type": "file", + "size": 1160, + "sha256": "67647c091f305046850eb8519380175340b6410cd3c49bcfbf5e5c47377ef8a6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFroFloatingRateIndexCategoryEnum.java", + "type": "file", + "size": 1124, + "sha256": "de910a441319648bcc798153c5be42092840eec1af992a58dde3cf7c921f9701", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFroFloatingRateIndexDefinition.java", + "type": "file", + "size": 1941, + "sha256": "e1d012126e80f34525ddf62d21b3186b8cd2d92d6829947a538a6d21de3baa63", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFroFloatingRateIndexIdentification.java", + "type": "file", + "size": 2226, + "sha256": "d4d372c3c54feda774be9e68a27b9bbb2176fb41235934693910bbac38019454", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFroFloatingRateIndexStyleEnum.java", + "type": "file", + "size": 1112, + "sha256": "9dd5d6e01401affe7af2ff96d84fcf9f259eebe3c978de48a06c54676108d464", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFxInformationSource.java", + "type": "file", + "size": 2450, + "sha256": "26fcd0a7b2c05a74b39ade9a075f135e6c1ec75c2fbaaa3bc84f96526fcd7864", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFxRate.java", + "type": "file", + "size": 1594, + "sha256": "68167fac535d00fdd617d36028d403fd67f73a98ec45e2bf0ac61b1b93ecbfc4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFxRateSourceFixing.java", + "type": "file", + "size": 1803, + "sha256": "b4d5725f5e89dc57e758873ca7ea62269786148d22e88a2c9bbce03661412de6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFxSettlementRateSource.java", + "type": "file", + "size": 1938, + "sha256": "f30de4a1647775a925c59b4efd8531907861e90de9c745eeb34ad175c37dc4c8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetFxSpotRateSource.java", + "type": "file", + "size": 1780, + "sha256": "4733a4da13541931b67ae9885a656085b10d360259969ffc9471dd7db161c134", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetIndex.java", + "type": "file", + "size": 3283, + "sha256": "e8517be1b49c946ffe980648067483345cee3c593d0bc8a60379a3fb0823420b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetIndexBase.java", + "type": "file", + "size": 3370, + "sha256": "4746b17e4a469f65920032bf46763c6cdfc8079cdd6c64209351b61e442ea096", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetInflationIndex.java", + "type": "file", + "size": 4182, + "sha256": "4b19277fdb4ff0ca44d9f72150a71e2ac0c6f8dcd98524cfc10fbd57c2cd1926", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetInformationProviderEnum.java", + "type": "file", + "size": 1086, + "sha256": "4c5a7b01d92d44dae5614449be3d6391fa4d4b072585aa708ac0b589b6aeae8e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetInformationSource.java", + "type": "file", + "size": 2108, + "sha256": "6e9247f6302d0763606e1d90cb0dd49165e60c99d3dbea09713c0e3dd278db7f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetInterestRateCurve.java", + "type": "file", + "size": 1780, + "sha256": "2ade5d8dc007c50682127c206250bcba8a43ec96d7cb57cc9c4334a8a82103d0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetInterestRateIndex.java", + "type": "file", + "size": 2032, + "sha256": "e773ff6036093d5b943543a63fc5f9fc4ac36eb182f1bbd5b7a1208ffac05bda", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetInterpolationMethodEnum.java", + "type": "file", + "size": 1086, + "sha256": "2d4cb2a5740638a0ac1b7dd10d3e343e86071c5fae4c7fcd5ae2911cc9052d76", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMakeWholeAmount.java", + "type": "file", + "size": 3034, + "sha256": "04f7ff3e7e5bc613d336c81cc1f52d256295eb2fc0de78b34a3b1892bfdffbf0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaBasketConstituent.java", + "type": "file", + "size": 2132, + "sha256": "724fa46556fbe62de2c95f1b8706b99f2dd8f872399dad60b07912bf8ce10b05", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaInterestRateIndex.java", + "type": "file", + "size": 2132, + "sha256": "f1163a40345dce3dce01e3236a7ea2c50ed6647362cd2b8c0df9b6bbe034c5e6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaMoney.java", + "type": "file", + "size": 2048, + "sha256": "b17fb5c500c48a544e30e36e23dd354e63c72d140702cb6f9543654adaeb6d0e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaObservable.java", + "type": "file", + "size": 2083, + "sha256": "4a1e75416e35fcfc5c7113288a89fd852d2e6b4c1397b741672215b91ec72bb8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaPerformanceValuationDates.java", + "type": "file", + "size": 2188, + "sha256": "0f552903a58777e1af258f4e36e4113a358ec293e72992beab4680744ba8c510", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaPriceSchedule.java", + "type": "file", + "size": 2104, + "sha256": "a95a95b48a9c6216cff077a68686ad7e3793cbc06e66c21108294a8bcb8a45bb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaQuotedCurrencyPair.java", + "type": "file", + "size": 2139, + "sha256": "24a39783c8e26b0913605fd7a9727f823d5b2ee515240a6b09204a86d1026707", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMetafieldsReferenceWithMetaRateObservation.java", + "type": "file", + "size": 2118, + "sha256": "7c1ece586112aec86b90ed048a18bed73ecf2f8a71432963be920ed51225e93e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMoney.java", + "type": "file", + "size": 2306, + "sha256": "d0b2b99d9d146051aa66f421cb87931ab2595489f1ff448c3bc5d784056d683d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMultipleCreditNotations.java", + "type": "file", + "size": 2671, + "sha256": "a86dac0738664e793f354081dcfc50a7864125753d4fbfbb54792f4e7c412aeb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMultipleDebtTypes.java", + "type": "file", + "size": 1717, + "sha256": "0f843fcdde05ba9d70c9ecdc821c6c099e0048be8273272f05793f5c4aeaf5ae", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetMultipleValuationDates.java", + "type": "file", + "size": 2071, + "sha256": "250ab1f951097d034cad14ca3a6008b867af64f925dd97898120cefac36f7490", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetObservable.java", + "type": "file", + "size": 2105, + "sha256": "cd62495bc8e578ae0950e1cef20d74dbbf89235e8d95534cdb51a6139d9b6d31", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetOtherIndex.java", + "type": "file", + "size": 3381, + "sha256": "9bca1eb54a3640ed6035ee6aea74e5fe49c44bb83403c574c7047fbbfbd3bea1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPartyDeterminationEnum.java", + "type": "file", + "size": 1082, + "sha256": "bd1636490080c337549b96abcfcc71316344b1a4ffb135d7962b6d13699a04bd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPerformanceValuationDates.java", + "type": "file", + "size": 3040, + "sha256": "6d99c48929af9eff261e0e7afee9f7107c1399707a5ab5889fee85c13d3fe2ff", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPremiumExpression.java", + "type": "file", + "size": 2040, + "sha256": "4d3d618f56ab94c057b79be18b1d873d9bbe63fe8e8e523821bb8ef93cb0ff20", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPremiumTypeEnum.java", + "type": "file", + "size": 1054, + "sha256": "ddc32609446ff0171e7b21072dc4d0c796a3f4f23dcf95434cd6c3a891cd18e8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPrice.java", + "type": "file", + "size": 3658, + "sha256": "d16ef28501d32dfa4d481a99d53970e3dfc3142a8139be00b822a4952936dc84", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceComposite.java", + "type": "file", + "size": 2229, + "sha256": "83ce2f93028e9221250b9f26e5cc3c977d770dc4568bbacdab8b1a2145e42ba7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceExpressionEnum.java", + "type": "file", + "size": 1070, + "sha256": "50f4b9588ca3ab4a44dacc8f3fa07bc361a00bbeffe1948d6d09a072a484fbf8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceOperandEnum.java", + "type": "file", + "size": 1058, + "sha256": "0c1ae6b57689a577c047ff9ae6b70c3949712c7559a2728d4c95a26ba06800b1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceQuantity.java", + "type": "file", + "size": 2502, + "sha256": "20936fb163940bdc221e94fe52a10db5041aba48c8cbd7190cf78abc1090ce56", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceSchedule.java", + "type": "file", + "size": 3762, + "sha256": "f689ecb64eb434beb27400b411d42b7039cdcc046edeca280d0859c64d4ba74b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceSourceDisruption.java", + "type": "file", + "size": 1515, + "sha256": "8737672d4794582becaccff9804a7591eb138d22f80fc6f5997ae45628b127db", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetPriceTypeEnum.java", + "type": "file", + "size": 1046, + "sha256": "43ffc9c9459b27281bd79c0b987648501e40100ea8a70ba1743a8fe313c33658", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetQuotationRateTypeEnum.java", + "type": "file", + "size": 1078, + "sha256": "80a8d265e4be53883fe0389226486a3d9d1a994aea5c587d0b3f6ca2ef5a6f35", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetQuotationSideEnum.java", + "type": "file", + "size": 1062, + "sha256": "90c0a34e553e603188cc6bf10199eb8fb4d5930369883855ae8b7f32f9faef98", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetQuotationStyleEnum.java", + "type": "file", + "size": 1066, + "sha256": "89b77a647bb363580ee5a87a71863c7982a1da3470684dd4d857093dac22ded7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetQuoteBasisEnum.java", + "type": "file", + "size": 1050, + "sha256": "0b3c6bdcab7ff840c1721d9fb12493f36888affb7d29312e10d73a9a30be88f3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetQuotedCurrencyPair.java", + "type": "file", + "size": 2042, + "sha256": "2e7e999b4898715bf13956b2b3da441e38c9ef9faaf58c5605f879d434bdb234", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetRateObservation.java", + "type": "file", + "size": 3434, + "sha256": "999fc297c1ef1b960c05e7ec8f28524d3ba0036602d9d84bbc91e4fcedcc0d1f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetReferenceSwapCurve.java", + "type": "file", + "size": 1803, + "sha256": "77c471658114d3af49386e20db3c4c4cbd6a500be4a50a5047d00f00871893a4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetSettlementRateOption.java", + "type": "file", + "size": 1967, + "sha256": "01c893fce012a30de3c6d03a4a21c0567248be0947c3b882cd6281a77bd79292", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetSettlementRateOptionEnum.java", + "type": "file", + "size": 1090, + "sha256": "f8df9a7febafc9f14988046ae0fe2d42568fcef6ef695c5fb21417cef5ffe6ad", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetSingleValuationDate.java", + "type": "file", + "size": 1374, + "sha256": "b6f60f99b5f628b0743aaea572113c75b113a2fe5137e0a22a0e7f5bf838b1a6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetSwapCurveValuation.java", + "type": "file", + "size": 2295, + "sha256": "3bc552c46195cd008159d613606d459a276b60fc6c346d4715c94e1b0218c6e7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetTransactedPrice.java", + "type": "file", + "size": 2215, + "sha256": "d5075f222dc97f13b41202f1c4802efe9ec68503a5eaf03da52237c48c38fcb6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetValuationDates.java", + "type": "file", + "size": 2311, + "sha256": "1cc8486a7d05399da0e80295c6be13dcdc71a04e5bab92cdac7f693ccb14ddeb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetValuationMethod.java", + "type": "file", + "size": 3379, + "sha256": "8e5ff2ab4c69bfeaa2cbbe2c02eaaf7f3ce75d27964865a43842be90b92d724b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetValuationMethodEnum.java", + "type": "file", + "size": 1070, + "sha256": "b378fba5c42d3666e9f140e7133c425b7302f59f148cc42e39db9285701acb0d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetValuationPostponement.java", + "type": "file", + "size": 1475, + "sha256": "6c6d7135e465bff1fc701fe2f094008676dea9f7ede53c5d5a9549acb904441b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableAssetValuationSource.java", + "type": "file", + "size": 3023, + "sha256": "6e60e724e35b1245b59d25706a6a970311bdff093066351278e475d5ecb59441", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableCommonDeterminationMethodEnum.java", + "type": "file", + "size": 1090, + "sha256": "02f7b064ff6ddad8bbfea1b57bd4a3acec92e37c3f40d6ec8d51702d1c2e74e6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableCommonTimeTypeEnum.java", + "type": "file", + "size": 1046, + "sha256": "344a857cbdf282930b9500bb85aa0a33450cdf9548faabbbb1d5d54923e4ea0b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventCreditEventNotice.java", + "type": "file", + "size": 2335, + "sha256": "78e40a57a2d8cbcf9551b9cbe2adb3a70b4dc01ff34f22915d6bca4b193e1b78", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventCreditEvents.java", + "type": "file", + "size": 5781, + "sha256": "91d0f4bed1ec4aff469dbfeb7e9c11fe5843acb194adc16aa684675bc8092428", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventDeterminationMethodology.java", + "type": "file", + "size": 1909, + "sha256": "4b2d52b6cbc663f2850e7d7b964300ab68ad90626fd56bf911207e68c8b56941", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventFailureToPay.java", + "type": "file", + "size": 2044, + "sha256": "fa7a5c00c928db287a022d5c7e3409d34c644c785d2afef1b1655e4d852e5014", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventFeaturePayment.java", + "type": "file", + "size": 2880, + "sha256": "05780bcf0bd2cc6e79a0c7b8a2bab4188b26d61cdf27cf92185076842634a198", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventFieldWithMetaMarketDisruptionEnum.java", + "type": "file", + "size": 1744, + "sha256": "07652e2931d3dd3b92d2aeb3c11b603b2eced270ab2a4617e56ab3314b4a3721", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventFieldWithMetaRestructuringEnum.java", + "type": "file", + "size": 1715, + "sha256": "0bc220d3d724cd4b2f2e38228567b282c952f3a98c4bd117cfc33e8e1be66f9d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventGracePeriodExtension.java", + "type": "file", + "size": 1629, + "sha256": "01ed05df51204abc4c3e9abe06aa4ff5b19fcbeb27e147c9ac7bf5919dd3c147", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventIndexEventConsequenceEnum.java", + "type": "file", + "size": 1094, + "sha256": "fc079004355b943d2ab6a493d72055f265fd5555168c9b8fc302e5fc85f6a8de", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventMarketDisruptionEnum.java", + "type": "file", + "size": 1072, + "sha256": "fd9666befc99ab7ea9887db2cc3cddf03daafd8850313a10a3924a34a0a79cf4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventMetafieldsReferenceWithMetaCreditEvents.java", + "type": "file", + "size": 2097, + "sha256": "05143d7deed3692ba1e1c8e6f770e071b1c677c1750208b4f872bf3c7b1f59cd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventMetafieldsReferenceWithMetaObservation.java", + "type": "file", + "size": 2090, + "sha256": "d2c9b203a0ad432bb5470ad13295ac6f675892d2d0f5e30cd59bed9735ff40b3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventObservation.java", + "type": "file", + "size": 1768, + "sha256": "c66bc52941dc6d19db8b6e344d1dab04637c40cd9cceb52382d63461d038fc5e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventObservationIdentifier.java", + "type": "file", + "size": 2862, + "sha256": "d90b5bf0dd3b140f1eb9ef8736edcc040feb65c2bf615a28e668ed777db76872", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventPubliclyAvailableInformation.java", + "type": "file", + "size": 2091, + "sha256": "3daa28ec80fd882bcf897bd6f569d55c2d4a7354d9fa6352d66d7d7ee41651f2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventRestructuring.java", + "type": "file", + "size": 2412, + "sha256": "517c88d7c5052d14066d9ce7e34bf7c0740c71de3690f2d5f7736b220936bb87", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventRestructuringEnum.java", + "type": "file", + "size": 1062, + "sha256": "ea87f7e0617ec6ae739913535c7bd16bbe511b681710b2591f4c9f2d7616f5e3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventShareExtraordinaryEventEnum.java", + "type": "file", + "size": 1102, + "sha256": "93c5f528fec20c039a27fc91817c47e3a8b2cfefe284642dca816247d3a06c45", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventTrigger.java", + "type": "file", + "size": 2820, + "sha256": "953cfe55787810a7c0c68af17c48bcd0e9240c896d4dfa04e2436d0966e5be00", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventTriggerEvent.java", + "type": "file", + "size": 2322, + "sha256": "88f0db9beec148a5aef865b17ec6ef0afce833ec46a8b2bb9ca36cd0e4b13710", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventTriggerTimeTypeEnum.java", + "type": "file", + "size": 1070, + "sha256": "ff6be93fc50143c1b129bf7906be0707f432dc06abe92f871f7f2028faacd6bb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmObservableEventTriggerTypeEnum.java", + "type": "file", + "size": 1054, + "sha256": "d4e327e1cfd11f354faa5c0388482bb2e8acee6b593442bd05843d516ee0321d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetAdditionalFixedPayments.java", + "type": "file", + "size": 2204, + "sha256": "2e0aaf7d0e68fc1b1ab2ca2ea9b4285c18464b1a03d62c517534f4f40b6e3593", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetAssetDeliveryInformation.java", + "type": "file", + "size": 2122, + "sha256": "8fd5d0de1d136a15702e6a0d6dda7286c6c5b44726f77bdb31e5edb32a636119", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetAssetDeliveryPeriods.java", + "type": "file", + "size": 1882, + "sha256": "728019f5180d4bc394abd5d3a19693d34a0c917eea53a045a30834cfc2da7bad", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetAssetDeliveryProfile.java", + "type": "file", + "size": 2134, + "sha256": "f8297acaeef3500d50a68aea57a5c61106be08fd6cfba0c56a5033ee8d80ab74", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetAssetDeliveryProfileBlock.java", + "type": "file", + "size": 2651, + "sha256": "5dd55d4359cce1fbca13515c765e766047965b348b64130fd32a83dd0ac92588", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetBankHolidayTreatmentEnum.java", + "type": "file", + "size": 1078, + "sha256": "d66446bae0130cb7900821fac3f63ec94517963ecf8c3d733f61f6663976e55a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetBasketReferenceInformation.java", + "type": "file", + "size": 2994, + "sha256": "34d70f6d423cbf1bb61ab2da5d5234061626ff5e5fdfb383247987b2a0efb18d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetBondReference.java", + "type": "file", + "size": 2274, + "sha256": "bb8c889abbc7b4b4b883997369086880b80fd37f1c025d241e59393f5116afe4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetBoundedCorrelation.java", + "type": "file", + "size": 1712, + "sha256": "a05ea657682c380f8f4742c11dd6f5912d72357624b52a34daba808a8093db67", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetBoundedVariance.java", + "type": "file", + "size": 2307, + "sha256": "ae066189534acd2a127d66129d45179c1afaca0e421d470a742059af4774b676", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCalculationScheduleDeliveryPeriods.java", + "type": "file", + "size": 2739, + "sha256": "f34811ed1c61495b13d517b205401d9c10034e0959271359b5e94784e2d4afa2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCashflowRepresentation.java", + "type": "file", + "size": 1934, + "sha256": "0c05d4f525ebba7c2a6adabe14f20ed5e905e24194f35de8343480233a87a688", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCommodityPayout.java", + "type": "file", + "size": 5815, + "sha256": "c8c93043187b083bd646c4d80f2e827d60331d137b363f701705a42ff7928213", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCompoundingMethodEnum.java", + "type": "file", + "size": 1066, + "sha256": "b05e6249e6eb8e41155cabe9b583dbc52506f78de4ae72226146bfa17e2d2a9a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCorrelationReturnTerms.java", + "type": "file", + "size": 5548, + "sha256": "a3765d07a12e5d858e46b0ae4e5673fa0036c42b850279609b6c25fb2b34f6ca", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCreditDefaultPayout.java", + "type": "file", + "size": 3672, + "sha256": "9568f892aec037ea521400cf44264fcce71be73c1d47af1de2cacb13c905a111", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetCreditSeniorityEnum.java", + "type": "file", + "size": 1058, + "sha256": "a175a529d1ba5e2c7045011f5011b2e5c381175a3619065390ae99a512972af4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDayDistributionEnum.java", + "type": "file", + "size": 1056, + "sha256": "893616d661870b4527a1c021f4570ae16349584185f13be29a0b49ddd6fd73cd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDiscountingMethod.java", + "type": "file", + "size": 2189, + "sha256": "143d56c2e5756c55fa3ac71e30869ce3bb08a1cee65f464339fdad5a73d4f483", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDiscountingTypeEnum.java", + "type": "file", + "size": 1058, + "sha256": "8a12812101fa7f9c7be91f3fdc61a28e69ebbd6e1a1903fe809bb61001749d64", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendAmountTypeEnum.java", + "type": "file", + "size": 1070, + "sha256": "7328ff90e4bcde5a90252da9ac16f801f42b70ed8c25eaf4eb0354a2349f401a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendCompositionEnum.java", + "type": "file", + "size": 1074, + "sha256": "55555772be0701d46db4cf89fe90719cd70d7867aec01ad17319b093150a9769", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendCurrency.java", + "type": "file", + "size": 2191, + "sha256": "5e487e95e25a3fb69e0ff457719540c82fc98c25c1ba2f4cb0bda523593d1637", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendDateReference.java", + "type": "file", + "size": 1779, + "sha256": "5779629648254fdacea31a7e715665073b4c1c656eac2cf77f7f0966fce78af3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendDateReferenceEnum.java", + "type": "file", + "size": 1082, + "sha256": "ed5cfd5cb3c5a74cfe64ad300c76552499447a4f899e3fa8507a5422f8fd6f77", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendEntitlementEnum.java", + "type": "file", + "size": 1074, + "sha256": "bb09318f88972ba63ce44f9a6397788a580da50410b9449e53c3c3e06ffbdf44", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendPaymentDate.java", + "type": "file", + "size": 1911, + "sha256": "10f2d64bfe3d37305bc06cf8eff850bb5965b7eb8240c0753dd30e275d160e2f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendPayoutRatio.java", + "type": "file", + "size": 2266, + "sha256": "50d7088dfe3e5b62032764ec908b1b2e5d8cc1e4f898ecb9a4df558509d7cc14", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendPeriod.java", + "type": "file", + "size": 3292, + "sha256": "942e20134ad6a00976d904553a7b68a14187f3888095f618584b9339d77c3fc7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendPeriodEnum.java", + "type": "file", + "size": 1054, + "sha256": "40730673610d2d04a85a4483fcdb50bdc888184f8b260f068be8403473e76859", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetDividendReturnTerms.java", + "type": "file", + "size": 6291, + "sha256": "380dee3bd17111e727e59229fdeebeb70298639c6be8ad225fb96dd048c11273", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetEquityUnderlierProvisions.java", + "type": "file", + "size": 2724, + "sha256": "ea6a49b10b9807d9de4b9cddd57bc81e7dd99e473a8b6ac934131f1f886078a5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFPVFinalPriceElectionFallbackEnum.java", + "type": "file", + "size": 1114, + "sha256": "a5f65b6ac5780c1f31a6f25a129b4484b818ceaf12577639436d101fd46278f0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFieldWithMetaIndexAnnexSourceEnum.java", + "type": "file", + "size": 1717, + "sha256": "166b12ddfbd873bdd65180156776f20c6034c5423cd7f33e0e6d78d2772659fc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFieldWithMetaSettledEntityMatrixSourceEnum.java", + "type": "file", + "size": 1798, + "sha256": "8ce5f0721946cd8a5a4764167914990a7c78972d3bea806fe6e7c8ed3133933e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFieldWithMetaSpreadScheduleTypeEnum.java", + "type": "file", + "size": 1735, + "sha256": "82902e0ca3c2790be657018b8684f9094dc1bc9bc1f070e8eaa18bad579f2f60", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFinalPrincipalExchangeCalculationEnum.java", + "type": "file", + "size": 1130, + "sha256": "2c9be0d1dacf7b1deab6b0693eb260385081dc6ac0c8debd63f4cca3630d9e54", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFixedAmountCalculationDetails.java", + "type": "file", + "size": 2791, + "sha256": "103205e8fdeca0979ad9c8338a8f7bd010ccd6cc7b63f1e2947aed244d7cae6f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFixedRateSpecification.java", + "type": "file", + "size": 1423, + "sha256": "ab8328b152459bbf55aaab6a59f839d0be5e36616369e524cd5f7d25361e6de7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingAmountEvents.java", + "type": "file", + "size": 3176, + "sha256": "a4b8294a63f50f8f4ff9f2d7f61af03f051a8ce4f0a68dd2ee29c7e53c4b17f7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingAmountProvisions.java", + "type": "file", + "size": 1712, + "sha256": "5f9bf5df6a4ff785f1c95fc017cbba006a10f204253c1d8332693071e9883605", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingRate.java", + "type": "file", + "size": 4188, + "sha256": "ce6c417729a917135f567b8e8817301c173cd0c7e1a4a5c394c39d68084d2053", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingRateBase.java", + "type": "file", + "size": 2523, + "sha256": "feb3837e2fd08103ec72433bbf43c9cf8ad7c3bff8315b88b7717a1cdca1ea64", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingRateDefinition.java", + "type": "file", + "size": 2921, + "sha256": "20cd0f19d7cd898ca98689b29fab889e70b87ee999e6cc465773cd8699e09eb2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingRateSpecification.java", + "type": "file", + "size": 5891, + "sha256": "c1abd93b61120e376c18dc634345e37ef7cfc21cc2bb1dd59e9a9f85b00f3e45", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingrateFloatingAmountCalculationDetails.java", + "type": "file", + "size": 4256, + "sha256": "83aafa312cc6f3fc23c28e8772ac1bde178a688e62a6d90d5a4ec27d2945ed4d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingrateFloatingRateIndexProcessingTypeEnum.java", + "type": "file", + "size": 1172, + "sha256": "82fddb1241756b1dc3a45713d7fe1ee1b6f985c974de2e7e14cb9e360379c6eb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingrateFloatingRateProcessingDetails.java", + "type": "file", + "size": 2512, + "sha256": "40b6ac663e943ba9acd7bd55310f053a7a21530ae1bf44df581bde18a41baa3c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingrateFloatingRateProcessingParameters.java", + "type": "file", + "size": 3599, + "sha256": "265173dc28401510405b8f9531497ec74603110cd30f8d5fc446e7e03463e444", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFloatingrateFloatingRateSettingDetails.java", + "type": "file", + "size": 2435, + "sha256": "dc7229511f76774a49bdb7e27cd0c859abc530c2dc843573e490e86e22ae9699", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetForeignExchange.java", + "type": "file", + "size": 2100, + "sha256": "54249d904415a62999359b7c1c7d526dbd7f97c98ce4603a4f4852cad29d5646", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetFutureValueAmount.java", + "type": "file", + "size": 2426, + "sha256": "028e2c1c044588b003d0b18ee818250bd66c562f0f66373080257ca5f607f517", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetGeneralTerms.java", + "type": "file", + "size": 3269, + "sha256": "2ac156764a9c5ae4b221073d922fdf43bc24a01577f470be0e36c965db5bb21c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetIndexAnnexSourceEnum.java", + "type": "file", + "size": 1062, + "sha256": "66f8ee31a4dcf873c48c70cb8fb3c38463b7745723fae81a4c5a2d00dc5a791a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetInflationRateSpecification.java", + "type": "file", + "size": 9519, + "sha256": "6d5b52392045d665c26c8cfa153202eaf7686942971a2b2d4e577a2aec690c0d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetInterestRatePayout.java", + "type": "file", + "size": 7912, + "sha256": "1f3734fdbfe95efd0686ef46c78cb22d7a79246278861087a427c6b4bf443d3c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetInterestShortFall.java", + "type": "file", + "size": 2126, + "sha256": "1b098b0c24f48e524ca000201cf613a2c4c9f8f255e8cb704594a6e5199a32d6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetInterestShortfallCapEnum.java", + "type": "file", + "size": 1078, + "sha256": "3f37cc0efd8e18091526540181314fb1899e00c6bb0171654f838b741e563d96", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetLoadTypeEnum.java", + "type": "file", + "size": 1030, + "sha256": "a26ae197db5973f53b2972326270386616ef72c590bd835c0e05ded849615d8f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetMetafieldsReferenceWithMetaFixedRateSpecification.java", + "type": "file", + "size": 2146, + "sha256": "733572784e838a57d20f46ccda0d59dc0e639d1febabb413037d753f3897744d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetMetafieldsReferenceWithMetaInterestRatePayout.java", + "type": "file", + "size": 2118, + "sha256": "0112ec754f098d5020a0baa293deb92175bfa5e73948a0c6c915b9ea96e3fc76", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetMetafieldsReferenceWithMetaProtectionTerms.java", + "type": "file", + "size": 2097, + "sha256": "b5d1b61b15beec9dd56984428a24cf83594cc3c878b66e9445bd2b2dd4a0f1c8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetNegativeInterestRateTreatmentEnum.java", + "type": "file", + "size": 1114, + "sha256": "6137b9841d2486b4ccf66307ae2ac515246acf02ac74ec7652aef59e146c987f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetNonCashDividendTreatmentEnum.java", + "type": "file", + "size": 1094, + "sha256": "b7832dc71731df5dea5a27f5ffda8b2a93f494f28a56ff6834b7a008d020ac72", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetPriceReturnTerms.java", + "type": "file", + "size": 1893, + "sha256": "036dba158707b0280b0faf6b034ec59bb4700a70e3b8c76726b3908d6770cc1c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetProtectionTerms.java", + "type": "file", + "size": 2117, + "sha256": "f4638b2ac2c4a8bb60ea1126efb63514e2a4f492a98400aa33aadfa32b51a4e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetRateSpecification.java", + "type": "file", + "size": 2760, + "sha256": "02a12236618f07d542a09a15f50e1095080c8665b1f3d9e10282146d2e07ca29", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetRateTreatmentEnum.java", + "type": "file", + "size": 1050, + "sha256": "1caa4ef7f7b6827bcefeff29c3b31fbe58b34f61583d9b3b7254585c44882067", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetRealisedVarianceMethodEnum.java", + "type": "file", + "size": 1086, + "sha256": "600b36cb0c0b0ec05416ee3a870fc0dba88c2f1c90cf7855c84b7c3f765a240f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReferenceInformation.java", + "type": "file", + "size": 3688, + "sha256": "535b154d390a76a9a69b71ae080ee50470ccf26e17e51d996257c3ec89e35166", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReferenceObligation.java", + "type": "file", + "size": 3506, + "sha256": "ae53756a0eb152b4e824f98e148a20544433de6215cab3109fa20741a04f8cdb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReferencePair.java", + "type": "file", + "size": 2466, + "sha256": "1cfc865974c4e336afe5d4a8448805cb9ee0347a852cdcd784d40d8981866cf1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReferencePool.java", + "type": "file", + "size": 1442, + "sha256": "a74638b2d66fda657a712dbf57bfb848883c76677f25a108c10de1b5c4364e79", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReferencePoolItem.java", + "type": "file", + "size": 3432, + "sha256": "5e4ab4d377e737ce34373aba210addba72a6b603ad3feb2bcc2784897b46b3a2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReturnTermsBase.java", + "type": "file", + "size": 4396, + "sha256": "a7550f222be35164854fbf8e2c3aec7277f372f8ae55b5bea04be5e1a17a0006", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetReturnTypeEnum.java", + "type": "file", + "size": 1038, + "sha256": "1308201e3a85c16ddcb41e6321689d9c2074ba03f44d5c70bca3d20a54c8f9b6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetRollSourceCalendarEnum.java", + "type": "file", + "size": 1070, + "sha256": "24e69ed686fa335ac53e1ebba300730f173300c27603335b35d3368c0f7dac7a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetSettledEntityMatrix.java", + "type": "file", + "size": 1752, + "sha256": "c8115f717a530b0dbc9e1a1af779851e6f34c5fd81213ea6ae73ecf4c16ee867", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetSettledEntityMatrixSourceEnum.java", + "type": "file", + "size": 1098, + "sha256": "22ff57e84e0db2051dc5dc834aba208cd1b6272ee7448b4ac08c2951cdc7734c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetSpreadCalculationMethodEnum.java", + "type": "file", + "size": 1088, + "sha256": "72f2659ea8cbf505bfe8d7586b42d8e97b39cc8193d53240bcf287a0294b7b4b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetSpreadSchedule.java", + "type": "file", + "size": 1829, + "sha256": "4977b3025ba32710138c203746e0c8a771063db9b52c074305f466bef6b2c25c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetSpreadScheduleTypeEnum.java", + "type": "file", + "size": 1070, + "sha256": "24484e77b165f3d8e13c440dabed103a9ef65110b3a91060e54dc701ab9a3dbf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetStubFloatingRate.java", + "type": "file", + "size": 3657, + "sha256": "d24a6e453ae50067a0030850a0606b963437f3e9278721541afac176d28bec95", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetStubValue.java", + "type": "file", + "size": 1893, + "sha256": "7425504d0abea8db235e4b13774e6e6b84e13cd91a53d5922e82ea51362516a3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetTranche.java", + "type": "file", + "size": 1897, + "sha256": "3cc192e8c8e525dc68fe61b018be5beacb81e8fb36360b6c2a84e2472b8ef04a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetValuationTerms.java", + "type": "file", + "size": 3828, + "sha256": "12e012aaf61d387effaf6e18204efa4e9877c561add312f4a4682dffedc8eae6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetVarianceCapFloor.java", + "type": "file", + "size": 1969, + "sha256": "48a76807fcba1a22a368dc9365532747f880a022e369691d01771bcf41c446e8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetVarianceReturnTerms.java", + "type": "file", + "size": 6856, + "sha256": "841b850105e7c296399641ff9dfb3bcd052f754cd199706aa728575295320997", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetVolatilityCapFloor.java", + "type": "file", + "size": 1911, + "sha256": "c7c3f2ebd956172d99d67109b42e4bce10c8beb612871d9e2563c083e4c56fe8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductAssetVolatilityReturnTerms.java", + "type": "file", + "size": 5736, + "sha256": "63926693c285640dc00c58dccffc458ea871246f1ec2c9e0b4e7ae4b5c07e412", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAgencyRatingCriteria.java", + "type": "file", + "size": 2633, + "sha256": "5c77bf1a29b4a197676e34d099430dac565b5ea5a63789aa1c85635ecf06aadb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAllCriteria.java", + "type": "file", + "size": 1437, + "sha256": "fdf101691e00245b7a0af5611400a9f5c848b3c06fdb25f0e863b3e56992478b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAlternativeToInterestAmountEnum.java", + "type": "file", + "size": 1126, + "sha256": "375397d6bfc9fa7cc2ee931cfc32825eed297bcab42a92a29240259f6a57ee94", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAnyCriteria.java", + "type": "file", + "size": 1437, + "sha256": "47b7b8f565bd498ba13e45075a56825419bc83d8c6be931ba8436d78bd4de5d0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAssetAgencyRating.java", + "type": "file", + "size": 1468, + "sha256": "de9147a6084f9ca7fe0f9d78d2a924413c9a8b4c6d9425d9a21492dbb1cd2ed5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAssetCountryOfOrigin.java", + "type": "file", + "size": 1524, + "sha256": "e33464f4d7b4ae94999633fab4ce436fc2ad4a465fb9f5d03891df2a32301011", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAssetMaturity.java", + "type": "file", + "size": 1753, + "sha256": "b992b06b5094b06a61a47952e3440e3d6e404d7308247bc941fa94e5f326c2cf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAverageTradingVolume.java", + "type": "file", + "size": 1757, + "sha256": "58f5c001088c7eceba73f778745de1c21bfdb5ca6028ad3807acf8a89d929fb9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralAverageTradingVolumeMethodologyEnum.java", + "type": "file", + "size": 1142, + "sha256": "31495912dcbffefb05ca213caf0dd5995758eeabd1fbf2d63756efa73c5385e8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCheckEligibilityResult.java", + "type": "file", + "size": 2656, + "sha256": "c39f9ead28e0d44eda38beb23a1ac9e86b57873ce86574f6dc98525fcf570343", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateral.java", + "type": "file", + "size": 2764, + "sha256": "06d7836811f5aee173f9c8a47d2cdc4c58705e61924c7f41fe5c0afd414d0aea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralAgreementFloatingRate.java", + "type": "file", + "size": 3313, + "sha256": "e2054476d213b6346ca8033d73ef57381bb104cbd23614edc83504e54edf9651", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralCriteria.java", + "type": "file", + "size": 10658, + "sha256": "412e3a3dab4e0885e7349be3f478340804082dffbbe5ce0ac8d29a89dfd5913b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralCriteriaBase.java", + "type": "file", + "size": 2738, + "sha256": "39dc058a795a1d8c1bc96983bb3e773d6515ab7c6adae4edb4ae576ec846c297", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralInterestCalculationParameters.java", + "type": "file", + "size": 4489, + "sha256": "f7bc6bef042e6971b2f8f535783bf7be2a3fb1ee2262a706ba2b51ad0702d464", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralInterestHandlingEnum.java", + "type": "file", + "size": 1122, + "sha256": "1f607b3e6396936a89d1e7d50cf4a6519b39e96ebd756138d9aa3bfcb43cab65", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralInterestHandlingParameters.java", + "type": "file", + "size": 7024, + "sha256": "b7b8ec06b9e97c71dd694d2c4eb1fbba9ebd42e593f36fd3343f41277b112ef8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralInterestNotification.java", + "type": "file", + "size": 2286, + "sha256": "6c11d29a4d7d49ae58c6d4a10b02ed57ce426b00520fe18b4d89b945aaac7410", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralInterestParameters.java", + "type": "file", + "size": 3663, + "sha256": "ff5d5850d17cf619a32879a2ab983fa29b0a4a94f08833f4183deb89c61a4f45", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralMarginTypeEnum.java", + "type": "file", + "size": 1098, + "sha256": "c10b485cd4da20f0e77e62e55e706dadcf5ed4e7b5eadf47f6bfc4e0e648b1f0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralProvisions.java", + "type": "file", + "size": 2371, + "sha256": "806f3c285ff0cb0bf05cddafe187ee5186cb978b712e20008de6456ae2ffc0a0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralTreatment.java", + "type": "file", + "size": 2207, + "sha256": "d26bb55fe0bbb988d9c4f627746af67003dee94ee5cdad51328d390729bfffc1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralTypeEnum.java", + "type": "file", + "size": 1074, + "sha256": "97a7a2d0110de27fa6f9bacadbbec3027e5940b8820fe0172d9549dc0c69e0b1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCollateralValuationTreatment.java", + "type": "file", + "size": 2427, + "sha256": "0050b7ab39da2a757f67bb908f333488213a0b83abcb35eeadb7059018a3aac8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralConcentrationLimit.java", + "type": "file", + "size": 2184, + "sha256": "b8c76f4f8c5c2d6f47099f0be87d6c90f49875d396ac94b8cbc6b8f4a6cf2191", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralConcentrationLimitCriteria.java", + "type": "file", + "size": 3662, + "sha256": "337c6aa5a205f9e81616aa934ed3e0202025495e7b5eb4bf541f7427269471a3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralConcentrationLimitTypeEnum.java", + "type": "file", + "size": 1106, + "sha256": "6642201241c1aa6fe182c3e65d24a903b8b7cc670b53a7a16bda6b45e76b6bcb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralContactElection.java", + "type": "file", + "size": 1488, + "sha256": "5cc0b527d490360f44bbc420dad5c2ffbeee1777cf7b8c746a0be047b43fc554", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCounterpartyOwnIssuePermitted.java", + "type": "file", + "size": 1515, + "sha256": "c320128ab797f7d916b9765fd60cc81c91e57008459b93172e354455f8e75412", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralCreditSupportAgreementTypeEnum.java", + "type": "file", + "size": 1122, + "sha256": "898d9c522ce69a41980fa5fa5f4962c95d0511771f8fc261d92e58cd0a6841a6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralDeliveryAmount.java", + "type": "file", + "size": 1740, + "sha256": "8f50d8d529b70f781f9d193a769d70e108abc1d319e19e250bde30cf17b7171e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralDeliveryAmountElectionEnum.java", + "type": "file", + "size": 1106, + "sha256": "0f4d040cce01abc5cc667dbd6692e5c543d83e2fdccd15f29c45570c421502f1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralDistributionAndInterestPayment.java", + "type": "file", + "size": 1607, + "sha256": "f2b81aa5e7fbbea6d71ef2e4562b6b1e48dbe9c9ef88c1b5be39bb52c32437e6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralDomesticCurrencyIssued.java", + "type": "file", + "size": 1431, + "sha256": "2466cda076cb41b221e742f059e4fc1ec6a521c8939bbd9cfd20b179099161ea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralEligibilityQuery.java", + "type": "file", + "size": 3634, + "sha256": "d249bd9eb989dd6c7679e39ef4e1fcefd0b0b8f54185f106d647f5a97ce4cd8b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralEligibleCollateralCriteria.java", + "type": "file", + "size": 3120, + "sha256": "f4fcf11c3589aea1d422d20e989b1a4d79c50fa92dda8dd1a15a4fedebfe0152", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralEligibleCollateralSpecification.java", + "type": "file", + "size": 2947, + "sha256": "b13806ecb6ab1343e7820d7005d5539eb0392521625b0b0eb536245c2f1283ef", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralEligibleCollateralSpecificationInstruction.java", + "type": "file", + "size": 1957, + "sha256": "e1f9676a36040e5a80cf39afe6bfed2f475227a3705b737242aed62a8c27b47e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralFieldWithMetaCreditSupportAgreementTypeEnum.java", + "type": "file", + "size": 1852, + "sha256": "395529398609afcfb7217d664901353c84c1f634dd4476cfb2294d4ebf6199e0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralIndependentAmount.java", + "type": "file", + "size": 3386, + "sha256": "270ab12a6c339537e2b3bb793ba75f9c575eb33ede6377b52446444c351dace1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralInterestAmountApplication.java", + "type": "file", + "size": 1820, + "sha256": "81b979d730f1447b13cddb694eb8ef9dbff43998afa06b4a8b895a5b7d940c96", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralIssuerAgencyRating.java", + "type": "file", + "size": 1482, + "sha256": "e0cd1a7ac16880b7b7e36d019bd4470619243b7f83c239526430bb4056b91ae3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralIssuerCountryOfOrigin.java", + "type": "file", + "size": 1536, + "sha256": "00150be40d546749e88580063bf13fdb6639cc31a7482ba95b91ad19782588f2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralIssuerName.java", + "type": "file", + "size": 1365, + "sha256": "6bc6b91c283adc36df03993237e2fa9a01390d1c697d629b1c9c5c35b28b74fb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralListingExchange.java", + "type": "file", + "size": 1420, + "sha256": "1cb98c7a880b897c1f6f3bf83511d8d10af74cec980deb164b7ae2fb5fafbfe6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralListingSector.java", + "type": "file", + "size": 1396, + "sha256": "a8a95aa2555d399c38e33d3f46e7f71b1866ec52039b489cdb5650d9ff7e5eec", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralMetafieldsReferenceWithMetaCollateral.java", + "type": "file", + "size": 2097, + "sha256": "06f73303d354e450b88929c165a6db4c00f10993a5dd00a9f8c84cd5911c97a7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralNegativeCriteria.java", + "type": "file", + "size": 1456, + "sha256": "f1aa3b85ca41d6149066680091c615750ccf5b968daadcf86043ab17898b06ca", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralRatingPriorityResolutionEnum.java", + "type": "file", + "size": 1114, + "sha256": "02eadc52dbafc6d141790d265ad90d4dc2a011d5283d956cd43292a5390b992e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralReturnAmount.java", + "type": "file", + "size": 1660, + "sha256": "dbe3a7c70290859569fcf9b140a26cba71b6e6a2e8339b07517e458dacc581f9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralSovereignAgencyRating.java", + "type": "file", + "size": 1518, + "sha256": "4d0d93b18370dfae3a61badacd33010a6a0ab22262d4ab0c843e1b0df6002763", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralSpecificAsset.java", + "type": "file", + "size": 2728, + "sha256": "41df65a0e92dedef325d1969e36645136b5d58887f2d29ba55a1893be89c5724", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCollateralSubstitutionProvisions.java", + "type": "file", + "size": 2218, + "sha256": "862f0d77333341f805e16395d2bb68a3bab6774182990e680034f989bfdcbe72", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonNotionalAdjustmentEnum.java", + "type": "file", + "size": 1074, + "sha256": "21f689d3f2bf0a5eb3fcd7c07188072d77e526b062cace884f112b6c9a9f1d2b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleAmountSchedule.java", + "type": "file", + "size": 1951, + "sha256": "c81f9c88bccccd56b2afac1d5b18118f3b2d29bb2f04e5891836e2b2b821146f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleAveragingObservationList.java", + "type": "file", + "size": 1625, + "sha256": "beb360ae432cc5901b85150871feb3b7917aeb725e9e6fb0070fb45b538d2f77", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleAveragingPeriod.java", + "type": "file", + "size": 2688, + "sha256": "5b162611152424c481a62a1bd6d7460284efb3d1c2d1e3bebcf3943101166993", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleCalculationPeriod.java", + "type": "file", + "size": 5059, + "sha256": "080ae2ba8b1198298e27aa5d0fa1b57e6b9b5330e7be3400429458a7d995222f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleCalculationPeriodBase.java", + "type": "file", + "size": 1702, + "sha256": "d10d7c9fc938d559fb87a5b6b7589163277ee869152172f5d031ea9945c14703", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleCalculationPeriodData.java", + "type": "file", + "size": 2796, + "sha256": "893e438fec382275421ef2b1b4126faaaf66096918473c71b3e612fd522446aa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleCalculationPeriodDates.java", + "type": "file", + "size": 4810, + "sha256": "bfc4ef42c27c9145f5a832f74e3803e6f18dd7fecb0249f113672b3aac777788", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleDateRelativeToCalculationPeriodDates.java", + "type": "file", + "size": 1823, + "sha256": "47345329bc3c62f723d29fb4d66a7920dc5d76143644e64fabdc221b686a52ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleDateRelativeToPaymentDates.java", + "type": "file", + "size": 1675, + "sha256": "22ab71b8f790f0bb82f4637d4e2f32cb14121a117188aa9569db354baae0c5fa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleDateRelativeToValuationDates.java", + "type": "file", + "size": 1720, + "sha256": "d69cd4a870d1e866657044fbd9f7debc1076621cc9ae95e0095751fa59b01bf9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleFinalCalculationPeriodDateAdjustment.java", + "type": "file", + "size": 2714, + "sha256": "8dddd3521feaf134edf53bc27bf87f7a3bc9377e3bc0a628f9b5d87aa77ad376", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleFxLinkedNotionalAmount.java", + "type": "file", + "size": 2315, + "sha256": "6da93352ce3d6afeef85e8f2928d228f4ebc469d084adbb97cd72812f3006d6d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleFxLinkedNotionalSchedule.java", + "type": "file", + "size": 3296, + "sha256": "c2d03021e578201c6d2fdcd23330fff6ef3c495c9f753f98e801cedf35951eea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleInitialFixingDate.java", + "type": "file", + "size": 1780, + "sha256": "2ef3c8b9d3db3e3b98946e0b2c852c898ff62e05110af4d73961907fd116c4db", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleLag.java", + "type": "file", + "size": 1719, + "sha256": "e169532e035b625fa0e7171e3d3c98c860eb84e214b14b9cd5ad1cb83521d8ea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleMetafieldsReferenceWithMetaCalculationPeriodDates.java", + "type": "file", + "size": 2211, + "sha256": "9cf5dd96bc3b2435c4dd6bbb6fe253fade583f3368f03d74502b2ae92e7130e9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleMetafieldsReferenceWithMetaPaymentDates.java", + "type": "file", + "size": 2141, + "sha256": "febb88ef6d85168cbede632ee79527b616e31aae82c42b2a7665e7df18a4a75f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleObservationDate.java", + "type": "file", + "size": 2168, + "sha256": "b63d02d2adf3453bf1b2483d30534adcb2031f2582134bf377fbeacf89f7d31a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleObservationDates.java", + "type": "file", + "size": 2256, + "sha256": "9d11e3080f57395d56f97469b06aacbfe03aa3c2f7f63a216d499afbf3e3dacc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleObservationSchedule.java", + "type": "file", + "size": 1907, + "sha256": "8a412da6082ee8429c3f3c33b33328781c98d9ffd122211f3247c197162493cb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleObservationTerms.java", + "type": "file", + "size": 3752, + "sha256": "36c7e49b99cc2aa03d8b58d66af53eacd4f0f5db9d63739e5d55b05175953684", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleParametricDates.java", + "type": "file", + "size": 2979, + "sha256": "dfb3a51d163f34d34915b0be9bd1e42755816c902f5aaedd91ade65a9bd11763", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSchedulePayRelativeToEnum.java", + "type": "file", + "size": 1088, + "sha256": "45a37df80ed51dc3014556e5bb09360a46dbf82884d0d9e9d09d3aa8462b6988", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSchedulePaymentCalculationPeriod.java", + "type": "file", + "size": 3641, + "sha256": "aafd1851e3f32ce1808a9432003f20e1a32135855cb4dbfa2a535915c391de6f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSchedulePaymentDateSchedule.java", + "type": "file", + "size": 1977, + "sha256": "9f0650f07634c2a6489ad18b2a9a883c58edfac9a1488930d71fe33feb7c321a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSchedulePaymentDates.java", + "type": "file", + "size": 3604, + "sha256": "47945e527be8a8d5555345ba3600159cbcdfa2bda71dd30d8e1229d33d2b7dc4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleRateSchedule.java", + "type": "file", + "size": 1437, + "sha256": "e15188e417cd15c5223d5664a7808684a7b6d6a7ef773ede309abb200051661d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleResetDates.java", + "type": "file", + "size": 4277, + "sha256": "26fd17397d1c5ab04905d9b3c48d9c4f199f98187df85b8891145d586f95403f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleResetFrequency.java", + "type": "file", + "size": 2156, + "sha256": "78eff1a9231aad41e6922d833b7513bd3a11048bad85121dec94cfdb0a203241", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleResetRelativeToEnum.java", + "type": "file", + "size": 1096, + "sha256": "5096ddcb270405c7e3d7cb15d16ff4de33e7314a52f5b0586d0a5048e3087e3b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleStubCalculationPeriodAmount.java", + "type": "file", + "size": 2373, + "sha256": "364fad5f28cc32877573c9314146d145fd74b74f5648bf9f94f8a4778af0360e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleStubPeriod.java", + "type": "file", + "size": 2254, + "sha256": "cf8aed039b5ced130d4748c67e24e5acb56bfdc71843ea9c185f1c19bc37a49e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleStubPeriodTypeEnum.java", + "type": "file", + "size": 1092, + "sha256": "c9d6347b0cbb53854dce24a0955ef3ef095f88d980bac8aae8bd20e5e1e0b1b6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleWeeklyRollConventionEnum.java", + "type": "file", + "size": 1114, + "sha256": "1480a7acf89042cd5a98b13ea70e52fae6638bc2bbb95f8d274f19acb17e0201", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonScheduleWeightedAveragingObservation.java", + "type": "file", + "size": 1972, + "sha256": "6f686c2aeb791f2c14e0e1cbb187112932a731db615098701e12ddb561b17d5d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementAssetFlowBase.java", + "type": "file", + "size": 2094, + "sha256": "4998b7df40033b0ef33c271c12fa9d69ba1a8f29de3a0b0647430d1ba4510f07", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementCashSettlementMethodEnum.java", + "type": "file", + "size": 1124, + "sha256": "8d83389b91c4dd7a97b46bc73027db80e1a772bf3f04ecfcdc37605682f6528a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementCashSettlementTerms.java", + "type": "file", + "size": 3925, + "sha256": "112da41980005e8a994be82407acb0abafa36d1e538091a9733e7ef8f13445b5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementCashflow.java", + "type": "file", + "size": 3185, + "sha256": "cc889c71cb235dd2105e8e2eff08298ce422c0f55a97094a549c8dc7a94f093e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementCashflowType.java", + "type": "file", + "size": 2147, + "sha256": "89622f48b97542b2d15b5fecd6abdb2afed47aa98ac8a0103f1286912ca3c72b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementCommodityPriceReturnTerms.java", + "type": "file", + "size": 2388, + "sha256": "39e4a4b81bb946033218178678bdde227b86f49f704dea720fde816f2db75bc2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementComputedAmount.java", + "type": "file", + "size": 1896, + "sha256": "d06760cdfa46fb7840aeea2c87dc169b3bce979bed7ca7bc941db8aac4f11543", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementDeliverableObligations.java", + "type": "file", + "size": 9279, + "sha256": "2289b11882ebd435aaf036308e98596ffd13b06f70484c8c4d92319ce16687a7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementDeliveryMethodEnum.java", + "type": "file", + "size": 1100, + "sha256": "a519ef3f491cb1bc71a189e0a563116b810934ffdf1fb93bf265f02bb751db87", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementFixedPrice.java", + "type": "file", + "size": 1437, + "sha256": "5cbe1db5c6aad77039dce72eba4803c3432f80342e62f2c413874d4b00164716", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementFxFixingDate.java", + "type": "file", + "size": 5229, + "sha256": "a870d212df91572ef93bb8cb0f2f70130dbad4a471e090a66c14e14dff759666", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementLoanParticipation.java", + "type": "file", + "size": 2077, + "sha256": "fa82cf7a92d1674cf79caae371aa9dba7e544fd516dc0de68d84ea4ce15e58c5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementMetafieldsReferenceWithMetaCashSettlementTerms.java", + "type": "file", + "size": 2204, + "sha256": "f0479a58b27d7d0ae285711c8bcc4b3277caa26a5851d47efc5dcb26ef8632cf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementMetafieldsReferenceWithMetaPhysicalSettlementTerms.java", + "type": "file", + "size": 2232, + "sha256": "63ea1cb11b0f8ff22c302c354b513310a32987cd258f49921bf4d9c4e3eba618", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementMetafieldsReferenceWithMetaResolvablePriceQuantity.java", + "type": "file", + "size": 2232, + "sha256": "fa9b68c68c35641c1b86bbf6d2953ae3fce63ab73b6dd7bb2b6343c1d5c94d79", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPCDeliverableObligationCharac.java", + "type": "file", + "size": 1759, + "sha256": "306b881eb529ff978e66ff1fc65eb702d523c2af2b1886a8172f3c2b523eb857", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPaymentDetail.java", + "type": "file", + "size": 2111, + "sha256": "577bc589518a3d512a0f903a77632245273109746a1ed514ef96da8ebaa61728", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPaymentDiscounting.java", + "type": "file", + "size": 1747, + "sha256": "7421e00dab65bbf34477c8e41ab4756366fb0a90d200cc09ed3ebaece74d5e11", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPaymentRule.java", + "type": "file", + "size": 1449, + "sha256": "b03a795c6c02c186517256b4551037ac1ec15a9c6cc689f96193640199a39b2c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPayoutBase.java", + "type": "file", + "size": 2611, + "sha256": "21156c7fdb1bcc8effd7b7d2bf2f1bca9d14be99e656006fea28182a0999476e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPercentageRule.java", + "type": "file", + "size": 1837, + "sha256": "6e84f899d375270db32429f67631de4c20e6238f3b16705306077e2748385d4a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPhysicalSettlementPeriod.java", + "type": "file", + "size": 2141, + "sha256": "276b271f2aba7d67e12912e146e5758af78d315cd939cb3dfb442cefa6ff41b4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPhysicalSettlementTerms.java", + "type": "file", + "size": 3640, + "sha256": "ab284933bd8586de5964e1281f7d629b5e7c7762bc8de34712c06fa64df303c4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPricingDates.java", + "type": "file", + "size": 1851, + "sha256": "58e575223e0d89f85ce26eae136efec53ea93ed66d5e3a0121ed3420a6fc3640", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPrincipalPayment.java", + "type": "file", + "size": 2893, + "sha256": "93d49e7478ab11ca5f99ff3870c4d0ce0afd7733b09036d1f9429ff7d5474778", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPrincipalPaymentSchedule.java", + "type": "file", + "size": 2546, + "sha256": "7134a0a4967977ebfd824db1789fcee2081ef78fabd69276e1342d541aebdedd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementPrincipalPayments.java", + "type": "file", + "size": 2868, + "sha256": "3b96c96d780f0fd3285a6fae0f357401fb31f92b04b7223b83f8ed7d5e9daf09", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementQuantityMultiplier.java", + "type": "file", + "size": 1871, + "sha256": "c8d56928c1fada8252294b2cfe1c6b603fd46c67f6c91a19396d8504474d0664", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementResolvablePriceQuantity.java", + "type": "file", + "size": 4003, + "sha256": "1fff0dc5c8fa8728364bfa1206c48209573f8cd8f7b7d15bebc7b863a8693818", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementRollFeature.java", + "type": "file", + "size": 1876, + "sha256": "7499b2c702209d49acb05d649091c5c0e35340ab9d61aabe5c8fb4829f50ea88", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementScheduledTransferEnum.java", + "type": "file", + "size": 1112, + "sha256": "f37fd051730136a7139fc7378eddfdf1fc6524c27c4c173fb8d1921afa3e906b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementSettlementBase.java", + "type": "file", + "size": 4044, + "sha256": "d9aebcf178cc78dfa43a4f9dc8366faebc260659862fad0e40ebd5d573774317", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementSettlementCentreEnum.java", + "type": "file", + "size": 1108, + "sha256": "431ea956af69620d98a6edae9ee41e1c499f478fd0e91c7119b83ed101f05b67", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementSettlementDate.java", + "type": "file", + "size": 3220, + "sha256": "5d271da9eb17b6d7231b3e0fa5614b861fcf3bea823a72d31051da3550bf0b9d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementSettlementProvision.java", + "type": "file", + "size": 1518, + "sha256": "e67d0895b2f6339c942947528c7843786178d7056cdadc5a04546f63ff92e1b3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementSettlementTerms.java", + "type": "file", + "size": 5002, + "sha256": "ba018cd33864eb7a5765198716482c771f7da35ba5e13bde2ea82c5d37d77096", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementSettlementTypeEnum.java", + "type": "file", + "size": 1100, + "sha256": "b995d161badee737cfd3bebe8491443559e1c37c18cd7575c79b52477e8b4207", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementShapingProvision.java", + "type": "file", + "size": 1459, + "sha256": "96cfa062a23d5d3d7586237a8c1b1fc0530c07bbe0e0f5facf70ef77bfbb2738", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementStandardSettlementStyleEnum.java", + "type": "file", + "size": 1136, + "sha256": "b160ef770c2338dac2350a22a83251235c0147309d467d39e36a9bee22464a19", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementTransferSettlementEnum.java", + "type": "file", + "size": 1116, + "sha256": "15595a624e19164ee120fb15357b2eaab672fbb8737b3837129cd21dad474964", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductCommonSettlementValuationDate.java", + "type": "file", + "size": 3003, + "sha256": "acba622fac71b1119347755c8dc3e942fb6ff7f7e576093f7e347c1136fff5a4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAsian.java", + "type": "file", + "size": 2389, + "sha256": "f3695bb36d915d27662106cb0c952547face679a6ea128bbdcdd489c69305b3b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAssetLeg.java", + "type": "file", + "size": 1771, + "sha256": "830e5209cd21cb0240315cc1f2fd43b575e80b9e9967c124857b3c5b28d124bd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAssetPayout.java", + "type": "file", + "size": 4167, + "sha256": "fca35877bc3f5b2c5b8b468eca533ab35ca26793b0c853348f6687da66d7777c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAssetPayoutTradeTypeEnum.java", + "type": "file", + "size": 1090, + "sha256": "b332e6e71cb8501baaf8ec0baba7df48f086b246261ee42787a56d19877051d8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAutomaticExercise.java", + "type": "file", + "size": 1594, + "sha256": "580cc4842337afdbbddd46236fd3ab64bfc70adef3a1c948dfeb6a39bfda9c49", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAveragingCalculation.java", + "type": "file", + "size": 1734, + "sha256": "c93f5b09e30659cbb6f4cf48a77f803f03569e21679710e5b2dcd48160ba136e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAveragingInOutEnum.java", + "type": "file", + "size": 1066, + "sha256": "06da643ad9a6a887ea7a9e42d074117baf2dfdcf916f3edb4c304ca1baf0d6de", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateAveragingStrikeFeature.java", + "type": "file", + "size": 1896, + "sha256": "0593478f25fce075e8019ff9ae8593c0405e749afc30e019177c00d37aa19fca", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateBarrier.java", + "type": "file", + "size": 1654, + "sha256": "87d68065401a66763fd35bfa3c02531438a8e6af8865972b37423d11299eca1b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateCalculationSchedule.java", + "type": "file", + "size": 1466, + "sha256": "9cf85bdb198e5c94b823a6f7e4d55b11826660e048babacc206b631b0f92f907", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateCalendarSpread.java", + "type": "file", + "size": 1442, + "sha256": "d412ca41981356bb09c93ee326874e78cef1dd79f62b0e4768b5d35acad047ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateCallingPartyEnum.java", + "type": "file", + "size": 1058, + "sha256": "25657b2e8b06635a768844fbbdf9da7e8f37307fb0a50e7b47368701e1391ff6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateCancelableProvision.java", + "type": "file", + "size": 6830, + "sha256": "16346c02d7e5cc7b0ea2f2fe855d3bec5bcd6fbc872e50023fd649c9ad243df3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateCancelableProvisionAdjustedDates.java", + "type": "file", + "size": 1561, + "sha256": "334fb0a8230a30b103a55c53ac4cd33a456c25bf07eab2d227680ced5fa8a86a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateCancellationEvent.java", + "type": "file", + "size": 1752, + "sha256": "490b17f939dd220ef39888dcdf47c3de51f80ba30be90c7ecbe00af8688a8b3f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateComposite.java", + "type": "file", + "size": 2459, + "sha256": "7cce08da42f0081f5438abcbc44420c02c1f7f3564cb149418ae6b65191cdd18", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateConstituentWeight.java", + "type": "file", + "size": 1591, + "sha256": "2b777d4ebf020584a0bcb4e65825c94f317aff347d01ac93e2e7a2d7dba9ffbf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateDividendTerms.java", + "type": "file", + "size": 2272, + "sha256": "31a45307a3a7a1be65baf9994d4e05adec33f83311dda8d04f8f33247ff87327", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateEarlyTerminationEvent.java", + "type": "file", + "size": 3005, + "sha256": "498ebe568018ed1f37300716bcf5fa0ba77c361d3563c3f16e52dea3dd020c2f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateEarlyTerminationProvision.java", + "type": "file", + "size": 2995, + "sha256": "97b6ff4997798b4661fafb1aca6764aa106eb2c06bf4d5bfd1877e9da71f33af", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateEconomicTerms.java", + "type": "file", + "size": 3880, + "sha256": "7c23a7ad7832aff03505bf1ac7958490dd69865de88241182f4438e86a2aba35", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateEvergreenProvision.java", + "type": "file", + "size": 3339, + "sha256": "97f58843ce94149bfdd8e5460374714be19a41b337d2ba1564d80587a85efd14", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExerciseFee.java", + "type": "file", + "size": 2913, + "sha256": "0730824ae3f254a4ecd783441d65524717656483a7ae2b0c2f2f7cef817c5020", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExerciseFeeSchedule.java", + "type": "file", + "size": 3240, + "sha256": "869ff856c0b1e97319e97d2f645d2273a87a1ae62ec0342e8335fc25b7f5edd9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExerciseNotice.java", + "type": "file", + "size": 2281, + "sha256": "0438bc7c757afe60a418d2ae7c11e6bad9de89459e3c5aaec441d78a1497b842", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExerciseNoticeGiverEnum.java", + "type": "file", + "size": 1086, + "sha256": "ce3747d01dbbb584a9c950a7df7802c8bff06baad9d71d75b9f405f6cc40dbb1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExercisePeriod.java", + "type": "file", + "size": 1782, + "sha256": "d514581e7637fa7e1f4c4c8e81cea573584bd234d50423ae6ea0984aa03f7f2d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExerciseProcedure.java", + "type": "file", + "size": 2702, + "sha256": "35349687f6fbd00129a1ea004b0510349078ae8d3b02f8973224dc801838011a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExerciseTerms.java", + "type": "file", + "size": 6301, + "sha256": "2eb078bf88a8c9f41a0aa09d3ce3576beff60230fc9960db3cf94937acb2d02a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExpirationTimeTypeEnum.java", + "type": "file", + "size": 1082, + "sha256": "c9490e32f3e03b71458d06ea2b227f74a86d98f9ad02222fd2fb44db5d06a664", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExtendibleProvision.java", + "type": "file", + "size": 5492, + "sha256": "4d4aa6685b2d6842528cfeaecefb4a8842f921f1ad2adda76335e08274c38364", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExtendibleProvisionAdjustedDates.java", + "type": "file", + "size": 1531, + "sha256": "998dfe152a38dca4378a253c3b67c37af37a2aa37b7bd9754b438157d923466b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateExtensionEvent.java", + "type": "file", + "size": 1755, + "sha256": "ddf4d7c12b4affb439ca6d6ca01a2e28b2c3d95647d7e09d6485939660007e20", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateFixedPricePayout.java", + "type": "file", + "size": 3604, + "sha256": "87e39121ac5b20eb0c81a057715033dfdfbf63001c609722d6f3be77890f5311", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateFxFeature.java", + "type": "file", + "size": 2285, + "sha256": "c26453373fa381a0ba1352055cc47260ae9fb64ba94a4418375ced6f9410ed74", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateKnock.java", + "type": "file", + "size": 1593, + "sha256": "f5cf609972f7234debf84607e12c20592a26450415b8613693dd91b80b78ffdb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateMandatoryEarlyTermination.java", + "type": "file", + "size": 2921, + "sha256": "9b188d927bef40fd2e9574597192bb2d76b878a8684d4cf6a54a2c506276deea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateMandatoryEarlyTerminationAdjustedDates.java", + "type": "file", + "size": 2412, + "sha256": "51ba2e344635ad6358c054b82db374f489447788259ff90095f9b5d501c9cafb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateManualExercise.java", + "type": "file", + "size": 1689, + "sha256": "cc74498eb8dac4e35d8da77dd4801071e7a784677617d269f9ac3f7b0007282a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateMarginTypeEnum.java", + "type": "file", + "size": 1050, + "sha256": "7f601557c9ca1fc6e0b1c5617a1e1b9fc5301eed725d377b5a04c671161d248b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateMetafieldsReferenceWithMetaOptionPayout.java", + "type": "file", + "size": 2097, + "sha256": "a39f9da913c6523723ea3bc1c684aeaaf4a2078a2d2ea3cd6dbb8e66eb9d76ae", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateMetafieldsReferenceWithMetaPayout.java", + "type": "file", + "size": 2055, + "sha256": "d8d3c8cc8af2463cf68c8ed27af691de15d37a19029cdabb85bf38fab86acb9d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateMultipleExercise.java", + "type": "file", + "size": 3167, + "sha256": "e775d0a6e398b38aa2b7908dbc05d0eedc10ec17fa08528deda4a0dd5967de0f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateNonTransferableProduct.java", + "type": "file", + "size": 2211, + "sha256": "153846742e3f02c2223515294b8fce5250e950f9ab57fdaaa252ddebe5eab1ed", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionExerciseStyleEnum.java", + "type": "file", + "size": 1086, + "sha256": "0aa75c482ef45dc9f5e6ccec46351dc43c52f1bc3c28f8e8e6117ffb07c44f13", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionFeature.java", + "type": "file", + "size": 2983, + "sha256": "69dafae4c23ea3361e4194f8e3cba8ffb7b253a3a1ff76c2ee04d809a8357940", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionPayout.java", + "type": "file", + "size": 5467, + "sha256": "6447f64f5ffe8e0b7b3a42f82c602009481de794e82410d51a0199bd02b3d58e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionStrike.java", + "type": "file", + "size": 2609, + "sha256": "704b2722698df1c2e7051d155ddfd7adec1308c315459674e7cf01c7a92d80da", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionTypeEnum.java", + "type": "file", + "size": 1050, + "sha256": "feda2d53b9d061798849c534f7711baaf40d96e6b20d7ad7a0a2048668f3edb0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionalEarlyTermination.java", + "type": "file", + "size": 4250, + "sha256": "177dbfa1b97c181b680b7b1234ac6346bd0691dd9e79a849ca6bc706dd29cce8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateOptionalEarlyTerminationAdjustedDates.java", + "type": "file", + "size": 1626, + "sha256": "7e93120024af04ddc1e2ac5acd1281816da89214dd888a723e5c3f1f02b94cb8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplatePartialExercise.java", + "type": "file", + "size": 2494, + "sha256": "2052440ef9c0da8f61c8bdf787c3d5518bd6ceac2ef0c384a40909a49cecfb5f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplatePassThrough.java", + "type": "file", + "size": 1436, + "sha256": "60b1bc2402965a9a19a6e00694b9f027c40a5b88e0ff66e9f58b174a58f8ef0a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplatePassThroughItem.java", + "type": "file", + "size": 1729, + "sha256": "f6bf6121b7c2ba62c83ff471c1ae5d329775c8bf48222dc1ea1eb3f890554e34", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplatePayout.java", + "type": "file", + "size": 4625, + "sha256": "a224a5c9aab5f5cc44ee31432dadab03205ad8a7f597ffcf60fbda5ea93d0138", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplatePerformancePayout.java", + "type": "file", + "size": 6581, + "sha256": "0daec47ee9b95be5f82a0f7e442f6242672ea7239eae536fb27a519dd7eafc54", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplatePortfolioReturnTerms.java", + "type": "file", + "size": 5752, + "sha256": "b2d69e8c68fec69be6a3c6adec7673b28c19548393945890d49be09a40d66895", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateProduct.java", + "type": "file", + "size": 2096, + "sha256": "edcfa9b65ef93ed4ca1b03d64950d91a033ebf31ede2d6aa35779de07d3e9cfd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateQuanto.java", + "type": "file", + "size": 2000, + "sha256": "6be801a77f01e5927b54d8285ca82e7ce06107914489bfe9a847c72103c6c507", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateRepoDurationEnum.java", + "type": "file", + "size": 1058, + "sha256": "3ca3abfdadd5f9a9e6e2776b19f9f8afdad419e3e58a63ccdd6833a18bb7c21a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateReturnTerms.java", + "type": "file", + "size": 2998, + "sha256": "a2eac2e3c75945ab5a3ea2ce40dd1494ace915615889292084a855cf52239f2e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateSchedulePeriod.java", + "type": "file", + "size": 2361, + "sha256": "b8ecaffb19cd23d493ed0308c43d6cffa19fdd6fc73d70e682c60d21bf3c7a3c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateSettlementPayout.java", + "type": "file", + "size": 3815, + "sha256": "6bb26c16e714609f0b46ec8099069caf6e983f6b19213d84b51fd76e3e894a91", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateStrategyFeature.java", + "type": "file", + "size": 1736, + "sha256": "604a9f5bb178c8fda0fc5a83af76d2db8c78bdb092bac0fac93942a3d44d6b4c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateStrike.java", + "type": "file", + "size": 1861, + "sha256": "eea73b17dbe61af4f2cff1e2ccd731ac891228fa4880c9ba5bc4db84fd67f804", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateStrikeSchedule.java", + "type": "file", + "size": 2038, + "sha256": "70516ad36c114505458ed4cc28716cf4e665a537527625eceb1c933cbe73276c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateStrikeSpread.java", + "type": "file", + "size": 1717, + "sha256": "14467198ab729339179772c5a7701a0a8708a14c68b289f1fbbd5256d925336c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateTerminationProvision.java", + "type": "file", + "size": 2748, + "sha256": "cf900ebfce58a275fa9d0c304454f34d3b9e66e93c15ba67c60d0d04c1d5c2e4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateTradableProduct.java", + "type": "file", + "size": 2795, + "sha256": "8c374b0606a015a3b1a9888c207b6dabff1ff3c806e900d45ec3e554b0789580", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateTradeLot.java", + "type": "file", + "size": 1771, + "sha256": "f40b8f93252188a5ef34e0fcd69523b566af9c4cbe88139d4baa7d2bbb9771e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateTransferableProduct.java", + "type": "file", + "size": 3109, + "sha256": "d4be32c24bcc6f8c2327de4671455a5f12c090791bb7502ce106d7fb7051f837", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmProductTemplateUnderlier.java", + "type": "file", + "size": 1901, + "sha256": "9b4cf50bd3f2a2c895a0f4868e10f153a9d5375fde8fbc1a64a0cfa3bd688b4a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationAcctOwnr.java", + "type": "file", + "size": 1208, + "sha256": "c54a0fc073ddf411c4bed25e6757cf9cdd7171c0c21e618c2553247acfa4eb3c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationAddtlAttrbts.java", + "type": "file", + "size": 1529, + "sha256": "c35061470861c6f148eb0f200c503e06b89cf89dfce78e59653895a1c4a7e786", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationBuyr.java", + "type": "file", + "size": 1248, + "sha256": "ba09bd25b35ce999363f50217b5fbf6b08abdb3d04b4623a2281d0125580f109", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationDerivInstrmAttrbts.java", + "type": "file", + "size": 2048, + "sha256": "48ecae2d714ce5bafbbd71734beb17cd40ed93046d21d99fb446527d65e66b23", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationDocument.java", + "type": "file", + "size": 1368, + "sha256": "eff41801ee7b98b32cae67fe16b785c3683ab6ff6102ffb6f6a92b9088d4a024", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationExctgPrsn.java", + "type": "file", + "size": 1233, + "sha256": "23bfb6a15f575fb229d85a4a9fc5ff3d845f9af56115790d78186db0515b8f3a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationFinInstrm.java", + "type": "file", + "size": 1233, + "sha256": "93fad543a6d2979cd7c9d04181b24e78c1cc8dfdf09f3e1e4dd1f216b7556c80", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationFinInstrmGnlAttrbts.java", + "type": "file", + "size": 1731, + "sha256": "d90fc2e053de5258a2aaf3e266500f9fd6c869cc33ffa7e8158cce8617479d2f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationFinInstrmRptgTxRpt.java", + "type": "file", + "size": 1258, + "sha256": "894a7c9dfdab19d4281bb832aae591db39422764c81dc08514490b5a9af61979", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationId.java", + "type": "file", + "size": 1158, + "sha256": "2777641dfadb30a48ee2782b99180e8170d87c050d5d8236b771ecbf791ff76d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationIndx.java", + "type": "file", + "size": 1188, + "sha256": "decda2fbeb2ddc7f899e9dc0e281ff685042e7ef2a55f516a182d0d7c6ed219b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationInvstmtDcsnPrsn.java", + "type": "file", + "size": 1263, + "sha256": "ce20e41425cf4baf5d59b839ec1303609ef2e75bdf3eabe42c8f2464f69afeeb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationNew.java", + "type": "file", + "size": 3977, + "sha256": "e0fa9b39aac85f289a8531b1aaefef32c77e6860e6c5cf6b149539d650c81091", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationNm.java", + "type": "file", + "size": 1446, + "sha256": "413af49aeb1e510759abe6672ebd90161f30f6a8812ea4980fff89f8cfd4608e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationOrdrTrnsmssn.java", + "type": "file", + "size": 1264, + "sha256": "8909a326af2f5ce1350ec654efc76d2ea4d5da19fbd6c65a713adb7113d1ca9a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationOthr.java", + "type": "file", + "size": 2141, + "sha256": "b91d2193c8217f5abd000dc8b8a9c67742047087450d8b3316b0ed9f5e26daca", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationPric.java", + "type": "file", + "size": 1420, + "sha256": "f58a8142cca6fea5db6408347fb4145fca69ad8a76c4a160854c8367c4b32c17", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationPrsn.java", + "type": "file", + "size": 1444, + "sha256": "7926f77f6719a906eda70dc92bfb6e97089670475a963bed13b2dfe6a6c9d06f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationQty.java", + "type": "file", + "size": 1170, + "sha256": "12804aeacae29e73e7ff701c57b9409058f3eeb964140285dc9e6e7e96f2f6a0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationRefRate.java", + "type": "file", + "size": 1366, + "sha256": "73592305c42571582aded99c92a16987c79328755124123cc4f76cc24b2cb9ec", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationSchmeNm.java", + "type": "file", + "size": 1197, + "sha256": "6185fc61000b9342a34a36697bfafc3facaf1678666439ad3fb09ce6ebc54ed5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationSellr.java", + "type": "file", + "size": 1253, + "sha256": "f25d196d8a97736914867312428e4c36463ee5c91514fc0514c2e6ab80002602", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationSngl.java", + "type": "file", + "size": 1395, + "sha256": "29787f7e610d2e1d59647813ba04de9e6f6743bb070bda4884c2cd2ed599366c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationSwp.java", + "type": "file", + "size": 1452, + "sha256": "d65a5b8043396d5ac66cd2a912f7a9e9d99696d2b023ed4af478169a539ef778", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationSwpIn.java", + "type": "file", + "size": 1213, + "sha256": "c0e16c821c6b4a06a32b52a8770de00a5a14a5bbc2a1a556da6e391326371e1d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationSwpOut.java", + "type": "file", + "size": 1218, + "sha256": "3cac8b04f0298cac09f6a92b62806ad1a385ec236e8183377e26b9c289f52182", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationTerm.java", + "type": "file", + "size": 1355, + "sha256": "95925e15dfb9a8518fb48e335941e62bac69a743f7b250d07d23996feec5704a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationTx.java", + "type": "file", + "size": 2491, + "sha256": "8b45b66f3a2fc4dd38d9c634db835795a4f5714b1f1b0b18c5d69310868590bf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/CdmRegulationUndrlygInstrm.java", + "type": "file", + "size": 1241, + "sha256": "b1775c297de266b33a40c2892c6f29255c4c66fafc1178283e4980d93824c20a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/ComRosettaModelFieldWithMetaString.java", + "type": "file", + "size": 1546, + "sha256": "be337c8f31c7b65a7b0b291b76a0901d17a64cf2070e6a5d8e8286f7243c8cd6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/ComRosettaModelLibMetaKey.java", + "type": "file", + "size": 1416, + "sha256": "604e2139b3e04446eb29f01a4ac70067688274b348d90bc3f14ca7fb5bf8cacc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/ComRosettaModelLibMetaReference.java", + "type": "file", + "size": 1452, + "sha256": "52a13d18a06f0c6661e356d514831315e1499c3f3c9278dc5e4739b0e9d5d37a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/ComRosettaModelMetafieldsMetaFields.java", + "type": "file", + "size": 2073, + "sha256": "23e9c85844c32035ba897db5bbcbef66f1c600afeef1dfe60c250a86b06cba42", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/finoscdm60d07/ComRosettaModelMetafieldsReferenceWithMetaString.java", + "type": "file", + "size": 2034, + "sha256": "b4ed7363e371d3da70149f890069a5f28f6545b689f647f865e07db2e72e3c57", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/DocumentResponderMandate.java", + "type": "file", + "size": 1331, + "sha256": "f2c9246ddeaa92c009fc7e8eabbeeec35da21a08a339b30350f3760544aa3767", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/Mandate.java", + "type": "file", + "size": 3059, + "sha256": "6ffe2ef72c9ab1ac254e01fc78e91aa88033b0ee2c1a7f641a170885376aa4c9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/MandateActivated.java", + "type": "file", + "size": 1001, + "sha256": "93fdbff340e0281c2c058851d9e6e0ebd707443620e2d3686b98f462b8e716d3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/MandateAuthority.java", + "type": "file", + "size": 1538, + "sha256": "224411c76d09cb779036902204ec03bfb13afb689b77e7a31e99944e6a3eeb36", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/MandateAuthorityConfirmed.java", + "type": "file", + "size": 1324, + "sha256": "3d7863ad1d94f1cbd0dd56ce7b1ebed7ca421484b5b1a54efeb0ca6cccc866c7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/MandateTerminated.java", + "type": "file", + "size": 1206, + "sha256": "ee9ea41ba70270bc4ecd166fb390b5b103aa6d8715ca5ea2047c9693cc6989bd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/MandateValidation.java", + "type": "file", + "size": 1361, + "sha256": "e702afce130e7a3e5bb449afcceaf39cdecaa462cd1036d5516a29d2d06320a2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/OperationMandate.java", + "type": "file", + "size": 1156, + "sha256": "9724117ad9fd30a56ad68cb1812c1d59cea609263462a70c94c535acaa3583be", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/StatusActive.java", + "type": "file", + "size": 1001, + "sha256": "cda91d5980f23e5bf62f4055536580159e0591caae32ff49c84d66964a025db3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/StatusAuthorityConfirmed.java", + "type": "file", + "size": 1053, + "sha256": "5382910bc8ba2afd8751a84fa68cf1a55c72926dcc1f905849c70ac8fdf9a1b3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/mandate/StatusTerminated.java", + "type": "file", + "size": 1017, + "sha256": "7543f030dea2ce800c24e2c8c18a47e67c0dbfcefbe34f27aee6b20643c1341e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/AddingParticipantRequested.java", + "type": "file", + "size": 1564, + "sha256": "3ff29bbe2bb11869f25689e23c58f5d382ff2c9e00f0257b1f8f38789d7782ad", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/AddingParticipantResponded.java", + "type": "file", + "size": 1518, + "sha256": "d5893d343f43acc0358b0e29eb0fdac8581a5ead7c2d3a6f57fa4fc92f167a64", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/Agent.java", + "type": "file", + "size": 888, + "sha256": "4baf320d4539fc48c1999fbd409598bce05b9af1a7a2ace7f9064549723c5140", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/AllParticipantsReady.java", + "type": "file", + "size": 1003, + "sha256": "14f61d3b81a5d4318bbf7a44f017c642585216ac965967fe467aa5fcec49087e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/BootstrapFailed.java", + "type": "file", + "size": 1180, + "sha256": "5bb8813f092aff2597465286bbde3ca51336135fbc6791c5791811da31f23f26", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/CallOperationAccepted.java", + "type": "file", + "size": 1505, + "sha256": "6b56bfceeac4cdcd2bc954f3e19f727418df451ae2b7fdb42acf27b7c3c618d8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/CallOperationFailed.java", + "type": "file", + "size": 1698, + "sha256": "6471a2d508ea8b1b4e8fe0674bdcb62a1ef3c667f31b5b960f873c9b849dc201", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/CallOperationRequested.java", + "type": "file", + "size": 1952, + "sha256": "bf62ff350af8105b1d642191a88fb98391ffb954b073fc5ad9f90e04a86e2ebe", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/CallOperationResponded.java", + "type": "file", + "size": 1270, + "sha256": "3c6d68bc8603ef8b25a20bad6ee72d4cb160349ceee6c0a11ad0c68994505802", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/DocumentInitialSnapshotRequested.java", + "type": "file", + "size": 1336, + "sha256": "1af8d40f76cadb2dbe60521fd71bb174be0605c324b35f9d21b4c60cefa84220", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/DocumentInitialSnapshotResolved.java", + "type": "file", + "size": 1278, + "sha256": "e3b6e591d3678b69a2ba1d19ada247d4ddf41f84ecaedc4d668235de65dd44d3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/DocumentInitialSnapshotUnresolved.java", + "type": "file", + "size": 1280, + "sha256": "d52c513f239fecf0a73e901e02fd1419a7776f046fe6d572354895f0f2fbc2b3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/DocumentSessionBootstrap.java", + "type": "file", + "size": 3645, + "sha256": "91fcfa562825ca76cd124267582a6b693c16dd0666bfc2a58c992265a1839bb8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/LLMAgent.java", + "type": "file", + "size": 916, + "sha256": "a330053a24c96307d8903751ab79e119fac3cedf02c5593799717cb0a98ff5af", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSAdminActor.java", + "type": "file", + "size": 949, + "sha256": "ca962b4477db42424f0805f279d4c064598d16dc907c3d9e9d384d1ab71e5364", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSAdminBase.java", + "type": "file", + "size": 1136, + "sha256": "4b9fb62840fbca039585de53f177d41ea0bdb38efe0156b8a2f4e087a44eb8c8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSAgent.java", + "type": "file", + "size": 1106, + "sha256": "6aaed434ed1e7f9df81fd46c91914a16157e245c275e20f9114d9b9b53555ef0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSAgentActor.java", + "type": "file", + "size": 1208, + "sha256": "6602590fde1ae579e840e78e2bc2afed1159d9561ae43e6c11d859381e5f980c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSAgentChannel.java", + "type": "file", + "size": 1325, + "sha256": "a5f14a3b237641d985f0510aa27d7b3c5216b685351a0b5c53e5ad0fb155fee7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSAgentEvent.java", + "type": "file", + "size": 1748, + "sha256": "60a8dd1bae5447dfbef97554e79b702af828c83fb64072e57d73c48b45f2fdc7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSBalanceAccount.java", + "type": "file", + "size": 1139, + "sha256": "51bf8d9426c8e70bfe8da5ab89aa12efa1632783aff3483ececc6dfdf49ff3ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSDocumentBootstrapMandate.java", + "type": "file", + "size": 1070, + "sha256": "6398c6a35f324df9bf525fd5ffacda3bb80a257266e9200b53fde0d2ed9c7ed3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSDocumentOperationMandate.java", + "type": "file", + "size": 1391, + "sha256": "ed333329fd7fc48d11152a89d93aea267f48b090de32847a5f0f8c21595c3974", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSDocumentSessionReference.java", + "type": "file", + "size": 1459, + "sha256": "ab07fdb3b893dafd03f28032e00f178bec753db0fb40af370df334344e6ca800", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSOperationCallRequested.java", + "type": "file", + "size": 1448, + "sha256": "d95d316f2cd68b620e720bbdeec9d9d8a4272c3cfecc7dbfed80391479b36ac7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSParticipantsOrchestration.java", + "type": "file", + "size": 988, + "sha256": "461c642cf92e4639342258ff55e27ac97134161d6ffa08898fab81c6bb11024d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionInteraction.java", + "type": "file", + "size": 960, + "sha256": "0a50f1ebfc49762a39d8880ec4b2008ad63cba3f6559f3860778197873518568", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionSubscriptionEnded.java", + "type": "file", + "size": 1834, + "sha256": "7c10ac82a15f3c1920a05166417ef37a1fe90243f73aa5e745a812ce94b72c21", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionSubscriptionFilter.java", + "type": "file", + "size": 1466, + "sha256": "7864ca01283069729e006b2f268da0512d3ea97e16fd143425f3f4eb77c5b5d3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionSubscriptionMandate.java", + "type": "file", + "size": 1995, + "sha256": "0d1fe3a605197240fd513dbe972876e025d5e4da11d4a6b95250bb4fa6329815", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionSubscriptionRequested.java", + "type": "file", + "size": 1971, + "sha256": "3991eaeb6409aa34339e29cabc60619c9ee47b31469842f473915829675520ef", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionSubscriptionStarted.java", + "type": "file", + "size": 1032, + "sha256": "bb626e154dd46baa89f3dfcd194d8fc28375514a78609e605af46dcf616fc6d4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSSessionSubscriptionUpdate.java", + "type": "file", + "size": 2097, + "sha256": "4a9354c796e6cf64e0de6b076b8584e9174c8b5415edcde070d2b610cf45ac72", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSTimeline.java", + "type": "file", + "size": 975, + "sha256": "a3fd680ca79f38e1e8769e7815699e6ec4491ed5a3f0d648f06c1f5eec7c6131", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSTimelineChannel.java", + "type": "file", + "size": 1439, + "sha256": "bbfc679ffcbd676c63661365e6f1b940b5c22734e9cb37f3acf310e6ff418c14", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/MyOSUser.java", + "type": "file", + "size": 1115, + "sha256": "d0d43b9d58feecc30c4b99731bce7dc73f61a31f6f2d8eea982d23694c580ce5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/Participant.java", + "type": "file", + "size": 1794, + "sha256": "e1d743376f850eaa48677cf7e8f13a90327ea00331d6b429be15e24d23ad4bb7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/ParticipantActivated.java", + "type": "file", + "size": 1443, + "sha256": "35ffd18493ed4d20b5ee9cfec039d8fc1e54f8a9d3e516543c8984a1762728cf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/ParticipantActivationState.java", + "type": "file", + "size": 1487, + "sha256": "12e2ac214a000fe752a1958697a20d78d67fbec0c9e663827a7f137623af7c04", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/ParticipantResolved.java", + "type": "file", + "size": 1488, + "sha256": "f6234e910373fec7fae91ea3f0eab1631f9fb7c5124002428a4e7f3eee3a6444", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentInitiated.java", + "type": "file", + "size": 1573, + "sha256": "81090e1d642f20a71859596ac900f70761df08f4a378ccedf6c62fc316ce6772", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentInitiationAccepted.java", + "type": "file", + "size": 1029, + "sha256": "2b119665fc7e6edb78ac6c47152df0f3823ca3bfeeaace66aa84c965ecd4f3e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentInitiationRejected.java", + "type": "file", + "size": 1433, + "sha256": "31795a0087b72ec61a8af6f5ecd1cea1791c6bbc77c4629172d411d58fac299e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentInitiationRequested.java", + "type": "file", + "size": 2501, + "sha256": "622ee23f5feb2ce17615e27669bfef6ce787b7603372fcfb9c8d91ca1d217883", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentTargetPreparationFailed.java", + "type": "file", + "size": 1465, + "sha256": "f627056d8669ce2124795ab210574c23ab7adb0178b3577c11173b95f503124e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentTargetPreparationRequested.java", + "type": "file", + "size": 2585, + "sha256": "384a076303599e8f9bda1b391be40daa042e4b6be94edc8b3484b8165c08c6a4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PaymentTargetPrepared.java", + "type": "file", + "size": 2727, + "sha256": "d00553ca04a15034ddef50a93d7f14f793632d19b964493c7f462b8ab0b9ded1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/PrincipalActor.java", + "type": "file", + "size": 1191, + "sha256": "6b1944a03315455c8e4f70a3885b0815e31f023dcdfc251b897e1b704370d7ed", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/RemovingParticipantRequested.java", + "type": "file", + "size": 1286, + "sha256": "d58f249321aef810544b4e265913e0c7e3239bc42de54de12acde57d4305f737", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/RemovingParticipantResponded.java", + "type": "file", + "size": 1538, + "sha256": "241aa491526080a972b3fa32af24210abdff6a8e3da2a776b88095fcfc42bd19", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SearchContract.java", + "type": "file", + "size": 1585, + "sha256": "6d661dad34d8c672501ddc463c0d55a8474a48dd242f64b2e92964922dfc6f96", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SessionEpochAdvanced.java", + "type": "file", + "size": 1903, + "sha256": "7edbf19856c8fcf6f39e2910650fe3ebb5e8fcc8add1191f1eac4898ff81ef56", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SubscribeToSessionRequested.java", + "type": "file", + "size": 1558, + "sha256": "5a58e522fdaa80fbdf12b273ee029ffc310fbd80f73415880e2848cf8da9a48b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SubscriptionToSessionFailed.java", + "type": "file", + "size": 1791, + "sha256": "4391856a74c6abe11a97e6b1f6cef1a6f424afce49b1f7c9845173a637b6063c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SubscriptionToSessionInitiated.java", + "type": "file", + "size": 2254, + "sha256": "8af56afb6fcb6ed3949c098779a577e3886bd637edca05aea0af6b32e62f51b2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SubscriptionToSessionRevoked.java", + "type": "file", + "size": 1798, + "sha256": "3ad28b965e2bad2c03a86fac99fd391a3d04c0c731a4bf3033ba78c4f8a86cfd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/SubscriptionUpdate.java", + "type": "file", + "size": 1712, + "sha256": "0b8fa1cede4721513a5239a2867886d4b47db95cea80483d5386ca168d66056c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/myos/TargetDocumentSessionStarted.java", + "type": "file", + "size": 1601, + "sha256": "95be41ba0d2e6d2924a00507e098010f462dead0915502abf6409cf7d5832cd9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CancelBeforeCompletionRequested.java", + "type": "file", + "size": 1280, + "sha256": "3d83c32542ea0a0e2193d4927e155a263a6c602a78348dc75f7dc8a84123efeb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CaptureDeclined.java", + "type": "file", + "size": 1196, + "sha256": "9d1f7f18cd322c46fafa1d0ae6b30126bfe68c17e98d28d8535e11a64c092bcc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CaptureFailed.java", + "type": "file", + "size": 1188, + "sha256": "5f1d877b41d3c38dc39bf9e0869aa4ec9f4c68173a54cea60d0c7ce976962856", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CaptureFundsRequested.java", + "type": "file", + "size": 1269, + "sha256": "1d640bf90682043ff23a552e29f2d14954fe8c58c25090430fa0e7b8beedb147", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardChargeCompleted.java", + "type": "file", + "size": 1878, + "sha256": "a65fe6093a5a451bb407dad811bbc25a9da47f466b86e27292196d9d87c5af2c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardChargeResponded.java", + "type": "file", + "size": 1752, + "sha256": "26563bc40130d46e9f2bbd9b7bfda879a509ad050b0d1ffd9d9170b09c428cf2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionCaptureLockChangeFailed.java", + "type": "file", + "size": 1321, + "sha256": "5bc9e83d142600d1df0249e25293c5cdf8f7ecf9503884e95fa2dad87c9f70bd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionCaptureLockRequested.java", + "type": "file", + "size": 1462, + "sha256": "44def626a18e78380ceb85744d08cb67692d440956b9bf9fecffe041e5121032", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionCaptureLocked.java", + "type": "file", + "size": 1325, + "sha256": "bc26ebd36cd8071477b7d025c591e76e29ab56e486c30124ec9bda6b6b0a277e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionCaptureUnlockRequested.java", + "type": "file", + "size": 1472, + "sha256": "3802c1f757cbeeb1af0ff797a78dafdec16d2b20c235aefb0ffe34711b2e1df3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionCaptureUnlocked.java", + "type": "file", + "size": 1349, + "sha256": "215223b402d5a5e54923fd10fd707513af7652e723ae61e051d44b1d576e49cf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionDetails.java", + "type": "file", + "size": 2209, + "sha256": "1e0e11e9bbc128c4af5e95ccee4877e07d3fd22e6150d6542ca332c5d564750b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionMonitoringRequestRejected.java", + "type": "file", + "size": 2181, + "sha256": "0bfb32bf1588febe5040892f2578be2d8b780a2174c4506640d162f93bb1f05b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionMonitoringStarted.java", + "type": "file", + "size": 2471, + "sha256": "c1147729da7785cf372627d821c0382800dd2b5e0a649882667bf69b8a121cf7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionMonitoringStopped.java", + "type": "file", + "size": 2102, + "sha256": "17ea89d277113166f28e858b9b4b03ef4a9725d1da01f15ee5a4a91568fa62b4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionPayNote.java", + "type": "file", + "size": 1354, + "sha256": "f108fe208668bc744a487b8fa82df462bbb03d56cf224a63c10aca60b74fa933", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CardTransactionReport.java", + "type": "file", + "size": 2893, + "sha256": "94b30e77fc1fe0235a8e419bc28fdd5187ba4961a031d8a92f68cdafbf66551a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ChildPayNoteIssuanceDeclined.java", + "type": "file", + "size": 1267, + "sha256": "30febf880a43efb265e0336d84273bc36e72ee3b467b1b4674d623f981848837", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ChildPayNoteIssued.java", + "type": "file", + "size": 1251, + "sha256": "d79a03218d4d7b15276a08facddaa681f4d222911bb384de3dcaa24a2e7c2b7f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/CompletePaymentRequested.java", + "type": "file", + "size": 1284, + "sha256": "a4eee062deca9da136269998cc0a414e1442d2a3993f0e61f24c8b3d30dff571", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FinalAmountResolutionRejected.java", + "type": "file", + "size": 1272, + "sha256": "d9a9a5932f61716e9887001334ee0de353f93dcf8a8a103841a35f0aaf09a295", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FinalAmountResolutionRequested.java", + "type": "file", + "size": 1565, + "sha256": "47bc526b3eef495893ebf64f4bd0b209e86cbb2666440a045753558edc3abc36", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FinalAmountResolved.java", + "type": "file", + "size": 1296, + "sha256": "8f1dee2471f16965febb1fe8f0e514ad81418ba90dcb3d867d80c991d016adf1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FundsCaptured.java", + "type": "file", + "size": 1285, + "sha256": "658806dce7cd346ae00c48b3d73a66c29546a207d9696f4acd8999e052732d0d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FundsReserved.java", + "type": "file", + "size": 1285, + "sha256": "6a2c5d894181e3f84f5cc640cfb42d93e601890703b96833526a6e3f366dd3b0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FundsSecured.java", + "type": "file", + "size": 1273, + "sha256": "deafc79d4084d9598cb8e4ebef5284c28a3989d69a7ad143cbd7f0e0f92894fe", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FundsSecuringDeclined.java", + "type": "file", + "size": 1230, + "sha256": "669f7cd67f1bf1320d2fbdce90a882f032e1f562b282fd7ed0b1eec18e573b96", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/FundsSecuringFailed.java", + "type": "file", + "size": 1220, + "sha256": "cd0ea49e0858f8fd096a89fbddb9a3a1dd37cf9b72ca56aad2feab3aa05e3860", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/IssueChildPayNoteRequested.java", + "type": "file", + "size": 1291, + "sha256": "904239bd511fd5f3e8c15f87ad3352569c1371ef838c5da447f33693ab34c801", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/LinkedCardChargeAndCaptureImmediatelyRequested.java", + "type": "file", + "size": 1989, + "sha256": "391c194ee4fa79041715a32db3a0b8e5faae00ab01a23766b37b7137f67c8678", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/LinkedCardChargeRequested.java", + "type": "file", + "size": 1836, + "sha256": "6eff1cf948e4771608545b102a8553d9deaa30711652ef5e732d84dfb94f41e5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/LinkedPayNoteStartFailed.java", + "type": "file", + "size": 1247, + "sha256": "94ee70a0439a1eec8c2579d7861c2170389f4c6e475fec39bd42afbdcb6442f7", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/LinkedPayNoteStartResponded.java", + "type": "file", + "size": 1473, + "sha256": "55b2a43f61bfe02934cf6512ee130621d7e15a82329a2a0646155506942d0cd9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/LinkedPayNoteStarted.java", + "type": "file", + "size": 1576, + "sha256": "1cc9d5e5fc39889ac32c541b87f1958d337f164c863b4cedd621571c2a854ddc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/MerchantToCustomerPayNote.java", + "type": "file", + "size": 1002, + "sha256": "a243a7d22d4f5ea4d39b9e6a6eee4159d36b033ccda540ffdcd1eccdb54a0d00", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNote.java", + "type": "file", + "size": 2733, + "sha256": "9c10904ead76bd1939482bd2810e27ac81fc20d888d429d1ca0ef46d6fdfb56f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteAcceptanceRequested.java", + "type": "file", + "size": 1043, + "sha256": "301842e5f61a8f6eb0395e8633baea3be3848641f9cf5de14c3ddc44faddd9ff", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteAccepted.java", + "type": "file", + "size": 999, + "sha256": "9804a8bbaa7156ff26f25bb555737da0705e4b3b17bab9c135d4e864026e711d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteAcceptedByClient.java", + "type": "file", + "size": 1308, + "sha256": "21bc44b36b1ac1bc14b5148aa888bddd4abba89ddaee9ac94a81c318f00a26fb", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteApproved.java", + "type": "file", + "size": 999, + "sha256": "9591b2c97ccaa0d92db34a50986426af842d2a429df6e3fb6e741878f507cf6f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteCancellationRejected.java", + "type": "file", + "size": 1260, + "sha256": "aa0e9c622add8888a560aa4c6ad3e9e3db6f2fb88e172058e5a755202d03550c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteCancellationRequested.java", + "type": "file", + "size": 1299, + "sha256": "d22260757f4f400130986d948a04db891a7849474df7546e580d41b1a3dbdc14", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteCancelled.java", + "type": "file", + "size": 1003, + "sha256": "44a4756cbd3237dbd379803712a997103018588bdffb17bef50cf6dcbb79fed8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteClientDecisionDiscarded.java", + "type": "file", + "size": 1785, + "sha256": "f39a35127a57ecad5f9e0edfca1d5a50f7538280f9e45223fe8e102946aa722e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteDelivery.java", + "type": "file", + "size": 4210, + "sha256": "c697ea6ec10093b9e3c1beaaddc3edd1ba3f568ce3f4ce1be9be90609acbe700", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteDeliveryFailed.java", + "type": "file", + "size": 1224, + "sha256": "aa5135f40c8ce685e090141d9cff492d3a700a0b2aab2a2921a42c3066803a17", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteRejected.java", + "type": "file", + "size": 1196, + "sha256": "05a5b5d2dcc8fc1c173d046d39e99103b581a22501a812c470d13f005b5c441e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayNoteRejectedByClient.java", + "type": "file", + "size": 1515, + "sha256": "ecd81e18ee2c98829462f814951d0c240ea2787ee3aa9e65663c01bc4067f818", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayeeAssignmentConfirmed.java", + "type": "file", + "size": 1259, + "sha256": "7fa5fb50120ce30508bbd1705268231997d5e042dd13340ae4bd6ab1d8636d6c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayeeAssignmentRejected.java", + "type": "file", + "size": 1240, + "sha256": "6fbc23509c210635aae9e40863f7c34e4410a9a4187caad8b357223248d4aa1a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PayeeAssignmentRequested.java", + "type": "file", + "size": 1271, + "sha256": "0a337ce60cc4a21607bd53498b2a494e0c11bdc194bafda34704f0f520a932c1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCancellationDeclined.java", + "type": "file", + "size": 1260, + "sha256": "92503afce3603e17deffd3bd48d4ada3130c37f41a9400bed7078586ba372fab", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCancellationFailed.java", + "type": "file", + "size": 1250, + "sha256": "a088efa554132530091e9cf1c861a62e28bf18cd48e589c0c887e0d86aebb9d4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCancelledBeforeCompletion.java", + "type": "file", + "size": 1071, + "sha256": "5cdafe0ff6489f21f16b9951a0297d05ee1b1a18872df471b67ac620353ed1e3", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompleted.java", + "type": "file", + "size": 1307, + "sha256": "aa616968847e835e6a829b0f7ce4a18c48cde41320ade868aea2f20decce1fa8", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionDeclined.java", + "type": "file", + "size": 1248, + "sha256": "0c97d8d2ddf1d2125633436f905017882f641f208384a4d688dfe8a43574c64c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionFailed.java", + "type": "file", + "size": 1240, + "sha256": "b6a8b9f8a9d4da34f7e80745c780d482b5b7ff95fec7b2e973c1f875e16a3c07", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionLockChangeFailed.java", + "type": "file", + "size": 1294, + "sha256": "56407503eae07fd079fd7a1634db4e7ec2a25ffcc6515791784694e15a452686", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionLockRequested.java", + "type": "file", + "size": 1275, + "sha256": "a042992c55775018df157e555186338fe72f7b1d2193a6fd24ee84423ba40c02", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionLocked.java", + "type": "file", + "size": 1296, + "sha256": "3abe7a89ea33f2c9807429778f5e2573041457fd23c3d036947c104f4f111a37", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionUnlockRequested.java", + "type": "file", + "size": 1285, + "sha256": "674e094010a1da96ef7b975d2397e1835d4c45f631ebc046df933a08ae342e42", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentCompletionUnlocked.java", + "type": "file", + "size": 1322, + "sha256": "062a7dffe7f4ffe5f4aa8fa6a27b906f4648e63d22c912bee9af5caf31e1a7fa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandate.java", + "type": "file", + "size": 5105, + "sha256": "0f4c12ede5e3f1564df79b95eedc2829ca9b573e586473273fda9056d60d800f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandateAttached.java", + "type": "file", + "size": 1355, + "sha256": "d9fe389df0e81d8852f07012b9e4e3c729c0ee71b23f043b45007c275e7a962f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandateAttachmentFailed.java", + "type": "file", + "size": 1271, + "sha256": "df254c1af6b0ef9441a90119f00ec4a6f54f9e814fe436cec0140de74179854f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandateSpendAuthorizationRequested.java", + "type": "file", + "size": 3494, + "sha256": "c069bdaa165a0b4ba5d79c1d5aafca0b56d4bf3095e812cf4a37dc8c8b2b7736", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandateSpendAuthorizationResponded.java", + "type": "file", + "size": 2515, + "sha256": "e4d36689ffe5621dae439685de23e8acffc7e493553160a31c8196ffd6571e58", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandateSpendSettled.java", + "type": "file", + "size": 3377, + "sha256": "38027d553b0913c88cd57e8bcf630d4c4c7e0e180c3828f9441c33b9feef4bfa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentMandateSpendSettlementResponded.java", + "type": "file", + "size": 3000, + "sha256": "02f01ab8a026e916e068f82b9801d8a932828069ffb9b1bfd7016a7252b316f0", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalDeclined.java", + "type": "file", + "size": 1240, + "sha256": "ab41336b4031219acc5b1d4369dec0bb01fc05e230b57c86f2ebfae703eadf3b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalFailed.java", + "type": "file", + "size": 1230, + "sha256": "da4ccc31608b4334bcefed14729a937f08ad11d80c593f0301334b0554d74db5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalLockChangeFailed.java", + "type": "file", + "size": 1284, + "sha256": "209c8a512678666a30b252e35d1f0defb377bf3dc70e4973e317a6ba28c4ca29", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalLockRequested.java", + "type": "file", + "size": 1265, + "sha256": "49e729701d14a2de48cd75ad8ad2e192f99f04aa9fb095593ef8d5040e25c537", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalLocked.java", + "type": "file", + "size": 1288, + "sha256": "0cd91dfc4f7b68827fbbe3b9f56f284238b09ed4b5983749d6178c5f8e6489ea", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalUnlockRequested.java", + "type": "file", + "size": 1275, + "sha256": "572f1cc55f92eb0ea8c251ec5108a2f01b82e5f79320eed22d02f2f95216dd1e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversalUnlocked.java", + "type": "file", + "size": 1312, + "sha256": "d579ca47ca601ea6a27dae9ad6398a4de78acf983615c59dfc9485dde0d67434", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/PaymentReversedAfterCompletion.java", + "type": "file", + "size": 1374, + "sha256": "215983b16a3a5f7f3c276ff1dbb9e58fb72833340ff9debd44e4cf0965d11919", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReservationDeclined.java", + "type": "file", + "size": 1218, + "sha256": "d8c86b76576ebb6dd1fd668752c35be659ec9c742262728174f7972c2b6b84ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReservationReleaseDeclined.java", + "type": "file", + "size": 1255, + "sha256": "ca9a359ea62cdd66d7b0c18a06eb92d9a027bcac58048189de200b4cd9c78262", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReservationReleaseRequested.java", + "type": "file", + "size": 1299, + "sha256": "2ddc0eb70b7b4bac67721f3342c542ab15301204041ccbfc933c19dc3cde6201", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReservationReleased.java", + "type": "file", + "size": 1315, + "sha256": "01dbc1ce9c95af1a9e9ea910980646271d7c5f1cf7e1c0a81464437a18de8935", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReserveFundsAndCaptureImmediatelyRequested.java", + "type": "file", + "size": 1380, + "sha256": "332554387da3ccde80bf0eeccdbfa5d9d05ee36f58a449d791ff728f4f51d37c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReserveFundsRequested.java", + "type": "file", + "size": 1269, + "sha256": "ab344d64aa558b4f5307868034aa30b268253b3c5962a2689e0401552a6f2c3c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReverseAfterCompletionRequested.java", + "type": "file", + "size": 1536, + "sha256": "e7ec80c51eaab62d18cd75dde2f22baca3aed1d2b0686d7d36c3be09a3d6f26d", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReverseCardChargeAndCaptureImmediatelyRequested.java", + "type": "file", + "size": 1996, + "sha256": "f860e9f2d6ac4101e6cdaf06bc04c48304c733841d9e5535560398a015c98fcc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/ReverseCardChargeRequested.java", + "type": "file", + "size": 1843, + "sha256": "6c9faa9f5624325ad1dd293a39a590407345e7ad9571b26e954796c8d1a4d436", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/SecureFundsRequested.java", + "type": "file", + "size": 1264, + "sha256": "c1b32b593ba6f60684b8661420bd75f2409b2942953fc461a9bf62c35a7e53cc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/SettlementAmountRejected.java", + "type": "file", + "size": 1243, + "sha256": "2ebd477d4a40764bb6a1ffb554cc4a6c789a289c71910e2bcfa680eb5406c64b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/SettlementAmountSpecified.java", + "type": "file", + "size": 1326, + "sha256": "5cc68451e3e5fd6a09ec093718390059bd6e46516c52429d099644533f6b18c6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/StartCardTransactionMonitoringRequested.java", + "type": "file", + "size": 1955, + "sha256": "0e56535bc8840f546b50f45ed2610d7bb744b5e6547aa1c684aaaf9376984cce", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateFailed.java", + "type": "file", + "size": 1277, + "sha256": "d4f037044d281b332df311f1870cc21a8d5059a164c6f16c39f082a6f610cc92", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateLockChangeFailed.java", + "type": "file", + "size": 1331, + "sha256": "0b4f4e3b70c9fbb3abb20e8bbfb4a0e036d449f570647e3521ab502e874be0ce", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateLockRequested.java", + "type": "file", + "size": 1312, + "sha256": "4459aecc9d0cff5909b69ddf04bb02a095a730e858991769f0849fd998773d0b", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateLocked.java", + "type": "file", + "size": 1335, + "sha256": "d8077fc9b02dfe2c2e538a954a26b073c32d1219c204b53b30cac5d8422ba388", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateRejected.java", + "type": "file", + "size": 1287, + "sha256": "d9c19afa533078eddc5c46cb6b7b711c0f6267564552134af88d6d947ae491d5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateRequested.java", + "type": "file", + "size": 1368, + "sha256": "42b0daf8cd488c8d1822943218580aabc74da15d3dd345b008b16848b1949c3e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateUnlockRequested.java", + "type": "file", + "size": 1322, + "sha256": "5a507221a2c4e4ab02d2b93541d3f398517a7ae0008f66e822746835386850e9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdateUnlocked.java", + "type": "file", + "size": 1359, + "sha256": "88dc2a311f078ce35b707dfeee3318eb5ada1da9fc342c2fa9ae52bf5fbdd727", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionDetailsUpdated.java", + "type": "file", + "size": 1328, + "sha256": "64221d922646145ff10767426a365e085c18d88d68325a1f30b3684e268d24d2", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionIdentificationFailed.java", + "type": "file", + "size": 1274, + "sha256": "65690440d5c13f2d493c00e44dcb7aa86737531ca949b86b5bf124a3172c0eef", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionIdentified.java", + "type": "file", + "size": 1017, + "sha256": "7459968d9e6733caa6810e11729572837aad8c648abfdd97d80b68fe2dd78cb6", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionInitiated.java", + "type": "file", + "size": 2093, + "sha256": "be6b71eefcf9ddfb87bf8387c04c8ce94681d09ecaaf5b5179e604f69ed59d86", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionInitiationFailed.java", + "type": "file", + "size": 1260, + "sha256": "502a7bd60aaec2e8f0fac4fdfd13969a13a5d9d5e9441874af71ff4201ffea98", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/paynote/TransactionStatus.java", + "type": "file", + "size": 2057, + "sha256": "ce2513fd924eae2e135d3dec3ea18307a4807b66b4fd54dce5c3aca466f28797", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/provider/CompositeNodeProvider.java", + "type": "file", + "size": 964, + "sha256": "2a1de179617b733b743e6ceb90c7ecb381f642963fd5c273f4ed60d05a3d0039", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/provider/RepositoryNodeProvider.java", + "type": "file", + "size": 11871, + "sha256": "b16a604eceb94ec88c55c0a04f7f83c03e166060a8433e6ca6fd0ba6e0ecf70f", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/sessioninteraction/DocumentSessionReference.java", + "type": "file", + "size": 1754, + "sha256": "20e434abce0f232268be071c4d16b3106d5afb5c94301f94360d22af05464de9", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/BootstrapTypes.java", + "type": "file", + "size": 1272, + "sha256": "29fee16ca80e7c4ba46abe10874c0cba7d53117885adac4459d973f497fed9ab", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/CommonTypes.java", + "type": "file", + "size": 1716, + "sha256": "770fcb76e81de2b28f665ff89ba9d5315b09eaff134bca6ae4f007f17e956163", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/CoordinationTypes.java", + "type": "file", + "size": 7381, + "sha256": "bd175b32e9cea1521a2677939b32b1b8a50e44a64d8ebd237e1bbb356af5cbd1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/FINOSCDM60d07Types.java", + "type": "file", + "size": 183057, + "sha256": "de5bd5f42893d1df5ab21441182a13156635b51e6cb4585ee3ad66cc2f400028", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/MandateTypes.java", + "type": "file", + "size": 1694, + "sha256": "f36f50457eaa85e0e2cff361a10deee253d512722cf1abf188b1e4779a55ed91", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/MyOSTypes.java", + "type": "file", + "size": 9117, + "sha256": "64ab54182f52ed18657be332f0a3beff78cb28c36785e9b142d29016ebaf305a", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/PayNoteTypes.java", + "type": "file", + "size": 17735, + "sha256": "f1e79d5f821a1c1b7299a4b3b3606819b00f579bbaeaab3c106ee1278f1c15f1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/SessionInteractionTypes.java", + "type": "file", + "size": 328, + "sha256": "bfa8b23720c937f44bcf64a1ffd3f08abc05586e0b86d169c4f27fe3fa1c27bf", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/types/WorkflowsTypes.java", + "type": "file", + "size": 2388, + "sha256": "828ee29de442e3979945f5c4c3decb83fa90b44d158a05be22c877ac837b4c57", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/AcceptChangeOperation.java", + "type": "file", + "size": 1035, + "sha256": "ffc5514d698d7820a74a8bc0c0ece23ed36ee1165198b5729ef6daf13ca7e0b4", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/AcceptChangeWorkflow.java", + "type": "file", + "size": 1278, + "sha256": "81ffdd7b024e24165c180d650f10448e3496d5c6ed6644b6e812144ccca59174", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ChangeOperation.java", + "type": "file", + "size": 1009, + "sha256": "f3fee35c9d4314d75952f767353c24588618a4f12d3c328c93ba0e1c56bb4e7e", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ChangeRequest.java", + "type": "file", + "size": 1700, + "sha256": "2202b3969ce3f4c2a9f6964670da553f8225fc1d18b25d44e1957015983e43b5", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ChangeWorkflow.java", + "type": "file", + "size": 1041, + "sha256": "04423f4e9a70e7d5628f1494c5be0f1ad49fe10d6c3cad551a40689d35bcacaa", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ContractsChangePolicy.java", + "type": "file", + "size": 1342, + "sha256": "1b6cece4865b7be85b40e0b921dc682ea6be7f5a96ddf7c7806357cfd4545736", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/CustomerConsent.java", + "type": "file", + "size": 2724, + "sha256": "e0444a6b8a99a424d8086ae6d30ed4a85dec09f7486fb8921c85dd024bf4cbcd", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/DocumentSection.java", + "type": "file", + "size": 1977, + "sha256": "d79fef2dd5316c87b3c412022629ebd55d248ebf757368e3c97e6de5dc83a09c", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/DocumentSectionChangeEntry.java", + "type": "file", + "size": 1766, + "sha256": "0cee9997fcc33ea7f046139399aec33ab18eeaeb5a815902f77359e6b3950806", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/DocumentSectionChanges.java", + "type": "file", + "size": 1774, + "sha256": "b225399ce996c8e0d33b8771be53b57ce4355c077780b4cc89fe0f6ef02a70dc", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ProposeChangeOperation.java", + "type": "file", + "size": 1039, + "sha256": "3fbf2ba6b101d7feb2e5f3ecd85b8465f87666d1b76c8d764666b424e396deb1", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ProposeChangeWorkflow.java", + "type": "file", + "size": 1283, + "sha256": "aa54448b61c2607c69420136bfdf1d4abf67489dc0ca80e5a3a74ada5b53eb97", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/ProposedChangeInvalid.java", + "type": "file", + "size": 1232, + "sha256": "c2b71088d894bcf6e7013f3849de28e317cc44b35d920bedc6288d1e385d5359", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/RejectChangeOperation.java", + "type": "file", + "size": 1035, + "sha256": "029bc925741de4ef3d4dceb03b7c9efb74ae6d3b3a8cda716e7016c6bcafc461", + "mode": 420 + }, + { + "path": "src/main/java/blue/repo/workflows/RejectChangeWorkflow.java", + "type": "file", + "size": 1278, + "sha256": "feaf29bd6178dc87e0fc30be1a9687251819f62eb638efe379d0dcacb485fe79", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/BlueRepository.blue", + "type": "file", + "size": 2523637, + "sha256": "727779d6a848f0fe89a96f58b65377262d060f33553689c8c9a95ceb83da80cd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/DocumentBootstrap.json", + "type": "file", + "size": 14492, + "sha256": "9e58e1dd4ddedf52c5b830c8bf8df89cd11718c91739be67cd81aff4e1b9aeb8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/DocumentBootstrapCompleted.json", + "type": "file", + "size": 765, + "sha256": "cde7b16dbf6c57469bb9c6016814530583245dd5d2926fa3dcc6471f659d334b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/DocumentBootstrapDeclined.json", + "type": "file", + "size": 393, + "sha256": "2f5ff6b32bc860fc9e1c3e7d5ddd23403ce3e206307e5f18bb5c045c26d073b8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/DocumentBootstrapFailed.json", + "type": "file", + "size": 451, + "sha256": "ab012d09b3d235b32449791988fe4b96a1b91405522137024f783af44bbc948e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/DocumentBootstrapInProgress.json", + "type": "file", + "size": 223, + "sha256": "069910e926a11099aec47bfcff3892d9be0eaa9e14522466ef333a45f1a58869", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/DocumentBootstrapRequested.json", + "type": "file", + "size": 1377, + "sha256": "aaa62989b6f2aca1c142ebe08c2d258854800e66179a3432f51b82b8f5ad1fac", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Bootstrap/ParticipantMapping.json", + "type": "file", + "size": 912, + "sha256": "3b26a7fbcfa5a27c36d969d36866be9a1a2e264b396359e6121cf3ca57a4ef27", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/CryptoEd25519Verify.json", + "type": "file", + "size": 616, + "sha256": "78b9fbf31624aa94d5cb89e2d80fbdd076e847e974deac967d32633b9be23c85", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Currency.json", + "type": "file", + "size": 164, + "sha256": "db59c683822c4914b3047f341b36ced4304fa6677f400d931e10cf2ebb10d664", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Document.json", + "type": "file", + "size": 402, + "sha256": "bb2a28b0407c61b753c7f86786b8ae1c2481575b4fdeb5b4e85be49cb10163fd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/NamedEvent.json", + "type": "file", + "size": 311, + "sha256": "e1721a1d6512014970dae8f3f69930cddf0e69b5089e8cf8862c7673f59688a1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Payment.json", + "type": "file", + "size": 318, + "sha256": "8e11aac9e0ee87b036753550d7700b4cc36e0dcb73239dd771aee913188f954a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Profile.json", + "type": "file", + "size": 320, + "sha256": "06426a65670d71020846a3036836a5df13123fe2ffd2f8c02a43f828ddbf0f70", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Record.json", + "type": "file", + "size": 317, + "sha256": "c981baa5067aa837a3739918434b1e7593aa492e5f228ea78c56216f90e1515e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Relationship.json", + "type": "file", + "size": 338, + "sha256": "50828458bf9615cfb88fb5da5c656cffa499a0cdb75d693ce3435851da69697b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Request.json", + "type": "file", + "size": 339, + "sha256": "cc81df3b5288902fddcc256f4d98e8a513520fdc4bfc15344298272f8a020f08", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Response.json", + "type": "file", + "size": 312, + "sha256": "88fa6de8796b317e76af8fa4a4417a94d0bf00d8d67d0f9b308acd4e09bae38f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Service.json", + "type": "file", + "size": 611, + "sha256": "18080397c93559a5908b40177d43658b4d4977b5527dfa8a5896cce89ac14700", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Space.json", + "type": "file", + "size": 532, + "sha256": "87cdb2712629d3208addec74b20d63d3f8f574992d9ff1fe4d056824b28d5e3f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Task.json", + "type": "file", + "size": 303, + "sha256": "0c2bc2c4fa1359f277d766cd1f64fda1a058e5c4db59d70541ff6265d7aa51ef", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Common/Timestamp.json", + "type": "file", + "size": 260, + "sha256": "d79f95e85104b31a8f02c68fcdda5f878cf67bc44c77f017b0ee8d137aefc141", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/APICall.json", + "type": "file", + "size": 1716, + "sha256": "a786afeed6bd3029c96f95d6a001d88fdb28a16030882e4802742b1d3d094899", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Actor.json", + "type": "file", + "size": 1782, + "sha256": "60f0fa6f9350187aa60b4dd4633939ddf06dbaa66e550e7a25addfaee3217c4f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/ActorPolicy.json", + "type": "file", + "size": 5479, + "sha256": "fe12d7bcdc38a25d3b14d00f6f5043739be108342db704359ba0d525eaa446cf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/AgentActor.json", + "type": "file", + "size": 2100, + "sha256": "0978dadf38eba333c8449a90e324d4ae685bf6a415c8f5556444a89e8677cbde", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/AllTimelinesChannel.json", + "type": "file", + "size": 1386, + "sha256": "32cff5cb606e5f4cd2ad65f3b114916ad991f36d9f16b090d48bb69537221a82", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Authority.json", + "type": "file", + "size": 197, + "sha256": "0e56189a1c4585f58b3b2aaa8a30a4991985c8a09aa0c4ada6b4d383a4238e44", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/BrowserSession.json", + "type": "file", + "size": 1673, + "sha256": "8cb78b3699cbc9045d8fddcc427bed00b18930a96701b9e45fd23f85ac20872a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/ChatMessage.json", + "type": "file", + "size": 917, + "sha256": "c8e8f8fd9098b9a5739eaba1e16ef577d3180e1977b73a2189e3f62b4178fc0c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/ChatWorkflowOperation.json", + "type": "file", + "size": 2006, + "sha256": "6cb0ab960ea5a4eb256605167213d3796add24aea66e07eef916ed0ca5b0bf7b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/CompositeTimelineChannel.json", + "type": "file", + "size": 1819, + "sha256": "43a6a31bfd9a8e6e45c705b24de0b3c8b97165dbea957dd6b1df34aeca317032", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Compute.json", + "type": "file", + "size": 7879, + "sha256": "43d2465e6f7ee821cc71820d593c60c46de90fdf0141a0d8d94f2cebd8ef9fc0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/ComputeDefinition.json", + "type": "file", + "size": 1517, + "sha256": "6c243f27bb0e321984ecff6ab8aadbfd4cc16d60be5fdcfb45574c114f58104e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/CustomerActionRequested.json", + "type": "file", + "size": 2454, + "sha256": "1b841e11f4835cbf677e7a5fbdad144689e3070029ef8e3ffdf17e3db4077db0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/CustomerActionResponded.json", + "type": "file", + "size": 1119, + "sha256": "3116876c3929d8228099cdee32814a7d3576e888200afd3a010d11f978dfd0dd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/CustomerConsentRevoked.json", + "type": "file", + "size": 1021, + "sha256": "c9190e8c79ea3254a8b6e45332884ea738d1bfad62da560ee60e615cbcdd0630", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentAnchor.json", + "type": "file", + "size": 606, + "sha256": "4d9adc120011268183f3001b5e5cdb193ea6334ef8cf6660cae076ac4edfc31c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentAnchors.json", + "type": "file", + "size": 565, + "sha256": "5a3e18fefa9225405d92bf35c2ae8f19c2c6fd3733220f8790cd215b28fe05eb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentBootstrapCompleted.json", + "type": "file", + "size": 604, + "sha256": "2406149e76a1da9a27e7997418982dd7702b6dd63266e7032be518b94dd7a9d7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentBootstrapFailed.json", + "type": "file", + "size": 501, + "sha256": "2961048e60033b924cd7aa93e74d6ba815f874a34c82e1241ecae364b83afa8c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentBootstrapResponded.json", + "type": "file", + "size": 763, + "sha256": "e1112a15765367a854af676aa48371a7fa845b3d5dd7dee12f5b506beaabaebd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentLink.json", + "type": "file", + "size": 1023, + "sha256": "e0afc6f58a15c1e333130886c1fecbd005b65615dba664f58ec17a6dc0007663", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentLinks.json", + "type": "file", + "size": 586, + "sha256": "de5289776f56f725c7bd0dc9287ddd3d09c66ada8dffcacf81975622fe2eed0d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentRequest.json", + "type": "file", + "size": 1240, + "sha256": "25bd20d5049840687bcb1e572cb991c180e08bc77ae54cab274581641eb834f3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/DocumentStatus.json", + "type": "file", + "size": 835, + "sha256": "8328828f342e25fbd1aa722564ff29ea664132850a254a8acaca6ea264346ec3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Event.json", + "type": "file", + "size": 821, + "sha256": "cda3ed2a0811a5b0118a2d43fa72a08961236e132e37fc865c67aae152f0937d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/InformUserAboutPendingAction.json", + "type": "file", + "size": 1440, + "sha256": "17d2994cc1d3811489707e0dd3e0f23b03d8d35ad538a84e0bca1969ab49be45", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/LifecycleEvent.json", + "type": "file", + "size": 685, + "sha256": "05be655f6c65debaa0c5425500d1409e262afdc2ba2814152697f01208cedd28", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Message.json", + "type": "file", + "size": 1854, + "sha256": "4b4e72d5618bf42d1196d4ddac4ccee474bfab56aa37a57a10f55dd3beaa2868", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Operation.json", + "type": "file", + "size": 1438, + "sha256": "0dcfc9cf53f7f6737674fa72aace6cd3663d854f46464302694edcce8e544725", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/OperationRequest.json", + "type": "file", + "size": 1495, + "sha256": "89763f1fe5ca58d0b4125e8d0e28a3a86fb40abc4bdc80508a701dd745a92d37", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/ParticipantPurpose.json", + "type": "file", + "size": 798, + "sha256": "a3dee6c4048ab4005db24c2750cd08272905af00263209568d5ad515d372f59a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/PrincipalActor.json", + "type": "file", + "size": 1258, + "sha256": "cc82155c906066d2c5f29f1155ce9e93d9d2e05cd709ce8a29d8cb2bfe295201", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/PurposeStatement.json", + "type": "file", + "size": 1173, + "sha256": "485377ebd18dc0b264fc989aea73b19381638f90bf185199f93b0365e4b1ecfd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Request.json", + "type": "file", + "size": 566, + "sha256": "0cce14ed226fa5719c471cd5317101ba1236e888292caa85b9ade956f920e19b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Response.json", + "type": "file", + "size": 700, + "sha256": "b1e46d15d9fd8827f98d2ffd279981e1535168e55d92918e81aea885c5ac4b3b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/SequentialWorkflow.json", + "type": "file", + "size": 1989, + "sha256": "0819b73465d39fcf337afb3c73c26f762caf6a4142025f9a79ee418f454c0804", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/SequentialWorkflowOperation.json", + "type": "file", + "size": 2088, + "sha256": "f1a5d7e51f8266814a0f18063758f7961e26221633609a02350ae6ac27408a09", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/SequentialWorkflowStep.json", + "type": "file", + "size": 784, + "sha256": "bd0c8b54865071cb3de8e5e7a4289806150922147ec8ee08317ddd971b383bf1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Source.json", + "type": "file", + "size": 1416, + "sha256": "5ca873188a42cbab58a773b9e4b7764ede3117bb7d57630dcbef4d76314741da", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Status.json", + "type": "file", + "size": 255, + "sha256": "ae8218d6a02bf23b4e1b5c6103510748de57e4c035eb1c4f36faf927b18dda70", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/StatusChange.json", + "type": "file", + "size": 783, + "sha256": "7b301f97a83c221293c6f260d46ee4d0bc61c3767e8275cf7c9d5650ffe1f578", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/StatusCompleted.json", + "type": "file", + "size": 477, + "sha256": "c99169595adb541b38066b08804cf59ead930bd2d7b5f2e4d37af671b277a859", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/StatusDeclined.json", + "type": "file", + "size": 335, + "sha256": "6fe49db00ff20f90a0ff12dbb6561fb25d195c4a3098749ba1c3a24199fe21bd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/StatusFailed.json", + "type": "file", + "size": 460, + "sha256": "f79a8f4ea9a0a9d9422d2fb64097d2ba6f0b97d722dcd9da458996965f4a004b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/StatusInProgress.json", + "type": "file", + "size": 422, + "sha256": "942f484ffb89c8d41efa0658ead4a3307f3d56fba9fcb38245b2f765bbc50abe", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/StatusPending.json", + "type": "file", + "size": 409, + "sha256": "e38d80e102b4bc941059c1afc9bbfb8f31f6ce219460475364b83048acac8024", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/TerminateProcessing.json", + "type": "file", + "size": 1077, + "sha256": "728b183d12d545d8453a5a0e23251c41e5b021426dc11a28e4a0c6de217b5dd3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/Timeline.json", + "type": "file", + "size": 3135, + "sha256": "788eb623854e929cbd0fc8cae477485b8b88b6b152d4a084aec7f27f05ddf0e5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/TimelineChannel.json", + "type": "file", + "size": 1022, + "sha256": "cbb7b9cb2052023d51bc93befad390f4c72663a4292bbbd9396f8508b18a4923", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/TimelineEntry.json", + "type": "file", + "size": 2715, + "sha256": "26cd1b4f660198b1ce6774c94479014cc466b7728f7066b93acd4e50402c3c43", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/TriggerEvent.json", + "type": "file", + "size": 1102, + "sha256": "481e2d1bcdc77ead9258cd1ba10162e620e1be75bf8ec11bb10fbc686b03a271", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Coordination/UpdateDocument.json", + "type": "file", + "size": 1996, + "sha256": "fae942075409d80c20a99343f2bda4a5df43a62b67190a050aea166959f6de33", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableDate.json", + "type": "file", + "size": 1472, + "sha256": "c9ad5eb7681fe3cc4e7aa3d71537b0c4bcb187fdb419eb4528dd29670b4e38a5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableDates.json", + "type": "file", + "size": 1303, + "sha256": "a8f5b52ebeaf862878976a2faef0a9b179b260f34e1b741e7cf40857e0b2469c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableOrAdjustedDate.json", + "type": "file", + "size": 1033, + "sha256": "b5ede98db784f4979b6fc74d0ea4aaeadeec66e49cc8a15964516ac8db13bd48", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableOrAdjustedOrRelativeDate.json", + "type": "file", + "size": 1266, + "sha256": "344295b722c306b9067d775cbd3b0bac2549eae6664493b339bee2f1dddfaa1e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableOrRelativeDate.json", + "type": "file", + "size": 757, + "sha256": "eba7185e5f272910d6ad2f574a87fcee5f4dbc6f91c2109791b540acfc684df4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableOrRelativeDates.json", + "type": "file", + "size": 827, + "sha256": "e0ddb236360b389d8c12db1d0f65229d4c154304690d0f95eb52df3076ff2d1c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustableRelativeOrPeriodicDates.json", + "type": "file", + "size": 1034, + "sha256": "b07614e25bd8f03ac3f367ca1ea94bc24061e1f62f935257b0463a8f2552e9f2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAdjustedRelativeDateOffset.json", + "type": "file", + "size": 3153, + "sha256": "c1772138573779b3661e3d2fb2836283d3f736d2813478f7441d6cdd39adef98", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeAveragingSchedule.json", + "type": "file", + "size": 864, + "sha256": "0f0a3ab96879afe612d2cb234532c70624b5372d190e2c8c977611a7de919cca", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeBusinessCenterEnum.json", + "type": "file", + "size": 29045, + "sha256": "888eb1e4a14f6c4dc529c6d6c89bc767b829f6c72406bb464b730e9cf1220dc4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeBusinessCenterTime.json", + "type": "file", + "size": 831, + "sha256": "1f6aa8318f18a0c000d954455cbc804001a6fab8177811d4e89764ddc29c68d8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeBusinessCenters.json", + "type": "file", + "size": 1449, + "sha256": "4e89d1cff4f500e88f6ac28dc2ae8e36b432da5f7be531e6783b2ec91915dc7c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeBusinessDateRange.json", + "type": "file", + "size": 1420, + "sha256": "21d8aaa2613c75ddb7f879270e48f0e33350f385a90810eed2082272ae2bc958", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeBusinessDayAdjustments.json", + "type": "file", + "size": 837, + "sha256": "4e65f4ed529825d267ac60ef5e4373d4ea326fece2ee83d023f899b8e80ea4c5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeBusinessDayConventionEnum.json", + "type": "file", + "size": 1481, + "sha256": "2ed9265a8fd16e3a19aa26c841e129007534f740d67208f7dfb8f2099a34342d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeCalculationFrequency.json", + "type": "file", + "size": 1900, + "sha256": "a7e46ef13b3a784d68fae48a56fd289d7ef9317b35e2ba3adad8ace07d78366b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeCalculationPeriodFrequency.json", + "type": "file", + "size": 1966, + "sha256": "9a548b69f6405a4fc7c420e7708946551fced0ef12ca3dbcdc4db381dc4e692c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeCommodityBusinessCalendarEnum.json", + "type": "file", + "size": 17207, + "sha256": "91d8a3eb302b3f1cbb2f9a842fa88d34a1101caba673ebfbc72c9ef630118819", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeCompoundingTypeEnum.json", + "type": "file", + "size": 682, + "sha256": "e610cda6fec6644d54edd5675656b6bf9c753d07ed9f2ccc7ceb9218ffd08aac", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeCustomisableOffset.json", + "type": "file", + "size": 411, + "sha256": "1142f7ee668ed02e98f4cf7c502e1be3dd10ca80f4010920c356ac51d5d5fe43", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeDateList.json", + "type": "file", + "size": 309, + "sha256": "a941e95ba777f855378c71ab847b4bedcfe749f50fe18d2879c45d4445d61178", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeDateRange.json", + "type": "file", + "size": 674, + "sha256": "26f68a0a4fccb8d5fa74c5fc7a5227806ad3030927fa3ca2e433453b636faf33", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeDateTimeList.json", + "type": "file", + "size": 471, + "sha256": "b32f52d49aa893dc18486270df62976f4ac4d0f8e6612a6791ecca92096d1d6d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeDayOfWeekEnum.json", + "type": "file", + "size": 1198, + "sha256": "506f873f4f8997b2c9ecb33511798e1a99d347ce6fafdea97e2c205600657473", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeDayTypeEnum.json", + "type": "file", + "size": 1038, + "sha256": "282cd060ced6fbdf4350357b122f4484d9ca13a61ae9b6d775f111cbb0428f7a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeFieldWithMetaBusinessCenterEnum.json", + "type": "file", + "size": 265, + "sha256": "01e5e5cff55311408ccb12098412458ad36f044299c75e5138a8e824eb7bd76f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeFieldWithMetaCommodityBusinessCalendarEnum.json", + "type": "file", + "size": 276, + "sha256": "f9c3c7fa0560bfae6d1c420f4241103868d118917edc1fbd11670620eed75cd1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeFieldWithMetaTimeZone.json", + "type": "file", + "size": 255, + "sha256": "428e93343f0010827a9b80f34d300f11070d0942a06810956249386c6f756e09", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeFrequency.json", + "type": "file", + "size": 798, + "sha256": "03233b984d1c7cd274d77039c49b6b89a03eb22ab8bbfebfd1fabcaf8994f6d6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeOffset.json", + "type": "file", + "size": 1453, + "sha256": "61291773cba0b39cd623afba7f09634121393f99f3717768f5d9d1b327765d68", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriod.json", + "type": "file", + "size": 757, + "sha256": "301cc2f304d9d90bc1bfe58ab30cfc1112e854ba3f5d954149761d887282532a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriodBound.json", + "type": "file", + "size": 731, + "sha256": "f980d937c13ced7c53cd62f1fa1de59a99f122fb1f990411e4b5ef353beabc83", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriodEnum.json", + "type": "file", + "size": 778, + "sha256": "7155ec7f387a724b4366cdad08dd0cf16c8efa0feeeb9df304efe716f770edee", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriodExtendedEnum.json", + "type": "file", + "size": 1215, + "sha256": "5897128c2a7f192f7e8913326ddf47265394523fece02747f36bb79c439ced51", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriodRange.json", + "type": "file", + "size": 555, + "sha256": "ffb2ea7255687c4ea56b472b5182567fda8188558ec363151dff8344122a6b8a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriodTimeEnum.json", + "type": "file", + "size": 691, + "sha256": "973f175be38da0ee3f6abd39b26b286ebcbd6a5f3960af74fbeb8dfb88eabbac", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimePeriodicDates.json", + "type": "file", + "size": 1944, + "sha256": "3cca825633b758f3710d9c34bfb17a42c7b8ede840f605f03ab6ed0613f809d0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeRelativeDateOffset.json", + "type": "file", + "size": 4063, + "sha256": "f1cab0ac3124fc0166a5484dbf277a2ca8b2b5133a950b53101fc4fe026e988d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeRelativeDates.json", + "type": "file", + "size": 3367, + "sha256": "e83be1a587c63299bd8d6e5ddc1c72f96948e0875b3fcaa8388a1684df6071e6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeRollConventionEnum.json", + "type": "file", + "size": 6715, + "sha256": "c057e97630258e3a3173bf2b8cbc514641c549d19a3c4026b2efc5de98edf29e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeRoundingFrequencyEnum.json", + "type": "file", + "size": 504, + "sha256": "b276ca44cbf6bcb7d80b6bdde6d502945e3275a6b184654949e7337635750578", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeTimeUnitEnum.json", + "type": "file", + "size": 1207, + "sha256": "64e43cbcf573018b3ffe4861fbbd09162ca124150626d976f54b95a1a44d563b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimeTimeZone.json", + "type": "file", + "size": 666, + "sha256": "d4bd0314bbe250d0ec8cdf93bf849bae4c987f6513be04d24918b7ee96c9a7b1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimedaycountDayCountFractionEnum.json", + "type": "file", + "size": 2250, + "sha256": "1dc17776d4d1a6a3c62cad5a3e69dba190201b68d6af1a4400faa6bde6f14406", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimedaycountFieldWithMetaDayCountFractionEnum.json", + "type": "file", + "size": 276, + "sha256": "9862683b762f014330241175a150cb0c641012f8165a365ee8170cfc70d7f769", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimemetafieldsReferenceWithMetaAdjustableOrRelativeDate.json", + "type": "file", + "size": 414, + "sha256": "0dc0d50c446e24df72fc439ee6b412e0de64120a3d8bbf3a8ac0a4777f76a426", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimemetafieldsReferenceWithMetaAdjustableOrRelativeDates.json", + "type": "file", + "size": 415, + "sha256": "233f07b186b74c7830b7be19fa7721d89c309909fc93a974962b407fb9587a1d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimemetafieldsReferenceWithMetaBusinessCenters.json", + "type": "file", + "size": 405, + "sha256": "acbe9d6abd3a36b8fc4279ee701df0094251b9997c97320c05f81493d0b98536", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasedatetimemetafieldsReferenceWithMetaBusinessDayAdjustments.json", + "type": "file", + "size": 412, + "sha256": "0bac8fef07f7d9742d9c369d96ef09ea1a171150a6c821cc05c7bf6ff96d3e2f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathArithmeticOperationEnum.json", + "type": "file", + "size": 1075, + "sha256": "353e1f52b7374946cd1faf9128ab5c7268757ad17896f1ba84391591082e810d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathAveragingCalculationMethod.json", + "type": "file", + "size": 668, + "sha256": "7dd70e8e8f5ee2334497ec964f1abb49f26144bf227a49ffe524e14568d32b92", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathAveragingCalculationMethodEnum.json", + "type": "file", + "size": 685, + "sha256": "3b53bf0e0567d09fbe06c459403e2a5bc89e76b5331c6b99613b2d369530098e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathAveragingWeightingMethodEnum.json", + "type": "file", + "size": 663, + "sha256": "4c922ff739a6d3958d0d7ee41d31346b3e1b87868c1d6cff22768a180b8b0bfb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathCapacityUnitEnum.json", + "type": "file", + "size": 9327, + "sha256": "4e164e7e92f6e08f7e32b8a0ec26562800483239d3394bbc31956c5bfb59cf2a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathCompareOp.json", + "type": "file", + "size": 881, + "sha256": "0bb1d184bdfa80db4991b808fe6c19012a491c3c119d4b12d649f948be67820b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathDatedValue.json", + "type": "file", + "size": 816, + "sha256": "a29bd46922f295175ff22c40a28dcf4771a63dd7252bae2ad5353abbb1bb1e8f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathFieldWithMetaNonNegativeQuantitySchedule.json", + "type": "file", + "size": 270, + "sha256": "afd8a2f988b03ef0efaabd4731bedac3a7eb2e509b42ba57edbbff50f0691ec1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathFinancialUnitEnum.json", + "type": "file", + "size": 1458, + "sha256": "d78db5c274cf5d17dd4ad6ddfd42d8d9461a2881132ab0876aedaed8e088e75f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathMeasure.json", + "type": "file", + "size": 802, + "sha256": "1bfc95d85993f5fb28720626cfc66720c0e94ca4eec6b757e8c0d03c85c6d9f0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathMeasureBase.json", + "type": "file", + "size": 817, + "sha256": "87cacde0230326ce3d9b4318261844e683e9bcdfb706a2dd34f7d962a399f818", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathMeasureSchedule.json", + "type": "file", + "size": 1335, + "sha256": "db88a8e893d07f3a1b1b3faafa065f5104d8ad4352783ab15a72f35b858fc59f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathMoneyBound.json", + "type": "file", + "size": 702, + "sha256": "6faf3d4ffb74558523c2ca4874d2a488ebc427214130feedb66a9887a50390a3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathMoneyRange.json", + "type": "file", + "size": 527, + "sha256": "e16f4a0fac458edda32a8be1e678380db8ab8eb4f527d992593579c6ce70118c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathNonNegativeQuantity.json", + "type": "file", + "size": 2151, + "sha256": "5ed85f09d7d437e84087e70072cbd40d808bbbd0fa53a9fdbf26cc4acd2ddc6e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathNonNegativeQuantitySchedule.json", + "type": "file", + "size": 2000, + "sha256": "2efb34d29af0ff282147abc6de8e327552031e793ed5d55e5e11a4871014bf9b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathNonNegativeStep.json", + "type": "file", + "size": 887, + "sha256": "6a7dd88bfaa91421958464507919c8df6d767391877768c5e5aed50834f3df46", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathNumberBound.json", + "type": "file", + "size": 679, + "sha256": "6be2930bee81ac22cd0aada3222361b6e4b52cd821ac40d185c7bb2a1b1120b1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathNumberRange.json", + "type": "file", + "size": 516, + "sha256": "e26b7215e0cf985bb52c6e2be61b6399b42936709b52db90986cf3801bc313a1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathQuantifierEnum.json", + "type": "file", + "size": 547, + "sha256": "83b1bdb33d880995a9474ad4055c5fde610844f93f0f491b113f1d371871721e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathQuantity.json", + "type": "file", + "size": 2232, + "sha256": "bb15026f9820eb1ce31877daf0974baf5b41b2ee247708c4df6fd9e8d8766101", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathQuantityChangeDirectionEnum.json", + "type": "file", + "size": 762, + "sha256": "0e487a2d78945807f18238f4b8f00b2730e3764ea54577de14c2019d3c1c0e6e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathQuantitySchedule.json", + "type": "file", + "size": 2352, + "sha256": "275d710ac6688059c54e732fea4ed7e702a97fd4957e15071f331f87fcd7073e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathRounding.json", + "type": "file", + "size": 714, + "sha256": "0c5d63ec76a36cb7019b748888070495e20992ae7b30bbaf797f6565e61d6fa1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathRoundingDirectionEnum.json", + "type": "file", + "size": 762, + "sha256": "94974f647d587b4abb46f88a098a98f9c440f0bda5a1b24e72d4260e3d1a6da3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathRoundingModeEnum.json", + "type": "file", + "size": 599, + "sha256": "d76fbb8cef06dd107aca1202a68b623dd13e460ac85cfb6f541b36d9b759542a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathSchedule.json", + "type": "file", + "size": 1195, + "sha256": "984355458ba46b5f61da994fc81d10d4bb70c8ba9b073de9eb5b7945bb03b047", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathUnitType.json", + "type": "file", + "size": 1090, + "sha256": "772a44d73cfe4a48646ef874e4560d461a6a48a391e037e9907f4b20c2d458aa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathWeatherUnitEnum.json", + "type": "file", + "size": 708, + "sha256": "80b770074d7bcbb81a66ff9a9b1d02ce8d2381d85a41c79440e1681ed74af1d4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasemathmetafieldsReferenceWithMetaNonNegativeQuantitySchedule.json", + "type": "file", + "size": 413, + "sha256": "458e0bf041a21f791c6cd6897b91a9eb1c539bbe4fafbfc5c347d5d80c08d2bb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAsset.json", + "type": "file", + "size": 1133, + "sha256": "c1bbba434d2398a573118b0286b44650513032df5a43b51ecb378811f80fc9c0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAssetBase.json", + "type": "file", + "size": 1621, + "sha256": "21523a80732c02fb4a5bb407fbdda84bd22e0f64953457a6c7ba860c68864f91", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAssetClassEnum.json", + "type": "file", + "size": 1127, + "sha256": "f7083f8a01adbe10fbb7e567dfccf1e72eb7508762101293d64de585d63236df", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAssetIdTypeEnum.json", + "type": "file", + "size": 2511, + "sha256": "c7ea26beb293e3bfbbc9e62e1cf199f3a3b6330027a2bcd96eb253c9ae5d9db1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAssetIdentifier.json", + "type": "file", + "size": 623, + "sha256": "29c42da835ad5c53f8083f4c2c4db79374876289f28b154a18ddf5a5229a1ed0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAssetType.json", + "type": "file", + "size": 1402, + "sha256": "3b5d84363416abbb1c742eba29db66a1af1b6ea338078fcf3260296c34643ba8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonAssetTypeEnum.json", + "type": "file", + "size": 816, + "sha256": "41b77215ba7b14cf8b593600c19dc2cfbdacb25485d079d4c9afc1d134df5c2e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCash.json", + "type": "file", + "size": 1942, + "sha256": "828e38cecde07ff772e80d6a86638aa5ecb295f1f6410cf8a3ba1ab61d2428c0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCollateralIssuerType.json", + "type": "file", + "size": 1721, + "sha256": "4727bfa50c0336ee9d2f9253a296e060359b2b653c5dbf5ae831e847691e7a1e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCollateralTaxonomy.json", + "type": "file", + "size": 600, + "sha256": "058b71ec1827e63f4a6bfdaf393292eac5f6983fa00a49c3fb6e6cba8201e376", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCollateralTaxonomyValue.json", + "type": "file", + "size": 2578, + "sha256": "73d2d213d2bd74555e01a87d20c300869e3ed3ae0c195c9148e12e324f4f52b8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCommodity.json", + "type": "file", + "size": 2560, + "sha256": "cc512f0b845885377dbeffe9452a4c75abc5c403cc4b7d4761cdda0f6093050e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCommodityInformationPublisherEnum.json", + "type": "file", + "size": 16009, + "sha256": "0edca1ffbf4a59168ed0788c3b72232dfce9a6cb21cb6f884d97d78db187758e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCommodityProductDefinition.json", + "type": "file", + "size": 1319, + "sha256": "186843db5ff8c9f1cd0e25ac93bd42e721d578d5e7548664614883992c9eec8a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCommodityReferenceFramework.json", + "type": "file", + "size": 1299, + "sha256": "8398775d1324dd80470cea7bcbbc8b9a58ea604f764a03a1b58d964600c9bd51", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCreditRiskEnum.json", + "type": "file", + "size": 583, + "sha256": "77a335858b1d1975528bc3a56156bc3ed114d83594bcbfad4ce4c00724afb9a6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonCurrencyCodeEnum.json", + "type": "file", + "size": 26022, + "sha256": "14a7c73567367693a021dbf57123d1cf079099317f21a871380f3cee2a540710", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDebtClassEnum.json", + "type": "file", + "size": 1576, + "sha256": "d471852b4358418a1da85c6bbae830b9e6fdabe5cebff13f4d229ef14c37a1f5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDebtEconomics.json", + "type": "file", + "size": 765, + "sha256": "0149c901430a2c83256671c0b709ee0ef1adaa30b27347fa117f1a01e52a07f8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDebtInterestEnum.json", + "type": "file", + "size": 1456, + "sha256": "b1ad3bf839fb14e1fc2ef05f21fbc2588e9d101c909183ef107433fc795f5629", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDebtPrincipalEnum.json", + "type": "file", + "size": 1444, + "sha256": "284032c47c30d0a180784191cee4c0177c0a35df4a061419e831890370941a1a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDebtSeniorityEnum.json", + "type": "file", + "size": 748, + "sha256": "256646701f5ef8f0b5897fd6cf9a2f9934551a491c67145353c62b0d37885cbc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDebtType.json", + "type": "file", + "size": 615, + "sha256": "204e8dce35ad3c7890d34f12431fd4b225b385233527b0d0fa76755768065a62", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDeliveryDateParameters.json", + "type": "file", + "size": 2143, + "sha256": "c2c10b5be6f6702ea2708a132e312c398c0b624414d3f62f6082bf8cc864f4d0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDeliveryNearbyTypeEnum.json", + "type": "file", + "size": 625, + "sha256": "c169dab75d6bb741beb9b80b7c09e24091edf6e53c2e4b0443b11c4fe44f33e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonDigitalAsset.json", + "type": "file", + "size": 1748, + "sha256": "05fff92f331e630e341cef58c715ce16a9e7e418585cf1cc0c9fdafce8e3af7e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonEUEMIREligibleCollateralEnum.json", + "type": "file", + "size": 3258, + "sha256": "abae53708385815dba3af1be9c11b446372a267dbe5b2e926cec0151bf3d1778", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonEquityTypeEnum.json", + "type": "file", + "size": 561, + "sha256": "1231dacbff8a22ae5b412dbbb9dd771c7b747989e0bab93efa539bcb5877bc6c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonFieldWithMetaAssetClassEnum.json", + "type": "file", + "size": 276, + "sha256": "49b417a64e455b0757ef0f341cc15b948fa20d82e15d012f454c807af9dc57e8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonFundProductTypeEnum.json", + "type": "file", + "size": 855, + "sha256": "2f4a7fe07252a684529b7a941edf754c0797b784230539092d53ae2f50ca4716", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonISOCountryCodeEnum.json", + "type": "file", + "size": 34100, + "sha256": "d32821d9c44d4333366e1c678d8fe55a12a86b4917da7bf8387615cc7f3ff7f5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonISOCurrencyCodeEnum.json", + "type": "file", + "size": 24823, + "sha256": "aec7a03b6487a0341a3a31982fe811a557946254dbb9e8dba3c51f123e4271c0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonInstrument.json", + "type": "file", + "size": 732, + "sha256": "8e82fce5c491609fb06831d400a54dc60cf50d3551f9792ee60c5b0e27318ae6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonInstrumentBase.json", + "type": "file", + "size": 1864, + "sha256": "c5d4f1579a9cc152862d0b77dc2d4af087a70d56fcac26e03a78875ebcf27d4a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonInstrumentTypeEnum.json", + "type": "file", + "size": 1268, + "sha256": "bf5c4f9a300060aaaad41964d06ed19dfa5491050ae93d7d37da605ef5fa5d57", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonIssuerTypeEnum.json", + "type": "file", + "size": 1312, + "sha256": "5ea1953cf0b1d8f940f760af16923e80180307e3f00d4a223b7531b759a5eece", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonListedDerivative.json", + "type": "file", + "size": 2591, + "sha256": "7f1f41171f8c05e84020cab33f0c982914e7d7549e1cc08ec8f5b6e89a0ab367", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonLoan.json", + "type": "file", + "size": 3570, + "sha256": "00958b2410a7cff415b0a28ab16d34edc5e5a454a076495184f54d0b081dd1dd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonMaturityTypeEnum.json", + "type": "file", + "size": 703, + "sha256": "988ab59a4e8f2a33d0ef2776c8608e366004ab7dd2dcef28d4c67a5103f64127", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonMoneyMarketTypeEnum.json", + "type": "file", + "size": 486, + "sha256": "65d3fe42fed42d87ef44eb12f8db8048e3664cb4946bc907007449a4bc3c5e4c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonPriceSource.json", + "type": "file", + "size": 1328, + "sha256": "9d782f56ebd87ec30a4bb692885c2dcbbbad9e04c97c5b5e40e1da8bfa8a8399", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonProductIdTypeEnum.json", + "type": "file", + "size": 2076, + "sha256": "72707d527da19799a51aaf3a6dab37463156479ba9b22428f9ef6fc4156ba0bc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonProductIdentifier.json", + "type": "file", + "size": 884, + "sha256": "2e7ffaee3f8277a6e4f4f1eb900b47ffa57c31cc245bc8ed704b1b21b6323bc0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonProductTaxonomy.json", + "type": "file", + "size": 1548, + "sha256": "15c6835cc91365fd357838e505eb0b7b31617672a2cdbf775d81ba01607ce9df", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonPutCallEnum.json", + "type": "file", + "size": 543, + "sha256": "506ee1670434457e781684feeda086594dc7a403da398f0c587187df04572f8e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonQuasiGovernmentIssuerType.json", + "type": "file", + "size": 883, + "sha256": "ac4ec6056af0fa7c4d2c995106fce3bb1145396b0de92c6f7494895deadf396c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonRegionalGovernmentIssuerType.json", + "type": "file", + "size": 576, + "sha256": "c93e25b939aa0ecf7afaa394ae45d2a3a2d12b939c5ca0fda0ec2879d646877f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonSecurity.json", + "type": "file", + "size": 2329, + "sha256": "aeefb56aac250617dc1b246420ebcf4bf7e448ea4401ac06619782791b7992a9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonSpecialPurposeVehicleIssuerType.json", + "type": "file", + "size": 381, + "sha256": "ccc902fea52657a12513092440c26be64df6ee81691a8b81977ad165eb7027c8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonSupraNationalIssuerTypeEnum.json", + "type": "file", + "size": 615, + "sha256": "0ada9e402f4bfff82a1909c8b65fecae656d45b47e25882af9c7ec660de295a5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonTaxonomy.json", + "type": "file", + "size": 809, + "sha256": "d8319956bdd0ac61ce42103b93924a8a97da44b6c93ec683768e83974802a997", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonTaxonomyClassification.json", + "type": "file", + "size": 862, + "sha256": "aaffff2d249243377781e0fcfe54703133805bb729b2bc70a5b568e7d7a507f2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonTaxonomySourceEnum.json", + "type": "file", + "size": 1597, + "sha256": "89c2af3c328adb0e409a9fafc66139288789c8430c92079e87b1170310a19dc6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonTaxonomyValue.json", + "type": "file", + "size": 553, + "sha256": "0b74e76a5fa01b94422cc0c6a4498e3c5f26e189539e8dd64e1a705f9acf289f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonUKEMIREligibleCollateralEnum.json", + "type": "file", + "size": 3273, + "sha256": "7a52df8423e7cc692ad6e3c8cf955af8a8a12606827ab1354c14dec72e1ab036", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcommonUSCFTCPREligibleCollateralEnum.json", + "type": "file", + "size": 2494, + "sha256": "83944927ae77af2964494f80c5e92c89f8ccbe9bf73d14d1910cf7597a3f1774", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcreditNotDomesticCurrency.json", + "type": "file", + "size": 867, + "sha256": "ccb9a027fc50c646a74add753d23711cbf9d7eec34e7299a0333337628e78e04", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcreditObligationCategoryEnum.json", + "type": "file", + "size": 1232, + "sha256": "5fc8d7804cc02759b7a1a8279335e19015abc99a064bb27c01888c702d443ec2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcreditObligations.json", + "type": "file", + "size": 7316, + "sha256": "82ab0964222500ba694e4aab1a5006b7b76ef1033dc757e53e7cd6a3c4a7c0f8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetcreditSpecifiedCurrency.json", + "type": "file", + "size": 787, + "sha256": "b5f96abb256baa7bb823cf3212b1e295b1d32382c40507b06ad684458b7f425b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetratesFieldWithMetaFloatingRateIndexEnum.json", + "type": "file", + "size": 281, + "sha256": "11fef6f17552b8c7ef0900171e2e9ceae0a57364f62e2f3cb4014970ba901667", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetratesFieldWithMetaInflationRateIndexEnum.json", + "type": "file", + "size": 283, + "sha256": "4f87f1d17035acdff518cedb60fe19134b1a7651f0f3b57ad2cfb3dc45aad1dd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetratesFloatingRateIndexEnum.json", + "type": "file", + "size": 102904, + "sha256": "e5a64d2fa7947f9949d9d69caa6abb08596f25540ade9fd55d8a5ab22490804b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataassetratesInflationRateIndexEnum.json", + "type": "file", + "size": 10443, + "sha256": "746cbd9669f64c4c40c520853ceef2e9aeaeb20b290444493536bb5c452b1d73", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierAssignedIdentifier.json", + "type": "file", + "size": 861, + "sha256": "43b13f99ac209152066f633cd4aa8be4d8294829bc60a1b4f29ef095a922e951", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierCommodityLocationIdentifierTypeEnum.json", + "type": "file", + "size": 1315, + "sha256": "c02d54e65a82667fb27f49e3d6d109b40275b777afbd5b3d5b8d37bf0eb75d6c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierFieldWithMetaIdentifier.json", + "type": "file", + "size": 270, + "sha256": "6ef8b6ea2deb542bd710b9a702e200101e760caf90f978c2b05ccb6b73dcc1d9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierIdentifiedList.json", + "type": "file", + "size": 1592, + "sha256": "fe34cc0196ded9e93df75fadbbf704d9e7abc5ca617274bc80de115bbeb80600", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierIdentifier.json", + "type": "file", + "size": 1295, + "sha256": "31717b034d43ca6f849d7efb3defc68ffcef0d19298e382e03d7524c14a9f0be", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierLocationIdentifier.json", + "type": "file", + "size": 1408, + "sha256": "ab63b633a43dd492af0007b1ee35824f8b80ee5605744a6c84cdf2cae85ccb8a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdataidentifierTradeIdentifierTypeEnum.json", + "type": "file", + "size": 595, + "sha256": "917b0c2dd05ce85cc09c77b4e266880babd4102537d8a11000838ec9aa9368e7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyAccount.json", + "type": "file", + "size": 1381, + "sha256": "0887592cb4fc4c00770b6ff556004ad60555ce219e56c044be30dd1c4520ce82", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyAccountTypeEnum.json", + "type": "file", + "size": 674, + "sha256": "17639d35701dcb376fdfcb211294d66ff612f8b03c3a6f0bf491056c22d9aa7b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyAddress.json", + "type": "file", + "size": 1358, + "sha256": "dce07948d896acb74af7d0999de2348cf22839166006df035c1b3ff8c2ddc423", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyAncillaryEntity.json", + "type": "file", + "size": 567, + "sha256": "da2c90b3c8e7697c6f4905f09fce0b5b3348d4f22bcc6bd262eb07dcb75e2791", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyAncillaryParty.json", + "type": "file", + "size": 1461, + "sha256": "96d5f6bae812e2ce7b98267052da6975a9e6ee1fa793c043020960f9b6a7c9a2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyAncillaryRoleEnum.json", + "type": "file", + "size": 2553, + "sha256": "8167a1b4b7e2281dc3383dfae091cccd10d3d2fc8541f43df28c33315e7cb73d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyBusinessUnit.json", + "type": "file", + "size": 567, + "sha256": "9ec2873be4abf5502ee43cf7d9a02a5e5a059064112f6ba84e771cb16561fee1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyBuyerSeller.json", + "type": "file", + "size": 2381, + "sha256": "10aef453722b726c7748b75c2f7d25e281466ea437e8364526efe84f167834b4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyContactInformation.json", + "type": "file", + "size": 1392, + "sha256": "e101ffbd15e90d0cc007ae2a5f90e6b9b467afd6da10a85d912e95a5b7a74f1f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyCounterparty.json", + "type": "file", + "size": 1175, + "sha256": "f13dd748d8f1be54566049c4436869f23d1b84c70efe58cefa5fe418e86c906d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyCounterpartyRoleEnum.json", + "type": "file", + "size": 561, + "sha256": "239ec234db0e0f49993942b292cc8d0b42094d5494f0ad410def85ce715d7213", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyEntityTypeEnum.json", + "type": "file", + "size": 1851, + "sha256": "6b1457bb113ba0e43b3772ddf4d09c9b8eff6611550b8b9325d6b358852d6a9b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyFieldWithMetaAccountTypeEnum.json", + "type": "file", + "size": 270, + "sha256": "152803b439609e9f8a8e7d3612fdf0a5280f84e147604e69900b4a856b0fe236", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyFieldWithMetaEntityTypeEnum.json", + "type": "file", + "size": 269, + "sha256": "4931f983c2cb0b4b3555fb4db272bf2d96375f6e34d1b3ffda8c04e58a13a884", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyFieldWithMetaNaturalPersonRoleEnum.json", + "type": "file", + "size": 276, + "sha256": "c78083516bf508956f3df16f612e8e9e41a184a5d262ede889287960ed7eafad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyFieldWithMetaPersonIdentifier.json", + "type": "file", + "size": 271, + "sha256": "28588e7063f23eb64915b20bea9aa6dd0d82a824790b6643090241d8d0176671", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyLegalEntity.json", + "type": "file", + "size": 490, + "sha256": "34cab40b1ddb1e1a29b36bd9f44d5b511f03274a33f2960726b5e17f20f4a7a7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyNaturalPerson.json", + "type": "file", + "size": 2293, + "sha256": "125b541b29527c34de2af06f71707f6d62cf9831379a6dffbf16eacceb62faa9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyNaturalPersonRole.json", + "type": "file", + "size": 733, + "sha256": "ed23f328d8c5f01dfc5fa6ec926ec593975578bc88f99b5d0b1387b17eefdc4e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyNaturalPersonRoleEnum.json", + "type": "file", + "size": 1262, + "sha256": "9807fcab60acd943ba5e1f0d4481e85931e59ad580260429db13e8a04a1e0689", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyParty.json", + "type": "file", + "size": 2539, + "sha256": "a835abf59deb988922f691021b49ec0f835eb668b6df4a6adf2d83e726d9a3be", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPartyContactInformation.json", + "type": "file", + "size": 1868, + "sha256": "d0490df871cb5358885b7ad44068d25a0309ac867617f229887949f2829709fa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPartyIdentifier.json", + "type": "file", + "size": 823, + "sha256": "eab4c428bc8f4db0fe261f38a75f331d90f4c9660ad9a4ca2bdaedb80a270629", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPartyIdentifierTypeEnum.json", + "type": "file", + "size": 675, + "sha256": "cbff9cd45cb58c9f3a4ff32bdf889175b775abf4158b3c7825c1f67967d662ce", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPartyReferencePayerReceiver.json", + "type": "file", + "size": 1155, + "sha256": "bf9d2de7a21ae8208bca53e41ff83a949c8607726051d6ccbe979cbd364f8de5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPartyRole.json", + "type": "file", + "size": 993, + "sha256": "722bc6ddd5d768085eaa19698882834a1ad254443fc729fe8eca718483e362d9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPartyRoleEnum.json", + "type": "file", + "size": 8545, + "sha256": "599e554ff3edfed5eadd7b8442d8ca966bf1e4ea50e1b8050185be9e55a541de", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPayerReceiver.json", + "type": "file", + "size": 817, + "sha256": "c740500dfb2856a64f2c854f8942fcbfa618cec329a4d02aead297b0952f1d53", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPayerReceiverEnum.json", + "type": "file", + "size": 557, + "sha256": "d1fa008a706e3ab3911199ae0871eccc0bc4f8512bf9a612e3b8ddc2be9570cf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPersonIdentifier.json", + "type": "file", + "size": 1018, + "sha256": "532d2ca5c2f8b965de0465df4334efc26c19c46a88b1ca70a788f2b0edc655ed", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyPersonIdentifierTypeEnum.json", + "type": "file", + "size": 1639, + "sha256": "dc13d6d0bf276fced71e1262f7c56eabeb0333d1b64c7fb414c750217dd640a0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyReferenceBank.json", + "type": "file", + "size": 713, + "sha256": "d606f3b8605f512d573e0bde2ade399b97c7f9ef2066d8b13791e249b6da7e59", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyReferenceBanks.json", + "type": "file", + "size": 608, + "sha256": "ba5c06529f4aaec6b178cc0983e6ac2c7c3c2e626618cbb3774d0c73b978dd9d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyRelatedParty.json", + "type": "file", + "size": 796, + "sha256": "3617c7fa0b4c48e48490b9419299fb705239bffb8cf055ff70ba672c0f87798f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyTelephoneNumber.json", + "type": "file", + "size": 590, + "sha256": "237679d78a9db60852704de4a3fe942a2555522424219ecdcb6bdbbd9306c625", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartyTelephoneTypeEnum.json", + "type": "file", + "size": 834, + "sha256": "7519c4114661023a5f80b84febf0cd3a5afc1b967d113b05dfd7c86ad165142b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartymetafieldsReferenceWithMetaAccount.json", + "type": "file", + "size": 405, + "sha256": "201fab2c426cae820426cf776757c21feece20379b152979105d7cd2fda4abf4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartymetafieldsReferenceWithMetaLegalEntity.json", + "type": "file", + "size": 409, + "sha256": "ca6d2fbf01f62715fe7d65248ce52ebfa232f02b4a27acae539e8355a306252c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartymetafieldsReferenceWithMetaNaturalPerson.json", + "type": "file", + "size": 411, + "sha256": "1626e77f2562a5aeb1bff4a705659ba878e6423cd910284b35102e61e047f3f0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmbasestaticdatapartymetafieldsReferenceWithMetaParty.json", + "type": "file", + "size": 403, + "sha256": "c339ade474e9868d813f691ef3b0879ff0ef699422ee42090a681bac72c70bcd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonActionEnum.json", + "type": "file", + "size": 671, + "sha256": "a2ebace90c256497206a82c1195e86a700ae01a0ade0f5965f2a522e62703abf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonAffirmationStatusEnum.json", + "type": "file", + "size": 534, + "sha256": "1cdd69d0ca00ae65c2bfc7847f6d7aab679314b10fd9b1939c59a9a41a3f9450", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonAssetTransferTypeEnum.json", + "type": "file", + "size": 386, + "sha256": "7bc28b7a8c73281592316d73b80e7fa948cc4bd320453ea49e186f8a61c7c8a1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonBillingInstruction.json", + "type": "file", + "size": 1701, + "sha256": "10561dad49128d02e334fe604cfff6f0a1ef066f8b682e07cffcafb9a2a76151", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonBillingRecord.json", + "type": "file", + "size": 1231, + "sha256": "0f14708c1b5bfdd4f2ae6b97b098c34314ecd2f6a1e52d035b494548ff413564", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonBillingRecordInstruction.json", + "type": "file", + "size": 1360, + "sha256": "ea4e351e42f99b33d5365d75f6c5679387d8d3f2e0f089b0a222842d4aaa04fa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonBillingSummary.json", + "type": "file", + "size": 527, + "sha256": "98e69ccd483358bed9c1853446a5e7632537d67584b300c52f58ae4c08ea5eec", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonBillingSummaryInstruction.json", + "type": "file", + "size": 365, + "sha256": "2e28c5eddf5033d78e74108df0f81d935561409f249bab74a32194733e864a15", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonBusinessEvent.json", + "type": "file", + "size": 3277, + "sha256": "b9179cf69c4910933d99e5b6cba8c8a5b2d318f825558901ab3cbf836bc24877", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCalculateTransferInstruction.json", + "type": "file", + "size": 1145, + "sha256": "f069a9c92124b8e060316f253eb0ef63a32c5d216ec92d564df8c5ddb5a185a0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCallTypeEnum.json", + "type": "file", + "size": 766, + "sha256": "f0a58b2a2bb2f17460d59ad8738eae2e542c1d7f30724253172d319d066cd35a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonClearingInstruction.json", + "type": "file", + "size": 1912, + "sha256": "e29ce1bab1629c57f99aee2e8fd5f2c686fcd8bfd9b6787caba265e05745505f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCollateralBalance.json", + "type": "file", + "size": 1301, + "sha256": "498ddced230276573bd0b552d29539e47eca390367b4699b2be99327bf3f22e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCollateralPortfolio.json", + "type": "file", + "size": 1600, + "sha256": "69a960aeac039690910ae922655edd70accc629a61878e8c15b37f07a6ed3ec8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCollateralPosition.json", + "type": "file", + "size": 1432, + "sha256": "c0af96ef386d00317ba8cc2ec52607b2d4d15e71a7a8cb10fc1beaf2837cb340", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCollateralStatusEnum.json", + "type": "file", + "size": 712, + "sha256": "e82e225bff4b3f6445e0b905ea906b6431f9277aa9d84ac16727dbbe8cb15eb3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonConfirmationStatusEnum.json", + "type": "file", + "size": 538, + "sha256": "5484f47965bc27fc50a98054c5718b4c4c2385a4bb07ae63500261f2d687bc4c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonContractDetails.json", + "type": "file", + "size": 977, + "sha256": "63471fe59d1c9186d30fef9c1400b5ea421d2c13327fe6497cdd7fbacc301f4d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonContractFormationInstruction.json", + "type": "file", + "size": 537, + "sha256": "c74bcc52272b94a8cced32c8873bd453f730cadcdeb32f031187908a6cc763ab", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCorporateAction.json", + "type": "file", + "size": 1055, + "sha256": "182ecca3351c76d7b4debbb8005e09c5f7bc4af45248defec06f13b8724c912b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCorporateActionTypeEnum.json", + "type": "file", + "size": 2594, + "sha256": "08507a56e2d26015e3a108aa22e4f1dad267200bd718c4c300b9b6bdce0493a1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCounterpartyPositionBusinessEvent.json", + "type": "file", + "size": 2228, + "sha256": "e389ae786d0dafa99f46f48c978b569f74a2e5bec1f43f9b1710224b61c32457", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCounterpartyPositionState.json", + "type": "file", + "size": 1520, + "sha256": "9fe110d513c7fb2672729ed4d601908954e93a2a7920da7973670fdd1593b4f8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCreditEvent.json", + "type": "file", + "size": 1947, + "sha256": "241565d1d100a146f5de1fab583a5b0b5e2029572c2c81e1f13c510a07492136", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonCreditEventTypeEnum.json", + "type": "file", + "size": 2211, + "sha256": "550647909e257147b3d3dca8db4782b07da805a2ac8072a003c5451afa10a8a3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonEventIntentEnum.json", + "type": "file", + "size": 3654, + "sha256": "1ed47f600650bf54a59dfc355a89a8b7da3f7b31f4894d9758791019affd02b1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonExecutionDetails.json", + "type": "file", + "size": 848, + "sha256": "73556a5649a37cd1a878d2174e8e63130922fec32559b8aa23fa732b26c16557", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonExecutionInstruction.json", + "type": "file", + "size": 3778, + "sha256": "a913c0923d6d90b4fb46eb916b4768fce042bf768fda2f787cdf615ef3743be0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonExecutionTypeEnum.json", + "type": "file", + "size": 716, + "sha256": "f973d57eca28808d52b7b4970144068d0095c7c569ab6a38fb064d22df1fbdb6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonExerciseEvent.json", + "type": "file", + "size": 1697, + "sha256": "37bd4572332681f3c4bf3c5880f25355daf98ad8156fa8fc427720a7d83288fd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonExerciseInstruction.json", + "type": "file", + "size": 1721, + "sha256": "f27249f8a80c3d8a66d976aef5ea85d0820f084e8cb09b7c18329bcbb4be87af", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonExposure.json", + "type": "file", + "size": 1291, + "sha256": "a9a48bd269f5c2ee27291b96624dbf994e260c85f174bffddaaf44e46460fddc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonHaircutIndicatorEnum.json", + "type": "file", + "size": 614, + "sha256": "aba908bc1bfa8408e377c769d177d194fd66bc98908639ab81c49055c3d6ec2c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonIndexTransitionInstruction.json", + "type": "file", + "size": 1767, + "sha256": "385270b1fb54746ec96bed93c1c562e8da42a5a43a68ec13b1a212ad071af0a9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonInstruction.json", + "type": "file", + "size": 573, + "sha256": "225525194cc96212a51fa815a25c3e8284825cf72015d285c5f6075861be6251", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonInstructionFunctionEnum.json", + "type": "file", + "size": 1014, + "sha256": "eea52ed3e05b22c60716ea560a7e2676a87d571733d1304d69458f72d439febf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonLineage.json", + "type": "file", + "size": 2517, + "sha256": "4d901abcd7d104f4232ae27fb380934ffcde581aa3499a6cda26b1847d9e9566", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallActionEnum.json", + "type": "file", + "size": 551, + "sha256": "0e75377afdf939665dc1ea88b25383fc1920f39e34bebc6ddc5886c770f0d19c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallBase.json", + "type": "file", + "size": 4156, + "sha256": "942589857b89cb0179e5a0b3f030ed827dcb048401f1db1fcf1ba8e0fca95ac2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallExposure.json", + "type": "file", + "size": 4659, + "sha256": "a1162e449c3bb734de462a14a6d4238c8f16648105a109ee2c0eadf3b6428b4f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallInstructionType.json", + "type": "file", + "size": 698, + "sha256": "29c476305a51087bed222ee1427ae351089c546a246b081d12b5e5e97e640a34", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallIssuance.json", + "type": "file", + "size": 4750, + "sha256": "1074bc7eb86ff019262851c27ffdbc9b1341a716f84d127612d2c09f1bf7d2c0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallResponse.json", + "type": "file", + "size": 4870, + "sha256": "cc9944624c583f4e3a9dc3f69b812e617c7eb780dd473001fb72914cc02290d7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallResponseAction.json", + "type": "file", + "size": 766, + "sha256": "439049a9422b614fe8be00bc264ecd15e86960f62e9270a15e9dbd05c7e78f93", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonMarginCallResponseTypeEnum.json", + "type": "file", + "size": 707, + "sha256": "5a5b4928bfb9a7630f309fbbe9448e647bef9b6340aa997e70af5b5b0b2b81fe", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonObservationEvent.json", + "type": "file", + "size": 529, + "sha256": "93a81fe9ed5e2610e0a51d6890883eb3885c94fddb1880cc11fa928dfff4fb99", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonObservationInstruction.json", + "type": "file", + "size": 359, + "sha256": "aafe248bab26d861d3142aee968d9ea8e80ca701f2309261992eb051f79eba2a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonPartyChangeInstruction.json", + "type": "file", + "size": 1461, + "sha256": "f35f9223387c158cafdf0bacb22995473b4817c100df11916c4af645bad58ab1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonPerformanceTransferTypeEnum.json", + "type": "file", + "size": 1258, + "sha256": "88683399439a664db3f004cc24980966e14986558a3e71e0d9481c3ca62acbf8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonPositionEventIntentEnum.json", + "type": "file", + "size": 1192, + "sha256": "effd7847c2d78eea3bb85fe58206feb96021143837289c7a6ee4076481c6f2b6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonPositionIdentifier.json", + "type": "file", + "size": 1498, + "sha256": "15fb617c272dcff8e5decda69be1da6d753d3d61030de7668ed0a64c168fe5be", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonPriceTimingEnum.json", + "type": "file", + "size": 455, + "sha256": "d29fe839c795e6592303f3bc04baa7b084b539af80e19f74ed4c96fddc45c8a3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonPrimitiveInstruction.json", + "type": "file", + "size": 2597, + "sha256": "4df9c69e5f22eea519780a2739fe1db82be1104bd0d0081dd0bee1a34bb172c2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonQuantityChangeInstruction.json", + "type": "file", + "size": 1906, + "sha256": "d814a38e7a6b10266d4b894f532876d7a4b3235fbfca14362173527fd8b007a1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonRecordAmountTypeEnum.json", + "type": "file", + "size": 684, + "sha256": "2490dbbb4b9b69495bcf0fda91dd405051ad69a42e6eb5cbed04aef8492f5f28", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonRegIMRoleEnum.json", + "type": "file", + "size": 581, + "sha256": "c413ce6c131d312e2125200052b5f42c50cec2b184bb2f0dcab2c89f044579e4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonRegMarginTypeEnum.json", + "type": "file", + "size": 715, + "sha256": "add38fd85cd1b3e491abb5c4add8c27d6e80207b3c1164336c9d64f3f6e2ecc2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonReset.json", + "type": "file", + "size": 2333, + "sha256": "e162d7f4bf9f4f27b5039d7e4b377d75817f82de175360422ec2fa0f1b7d9404", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonResetInstruction.json", + "type": "file", + "size": 1347, + "sha256": "7e0daf2534bb4208df53f83adb39ce2afc4be5fb503b22ce59fd922cf9707a12", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonReturnInstruction.json", + "type": "file", + "size": 503, + "sha256": "6b10a9c1c2c771c67af176cb12e819d7ea8aee3bf6ab0b3f0da3ee61bf4a7b9b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonScheduledTransfer.json", + "type": "file", + "size": 474, + "sha256": "9057d5d149fb8108a331ec05b3043843f12caf19bc019030d2c2816c938cf6ec", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonSecurityLendingInvoice.json", + "type": "file", + "size": 1679, + "sha256": "939a14139aca46f081d9bf8fac56d0357368b25d7dd85fdaed8ae9ba7ee366f4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonSplitInstruction.json", + "type": "file", + "size": 952, + "sha256": "6a833641be8de81bc20c0b12771fc90981fa28c27d8d6f531e62a6be6bdf57a3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonState.json", + "type": "file", + "size": 801, + "sha256": "8cb2e031ff449736523480ec1189b887ca8da7b115b57a9bdd98ae2b204c2b78", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonStockSplitInstruction.json", + "type": "file", + "size": 1639, + "sha256": "a4aa9d25ae58b4a225668cdd2baf5940b2356cdc3ef97e8e6a5e57faa759f04b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTermsChangeInstruction.json", + "type": "file", + "size": 732, + "sha256": "d0acfac8f281cead21ce188b06ca1fd8235e8b9b8314756703900f61742c6d88", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTrade.json", + "type": "file", + "size": 6099, + "sha256": "947b628810d626f0e502d9efce9bcacec7d640a4bf863ef155cbea517f21c569", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTradeIdentifier.json", + "type": "file", + "size": 1486, + "sha256": "c0adeb6427a312a5c42c819af5401d6f643d1ee25a55549dbf68d51c35fa8dd4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTradePricingReport.json", + "type": "file", + "size": 1059, + "sha256": "1f7eb77c9bbf46acf42946c178d0bbcb7b7c85cea0d93b1dfed63d0f9c8f5dbc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTradeState.json", + "type": "file", + "size": 2461, + "sha256": "f269f60db5544dd9b3b2a607d682253aeba66ee656a2514ad8ade296696da1b9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTransfer.json", + "type": "file", + "size": 2274, + "sha256": "17606ab8a430d9bba5572d6860c10f5b6fc43d9ece734f39244501183839270f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTransferExpression.json", + "type": "file", + "size": 760, + "sha256": "6f260c65bf5722c01300475db236b6a47893919b520f3a22c6356d5d1a387377", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTransferInstruction.json", + "type": "file", + "size": 463, + "sha256": "e6e85d7171f2f153ef736ccfb4b7035a3f2ca51471c5d5777f6135fa7aa21d62", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTransferState.json", + "type": "file", + "size": 816, + "sha256": "09def8a487323da4c891418282a140476f2b72cf358f9f3d0fc14c36c52efbd5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonTransferStatusEnum.json", + "type": "file", + "size": 946, + "sha256": "8a5d68ded91d6ab176dc0905b03ae87ee815540c4ab4ab9ad955394f3ad199bc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonValuation.json", + "type": "file", + "size": 1736, + "sha256": "cb3c1112d89167698bb2429abf9d6e2dc1b37cd2fee0b7aa7e77c43b91011c17", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonValuationInstruction.json", + "type": "file", + "size": 709, + "sha256": "d4291d639162090b8b3f90e9cbb4e92808564c41ee52ec8c28540a4489701259", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonValuationSourceEnum.json", + "type": "file", + "size": 409, + "sha256": "54851dc2edd8f70d58c01a48c909e5468bbec4e79011f5e8eab118559d5b7037", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonValuationTypeEnum.json", + "type": "file", + "size": 549, + "sha256": "7f3b122eae148b4d1ff2c2b45bf425767d9209e5bb5429d57814773d7b36cbbc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonmetafieldsReferenceWithMetaCollateralPortfolio.json", + "type": "file", + "size": 408, + "sha256": "378425730f581f5a1255dd5dc68bc4daa7ae7da268a9a4f6a19100d79a828b5c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonmetafieldsReferenceWithMetaContractDetails.json", + "type": "file", + "size": 404, + "sha256": "c026a9346f4a71fc86314e6c9c25b4735b3365f1aba75e3c528d160a2a1b6b87", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonmetafieldsReferenceWithMetaExecutionDetails.json", + "type": "file", + "size": 405, + "sha256": "45bf255b84a3f91c5538a989de943b66ee6717a12c19eb1c8175b2e5d4e1a2e8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonmetafieldsReferenceWithMetaTrade.json", + "type": "file", + "size": 394, + "sha256": "0b21222b4ecf2f504526cc9ee94ea7b36b69a7b26ec3038d701b2b68ba276d5a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventcommonmetafieldsReferenceWithMetaTradeState.json", + "type": "file", + "size": 399, + "sha256": "da6ef1ba923319be322e75674461563e23712fa96044db3c81f04669b2a24104", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionAggregationParameters.json", + "type": "file", + "size": 2187, + "sha256": "0f44df96e47f7f38c3772cc6733448e2d5192317f33ae8b9a0b69c3b14fbf8d8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionAvailableInventory.json", + "type": "file", + "size": 2393, + "sha256": "dee02387441cd23fc0a547cf99ec794b7e098c1b9748e16b7578089cd5787b60", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionAvailableInventoryRecord.json", + "type": "file", + "size": 2032, + "sha256": "8e02561ebc4d3ce120780ce1065f0ee6ef0d82bc2acc1328cefe0e3e0d954454", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionAvailableInventoryTypeEnum.json", + "type": "file", + "size": 549, + "sha256": "bdfe58caee7a4c926aef7f2f3c70c6138dd762114382f56a23ffea1e0a14f579", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionContractBase.json", + "type": "file", + "size": 730, + "sha256": "a900983f3c43e9afbe7b811eee8b812f9bc02d4bc9f5a9bc61b99d51cc172da6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionCounterpartyPosition.json", + "type": "file", + "size": 2647, + "sha256": "ded00724a92667d442aef185a8e3d913cc489442faf2450582b226509ba811db", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionInventory.json", + "type": "file", + "size": 558, + "sha256": "f4f49b9b87238562da86a739f2f65b7a12f7d4840016f475a1531958c8911bc7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionInventoryRecord.json", + "type": "file", + "size": 611, + "sha256": "15aa622caaab9366efb24f1fdf2dbc2ff7b35f1903961c348c60871b08eaf941", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionPortfolio.json", + "type": "file", + "size": 1175, + "sha256": "e875ea73b29d000bc77ad3c76d5c1ff6ccb0a243c2e6e53cd7fc4386667583e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionPortfolioState.json", + "type": "file", + "size": 965, + "sha256": "836dcd1df6d684d8e2a038dd9c4242086e40ef3263e5866c54dd011be734e5eb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionPosition.json", + "type": "file", + "size": 1072, + "sha256": "18c69d95b42255c4f031c583b46a9c54301a078a30f17fc25a91cd840f92a1d3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionPositionStatusEnum.json", + "type": "file", + "size": 999, + "sha256": "afd267adb290c6d628623b58f35cdc924a0df9e01a44ffe694aebd059e4b7e58", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionSecurityLocate.json", + "type": "file", + "size": 2137, + "sha256": "2c452814bef6eb7a584fc96ec8972f2474fc691b7be0f137b02cebd76ed0ceab", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventpositionmetafieldsReferenceWithMetaPortfolioState.json", + "type": "file", + "size": 405, + "sha256": "b75e063d029bdd9da4dd33d470be41c3d6a2ea435ab38312ebbedf7456efe400", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowCreditLimitInformation.json", + "type": "file", + "size": 383, + "sha256": "f084c965558980c9aa9f380d12abadb703cc3244956af6646f7e7d5a678949ea", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowCreditLimitTypeEnum.json", + "type": "file", + "size": 1075, + "sha256": "2bad063ff8d1e1a3a12fc508d3fc5beb02306686fe624af71352141b69a5f99f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowCreditLimitUtilisation.json", + "type": "file", + "size": 529, + "sha256": "197c37096aa59e4f2676ce06cb6178bfea9724af373308b4cf63a855ce66f296", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowCreditLimitUtilisationPosition.json", + "type": "file", + "size": 649, + "sha256": "0931521a057f58497f31ff5132e52467ecfd998ab8916ed29efe895cb652b060", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowCustomisedWorkflow.json", + "type": "file", + "size": 648, + "sha256": "154f7290bd9544abf2ff0b2eb3e2ed8cfb85a0fc7ca703e6b5263b534555b2cb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowEventInstruction.json", + "type": "file", + "size": 2426, + "sha256": "983b973e38167507bb357c0f5f1638735b7574c803e4b8c9282fee17af74b2d7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowEventTimestamp.json", + "type": "file", + "size": 1469, + "sha256": "e766051ef260554f470e71851cfce814ba0d8730f7f6be3b13d629e0b7b942e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowEventTimestampQualificationEnum.json", + "type": "file", + "size": 2887, + "sha256": "7ce3e07c9da49d1382289de8e6d673f73560cc2e3c656bc5a3bb1794850c33ce", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowFieldWithMetaCreditLimitTypeEnum.json", + "type": "file", + "size": 267, + "sha256": "3010663da3885ed765be0352d7392f88c70d1d01499228530db7020435b9d56f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowFieldWithMetaLimitLevelEnum.json", + "type": "file", + "size": 262, + "sha256": "bd7937bcde022adb1d10110c9dc5ab9e7607d5716f8056e6474f3ef147c11698", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowLimitApplicable.json", + "type": "file", + "size": 2262, + "sha256": "452cacf0b3387a6cdbe957e104e772d7e0f223c12acbfd44fec4202d38077b71", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowLimitApplicableExtended.json", + "type": "file", + "size": 3643, + "sha256": "4e0bd2dda94d50e44ec77fdbe702db5e5a6f3385dcec911951223d9a4885baa0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowLimitLevelEnum.json", + "type": "file", + "size": 907, + "sha256": "f1ad2cce28b5101cbb89c215fd009f2677dd4141ffc38cbec95eab997a95c7ee", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowMessageInformation.json", + "type": "file", + "size": 1270, + "sha256": "6231882410c4d89aa14c29499445cb363070b41dab4a604701297c752c347c2b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowPartyCustomisedWorkflow.json", + "type": "file", + "size": 831, + "sha256": "c3d0248996e954ecf7d5c6bcc7e94d9c2295b12bcc3ea8cf5e9933ec24a6c22f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowVelocity.json", + "type": "file", + "size": 258, + "sha256": "c920b71ec55fbf0b997dfad56bb622deef69dcec9eb7f006448804a4a32ebd45", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowWarehouseIdentityEnum.json", + "type": "file", + "size": 319, + "sha256": "46287cff405c76e8b56b37729bd585618ab6af7e5137fd6ccd74eb9ec4d9cc84", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowWorkflow.json", + "type": "file", + "size": 378, + "sha256": "56d9acbbf6b9dadccecde6532e60278c09eeaa8c0f4e384462e1b5ed1f304029", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowWorkflowState.json", + "type": "file", + "size": 1381, + "sha256": "7efa06a7fd40bf49c1e9c13333c5daeb661a3092c7acc965baf8e2f6749efc5e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowWorkflowStatusEnum.json", + "type": "file", + "size": 2148, + "sha256": "a59ce177a04c949d1af710e893bc5bbbc1975133f00436a17cd2ba43c3c84646", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowWorkflowStep.json", + "type": "file", + "size": 5410, + "sha256": "77a1b39a2723f5916cdcf9216ff3e9fc010be57ba3fc7ac8ba32270015a96538", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowWorkflowStepApproval.json", + "type": "file", + "size": 980, + "sha256": "bd0d671a867394febb264137d9a89aea57f95298deec0580f1cc08ff9cd22163", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmeventworkflowmetafieldsReferenceWithMetaWorkflowStep.json", + "type": "file", + "size": 403, + "sha256": "01fc868b83cbcfda61f04f9ce21e5d3bb7ea69a7d6e1085625e874bfbddb98af", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonAddressForNotices.json", + "type": "file", + "size": 755, + "sha256": "8c18de1ed8e5fd8696ae195fb68455366b61c45ef1a9177ee45f232b8402b205", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonAgreementName.json", + "type": "file", + "size": 3018, + "sha256": "c8c8f823ea3011e01cd116ba7d8d42427fdbcfb4874440d237db9e8dee67c591", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonAgreementTerms.json", + "type": "file", + "size": 963, + "sha256": "e18a280a4e38853a5cd46edabf7e63a5fa59a81642f4eed34350f79af8e11511", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonClosedState.json", + "type": "file", + "size": 1771, + "sha256": "69cd14cca0c93d71da3845d825d99f522aca45c509be2408a1da6df0cd0bf368", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonClosedStateEnum.json", + "type": "file", + "size": 1267, + "sha256": "aeaef02dc79a7b20eb352906e60a3cc970072548d24138cf59140d4477741d73", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonContractualDefinitionsEnum.json", + "type": "file", + "size": 3433, + "sha256": "5e284e1400dad7f60b36c1e0e69047d5c865a8ee15fe51e47af9ad10d28a771f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonContractualMatrix.json", + "type": "file", + "size": 713, + "sha256": "2ea4e906735ba182911570a7590e060cb3e82c677c9ba531b6c7e1394b0c5169", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonContractualSupplementTypeEnum.json", + "type": "file", + "size": 11531, + "sha256": "57fd7dcafcb3b41257f9a0148e20928d4f415bb1b0620ffb273bd8b4d82f7af4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonContractualTermsSupplement.json", + "type": "file", + "size": 682, + "sha256": "7a2bad7461b289f677f7ea300af15620425ef74e90f5d9367c152920725977d8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonCreditSupportDocumentTermsEnum.json", + "type": "file", + "size": 695, + "sha256": "ab872aa2ee2f6f50e150e95aea8bf45f0e14caaefb23e932589374046766dd27", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonCreditSupportProviderTermsEnum.json", + "type": "file", + "size": 695, + "sha256": "c177cd194aca083b00783352c626937dd0fd1d2b0129007ad5d20f29baa85950", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonExecutionLocationEnum.json", + "type": "file", + "size": 735, + "sha256": "f80de8cbdb88867982f4b53beeb3f2e35a56eb0cfce9d5430c2b06422e64b467", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonFieldWithMetaContractualDefinitionsEnum.json", + "type": "file", + "size": 285, + "sha256": "d5352156dc2c852d468c366e90922066a9bac567db6b21729cebd555885a0035", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonFieldWithMetaContractualSupplementTypeEnum.json", + "type": "file", + "size": 288, + "sha256": "532464b5efa90c16ab444d65f4b548ff99dd7afefcb00a8c9b6b572f6c039318", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonFieldWithMetaGoverningLawEnum.json", + "type": "file", + "size": 274, + "sha256": "fead289fd4e3acffd522d533bc8cfad3e8872608b00eabda99bb5234c2e68d5c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonFieldWithMetaMatrixTermEnum.json", + "type": "file", + "size": 273, + "sha256": "4c869b780828b3d22fe429d123d815ab65a0133d767a3c68b7f2be7d5d5055f5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonFieldWithMetaMatrixTypeEnum.json", + "type": "file", + "size": 273, + "sha256": "02053002dff37a449181dff088120e4535e479c3f63412063667496c549dc8b7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonFieldWithMetaResourceTypeEnum.json", + "type": "file", + "size": 275, + "sha256": "601a434cf13b4aedf57404725ff30db3be63670dbbe41b9c89f438af7183bedc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonGoverningLawEnum.json", + "type": "file", + "size": 3326, + "sha256": "464740a7918f2bda142583ac5c3e19c6cada4f73097c2bd78be6df9b1df7b3d2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonLegalAgreement.json", + "type": "file", + "size": 3690, + "sha256": "a2517ab5c66bad39b428ab6b97145057f85d4a20a4de9c676e46928a5c4cd16c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonLegalAgreementBase.json", + "type": "file", + "size": 2725, + "sha256": "c12b9a9aa5639fca45ace8bc70baa5dac033d6ae82d0335a11bc9ea077ed357f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonLegalAgreementIdentification.json", + "type": "file", + "size": 1310, + "sha256": "a03a87cc251532352140728056ad9ced8a80bbba0338b7f2f6bcf9fcf4bae60c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonLegalAgreementPublisherEnum.json", + "type": "file", + "size": 1677, + "sha256": "7497c706a3e7acfa35eae84e8dd41a8290c1cfffd05ea843315e014854a46b52", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonLegalAgreementTypeEnum.json", + "type": "file", + "size": 1302, + "sha256": "ad08a4f9121a06b1834e7d79922e4a4e5a57523f8cf9a0fd4aaebb5ad1d86b0d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonLengthUnitEnum.json", + "type": "file", + "size": 547, + "sha256": "8c3aba5ced0b91de4cd17d307dd9bdc4ae4523e98dc0aec478577991189f6e73", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonMatrixTermEnum.json", + "type": "file", + "size": 12913, + "sha256": "16c8799d7495c22dbfff5b3f525fa46a80cf1e40925ca7d998ac48d13aaa9484", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonMatrixTypeEnum.json", + "type": "file", + "size": 759, + "sha256": "3e6abd4d42feb2189135e10857d0150a823e091d7fa77bd960f70567d568e708", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonOtherAgreement.json", + "type": "file", + "size": 968, + "sha256": "63b136ac4d7d1c1c9ede320b667f520f274dc54f55718b5a5e45aeb7eb181ef3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonOtherAgreementTerms.json", + "type": "file", + "size": 834, + "sha256": "ea580261d8771bdd56667618a26779247b9242f61ce335d1d4ef9af5d5b0a5bd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonResource.json", + "type": "file", + "size": 2950, + "sha256": "83374ed488c46be6f8378cf5d1c8ccc9c6ff3beb337fa1498cb2b46671c2b875", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonResourceLength.json", + "type": "file", + "size": 616, + "sha256": "41d93205aea3214c842be9b62ce8123ac9538f834c137ad598e7a4aecddfbb1f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonResourceTypeEnum.json", + "type": "file", + "size": 725, + "sha256": "47611eeb54c1cc57e68d9b48bbbffd231a3dbc1ceb0c6396206f73b781359907", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonSpecifiedEntityClauseEnum.json", + "type": "file", + "size": 946, + "sha256": "09dda809aaeef83bbdf192facae59ee2b945b873be640b09255e225fdcbc6144", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonSpecifiedEntityTermsEnum.json", + "type": "file", + "size": 1065, + "sha256": "8028ed2a688ed640b8b7aaa9e6f3cb961b2c787c15ca2e5123022d099fe15604", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonTerminationCurrencyConditionEnum.json", + "type": "file", + "size": 791, + "sha256": "d7ce293f451edbc346b3032bd2509b10c8ed47547b306864190c5dd1f55a5776", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonUmbrellaAgreement.json", + "type": "file", + "size": 1114, + "sha256": "082560c15596dc7e69db1f3e333306c538cd05e5884bbfcc0c22121204842b16", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonUmbrellaAgreementEntity.json", + "type": "file", + "size": 677, + "sha256": "35d9d8149923aa81ff7f23aa8131d995a686b64606c55e7402aedbb4e2a26398", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcommonmetafieldsReferenceWithMetaLegalAgreement.json", + "type": "file", + "size": 416, + "sha256": "c7595380c6a67697d0e74a411cfb1e0bb271bb5c02c6740bdc79f63985f56db2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcontractAgreement.json", + "type": "file", + "size": 1316, + "sha256": "b63cb810ef3e562558730fb8c36711d039c0537e6c3f1ed7788b25568245f06e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcsaCollateralTransferAgreementElections.json", + "type": "file", + "size": 167, + "sha256": "4e0062378aa18b41d86a9d54d5b923ef74e47924ef0740612efd5a48cb5bf4a0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcsaCreditSupportAgreementElections.json", + "type": "file", + "size": 162, + "sha256": "c27aa6d43bbf02171842121f52ec0a92c1b484a305e5e0effee70f1a04716710", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationcsaSecurityAgreementElections.json", + "type": "file", + "size": 146, + "sha256": "5159652e6ba7579a4fcedeb748841fd3e6e31a4eae65575f0e50f3d12207433e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterAdditionalDisruptionEvents.json", + "type": "file", + "size": 2637, + "sha256": "af336de7aebbb342605f31f249f59b943d201511c41ce6d90e0d712e85e23bac", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterClause.json", + "type": "file", + "size": 841, + "sha256": "ced433b40f299c7f07d52757ccf9df85fe34d7ccd2ba5f94369348ed56e3f147", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterDeterminationRolesAndTerms.json", + "type": "file", + "size": 464, + "sha256": "04e6cbd5475b5ef6574f2d1ff132e0e77fac090fcf88a5cf32794b91b3601677", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterEquityAdditionalTerms.json", + "type": "file", + "size": 627, + "sha256": "08adc74abc22c29890c543f96909a5be81f090e31cc22b39b9cf858a0bd1bcdb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterEquityCorporateEvents.json", + "type": "file", + "size": 148, + "sha256": "8bca536728fea523037638550326c4ea5df2deeafa71389c3ba29cedda7bb7fb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterEquityMasterConfirmation.json", + "type": "file", + "size": 368, + "sha256": "9bb04b771e5da4ffda5aea14a5d2180b9bbfee06f57709fb4350074714740ece", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterEquitySwapMasterConfirmation2018.json", + "type": "file", + "size": 2086, + "sha256": "72b95f7a5294cf3a9f623e5458f92cbe814642c67b896cb072bd022e9eb113f6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterExtraordinaryEvents.json", + "type": "file", + "size": 2471, + "sha256": "c9088a4ae06dcc77f81265fc7b404fd329021f97120823e39ad21945d16b65de", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterFieldWithMetaMasterAgreementTypeEnum.json", + "type": "file", + "size": 282, + "sha256": "ba55e9de4c8b2bea7cb29d6ffe1ad88a8b5548169cd48360c2961dfd366cd3bb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterFieldWithMetaMasterConfirmationAnnexTypeEnum.json", + "type": "file", + "size": 290, + "sha256": "81f5eb160b3d799e7589d9ff92066c7627d23a423ba5a6b032a368f83b1f2304", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterFieldWithMetaMasterConfirmationTypeEnum.json", + "type": "file", + "size": 285, + "sha256": "59c13fcfc30bbebcdf575c86b6aa5ebe4c85daf7ac92655ab34c29629f116f7c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterFxAdditionalTerms.json", + "type": "file", + "size": 156, + "sha256": "0232da8826a82d41adc352380d914270c0cdf06193b1b98c49c2d68c2d4f7b9d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterIndexAdjustmentEvents.json", + "type": "file", + "size": 212, + "sha256": "9308baa5b1337a5979f556d3364140f4afe237da8f8d711f66ef61461abccf26", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementClause.json", + "type": "file", + "size": 1672, + "sha256": "575968e95610da16b4ff8f3edee01ce1b11f3033fdfbb380327a395f05ef7d93", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementClauseIdentifierEnum.json", + "type": "file", + "size": 8430, + "sha256": "cbfc9df31e3e4c3bc54c151e748dc04d4d60561ff54692d3c6717107b5383bd7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementClauseVariant.json", + "type": "file", + "size": 1813, + "sha256": "e8b04ec35e39f480832bc037ead3a0a84d7f450a4421452c564b77cac3227aca", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementSchedule.json", + "type": "file", + "size": 538, + "sha256": "2ab7940dbe933a5d86ebf4dbe8e4344ee62f77a33f01f8e8de9ca93fa3374300", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementTypeEnum.json", + "type": "file", + "size": 5182, + "sha256": "717513ff36732a3eeb7fcde4ea1d949290c11ec89a52c6440cad0a07a5f629aa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementVariableSet.json", + "type": "file", + "size": 977, + "sha256": "9deecd3afbfc46fa7f7d2fc36660eda504bf2017a9b9aa540627485ac84bd1e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterAgreementVariantIdentifierEnum.json", + "type": "file", + "size": 25999, + "sha256": "4f57d93ae9c792aa9d3f0d05e9b93771477e9b1e1f7fe7217fba76bcdc312d13", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterConfirmationAnnexTypeEnum.json", + "type": "file", + "size": 3921, + "sha256": "29e80b102cd46420cc1ac3c313ded12799f7847d2c14155435f1716b629b571b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterConfirmationBase.json", + "type": "file", + "size": 246, + "sha256": "35d4fe8fd0d614d661c71c1cc3007ee9712fbaa98e78ff005cad122aca26044f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterMasterConfirmationTypeEnum.json", + "type": "file", + "size": 17578, + "sha256": "1a16eb2ae4bd3ef05e166dda5b9197932e0b92f6fbfb0f3011b8bcd899bb5639", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterNationalizationOrInsolvencyOrDelistingEventEnum.json", + "type": "file", + "size": 641, + "sha256": "28e449960de25364b2ebb88d9f4d8624abb999bece791bf111e2724fe5652a60", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterRepresentations.json", + "type": "file", + "size": 62, + "sha256": "4f5cb19df16bab4936f4f270e2a021ce3baa6bdd6f02c2832ff6e29ff372b9e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterTransactionAdditionalTerms.json", + "type": "file", + "size": 1132, + "sha256": "ba8f07a7d3694868944ab48df344e451220015590c724fa33a7ff30ca50f7381", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmlegaldocumentationmasterUnderlierSubstitutionProvision.json", + "type": "file", + "size": 2242, + "sha256": "4b609b426fc0d833356e98f9d77c0ebac4301ac0c3d1f8768b56586afe13237d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmmarginscheduleStandardizedSchedule.json", + "type": "file", + "size": 782, + "sha256": "9427c203386bf6bb882943e52bc1f4baae5d27776564ff113b3804c70734e4bb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmmarginscheduleStandardizedScheduleAssetClassEnum.json", + "type": "file", + "size": 901, + "sha256": "dad6e0a3301c4fac546f338f642f425fad407f3222551143fe76bbfc38095191", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmmarginscheduleStandardizedScheduleInitialMargin.json", + "type": "file", + "size": 464, + "sha256": "0535f68ac34e388971a2b3a3d3f63d384d30da004ae01d784f808c215518fe5e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmmarginscheduleStandardizedScheduleProductClassEnum.json", + "type": "file", + "size": 4570, + "sha256": "4028e56aec90a88d8edb37771e279cd27ae401ecf108792226a5f3b322068106", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmmarginscheduleStandardizedScheduleTradeInfo.json", + "type": "file", + "size": 507, + "sha256": "a1e23178391d5d16be564030ba50f7398c614fbcfb770a01338e1779dcf25b8f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetBasket.json", + "type": "file", + "size": 1887, + "sha256": "a84b9c789f479019aef74c745058e4713fc15b6069c1c420699fd5e3adae6b2e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetBasketConstituent.json", + "type": "file", + "size": 2742, + "sha256": "8c9c5295eb30067e177d6c92a5b6bae87e38703835720e61bd155a03fccdce8f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCalculationAgent.json", + "type": "file", + "size": 1540, + "sha256": "653f6f1c7f9ec975ead1d32c7e0c837a1d713fe2f5470be74f0cdab05ee25e0f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCashCollateralValuationMethod.json", + "type": "file", + "size": 1871, + "sha256": "551be2a2a85086d0b22b90fd775450f61574e7535bf81a224a23e2d9ddca5892", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCashPrice.json", + "type": "file", + "size": 805, + "sha256": "a21baa1cc07420d97676969291f76c14f24a4d948f588c413c2ab1a8538faa88", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCashPriceTypeEnum.json", + "type": "file", + "size": 717, + "sha256": "416ca064ffe2242f184fbae063032c367e7d3d312ae96c293d0efcc04971765e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCommodityReferencePriceEnum.json", + "type": "file", + "size": 5933, + "sha256": "5883fd1441f778f685299a7b15b8fbaac037adba5c8bdf3775fa036384a0ed36", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditIndex.json", + "type": "file", + "size": 3986, + "sha256": "a1c685144cf57cd966034dd7668bf02f86933af4a3ec9babe790d2af25bfc6ad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditNotation.json", + "type": "file", + "size": 1986, + "sha256": "b1a4b043c6b2ed11a0f3d71500a67aa2ca8c9ee5eca2261a8c298ec5862f4060", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditNotationBoundaryEnum.json", + "type": "file", + "size": 558, + "sha256": "330a749ad36f28491e9565074745dcbd41c1c406e32fcf93f94a13aeb55ebb75", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditNotationMismatchResolutionEnum.json", + "type": "file", + "size": 1299, + "sha256": "c563d14a262a6cdc92d57835b12c1804ec4718f957b5d3a72a4cbd6e450cde6f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditNotations.json", + "type": "file", + "size": 608, + "sha256": "9a4e05c1cb85833496b133202326e41cabfe1952e91d6a108328e87bab8398ef", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditRatingAgencyEnum.json", + "type": "file", + "size": 1407, + "sha256": "16ab2c81654a1c9ada85347fe2a31bc6789d91d44b248f1d47da3b2105d77453", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditRatingCreditWatchEnum.json", + "type": "file", + "size": 695, + "sha256": "8712c631b7da2ce321d5ed5c6fba3b51c323328c5dfc0467957697e98d8447fa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditRatingDebt.json", + "type": "file", + "size": 858, + "sha256": "c0de4c4c9ca3cb6e0aa19a64ee679d7591eee357623c30d98b07240114a596c2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCreditRatingOutlookEnum.json", + "type": "file", + "size": 832, + "sha256": "fa3c854c7d1ad3b86ec16f9231608b28b6f0f70cc0badb56c97cf329728f38a4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCsaTypeEnum.json", + "type": "file", + "size": 734, + "sha256": "40380dd99e96ab12283e9e4775b028eeb25fcdc72d4b1fe1695dfda0ac93422b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetCurve.json", + "type": "file", + "size": 266, + "sha256": "4b90a3fb2eb03d422cf810f6c015698e77e9ff347636fe0dfbf9efd7d1f40406", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetDividendApplicability.json", + "type": "file", + "size": 1096, + "sha256": "4c79c01d37007326e2d2dcf28cdf0d510b4da677b16421116b2f23b5c0beeb14", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetEquityIndex.json", + "type": "file", + "size": 1958, + "sha256": "e6ee4ef5e26a4a1c3d67e8c437c36d30f21b3d99f94eb337680ab15f090116f7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFallbackReferencePrice.json", + "type": "file", + "size": 1287, + "sha256": "863bcd8d8567c37d34c5a72d9d5072466770bf20a009e4dd0dcac54e58177c7c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFeeTypeEnum.json", + "type": "file", + "size": 1847, + "sha256": "256b9a35aac20c450c6863a9be89386552b79edab224c27dd8927e24a2eee48c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaBasketConstituent.json", + "type": "file", + "size": 229, + "sha256": "dd15fd1a399e5edf2af889bf4bf39e198f917f51f5718f667138f4f75da22ebf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaCommodityReferencePriceEnum.json", + "type": "file", + "size": 277, + "sha256": "fb07bbe536e2131dc198fd98dd9cf8ae200d7081ce94dca053493a35a3e6d66e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaCreditNotation.json", + "type": "file", + "size": 264, + "sha256": "1bbac89db257029119d9ada1e24ea88b7fcd8e78f28057b4cf8576ff4b705057", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaInformationProviderEnum.json", + "type": "file", + "size": 273, + "sha256": "c0d30b6978372e3419ed880d3851b754a8aa59b213a20ae6f062edef94dfd381", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaInterestRateIndex.json", + "type": "file", + "size": 267, + "sha256": "d9a0c6c0ea24786db247aab1da60221826712834b0ed6e6e4dab06aa09f2becd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaInterpolationMethodEnum.json", + "type": "file", + "size": 273, + "sha256": "701b7f88272233c53d1890d6f49bc2f1d00bba8046ea15e2f97647e362bb244b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaObservable.json", + "type": "file", + "size": 260, + "sha256": "f87b9676ad46908dc25162ca702c4d093de7ea50b946139ec879b669c6286c8c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaPriceSchedule.json", + "type": "file", + "size": 263, + "sha256": "ba3b3fefd1a241053f7d1f4e62091235daed72b0ae76ee66ce1ee5265dfe3f47", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaQuotedCurrencyPair.json", + "type": "file", + "size": 268, + "sha256": "c769c5f8607c82152fe700f225b18471123972d04b7be1c77cff6ed6a9475e7b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFieldWithMetaSettlementRateOptionEnum.json", + "type": "file", + "size": 274, + "sha256": "01ad1f3a09291c9ad2b4a17d080dda595de847490bdf999e5f43a0952a016411", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFloatingRateIndex.json", + "type": "file", + "size": 2463, + "sha256": "274fb05e2e55f163bba9cc2449107e7aa5a2ee4bc13397fdcaec673190332c00", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetForeignExchangeRateIndex.json", + "type": "file", + "size": 2757, + "sha256": "d843ea9904e62a80457a6980f7824a9649ae6f83cf44ac06cf7848bd28443ab2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFxInformationSource.json", + "type": "file", + "size": 1084, + "sha256": "43b2692b7b3ff1ad79ba3669c7d002a5a39c1efbe2c7d38fc47c875fbc17a66c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFxRate.json", + "type": "file", + "size": 686, + "sha256": "627dabce766a9099509205a3ed77c9dcac69081c8b02ef98defdb4e728b4b725", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFxRateSourceFixing.json", + "type": "file", + "size": 531, + "sha256": "3150989c37f3d542207c0732bb8f4d63b23eb65aa849aaab2cb6ec63bb53860a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFxSettlementRateSource.json", + "type": "file", + "size": 581, + "sha256": "8d507937094d9cbb1cf0c0ca7a31c02dfdd8dc2807438666199d9943a918e391", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetFxSpotRateSource.json", + "type": "file", + "size": 731, + "sha256": "86a3c8971e16c25324eb11aca85d58477076929b40ac00db7b12d1eaac1ca101", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetIndex.json", + "type": "file", + "size": 1445, + "sha256": "a11c208893020b180c38f39ae43139da930b02bed3009ceeba856a0d5a903111", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetIndexBase.json", + "type": "file", + "size": 1933, + "sha256": "1d901e969cb852235368f58ef08b91e752ddc14b621e56e7d1067c7915443e7b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetInflationIndex.json", + "type": "file", + "size": 2437, + "sha256": "65c02c11d967b9a6dcc114e81e487a3ec59440103264c58bac7c5a2f14a6b836", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetInformationProviderEnum.json", + "type": "file", + "size": 2865, + "sha256": "e79856cf8a810085a05a5bcdc91ead38c83989dbdeac2fb9cb90d35940d76a13", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetInformationSource.json", + "type": "file", + "size": 1056, + "sha256": "40473211f6ba1bae8779ce8ca60e4ffaa4cb2b991f57e4a8e9669fc7413ab812", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetInterestRateCurve.json", + "type": "file", + "size": 361, + "sha256": "83ec8408f073e43138734cd3685fe457a75d284462d5c780fb831cc1a3900927", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetInterestRateIndex.json", + "type": "file", + "size": 618, + "sha256": "1bfba7f7ad4419f4dd80c287592ab984e82ce4d736174f082523fa76bd0bdfe9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetInterpolationMethodEnum.json", + "type": "file", + "size": 693, + "sha256": "17e9032f70ab4d3202659c1606f4d60c726dd3e97988a8aaa439baf906990bdb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetMakeWholeAmount.json", + "type": "file", + "size": 1430, + "sha256": "8b2a5d6c5b23a2304076baf07e6db05934c1386020710cc9b0e1550b43c18166", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetMoney.json", + "type": "file", + "size": 2056, + "sha256": "47ebcd937fa23be92972f3b826bace0e536ef69013cbeeb1bb308135773a62c8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetMultipleCreditNotations.json", + "type": "file", + "size": 974, + "sha256": "2c135347178877973d98a1c87773dd7bb37e8211b824390af282d5dd1b94679a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetMultipleDebtTypes.json", + "type": "file", + "size": 875, + "sha256": "eaf87fdf2f40cb5f48918c1623408a865eb277dc793afc40e02b4ff0f79079a7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetMultipleValuationDates.json", + "type": "file", + "size": 1190, + "sha256": "e29de6942b207d62ccae754c2c39049ad90d9c10b24623067105f499a40a52ca", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetObservable.json", + "type": "file", + "size": 881, + "sha256": "06b25c4ffc263435ca462a1006f59db3a8a70ed3161df9a3b5a95916b1126472", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetOtherIndex.json", + "type": "file", + "size": 1981, + "sha256": "0628dacc9ac0a946106f51bf742d079b8c846161bb94889c6cc4650a522e3429", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPartyDeterminationEnum.json", + "type": "file", + "size": 1039, + "sha256": "c55e7f40166e18365198bc2ca0612913849da2e41ef4655008963d978561903a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPerformanceValuationDates.json", + "type": "file", + "size": 1570, + "sha256": "8b45cc34eee076c978d32e87507458e06bf99710c6ebc38996c528ccd73ed932", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPremiumExpression.json", + "type": "file", + "size": 873, + "sha256": "1bee37a5aeaeb18a4b41ea9007be227cd44a5006be9f93e7684aa6aff5e8e775", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPremiumTypeEnum.json", + "type": "file", + "size": 826, + "sha256": "702dee780147dea7f32ae682950baaf0351bb59b88b994f83eb5a9c75bf046cb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPrice.json", + "type": "file", + "size": 3051, + "sha256": "9ae06334806de3c8b5e066ea2a06f4230a9a5d75717ff9c6a00f522885251a12", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceComposite.json", + "type": "file", + "size": 1674, + "sha256": "246b75da7bbbef56e0535f982eeb2b9952668aa834f498ec8b236cd9dabaa818", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceExpressionEnum.json", + "type": "file", + "size": 874, + "sha256": "3613a9e6a47533c95ff2bc7ed510c78b3355951370c3e6b9ca99920aea72e1e8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceOperandEnum.json", + "type": "file", + "size": 606, + "sha256": "da6a30a2c0c6c69f904403b9f5c06e48304ea0f9b4919d2a96d4684d82c75f35", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceQuantity.json", + "type": "file", + "size": 2145, + "sha256": "d4fe12cb9d4ff9ecb994746f10e394c81fd767127cbcaf0eba2e604f105dc71d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceSchedule.json", + "type": "file", + "size": 3516, + "sha256": "abc1ffc8d214028c1f7ecf3b7a4c6c9a529dcf335e08a4f60a677ed1fa4dc8a3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceSourceDisruption.json", + "type": "file", + "size": 519, + "sha256": "498f035e0a890107caad4b13aa722c192d2aebeaec828ab870347eed00a0b517", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetPriceTypeEnum.json", + "type": "file", + "size": 1479, + "sha256": "952cea1aeec0fe99cf18d019915cec83576f1fedffe1fa9c519cd01613130651", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetQuotationRateTypeEnum.json", + "type": "file", + "size": 874, + "sha256": "f609bbcc5303289f2555f001271fa912b89c0ae6e07b84be0fa47bcde34facf0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetQuotationSideEnum.json", + "type": "file", + "size": 3400, + "sha256": "22826a9dfbe6ab7edf2cda70059f0612f333be526c92a23a264fb7ebf0169c13", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetQuotationStyleEnum.json", + "type": "file", + "size": 763, + "sha256": "e3136042085a9228f46d112076d2b7d6e1931cfee31cdd81fa35f4ebd573719e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetQuoteBasisEnum.json", + "type": "file", + "size": 561, + "sha256": "98b284ca76167284cc2a12c5db9bfd7dbe6c84a32e218b8cdb82011495de1329", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetQuotedCurrencyPair.json", + "type": "file", + "size": 1044, + "sha256": "3334317439cbac29d3fd19d48c0d1a125cfc4e79ca2cd04add316f455df701fa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetRateObservation.json", + "type": "file", + "size": 2653, + "sha256": "0239aaab7f1abbf4e4a88364a1cf1ee7f86c3279d93a57232a3060854aa18560", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetReferenceSwapCurve.json", + "type": "file", + "size": 735, + "sha256": "6c4fe9c45202321047cb8d83ec9d0fd56f1f79168d8815f1d6f3d396966c0bb2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetSettlementRateOption.json", + "type": "file", + "size": 869, + "sha256": "2e8af917783ba879c768ac758d7b422b9e93dbd82c9729877fec194f3e2952b1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetSettlementRateOptionEnum.json", + "type": "file", + "size": 15277, + "sha256": "cda542cf196e219860af2ed3818047058d6e9a81a65475bdc2a834112a213872", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetSingleValuationDate.json", + "type": "file", + "size": 444, + "sha256": "8f780cb629a95ff7adb1635e1738ebe9deb5d0819f09b6fdb1d0531912d3c298", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetSwapCurveValuation.json", + "type": "file", + "size": 947, + "sha256": "338c3249c06161728f4c84db5a625127082c46b296199c6bf5e5b28f4ab46d7f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetTransactedPrice.json", + "type": "file", + "size": 2526, + "sha256": "a9a00178742cf406ef7d08eb25fa37696e32371521af496c209323087ca093e1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetValuationDates.json", + "type": "file", + "size": 841, + "sha256": "a98cfaa228e425ff8ce65d47e2fb9db78835fae665bdd7e4f6a5e2b7e5efd101", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetValuationMethod.json", + "type": "file", + "size": 3067, + "sha256": "d30cedeb23badd83751449e7a079700529594851045157ab17ae9a0dab833385", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetValuationMethodEnum.json", + "type": "file", + "size": 1522, + "sha256": "034fc06af7eac43aa3e566a19b48cfcefb69c9943620869c04b205f68b3821c6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetValuationPostponement.json", + "type": "file", + "size": 501, + "sha256": "94f07512542b4f6a764bba7b7c806ffe82d807224a8b69f3049ac286a8ec7e45", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetValuationSource.json", + "type": "file", + "size": 2311, + "sha256": "a2910f3b646107c845e504ddad86c618add461df0ddbf494651d00728fab2153", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateCalculatedRateDetails.json", + "type": "file", + "size": 2070, + "sha256": "5ceedcb2fd449657083155e286f689a32fb659e2f5f24b8b1fcd7841ab004cf0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateCalculatedRateObservationDatesAndWeights.json", + "type": "file", + "size": 835, + "sha256": "cd216407718dbcbe71146441915bb3fa2929c9c35ec5c3b50aefcda164d01d4d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateCalculatedRateObservations.json", + "type": "file", + "size": 1415, + "sha256": "fa2a25e9aeee730a3f831d165bd14418e128e2d6928e0f358f09f257d679e497", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateCalculationMethodEnum.json", + "type": "file", + "size": 843, + "sha256": "0201eecdfefedea7cc643f703f1f1c5f2d718bae1b3c253a458ec2550c5530f5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateCalculationShiftMethodEnum.json", + "type": "file", + "size": 980, + "sha256": "66d8e8a9eeebce18f46bc4a05b5c755ada32b417ddadb531617e5b42339ead79", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateFallbackRateParameters.json", + "type": "file", + "size": 1120, + "sha256": "4daf6d81ef9fdb1ea046a5fc9cfc7471fa703aa67dd69c36145fba3c244fe9d5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateFloatingRateCalculationParameters.json", + "type": "file", + "size": 1535, + "sha256": "8a21fae1650256b148b969a9cb17d79f747a04bf7c614857b1bd76aef4269660", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateInflationCalculationMethodEnum.json", + "type": "file", + "size": 764, + "sha256": "119720e87cd479ab57708673595d1a8052e199ec91cc025cea1ae4c62f44f99e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateInflationCalculationStyleEnum.json", + "type": "file", + "size": 605, + "sha256": "b14995cccd288a8244f189f7c5d777265cc4e5410c567b5f27a0f7409fc1d359", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateObservationParameters.json", + "type": "file", + "size": 591, + "sha256": "d17c8ce9314c15a0328b9559ba366979cd182dd3496a8e8908f14eb066ebb622", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateObservationPeriodDatesEnum.json", + "type": "file", + "size": 957, + "sha256": "d21204f58962b1b783f788d9fc222cd1d8a420bc856c63b1885574a0f46a5c79", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateObservationShiftCalculation.json", + "type": "file", + "size": 850, + "sha256": "fc5314f491c72bc4ad4c6a5fa2425709aae7eee3031412a2d548a1acc90db55f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetcalculatedrateOffsetCalculation.json", + "type": "file", + "size": 452, + "sha256": "7857b9778b28d7e6dc8575e44b0c58a7aba1a33e9d7f3b24235bddb766038316", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetfroFloatingRateIndexCalculationDefaults.json", + "type": "file", + "size": 725, + "sha256": "1d5dcb2882a45cd030beb8a2e6437c39da52c46a0ac5233b2c9e975331d56967", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetfroFloatingRateIndexCalculationMethodEnum.json", + "type": "file", + "size": 850, + "sha256": "671e2141dfaeb3a283c0e92358b5a5efb3b856a1b6906e3ca5d053bc3d5f4f20", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetfroFloatingRateIndexCategoryEnum.json", + "type": "file", + "size": 681, + "sha256": "4cac324de95f68f802158d92e184957d8bb191510fb29c6424a2175c27025149", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetfroFloatingRateIndexDefinition.json", + "type": "file", + "size": 454, + "sha256": "287c4120114f601d0bb9b3bb06db57eb637047ad33346bda783de1fac0b28f97", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetfroFloatingRateIndexIdentification.json", + "type": "file", + "size": 716, + "sha256": "c694479fdc8278c8867cd6eb43a991434225b39af289de8611b0ec0ee2e76712", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetfroFloatingRateIndexStyleEnum.json", + "type": "file", + "size": 1688, + "sha256": "afaf4b44fac28c1a8183937fd24507ba3f7ba0fbb93215d06006b8a7195473db", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaBasketConstituent.json", + "type": "file", + "size": 410, + "sha256": "a8a432f790c5ae13b32b9a0c50eb7763d2dc02149def9537f8d5df81278d77d2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaInterestRateIndex.json", + "type": "file", + "size": 410, + "sha256": "afc64831557edc289f416bc825df04aca0f9d6666f7675544b16a7697dae6da9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaMoney.json", + "type": "file", + "size": 398, + "sha256": "b357a2048f706d8338cf73a598a8ea8fc5b7877e4cf68c1b6cd4754b077318ef", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaObservable.json", + "type": "file", + "size": 403, + "sha256": "709d4e8045388eac6248e5d9a520596b71588e64c18b231c64d7929413f2a277", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaPerformanceValuationDates.json", + "type": "file", + "size": 418, + "sha256": "b1e6246996e908d916494539b05a43989b74d1708ef61dce5c4fe652bef80823", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaPriceSchedule.json", + "type": "file", + "size": 406, + "sha256": "3241bc703f32014c0bf8919b92445c74c79f8ec2b0d003b589e9b62c11d3c439", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaQuotedCurrencyPair.json", + "type": "file", + "size": 411, + "sha256": "0ebb9148ce28576fac22fb4e47161180c59f0c46eefc07ffbedaa52f9ad3f275", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableassetmetafieldsReferenceWithMetaRateObservation.json", + "type": "file", + "size": 408, + "sha256": "4cb47a1bd139df265d114604b59700ebb4c467629879746b679f91994f6d90d5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservablecommonDeterminationMethodEnum.json", + "type": "file", + "size": 2665, + "sha256": "7b010a1c7e922726b9d4bde03cda0ab434258dd4d5ed969e757ace0e010d6f90", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservablecommonTimeTypeEnum.json", + "type": "file", + "size": 1291, + "sha256": "d0e09da6c7891ca6a800cd5d69afe75522255eabff13b6e935e410284c3c2a9a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventCreditEventNotice.json", + "type": "file", + "size": 1659, + "sha256": "dec9442fac3aaad85603eefc4d512c17685700a269f8a6a110cee3507b544c39", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventCreditEvents.json", + "type": "file", + "size": 6807, + "sha256": "f69049254b2a2b96d0a64e4a97ffb52a1b6656e84992e5527bce6111023727ce", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventDeterminationMethodology.json", + "type": "file", + "size": 670, + "sha256": "74d0848aa8640e67f8c03fa8601ea9285c71ea954de6924cde658ee9bbc265ad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventFailureToPay.json", + "type": "file", + "size": 1101, + "sha256": "65a258bf82000534b7bb49906c2ad7ab59c5ff67f6739f7b3f6de87868549e5b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventFeaturePayment.json", + "type": "file", + "size": 1207, + "sha256": "1c68d6c0cf073adbb6fa486eab1a2492354072477c9cdb39ca9b7d21cefa90ab", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventFieldWithMetaMarketDisruptionEnum.json", + "type": "file", + "size": 269, + "sha256": "62c017b5a5a371ac8b05fddc1543a81575bf77d1abef34fc4c3da34be545bfe1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventFieldWithMetaRestructuringEnum.json", + "type": "file", + "size": 267, + "sha256": "507d3e80e3e8ed31bc27a2a38221ddc4c6488da1a31ab754c0a4998399e48e00", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventGracePeriodExtension.json", + "type": "file", + "size": 643, + "sha256": "60eaba31ca835a0cbddca4be0a8cf6003d5aef33f1e42faffdf871115a028d74", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventIndexEventConsequenceEnum.json", + "type": "file", + "size": 879, + "sha256": "fec99ef69f729d4e7bbcc611c65e3233fd560e02ca0b6dece21ece026936d35e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventMarketDisruptionEnum.json", + "type": "file", + "size": 758, + "sha256": "67472cccc9f23b9a12252cb0545a4fbb40fd1d54d741bcb2984b6fb182b7224b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventObservation.json", + "type": "file", + "size": 1033, + "sha256": "bdb7d25ffa05060794e252b86e95634c561a22db911d4f9867736231ab39739a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventObservationIdentifier.json", + "type": "file", + "size": 1266, + "sha256": "0d27514556c2d744ee8b33be279f625c977d5d680ae7037d260c5251d3cbfa31", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventPubliclyAvailableInformation.json", + "type": "file", + "size": 1164, + "sha256": "c4283b33b50e7f8537eeb2478100a2d5b19536debb8838dbd650ab28bb955139", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventRestructuring.json", + "type": "file", + "size": 1452, + "sha256": "e5a5e2f0ba469484d19b42424c8e313fc7c0e9790533d00b6cb691bdaf02e332", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventRestructuringEnum.json", + "type": "file", + "size": 727, + "sha256": "7960c663f4c3f294436793a11f45ef64787a7fbb9a9a720177ca75495df99dde", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventShareExtraordinaryEventEnum.json", + "type": "file", + "size": 1370, + "sha256": "2ed1548579b23fcd6f6dd0f722b43fbd27ffdd6990480d263a3ea1adcd219805", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventTrigger.json", + "type": "file", + "size": 961, + "sha256": "ee6266516c9ecaf1c7e8299d77f133ab6d5729093bcd23f481728eb6f3aee288", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventTriggerEvent.json", + "type": "file", + "size": 923, + "sha256": "dd772a12cdc358b498f1a210a83adfe9067ba2e8e67605d72f6a2c42d4fbff91", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventTriggerTimeTypeEnum.json", + "type": "file", + "size": 577, + "sha256": "f2f50a2530f87c08a58c41e66554060801132c6fd5f7849098ede2d8a6aa58c8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventTriggerTypeEnum.json", + "type": "file", + "size": 1044, + "sha256": "b03a77bfe327289f427acc28ca7d2fba8e47bb3aaba6ffbd4cba737547da2030", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventmetafieldsReferenceWithMetaCreditEvents.json", + "type": "file", + "size": 405, + "sha256": "950a310b83b2fa52451298cd32f536d8bd45bebb932e28230cd08c648d2ba04f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmobservableeventmetafieldsReferenceWithMetaObservation.json", + "type": "file", + "size": 404, + "sha256": "f9619a6a9771fa78617952c44a2fc289370d00a4b803dc9221ff785a9f972f82", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetAdditionalFixedPayments.json", + "type": "file", + "size": 1355, + "sha256": "a8f8882741f948790f39096426013508a741c776b51ffbbf80925ce92d260c2a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetAssetDeliveryInformation.json", + "type": "file", + "size": 854, + "sha256": "5ed6a52d049c5412d09093d2856677f99d0332ea61885113d972c3aaa90c7519", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetAssetDeliveryPeriods.json", + "type": "file", + "size": 780, + "sha256": "0a3cfee4be27a7cff7353e9865a864ee553a752df503b31219a1b35096f2b56e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetAssetDeliveryProfile.json", + "type": "file", + "size": 936, + "sha256": "29403f1fd11d30b8282c2c7c83fd71e577500b3f3b3d763ae2ad4d0b4a47553f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetAssetDeliveryProfileBlock.json", + "type": "file", + "size": 1322, + "sha256": "14533c68eb8a3e954cceb0895a96cced70d79725ade2c7d83e4582afb292632c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetBankHolidayTreatmentEnum.json", + "type": "file", + "size": 679, + "sha256": "ee41cd42f6076bfb4f69a36b3064068feab67f12b4a1c54a1859a8f0f4924574", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetBasketReferenceInformation.json", + "type": "file", + "size": 1505, + "sha256": "a0a25427ce661524c2fcd99a08771774434f0c205dd40e30daf137b6fd7b1bd4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetBondReference.json", + "type": "file", + "size": 1174, + "sha256": "5b1d56cd621f016e86f094d284f8602e0811a5d63f5f97aade11919ef9fc8f3c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetBoundedCorrelation.json", + "type": "file", + "size": 549, + "sha256": "0b731422d52330618aa0fdde961204223a50448cb52132b4d42a045684bc2447", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetBoundedVariance.json", + "type": "file", + "size": 1155, + "sha256": "ab2ed7e92831fbded7016c439b62b30c1ccd7753a35ec6b98ac41e9dbdc0213d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCalculationScheduleDeliveryPeriods.json", + "type": "file", + "size": 1189, + "sha256": "1b0b6f37b5696c3d752b5d5035bb8073c15bee7306f8f97cd31ed24fa2d6535a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCashflowRepresentation.json", + "type": "file", + "size": 1170, + "sha256": "15697b36d16359e013b20715beea93f819353671a716bb8e0341ef90b899deb8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCommodityPayout.json", + "type": "file", + "size": 3694, + "sha256": "a33a33273a5089348bfb853f1fcaad8dd062ce8f9419ce342b98936b8af91385", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCompoundingMethodEnum.json", + "type": "file", + "size": 834, + "sha256": "1d1e68ae7a6adf2226307cb4b5cba3a5216ee4f5e7907fd32bc08d0b0c2e0e65", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCorrelationReturnTerms.json", + "type": "file", + "size": 3366, + "sha256": "9629df6b92127961ef1b75ef8f6fa4cb92734001070f19bc80ec677ce6900d69", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCreditDefaultPayout.json", + "type": "file", + "size": 2972, + "sha256": "125b89a4de98d774cd020dee552566a66192477e8afe7a861659880c3668364b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetCreditSeniorityEnum.json", + "type": "file", + "size": 1400, + "sha256": "9115a34888060259f679f4d08a011bca9ac4f498bc70d2ce162fd6e879457a7c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDayDistributionEnum.json", + "type": "file", + "size": 833, + "sha256": "69b3f500cc0208022e134eaab95b68c89d3175b530371b33e4efbea4593f2a5f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDiscountingMethod.json", + "type": "file", + "size": 1042, + "sha256": "ca616f0c9509b68c2c622404b3279ef765071a0d619149d8b2298a69c6cc273d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDiscountingTypeEnum.json", + "type": "file", + "size": 927, + "sha256": "6bc01e3b2b2fa293c601e216a0d890992e99780f404f8f873261838f3e2c70f0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendAmountTypeEnum.json", + "type": "file", + "size": 885, + "sha256": "3544c4a6b2d114b9333a032ff85c15df27dd0b782bbb1b62dda9961cf357a48f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendCompositionEnum.json", + "type": "file", + "size": 599, + "sha256": "bacdd1dd07ad26ca92986970f2116e41e6a302568931952dea36861b1bcce5ba", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendCurrency.json", + "type": "file", + "size": 1136, + "sha256": "9c9087f7d8acab6a84801958e64471f0fb821fdbe5a8a1596c205ea76984b51f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendDateReference.json", + "type": "file", + "size": 992, + "sha256": "fdaeb281e85bb2c85a6d29c2d1f8af403ed702ac1c2158201aa9168d74a82467", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendDateReferenceEnum.json", + "type": "file", + "size": 4733, + "sha256": "9b6ffc38a8804420fd3f20b00f6d026e827b66732a9834676c1521d54f2a2e21", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendEntitlementEnum.json", + "type": "file", + "size": 592, + "sha256": "e916ed0996cf2bf374a328b5ee7db1899717f8148af8f7cef587070c5b3c9f69", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendPaymentDate.json", + "type": "file", + "size": 476, + "sha256": "8519a7b9e23fb57319486f3c5e3a02d722843da91df56fab5b5a81fd6c9b0dd9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendPayoutRatio.json", + "type": "file", + "size": 1378, + "sha256": "0e4c738ad49249c4f7f62173da15fb55ffbb153e8e7ea298e5d8b08bda80deeb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendPeriod.json", + "type": "file", + "size": 1547, + "sha256": "3f28eea99610432bf4cf51bc94a059cf53946231c2f7bb12f4547ce0b3b91560", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendPeriodEnum.json", + "type": "file", + "size": 552, + "sha256": "de37d3f3ae8a9be758a8c0880a16e523f4966a8158e2739c89b7b5f3d06e38b2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetDividendReturnTerms.json", + "type": "file", + "size": 4076, + "sha256": "0290cba1074aa4b3f2315e0601a1ef3d15e94f461a207d28a125ef46f8fe5d40", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetEquityUnderlierProvisions.json", + "type": "file", + "size": 1256, + "sha256": "646aeb0ca574f23da688c913c59a29aeeaa7ced1546ab2bdba9ea9a14389fd9c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFPVFinalPriceElectionFallbackEnum.json", + "type": "file", + "size": 583, + "sha256": "3c3e2c484cbfcdf2136d400f8f27acc739bbfe6c27866c902b061cd4cdb26980", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFieldWithMetaIndexAnnexSourceEnum.json", + "type": "file", + "size": 267, + "sha256": "307e9749e50d81b1f5e2b78d037e479d112b0347f4d7db0df3410f8540abb742", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFieldWithMetaSettledEntityMatrixSourceEnum.json", + "type": "file", + "size": 276, + "sha256": "b127875be2f5b5bb2fb373d1dbd08da3db8c50a2528f74230d0754aaf81f4bcd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFieldWithMetaSpreadScheduleTypeEnum.json", + "type": "file", + "size": 269, + "sha256": "1750fb89901bf46b354818bf4437de1371300a153a25b80434c7a31857b14e17", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFinalPrincipalExchangeCalculationEnum.json", + "type": "file", + "size": 558, + "sha256": "c80f864fdcacb33c37ef286dbfaa4c814e0a43d422ad58ce5aa07f1813731009", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFixedAmountCalculationDetails.json", + "type": "file", + "size": 1582, + "sha256": "7b350a62122936ce043e43b6088a4b7691c3f244b2fc116631af31025d23cfce", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFixedRateSpecification.json", + "type": "file", + "size": 496, + "sha256": "a8c2705320e0075fbda9992993f7c7dbb5be06ef780f2031164060aff01b3526", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFloatingAmountEvents.json", + "type": "file", + "size": 2181, + "sha256": "dcaefb52f0115281255de579a516d3ec3fd5f3948d907083cbb3ae9aed502cb5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFloatingAmountProvisions.json", + "type": "file", + "size": 1424, + "sha256": "7ed115c0172fea881b6a0ff721ccc196e57703f5c08ac5797e0db7d2836e1570", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFloatingRate.json", + "type": "file", + "size": 3815, + "sha256": "eb36af37d2ab70031dafd694cc9417c2f45a8479105344c04436e69d1a9940ff", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFloatingRateBase.json", + "type": "file", + "size": 2449, + "sha256": "ac34d3808ef639fdad60e9d1284f7c2bbd999f12919f0c5ce588f5215f213505", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFloatingRateDefinition.json", + "type": "file", + "size": 3125, + "sha256": "5b5b636e3b4109d91618f12e4c581a367d50847e848cd5a358cb34e04949f18d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFloatingRateSpecification.json", + "type": "file", + "size": 5559, + "sha256": "944b4063096ad865f6454c5619b00d2fb7ed387b30c0f1e4d9f03a4da2932947", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetForeignExchange.json", + "type": "file", + "size": 935, + "sha256": "bab1b0c4d609ddb646b9812264f186bc665b1028157c7a866ff59a3dbc4848eb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetFutureValueAmount.json", + "type": "file", + "size": 1322, + "sha256": "22fc69b4c140f5fa65765c5adcdc2c6b87fdb24f4739c2ed87fc968d11727192", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetGeneralTerms.json", + "type": "file", + "size": 2088, + "sha256": "a396e41071eec5c55333503b81b3d1174fe2a21ccb0bae52cb293eff334d422d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetIndexAnnexSourceEnum.json", + "type": "file", + "size": 545, + "sha256": "cda51e92d02892e5391030a9f574baab28ce5984dd017cb3c911b19f7f8b0495", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetInflationRateSpecification.json", + "type": "file", + "size": 7841, + "sha256": "903adcc8804b96dd67b2cabbcadd96c113f646be32b99b966e11a99a22ce6755", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetInterestRatePayout.json", + "type": "file", + "size": 6443, + "sha256": "10f38e5faac58c812efd94435b9c04359347bac460bb3e158213666c71626e81", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetInterestShortFall.json", + "type": "file", + "size": 817, + "sha256": "b2f962a14f9dbde3682210a7aa75bf9c83c36787b21d1ee3202dc5a5fcd8b8f6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetInterestShortfallCapEnum.json", + "type": "file", + "size": 571, + "sha256": "0ec5b4108d3cad8f6814b51c737ad9104b15e1526f71937d9bde8a6aadc95536", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetLoadTypeEnum.json", + "type": "file", + "size": 1205, + "sha256": "5ab6596f19ba81af7e4697d2f52744e5213f87e9e0169f99b89e1cc51a2e8976", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetNegativeInterestRateTreatmentEnum.json", + "type": "file", + "size": 921, + "sha256": "cb2301a2a226cf304c8c38a056ceb8d7533bfb4593d55c3e87fb44bc334b0b20", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetNonCashDividendTreatmentEnum.json", + "type": "file", + "size": 573, + "sha256": "dd49ab407471684b5167ffab56202526df862f7912d85140ab4d54d17025d616", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetPriceReturnTerms.json", + "type": "file", + "size": 911, + "sha256": "803b26cf4db5e109a67f4b62f68e721f11692de8c876a3f4ab5b552e0f4a7bcc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetProtectionTerms.json", + "type": "file", + "size": 1455, + "sha256": "433d9d638bc19e7bbffa8c4e46fa6b82f1dc4f9847ea95a69a5995c3db0211f3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetRateSpecification.json", + "type": "file", + "size": 973, + "sha256": "02db8e5bf7ba4668862a340ed090829d4a0f46134a9ea4dc5fb68e1134db492c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetRateTreatmentEnum.json", + "type": "file", + "size": 582, + "sha256": "3c07d09cb0f29ef32ed5c5eaab057d92d17927832a91c7aabd159777af454e4f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetRealisedVarianceMethodEnum.json", + "type": "file", + "size": 750, + "sha256": "9194b1bbd280611111859a8a0457b27f64db8755c869d5ccdf8dc5223089235e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReferenceInformation.json", + "type": "file", + "size": 4055, + "sha256": "9d4aa308f617ebccf165d7ef4896300b86adbe0897fe85382885284b5c1113cd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReferenceObligation.json", + "type": "file", + "size": 2186, + "sha256": "261f08f5690e758dfa725ee8eec09a98ae8ae0e66f0f089a410f772f78899ff6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReferencePair.json", + "type": "file", + "size": 1935, + "sha256": "7ac138c44a9925e1300331e27fc1dd7e0425fd454a5a7e57a42ee5839c2d6c46", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReferencePool.json", + "type": "file", + "size": 531, + "sha256": "c3cca5c7da55a97ee59696dc7263394fc132c2e9b8c4e90713db41c461e4bafa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReferencePoolItem.json", + "type": "file", + "size": 1190, + "sha256": "de1e896ebce6d97efcf118b23ee230ff0d53085d11d284c42b605273017ffe14", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReturnTermsBase.json", + "type": "file", + "size": 2677, + "sha256": "550df68b76300eb90bfeb9cc5df9fe0a5c07d2695d36c13f73255d72cc26bd55", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetReturnTypeEnum.json", + "type": "file", + "size": 543, + "sha256": "d446cc11197a0e4b50f10b6e8aa9b00e76333e4aa473addf51cced0bae525534", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetRollSourceCalendarEnum.json", + "type": "file", + "size": 1138, + "sha256": "6973156e222379094022f7eeaa9c762a1666b925809997b900dff0c04dd6b84c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetSettledEntityMatrix.json", + "type": "file", + "size": 672, + "sha256": "6e64d9052df1fd5a9e4e907d05ff8ad89568b22e29d624415133e167e28c1313", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetSettledEntityMatrixSourceEnum.json", + "type": "file", + "size": 714, + "sha256": "fb5914b550e56507e1c50d19f514572e15bd6640c45df2e38233f8feaf1be5ac", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetSpreadCalculationMethodEnum.json", + "type": "file", + "size": 600, + "sha256": "c44de7e0e1caef7e1d33c0c29290b27a9716b20d81bc0d4701dbd85fd865083f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetSpreadSchedule.json", + "type": "file", + "size": 563, + "sha256": "e8299dbcf6c2af0c14b9e8ed9870b4fda0d70d0a34b7a73ccbc14fc6f4d976b6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetSpreadScheduleTypeEnum.json", + "type": "file", + "size": 531, + "sha256": "f61c72dcab8b4d1445275c270948a21bdd7bfe4ba95829f641093974985652c5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetStubFloatingRate.json", + "type": "file", + "size": 4153, + "sha256": "763566a57c558c03802e5a68e0b0dba93e58c5dd20eedce1e6a31ddb024c5491", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetStubValue.json", + "type": "file", + "size": 2751, + "sha256": "7df8f68548835049c1dad96588a99b251eb0ed6bd7fd40f671f149fc8e012422", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetTranche.json", + "type": "file", + "size": 1581, + "sha256": "4ed8c91716f255f3107c36f93232ef8437e6d495b0d15c4d76a6b9ca1641a8c1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetValuationTerms.json", + "type": "file", + "size": 1974, + "sha256": "67e616e3f352f8360a7a5227f1ded0d101c176af3d176b3edb91ef02c59ad845", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetVarianceCapFloor.json", + "type": "file", + "size": 1294, + "sha256": "456b1d24e769ac78dd743f3de16a0789906883f1288c1e0b97170cbe6a743be0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetVarianceReturnTerms.json", + "type": "file", + "size": 3886, + "sha256": "6fd68d1fca9b5c921ab108d9882efab33389cafd0db481ead0a276edf6858fc1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetVolatilityCapFloor.json", + "type": "file", + "size": 1408, + "sha256": "806604772aa2a52dcbe4741f217094433c3d54ffb91daba8271cf83710eadbe3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetVolatilityReturnTerms.json", + "type": "file", + "size": 3135, + "sha256": "ab99eeae4918900aecb8d23851685d22b70e9268b7f68d1f2050f2f93e6d4866", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetfloatingrateFloatingAmountCalculationDetails.json", + "type": "file", + "size": 2487, + "sha256": "b7e11a40b4f6dd7d4d7482791d8d626f7dbfe4dc9c07377cbc857f7abebde18f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetfloatingrateFloatingRateIndexProcessingTypeEnum.json", + "type": "file", + "size": 1277, + "sha256": "b86369b2d1b192c6f4cfbfb1dbe2019678ac011f84c645202c67860d63f08c4c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetfloatingrateFloatingRateProcessingDetails.json", + "type": "file", + "size": 1114, + "sha256": "a5cf5a9f05b2573ca38cc49e9402e3a235893ce3223f4a5f1c73ea05ca6c5350", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetfloatingrateFloatingRateProcessingParameters.json", + "type": "file", + "size": 1688, + "sha256": "4c57e3d071ecf8aa363f086d90346e63330005b5dda9b353415e583bd48ef85c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetfloatingrateFloatingRateSettingDetails.json", + "type": "file", + "size": 1120, + "sha256": "aa4fbecf131a565e43faba6b16c68aa369eb01defde41f4c58f6ccd519c94046", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetmetafieldsReferenceWithMetaFixedRateSpecification.json", + "type": "file", + "size": 412, + "sha256": "e364c79fed8e3b86f230d84d330457225d229d899cbc7178a2a933391e0a80e8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetmetafieldsReferenceWithMetaInterestRatePayout.json", + "type": "file", + "size": 408, + "sha256": "5c6bc7fd4e0994371f20aea7c19f438773b1867e51016ae69771af239d40d852", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductassetmetafieldsReferenceWithMetaProtectionTerms.json", + "type": "file", + "size": 405, + "sha256": "7977c47a7a68adb119faf1d4511a4f30e10382c720f7e712f7a5d7bb236dcbfa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAgencyRatingCriteria.json", + "type": "file", + "size": 1111, + "sha256": "14d6cacf4fe254b2e9fdca1ee4538b1230f80a82d87e6c2b87bbe4c31968b9cc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAllCriteria.json", + "type": "file", + "size": 336, + "sha256": "2b66adb00b4413a1592ada85f594ef47f73e5abb2c006df39ba8548f4a4407ea", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAlternativeToInterestAmountEnum.json", + "type": "file", + "size": 873, + "sha256": "22dd457e5cc0b9562ce21622a3fe6c459c39ec45c30e96bf639ac733c3ef3f14", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAnyCriteria.json", + "type": "file", + "size": 335, + "sha256": "11f13dcc0291cba1d0fd974d22817273c8558b05b2a65eaf5643f2cd79ab5c62", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAssetAgencyRating.json", + "type": "file", + "size": 367, + "sha256": "affe953d3672b5ff3df40ad9c806462131efd5ae8df2259c5b6e77e040fc23f9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAssetCountryOfOrigin.json", + "type": "file", + "size": 326, + "sha256": "a8ab26b2cd7368aed56a9667a7e92970419aff2e2350866b343932a6ec5af3ae", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAssetMaturity.json", + "type": "file", + "size": 542, + "sha256": "f53f6c98fce8ba9865fa7304f7ace54cebe628f885a5a6f0b24c432d68d2b231", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAverageTradingVolume.json", + "type": "file", + "size": 767, + "sha256": "e68715742fdf795065d574cb09f7839fcadaac3f61834bebe48a58195bf2503d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralAverageTradingVolumeMethodologyEnum.json", + "type": "file", + "size": 651, + "sha256": "383efb7752ba4500d548691953617d9dd7a11c61cc983e249e43f7b19d05388e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCheckEligibilityResult.json", + "type": "file", + "size": 1406, + "sha256": "5cb0b4098f5d5bf3bebf76fb2de85bd3082bcf1a03151785480690e647609432", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateral.json", + "type": "file", + "size": 2190, + "sha256": "65ed6c8348b176e1582b2e9c3a4ad1e888affc32640d1d5d057490b73295a342", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralAgreementFloatingRate.json", + "type": "file", + "size": 2960, + "sha256": "73bfc0e6ce98ee1756c6a82c1815a57f033e25e5e805079e5f7fe9548eac8e3b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralCriteria.json", + "type": "file", + "size": 3988, + "sha256": "bf43e5536c3d798562eb67472e0e6d4c781e96edcf93bee178359bdfafc4a16d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralCriteriaBase.json", + "type": "file", + "size": 1386, + "sha256": "5dd6f176ec3323cf9b8e849abc25bc58bafb4ce1aebe61a09a0dba95154989c1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralInterestCalculationParameters.json", + "type": "file", + "size": 2313, + "sha256": "34292532c7f843447f66b8b4d1c199618cd41c81e087d61e714c4d797af4df88", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralInterestHandlingEnum.json", + "type": "file", + "size": 679, + "sha256": "c683d1c2e6e9eb82b81719001fd7eab2d8d75ae99997863b90178c4481dba199", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralInterestHandlingParameters.json", + "type": "file", + "size": 4183, + "sha256": "2e765b0a85755fc5cf4d12e00e7194cb8d3d55d6175d62fc2c9255572190d398", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralInterestNotification.json", + "type": "file", + "size": 1213, + "sha256": "e88e365cce66c6fcd59c6505ee59dba3f7fe1d995c6684ee00d852b24b524f62", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralInterestParameters.json", + "type": "file", + "size": 1717, + "sha256": "f5d8e6efafcf8acc4ceb8d064daa1f8e871ed3e4808814391780d4d50326f0cb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralMarginTypeEnum.json", + "type": "file", + "size": 584, + "sha256": "e41f5d4c8fd20f626ab1b57ebdcdc46ba79a2a76a3c71ca22a67dafef43ab005", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralProvisions.json", + "type": "file", + "size": 966, + "sha256": "4ab7513e54dccaf5784410b3a7d0857dde55b5cf56a08f247e10cafe8cb2e658", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralTreatment.json", + "type": "file", + "size": 996, + "sha256": "65e1af36a4a913d1d785a1ec4ad4e21c51a06837f6656abdaf92e8460177fcc7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralTypeEnum.json", + "type": "file", + "size": 678, + "sha256": "53a809a1a4b3ec69d352d416a37c0c4201dea09a2b4e98711885bc1e45ef90cd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCollateralValuationTreatment.json", + "type": "file", + "size": 1832, + "sha256": "97d9c51d53f6fa9f1f948e369f90414562947b91843fe8e9ac5023b3b7690cf9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralConcentrationLimit.json", + "type": "file", + "size": 846, + "sha256": "9a344442ec96539b3bf1bb03d0fdc5321b1163467c25469dc0c31580c464c701", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralConcentrationLimitCriteria.json", + "type": "file", + "size": 1812, + "sha256": "19b6ed5b0fd16965a22778a2eb1e2c23cfb6dfdd3edb04fbabf2eb64d50beeda", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralConcentrationLimitTypeEnum.json", + "type": "file", + "size": 1480, + "sha256": "d94be7617e479d7a5dbafefde68c8231ca4c976bffc4a3fb731daae3903326ef", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralContactElection.json", + "type": "file", + "size": 619, + "sha256": "ab808583c3aa4a6591c3eb5941f362ecdd613b2ad173feeddc045de53492b719", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCounterpartyOwnIssuePermitted.json", + "type": "file", + "size": 412, + "sha256": "0f35f6fcaef23870eed2792aff126b7859f733501b049f360a3439b91155a54e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralCreditSupportAgreementTypeEnum.json", + "type": "file", + "size": 764, + "sha256": "27c0796caa67c2bd4e2dbabe8de6ebc726b459f3155731018bbf6d0f5448f00f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralDeliveryAmount.json", + "type": "file", + "size": 559, + "sha256": "05187370b194cabc27639c5c38733f84e8606437d5a449218f2f5cfaeaa6bd2e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralDeliveryAmountElectionEnum.json", + "type": "file", + "size": 647, + "sha256": "f3763df8d9aad9f3b0772435f6a8fe49889e4b502e669d8242f89d840c950a08", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralDistributionAndInterestPayment.json", + "type": "file", + "size": 560, + "sha256": "b910c827351df55588a2ca16b6f37d740cfa1f418b6b770dbe8b7e7552f18a81", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralDomesticCurrencyIssued.json", + "type": "file", + "size": 337, + "sha256": "1385173c91ff6f053c58182622e05af2f8b21fca12fd3b37eebc0df4a2812c49", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralEligibilityQuery.json", + "type": "file", + "size": 1721, + "sha256": "5ec074e64c0298af9921ff202de54f2783914af977cfddf878b5b5a79357db94", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralEligibleCollateralCriteria.json", + "type": "file", + "size": 1607, + "sha256": "1b2f948397f964b579c398472a56fd540c812887f220bd2c85c895a1d3f5e79b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralEligibleCollateralSpecification.json", + "type": "file", + "size": 1953, + "sha256": "baf00389f1e859fb05daac572f180221d276c19893b529bbf2028f85b65bf862", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralEligibleCollateralSpecificationInstruction.json", + "type": "file", + "size": 465, + "sha256": "ba9d1741ae9ee646e32d233ed646e9e3d2cf2e7da9896411e552d848cdda4f88", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralFieldWithMetaCreditSupportAgreementTypeEnum.json", + "type": "file", + "size": 282, + "sha256": "a933d8a47fd034ef45c1b5f3e781b0a24abc72d507f1a5765c5185c901dbbf1d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralIndependentAmount.json", + "type": "file", + "size": 1517, + "sha256": "9f3b907570e3d090954171dc4ddcf29a8e39829b0cf45de0b62c7e54fc7113bd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralInterestAmountApplication.json", + "type": "file", + "size": 690, + "sha256": "f1646936e94583b271975dc28aab55f4431aa2ace745a42f4445d67aa90e274d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralIssuerAgencyRating.json", + "type": "file", + "size": 362, + "sha256": "07900919eac00d373d562c253fd7f7d674ac88b18d413122b6be782d7b0df022", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralIssuerCountryOfOrigin.json", + "type": "file", + "size": 394, + "sha256": "1e9f51a9ceac6cfde5b3ba4e83604041be90ee88b48288f9cd67a9caf8965c02", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralIssuerName.json", + "type": "file", + "size": 266, + "sha256": "53b8753d16baf1d440593003c1a6570a8ad4173590d5fc589bd347e556e8d36a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralListingExchange.json", + "type": "file", + "size": 585, + "sha256": "953399cb03cd7e452b610edf6b2dfc445eeb3c4a3847e70e96503052b04faeec", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralListingSector.json", + "type": "file", + "size": 593, + "sha256": "335585932b830bb45348fee26e5100442bf3665c6ec5cb8b72b63e0bc8b686c3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralNegativeCriteria.json", + "type": "file", + "size": 265, + "sha256": "b55bcd5d1365ddd1977428e400048c6a0407fc86741c569598fa9f7563ba96a6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralRatingPriorityResolutionEnum.json", + "type": "file", + "size": 1229, + "sha256": "49c95109d1e2b4f3520d6d116455561870168744cb701e0c22ff257081e8ab23", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralReturnAmount.json", + "type": "file", + "size": 569, + "sha256": "ad04a95fe1ad143435c1f0420ffa9e44fdcce7b8d911f413bacb6f60fac4a94a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralSovereignAgencyRating.json", + "type": "file", + "size": 326, + "sha256": "8b2eb188b55f201a0ac5fce679474c0f551792e1d669fb12698736a7293614fb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralSpecificAsset.json", + "type": "file", + "size": 1036, + "sha256": "cc4f86019b934dbdef8bf597383a84b84312942103d6ed70b41a38ad4f6f358a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralSubstitutionProvisions.json", + "type": "file", + "size": 772, + "sha256": "24492adc00f5e0f7de906187ab7e19528e593035444f8b6f4699ad4b886abf47", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcollateralmetafieldsReferenceWithMetaCollateral.json", + "type": "file", + "size": 405, + "sha256": "59b02cd3a0e5101461c52d52652ca5cafd92e1c2d3d0c296277d2f6a104edea5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonNotionalAdjustmentEnum.json", + "type": "file", + "size": 750, + "sha256": "904e87d1a190fbc7e8a4cda2e99b0b1feeac99dfb55eeb5e134e9ca2e5274927", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleAmountSchedule.json", + "type": "file", + "size": 1610, + "sha256": "4424f938056eeefa7fdcf147ea20b48e1f44b6e08077c65e4264a269a0837cec", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleAveragingObservationList.json", + "type": "file", + "size": 453, + "sha256": "ca6487300631daf1d8f6489a7c828245c177d943deeac7253de86eec14a697c0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleAveragingPeriod.json", + "type": "file", + "size": 1026, + "sha256": "d2b7107b1c73988f286ea06d4deeb5b5f2b3188bf9d92ba7a51db8851cf316ab", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleCalculationPeriod.json", + "type": "file", + "size": 3392, + "sha256": "03a885b865d5e317dce7476650c85089d5183439805fbe26007196788cb32090", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleCalculationPeriodBase.json", + "type": "file", + "size": 681, + "sha256": "efd7a33346aa8f44215ad4bd94e48ffd08414c391482b2816a6592d0cafcea25", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleCalculationPeriodData.json", + "type": "file", + "size": 991, + "sha256": "f2c0440532df0caf87b0a66d0c20ac877f8605615ff2ca6500f66a19c7ca8e9f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleCalculationPeriodDates.json", + "type": "file", + "size": 4122, + "sha256": "0a3028d3af75f532f51130fde7c478439f3a0c573ae2b950b5a7c5784b6bbb22", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleDateRelativeToCalculationPeriodDates.json", + "type": "file", + "size": 602, + "sha256": "20e02b85226785695f63ec97fb8702934984974264c76c0914a1638d1155650f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleDateRelativeToPaymentDates.json", + "type": "file", + "size": 571, + "sha256": "ffee083e24bede90b66c975a349003538c4ac52a1594e5d6575dbe8417259057", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleDateRelativeToValuationDates.json", + "type": "file", + "size": 584, + "sha256": "bbd05ae7f431f1c24dcbf955c5a3ce2fa074377ac5d7d9378142d08e53dc4907", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleFinalCalculationPeriodDateAdjustment.json", + "type": "file", + "size": 953, + "sha256": "c8f0323285436a13b704b12023acc6c94e7ca55189e8e73943e2166038dcaa79", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleFxLinkedNotionalAmount.json", + "type": "file", + "size": 921, + "sha256": "76bf5bdb868179c23b0cf4a07a10206a5f7a481c111f0334d5755b47b73e3949", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleFxLinkedNotionalSchedule.json", + "type": "file", + "size": 2367, + "sha256": "3915b6acb2d9be03d3b415d8bc2291e257d416acbc4be03ca26ee5950da0491f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleInitialFixingDate.json", + "type": "file", + "size": 531, + "sha256": "fe40bec542283314cc1ac99fb527bfb19259c5bf9b8ff139f63bf5bf329e1993", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleLag.json", + "type": "file", + "size": 684, + "sha256": "12a19a19150152ce815c8ed2a471c91eb9966e4289636e736b0bdf06b3a273fb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleObservationDate.json", + "type": "file", + "size": 1098, + "sha256": "292d6c0d61498cbd8800f2cba6b424c3f962e7c5c83da8a15da84b46c798e758", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleObservationDates.json", + "type": "file", + "size": 1188, + "sha256": "09312c7086632b7c016ce001426270c6f302645cce95057395365952ee4af4e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleObservationSchedule.json", + "type": "file", + "size": 845, + "sha256": "763200826c547f115e0fff7bee6e55283bb49870d31185d552570dfcb2f20c41", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleObservationTerms.json", + "type": "file", + "size": 2476, + "sha256": "a2abbb5a117ce42260adb2f2e407c1f2af9e449ea2dcfcc66fc05c3bacfacb1e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleParametricDates.json", + "type": "file", + "size": 1828, + "sha256": "51e161ac45a7d444c0fcc25b108b66e0db675c51743775d8c3b153147b42f821", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonschedulePayRelativeToEnum.json", + "type": "file", + "size": 1125, + "sha256": "f88d013b26bdf0fd6511c6b131f817dbf7bc59c62f55b3fe7088bffbe983252a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonschedulePaymentCalculationPeriod.json", + "type": "file", + "size": 2281, + "sha256": "fda1e84191364c967031668ec33c64b56bd2957b7db983562347f5dfb8acc37b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonschedulePaymentDateSchedule.json", + "type": "file", + "size": 815, + "sha256": "640e086ebf8f4873781c8a032e2e0a71c4afb29604cdfe7526780feae9c3018c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonschedulePaymentDates.json", + "type": "file", + "size": 4495, + "sha256": "ea0e6230e86e0f97c633298f311ec9902eb5f272364dae845b8fd393646c1bf4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleRateSchedule.json", + "type": "file", + "size": 648, + "sha256": "a4ab29b4d07646f498af499714915bfae6f90692e4db89c085a1f00821901239", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleResetDates.json", + "type": "file", + "size": 4474, + "sha256": "41fc1f84cfcb1c392bd13e7f690a85c915c44a5d1182b0f08e0e4309d1cdfe6d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleResetFrequency.json", + "type": "file", + "size": 1438, + "sha256": "6ba4d2110b25cd268568b43d0d987dc4f33a899904c84b13e26c2f4ca9e1fe42", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleResetRelativeToEnum.json", + "type": "file", + "size": 631, + "sha256": "a1491062218d15c6a3065649371424504c5b0b0e7e77a46cc116dca5c9b1b94a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleStubCalculationPeriodAmount.json", + "type": "file", + "size": 2337, + "sha256": "abd5d3da5be9666db183e8b9bbad3609e19cf4ef832313426a8638740563ec81", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleStubPeriod.json", + "type": "file", + "size": 2319, + "sha256": "8fd7cf52d3a7847b831cdbe18158d9afaf39020aed3518cb3caef62bbc70ccbf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleStubPeriodTypeEnum.json", + "type": "file", + "size": 879, + "sha256": "5ff8de6a67c65e75bd288a9d3621d51d99ab47c31fac09131f018e77da1bc674", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleWeeklyRollConventionEnum.json", + "type": "file", + "size": 1349, + "sha256": "85a067794139e4f24301aae5bb5830509d41d4feeab382ecaaf5afd52a2b8218", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonscheduleWeightedAveragingObservation.json", + "type": "file", + "size": 949, + "sha256": "70aaf237668ce3ecf8ab2dcc32faaa2a2263b39ad27413bc1cec21c36fc6fbef", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonschedulemetafieldsReferenceWithMetaCalculationPeriodDates.json", + "type": "file", + "size": 422, + "sha256": "031e7fbb627895ad9ff8115482c2275b291a86b700fc1c61b12c7cf354e14c6e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonschedulemetafieldsReferenceWithMetaPaymentDates.json", + "type": "file", + "size": 412, + "sha256": "c123f9e84686253ce5b0ac1b5a0f86843b9cdcea1d22fa1d30ecb3777301fb21", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementAssetFlowBase.json", + "type": "file", + "size": 1060, + "sha256": "ebbc37ab0fbca65d99efd8d82c80df3a7e244bd3f26270634439f7963535ec8c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementCashSettlementMethodEnum.json", + "type": "file", + "size": 2252, + "sha256": "374d07ef20af455bb589d1a8d30a6ceaaee2fb4a066cd799cb955826cd3ca009", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementCashSettlementTerms.json", + "type": "file", + "size": 4922, + "sha256": "f7665cceaa7fdfcd0596180920cf1d3cd2250c46d374747f8fe8ae2e8b549ac2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementCashflow.json", + "type": "file", + "size": 2144, + "sha256": "8255809222a17ef71f1a5b83845783141f386a2ecfe2b82589a701473a8aa237", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementCashflowType.json", + "type": "file", + "size": 722, + "sha256": "6fd711ef52cb643428445144234fa0ec83fd76c109af6dafcce78e224c66dd5e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementCommodityPriceReturnTerms.json", + "type": "file", + "size": 1058, + "sha256": "0f869d22cbf45f265fe5cd62c3c4d6c7529ab996a54c5fff7c21baedbec38e84", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementComputedAmount.json", + "type": "file", + "size": 935, + "sha256": "4ebe16a692f42f14d2953d35882c8670001dc6ad40e8047e4b6d50e28489999d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementDeliverableObligations.json", + "type": "file", + "size": 9393, + "sha256": "29da4ca1b1813e6d9725e2ac8c71459f47ea777b885a1963ae24a0951d9f77d2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementDeliveryMethodEnum.json", + "type": "file", + "size": 919, + "sha256": "9d79caa65e31fe7962168131b77749dc25dbd594c8bc63b2d9ef544caa1e874d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementFixedPrice.json", + "type": "file", + "size": 338, + "sha256": "52eb55aeebcd18e0699c3c6eaab78d36a724eb24018f8333de96b83b18364c3e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementFxFixingDate.json", + "type": "file", + "size": 4160, + "sha256": "238b57a6b775fe8b8e1580892496415754bfea0c805be6c08d74ed9dd20d3869", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementLoanParticipation.json", + "type": "file", + "size": 2275, + "sha256": "f5ca3281a25c8715a1c9253c4806b3a2f7e41a93e0226f1533c9df5bd8202409", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPCDeliverableObligationCharac.json", + "type": "file", + "size": 1612, + "sha256": "4844ca9e7bce5a8693ecc87976ce15a04e25be9faf35dc66e7e47f62a1016153", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPaymentDetail.json", + "type": "file", + "size": 518, + "sha256": "455f8c074e5c76c9ad85dba9526c8ebcc28685c00dabe218aeedfd0cb3421de1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPaymentDiscounting.json", + "type": "file", + "size": 666, + "sha256": "458a08da670d8e3fced4d8d88ca39494defb4b140c8cb0e607ee7d7c724b346d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPaymentRule.json", + "type": "file", + "size": 524, + "sha256": "5fa5301bd7b3b7654b7dda155f5f4731bfb1c0acd8c243d43ecf742ffb216a24", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPayoutBase.json", + "type": "file", + "size": 1419, + "sha256": "a3b0f74efe4b80ac61e9d0f42ac1a48f0fdf54b77dd8824759e7661a5cb242bc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPercentageRule.json", + "type": "file", + "size": 621, + "sha256": "ba374385fa716644dad62b34da95ba5fa2f9a631f3c55057375559784208676c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPhysicalSettlementPeriod.json", + "type": "file", + "size": 928, + "sha256": "852131c8d46c5c409eded3eff27f74a1c0b6c698b19d4553356e4248dbf23028", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPhysicalSettlementTerms.json", + "type": "file", + "size": 3893, + "sha256": "c1dd61829f305ab8719380b122d9e13ab283ededadc8746de2ddff77e7e038dc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPricingDates.json", + "type": "file", + "size": 702, + "sha256": "6cf3359c3aa3bc047081693252f45f266f1355f8b4519f6e8b49b1663b1700ad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPrincipalPayment.json", + "type": "file", + "size": 1241, + "sha256": "66bd761bd41e578848cee4a037a6d3b09f7c48d7452b7aabc22ce80b7ec3fbc8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPrincipalPaymentSchedule.json", + "type": "file", + "size": 838, + "sha256": "567cb0c67e7cb7fa0c32312af9d585734148b04c6f7aa1242518ccacc61cb117", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementPrincipalPayments.json", + "type": "file", + "size": 1650, + "sha256": "d72696f77b0968b7ea300fce5f5e0f5eaa120fd319d1fff29aecc64ebeec4810", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementQuantityMultiplier.json", + "type": "file", + "size": 829, + "sha256": "0052119de5851c8e1e9d750993b5e14d6563568a0bef3562f5b9c295655b596e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementResolvablePriceQuantity.json", + "type": "file", + "size": 4123, + "sha256": "b5aad833afb4e49965611d720ed62157d62e3e71b18b7eb213118d1fdad79f09", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementRollFeature.json", + "type": "file", + "size": 1687, + "sha256": "39892c1998d8c472e379e7d37f887c57be66d738ae93944205895cfd3ff9b112", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementScheduledTransferEnum.json", + "type": "file", + "size": 2071, + "sha256": "511e3a9c7c252af603c7554b78e7a98d74c6464b0b127dd08ffa8798a7ce49ea", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementSettlementBase.json", + "type": "file", + "size": 2122, + "sha256": "f74ce8deda8bc5091f494ed2995f3704388b4134edd06bf0edd740e22e878405", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementSettlementCentreEnum.json", + "type": "file", + "size": 570, + "sha256": "29658a74f7d4f142252557209b94abe8884017fd48ff92648742ee70191830cc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementSettlementDate.json", + "type": "file", + "size": 3704, + "sha256": "de065525486f0d0173a5d8a50b9dfc2c96515b63304e1ff515f4382fac09d976", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementSettlementProvision.json", + "type": "file", + "size": 485, + "sha256": "457dcc00dd3a54669f735ab3a0dc1b9076f66778ad1782ba89626c063240b2a0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementSettlementTerms.json", + "type": "file", + "size": 2823, + "sha256": "11c53a03f4bb0d0dd5ce270aad17ed9a8be97c05c173284f3cb587d36031ca07", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementSettlementTypeEnum.json", + "type": "file", + "size": 849, + "sha256": "bf8d13092e41c05aa1c785a17adff336a77aa90d78fccaab2ca0b6816c9222d7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementShapingProvision.json", + "type": "file", + "size": 528, + "sha256": "16875559034487e73e49cf107ab005985c09b81307823ab6e1da5d7838c37772", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementStandardSettlementStyleEnum.json", + "type": "file", + "size": 940, + "sha256": "eb7f0e645b7bf843863044fa19f11e4f9e00b83a17fe6673843b9d7aa3036893", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementTransferSettlementEnum.json", + "type": "file", + "size": 894, + "sha256": "4f750e1142a931eb43debe8f7ec96c62a5296d5920476aed0d39a74613ef5f6c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementValuationDate.json", + "type": "file", + "size": 2704, + "sha256": "3d15d588c305ed744e1a7c7e5f5f4141b1bb962a7785b0a524465882533684dc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementmetafieldsReferenceWithMetaCashSettlementTerms.json", + "type": "file", + "size": 421, + "sha256": "70939f5f3f8b8af8284fb4465636793f75c95a292b0ff4bbf58772f297228925", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementmetafieldsReferenceWithMetaPhysicalSettlementTerms.json", + "type": "file", + "size": 425, + "sha256": "8ad1fc2e9389baf623315075495f9646ce5507916425def205889ed0dde1eb91", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproductcommonsettlementmetafieldsReferenceWithMetaResolvablePriceQuantity.json", + "type": "file", + "size": 425, + "sha256": "71963e3e2a1ecd1e8cda3c71c6b11651ddc53b8fb443ca45e643e4a08573275b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAsian.json", + "type": "file", + "size": 723, + "sha256": "cc2df015aca141740db7565a3d8033cd58a80771bcca89ccdaf9237501ab1ae6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAssetLeg.json", + "type": "file", + "size": 778, + "sha256": "a1d3667822762e1298487f470f84c5a77a25de3c567d79f3895d766b84fc89b3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAssetPayout.json", + "type": "file", + "size": 2742, + "sha256": "80b357bc2e4293031db656ccd844742e98c3e50c67c1dc31da7613ea8d21f262", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAssetPayoutTradeTypeEnum.json", + "type": "file", + "size": 599, + "sha256": "d3c5905edce5dba08797ec0a7b25ed7c879e7ec2635ca10a872b179aa1f3f461", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAutomaticExercise.json", + "type": "file", + "size": 655, + "sha256": "6bfbddda9ef780f8b5ff25b349193d17286e1a0b2bfe4ba7c00774e3089db04c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAveragingCalculation.json", + "type": "file", + "size": 653, + "sha256": "82a85675a34cb75ef3f39f38757dcc43b35ede51c02de548e47c04fc0253ff4f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAveragingInOutEnum.json", + "type": "file", + "size": 680, + "sha256": "5fd5a5735c07fba0cfc8581a6e21fd19f9154853614d5d40c8faaea58af8d30c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateAveragingStrikeFeature.json", + "type": "file", + "size": 791, + "sha256": "27214aa3a7918486858a67294854c4b94702da6e04ea02d4314a2899ec167c55", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateBarrier.json", + "type": "file", + "size": 433, + "sha256": "a97d41054d30bc793c4c013e3b12ce848fb8a8712bd21eb6211ef6e99a5d5121", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateCalculationSchedule.json", + "type": "file", + "size": 618, + "sha256": "57db4d3edab0a7d26d32d52ca09fe8b39b378b1367b091d668494549ccd4ba8e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateCalendarSpread.json", + "type": "file", + "size": 278, + "sha256": "5ecb9fa753e15d8b6869c9ee9b66aed56de51f8368c27b0af30d6e71e2d0484f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateCallingPartyEnum.json", + "type": "file", + "size": 914, + "sha256": "18f707cf0ad6255ef8f2cc2ca3e9cfd46ffb40cb752cfdd1094abab345730d38", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateCancelableProvision.json", + "type": "file", + "size": 6122, + "sha256": "f3f41474562a152b0219bda129f3c3da60c23554fe2374229aa705b1ee3e3baf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateCancelableProvisionAdjustedDates.json", + "type": "file", + "size": 502, + "sha256": "964f1efe53e5d13b53ffc9d243dc373747bf7742a9b1026bfa14bf657abe932e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateCancellationEvent.json", + "type": "file", + "size": 881, + "sha256": "3d17088886b3c848417412c575646e2cd9709609d6feacd9b7aa43680cb1c417", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateComposite.json", + "type": "file", + "size": 1167, + "sha256": "9b6553b54267d3a43ba135ede38b40030deb1ed357f4c9a1c448c12722430582", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateConstituentWeight.json", + "type": "file", + "size": 886, + "sha256": "1209f43d673f9e572d5170c99252a5bbaf8c97f8714e9ffa7edbc9c0ab364289", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateDividendTerms.json", + "type": "file", + "size": 912, + "sha256": "fd790e4b7e4c3a2f8fadb2d2358cb04718fb815fc14c4d388430bbabde2c5065", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateEarlyTerminationEvent.json", + "type": "file", + "size": 1810, + "sha256": "1769fe88eadd19eba1fd2d4a2efcffcf6c50d22bad590873c16636f9bab80807", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateEarlyTerminationProvision.json", + "type": "file", + "size": 1254, + "sha256": "c8c950d2310624ce4476bb9b2630886b1c32b8863ac64d13f3eb8d408f214b72", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateEconomicTerms.json", + "type": "file", + "size": 2851, + "sha256": "9c8fd63c439e6a4fa6e2b735ad8aeb95d52d59dc785ed1b6b39d73dc449c9a65", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateEvergreenProvision.json", + "type": "file", + "size": 1819, + "sha256": "74765fc2a110013ccdfa582fa73b831ee53b1603959b30f33381fd0b1e413b33", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExerciseFee.json", + "type": "file", + "size": 1826, + "sha256": "0ab5e390cc4f58d4c5b6a3c537a7f2b7d4e9d69411bbb7d973d6c9fe16639938", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExerciseFeeSchedule.json", + "type": "file", + "size": 2027, + "sha256": "51d182e97055d7b36cdcc48e6bedd70d7114e98da32b5f1708ac5cd2fe84c185", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExerciseNotice.json", + "type": "file", + "size": 1358, + "sha256": "529eef0d23670e052265cb25e0a212032e9e21b4ef39a1a1d673c1d06a76e2af", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExerciseNoticeGiverEnum.json", + "type": "file", + "size": 845, + "sha256": "1e40042e885ea646347600e33f7eecdf6cb019d22be6a3d22432e0cf2fc0bdde", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExercisePeriod.json", + "type": "file", + "size": 834, + "sha256": "ffc64dc5faa5f2a9b7b5db1cdead1205b018d14474f34a3256c8341fa6c950c6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExerciseProcedure.json", + "type": "file", + "size": 2272, + "sha256": "56673a88ab2088c8ecc852c1288df32bf2da48eee1220fe292a78644ac6c6ea2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExerciseTerms.json", + "type": "file", + "size": 5592, + "sha256": "fca128bcb3f832e1eca96ad2446c056118811ea3eb55815a0e306c4ff0c576cb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExpirationTimeTypeEnum.json", + "type": "file", + "size": 1310, + "sha256": "8a38eac13314361c1b43d7d9efaf8205aedae236c56d5232c83861532ac66ba2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExtendibleProvision.json", + "type": "file", + "size": 4982, + "sha256": "72ed5b55b4fab77ec13479b9d6b8439ccad075d3ce5e29c0bf6c857e38832b7f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExtendibleProvisionAdjustedDates.json", + "type": "file", + "size": 508, + "sha256": "df50d086e9a3cc833db0acb331d5e0dd9af37c5327255fe3a6c5d28afde70d96", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateExtensionEvent.json", + "type": "file", + "size": 813, + "sha256": "36039c6ae923095176fab93f087268238734ad27ef688c4e4bcb284207ae0ad1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateFixedPricePayout.json", + "type": "file", + "size": 2302, + "sha256": "0d7334a353b34e7e9447d835176bc72590632d7918c106e7abdf949b3ec4e9da", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateFxFeature.json", + "type": "file", + "size": 2041, + "sha256": "b37f8cfb0d1e43f7a06c766fa572160bc3af76187b8828fad1705e55916798ad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateKnock.json", + "type": "file", + "size": 459, + "sha256": "f1e956e44a08d510b78c153cb4a535edd6dfaf25ddb5519a5ce684d475f78c39", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateMandatoryEarlyTermination.json", + "type": "file", + "size": 1433, + "sha256": "d64538da553c3ea6560263f01032516ea84b59d21b06eb56737bff2d7101e1b9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateMandatoryEarlyTerminationAdjustedDates.json", + "type": "file", + "size": 1239, + "sha256": "9e8132d9232a493f2f36f63e52ddc77d92c2eb87d90ae81c9f061c36e19d5f7e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateManualExercise.json", + "type": "file", + "size": 1081, + "sha256": "e58c970e0cf50b6b61e2524c853d42cd70b5bfd61ca81b197fbcdc96fb0d9828", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateMarginTypeEnum.json", + "type": "file", + "size": 592, + "sha256": "a6d6f1cda2af735db6285f3431fb78c4c4a16c58482de54af55267468d69bad7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateMultipleExercise.json", + "type": "file", + "size": 2576, + "sha256": "d4ea456357bc33ce5584508e0fd3d44d7a8ce8116a3fb37ac6e8eaf86342d5fb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateNonTransferableProduct.json", + "type": "file", + "size": 1370, + "sha256": "a5fa62fb063ff6be535be96682037ca1bc54dfb72c8d0581f2e21fc47dc55529", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionExerciseStyleEnum.json", + "type": "file", + "size": 716, + "sha256": "265ee18bc5fecc2ff20b217df500bbc778e4414bbe3cb7dfbee41435ad1aa519", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionFeature.json", + "type": "file", + "size": 1451, + "sha256": "b5675784af124d2dc99a93561c81dfa2e7881b2cd06348f553ed8b5d5b82491a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionPayout.json", + "type": "file", + "size": 3939, + "sha256": "68d8165c5589be4a723c7e513fe701fc742894d8b9e6d3430b1028e826409ad6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionStrike.json", + "type": "file", + "size": 1139, + "sha256": "dbf7ca874a0b10b245a409bfbad35788aa447c3ef4336cd4293d25035c6d28a4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionTypeEnum.json", + "type": "file", + "size": 950, + "sha256": "1b4e79cdd4362f9b70b979a938b3b9390ef0467f4b3b7f71ec6e9c7fc82a03e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionalEarlyTermination.json", + "type": "file", + "size": 2690, + "sha256": "9bde409a9ea7339521e7b7dc0846334f153ec6834b67a849c88822fd0c903a80", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateOptionalEarlyTerminationAdjustedDates.json", + "type": "file", + "size": 534, + "sha256": "9e0c7e67b142421f66f31e038e439881b0c781cd31f57ea8b3629912cdf37fcd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatePartialExercise.json", + "type": "file", + "size": 1799, + "sha256": "ff86f9d7032b7a0c86aeb1420253cb589f8f6637231cecc5a5e8c3085a565dc9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatePassThrough.json", + "type": "file", + "size": 416, + "sha256": "adffd187ccf001a31c471a1a8c607d0f752e7dc832940d5e32d845ae29e76d72", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatePassThroughItem.json", + "type": "file", + "size": 656, + "sha256": "591388071f23a19449d0b75e6e539033d94295e3e660192c9a3b90e8ef1a264e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatePayout.json", + "type": "file", + "size": 2559, + "sha256": "502e3cf1de7061feaf6dd7d4afef4aefe837228c48cf8257dbe61354b9ccd27b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatePerformancePayout.json", + "type": "file", + "size": 5090, + "sha256": "e290cc09416d89aa14e3d762e604e98b76c798f3599b08d7b0b99a62f9527779", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatePortfolioReturnTerms.json", + "type": "file", + "size": 3677, + "sha256": "8f3647b1ceafeb94accde1a6ab499c0100f11a91721f4626d2831548c7180b11", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateProduct.json", + "type": "file", + "size": 666, + "sha256": "2136af279862736eaf2c4d0c8b769b49ba40bed3352dc1f1ca7327f0cb77794d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateQuanto.json", + "type": "file", + "size": 1133, + "sha256": "839d252ba0b6bec24f496bd3a91f11b60e4a0544c1ceed3d1d68ffd279f020e2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateRepoDurationEnum.json", + "type": "file", + "size": 631, + "sha256": "bc1154a0eddd08ce469172dd75ce2c65b5f2e9a50315aa1266e536409ec6460b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateReturnTerms.json", + "type": "file", + "size": 1180, + "sha256": "8346fd647e3bf568593b5681987e4bf83f0e484f1f42d1ef6d929bedb4cfc1ea", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateSchedulePeriod.json", + "type": "file", + "size": 1050, + "sha256": "37f9c5a2a49ad12623e3a90b8409e75dd86935f7c9ae95a894a262d09907c8f3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateSettlementPayout.json", + "type": "file", + "size": 2684, + "sha256": "8c1890b6f3a6cbf47c41a3fa7da1be80f8cbe7a885fde742cc1849dedd8640f9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateStrategyFeature.json", + "type": "file", + "size": 495, + "sha256": "0cf0bb86780a4509316ca3273f567d40d7494df3960be0c577feed74e716a55c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateStrike.json", + "type": "file", + "size": 611, + "sha256": "b33fab792e6428ee0a86e424cfd6dea996c83e02febb5c535bd80edfecafd6bd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateStrikeSchedule.json", + "type": "file", + "size": 615, + "sha256": "09192dc60be600bc7eeb362ba97cb22f330fa89107a33447d99ae0d0c5e910a3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateStrikeSpread.json", + "type": "file", + "size": 578, + "sha256": "48230f6fb6fa66a230c979ba031d9258d1a29372fdb5fc3aa042b86a10f6c80f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateTerminationProvision.json", + "type": "file", + "size": 1248, + "sha256": "6ca14769385e3fb2f033a9b9d3367131e1ef182b3d8d3a7f9413f78fb9be0f39", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateTradableProduct.json", + "type": "file", + "size": 3237, + "sha256": "9c73608b1438c979a9e5c99fbfce1de7b38162ad1077a0d1fc685466e707e116", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateTradeLot.json", + "type": "file", + "size": 1357, + "sha256": "84cef6c4a14d2364e2d6aa89eb66fed2a944baaac5e2a5a5f233ca698f2f79db", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateTransferableProduct.json", + "type": "file", + "size": 1327, + "sha256": "1980f1c9c39eb93faaff86c75b31462a62a0551c68c1fb07bec47a0a6076f92a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplateUnderlier.json", + "type": "file", + "size": 772, + "sha256": "beb5b13ec93b59872d39300af46c09216a5f60effa62e2cb27b2ce9ff944de69", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatemetafieldsReferenceWithMetaOptionPayout.json", + "type": "file", + "size": 405, + "sha256": "fecb6b4250063743fb6e9e6ff5687bd916729da9a6d4cb812f41bcd9c33f4e0d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmproducttemplatemetafieldsReferenceWithMetaPayout.json", + "type": "file", + "size": 399, + "sha256": "a16476ed10ed6a5b8a6c4b88ce0f777c96293b3ca2bdff4313b35770753f9654", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationAcctOwnr.json", + "type": "file", + "size": 184, + "sha256": "58f5f4a6559a1f2c1ddd929876b979d464f7007b7c81d566772e0b2870140803", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationAddtlAttrbts.json", + "type": "file", + "size": 353, + "sha256": "0b3652cb5b3f93bf92178a69007ec0369daf88a55447835c40db88b46bcc02b6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationBuyr.json", + "type": "file", + "size": 186, + "sha256": "838c9e11b8763a10d558958f6347c06ea17e187b4756d96e5e9a6da3b839616b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationDerivInstrmAttrbts.json", + "type": "file", + "size": 653, + "sha256": "6da5ced16ba84126a9c563ca878c998c819af7dd563a5d81d652d5d43759d9dd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationDocument.json", + "type": "file", + "size": 200, + "sha256": "c333bab72bead79e71f0275351a4f938ec836797cf349c1335b4bbed2c642cc7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationExctgPrsn.json", + "type": "file", + "size": 187, + "sha256": "083273b99edd44826001e29c021772a123f4ea3fe839fc8e92c9356c0d10d4e6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationFinInstrm.json", + "type": "file", + "size": 187, + "sha256": "6a8adb921b021a2aead247e3b992a061929f336ee63eaaba9da2b7b7669bb51c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationFinInstrmGnlAttrbts.json", + "type": "file", + "size": 500, + "sha256": "410bd07099cf11b9970994380010eced50dd15b85269a790b57e359078df729b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationFinInstrmRptgTxRpt.json", + "type": "file", + "size": 196, + "sha256": "7251761d44121df613e6d7074b5ee830b10fd5ab1c8d7de697ac4a89be71bee6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationId.json", + "type": "file", + "size": 179, + "sha256": "325f56fbb307302246efd6aec01abd1a9fedd6209f4f141b0046438b162c5935", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationIndx.json", + "type": "file", + "size": 180, + "sha256": "efcb112199af3003d64091995e8fe0af10bd24f38a221b021d27534beb988041", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationInvstmtDcsnPrsn.json", + "type": "file", + "size": 193, + "sha256": "2a5a1dbf63cb9ded59a93eaebe0ae86faf5451e908490dfe12f5db258457363b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationNew.json", + "type": "file", + "size": 1804, + "sha256": "ea829bb930a236a8bde64295bfa464373794f686c222497b31f9b2a2c9233e72", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationNm.json", + "type": "file", + "size": 329, + "sha256": "995e1e888bb5d7bb806ab6558298a94291f49a440d76cee2130898766a2ed877", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationOrdrTrnsmssn.json", + "type": "file", + "size": 197, + "sha256": "ce768e446f66792c296f7a8227622241e1b9c273f6cd65ef3c19890a71ec93a6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationOthr.json", + "type": "file", + "size": 650, + "sha256": "d77abd4cf89619c31ec8c30d809c804d3c54ba1daf7cffc71db574fb4f2eccb3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationPric.json", + "type": "file", + "size": 293, + "sha256": "ab43d67c81403a0cf52bf7e0fad1f399d6ea481fa108a6ab922a5ad0f9a2e482", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationPrsn.json", + "type": "file", + "size": 335, + "sha256": "afec42f7f192701a7968e703c34308af2b3912151d4c2ca5e4b530a49d82df5d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationQty.json", + "type": "file", + "size": 181, + "sha256": "3f8f8281c5088443827dcaba9fa22c5c611ab94322bb113be5a0ff7f37daef65", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationRefRate.json", + "type": "file", + "size": 329, + "sha256": "48dc6ba59d6bf49bd4d3960ca7e9fef3521871f134532e1b7292bc3026c864f5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationSchmeNm.json", + "type": "file", + "size": 186, + "sha256": "d3d3fd778c394f612473113177fd090ee227b8b51644d89d3cb514bb3d955a13", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationSellr.json", + "type": "file", + "size": 187, + "sha256": "8f6343308054aa924f7b0fe8f8f449df2d884dd67a52fad1c5621accb5e70fdc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationSngl.json", + "type": "file", + "size": 328, + "sha256": "2d9741c454f135fe9840a631280c0fabec1d99f5bfd2ade2fb652ab2b2e3015a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationSwp.json", + "type": "file", + "size": 330, + "sha256": "800369c56643c2030f1f4df48744335ecf63e817012ab892ed59a1a35e3a8671", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationSwpIn.json", + "type": "file", + "size": 183, + "sha256": "69cdc1f6cb6d050b8572eb00d131be3d289981b3fe6ceb5612efef11ba728fa0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationSwpOut.json", + "type": "file", + "size": 184, + "sha256": "a49cc1e1d5481aaacf2d817bad49400105708146a3584dda083221c352f3ce04", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationTerm.json", + "type": "file", + "size": 327, + "sha256": "99cd8c831dfeecad636beb60233cc2ad2bdcd185a08bc80fa6d80afa4618c28b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationTx.json", + "type": "file", + "size": 1037, + "sha256": "a8b4cf72c1fd869b9f0ea263d2293b7d5b5a8e92fc192628b949c05b76821f89", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/cdmregulationUndrlygInstrm.json", + "type": "file", + "size": 190, + "sha256": "064d468d63567c41cf853c2d110464316d9a797d21b2c4bd7eb21b90bf58c7da", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/comrosettamodelFieldWithMetaString.json", + "type": "file", + "size": 253, + "sha256": "4539bba59c8752114f30f32986e2c08d9a12af6ab1953e16ece6f663f3735a77", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/comrosettamodellibmetaKey.json", + "type": "file", + "size": 247, + "sha256": "e1859819d6aa428364e041896dbddd7efa55d953af39d6db449a83de774cde8b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/comrosettamodellibmetaReference.json", + "type": "file", + "size": 253, + "sha256": "f5f92f03549e76097a8a206d537541ceb3521596ffdfe93b7b93a71ed00644b9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/comrosettamodelmetafieldsMetaFields.json", + "type": "file", + "size": 600, + "sha256": "8d45e03945621c98fc64e740dd29b6423b84dd1a308c475a9b4abd6f2a215758", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/FINOS-CDM-6.0-d07/comrosettamodelmetafieldsReferenceWithMetaString.json", + "type": "file", + "size": 396, + "sha256": "478fd14fa557fb503c985ade8c8c24fdfde747a0d7ee5cc0200a1b370c4e82ff", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/DocumentResponderMandate.json", + "type": "file", + "size": 556, + "sha256": "da446b36f4fbf83aaac7201996c110439c216a217867fa15d25417e6cede0480", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/Mandate.json", + "type": "file", + "size": 68828, + "sha256": "bdf36e3304576d401a9538026cc07e545a96cd2ba00e835e1e5ae21684a68315", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/MandateActivated.json", + "type": "file", + "size": 641, + "sha256": "a0acc671bc53c220b00deaf6012b98103298e34ee84d24dbca45dad314b357b1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/MandateAuthority.json", + "type": "file", + "size": 935, + "sha256": "994cd9d6bb3c798a59ab75ca860c7bea23cb51b5f4c807326bf5b1f2e1a52ddc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/MandateAuthorityConfirmed.json", + "type": "file", + "size": 720, + "sha256": "ca3321d45043b3d1ae24d95e528522bcf5febce570e9865d33775b9694005461", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/MandateTerminated.json", + "type": "file", + "size": 1090, + "sha256": "9134015ae9798754d1c849d5f7477d384ec42e4df8e5e045a11888eff9a5dd06", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/MandateValidation.json", + "type": "file", + "size": 1771, + "sha256": "1020c2539f573c9501aeb88ba4d396648cd4e025cbb08953ebf96e3cbd59a011", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/OperationMandate.json", + "type": "file", + "size": 1007, + "sha256": "9368396e650e00149b3ff4e248ba2ddebf99c8c7d34f8a90235b0fc1957d8a64", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/StatusActive.json", + "type": "file", + "size": 395, + "sha256": "f488ba1da0b47dd9b2ac4c930cfb6ec90cab3abd5632a58ae5f0e22894331f69", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/StatusAuthorityConfirmed.json", + "type": "file", + "size": 405, + "sha256": "caf7520062945bb46dbda5431093ad9071f8d838726d38060dce313319b71542", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Mandate/StatusTerminated.json", + "type": "file", + "size": 437, + "sha256": "24b304154a02a9d0e87cc58d05026a86ebe2b4d7b0f69cfdd3abf1d9cd7f3268", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/AddingParticipantRequested.json", + "type": "file", + "size": 611, + "sha256": "942c04d25b29b8ce12255a77873f736ca051134681d91edcde39b4b13d385bcc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/AddingParticipantResponded.json", + "type": "file", + "size": 328, + "sha256": "42b02bb041b0acd03d3c27d6bcdd8adcbee54cb3c9da3c9a20a38ce7f1f29a83", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/Agent.json", + "type": "file", + "size": 191, + "sha256": "7f259e054377f3d21584cb8a8bb004e7755ea5f11a668e6805aceaf45f64a077", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/AllParticipantsReady.json", + "type": "file", + "size": 117, + "sha256": "45cc45f85682370af25a7a562713264316ec49d7fb1c516e1e153b5567863fb5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/BootstrapFailed.json", + "type": "file", + "size": 213, + "sha256": "d18e8ded6b762c80f3ef6e6ab1c6ddd128c2ee9d8f6ddae9e81d9e788fdee246", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/CallOperationAccepted.json", + "type": "file", + "size": 548, + "sha256": "4e71334f6f71e664fb592d2fdf6bdf79cea474f4e4cbe5c6d110856092ad2943", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/CallOperationFailed.json", + "type": "file", + "size": 745, + "sha256": "7ca31e38e2de977833b39a628122e878756f53cab48cb9777e848b088bfd4db4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/CallOperationRequested.json", + "type": "file", + "size": 795, + "sha256": "c013d30c147d2150b681b6e99fc209c5ba3df20ac7e32c500e449fb6dde5ee7f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/CallOperationResponded.json", + "type": "file", + "size": 449, + "sha256": "e6350a8fd954fe0272cfcecf9d33f0107551ad123d46b727762a1c7016206090", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/DocumentInitialSnapshotRequested.json", + "type": "file", + "size": 241, + "sha256": "3bfd2bdfef22d59bb2072d34902b24d737c4441ac5f7c580f6ae3fa3e24684e0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/DocumentInitialSnapshotResolved.json", + "type": "file", + "size": 219, + "sha256": "371fc060391ca666645e1155f11f00c47497e5dd9cee2dd804e148dc282942b6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/DocumentInitialSnapshotUnresolved.json", + "type": "file", + "size": 233, + "sha256": "a89724158b61597a0812d3ad04f6bb3627bf55fe8abe4c966847f32ac8827276", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/DocumentSessionBootstrap.json", + "type": "file", + "size": 20203, + "sha256": "0287237e778a4c291f836f3442fb22fa6bb6a055f4aef6c2d80edc03dddcd2d0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/LLMAgent.json", + "type": "file", + "size": 273, + "sha256": "bc996d2be20da370f8d27f69fb04ae707ab0f0cb29494f8a9c1cd0cecbb3dc2a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSAdminActor.json", + "type": "file", + "size": 401, + "sha256": "da52ea9b4468f1e59dc8410b80b62ace4da0ae92e4172a48fe528752d937f126", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSAdminBase.json", + "type": "file", + "size": 1888, + "sha256": "004b4e4385ce886275575d520589262144df39e03fd061f8a521f0a4ab6a6956", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSAgent.json", + "type": "file", + "size": 249, + "sha256": "4561cf7b2b13fc5f20f2b57f4427d48d59c16e75171e67dd212bdf8fdc05b41f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSAgentActor.json", + "type": "file", + "size": 330, + "sha256": "ac8f7f4a6da6ceaeb7f485c82e4c3429e997f2a717c2f1b8ec4fce5f802f8987", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSAgentChannel.json", + "type": "file", + "size": 370, + "sha256": "8c3f3d23c5c797231f33387e83f04dc5c87bb7ab6731dfe96254b602416196cb", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSAgentEvent.json", + "type": "file", + "size": 638, + "sha256": "c4eff24e764899e7291d506418806380270ade599dde45bfb15bb726226bd8d0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSBalanceAccount.json", + "type": "file", + "size": 321, + "sha256": "cc79d148ec8a9ab235d659e36f952079654b456699ea41579ee88bca9691e156", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSDocumentBootstrapMandate.json", + "type": "file", + "size": 834, + "sha256": "888eed995bab8dc62a1aa11400afc8337c75b0fd4c59653c0b4c6197a6f35dfc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSDocumentOperationMandate.json", + "type": "file", + "size": 898, + "sha256": "4c4d4ce26bd44e1d2381d1e1b679caafc65fcfc165eb6ba054125a716a32080d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSDocumentSessionReference.json", + "type": "file", + "size": 496, + "sha256": "8cd595a52f33400e2cb2a8a17bdbff30d66d68a153100105aa8f2f787480f336", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSOperationCallRequested.json", + "type": "file", + "size": 1249, + "sha256": "5a9cd30e13994a38dbe104680bf9417b1514d43bf871fbf74a3eab7162859453", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSParticipantsOrchestration.json", + "type": "file", + "size": 48, + "sha256": "1ab1108e840a380c736bfda364efeb46342e0767178eb66d83cc6f461d0d961e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionInteraction.json", + "type": "file", + "size": 41, + "sha256": "c11b2628220069693161abd189e0c503fbf8785d8939cc5332ac2a96ed5ed4ef", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionSubscriptionEnded.json", + "type": "file", + "size": 1002, + "sha256": "061cdc7e4015bbc7a6442ab510758c68d9e23ec1c6beb2e22ec91f288218cf1b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionSubscriptionFilter.json", + "type": "file", + "size": 1180, + "sha256": "38637c9468c06ca0eda17b6c8d106a232ddc90119fa5f4cfd92f0b3cb5235c9c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionSubscriptionMandate.json", + "type": "file", + "size": 1679, + "sha256": "492940604d1853dad9146f6bde5f23376c8851411a0470deda0cf1b79ca2fe24", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionSubscriptionRequested.json", + "type": "file", + "size": 1489, + "sha256": "c3b0010c3830272880468194a8fa2b8b0021ca78ecf41b98ab6855479094abdd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionSubscriptionStarted.json", + "type": "file", + "size": 377, + "sha256": "3ca26ce05d25617fe53afe698b09d695f93e3776ba5ac9033f4ec0917a2c8524", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSSessionSubscriptionUpdate.json", + "type": "file", + "size": 1130, + "sha256": "bbe3416f191aa31a0d9124c0e0c9aeb364a5dbb81324bb29b351091aa360303b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSTimeline.json", + "type": "file", + "size": 325, + "sha256": "fd405602288e8aab68c52a925b11ec074a07ede8ccc49abe704d57d3600cc0dc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSTimelineChannel.json", + "type": "file", + "size": 610, + "sha256": "944ab920826388d677223c99b62e4be5351d054b089a9c95988fc5e868d54b16", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/MyOSUser.json", + "type": "file", + "size": 270, + "sha256": "8f72e1e00b37356b2333dd15629d9e15e1d6a23283095a5b54adcdf312023134", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/Participant.json", + "type": "file", + "size": 494, + "sha256": "c1db746c3658d7fb3aa6d68b9e7e7b9953ae09eee181b2868c9bbed33387e912", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/ParticipantActivated.json", + "type": "file", + "size": 252, + "sha256": "f18035b84b9eb73b0e034833d46294d54ef30cc0617582ffcda7eda5fe3c8d66", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/ParticipantActivationState.json", + "type": "file", + "size": 507, + "sha256": "b10a5e516edc617b0b8ffe73246adb12dbc829076797ebaf95e3b42ab31b2dc3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/ParticipantResolved.json", + "type": "file", + "size": 329, + "sha256": "25bba9b444a9c30ebf83b535c660cf228725a921219a43b36f2a87a94c21404b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentInitiated.json", + "type": "file", + "size": 568, + "sha256": "0b0e069060ed38337dfb472ac4c968aefd3a189fa80f06778a80a8e83b867224", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentInitiationAccepted.json", + "type": "file", + "size": 212, + "sha256": "ca01856e4c88a0d971c85f1379c90404c9d7d44a04c444f04f8033ac96da7451", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentInitiationRejected.json", + "type": "file", + "size": 806, + "sha256": "96c5c3b424e8a1873137205fb5af340b352f059ef1c0e5ee17d09d4665b6288d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentInitiationRequested.json", + "type": "file", + "size": 1875, + "sha256": "c83c728db383cbdccca5fe95047a65b4e76a0cf6635f99d9ece08e7083b16547", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentTargetPreparationFailed.json", + "type": "file", + "size": 561, + "sha256": "b62c8eb83d30c42d2c0f6da71bb775bd419b8152af0c6ae51c3ef4f8351a4cea", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentTargetPreparationRequested.json", + "type": "file", + "size": 1404, + "sha256": "7f5ee3a8445a6b92ffbd2c692824e66a0caa284c7d4875125c6227452ec1883d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PaymentTargetPrepared.json", + "type": "file", + "size": 1697, + "sha256": "05da6a87bde389b1354ae4c3f31c6c24460ecd8c4f0a6dd14179d4e87909ad7f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/PrincipalActor.json", + "type": "file", + "size": 415, + "sha256": "6afae9416d075cff854ab60d0578f64f7d308be4aefb51ad1a110de976024b06", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/RemovingParticipantRequested.json", + "type": "file", + "size": 314, + "sha256": "bd21c5a000be8c4eed018c181fc1f8bcb5c8ad5f953dd7cdbd3e95ddb0c50a8f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/RemovingParticipantResponded.json", + "type": "file", + "size": 330, + "sha256": "c682330884a8ba9e8b5117f1f114ee367758910e629a4b365aa6fbe71b862e28", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SearchContract.json", + "type": "file", + "size": 1386, + "sha256": "f7fa82358b2b82d67ef947aa2b315039bb64c09fb0a40b78dd8aaf44cb03e1b2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SessionEpochAdvanced.json", + "type": "file", + "size": 728, + "sha256": "b2d8c2413633f1fd0191309c89ab4a62d64a1684c078f0fae86b128eebdcc84f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SubscribetoSessionRequested.json", + "type": "file", + "size": 769, + "sha256": "4f8d37e4a52b67c203f9c3055afbdf1ae35a21b14b92582669cc06ea36062b03", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SubscriptionUpdate.json", + "type": "file", + "size": 580, + "sha256": "8525ef7f1181bfbdc35f7f1181a230f429fcde58a297c4d3c077cf6d57e4ca73", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SubscriptiontoSessionFailed.json", + "type": "file", + "size": 738, + "sha256": "4dc7852a0e9bb43877cfc2de1c655e663a481386b36b066bddd3fda41952d06f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SubscriptiontoSessionInitiated.json", + "type": "file", + "size": 1033, + "sha256": "196b9c32a3055b88ae88f3ff9a72204b254c70e274679e9f4decaeea92be1593", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/SubscriptiontoSessionRevoked.json", + "type": "file", + "size": 727, + "sha256": "24d0bbca42f1da1000f42fbf96e47a0f59e92bef769555fe5fc0d519753c14ad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/MyOS/TargetDocumentSessionStarted.json", + "type": "file", + "size": 522, + "sha256": "da69944408cb05f5a6b21bc89d67636e5881abea417129e8ccae626af52ddf43", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CancelBeforeCompletionRequested.json", + "type": "file", + "size": 337, + "sha256": "4076ffe1545b7444b7aec96180c5e4bfc590a39bb36eace80f5d4156067b392a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CaptureDeclined.json", + "type": "file", + "size": 308, + "sha256": "feabe1606e51079958c329814d6cf1d1b98a888d460c0dce8f1a079c35fb40d7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CaptureFailed.json", + "type": "file", + "size": 307, + "sha256": "50643b35e6bffbdf28ac102e6f65c2a96c1ad91cb60290ac03c099cfcf3fafdd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CaptureFundsRequested.json", + "type": "file", + "size": 312, + "sha256": "bc8b361bc1c5b16d30162b3a7a7e76a40189e8f8c273aebccfc5bd88a19bdf3f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardChargeCompleted.json", + "type": "file", + "size": 857, + "sha256": "e266b7dec0738160558f7c036aee486de7c091d2c49db64b3a17c0b953ffeab9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardChargeResponded.json", + "type": "file", + "size": 770, + "sha256": "7965aee5c46d712ef6762a958c357215aedaf053182274711e404abd853c8c98", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionCaptureLockChangeFailed.json", + "type": "file", + "size": 343, + "sha256": "8198825d347b2afa78f71d2acf4e3c367a3aa0dc905f47d85989f08e104a5bdf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionCaptureLockRequested.json", + "type": "file", + "size": 356, + "sha256": "28e9d21dfa8985de3eb33070955968e5aba4e8aaa67d247e6e362d8d2d584fb5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionCaptureLocked.json", + "type": "file", + "size": 434, + "sha256": "a7b81ee4f3e839df63d9756df15f6510506a3eb070f9cc667c68a17266b062ec", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionCaptureUnlockRequested.json", + "type": "file", + "size": 361, + "sha256": "80e241635bb48d0e4b154a364ffa94d311264aee75361419a86aa9ebf22a4599", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionCaptureUnlocked.json", + "type": "file", + "size": 443, + "sha256": "2fa82dec363203f9c080d9de94d0ad6611e041f12cfc8d0499b37949ea382e79", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionDetails.json", + "type": "file", + "size": 967, + "sha256": "08facb40e57805306be64d0374eee56a7d663763485ad77ae14ae2f150a03272", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionMonitoringRequestRejected.json", + "type": "file", + "size": 949, + "sha256": "5b00899911ee2186a5d9f3dc6edfb1514291bc46a24d28ae909f332933c9a9b4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionMonitoringStarted.json", + "type": "file", + "size": 993, + "sha256": "62c2a14b209db2c1108a8649713e826a30f8cc384c9b2e72d46450dcd4701120", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionMonitoringStopped.json", + "type": "file", + "size": 639, + "sha256": "377b7c1fd32157bcede030a554e9e364a48e70fee67b0261ce6033cc9d771300", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionPayNote.json", + "type": "file", + "size": 329, + "sha256": "5ded81e92179076f651fd094798238245b653594ed5eb65f4395f44c3a5cc2db", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CardTransactionReport.json", + "type": "file", + "size": 1381, + "sha256": "721ec06ee8e1647c796ccf71e27ebc25d29d7130a2dab946cda3d03c4dce8d2b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ChildPayNoteIssuanceDeclined.json", + "type": "file", + "size": 309, + "sha256": "fc3c53dcb91336f74bf09fb759a4d9c3c88df0bc823b4ebe5eb84e64339bd0d9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ChildPayNoteIssued.json", + "type": "file", + "size": 296, + "sha256": "e94f624fbb35495b44149645e14c05135929bac96502ddc3b8850f18fde69ecc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/CompletePaymentRequested.json", + "type": "file", + "size": 307, + "sha256": "68f015c7629447838acab0f0a776f2a3c7308f509cd2f2161230d7209c6d55af", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FinalAmountResolutionRejected.json", + "type": "file", + "size": 299, + "sha256": "0307406a049b1776dd20b6a982f4e6ab9dfc48d7b1e2d00d20ad35447587e2fd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FinalAmountResolutionRequested.json", + "type": "file", + "size": 433, + "sha256": "59c407347c969d03c2a91510985f0a6c7ac0bf69cf83b838d0b05452a38d1727", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FinalAmountResolved.json", + "type": "file", + "size": 317, + "sha256": "348bf2fcb3c9e810fdddafce7d27fe75667ccb3fb7853ba308a85ef2f5c1962a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FundsCaptured.json", + "type": "file", + "size": 322, + "sha256": "0ea457a204ccae9cc4213eae624e22ae9b6111560072c30b50e7d65268ef78a8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FundsReserved.json", + "type": "file", + "size": 313, + "sha256": "1c5b9d52a4b791f6618e8176ce1cbbc6065016b74e82f0cce1cc2bc1e084fb64", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FundsSecured.json", + "type": "file", + "size": 307, + "sha256": "be9a095a2278caf33c49b0af09f3559cbdca9fe53d75c35f9d4dfa992e49daff", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FundsSecuringDeclined.json", + "type": "file", + "size": 296, + "sha256": "ab5b14a47618851202d69014ff7e2950987c544a23dd7d63901ef70719f59dd2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/FundsSecuringFailed.json", + "type": "file", + "size": 337, + "sha256": "1f01af0c8a68867bf2b05bc6eb24ab5ee4a45742a3ef1e07898a9e9551b1eb12", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/IssueChildPayNoteRequested.json", + "type": "file", + "size": 566, + "sha256": "96da6c9c3a625a74ac85c8906d7c48ebfaeac5f2bcf0c415a3bccc085eb318aa", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/LinkedCardChargeRequested.json", + "type": "file", + "size": 714, + "sha256": "a457c6abd0598c0751a7a9a886a1865a383dce39d859300a5f40f26a008529ff", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/LinkedCardChargeandCaptureImmediatelyRequested.json", + "type": "file", + "size": 724, + "sha256": "d3235378284a778af2f0cf3b1ffded20d3ef4e71f8cc6cdc793cb78758186673", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/LinkedPayNoteStartFailed.json", + "type": "file", + "size": 337, + "sha256": "043ab8aca66819c81ce2a564f02346212f4ddd03e5cfc53c6f41f166a4f859b2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/LinkedPayNoteStartResponded.json", + "type": "file", + "size": 540, + "sha256": "ff2b4ee997ac0c9a6e8eb1a4e42d4e365f25a556cd1049a86b6be2fb3f16d664", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/LinkedPayNoteStarted.json", + "type": "file", + "size": 594, + "sha256": "f034d0b7d4aa1493a79c2cbfbd6e8cd5fad3185ce478790d9271748673316f16", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/MerchantToCustomerPayNote.json", + "type": "file", + "size": 247, + "sha256": "794189922d13752cb5f07c65ed5c731af15022aa3218ef25816c8d126591c064", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNote.json", + "type": "file", + "size": 155547, + "sha256": "e8b5dc6943717379399c453ac5c1ffb3940b1ec0a5a7f9d18466a6deeda781dc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteAcceptanceRequested.json", + "type": "file", + "size": 248, + "sha256": "acdaff48f2f758e7f7e97e2278697dd5fd1f7297660818b841fe2829f4c18bd0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteAccepted.json", + "type": "file", + "size": 208, + "sha256": "cc5db18da56bace41e6d3bb38e1edf51fb0bcd0be11844f05f0d146829913e09", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteAcceptedByClient.json", + "type": "file", + "size": 338, + "sha256": "eda2d2dcbd428a53a63617a6483ad73c5fe51a1ac64ca68adb026b99118d8b1f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteApproved.json", + "type": "file", + "size": 205, + "sha256": "5f2ad617493e432a1e6802c7c1667cdf4fbf3b3333a45aaf38ae87736c07b2cc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteCancellationRejected.json", + "type": "file", + "size": 308, + "sha256": "9bf9d3f44c11b1465bc4b710356c7363835ed420b240ae1a46e526ca61f6073b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteCancellationRequested.json", + "type": "file", + "size": 299, + "sha256": "74aa6b08710e51cb8dbe1b1564311e6e5fc8e77a7eeea9bc03c2b46651208330", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteCancelled.json", + "type": "file", + "size": 196, + "sha256": "d2d0fe9a19694dd1ef417914dfd51d4220a6d419ff706c2ee279d258269592ce", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteClientDecisionDiscarded.json", + "type": "file", + "size": 761, + "sha256": "5427937da429e1a1cb973b11c8d99f4423b54d6e0bbb6ab5be1198a900bfd1e9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteDelivery.json", + "type": "file", + "size": 102919, + "sha256": "20ea6fb1775a175fe767c4e24820f32b5599cf068100140f7c75f2de26e71188", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteDeliveryFailed.json", + "type": "file", + "size": 327, + "sha256": "6cf07f946c220f27e088435e6f1bb951ca8b7e6c316c328ba683d1924d1133fe", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteRejected.json", + "type": "file", + "size": 283, + "sha256": "6d54ac60e8c40dbad704219ce87cf63667caad2d3a7b2dd7f4c8495cf1824040", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayNoteRejectedByClient.json", + "type": "file", + "size": 489, + "sha256": "10c6c361549ef353c4d7bdb8b4320263a3abddceaab06a974f6153d0722e2d15", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayeeAssignmentConfirmed.json", + "type": "file", + "size": 299, + "sha256": "f8329217fc38e8c173c91a9d64e93d9dbc505d3725437cfc9bd16ef896025d2f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayeeAssignmentRejected.json", + "type": "file", + "size": 296, + "sha256": "6ce7cda29bd41545c2076af978f73f893da4b2926ff6e397f5767209fdaa8cd2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PayeeAssignmentRequested.json", + "type": "file", + "size": 297, + "sha256": "b2d4e4f6cf9368833636127af284056dfd0323a6bcd1a10079863eeae71eeb1f", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCancellationDeclined.json", + "type": "file", + "size": 310, + "sha256": "9e54eb7356a83d44f3cc6ae929c984c5c68f01056424bcafc01c0c1b4b4f639d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCancellationFailed.json", + "type": "file", + "size": 312, + "sha256": "2fc2e766ab2d894998f1f557ce4f045bb9c0e7d6b573069b2b821beabaedc048", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCancelledBeforeCompletion.json", + "type": "file", + "size": 227, + "sha256": "6724e8a24fd24297deb289d185b2035069071c95a978078da99c562b14f70109", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompleted.json", + "type": "file", + "size": 298, + "sha256": "9cd39dc6583fb576dd6360d16f5e37a696a264fb3faa4977abf38527738b7b25", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionDeclined.json", + "type": "file", + "size": 304, + "sha256": "d59595d718d64c3dfe361e38476d717d58b44209f700f6594bff4a49a4094071", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionFailed.json", + "type": "file", + "size": 306, + "sha256": "74603f36e7aa2635ae10dde0517298abc75a74ab0abe8fbb2e94b5f7f9fb64c3", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionLockChangeFailed.json", + "type": "file", + "size": 299, + "sha256": "caf4858916c7e4dc60480a4a54396d61459de0f0680aa3496481c51c976d4da5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionLockRequested.json", + "type": "file", + "size": 347, + "sha256": "8af763bcabd38eefc41e87be3ce79002c49b0b810da9596beccf520e6be4cd01", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionLocked.json", + "type": "file", + "size": 352, + "sha256": "6c1de3ab305433aa6ebb0ebb96450235c24bf6e7533f8d8287a9bbd7874d7021", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionUnlockRequested.json", + "type": "file", + "size": 348, + "sha256": "9dfb99d80b75103ff25a013618760a8c419f912a94258bb0d2cd1a3a4171f34a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentCompletionUnlocked.json", + "type": "file", + "size": 342, + "sha256": "306e945577810c9bd6ce74137c2e04ad58a59351ecec4ba00bf83d864938dff6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandate.json", + "type": "file", + "size": 225787, + "sha256": "988a22b0442db896ca9ac75a377ebc352c86b762e46250a7d8c5885f912b9cba", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandateAttached.json", + "type": "file", + "size": 392, + "sha256": "209886402e793c4531ada740694a6610b83c6fca58b447cf2bfdbd4f5aacbf4e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandateAttachmentFailed.json", + "type": "file", + "size": 367, + "sha256": "65dd65535e3072502fc9266c9550312d54b6661a6a374b550fb1e910f36adda6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandateSpendAuthorizationRequested.json", + "type": "file", + "size": 1774, + "sha256": "73e7ef86b7b5f58a5c4f6bc349148100ea3abfda84e41ae9845bff70ea052fac", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandateSpendAuthorizationResponded.json", + "type": "file", + "size": 1139, + "sha256": "01547616ef19685c509c211186c2964d4728c2aae6888416ec34cc460904ead8", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandateSpendSettled.json", + "type": "file", + "size": 2275, + "sha256": "935be1e334c91144ce8c3f8d007891a533d4430f7efe7185297cd5f6beab8ce5", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentMandateSpendSettlementResponded.json", + "type": "file", + "size": 1581, + "sha256": "a0a7b7db847ee865f2cf7f4dc79e85224a44f27605b6a175073223ab0f71d9af", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalDeclined.json", + "type": "file", + "size": 306, + "sha256": "f25a2b0193de1ad44e3179965855947a71000aab6e5e5991288f3af38c6d7aa9", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalFailed.json", + "type": "file", + "size": 308, + "sha256": "be8ef331ad7cc4000e124f542b5b473ce056041ca7e929e6e103fa4d7b278977", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalLockChangeFailed.json", + "type": "file", + "size": 295, + "sha256": "3eb31898c7189032ad7bcfe8652d4214c3a8348f71a9b7969cbe646415349cad", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalLockRequested.json", + "type": "file", + "size": 343, + "sha256": "1a8fc8d8b6525d734a4cc7befd86eb368281517c513d25d21a6fe279db723917", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalLocked.json", + "type": "file", + "size": 346, + "sha256": "5853a377548f120cb4e7f32f1536ee0c17a850293aefd98219ae3909b2122cbc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalUnlockRequested.json", + "type": "file", + "size": 344, + "sha256": "b1187efdc6c8fcd998507ca3c9ca4d15f710a0f37d6ea663928d969cd21280ae", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversalUnlocked.json", + "type": "file", + "size": 336, + "sha256": "9a0dffa4a87e6d1b9fdd94c6732e457c67e7c2cdf3532640ef03a1bf35dadd79", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/PaymentReversedAfterCompletion.json", + "type": "file", + "size": 323, + "sha256": "2efe9d29f89ba71e0de043481ab75b362e9beb274f7361210fcfb1d96fa30ded", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReservationDeclined.json", + "type": "file", + "size": 290, + "sha256": "e6bd307624ceaa084c7c659b3f89dbe521daea4efb5c53ff18a9ac86db89b24c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReservationReleaseDeclined.json", + "type": "file", + "size": 297, + "sha256": "d664f497fcb8f7a5aa0591f937b9e20e3eeae4dc665b2a48c9fd0ce80026d2b4", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReservationReleaseRequested.json", + "type": "file", + "size": 317, + "sha256": "1f5ed095fd1811bd5eb1177665d64b7703c929d81543d30b89a4a9204b9ee98b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReservationReleased.json", + "type": "file", + "size": 319, + "sha256": "d51b03a8b50bab8a8c4fb86b0ad75d32389f644e80d362aa5f3a43a52c18e12a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReserveFundsRequested.json", + "type": "file", + "size": 314, + "sha256": "f054c0d1de6c50b9ed41cca683b7b6d98ff83432cf203a684a66871eea447bba", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReserveFundsandCaptureImmediatelyRequested.json", + "type": "file", + "size": 328, + "sha256": "4af4f9aef5a12a043b1160e07b11057e55c90a6e897b1fe33215569005b046fc", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReverseAfterCompletionRequested.json", + "type": "file", + "size": 427, + "sha256": "5e752b6501458c9d71e2ece900e7835c09a964c294e85fa28508643aa1f7c607", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReverseCardChargeRequested.json", + "type": "file", + "size": 726, + "sha256": "0cb630664218d01a3d6c2594cab00999cee6183eef7d7f32ecdf38d140344ee1", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/ReverseCardChargeandCaptureImmediatelyRequested.json", + "type": "file", + "size": 736, + "sha256": "11ad651cac1f88e34651d8631a0053f9c29ef6e1a24301a02316dd839224972a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/SecureFundsRequested.json", + "type": "file", + "size": 316, + "sha256": "46288220f2c28408cb712ec9c027ae79118598fdde16bfe0536eeae9b26ad104", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/SettlementAmountRejected.json", + "type": "file", + "size": 297, + "sha256": "84acf5a2c126230a2756a4eb873b35538ee96a3ab423c91fc18d44d826678acf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/SettlementAmountSpecified.json", + "type": "file", + "size": 342, + "sha256": "01337d7443f5a36e9ff8996ac3dadc8766fb471468b83c33325f8bf9ae2dae2a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/StartCardTransactionMonitoringRequested.json", + "type": "file", + "size": 772, + "sha256": "2ef14bf78816065e634f0f1611e29f9678b2a2dfd31162533422069d68f8a804", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateFailed.json", + "type": "file", + "size": 369, + "sha256": "876fa2ff235444e3ae1fb2e0d6b4de8e9ae7e9ae009b1ecd3c847adcea37a72a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateLockChangeFailed.json", + "type": "file", + "size": 323, + "sha256": "48874ccac4bdc900ef27c6a952618aef3a6796b4bb6d8f2be874393772ba643c", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateLockRequested.json", + "type": "file", + "size": 363, + "sha256": "e3eba670a2b30613232fef7bef791b7f48a0afd58294aed739891475bd46a489", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateLocked.json", + "type": "file", + "size": 366, + "sha256": "22cdb883b046b3786efe42534702356615e5799533f07d948c82ef967e36a69a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateRejected.json", + "type": "file", + "size": 316, + "sha256": "8d1a04a59cd915d8c0be112f4ed5d48d967069786a9fd3e82448a9a28a57b388", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateRequested.json", + "type": "file", + "size": 348, + "sha256": "5b8ac7386599066ac1a0459722c33dc13ef543f1b5c333fd3415bd26192f7028", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateUnlockRequested.json", + "type": "file", + "size": 364, + "sha256": "2e3f5269345bf3a398154c9ed98f17d93e2d8aedbf078bab97bd430009ceba14", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdateUnlocked.json", + "type": "file", + "size": 356, + "sha256": "e5145a9f072953bc2a05f0421b0474f9eb486f84cc087c821fe1c4a445f961c7", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionDetailsUpdated.json", + "type": "file", + "size": 322, + "sha256": "03de5b76be268fe668cbaf4292e5d3821dad9e5c46b50070aab02b1cb50ecc1b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionIdentificationFailed.json", + "type": "file", + "size": 352, + "sha256": "bb9933b7ad350cb569ca9dfc3d0e9c7bf84a1dcc4c52372f5d11e7892820b293", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionIdentified.json", + "type": "file", + "size": 184, + "sha256": "3b90e79694d9dcebbfe0aeaa2a39f2822ab82254f2afbbb4147e006c71c58a8a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionInitiated.json", + "type": "file", + "size": 695, + "sha256": "28a53a498b5a39d451a5c6af10ab627e69e05d77f968d8a1d63b5bea4745498e", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionInitiationFailed.json", + "type": "file", + "size": 314, + "sha256": "7944e4358d28864ed211f91414002c35b6d68aec9746178af5a819620853e54a", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/PayNote/TransactionStatus.json", + "type": "file", + "size": 608, + "sha256": "2f83691faa0eb10e07f99c23cbf096305cc5b9a7b8370e2088513fef022f7cf0", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/SessionInteraction/DocumentSessionReference.json", + "type": "file", + "size": 1079, + "sha256": "f989c2f6fc5a737dfbf59df0bcf0629da5f5355fd28b1c0f4086145bd4916230", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/AcceptChangeOperation.json", + "type": "file", + "size": 714, + "sha256": "d19ce9f2b87adb8afaae49b3358c0bb4f1195a14315fa6bdf8eda70fd754c7e2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/AcceptChangeWorkflow.json", + "type": "file", + "size": 164396, + "sha256": "f958a51be75ce06529d1c299845f5df6c8d26958a87a88a402b19694e2e21bdf", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ChangeOperation.json", + "type": "file", + "size": 993, + "sha256": "2321dfaeff06aed1ad6ad6f90bf62f56f936b4940838f9cfb05a0723b1eb9079", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ChangeRequest.json", + "type": "file", + "size": 1752, + "sha256": "9e26078de121078a7163fe879e50e4bb47ee676172fc481af62ccc6f502b2b50", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ChangeWorkflow.json", + "type": "file", + "size": 162002, + "sha256": "4e6c667f6fce0820247568d1fb8edb7362d63844d36b502783b9aae063f05e88", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ContractsChangePolicy.json", + "type": "file", + "size": 1370, + "sha256": "b0b16ffcb22420512c58c21ab661da10fbfe3b1a4f962648c2bf15ba02b217c2", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/CustomerConsent.json", + "type": "file", + "size": 14170, + "sha256": "e5d19fc6de05d5d7252107ab218e196a1469e728a0902051825adc5e992be5f6", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/DocumentSection.json", + "type": "file", + "size": 2122, + "sha256": "fb300394e469ad6a590a9215f9977608ceaa06c2723a55636883b642e99ef9dd", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/DocumentSectionChangeEntry.json", + "type": "file", + "size": 1738, + "sha256": "d0fbd7da2a63e8ceb6f190bebc6c212e10045ddaf30c1ba656ade10973f64a82", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/DocumentSectionChanges.json", + "type": "file", + "size": 1693, + "sha256": "8c3a97e3e00e601677e395e438697be7f9d14c763d804f98cab741cba35d52ba", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ProposeChangeOperation.json", + "type": "file", + "size": 824, + "sha256": "539e783614bc47c125104ae2054c14fe69498730f4ffe11fc53802c44344a75d", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ProposeChangeWorkflow.json", + "type": "file", + "size": 9693, + "sha256": "6c6e03fd595778b998aec0055162389584ab852ec192439747a80f08dc79337b", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/ProposedChangeInvalid.json", + "type": "file", + "size": 988, + "sha256": "17c206ab35dcb69a63618d4332f001c0d1b9ab6399e90c4b779ba6bb12a1d523", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/RejectChangeOperation.json", + "type": "file", + "size": 713, + "sha256": "dc43d1bdbabfd0b34b31add546b1a8e0a9212ec2c39d7b23ff822f2a599db356", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/definitions/Workflows/RejectChangeWorkflow.json", + "type": "file", + "size": 6115, + "sha256": "12d955b472a8a959e8cd7b93e36a9c327865ca47687f7c3b7eec86f7349d6739", + "mode": 420 + }, + { + "path": "src/main/resources/blue/repo/manifest.json", + "type": "file", + "size": 462161, + "sha256": "ec4d11f9ba6af0e9b790dae6ceea70f3c6fc517a4d6b0166a8259e411164398e", + "mode": 420 + }, + { + "path": "src/test/java/blue/repo/BlueRepositoryTest.java", + "type": "file", + "size": 35340, + "sha256": "aee991f7fef55ad7b30b58d8a2de5f09fbc9fa0d0e34c7e259885b4f349024f1", + "mode": 420 + }, + { + "path": "src/test/java/blue/repo/BootstrapRepositoryContractTest.java", + "type": "file", + "size": 8340, + "sha256": "dc7ddcc244ba38910aba9e658ecfb3d6131b13526d2b6aac889298dc3d3fff34", + "mode": 420 + }, + { + "path": "src/test/java/blue/repo/CoordinationV2RepositoryContractTest.java", + "type": "file", + "size": 29857, + "sha256": "aba97a99ad66be275ce1b717c82ec60d4e2077263081bd60a97997bd12fb4e24", + "mode": 420 + }, + { + "path": "src/test/java/blue/repo/RepositoryLocalVerifier.java", + "type": "file", + "size": 26240, + "sha256": "bac9741972147a9370e3c196d8b56b680332191c581b2abee5ec8e4bcf3f7d40", + "mode": 420 + }, + { + "path": "src/test/java/blue/repo/RepositoryTypeDictionaryTest.java", + "type": "file", + "size": 6168, + "sha256": "f7fbed618d55490f6e74e9bbe33a176e861a898b7fa1da9dd44c7fb2512a437f", + "mode": 420 + } + ], + "sha256": "607f460f28aa8e02b2c42f17d6fecf8624b1eb54c246d6ec8325a7b29e126671" + } + }, + { + "name": "blue-language-java", + "path": "/Users/piotr/data/blue-language-java", + "commit": "c3d58561220e6de6be6e302cb16799c1a1b5159f", + "executionSurfaceManifest": { + "algorithm": "SHA-256", + "includeMode": true, + "files": 1473, + "entries": [ + { + "path": ".cz.toml", + "type": "file", + "size": 158, + "sha256": "f6717f9a9e38df0dea4b5eeec5a0264c0490856ef4c261c053a06883ba3e69f2", + "mode": 420 + }, + { + "path": ".github/scripts/prepare-rc-release.js", + "type": "file", + "size": 3521, + "sha256": "cfa69292e27979a65ef5b6569f5504b701ada47c189823ad22e6e35aa0a2f995", + "mode": 420 + }, + { + "path": ".github/scripts/verify-release-readiness.js", + "type": "file", + "size": 3383, + "sha256": "028238be5e69fb3ecdb905681347cea051bbdc8db95f7fafd5f7ad546d6b5014", + "mode": 420 + }, + { + "path": ".github/scripts/verify-release-readiness.test.js", + "type": "file", + "size": 3350, + "sha256": "e7b2060ee1777667443c22013626526b8f9f1093216f1350d13fe4f51410b576", + "mode": 420 + }, + { + "path": "blue-conformance/build.gradle", + "type": "file", + "size": 727, + "sha256": "8459ccc9a8bda1c57a6593b9a21645649caeefbaab522c8e688d621b67790b72", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceFailure.java", + "type": "file", + "size": 3800, + "sha256": "fa2f4c1d391f9e8f48fc6aaebb34557cb952aa105401af218289b2d07d1c7414", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceFixtureExecution.java", + "type": "file", + "size": 10114, + "sha256": "40dc3723f626e32211e0b5e86fd79e22b7fb1ebf08377f2b4ae4133b88c67fae", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceFixturePackage.java", + "type": "file", + "size": 7995, + "sha256": "1bc81eebf2e375a71a2521b0beba2a0188314aa91bb6705e50011cdfb07ec056", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceFixturePrimitives.java", + "type": "file", + "size": 31044, + "sha256": "b1575d53edc16b971dd923d7129e9aa615a43643ca0ab7ee6e1455f4d3673c75", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceFixtureSupport.java", + "type": "file", + "size": 17062, + "sha256": "7aea2927d401e62e96cd4b48cad656dbb878fcd6ce3e6b63111c6c7414ffb097", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceFixtureTransformations.java", + "type": "file", + "size": 28588, + "sha256": "01e93420a203d7590b754fbca1adc1765ad3dab071d74ee386489902fd24ea73", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceGraphOperations.java", + "type": "file", + "size": 34990, + "sha256": "98d364b7066dbc611b1d019b9072f1dfb64578094ad992e47d3ad24d4d5dac8e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceProviderEnvironment.java", + "type": "file", + "size": 14440, + "sha256": "36b3fa851da4fc8a123623774d041b2f9dcef6dfdbc60f0f524f83716ee79c9d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceReport.java", + "type": "file", + "size": 26912, + "sha256": "92516d222de8ba81451c5e066f94111604cc8f47087464d802660ff937b91772", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceResolutionOperations.java", + "type": "file", + "size": 23890, + "sha256": "b4cac9d608e516a297a6b92f568ffdeb519ed372ba9272cde28ed01dcf69f281", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueConformanceSuiteRunner.java", + "type": "file", + "size": 7170, + "sha256": "aeaeb27a594d2f361fd9ef4761334ef2f93c34d1e839fe26a5aa2341f34db590", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueContractsConformanceFailure.java", + "type": "file", + "size": 2117, + "sha256": "9a5340c3cf5d4d677241f2578103b551e9c1b102358f67ed094279cd18381d8a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueContractsConformanceReport.java", + "type": "file", + "size": 29415, + "sha256": "9ad9548c8b2e457cb20667b725f55ac50748bf270d18b09731116e74b59268a4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueContractsFixtureCategory.java", + "type": "file", + "size": 1932, + "sha256": "0d1941b8de23a595af712857c5590c871929fd269b465c7bf967eae9802b35f1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueContractsFixturePackage.java", + "type": "file", + "size": 22745, + "sha256": "dc89bb2a0eae161d25e0fbd112a034a4dfd2a28925e78606451c0c465d8b0c05", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueContractsFixtureResult.java", + "type": "file", + "size": 5364, + "sha256": "14ac08271dfd2682f9ac00acd9acdf50f638a054765c89d32b05a93b3f0c0146", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueFixtureCategory.java", + "type": "file", + "size": 2430, + "sha256": "239da109930970a6f25a54f84a2c30e9cc2f7b485c76e9342b5cda35151b774a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/BlueReleaseConformanceReport.java", + "type": "file", + "size": 11499, + "sha256": "5f744720265f431caa176dfa50b7630338503d1c5c349425233f21435464785d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/ConformanceReportConstants.java", + "type": "file", + "size": 4716, + "sha256": "9519192176a62d42cafc26d724a540d6cf3e4106aa1d7d48cbc0d9b61493baa0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/LanguageFixtureRuntime.java", + "type": "file", + "size": 5934, + "sha256": "aabd80c4052614911f248936b1d741840bbd5d5cf608edbf01fc13b5d1bbcd6e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/api/package-info.java", + "type": "file", + "size": 1416, + "sha256": "fb8acb3d7dd699972314efdc37d9b802b660718514677dd675529582d5dec3de", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/cli/ReleaseConformanceCli.java", + "type": "file", + "size": 5829, + "sha256": "10a9cad8cc446fac06f50bb61563e836017cb8cf79469eb63eb6b75f6ad3f452", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/cli/package-info.java", + "type": "file", + "size": 1133, + "sha256": "cd693afcde01c9d91fd4cecffdd35d748491aeb0f5a2cdb0aedb0afa30a42f24", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ClosedContractsFixtureValidator.java", + "type": "file", + "size": 42244, + "sha256": "5ab978ce038421143fd1aa9aa50c4bff256a8f3a999b438da34a838522b07dec", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsAssertionEvaluator.java", + "type": "file", + "size": 27583, + "sha256": "315064805434497effb1a0b295b864b655f27fec39918f2e2f22f42c4de31274", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsConformanceProjection.java", + "type": "file", + "size": 11599, + "sha256": "c4ff8995577c3e55df9f813c7613bcd673bb8af6e1b45b2f781129b57a7c1956", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsConformanceSuite.java", + "type": "file", + "size": 8139, + "sha256": "e9883c0c7d05a0120b7843695407f6047278d828b6f41b7fccf97c714b7fcec1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureConstants.java", + "type": "file", + "size": 10429, + "sha256": "ece385f6f6d519ea76e55489db67e74c9bf0ab098f16e3462fced32368748029", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureExecutionEngine.java", + "type": "file", + "size": 24209, + "sha256": "24504cd52a42abe66c77e5233de1fd6bddb2b07585223a31533dd7f99610ad06", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureFeederEnvironment.java", + "type": "file", + "size": 29696, + "sha256": "6696152a7fac78f67d9698f2c7cb0567b5f6b8895dce5033b395304c2b4f50cb", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureHarness.java", + "type": "file", + "size": 7760, + "sha256": "4a6251b75b30172648f623997f8c54a7a62abb470114a683ea0f867cfddf47a0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureHarnessDataSupport.java", + "type": "file", + "size": 37519, + "sha256": "78aaf71158972cc9efeb7ab58595cd238d0792a6a504c17f654d9d190874ad06", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureInputPreparer.java", + "type": "file", + "size": 39353, + "sha256": "d083a64e95a83043fe450cfa3c17af06075fc8d7b0c86fbd2f71409d504d3ecf", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureProjectionExtractor.java", + "type": "file", + "size": 37645, + "sha256": "2d7804434a01897c920d9f4285b4cbc4461e324c8f3d93c15f8afa0f2426c24b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureProjectionSupport.java", + "type": "file", + "size": 18902, + "sha256": "7eb9d6233ccd630550300152a43b5f1f90b0a96b5a6183d81f279ee1305034de", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsFixtureScriptedEnvironment.java", + "type": "file", + "size": 27630, + "sha256": "5319859006389cf49b93ab0c3ecbac0f59fe14e718aa2aa65334be7bd383ef92", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsGasSchedule.java", + "type": "file", + "size": 33558, + "sha256": "c9e9944c4689cc9180573e0ff34c2cbca2b4997d0ed5e3d0f55b4d10bfc0d9e1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ContractsProjectionCatalog.java", + "type": "file", + "size": 7135, + "sha256": "d70daf0163e2051c9e83accf768278f0b74c382ef25336439a2efa5249ef2715", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/FixtureNonChannelContract.java", + "type": "file", + "size": 1425, + "sha256": "5a0f23054187fc6cee173734e0274db147a36db322acb47d2f9bc9791f81d154", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/FixturePackageContradictionException.java", + "type": "file", + "size": 2414, + "sha256": "3d4de64b17eb25ddab21229076d53ab73b35cd888a86392eb7df1a6c9fd68608", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/MockExternalChannel.java", + "type": "file", + "size": 5994, + "sha256": "b1df9f8c3e98efa7aca7cfdc0bb6028098fdc3633fb4a9230b196c1718afa2d6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/MockExternalChannelProcessor.java", + "type": "file", + "size": 10343, + "sha256": "a359045cf5ff9382ed681323c968b41e57a202c1d6e9c9fe751784ce3954c144", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/MockHandler.java", + "type": "file", + "size": 1051, + "sha256": "00a1293d2ddb041310948aeb1b35bfb7993134cac74a4e46ac41ed3fa1e99430", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/MockHandlerProcessor.java", + "type": "file", + "size": 2158, + "sha256": "5c3277fcdec33680c603a4aa7ebe27bd1c1c52f139604bbbe823b3ab5f40380a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/MockTypeBlueIds.java", + "type": "file", + "size": 544, + "sha256": "9cd216720381d74698701ef2ad23f6549184b1f6339f32645af412fd6ae0de1c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/ScriptedContractsRuntime.java", + "type": "file", + "size": 23279, + "sha256": "195c68ab0dde65c120e5c85f8eb164305f15cd59c958637a7733eed7b4dbbf3b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/contracts/package-info.java", + "type": "file", + "size": 1378, + "sha256": "b7ca721b4a93fca336fed20486f1c9fd17ac6376e0a49275bee68156038f2b04", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/runner/BlueContractsConformanceSuiteRunner.java", + "type": "file", + "size": 1681, + "sha256": "44c507c9f99698705d557a36b9376eac59986e59791f89509a299940256d34dc", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/java/blue/language/conformance/runner/package-info.java", + "type": "file", + "size": 1052, + "sha256": "7dead3fc9ebdd2fe81291e0925fc400a8fb211d16640c41cce7b023413f1a390", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/CONTROL-LANGUAGE.md", + "type": "file", + "size": 12268, + "sha256": "0b1edbbd79307d3b109198b00cb22b36776cb4a459dac245baeaa706d43f4337", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/HARNESS.md", + "type": "file", + "size": 8777, + "sha256": "ccfd2d7ace57a1ae1eb8c10e7392d1bb412ec8a7f771fe125d3d833d38fc9057", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/README.md", + "type": "file", + "size": 727, + "sha256": "4350a3e9a3733be61a88cc888f783f06fc2c90ca803c4c28ede52c24a2c1cbe1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/TRACE-SCHEMA.md", + "type": "file", + "size": 2992, + "sha256": "b6286079aab725e42e300c4e2c8aace6bf214dedb9daa686a1b685cf58ba2c37", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-01.yaml", + "type": "file", + "size": 1308, + "sha256": "92794df131df6e26b6fcca2aed548418a1d2ceed32a15e9718695263f57abae5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-02.yaml", + "type": "file", + "size": 1294, + "sha256": "8cf4f8919e70e0943e08e601e8b2a5edd701547f8d114480064c61440dc1f170", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-03.yaml", + "type": "file", + "size": 1355, + "sha256": "8ab958e16ff9b5ce8d6fe1e3125a48b7d0859a6499e284efcec5ed2ff267dcfe", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-04.yaml", + "type": "file", + "size": 1480, + "sha256": "8e7b9b81fa934875118399b978fffa7afe4180d2621a53962301fe663903e6e9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-05.yaml", + "type": "file", + "size": 1509, + "sha256": "29ad49ed6f9e7d44863bcbc6a972391211b2bee0a7ab219387f4858a51773040", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-06.yaml", + "type": "file", + "size": 1497, + "sha256": "43c298aa47d8a5683b90a0090f7ac483b810a04ba8982d783fd3610822ca86d8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/chk/c-chk-07.yaml", + "type": "file", + "size": 2297, + "sha256": "deaf0792761dca79073afa12c0c3bc455d8ddcb7dfba93f9fe396a1b8a4a0aa2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/disc/c-disc-01.yaml", + "type": "file", + "size": 1001, + "sha256": "7263181d5a8cc15f3c9470a0cbf81bddb60577a09757750be150e19df2f2d0a2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/disc/c-disc-02.yaml", + "type": "file", + "size": 1925, + "sha256": "d4af0068c701a39db3b37e956c3077c72aa0926a5c4ece61685a37937e02ae2c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/disc/c-disc-03.yaml", + "type": "file", + "size": 1483, + "sha256": "ee00f332f8fdede8f0abbb0d809a2406e2c1f75e748fe9f0622a2810ef12b571", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/disc/c-disc-04.yaml", + "type": "file", + "size": 1681, + "sha256": "9bd814c556735e79de891b7e085a25612da30ac24abb3291e80c2b5ff8cec0e1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/disc/c-disc-05.yaml", + "type": "file", + "size": 1558, + "sha256": "153a1c348420d78ee24decb6839e0ab42b0bf139dd5fd40a2453d8cfd16af9cf", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/disc/c-disc-06.yaml", + "type": "file", + "size": 1584, + "sha256": "823612d24d43548ae385f94848737a552920a8dad17cf175b8bf4e3465892ac4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/e2e/c-e2e-01.yaml", + "type": "file", + "size": 2256, + "sha256": "06d65be012e4dd722c17a42fe6b02ea49ed82b6457d0f2324daa0c76441cea34", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/e2e/c-e2e-02.yaml", + "type": "file", + "size": 3256, + "sha256": "bb11896b4c9095a357be259fb872fabf9107ee501ab3b7585fab770aa86c8e9e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/e2e/c-e2e-03.yaml", + "type": "file", + "size": 1529, + "sha256": "e52fe5bcc9bb6847f99871c8adb9be86603ff1ec982d8cd157f4005c21b97dcd", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-cyc-03.yaml", + "type": "file", + "size": 1233, + "sha256": "4d8ea66897e6ee00159477a044059a6fe46a11de35090f85e978e81b37bf23af", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-01.yaml", + "type": "file", + "size": 2172, + "sha256": "10c38d38fc60929198c6d3116cf8f92ec281bd171c488464456737e35abdcf09", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-02.yaml", + "type": "file", + "size": 2139, + "sha256": "0152523ea7339cfedbf16afd7bbccb57b6b9b3e12ac74c63e406a6fd0d533a40", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-03.yaml", + "type": "file", + "size": 1526, + "sha256": "38ecc5141d35b4d228559381f7274320ba0b96fb0c9b9ac81b75414f3680c22a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-04.yaml", + "type": "file", + "size": 1643, + "sha256": "451e2471beb3d0044294dc84d233eff1e77bd732ec76f08fef3ad0bfee75d4c1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-05.yaml", + "type": "file", + "size": 1610, + "sha256": "a5de967a03ddb12cbae99f7bbbface28b1e68e951986d583f3ca5afa3f5697d8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-06.yaml", + "type": "file", + "size": 1735, + "sha256": "8f1951844fdb09cc610d47631d04ca32c9766391cf137945282e9c93f2cb1762", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-07.yaml", + "type": "file", + "size": 2660, + "sha256": "5768ec20ba3aa4535b144e5d2eba5dce8f189cfdc24b9cfee52db68fab72645b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-08.yaml", + "type": "file", + "size": 2039, + "sha256": "77a1d1534aec206b822ce433c78aca04d08b0121215b180cc72ab21e100f9f49", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-09-cyclic-member.yaml", + "type": "file", + "size": 1160, + "sha256": "a79e7c329e891fb57d3d8ac3607c967a93b99beb0467fa715ccb1c175c197c2a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-09-list-target.yaml", + "type": "file", + "size": 1081, + "sha256": "7be38af7a4e53fb41a55dc4ac4719e3834a10f03cdac02e0d643df321ea28c62", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-09-nonobject-member.yaml", + "type": "file", + "size": 1005, + "sha256": "86925e95c75b3c49d62abeae35723cba6658cd4f330111359463e724f2e78a10", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-09-reserved-field.yaml", + "type": "file", + "size": 949, + "sha256": "c5890871e37eeb938620239fdef3f3598bcd862801ff66cadb66712831da1d30", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-09-wildcard.yaml", + "type": "file", + "size": 990, + "sha256": "229a3b41f1485f6603b716d243c035c8c8aaf0bf5fcfda41a76bae7f158604ca", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-10.yaml", + "type": "file", + "size": 2247, + "sha256": "a66d2341e39fa32f004ce20afbbd89a3d021943815899244dfc96de4d954e9f1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-11.yaml", + "type": "file", + "size": 2963, + "sha256": "9c4338f7ee44fe8552554af2fd9b106d7797987706391350c5b6d75a1b8311ee", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-12.yaml", + "type": "file", + "size": 1026, + "sha256": "b6185042f67a8c6a859cfd3969c30fc999818633f1c1cabc6d91f9da703ce476", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-13.yaml", + "type": "file", + "size": 1963, + "sha256": "4731f397b632c2a657ae7ea8bc3f3058c8c49cdd077db0065bd4dea156d4887b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-14.yaml", + "type": "file", + "size": 1522, + "sha256": "2dfb5dcc9423aa0bcf3415acac30c74bb96dd6056e4a90e60c02289429fe7f79", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-15.yaml", + "type": "file", + "size": 2264, + "sha256": "8ec8c636d03f63a74eb499a41a3bb309ed3d183912694667ecf4f1e899e6e613", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/emb/c-emb-16.yaml", + "type": "file", + "size": 2555, + "sha256": "20bdd75d85ce9ed74377814dc65cc52e13bc10c7d5f9cb289b151a76f9831988", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/evt/c-evt-01.yaml", + "type": "file", + "size": 2100, + "sha256": "6cc902cc4af35a11e757b1ca5684571ca3450cb7731c44f66ccb85b1d63c8148", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/evt/c-evt-02.yaml", + "type": "file", + "size": 1424, + "sha256": "9e0bd161a4fbb7be1a71bf7c37b20e1fcf8c45ecd99181277527d84197affe6f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/evt/c-evt-03.yaml", + "type": "file", + "size": 1408, + "sha256": "798ca6e007457aef8443531f10a2944244eeba2fbbfdb3a3e5dad273a85808f4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/evt/c-evt-04.yaml", + "type": "file", + "size": 1424, + "sha256": "b7246b771fe4c890eeac222df18a198e67e88e923e9ca7135b08ca1c86d4830e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/evt/c-evt-05.yaml", + "type": "file", + "size": 1363, + "sha256": "bb7288aa7d342b0a757808f298487320a117fd5a47707632fd642a49cde79a4c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/fail/c-fail-01.yaml", + "type": "file", + "size": 1480, + "sha256": "f8b2524746f404e4ae4ca42dee74c4b32923537b55c4c83a1e1fc05305732bea", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/fail/c-fail-02.yaml", + "type": "file", + "size": 1589, + "sha256": "2d96e789441055d658f510fb9f78d269a715e5b49432881c4a266546031078db", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/fail/c-fail-03.yaml", + "type": "file", + "size": 1529, + "sha256": "fb1f9f413431bbc1fd73b8a14d5923aed913d861b43135a8afd6597d0cb0e229", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/fail/c-fail-04.yaml", + "type": "file", + "size": 1437, + "sha256": "201952ce1a02999fd62475c363472dd71704c66e2efde0587dd60b2062075d35", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/fail/c-fail-05.yaml", + "type": "file", + "size": 2176, + "sha256": "b163762ba7ff24d95a33aaeb4bfe48e5aff9169090a5ab7d3b3c373d6c6466e0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-01.yaml", + "type": "file", + "size": 1356, + "sha256": "d2afdaebec2f15fdf1b513581d4c765a9f13ebf7af6082ee2fcc52a7026f83dc", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-02.yaml", + "type": "file", + "size": 1469, + "sha256": "8bdb84bac7938b4a84e40a6539a2994d8b4814b42e683d7d42bd210a6c58f9a2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-03.yaml", + "type": "file", + "size": 1330, + "sha256": "1cb956d25194e8b8dca71209f7b81820a2053119fb546fe09fa20e73b6aa28dc", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-04.yaml", + "type": "file", + "size": 1380, + "sha256": "45cacf1529403865efb87b8154fa93086cb7434be25ad3ed38072d658c8ff6bb", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-05.yaml", + "type": "file", + "size": 1240, + "sha256": "15c0ee3e156cedfcb35592ac52ead5d9c91693e61e9fa87f5d1f8e1d6053b2a0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-06.yaml", + "type": "file", + "size": 1419, + "sha256": "47ec56c733f58bdd1c73d7cfa25f5fd3f847ddf51fd152ec5e3025ca1c4b04f6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-07.yaml", + "type": "file", + "size": 1434, + "sha256": "ac9e946c746d6ea0350792c4343fb6b29577ddeb5911d53d0df056fa83715d75", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-08.yaml", + "type": "file", + "size": 1426, + "sha256": "80b279087667902d314b242f6f2da023106a633eeb84af71ab44e2cb2f5490e5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-09.yaml", + "type": "file", + "size": 1392, + "sha256": "82da2d08b1833abe9b04aed38037a8cc4705a7bc2222c8040e81e8d0ac4b999a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-10.yaml", + "type": "file", + "size": 1391, + "sha256": "8f58844a6fce7cc7b3db1abbf4271d2a1b8bb4cd98dc01d205592b180d559e60", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-11.yaml", + "type": "file", + "size": 2012, + "sha256": "b01bb53bb51ddd03307df812d5a7c549746b17a99359ceeddce05f83d4420689", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-12.yaml", + "type": "file", + "size": 1739, + "sha256": "fd9ad3c18c68281f1ff145c62150f72e3dc42a9d1c5626b90385a50741be1bd7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-13.yaml", + "type": "file", + "size": 1926, + "sha256": "73b845fce4e12cb788d9ebb0e8d179250ff0f7e13082a1861360ef181f878dad", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-14.yaml", + "type": "file", + "size": 2549, + "sha256": "7040024bd555229db2ca6b2d76a36a7e5cb4d2544d6402ee69b3e9dde0eaa777", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-15.yaml", + "type": "file", + "size": 2528, + "sha256": "cd129ab0b5f0317e4747828ceb156dcba8fec07845c257186305f8e3198511e9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-16.yaml", + "type": "file", + "size": 1578, + "sha256": "37c5b7b9e4f9d120dd3f41beae7b007333caa0dc9e6f713d5bd06f7eb6164c74", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-17.yaml", + "type": "file", + "size": 2672, + "sha256": "c9243ad768e7a3c1ed39979e72d761f93cf6813c1ad4090ebf903c04f873ce5d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/feed/c-feed-18.yaml", + "type": "file", + "size": 2697, + "sha256": "382c1bad55be6a5bbbcaac706a307c0c50850e994f695b69f9b994c958671f92", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/fixture-schema.yaml", + "type": "file", + "size": 8767, + "sha256": "561d12ebac220bb7dc1c13e424de2cf34e7b8536f5a4108e3be4ef77ea94308e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-gas-exhaustion-prefix.yaml", + "type": "file", + "size": 271, + "sha256": "0fdfc21412f68e622fb42f74d37f7f8df1d6a1f7c4a09fd74178b6c9dea9996c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-identity-blocks.yaml", + "type": "file", + "size": 231, + "sha256": "7db808c0da612918dc0ef57886fd7700c7414eb0e09bad6956791a5154bc1818", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-integer-multiply-3x2-limbs.yaml", + "type": "file", + "size": 264, + "sha256": "fbdafb8efa4015ca3cd41c1aae994784790bca73ab49787ed49480e85835b386", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-list-append-delta.yaml", + "type": "file", + "size": 261, + "sha256": "417cf06491a253fee4c6dd3279987eb81efde2ce84a63956a9683337de4710fc", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-list-replace-head.yaml", + "type": "file", + "size": 243, + "sha256": "f5b8a3be554509ccd13978f683d3b41aa631aaaf4728a2d0ad575a6412e8c909", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-text-65-code-points.yaml", + "type": "file", + "size": 230, + "sha256": "68277584a35a949f43f62a73cdbf8cf90e6da98e3542f65ebb0e402a74680809", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/composite-validation-proof-reuse.yaml", + "type": "file", + "size": 236, + "sha256": "9695a5c6f6a19e235360677f81bee9f72285c5d93524d28785151b964a04f0e9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-channelAccepted.yaml", + "type": "file", + "size": 387, + "sha256": "0294db4b28b504dfeba821cd0e4606be094682b879a20d364e021019c18b666a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-channelCandidateTested.yaml", + "type": "file", + "size": 408, + "sha256": "679f423d46d0440ee05a6e3049d3d10e3ed003c1230e9376f2376ac9035c0dc5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-checkpointCompared.yaml", + "type": "file", + "size": 396, + "sha256": "bb92acd3dd82baa8cab16936a672e40a92390f6faf68175768111ff8cb703e6f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-checkpointWritten.yaml", + "type": "file", + "size": 394, + "sha256": "6933e80931bdf106b2643aa4003ded7dac68272457ddec4acf461a48eeb10593", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-contractHeaderRecognized.yaml", + "type": "file", + "size": 412, + "sha256": "916a311a0002e1986ed873af3b8ed923afe43eb559f6b7e40a8be17b2ec63f59", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-deliverySnapshotEntry.yaml", + "type": "file", + "size": 405, + "sha256": "1985c335f0ce12afdc90f6ebd48dae52c932b833a6830d7974550ce508c2c313", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-documentUpdateDelivered.yaml", + "type": "file", + "size": 412, + "sha256": "288d02c810081446dbc536bca3d283dc8bc83338602c238ad4965236b3df5856", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-embeddedEventDelivered.yaml", + "type": "file", + "size": 409, + "sha256": "2dc5f68272113e57b1c068256a3c15b9cd0f51d0faab7758f4ae0b97448675ea", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-embeddedPathEntryRead.yaml", + "type": "file", + "size": 403, + "sha256": "d1114da8c2ad34312e6393ff33c2e39fe04be8ad622179012123c3a329c4c6f6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-embeddedPathSegmentValidated.yaml", + "type": "file", + "size": 424, + "sha256": "b78ff88272f8387c3a1ca741fe9cbe648623cf9ab1629da0f6dd250cc1a0948f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-handlerCall.yaml", + "type": "file", + "size": 378, + "sha256": "0faa14a390a95c7e5f3c84335c87ebd499c9a841fa001c6d9e760472ff2f7fdb", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-handlerCandidateTested.yaml", + "type": "file", + "size": 408, + "sha256": "a15e3aab047a6d1e26356eec83324121fc7912061230d52172b3aa8c5fe35c48", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-internalEventDequeued.yaml", + "type": "file", + "size": 406, + "sha256": "508dd68098bdd794a0bc9bc9c6785bc9b9688ee14d90e5a34fb1787bc72b04ca", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-internalEventEnqueued.yaml", + "type": "file", + "size": 406, + "sha256": "5e48cdccf95ed6572cd6b363aebed1364c18d4bfabb3c4a18aaa969ec6a9adb1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-lifecycleDelivered.yaml", + "type": "file", + "size": 397, + "sha256": "7d55d25779477b1cc256b6b781db53790acd4639d95146654e9520be9d82e423", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-patchAddOrReplace.yaml", + "type": "file", + "size": 394, + "sha256": "f47228a475397ccd60a36ac79321030026f913c6687f988f9c838f44bb07c4f4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-patchBoundaryChecked.yaml", + "type": "file", + "size": 400, + "sha256": "0c42d809850051fe17598af4b05868ac47a79f17cf151fb84d11b36e8d01306a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-patchRemove.yaml", + "type": "file", + "size": 376, + "sha256": "bca60c7300345c163b344adb6e4421dc42525c1fa32e634f1b4a32257b2ee18f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-pointerSegmentTraversed.yaml", + "type": "file", + "size": 409, + "sha256": "0d7d9a19466f89517fa62067696be86118f730ad8a84a1981e4b28d882d01e48", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-processInvocation.yaml", + "type": "file", + "size": 396, + "sha256": "614c1bfa0e9f077c3d17dd702f692b4900d9cac747b6b7c47615169f2bd91079", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-processorMarkerWritten.yaml", + "type": "file", + "size": 409, + "sha256": "7b4ee6ec97ff6666b953531882a94ed1cdcee195dc88165bbd29c3084aa4ad16", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-rootEventRecorded.yaml", + "type": "file", + "size": 393, + "sha256": "082f6f8781c18637d80f4e3695f126c8687a5b16fe1b68549919770fd2c10746", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-scopeInitialization.yaml", + "type": "file", + "size": 406, + "sha256": "6b6286e392906ec770bf3800df0a0a351cb0ae2b7fddee6dc5906ff62496fe88", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-scopeOpened.yaml", + "type": "file", + "size": 376, + "sha256": "db705ed7cbd60121a18d870d9d19e2416e37ec27b4ba43d5dff9aaf2f8100b80", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-terminationRequested.yaml", + "type": "file", + "size": 403, + "sha256": "e1a95cc3c2a1ac8af9ab3c17b2fdfcde1d936456dc022b6bb5215552103af352", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/processor-triggeredEventDelivered.yaml", + "type": "file", + "size": 412, + "sha256": "1ca61279c5e20c21ae468b018b94fafed3c4a8437627793d4d721f654c4e42f3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-directIdentityHashBlock.yaml", + "type": "file", + "size": 406, + "sha256": "b779b31b1aabd04fdbcd4356d4c3e88eb0a96dbcab8bf292a5239637c8005a8f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-integerLimbOperation.yaml", + "type": "file", + "size": 397, + "sha256": "b13ae679fe816c37d9417bc8c48f97da4fc5c5214ffdcbd0f827979e5c41c40f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-listFoldStepRecomputed.yaml", + "type": "file", + "size": 403, + "sha256": "49cf8b09441621dc19694a5d21b4e566cbd06583e067e27d46dc9452e848eb49", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-listItemRead.yaml", + "type": "file", + "size": 373, + "sha256": "0c693c7315f39cdf5a7de6247e32bead9ad11494b500b40ed8c2f5ba3799f131", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-nodeIdentityEstablished.yaml", + "type": "file", + "size": 406, + "sha256": "4307d02c921b013343ae51d8606ddcc9d82a8d2d4d8f098db92436d890e96fe4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-nodeManifestOpened.yaml", + "type": "file", + "size": 391, + "sha256": "c116446f8b48457c20d0457196e0627dba58902db6641bdcd3f0ec19b0f92bd4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-objectMemberRead.yaml", + "type": "file", + "size": 385, + "sha256": "966e439577306f78db5705010dff519ff1f7121b7c7f9ca06a03f0d550d01a46", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-objectMemberRebuilt.yaml", + "type": "file", + "size": 394, + "sha256": "fb6c546ea8a39f52c4626575ed0f824b1037d883ad5c570aea94013decb62411", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-scalarComparison.yaml", + "type": "file", + "size": 385, + "sha256": "8b0b284d8c15364e07fcd6e78c51135cb8056b1523940d8742c3a08c537d4639", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-schemaPredicateEvaluated.yaml", + "type": "file", + "size": 409, + "sha256": "0647afac6e094eab37e588d6f880915f9a00263c07e8d2a5d8d885f89498df97", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-sortComparison.yaml", + "type": "file", + "size": 379, + "sha256": "850f67a504781e6a8c5b683a3d09324910469a9ee82d8645c087837e8eb01fb8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-subtypeCandidateTested.yaml", + "type": "file", + "size": 405, + "sha256": "5964528d3c9cbf239266423318b209c97c62c49ea354e6f54bfb8a6330a2d671", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-textBlockConstructed.yaml", + "type": "file", + "size": 397, + "sha256": "88366d60ac4b6ef06125830bb2a744cf636a030f5691f2d6631d356bb0d94e45", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-textBlockExamined.yaml", + "type": "file", + "size": 388, + "sha256": "0fa4fb402234e37dbb859dbebdc09f2d536ba2b06bd396628d56bc881091f79c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-typeEdgeFollowed.yaml", + "type": "file", + "size": 385, + "sha256": "95110456383dc6384cdb5c52c30c60b1ec51f2a1c3a0f6ac21900449dc97df0d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-validationMemberExamined.yaml", + "type": "file", + "size": 409, + "sha256": "97d5b4e543d47be73bf828b8539b301a1c84bfa0d121cc8a0009b3016bd38d48", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas-micro/semantic-validationProofReused.yaml", + "type": "file", + "size": 400, + "sha256": "c390474eed46d3d2876728e2aa716a71fbb8e9e0e0fa76bfbbe7618401938ad7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-01.yaml", + "type": "file", + "size": 1291, + "sha256": "92e6d1736c5b69d2aa6917e55e28bd6067d04159f2903246e448cf415c4b930c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-02.yaml", + "type": "file", + "size": 1356, + "sha256": "f0400b5b02bcbc9caae68db11062e751785534ff0d4906dc1cf20b5e31250ed3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-03.yaml", + "type": "file", + "size": 1365, + "sha256": "e6ba42a0ffa842910e7a1cefb8e2d1746de4b9fc47306f79f231d1a6191bf34a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-04.yaml", + "type": "file", + "size": 1368, + "sha256": "cac066dfa3479feaea971996ce40031fb63d3acd132d32bfdcf30f040261759b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-05.yaml", + "type": "file", + "size": 1419, + "sha256": "f13b26dcce381c60d1bd45c02e07e45f65674895f75157561679a10fd112e4f5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-06.yaml", + "type": "file", + "size": 1356, + "sha256": "cc9b571a96cc69af398d20e429b61be049d271b8583e809cfe210a240d402db9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-07.yaml", + "type": "file", + "size": 1381, + "sha256": "ee2eb232c6a2af0a34c6671197e355de7eb4b3de3a317d3b1c9183d2a1016717", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/gas/c-gas-08.yaml", + "type": "file", + "size": 1351, + "sha256": "fc6720c09e94cc5c342ef5652e4e137782ec1eb4f4e872df4bc996cdc8342020", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/idx/c-idx-01.yaml", + "type": "file", + "size": 1631, + "sha256": "c182f850fb2ab86147a16e4786a3a124a29e919699fc335335a8071a84b10736", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/idx/c-idx-02.yaml", + "type": "file", + "size": 1793, + "sha256": "aea6b2a8505c39040c2a29116ddb9b95d154231bc57c8ebc7005ec95fa458349", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/init/c-init-01.yaml", + "type": "file", + "size": 1367, + "sha256": "6d643b1ce7576cc9f3f89f6ae8c4136f65f6e309700910a128fb257c7ed469a6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/init/c-init-02.yaml", + "type": "file", + "size": 1385, + "sha256": "5eab92195c4976c30cd9d2ce3753bd3733d81f13914ee93d2415ce326c9275c7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/init/c-init-03.yaml", + "type": "file", + "size": 1390, + "sha256": "6cc4512518a85709a8df9066ccb8d253bd4eb93066fbe9eec385a71c04fa06e9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/init/c-init-04.yaml", + "type": "file", + "size": 1596, + "sha256": "ec488e2a6a38e7d2c1ace8bb0c04aa0a239cf012b63438869c84468a6bf9b55d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/init/c-init-05.yaml", + "type": "file", + "size": 1294, + "sha256": "62ee635750a25f0cfc87c522bbbd98033d7339e3203e4f460960dbdd8ad7967d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/init/c-init-06.yaml", + "type": "file", + "size": 1711, + "sha256": "0801999b7e39cf6ca92a85e00671bd3e723ac70950bf38fa8a1bf9b6e2ed599c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/life/c-life-01.yaml", + "type": "file", + "size": 1309, + "sha256": "2a0ce36665be1125415f0272a5a8caeb3d29e435f919aa48ccaffd38d5d417ec", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/life/c-life-02.yaml", + "type": "file", + "size": 1480, + "sha256": "e921cdea5ae1a6d252f3ee37dfd6929228dac9cccbe622023744110ed3315c00", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/life/c-life-03.yaml", + "type": "file", + "size": 2145, + "sha256": "dac1c17f097abe490f35f68e25a638683492d3041b2b83d690dd692435470388", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/life/c-life-04.yaml", + "type": "file", + "size": 1458, + "sha256": "10beaa4cee851a1ea457d2ef6d93d3a6a2ce1ca8123fe6f3722083ddc3f40828", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/manifest.yaml", + "type": "file", + "size": 24387, + "sha256": "4b225182b110a2c808d539b614056b70c1ee449396c0d29d1b07f1d407647c84", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/projection-catalog.yaml", + "type": "file", + "size": 20011, + "sha256": "3f8a315495a3b46638b71e077a089d807181204c36cc1ebd9f7e9df0c25a595f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/prot/c-prot-01.yaml", + "type": "file", + "size": 1500, + "sha256": "81a3a77b7c8bd2a2d5bc93e97d8fc71a712485ddfb836fe06e02c744d78321cd", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/prot/c-prot-02.yaml", + "type": "file", + "size": 2008, + "sha256": "1494f750e1e9b0464c6edd61018898133d83f3cf594a521c5cc7046c7745a287", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-01.yaml", + "type": "file", + "size": 1558, + "sha256": "3ac6a773e5dc3ac33f2cfdfa711475fea099380bf5a958c9c25ea04185e05d32", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-02.yaml", + "type": "file", + "size": 1724, + "sha256": "36c854be71f1454da2f353b9fc8034d228b610178f03e052d132823a50bf73d7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-03.yaml", + "type": "file", + "size": 1469, + "sha256": "b1aa42b3f9269141cb492028fbb528c74ea3410241635faba6e6ac465cddfc2b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-04.yaml", + "type": "file", + "size": 6074, + "sha256": "742eb6c00aa5f5c88e07686a97a83da7dde95324188af5bbfddce42cf68dd729", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-05.yaml", + "type": "file", + "size": 1535, + "sha256": "93d8d4d82dcb5d91af1c4ac8ba8404aa948687062bfbe31eeee475eb8678f9b2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-06.yaml", + "type": "file", + "size": 1628, + "sha256": "78fa2a960e1506101b317014549ce5bb76208a942a8bb2174322bbdc11ba7f39", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/rep/c-rep-07.yaml", + "type": "file", + "size": 1634, + "sha256": "a01eee6a912e439624dc8bacd54012c8cbf1ee41dc54f960714b7940fc250eea", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-cyc-01.yaml", + "type": "file", + "size": 1142, + "sha256": "2bba2af23a4296636bea63a5a84064ed42e55f9ebc7ad77bc5e8175aedad8d52", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-cyc-02.yaml", + "type": "file", + "size": 1049, + "sha256": "510f3654482245c6745cf19ffa1279b8a3328d35c45d8aaec47427fc6230b301", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-cyc-04.yaml", + "type": "file", + "size": 1627, + "sha256": "961fb1d133ee75de4279409b71e397adbe7fd8844b835edcb512ab8ee68ee366", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-snd-01.yaml", + "type": "file", + "size": 1461, + "sha256": "80c75a7ce0fdb92cfb2b78a57a20afb2e382efb9263a9ba7eba859805a66ce75", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-snd-02.yaml", + "type": "file", + "size": 1487, + "sha256": "2ff52b8c93607cbc1eba4427d9e6cf7143e297fc7b69fe191c212edd41c193d2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-snd-03.yaml", + "type": "file", + "size": 1456, + "sha256": "50263b812869edf0838464be88fcbae20398ca55ceba12300af6e105d75f45a6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/snd/c-snd-04.yaml", + "type": "file", + "size": 1615, + "sha256": "f1fbeb3fe4633b4c0158a5c8e95360cbde31d1b27016e16679d8a7c37201a7c3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/upd/c-upd-01.yaml", + "type": "file", + "size": 1512, + "sha256": "7689ab330c36cd48c347d8a0ac331fddc5ef861c1101faeea267e30b2fc8f66b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/upd/c-upd-02.yaml", + "type": "file", + "size": 1416, + "sha256": "8af63907c4d0c6a0ada749179feee06403a20298ff4b3b0e1021a714aa5de47a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/upd/c-upd-03.yaml", + "type": "file", + "size": 1975, + "sha256": "5a6f3041342d53353b40431e213c7ea54efda7f2eea0492b1182cc4adef1dc6c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-contracts-1.0/fixtures/vector-coverage.yaml", + "type": "file", + "size": 7243, + "sha256": "11bd9bbfa84b0008b6340918dcea501c8da17995318750d9a232600be97db6b7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/HARNESS.md", + "type": "file", + "size": 12395, + "sha256": "cf87fb9cc5d86ab2c3067640bfb95b4dede39dd02a68795068deba2d7a984161", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/README.md", + "type": "file", + "size": 962, + "sha256": "a110099c94b5def40e9995500dee3592e9bc31ab0100f40f5bc9ae4fd85a2f22", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_blue_directive_rejected.yaml", + "type": "file", + "size": 146, + "sha256": "0a8eaa2f96acea33a477a5d88d7e118f7f22dfd477521ddc8b0f0f8e7db59cad", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_double_1e0.yaml", + "type": "file", + "size": 194, + "sha256": "84c80e1feee0b75a8404c691c91cf9c6c33fa86d3f230516d6d64dffc6aa1b59", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_double_negative_zero.yaml", + "type": "file", + "size": 417, + "sha256": "f6327c2dd9c017978c42ef3444d21dc64b388cc9500f8f73ebaf5a938d869b32", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_double_overflow_rejected.yaml", + "type": "file", + "size": 252, + "sha256": "6ae92ded7f6fe24ebfbb4cd64ef6096959b99fbdb546033c185ff77ed144c0f5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_empty_list.yaml", + "type": "file", + "size": 193, + "sha256": "c826d47f1cd15529d57dfef3022499c7274bb2945dd5e2fe21fe6e2d5a3b460f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_empty_object_list_element_rejected.yaml", + "type": "file", + "size": 206, + "sha256": "38271b3833a2b1596f6a36f7bb6e81225e69423e1c07da3ed0251181b9372e7c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_empty_placeholder.yaml", + "type": "file", + "size": 263, + "sha256": "c39caecf2029b86ff9ef49692eef86db8b61cb75d09d1db87712b61d90136893", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_integer_1_vs_double_1_0.yaml", + "type": "file", + "size": 231, + "sha256": "078bc1991243f1a53c9b0b2d98b6419b34e39c84d00107d9e80bd3c33fa6034b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_invalid_this_placeholder_rejected.yaml", + "type": "file", + "size": 204, + "sha256": "13ca60488637954359054a5d52df91fce17369f0c66e677d3a66fbcf15492704", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_large_integer_quoted_explicit_integer.yaml", + "type": "file", + "size": 346, + "sha256": "9a830c960cb863491350dc33e398872cd72a8a3cfb57c7595cdf3fd630a8a223", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_list_sugar_equivalence.yaml", + "type": "file", + "size": 256, + "sha256": "242cc766eb5b8801cae52486eb31369769c66eb49eae75aa52123ff2baa7ceb9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_malformed_empty_rejected.yaml", + "type": "file", + "size": 182, + "sha256": "cc81b2fbcd9b7d501ac036aa9ac64879666678367814a08494fe86d9577ddcf5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_mixed_reference_rejected.yaml", + "type": "file", + "size": 198, + "sha256": "ef81dedd51cdb3fc4ee713be4cd50bc16d06cb35c80782bdd2eb0691b6f6cbd0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_nested_list_not_flattened.yaml", + "type": "file", + "size": 136, + "sha256": "8b26f745d2a32629a6ab051ef6ebf47f3a369a4d62b6a9f435ca7b396a6be770", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_null_list_element_rejected.yaml", + "type": "file", + "size": 192, + "sha256": "8683b9b4abdeabc670ea2901245e9bfb80c927428c9ba4eff0fc274589fcce1b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_object_field_null_removal.yaml", + "type": "file", + "size": 251, + "sha256": "6a87876c6446fe73b1c9bd517e1a24ad9d2edd38618417848491cbf435e403ed", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_payload_only_scalar_typed_identity.yaml", + "type": "file", + "size": 360, + "sha256": "26b626dc9586dc22fd1df15112b62c0b93d1bc663befa985f54ddc8886fc961f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_placeholder_changes_list_identity.yaml", + "type": "file", + "size": 152, + "sha256": "77b1ea27940e23f1dbdc2a595e0a80361877e5644e88d0254be55d56fc2234c7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_plain_blueid_validation.yaml", + "type": "file", + "size": 183, + "sha256": "021377b802ab212b23e70f5306f01fd8d6fab715a8786b221f6905754078ab87", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_pos_rejected.yaml", + "type": "file", + "size": 219, + "sha256": "b380e8fb8bfcd0737d53a08bb9e051fd001e29bd4224ee590c08ea2020d2e9cc", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_previous_invalid_blueid_rejected.yaml", + "type": "file", + "size": 273, + "sha256": "e48f0eedfbfc0747c1ba138e039d5ff05022c76643be0786194ce16cff2bc68d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_primitive_inference_all_four.yaml", + "type": "file", + "size": 235, + "sha256": "897a56183897885821ddaf696d840858e3a3d9f0199fee3aea0b90fdb924ab5d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_replace_rejected.yaml", + "type": "file", + "size": 201, + "sha256": "ddb0c0fb8127c295424d10a9d76e40432524d84a94d151f51038d7f38871580f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_root_empty_object.yaml", + "type": "file", + "size": 191, + "sha256": "9043e843ed8e98c12c27033c04e640dba3fd393b8d5caabcac2917baedb49704", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_root_list.yaml", + "type": "file", + "size": 185, + "sha256": "9508ceba9bcc3d2528b05ecfa6b0ef30b4fa50ca40accc13e1562cba39eea109", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_root_null_rejected.yaml", + "type": "file", + "size": 148, + "sha256": "55788516c73dcb0103712b5434e2426ff149f47b7c4edf949b7e7089d40836f8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_root_pure_reference.yaml", + "type": "file", + "size": 257, + "sha256": "f2ce23591aa5daec01003620aa5e55b7de07a0b2ee65384d6fb0a212c8be409c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_root_scalar.yaml", + "type": "file", + "size": 187, + "sha256": "05a7fe94fd887bfa5943010d0e26caa6bf9fa7d32a4ed8942dddd2ef37334ecf", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_scalar_sugar_equivalence.yaml", + "type": "file", + "size": 238, + "sha256": "5025a4ba0c8383737352d994e2884b8bd9469228020f20e3388fa603564793db", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_type_alias_rejected_in_direct_blueid_input.yaml", + "type": "file", + "size": 271, + "sha256": "d0e81bde121f3a8332e1537573112963bb5a7e6ff7cf522b2a7af02b1db60f42", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/blueid/B_unquoted_large_integer_rejected.yaml", + "type": "file", + "size": 214, + "sha256": "7a064c28d9fb3a5e9e438ff0e358aec465f7d52c0d6e4e9674c5f0d33e49eff2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/circular/C_circular_reference_set_ids.yaml", + "type": "file", + "size": 354, + "sha256": "cb8e4032b74502ed365b3f1f2a94c02d172447b83d6fa1d30715637b6bc2b15a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/circular/C_duplicate_preliminary_ids_deterministic_or_rejected.yaml", + "type": "file", + "size": 344, + "sha256": "cb3b229e7e22aa19ea955a2558cfea37bc277b978f473e7d5eb5e9a0a41a90d4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/circular/C_this_placeholder_rejected_outside_cyclic_api.yaml", + "type": "file", + "size": 215, + "sha256": "b31673827d615a8ac919b1928eba7a4e9f7d79b4c3392cb18430bb818023666a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/circular/C_three_document_cycle_stable_order.yaml", + "type": "file", + "size": 467, + "sha256": "711678e1e0e9d8cb1551685095422559cf012b71616410393bf8fd3172559e9a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/circular/C_zero_blueid_rejected_in_final_input.yaml", + "type": "file", + "size": 252, + "sha256": "590556fb9278d2cab05ff5f217392e4c09f15c938138cee379aae4f58302f7cb", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/circular/F_opaque_cyclic_member_fragment.yaml", + "type": "file", + "size": 673, + "sha256": "0b8d4fc3a729db38a36ef78751ba7b45fe495987fad18d42baa21e66f6c7820e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/fixture-schema.yaml", + "type": "file", + "size": 4312, + "sha256": "957dbb5cddad812ce7e2a22c3d300207dd3297f821334a184b89ba36b436b564", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/F_inline_reference_partial_equivalence.yaml", + "type": "file", + "size": 525, + "sha256": "a6f354ff33764cfffbe20f22781e202481a3af49c2343035459cbf44402ff92f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/F_prefetch_does_not_change_semantic_result.yaml", + "type": "file", + "size": 552, + "sha256": "81561193bb712a3e681d9919a694370fce18292cab52f0c8bef3900a445383c1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/F_root_reference_demanded_path_only.yaml", + "type": "file", + "size": 776, + "sha256": "69c33e8bdc5ab431a02cbb63f17ec9b43fa10cc5bb733602f22f4728277f99d0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/F_unrelated_missing_reference_does_not_block.yaml", + "type": "file", + "size": 867, + "sha256": "d0b12d37e0f768ef89c325f4b3b0b64f9a3a3cc6de3029c8ebaa4909c70d4219", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_incomplete_cannot_canonicalize.yaml", + "type": "file", + "size": 310, + "sha256": "6ae753b5674aaa220ea0fdb0f3e1ee4b733a28f58fb59954e9c4e4764fe44f45", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_limit_does_not_prove_absence.yaml", + "type": "file", + "size": 353, + "sha256": "39cb53aa0174def4821c496087ef1133ee1b68c82a3fceff08b0e62bcbdaba2f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_limited_resolution_equals_complete.yaml", + "type": "file", + "size": 567, + "sha256": "7f94bed19fbd37160a7b6b4932411b0efa87cf2017796add2fe7aac25b1c467a", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_provider_unavailable_does_not_prove_absence.yaml", + "type": "file", + "size": 401, + "sha256": "d0d06ee7bc205853d55bde1767280cc9ccd59d1f4e43c7a6894ec5da27a0c517", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_reference_backed_contracts.yaml", + "type": "file", + "size": 398, + "sha256": "c31fa2abbab57002f1f22656db3b3d67dffa813c0d1d65324f4b75c6e754565f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_reference_backed_schema.yaml", + "type": "file", + "size": 373, + "sha256": "c1c573f4cc79e9c2b39b7eeadca23bf5eecfbd213971dc9561ca7aadac732ac7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/limited/R_reference_wrapper_not_semantic_child.yaml", + "type": "file", + "size": 399, + "sha256": "e51cbd91eb2817766d38f01185614af104f00d2b036ad7a5fda62e9aeb7910d3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/lint/L_no_profile_era_language_conformance_terms.yaml", + "type": "file", + "size": 895, + "sha256": "c1364c7d04016f5ad312acafd42fab0b3c48d20c37694c6442ff4242d1a6f991", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/manifest.yaml", + "type": "file", + "size": 27736, + "sha256": "dc4bad7ecb016b92d046b5e1ae962ea2ecbc63de9208322426f9f0b2cf86f39f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_absent_applies_baseline.yaml", + "type": "file", + "size": 304, + "sha256": "b3f74939b1e51c2637cfb13ce9ec78034ac92cd72aac47971dc730c57e4a1f89", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_builtin_alias_override_rejected.yaml", + "type": "file", + "size": 344, + "sha256": "7bd3234a79b7127b8d66390516dd5b4c2e73a4ee1d1c48051718fb2e6a5f1ee7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_builtin_alias_same_allowed.yaml", + "type": "file", + "size": 390, + "sha256": "a21f4bafca2d737231c98f680d1372a03ab01f3ea113ed334aa33a0b9b8cfcb9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_empty_directive_equals_absent.yaml", + "type": "file", + "size": 333, + "sha256": "9ed8b9c456cd9b6ccc700fea0b92144fd9269a4d297e122264f0bd69e48120ae", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_imports_only_type_positions.yaml", + "type": "file", + "size": 468, + "sha256": "5351bda8c625591996d553986be24fd93bab608c6816cbe91fa7b94cd725712c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_inline_imports_and_transformations.yaml", + "type": "file", + "size": 747, + "sha256": "13cfa991cfceaaa60a2e87a6be0d2521c99e388815060bedac4af7b423c9accf", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_legacy_items_field_rejected.yaml", + "type": "file", + "size": 394, + "sha256": "d1dda6f94a752142f2e35a3eb80c7e2672d70fd5067dca41cf1052803ec61334", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_nested_directive_rejected.yaml", + "type": "file", + "size": 245, + "sha256": "86b68137ca606b0c287cc85fc15e8a0a1292534d1095d346f856cf787c8a6750", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_preprocessing_idempotent.yaml", + "type": "file", + "size": 490, + "sha256": "2de7784e85925af3e0dcb3f3d1fd848968ffe0a45081e22fba2e82166e43ed95", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_profile_field_rejected.yaml", + "type": "file", + "size": 331, + "sha256": "bfa58b6b1362088d12239af14389e9f7b2fe75e4c4837536b7d77391975081a7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_reference_backed_components.yaml", + "type": "file", + "size": 928, + "sha256": "f4d434a6e054fe4e37ca33aee2e5f173d1c3d8c20b6fbd955d129ab12bd891bd", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_reference_directive_equivalent.yaml", + "type": "file", + "size": 970, + "sha256": "78265053fb6ca991f8193be95e0a62386094690a12a3dac417d9420535213409", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_reference_invalid_evidence.yaml", + "type": "file", + "size": 497, + "sha256": "fef4c30b723b34eb5a6f5fe48fd2cd3a8832a0d3d9e1c59e339742734b35c21f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_string_alias_resolves_exact_directive.yaml", + "type": "file", + "size": 751, + "sha256": "6d465b6bcdfb1e1bac082218903b1bd6ad62514a098adccb34d4a76ded596211", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_transform_introduces_blue_rejected.yaml", + "type": "file", + "size": 403, + "sha256": "d364aa5e02250596d31ee59942efb739f5e34bf19e0911b9036954d9dd9fd42b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_transformation_instance_reference.yaml", + "type": "file", + "size": 594, + "sha256": "27ce2397e3352e011f3330776934974168db06db3cb40e8ea6399af304a9ffd1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_transformation_type_alias_rejected.yaml", + "type": "file", + "size": 429, + "sha256": "1d9ef55bb312d6848c37445c788fec3b8e44539e6cdd086fd107a660ebad7e71", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_transformations_declared_order.yaml", + "type": "file", + "size": 572, + "sha256": "916172ff24037f251cec0dbd75376d922cadf98992ee472fd8835b625fe843ce", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_transformations_reverse_order.yaml", + "type": "file", + "size": 592, + "sha256": "e4ea0fed18ea7c38507b46f5287a935e3cf137f32042647ef4414c674b987e32", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_unbound_string_alias_rejected.yaml", + "type": "file", + "size": 268, + "sha256": "aaeb3a725b8e67ab7171ff2dc93f88952b59bbb535f19a92fc2a506cffa500be", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_unsupported_transformation.yaml", + "type": "file", + "size": 364, + "sha256": "d7069b648d3f9c4d0578bbe1c549bbbd68a5b8cd4a475f1892aab8c68b758ef5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/R_blue_unused_import_no_effect.yaml", + "type": "file", + "size": 405, + "sha256": "adb8c7603694de446c3a8befaf44963fce2da57998ca95db5e3c462c961fafa1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/registry/AppendRootTextTransformation.blue", + "type": "file", + "size": 222, + "sha256": "48f02ec336a35e543838c69de95aa95407916c953b2cd6c374eab170c37ab918", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/registry/HARNESS.md", + "type": "file", + "size": 1551, + "sha256": "4d104b7043747d3815e8a211358b3bb2569c4fd129720fa80bd64eb22ea84263", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/registry/RenameRootFieldTransformation.blue", + "type": "file", + "size": 275, + "sha256": "c7a3fc5edacc45ab8456e4a0414a11f22434da8e8d80632354f33c1010173eab", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/registry/SetRootFieldTransformation.blue", + "type": "file", + "size": 256, + "sha256": "097733a85812a4845cd7f699cf5f798b18359f45984d064c8af6e5df84121c36", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/preprocessing/registry/manifest.yaml", + "type": "file", + "size": 775, + "sha256": "572295001dce50893de283c88df4edb688b40b695873dd81438573a5ab7bc4b2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_all_language_vectors_pass.yaml", + "type": "file", + "size": 255, + "sha256": "5fa9b1e78ada4c9781b947fd1a546d4ad2d635526865feacdb0768d33e2c58f7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_collapse_does_not_produce_mixed_blueid.yaml", + "type": "file", + "size": 343, + "sha256": "3bfbf5f2fef852c6e4a398d6600cc67b4ce3f40e89f8b8fdc3705d55d307f0cd", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_collapse_nested_subtree_preserves_node_blueid.yaml", + "type": "file", + "size": 364, + "sha256": "3d3254ea79379ee7ca2c11db3db2ee4986946c491726a02edaa2a26149c45ef6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_collapse_preserves_node_blueid.yaml", + "type": "file", + "size": 316, + "sha256": "bb8774db37e9fe98f3be043ef12985722808072bc09998fc1d45c7207e2a5dc1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_cyclic_member_requires_set_context.yaml", + "type": "file", + "size": 400, + "sha256": "7e5dca83b45362e094d6a5d7bc20743f01acd8ac6017325518d0f7aabdefc447", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_direct_list_verification_without_elements.yaml", + "type": "file", + "size": 204, + "sha256": "f72a8d53761b29e29139b7ac49b6c41287363b05c37c0b8143091ec3c28300d3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_exact_graph_fragments_canonical_order.yaml", + "type": "file", + "size": 498, + "sha256": "d534eb681d3f13d2def93b84eac2d34cb0f8795acbde4976581053b39a462c25", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_exact_graph_fragments_roundtrip.yaml", + "type": "file", + "size": 700, + "sha256": "9b3ee95963a46b26aeb0eca5a530e39b9895a8c2635f585dd73e6fcf3e8425ff", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_expand_missing_nested_content_fails.yaml", + "type": "file", + "size": 271, + "sha256": "54c4c0abad32b39c3c98d1bde59f668f78f03fdb9987f4fbf18cfcc1ed949f17", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_expand_nested_reference_preserves_node_blueid.yaml", + "type": "file", + "size": 444, + "sha256": "b307cf01678ef3931b6a36aa3d611c64818f563e37420d03a68dd2d2ad64dfe1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_expand_preserves_node_blueid.yaml", + "type": "file", + "size": 365, + "sha256": "20154e3effe8db1fc76af8f4044bbf9d018bbc7494c3f5ca7824a27ce724305c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_expand_wrong_nested_provider_content_fails.yaml", + "type": "file", + "size": 379, + "sha256": "0378f316af26b2c726cb5db28ce4fc4667036a6598707032a2b6a0d9ab60c7a7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_list_prefix_anchor_not_direct_manifest.yaml", + "type": "file", + "size": 240, + "sha256": "251b6469cf8a788b4a9405a6999db586950208ad08c6ed53e44d5d1e495e59b9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_omitted_direct_key_cannot_prove_absence.yaml", + "type": "file", + "size": 350, + "sha256": "f2aec57977f2744c3cb30ea069bbe774d90f192aa0209257329c5ab796385403", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_provider_missing_content_fails.yaml", + "type": "file", + "size": 234, + "sha256": "e80a1e048c94cacfe326a7d036929b0824e3e9f69f1d7f687e60e25b2b07fb21", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_provider_wrong_blueid_rejected.yaml", + "type": "file", + "size": 393, + "sha256": "f96532088294d122d854d5c1d1f21a3dc0e970d0639b99be619bc7084b1c2cea", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_selected_expand_collapse_round_trip.yaml", + "type": "file", + "size": 428, + "sha256": "7e8cd6868e3d08722f3ed5f5ee50101f5d8d4a3214ebb4c86fae0d270ca64be5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/provider/F_source_provider_requires_declared_mode.yaml", + "type": "file", + "size": 399, + "sha256": "25fd6e7aa3e15bce8eee4587ee3054d0ca4df642870d20758f5bf9dbf3b21a13", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/changingCoreTypeDescriptionChangesBlueId.yaml", + "type": "file", + "size": 252, + "sha256": "4a558b8fe15f29c409e4314f2cf3a086a253c32169396b2615ab8c0e5fb5f220", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/coreRegistryBooleanNodeHashesToPublishedBlueId.yaml", + "type": "file", + "size": 296, + "sha256": "a4a539caebf7ceb7d5ab5c205c5ffc5c640e452b6714957f92d8affae9e886fd", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/coreRegistryDictionaryNodeHashesToPublishedBlueId.yaml", + "type": "file", + "size": 302, + "sha256": "704f9bcaa4eebacba2632c8c3875de50f1cd6409b38950d2de61b5d0314512a1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/coreRegistryDoubleNodeHashesToPublishedBlueId.yaml", + "type": "file", + "size": 294, + "sha256": "069e3ea3dfe5dfdc3f2ebc4e28fdeaa27ce6dd7fc6618effd6a1b786831d85b3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/coreRegistryIntegerNodeHashesToPublishedBlueId.yaml", + "type": "file", + "size": 296, + "sha256": "ddecf04048d02f99531c403efa203537a5c71965f61f7ad960df3a49f15e03a5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/coreRegistryListNodeHashesToPublishedBlueId.yaml", + "type": "file", + "size": 290, + "sha256": "f40785cc555664652bc92818e378f599242886b53abe84feff2ffdf2394a735b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/registry/coreRegistryTextNodeHashesToPublishedBlueId.yaml", + "type": "file", + "size": 290, + "sha256": "d66cc66adf01c639d3118ebfdaef81b81d6315d9ed02c0f0d5fbf3d7b0fd8a4f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/representation/B_direct_child_reference_equivalence.yaml", + "type": "file", + "size": 445, + "sha256": "4c7cd0e5f33cec8c9701d3cd458da3322e467004a0da0c548dbab5c316cf0dbb", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/representation/F_direct_node_verification_without_descendants.yaml", + "type": "file", + "size": 538, + "sha256": "d9be90fd4d39087021d3a51fbf53a963045f673c0e4a56c4c0ee28c746cdbc41", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_append_canonicalization_final_payload_three_items.yaml", + "type": "file", + "size": 437, + "sha256": "7aa00c087ecf48b933fa74a62c5e7f2b9fcd9101ca06a4a52f66ed1e5c1dbaad", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_append_minimized_previous_round_trip.yaml", + "type": "file", + "size": 302, + "sha256": "b7684f61a91710ab7ebd2bc4208f2a50f314dbbfcd75a3ddb97bd2d974586a62", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_append_only_rejects_pos.yaml", + "type": "file", + "size": 221, + "sha256": "143a99357d3d2e6a495d59481ad5c0016c88b1ab086b069d0929f5ed56360f4f", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_blue_imports.yaml", + "type": "file", + "size": 371, + "sha256": "b4094e7e426407c81048a89622ac75548cdadf372b9a997cf5746eb4f2fc3cf2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_blue_imports_type_itemType_keyType_valueType.yaml", + "type": "file", + "size": 671, + "sha256": "3899d8681b43c3ecd3250209734789f6ab346c83ea59a32ac941b366d1e57cf3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_canonical_overlay_no_previous_no_pos.yaml", + "type": "file", + "size": 438, + "sha256": "b42c4a39120b2faa587f828624c4f612cb8ab3a07f2e13ce8c9bc5abcb42fd19", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_canonicalization_deterministic_for_same_resolved_view.yaml", + "type": "file", + "size": 304, + "sha256": "497f1701d8a45ae5904f0da382a58c20246238c235031d367c4e58bcf758c9f2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_child_field_labels_materialize_until_overridden.yaml", + "type": "file", + "size": 671, + "sha256": "427f3700a00a50b6346b055a13101b6fc5721c99a46022dcf24ab7cce8f31bd1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_content_blueid_is_canonical_node_blueid.yaml", + "type": "file", + "size": 481, + "sha256": "040a8777d4f800f83759dac5984970852518ea0c30e27290f0b72fbf28a4cab4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_contracts_canonicalization_deterministic.yaml", + "type": "file", + "size": 396, + "sha256": "562c85f28ac7e626df84f3d8f5122549eb2be98470702879e34aa5a9e6a8e8c2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_contracts_merge_as_content.yaml", + "type": "file", + "size": 391, + "sha256": "82f311f7bce4bb293b3ed41b5d1fc148403e5b94373883d8d0b586098b365c7e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_core_type_compatibility_nominal_by_blueid.yaml", + "type": "file", + "size": 359, + "sha256": "dad759ee21fde6630a929119a0c23d1a615244a4f3212d5a82fde6f89ccd6b4d", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_default_positional_policy.yaml", + "type": "file", + "size": 211, + "sha256": "abc38246c6b17600f7d0adacc132c9d6d267736311151020c84758731b7c6a21", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_dictionary_key_canonicalization.yaml", + "type": "file", + "size": 255, + "sha256": "d2689135d463cd03b8ca28c79d8f805af342ad073177886d61b2544a928da79b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_enum_integer_vs_double.yaml", + "type": "file", + "size": 254, + "sha256": "72c965a05639a0af1c04c4e9b6a941cdb09c41cc7ca748ed5148d7a76d671f90", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_fixed_value_conflict.yaml", + "type": "file", + "size": 155, + "sha256": "616eec36b5707e09cbc0753ab62160a875eb051b6c40ef9adbec08bf5a4a45c9", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_inherited_append_only_policy.yaml", + "type": "file", + "size": 374, + "sha256": "240ca1dcd082cea999734ab5c63b0d626b9873cdd00d0d9e30b3f34fc982cd37", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_inherited_integer_large_text.yaml", + "type": "file", + "size": 251, + "sha256": "c513d9773639bb454830d8742c9314a2e4c7f709a754616a6b8ca337fe9d0224", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_inherited_item_type.yaml", + "type": "file", + "size": 353, + "sha256": "2e1a39f2e4aeeadeed1cbb8195192f9aa68be4325cf65995ad28f28217047801", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_inherited_keyType_valueType.yaml", + "type": "file", + "size": 465, + "sha256": "3c98bdc4e2d3edc0069ec5d662004997e8b5e1d3afcb6802c7968765411c6cc3", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_instance_field_kept.yaml", + "type": "file", + "size": 276, + "sha256": "15bf2394d13e4716a9e970244771097f77762cff13f8278fcbd2dc6a13049723", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_label_override_rules.yaml", + "type": "file", + "size": 481, + "sha256": "aa6b151436f4f3875d25471369b79bd3a063c318409f5172d8b2d85ccdd3ceaf", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_labels_matcher_neutral.yaml", + "type": "file", + "size": 239, + "sha256": "0433bac47902ae2b45f9f87a69753a95cac09ccc7f99a9616cbd2f9d74865aa5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_minfields_counts_ordinary_fields.yaml", + "type": "file", + "size": 203, + "sha256": "4e9f4bf229ed2d6af10982a895f8a02d886cd80bfb768d828f0028f7b06f3f4e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_minimized_overlay_round_trip.yaml", + "type": "file", + "size": 371, + "sha256": "c63b118afe11b111d2b4da6feec0945722dd20c679ec20b9a9a4637ed1d27fcd", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_noncanonical_inherited_integer_rejected.yaml", + "type": "file", + "size": 205, + "sha256": "2c86ab53e6803d1fd6c0969ff722059bce64d1327ff1fb74568df665dae2ceb7", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_positional_canonical_final_payload.yaml", + "type": "file", + "size": 273, + "sha256": "2d27905db8b371681f3e6b4ea883995cbf972f79389eb5b6bd871024f53cc41e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_positional_minimized_round_trip.yaml", + "type": "file", + "size": 297, + "sha256": "a768618f5eeb32c80d8108b339990d990bb11e07412d59d03d7a2cbbcfed5027", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_positional_reorder_or_remove_rejected.yaml", + "type": "file", + "size": 369, + "sha256": "ad47beabf9caaabc798979ed10d23e3f6ef9de518a10fb31aa8b7c4d4713aa44", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_previous_anchor_mismatch.yaml", + "type": "file", + "size": 279, + "sha256": "37bf04ea74080392a9c0c9ed5f15290e68252b5777b48e8a8a2b46c989af34f6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_provider_reference_canonicalizes_back.yaml", + "type": "file", + "size": 406, + "sha256": "b2a904e002b06469f3f5b87f5143254b5a0247f8258bb6b6c4b2ed0e363c360e", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_provider_reference_with_overlay_keeps_overlay.yaml", + "type": "file", + "size": 487, + "sha256": "b769437a9f8e602db47eb4fe623a6fb3b2e44f331c4ed539b90b6f9c2d2eca19", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_quoted_decimal_without_integer_is_text.yaml", + "type": "file", + "size": 167, + "sha256": "f65eb13b311a6a369a90f701d983787ebe077cac891fd56d3812ac06a3822c64", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_required_semantic_presence.yaml", + "type": "file", + "size": 346, + "sha256": "79155c7a9ad9bbe9f714875c34749ecfa76f3525023f42ddce2f1f17c4c354e5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_requirement_overlay_valid_and_conflicting.yaml", + "type": "file", + "size": 370, + "sha256": "dde3300e68198a6af5f915101eff0c1d130b169740d5ea7c9b093d1f4f9869b5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_resolved_form_not_direct_content_id.yaml", + "type": "file", + "size": 263, + "sha256": "5a872fdd271f9290d5835dd7c1c46ed91901bfad3a4da857e053e27fb52c294c", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_accumulation_conflict.yaml", + "type": "file", + "size": 242, + "sha256": "8cd273e7d6c629cefc686a7859833b53d6992faa9581c58f46c8b8223dacb972", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_double_multiple_of_exact.yaml", + "type": "file", + "size": 410, + "sha256": "231e3ca7e410ca7e2bd4b70a6a5844c84c6320d042f294a279878267bba7fae2", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_double_multiple_of_rejects_decimal_approximation.yaml", + "type": "file", + "size": 372, + "sha256": "2dcaf2eee9db91a81856b1081ef81692ee77128959b25164d74e9f84e48579f8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_enum_order_and_duplicates_canonical.yaml", + "type": "file", + "size": 430, + "sha256": "d82992c16594bbba6078992394f6218ba0acb3200d0368594226e705e7ce1b7b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_integer_multiple_of_lcm_merge.yaml", + "type": "file", + "size": 345, + "sha256": "36cbdc681b2d3be66ccac811670ce94faf4babdf824ac7f7c6b3cb860dbccdeb", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_large_integer_minimum_with_type_alias.yaml", + "type": "file", + "size": 415, + "sha256": "931045e2da6439f2c14fe1c7402891e8d0639b1d96210c56b38cea94916c22e1", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_unknown_keyword_rejected.yaml", + "type": "file", + "size": 173, + "sha256": "79c33eaf16a0e7fc29bd9ecbb9ebf43a421471212e6ddfc6a8df41bff399b7b5", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_value_shapes.yaml", + "type": "file", + "size": 231, + "sha256": "d1da3034acbe0f7ce80974489428df0ed1a75e323a2cd8b7eb847e39389b3f24", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_schema_wrong_kind_keywords_rejected.yaml", + "type": "file", + "size": 271, + "sha256": "78dcbdb3f0e3bce56e1d8f51971e72353e35ee6365becfba683e8d44aaf75af0", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_source_empty_object_list_to_empty.yaml", + "type": "file", + "size": 269, + "sha256": "7bb8720de2bd13f791afc615840b70a744ef70eb0e163501caa2269eed776f65", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_source_null_list_to_empty.yaml", + "type": "file", + "size": 255, + "sha256": "f03869f58309f257909c99dc89aa06b79f0bcfbe30f136b31e7ea06b32978b23", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_source_recursive_empty_object_list_to_empty.yaml", + "type": "file", + "size": 324, + "sha256": "7b918ed76662e38dcdb39c9adca5423e15f731ee0fcc1e531593528470f6cbaa", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_specialization_creates_new_node.yaml", + "type": "file", + "size": 691, + "sha256": "fa980fd9d8c1aef35f85191a7385aa04ac63d9c5a30f465b2d791082b3cd4ae8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_top_level_type_name_description_not_inherited.yaml", + "type": "file", + "size": 463, + "sha256": "3845bc40a3e6656411871f50ecf91c8283599c27d8c6ff3231f8a781e2fd132b", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_type_aliases_removed_from_canonical_overlay.yaml", + "type": "file", + "size": 420, + "sha256": "6f4b50ff9cf9624f73411212c61a125733d45d0007cc7686d33e800f7e2e11d4", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_type_chain_merge.yaml", + "type": "file", + "size": 296, + "sha256": "c787a0b85e6dfd2624d32f47d6a1faaa14eb6d5994f2cb4c2ee3e4a350fc0ea8", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_type_cycle_rejected.yaml", + "type": "file", + "size": 569, + "sha256": "4e879fba25dad8cc2504d3f64b40c0dcce241367dbf00d79c62a2f102bb85117", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_type_derived_field_removed.yaml", + "type": "file", + "size": 282, + "sha256": "28af5be22a7f268de871c7586dc2088954a2c3495bf04d711a3702a6cb1e6215", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/resolver/R_view_path_root_is_empty_string.yaml", + "type": "file", + "size": 497, + "sha256": "107154b2e46350f5633e99ee617dadc2958525b6bbc689a1cd9c9407c2d6d8c6", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/blue-language-1.0/fixtures/vector-coverage.yaml", + "type": "file", + "size": 8551, + "sha256": "dcf6a25c83c6c1efc0d1141a73e9d8fb534cf231fb0ffff28d7128b22c9b4c57", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/contract/1.0/spec.md", + "type": "file", + "size": 149174, + "sha256": "6406153791ed99cf97163726b8d2a272e3f0ca1078dc6c9f69b81855d81e5c81", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/language/1.0/spec.md", + "type": "file", + "size": 198796, + "sha256": "a234b0b42190a7982809781b5efdaa2e5f1ab4b7f8d870fbd1ffe7020cc7e869", + "mode": 420 + }, + { + "path": "blue-conformance/src/main/resources/release/blue-language-contracts-embedded-modules-collection-paths-1.0/PACKAGE-MANIFEST.yaml", + "type": "file", + "size": 61850, + "sha256": "8e83270fbae8366d1c8cf6007a90b41acc723999b1fd49efe5de984486d75067", + "mode": 420 + }, + { + "path": "blue-contracts-core/build.gradle", + "type": "file", + "size": 1225, + "sha256": "ba04452f13550201b00da96b07e22f1e0340bc122c77ec2e2a29bea36e53cc8e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/jmh/java/blue/language/processor/EmbeddedCollectionBenchmarkSupport.java", + "type": "file", + "size": 26943, + "sha256": "7578ae82addbb5dc042d375f2c5cea266d4dfb430218e9c54577ecd870a1c32b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/jmh/java/blue/language/processor/EmbeddedCollectionMetrics.java", + "type": "file", + "size": 6405, + "sha256": "58dfa7bdacfd5349d82e8ec07b585fdac9256fd28a676c9e3766a6115ee1b49a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/jmh/java/blue/language/processor/EmbeddedCollectionPathsBenchmark.java", + "type": "file", + "size": 11730, + "sha256": "2361af27fc8be20231ca81faa892b25aac10d9175ff2d69675d813382ffaa0ae", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/jmh/java/blue/language/processor/EmbeddedCollectionProjectionState.java", + "type": "file", + "size": 8786, + "sha256": "cd0b65cc853ce7e94887371dc29fe0e248e603feb5222f676b3f3434f96668e5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/jmh/java/blue/language/processor/EmbeddedCollectionSelectedProcessingState.java", + "type": "file", + "size": 9551, + "sha256": "691a71c5bbb4081857add6c72abe9a1eb1b8df58c38dbebb526a504edf9e31e0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/jmh/java/blue/language/processor/PatchSequenceBenchmark.java", + "type": "file", + "size": 5480, + "sha256": "2472cc67c16e40ffae298a0c394df4d11399a04b729743314792278fe6e2dc4e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ActivationIntervalValidator.java", + "type": "file", + "size": 7592, + "sha256": "574c9670f8caefa1f6c834cef5b82819b647048b1c5af04de25fc1e5bfbee955", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/BatchPatchRecord.java", + "type": "file", + "size": 2640, + "sha256": "a12e2a4eb859c818eebc9e0da31bb22394258490116cbcac373abfbc59e1038a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/BatchPatchResult.java", + "type": "file", + "size": 14703, + "sha256": "19aa27bc7bb05103c769cb1342a4ba5e5aa454c4df741fc334f61ac8d83b9f21", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/BatchPatchTransaction.java", + "type": "file", + "size": 4697, + "sha256": "3bbe9b051ef0bceff22157db564a4c5b980c058d40952cbe604dbe7c01dac2e4", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/BlueContracts.java", + "type": "file", + "size": 21316, + "sha256": "91a518e08eea13cd6bea37a15a8ed6ded4f5fe9a823053f1432b7479460f10d2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/BufferedContractEffectExecutor.java", + "type": "file", + "size": 7423, + "sha256": "e4b1ae8cea6f9ef6e27ac401709fc96005b3bb43a583b020cdd28d9cd25928e5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelCheckpointContext.java", + "type": "file", + "size": 11127, + "sha256": "6275fb1c8c9c16ddd0bb69bea0d3ca70b4e5b940d764b0052f0e8ba669004b8b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelEvaluation.java", + "type": "file", + "size": 2570, + "sha256": "b3699b5ab8ad884357f69f86034e34fa36caa43f7690331ae72bc1e82e2dd33c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelEvaluationContext.java", + "type": "file", + "size": 6645, + "sha256": "93b642aa885f0ded149d3122adb1e7db6bff4956483126774c81fa00a4d2ad98", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelLookupResult.java", + "type": "file", + "size": 3636, + "sha256": "c3420375de8f0dea1db6551649f5763ccabd7d319aea5fedc05ace3417119901", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelMemberSnapshot.java", + "type": "file", + "size": 6666, + "sha256": "8180e05b10041c924969e8612508733a67efe069567b8324111c853edaf74c67", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelProcessor.java", + "type": "file", + "size": 2880, + "sha256": "ea55e9bf2ec2b6893bbc296c24041e86cc62114b9db201a83dad09d56f9dcf19", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ChannelRunner.java", + "type": "file", + "size": 23261, + "sha256": "6f38f21d134cae03c2a0ca177d20451744d323797b86b0990373972c96a4d1c9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/CheckpointDomain.java", + "type": "file", + "size": 4698, + "sha256": "ad7736258689b5984cf3601cc78089234f58001f17ee79aef2cf07461869d1c7", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/CheckpointIdentityCache.java", + "type": "file", + "size": 3998, + "sha256": "b0d9bd6b733c88806239fc0bdb0829d48ad68a174cc280caaf37db2b78121266", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/CheckpointIdentityCalculator.java", + "type": "file", + "size": 6467, + "sha256": "a1834b9694c32f5983d96eef85671612aca9442d2149a82e2089788beb26a981", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/CheckpointManager.java", + "type": "file", + "size": 13549, + "sha256": "fb212cd8fba48cd5624fb9cd39b2b0bffe486e4faf59587c4c64d26767780ee6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/CompositeProcessingObserver.java", + "type": "file", + "size": 1987, + "sha256": "3600fe3c2b8c4732e687557addc93e46c8b452094da6786899d87d1d6a3d5ee9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ConformanceChangedPath.java", + "type": "file", + "size": 1063, + "sha256": "0c40d7dd70a8df70bf95c336752908a7e631dddb535f661b0866ba0bdcc07741", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ConformancePlannerOverride.java", + "type": "file", + "size": 1163, + "sha256": "32ce5e903373f6c73f9deab084efdb01e28367565188b6bf686516b5529ff881", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractBundle.java", + "type": "file", + "size": 25463, + "sha256": "cc7222b1185f69bbf8c83e7db8640f6e08ee738b9c5d9621de41a119f5099632", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractContributionCollector.java", + "type": "file", + "size": 1939, + "sha256": "2485fc2c7b56bb295ef8cade2e25bcaf171c53a088714f17c15102a866d84f0c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractContributionResolver.java", + "type": "file", + "size": 22328, + "sha256": "aac1cf1efb65a2fd7f46390a6cbbbcea4796fe0ccb8286da1a11990712bbd000", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractEffectBuffer.java", + "type": "file", + "size": 6264, + "sha256": "db509412dda2ced1285cc83096abcfc908a929d706c88be96641481b6ba6cb47", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractHeaderLoader.java", + "type": "file", + "size": 23839, + "sha256": "91609343bdcddeb8d3e92ce76941fbcd2a3dd5313c1742b402e0d1327da7429f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractLoader.java", + "type": "file", + "size": 10304, + "sha256": "452c348fb1d4463a3f99f8d39a8a681b83bf605fce06f3371d8c1c2ef136f95d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractMatchingService.java", + "type": "file", + "size": 4914, + "sha256": "c412c30085dd023aef61fd0f3c5407814b23efda0196bc39c66f9ad2c2a33767", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractProcessor.java", + "type": "file", + "size": 667, + "sha256": "63a8ba5c2b40a8f3ced08587e53958563fbaa2dcceaa01a1538ec3184f9b15e3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractProcessorRegistry.java", + "type": "file", + "size": 39063, + "sha256": "9dbce5c98f7b39358597ef7afc732cf3763e57b24db6b09962b767f5d3db0827", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractProcessorRegistryBuilder.java", + "type": "file", + "size": 3244, + "sha256": "00ab323a02e869408b745e15e891ecf08dae8b186f3cef127e407e43566383f0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractRecognitionMeter.java", + "type": "file", + "size": 5697, + "sha256": "0b7b8d3399586af79b48f4d9b6a674a3c1875349b5cd049234b49812cb5510fd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractRefreshService.java", + "type": "file", + "size": 11185, + "sha256": "b932c787030e0548badc53dc1d0bd2b5d6fd41c0d37828d2341d34d895e1b117", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractSnapshotCache.java", + "type": "file", + "size": 12704, + "sha256": "08b1d789f54c8e5c079d5c4d2e00f3ea58ab4717b2c9f33221303405d9589abd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ContractSnapshotFactory.java", + "type": "file", + "size": 4300, + "sha256": "6536e61dd37138677319f29ddb671ab41cf2c01b78a0a26f26d2a3e90686347a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DeclaredTypeLineageMatcher.java", + "type": "file", + "size": 8036, + "sha256": "a60868acde406dd7d26fdeecd97f37d7f71a28b92ec24d47825d85fda3f648ee", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DirectContractMutationPreflight.java", + "type": "file", + "size": 4001, + "sha256": "ee5e1df5d8facafcf0771f59c82d40a48f9fba62a6f82fe2601f5d040f7b4356", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DirectProtectedStateMutationGuard.java", + "type": "file", + "size": 8454, + "sha256": "3138a0d88ffb6f53e5ccac36f46b3fc4f42c5554b7d616aee99e51fa5d2cd917", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DirectSubscriptionSurfaceProjector.java", + "type": "file", + "size": 13348, + "sha256": "9ec013edd94f51e9a5ad7f3469d765bffbe05110f7d6c9c60ab7388e5ad41cba", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DirectSubscriptionSurfaceValidator.java", + "type": "file", + "size": 4325, + "sha256": "9f5bec3da9e42c6f3de9e56d65c460ab124a5ff969cc67d1c638a939b304d329", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessingResult.java", + "type": "file", + "size": 8952, + "sha256": "f0a9d49d31e5b1968bcc34c65ab84088c8ef44919ad75a9458b582e7bca57a45", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessingRuntime.java", + "type": "file", + "size": 38102, + "sha256": "bc23f95e850321cfe86f3960dd67ca5ffb5cff4d789cd72466f20399fce5eca8", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessor.java", + "type": "file", + "size": 29094, + "sha256": "4b371b4a62cecc4a1fd95adccb533b684345539cf3c22a0ea5256ae9edb49351", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorAdministration.java", + "type": "file", + "size": 10852, + "sha256": "de64474227393ddef723bdfff856ed5df545482406854e38f1fc78ec667901ad", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorBuilderState.java", + "type": "file", + "size": 14620, + "sha256": "4817d58f49a773f7d1efed4107c28390e8fd64fb77c0ce0974460e60d221b679", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorBuilderSupport.java", + "type": "file", + "size": 6432, + "sha256": "756c84f979b4168447372dc5bf2416c3d191f662cb4081db9601b190306560cb", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorComponents.java", + "type": "file", + "size": 5436, + "sha256": "e75fe4f6912a54396f169152db21cd9bee5fa9002303064f0fbfac063be8b5a3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorConfiguration.java", + "type": "file", + "size": 3489, + "sha256": "81abf4a5165cf1f72babb73d3d478f549f229afeda0ff6f5a6d228ba34d3239f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorConfigurationSupport.java", + "type": "file", + "size": 4505, + "sha256": "3f20e2c848c04618ac9dc6a2050e121460cc7e7ce9fd993aec0f53e252fc8e73", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorLifecycle.java", + "type": "file", + "size": 8253, + "sha256": "d2d5b72137cf79bb68c56e0749191ef11aa7c3c292bae25aa007a9203736209d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorNodeOperations.java", + "type": "file", + "size": 22459, + "sha256": "f05559937d68db6b70299bca3a0092667bb3568477015ed593dc2a592bf31f9e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorProcessingSupport.java", + "type": "file", + "size": 14291, + "sha256": "c0944e7bb54fd7230da838539d48f651be00f227ddf668b299782638e35827e1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentProcessorSnapshotOperations.java", + "type": "file", + "size": 12266, + "sha256": "a102873d12d70ddc1516b870dce4101ccce162317faf361ab4f935918f557482", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentUpdateData.java", + "type": "file", + "size": 1428, + "sha256": "8ff32aff3a8b7eed903bc2ff29f2c4f7c35bfd4226b1159f3afd1860540f9b0c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentUpdateDataAdapter.java", + "type": "file", + "size": 3197, + "sha256": "3bbeece641ac6690de518ee26d0060d91e8ca677267d18a6b52afd2ae28bdc81", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentUpdateOccurrence.java", + "type": "file", + "size": 3346, + "sha256": "3ccf51ee1ec4e495e26c56a632c17c93e5197214764d7338a7fd4fcb34a9e8b5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/DocumentUpdateRouter.java", + "type": "file", + "size": 9764, + "sha256": "88681ee6b424ae854170515db2d8f53c0256d86ceda7201fab647135f4120473", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EffectiveContractResolver.java", + "type": "file", + "size": 12579, + "sha256": "d901a4be1a9e60bab394d2b9e4753f35431b318098329dcd9cbfacb25abd5ad6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EffectiveContractSnapshot.java", + "type": "file", + "size": 13622, + "sha256": "accee6d3e5954f4a8c443b0e00b8b8edf5b161a6d22435ffb5b352daad0a9c67", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EffectiveContractSnapshotConstants.java", + "type": "file", + "size": 1746, + "sha256": "8a124b47d76fa3f3a120b8aec768c692bc2377a3c40b31d24aebf42b0a166bce", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EffectiveFragmentationCatalog.java", + "type": "file", + "size": 6790, + "sha256": "b9c2edf225feee67142e46379ba506c323232be384005ef51ee7580875295821", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EffectiveFragmentationCatalogBuilder.java", + "type": "file", + "size": 29176, + "sha256": "bf83096c54dcfe2e37bbe22cf07fdf9b7886a5df8b6c0ae383e5d54141afc752", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EffectiveSubscriptionSurfaceProjector.java", + "type": "file", + "size": 21663, + "sha256": "402cabc0d19974676e972d71a34a5c0913c8a65ba04a2e5a450e3740fd7759fb", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedConcretePath.java", + "type": "file", + "size": 3268, + "sha256": "80660c6e2cc64c767fcd96e32476e0f777b6b0d658a20c5ecf9a308824b72af9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedPathOrigin.java", + "type": "file", + "size": 329, + "sha256": "e060c2c0c0a44e92f032367010329e6fbc56945292c33f57f1c64d8f19335caf", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedScopeDeclaration.java", + "type": "file", + "size": 3392, + "sha256": "7eefab318ae397b0a11bfd21d48e764a8ada53249ce0b8e7d4087cf83206a4c8", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedScopeEntryPlans.java", + "type": "file", + "size": 2244, + "sha256": "92849c9922801a27ed298c5eefeef9049e89a51a4b39791cfc2d0b877a877c8f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedScopePlan.java", + "type": "file", + "size": 6045, + "sha256": "211bd47bd59040ab4be349f3957781d41345d140318d59d8ca9425377065d0bf", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedScopePlanView.java", + "type": "file", + "size": 6362, + "sha256": "263d237d6ab81d42aea642c779807c0ed44b0a1a8b3817b71095c7a8da04c67d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedScopePlanner.java", + "type": "file", + "size": 30555, + "sha256": "699eb0b6dc74a15f71e4b060cb133255e138e5363827f05adfb55dbb12e4a82a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EmbeddedSubscriptionRouteProjector.java", + "type": "file", + "size": 3542, + "sha256": "8e1d574c5ca9002d8a8b8b5041f54baf868fce9a3be2e65deb73702488c4373e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EventOccurrence.java", + "type": "file", + "size": 3559, + "sha256": "b0726cfd9aa222667dde49e5700cc2e2b5b09cb1fcf25a08e8806695a94e2ddb", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EvidenceClassificationTypeCatalog.java", + "type": "file", + "size": 15641, + "sha256": "9314ed60fdb423fa57d542108d3511e7d70f5418840adeb40deaf7ef1be1e575", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EvidenceClassificationView.java", + "type": "file", + "size": 26711, + "sha256": "1bf29a851410fb818780a2b5097a9c100b17912ce1f24674cbfa4a3f97816e25", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/EvidenceDeliveryOrchestrator.java", + "type": "file", + "size": 31783, + "sha256": "7890dfbeb554b536a7eb634f6119feca242501af099e696e433d6032426c28be", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExactBlueValue.java", + "type": "file", + "size": 2136, + "sha256": "fd7e45eb6854ffe53ab75b6cf2615ebcc6f8242470b24b5207470751c810ab5a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExecutableBodyLoader.java", + "type": "file", + "size": 5455, + "sha256": "9fb37cdfdd2de40d54bc2ccd51a51bf21766c75a04c547894b9daa34f79f7a67", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExecutableBodyPathCatalog.java", + "type": "file", + "size": 33148, + "sha256": "e18b3d1dcbc7d1e35a5bd723a8e499af4b42ed46adb8fafca30609b7353f3b03", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExecutableBodySourceDescriptor.java", + "type": "file", + "size": 5904, + "sha256": "c02b9106d718e2841ba75c0216b1eb1ad141a0e60ca5554afd8383318c8f241a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExecutionEvidenceUnavailableException.java", + "type": "file", + "size": 2504, + "sha256": "ed4738958e0e42ce43a72f3c962affca60231b2a070bf4656073f19f0ba1686e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExecutionLifecycleCoordinator.java", + "type": "file", + "size": 6860, + "sha256": "8b9b785f5c48fc833daf849d7fb54b485033d14a856b89d842fb5b4d90968c39", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalCandidateProjector.java", + "type": "file", + "size": 3722, + "sha256": "b0b12a3264a98f0619465a9b3335e4f6a42e31ab10550c6ce3d74182793b552c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelDependencyCapture.java", + "type": "file", + "size": 7145, + "sha256": "1d392fb1b48236aa5e241d1cc6fbbe4c93129f54ca7d671104ce0d166e60f9b9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelDependencyIdentities.java", + "type": "file", + "size": 9051, + "sha256": "f787ae2a9065cf6d7baa0242d8f67d0cb877c6fd7a2273c07e43eda5c694d62e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelDependencySnapshot.java", + "type": "file", + "size": 32437, + "sha256": "b09d1e8ce626b3b0e5d232353428b46124ab014a3fab6d34163de541ae5e66fd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelDependencyState.java", + "type": "file", + "size": 9145, + "sha256": "303c1d1f5583ea226959425a105f1ea53b222eb03c97740bd87014e0d1fd7b59", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelDependencyValidation.java", + "type": "file", + "size": 7287, + "sha256": "e1fac61554056bfbef1360fc209ff10d16925f734dd5a01b4d7b04594c8a47af", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelFunctionContext.java", + "type": "file", + "size": 14712, + "sha256": "6066d0ebe0c7106a64b7283a3e4e2072a683c0c88748a67a64da4e411719c7c0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelFunctionContextFactory.java", + "type": "file", + "size": 19586, + "sha256": "622baae8b34047605c36cfcc7d577e7f9ef09910a433091a87b1f3ea7e5a12a0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelFunctionEvaluation.java", + "type": "file", + "size": 24068, + "sha256": "f2e7275114cf500d7afdd8b25d45f1039efd5960440a11de75af3d0923e3bafb", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelFunctionResolver.java", + "type": "file", + "size": 21180, + "sha256": "b69b83e9c20820691be32261dbaa45163365625afcd6adc14e065e79e459c38c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelFunctionRules.java", + "type": "file", + "size": 6804, + "sha256": "e5b3df979e10636db2dbf48cba08ae150b1a265247b6d03dbd26196afafa11e2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelMemberEvaluation.java", + "type": "file", + "size": 4203, + "sha256": "e2c975d867e8dc43fc4b352fc411db28782f5c691e900c070c9fd1ac0295f48e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelMemberSnapshot.java", + "type": "file", + "size": 7647, + "sha256": "08e1deec54f80656a5c40c5a4609de0ed4abe334aa44a44d682b37d7a80609e6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelResolutionCycleGuard.java", + "type": "file", + "size": 1581, + "sha256": "70209382c8aeaaa296d1b32391015442f3618c3193f7fcc0dd7b7b2a5a6c4ef4", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelResolverCatalog.java", + "type": "file", + "size": 11324, + "sha256": "ee0a4c151fc37411a02e25dcc5080db1270c6ec46827f5793c516b4df0acc47a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalChannelSubscriptionFunctions.java", + "type": "file", + "size": 17288, + "sha256": "29e61f1ea07d2e8fba4e66ba9d7dc45342b93181bcd1005a8fc16827a50259b9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryClassification.java", + "type": "file", + "size": 861, + "sha256": "3d258993b1d33eec197c7e9b853a25a948663afa12bcde1456da3e5d1b119716", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryEvidenceVerifier.java", + "type": "file", + "size": 1924, + "sha256": "a3405905d20b7b6f783e97bc5e1428884ef5672e6a412c81b00fe65271f342f2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryExecutor.java", + "type": "file", + "size": 2285, + "sha256": "d5210788af93411190b821036532d5f0710965d859cb4bd2f6e577b0e73cd922", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryPlan.java", + "type": "file", + "size": 14514, + "sha256": "b0fd133751f45d7361f9cf39b3dd88d5426b7652d40ed06fb915db907ac2392d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryPlanDeriver.java", + "type": "file", + "size": 2326, + "sha256": "540267601b692336bab08c8c380f20f8370c64da527a79a9acece14725da3f05", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryPlanVerifier.java", + "type": "file", + "size": 7250, + "sha256": "0b393b9c502545a3584d9e0a1b348fed28503d9280a9a1dc3ca1e09f20d654a3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliveryResolution.java", + "type": "file", + "size": 6013, + "sha256": "d56edd15ed94f13c3bf0e7bb68d7b7f66a3dd0494d8c8ab0881eb29ab7608812", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalDeliverySnapshot.java", + "type": "file", + "size": 11701, + "sha256": "93b9bbbef28d093290ed85cbc9ea3d0267827466ec3f473eef10844f64390356", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalEvidenceVerificationSupport.java", + "type": "file", + "size": 7210, + "sha256": "192f9dbc1b788a7805a5f2b8181513d90de7f83d8ea52649804b1e4579e73a22", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalOrderKey.java", + "type": "file", + "size": 5726, + "sha256": "f411af37ea7ccaf10a066b1f2f649edc29bf52dfe40e8ff36e8b5eb43d1843d1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalPreselectionVerifier.java", + "type": "file", + "size": 40077, + "sha256": "61058b1d498c32e5804d2080bcd841be8b4c89de426f39bf9bdab751de69e76f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalSourceEvaluator.java", + "type": "file", + "size": 17129, + "sha256": "d4c8a799f8f2eb360d854a7cea0d6bee97c05142f5fb5cf9d10a31cc95ad6801", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalSubscriptionOccurrenceKey.java", + "type": "file", + "size": 2926, + "sha256": "3fad9ae97fe578c67ad9263fc4ea8c3e0eed9b654b082246f0f7054e4b5f264d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalSubscriptionProjection.java", + "type": "file", + "size": 2735, + "sha256": "4148380b94b2e42d8156c6c781bc0739217738bca74612190f65ab4b16d4cb62", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalSubscriptionProjectionBuilder.java", + "type": "file", + "size": 31457, + "sha256": "408c7b575089b5bd0ff88d36e0e6a707693c6f5ef8b3fd70782217f80aebbfc2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ExternalSubscriptionSelection.java", + "type": "file", + "size": 10703, + "sha256": "76bad106be2d1564af06b45242662d747ad63dba5bea39726a9f3848be2ec306", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/FinalSoundnessValidation.java", + "type": "file", + "size": 815, + "sha256": "da2b603c1bde06abfcb19cb4a400049b4c48bfa5035ebd05e6b434668ee0b674", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/FrozenJsonPatch.java", + "type": "file", + "size": 13055, + "sha256": "2eadfe1546570575b7ff361190a6cd14a85350268d5475e2d06727dd2de53033", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/GasChargeContext.java", + "type": "file", + "size": 3007, + "sha256": "e503a193711bb9c3e95fb6d0ea1605502e0439fa12c05382c28e571806a77067", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/GasLimitExceededException.java", + "type": "file", + "size": 4026, + "sha256": "70aac54eca314223a6358b476c4fa57bb84c30b9974071308fba29a11a267c8e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/GasMeter.java", + "type": "file", + "size": 25343, + "sha256": "a426fe203b0377ad7c5d8fb8be52d74b8bdbd5e8432cfde66c091a6b6ba62a06", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/GasSchedule.java", + "type": "file", + "size": 21571, + "sha256": "ce951b734abe71e95cc991b6eec663d9c0cf60ccc35464c38082917c1f8282d1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/GasScheduleConstants.java", + "type": "file", + "size": 19147, + "sha256": "b1a2c1f4c376085c28f9d4a81b53db0c0d45fa5e3cc24479472459f9bf48d2c3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/GasTraceEntry.java", + "type": "file", + "size": 3286, + "sha256": "ea28373925c9511fa01040ef035b05d5937b38bd43a94eddd71f47781539d3be", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/HandlerChannelSelector.java", + "type": "file", + "size": 1832, + "sha256": "a1d61c513d00bb1f668d1bd0c88bb50b3f9a1e5bc252ee74db0740514009a5f5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/HandlerMatchContext.java", + "type": "file", + "size": 9790, + "sha256": "0c70595cd7a22caffc31ffe9aaf7029bc9ae269213ec9c208d1a83cad9097eb5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/HandlerProcessor.java", + "type": "file", + "size": 2265, + "sha256": "c06e17fcb62101f51c80c3cfa1a77b172679aef7010e4c1d6844d3bcc614b377", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/HandlerRegistrationContext.java", + "type": "file", + "size": 5181, + "sha256": "84d06f867eb46365817e84a0b3255d7007d2cd625ddde783a2d12b666d454be2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ImmutableJsonPatch.java", + "type": "file", + "size": 11658, + "sha256": "66d0fa985e952aed8739ab5b2a6ba3e4caae9b62a78b64a7029c04319550b7cc", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ImmutablePatchPlanner.java", + "type": "file", + "size": 23663, + "sha256": "d408ee900f170b5b23c16d8222be3f7d7dbc74e375ae017c6f5d70321ffa318d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/IndexedDeliveryDiagnostic.java", + "type": "file", + "size": 5803, + "sha256": "b0942b3149401366940c5814adc13d686e98765b912f9600353009fc60ea903f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/IndexedDeliveryEvaluator.java", + "type": "file", + "size": 19485, + "sha256": "d2fc007ea174899cdff3154c2329a1c1671fa66c01a20909c12ec48c007686a3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/IndexedDeliveryPreparation.java", + "type": "file", + "size": 1284, + "sha256": "a4290607bb31989abaa3a9f37026c84b28c06f6c6050a87a890c23636002cc19", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/InternalOccurrenceDrain.java", + "type": "file", + "size": 838, + "sha256": "6d9e99fa7c36702b1792017886c0277a099cf37c8715ac5b337f50ebe6a2e931", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/InvalidExecutionEvidenceException.java", + "type": "file", + "size": 1687, + "sha256": "006e6e979334c8911ff9f75d01d1a19722460e1f5abe1404fcd5d9e4e3453fc3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/JfrProcessingObserver.java", + "type": "file", + "size": 5683, + "sha256": "7e2166a102114a7a30f00126e3d5f49c53c2193131202563775029ed7825649c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/LanguageProcessingSnapshotManager.java", + "type": "file", + "size": 5676, + "sha256": "6c18bc8be415fc744d41ccc3cffa3a2e6641106be3d6dedb37439ee09aba92cd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/LifecycleEventFactory.java", + "type": "file", + "size": 3358, + "sha256": "5228d771905510c384beafee365de8406b5188bcdcaabc5d77ab87f0b279c6a1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/LogicalDeliveryExecution.java", + "type": "file", + "size": 834, + "sha256": "53de09ba2f64dcbff5072cfd7146d89feb367146d5626c46b27aa7a355294a9e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/LogicalDeliveryGrouper.java", + "type": "file", + "size": 6216, + "sha256": "1c5d4acecac20cfa2b21a73695cef1321ddf0f280beeb632d94248c9bef0deb2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/MaterializationProvenance.java", + "type": "file", + "size": 3241, + "sha256": "17adb7b74967ae0948421f195a0b91e47e6a9c8870822fe8548ca2f0b31d344c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/MaterializedDocumentView.java", + "type": "file", + "size": 1289, + "sha256": "83cd02adad7f36a9ea4228f9f39cd2e275eb854a1cafd7e9c49d31bbb001805c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/MustUnderstandFailureException.java", + "type": "file", + "size": 904, + "sha256": "e73fec57e51f45fe8214b7dd9d313e6250e23724747ec66b267c96656690d7ca", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/MutationCommit.java", + "type": "file", + "size": 9110, + "sha256": "2a317ddc1ec49d8be60a6d7a1d7bf67c647605895671d042b8ba4346dfcab278", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/MutationGasCharger.java", + "type": "file", + "size": 12825, + "sha256": "54fb234275b90305fc8cfab0aec5ee59620cc4a065f04b4c1a3585f674faefd1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/NoOpProcessingObserver.java", + "type": "file", + "size": 551, + "sha256": "9c18dcab0323bd06daf10da41acd5f4e3c19d2c7f1f2051a9500c5e710486da4", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ObservationKind.java", + "type": "file", + "size": 556, + "sha256": "a534ba47d4eb5ed2e309ccea70509f0f7ee825bc88f75a6109d60dc489400526", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ParticipatingClosurePreflight.java", + "type": "file", + "size": 812, + "sha256": "5b905b9d70660db170d074bb5d9825c3b6e88119e7db87fea259d9ae8ffc297a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchBoundaryValidator.java", + "type": "file", + "size": 2602, + "sha256": "b47384502b97e7e9f98832b40819aed461894ada030ef6dbe90275c3e20621f2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchImpact.java", + "type": "file", + "size": 9778, + "sha256": "31abfac6712bd5a0f23f564cc5406d5aba11a7769247429d69f1e99a6551aee1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchImpactAnalyzer.java", + "type": "file", + "size": 33118, + "sha256": "d734e39ea1667116d5b0b943515dace400fa1d39239cee071a17e2da6115b215", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchInput.java", + "type": "file", + "size": 4031, + "sha256": "f783dade8d54df72df0058bec6f3697842b2ea6c0b305fddba76202788c48b35", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchPlanningContext.java", + "type": "file", + "size": 7605, + "sha256": "c76fad3c6b03d17f91630e41bbaf5839c89c7184424e287041fce0111f2b0417", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchPlanningEngine.java", + "type": "file", + "size": 32520, + "sha256": "804754bd09c24408948eba43decb0a018f7b9c20ac67d1bf9172b10872556488", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchPreflight.java", + "type": "file", + "size": 1460, + "sha256": "f73e08bc89742613b2f670243cf9684e428947b18b906fb595e5ad7a002d6623", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PatchSource.java", + "type": "file", + "size": 833, + "sha256": "f430ff5f29dcd04cb779944f60c05cc74adc128f40d3ccf8fd85c27f3ac33171", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PlatformCommitCompanion.java", + "type": "file", + "size": 4143, + "sha256": "0ef97244ea90a43bab60e1708010bcca95a76d50517dc81c31aef3c0079509b6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PlatformProcessInvocation.java", + "type": "file", + "size": 3758, + "sha256": "f4d2306f8d6f16fa07b1ae37d46ed2d32d341b35012eca3441b05a98ba1fecb1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PlatformProcessingResult.java", + "type": "file", + "size": 1369, + "sha256": "093285b25236afb6f2a4572c621706e63a0d4ea87f8550d743dd591314b64c7e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PortableLimitExceededException.java", + "type": "file", + "size": 3138, + "sha256": "acd33e6e0ac47b53a34d64089471f10b31cf1a21cce188b1df212b7d809a7a7f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/PreparedPatchTransaction.java", + "type": "file", + "size": 18829, + "sha256": "6d4f23183f471223a7f299bdf039b13a209189639d2ced49a6f15d38f5e80065", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessAttemptResult.java", + "type": "file", + "size": 4134, + "sha256": "3444470b6fd171fad158664b8f01c8e4d52ceed20181691bd221eb23c20b685b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessGasMeter.java", + "type": "file", + "size": 3878, + "sha256": "a1d66aff2a812ea100be8da11d9108c5b4decdc8b7e9cac03bfd19ff3f35ecc0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessResultAssembly.java", + "type": "file", + "size": 507, + "sha256": "497f6bdc2553f9143e1355a9a83078369ddd01c740f62c21be7b2936b532534c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingCheckpointTransaction.java", + "type": "file", + "size": 2445, + "sha256": "ca9c5f2a09d8aad4705db150953e7e4727bc5b7e580252dd99c300942a34d28f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingConformanceRecorder.java", + "type": "file", + "size": 2570, + "sha256": "24f7289ae0e4816ee25b546ccb764433fe0cf0cfcaedc6ae551e2a35fff3f109", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingConformanceTrace.java", + "type": "file", + "size": 7077, + "sha256": "8932a0711ca0ae7128dd7cd55e447588b5077b655f4ff4c79432a161a24071b1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingCutoffTracker.java", + "type": "file", + "size": 550, + "sha256": "4bd03a03289a69da6cfee73b4637b05d189cb29d92f836903778fdfee84805ef", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingDebugResult.java", + "type": "file", + "size": 2928, + "sha256": "73f06de0ea3fc7270bb1d621bfeaddedc757e3aa9f8c3fb50bdc15090536138c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingDocumentValidator.java", + "type": "file", + "size": 5858, + "sha256": "a12cd074d98a8c5321797f67dc7863f426c11abdf643330e2c56bc0c8f3b735e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingDocumentView.java", + "type": "file", + "size": 18787, + "sha256": "944114a8c57a1d850967ed80ae46d1c32941e4c602d5f564e6a153141a09c389", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingEventQueue.java", + "type": "file", + "size": 1169, + "sha256": "4493b628ba71ce406eb34d77cfbfd5290483e8feab0e93a69b865391d17b2269", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingEventSnapshotBoundary.java", + "type": "file", + "size": 3184, + "sha256": "1adbd02bf26981731135723af1557165a84214e338e22d2706066395c58985b2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingEvidenceVerification.java", + "type": "file", + "size": 813, + "sha256": "e1ade7ba28db61ecb5e2f358b0b84a194c6ebae49acd0326022a9eee41e80e9d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingGasContext.java", + "type": "file", + "size": 3485, + "sha256": "549799cfcf146bff394c7440cca719d446c76291981b235735803aa5f8b8f5f3", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingInputAdmission.java", + "type": "file", + "size": 16571, + "sha256": "b49052191ee82d15f4013a44ee32faeec75f505e910a12c6db93ffe25d25db7b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingLifecycleState.java", + "type": "file", + "size": 778, + "sha256": "7d2576e08f47a4077237d63b6739d7e5233584edf9d5fda8a21f02e3d1bed386", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingMetricId.java", + "type": "file", + "size": 37590, + "sha256": "0a948ea4bc54e72ed184a002b979b0b17359be34cdf62b5d612e6aaea9ed601b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingMetricManifest.java", + "type": "file", + "size": 3055, + "sha256": "db01b76f3e4db6eac3a38df78b23aa55932c07377150576c7beb18dea03756c7", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingMetricsSnapshot.java", + "type": "file", + "size": 3181, + "sha256": "6f1487957a8cc6706d7b9552b4b7df8535ac4ee55189ab296d0b5d078340afad", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingMutationSession.java", + "type": "file", + "size": 14972, + "sha256": "01672e368fcb8878e2f0545cd482e376191a6cfde30e500da57658a1657d52f4", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingObservation.java", + "type": "file", + "size": 5443, + "sha256": "da69ed55e86d0a91fa48874d4986445a440179cfea93b2aaed8886c6bb8416e9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingObservationContext.java", + "type": "file", + "size": 6669, + "sha256": "fc8943218d543e7e116a8040e3a66f76e734b4f7b71c6cad7bc7175bd3652dc1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingObservationDimension.java", + "type": "file", + "size": 1042, + "sha256": "12cddf14785811c30544d039430fb16fa8359a2db1f97844770c4d3179b77846", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingObservations.java", + "type": "file", + "size": 3475, + "sha256": "59bdad923a0dcc16efd58e5c1d2cbc851fde041a53681b8bace6c04f68809aad", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingObserver.java", + "type": "file", + "size": 608, + "sha256": "6b646b4b5522f39b4c90eefe9d81661c0856c224293e998bd587ecde0c0dc39a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingOutputCollector.java", + "type": "file", + "size": 576, + "sha256": "a14b7b038e00e176a2054aad51efcfea730d17c8cd4c14c0ddbbcf0114f66df9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingPhaseContract.java", + "type": "file", + "size": 1656, + "sha256": "24edbff509db5f886c3bcc77b996879c4a60e817ceaf3017def27af378055564", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingPhasePipeline.java", + "type": "file", + "size": 2459, + "sha256": "212abe823c4c24204618e1e1201da5ccd33fc46def75bc77a21198ef153b94e7", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingPhaseState.java", + "type": "file", + "size": 1957, + "sha256": "9f2ce73759ddccaedddd117d26d44fcc96e32f09cd298ef33ff1043f78303833", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingResultCoordinator.java", + "type": "file", + "size": 12824, + "sha256": "33cf6424c7ef802f70525b9ebb19cf72c18c8a6328b4f6581804c3e1043b4678", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingRuntimeCounters.java", + "type": "file", + "size": 4175, + "sha256": "cc2cbe0deef520e9c1db5f695a136fec45e348d81f4a2a31e1fc0af49852e0aa", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingScopeRegistry.java", + "type": "file", + "size": 1103, + "sha256": "3f547fbe2b629fd02d4333c35ff5a61fe73e4a2b46981ab8a4d28afb97781f18", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingSession.java", + "type": "file", + "size": 3662, + "sha256": "5b6aaeec8c263f1edea3a3dfad982bb3ba7ab154c3496499f5cd06f048f77521", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingSnapshotBootstrap.java", + "type": "file", + "size": 13553, + "sha256": "e326f4601ae983974fe5cfc50eb2f4c075f67f0bc1a97eecd8391bcbbae05caa", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingSnapshotManager.java", + "type": "file", + "size": 11299, + "sha256": "ce28d7e91ab90bb29625df662685d5daabda1371d1daa12fefbe32cec3937b44", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingSnapshotTransaction.java", + "type": "file", + "size": 16753, + "sha256": "0752d82b86387ac056ff88a64c15404a1295f6bbd977d9741474f47826f515c2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingTraceConstants.java", + "type": "file", + "size": 6337, + "sha256": "4f7bd8eb186c512cad3fdf820f57aafa942ec1393e96cc4fd325382cdde2f34c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessingTraceRecord.java", + "type": "file", + "size": 5022, + "sha256": "f6927bec2b294d36f100d5c6cc4fdc103e4b13d37f23472e05a864087a2e3063", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorDiagnostic.java", + "type": "file", + "size": 4926, + "sha256": "c7c9be3b33e921d4471b0adac658554805f2653333ac8c24748639ded0f03942", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorDiagnosticConstants.java", + "type": "file", + "size": 1709, + "sha256": "48d5cbc1483489ad65969f03c1b6ee0f62f48d63c259267b59d64d6df9d2df84", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorEngine.java", + "type": "file", + "size": 10016, + "sha256": "37d54698c925d75e71b8ea67de4cf104655a3ef210b4583c469a384129d76a70", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorErrorCategory.java", + "type": "file", + "size": 4326, + "sha256": "0ae7d154d532a0366d7b172fdb847a86c12b8d6ae5d7e0ce66dcbabba51a5ae8", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorExecutionContext.java", + "type": "file", + "size": 26700, + "sha256": "840222a9d548516f9ee34576ef3ae0cc3098f335d958e021e4f0001b09044055", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorFailureException.java", + "type": "file", + "size": 1921, + "sha256": "0f6cc4a562ff67d93d27699eb67273d96ce863c0b7101a81a093a8b28ce1bfc1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorFatalException.java", + "type": "file", + "size": 2711, + "sha256": "45653d2fe78c6f651b5a9e550cc7964301726365e9b97d2cb2490359cc0aba18", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorGasCharges.java", + "type": "file", + "size": 9452, + "sha256": "2b0bf0c902344169c62514f279e94599c5bd711f51ad829eecec99b4e21bd463", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorIdentityConstants.java", + "type": "file", + "size": 3245, + "sha256": "020848b66d85c50c9ad06b8f1569f4f2590ffae5f4458361d0c658bf68980021", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorInvocationOrchestrator.java", + "type": "file", + "size": 20846, + "sha256": "b3682178602d5db2a5c74333782dece9a2256c95092a472fe107f5ce8d23124e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorInvocationServices.java", + "type": "file", + "size": 11014, + "sha256": "9b265050b4a08a1cf2acfcf185a698bb1507bef11ee8e3c52e9555303be0e33a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorInvocationState.java", + "type": "file", + "size": 24235, + "sha256": "fee7bf18b758b423bc6758bcec18ae5d03846b7f6a016f9ff0840767421f45bf", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorManagedChannelTypes.java", + "type": "file", + "size": 1566, + "sha256": "3fe410d18a4104490efb94d9962fc9ac5fb86af8679e5078ccd25947262c0a9f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorMarkerFactory.java", + "type": "file", + "size": 1226, + "sha256": "f2440642fccfd7bde015bcc5d551512445f83b61e08de42e4db5bd3efb5cf5af", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorMarkerStore.java", + "type": "file", + "size": 10204, + "sha256": "88f8c63a69f86604822cefb8a3890a5f7ccdc7a751b31ec97b1c7699917fd962", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorRuntimeAccess.java", + "type": "file", + "size": 21864, + "sha256": "b5ff7ef9c9c31ffcb4a8b766cc77235fb246ff6b87803e09dfab3e55a8c09217", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProcessorStatus.java", + "type": "file", + "size": 2601, + "sha256": "dd891ab94b8f936b3f4a9a0d9d42aa64c3c7a337ba6692ee27fe71057441acb5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ProtectedStateGuard.java", + "type": "file", + "size": 18422, + "sha256": "feeeb18e77e468afec5501ec45b92b64b51bca09ed3f85cceb254e65e78d2237", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RecordingProcessingObserver.java", + "type": "file", + "size": 6473, + "sha256": "ff38ccdd069c9c55b33855355636d73d88921de86ec30d8a6044fecbe6ebd843", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RegisteredContractScopeIdentitySnapshotManager.java", + "type": "file", + "size": 6291, + "sha256": "b16b8dc01e46d95f2ba3c3df058815377bddb3d75adf219e7dba023d32d49a56", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RootExternalDeliveryEvidenceVerifier.java", + "type": "file", + "size": 6990, + "sha256": "b3e8fbc69fafe76da55a9d1746f5928a84dba795c6b5129c07bf2cc0f6525cff", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RunTerminationException.java", + "type": "file", + "size": 512, + "sha256": "1502b2138769573157a2d73d1616e3f6408748435ac1bd6b620d49f69ee133b0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RuntimeGasExhaustion.java", + "type": "file", + "size": 4130, + "sha256": "a0bff3b3412ec9b95ecafd37f1de32b46318ff3a400423bc65472836d1467ad2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RuntimeWorkBudget.java", + "type": "file", + "size": 2580, + "sha256": "f5af126ed1cf357c974a1ae294fe6315a3bb2506622dcbc9b1ab9a5c2f362962", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/RuntimeWorkSession.java", + "type": "file", + "size": 27374, + "sha256": "17bde5a3505d0835c6581545c616c8380593309903c63fc018fcf9fa22426bcd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SameScopeChannelCatalog.java", + "type": "file", + "size": 1118, + "sha256": "53973e2d0baa03f0170ee719ac8f31a77c5eec4fcc3bac098c837b34f116ebcf", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeCutoffTracker.java", + "type": "file", + "size": 2486, + "sha256": "c0487f6e9c5e7ea8861eb571b5b3cdac27e6b814e9332daf77a06dbebcf9fa8f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeExecutor.java", + "type": "file", + "size": 23453, + "sha256": "13a2b592409d01cd21aa78d2fd1175acf926fbc014f82b3427405dc48af66e3f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeFrameFactory.java", + "type": "file", + "size": 5788, + "sha256": "1f8fd509f9a62a63847938528708135c063c79c5017b0f0f6994dfdfae20e0b2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeHandlerDispatcher.java", + "type": "file", + "size": 12393, + "sha256": "2caf3b8d4c87b9d84ee8a514aebbed672f87e07721c24f1101818f2790d13420", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeIdentityErrorMapper.java", + "type": "file", + "size": 1328, + "sha256": "4e955c5919f913760f49978d2dc5c9e9866d089d344be3623026d3d5ea70a2be", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeInitialization.java", + "type": "file", + "size": 835, + "sha256": "4885806c2ef5e44f8342107030c7068a8f32e7c3fcf8ab20cbde4daee5833616", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeLifecycleExecutor.java", + "type": "file", + "size": 3185, + "sha256": "ebbd68a115104602a77a229974d11ef5a996e0d538e7d59e8f4d3bf9e868ba7b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeMutationExecutor.java", + "type": "file", + "size": 8178, + "sha256": "33c6507974f1ff1ef9352c1127c95b675bb7eeb89a9ac82a483085b0a401d733", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeParticipationRegistry.java", + "type": "file", + "size": 1211, + "sha256": "b1e8e9be83172060496542678bcd6c4f4c14d2f0044b26e67f8999ae943ac35e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopePropagationChain.java", + "type": "file", + "size": 11439, + "sha256": "710bf9adf296a8308e97bc74a8db4bc33b842c9265435789e924d90813c98092", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeRuntimeContext.java", + "type": "file", + "size": 9935, + "sha256": "b51abd453c730d0a101bd80cc7db16ef4ec1670605072f76bc833dfa81814293", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/ScopeSourceProjection.java", + "type": "file", + "size": 24531, + "sha256": "e33285f4a36f464b0ec741f5b95968dadfc3ce0adbb76507bfcdc9aec4436fce", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SelectedExecutableBody.java", + "type": "file", + "size": 12097, + "sha256": "22e075e1383ef6a6d9e5736a2dbb10f35e8e0f1079e8901b9f2890d856569e0d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SemanticGasFormulas.java", + "type": "file", + "size": 3123, + "sha256": "9768290f295e07828127b20da6bd5c6ffa43981b9672028c99dce6c44b87d0e0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SemanticGasMeter.java", + "type": "file", + "size": 32603, + "sha256": "395e2024cce2411345f0da23b8f0702dabb13c6753a3a1b95e3bb25b33355aca", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SemanticOutputBoundary.java", + "type": "file", + "size": 24549, + "sha256": "2571d6de9a758764d2790e089f01d2d8ada769b707dcb8b960032e81abd70671", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SequentialPatchPlanningSession.java", + "type": "file", + "size": 9930, + "sha256": "eb2420b5229f76b0b5c79d1fa016ab0c079eba5e2e10495f484df09c75d2f284", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionDelta.java", + "type": "file", + "size": 20348, + "sha256": "b0e832161acf0a4d437b3c5f5dca20c41821e214236c1bd82a334bcff29022dd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionDeltaBuilder.java", + "type": "file", + "size": 1902, + "sha256": "2dc6e617eb90b8f52e357cd660e7fe69a2fef2ee35fcd9da4407c8ba574d9198", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionDeltaValidation.java", + "type": "file", + "size": 830, + "sha256": "80a5c43fabee9b7c2f4eebb2056582a3acb9a5959a8e2c9dc41c68b8e9007460", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionSurfaceInvalidException.java", + "type": "file", + "size": 2910, + "sha256": "2b84376a4a6a8bcd39100f3d5e9ce6ccc59c914fcbfbcf0021249588497a9d9b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionSurfaceProjection.java", + "type": "file", + "size": 12858, + "sha256": "f58737e2612062e44b489af61ffd1754afda803394ad7585dcad00440eef0941", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionSurfaceProjector.java", + "type": "file", + "size": 4459, + "sha256": "098bda727f36a026acb174d3893d1eb14b5d9b9ca97da2bfd20a19899ef9a263", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionSurfaceRules.java", + "type": "file", + "size": 13624, + "sha256": "41158f6c1d38e6ad8b7d6f8ce7fdd120c79c26ee27ec35e162c0a137489baa8d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionSurfaceValidationContext.java", + "type": "file", + "size": 18088, + "sha256": "6e779f2f23dce0faf28760441ff312f59c09158590ecb73293dc685bd0412493", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/SubscriptionSurfaceValidator.java", + "type": "file", + "size": 749, + "sha256": "6fc59977edbd3fd86dcd2f8ae6a0a1b3c4db052d8311d18a993d302dc8396bd6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/TerminationService.java", + "type": "file", + "size": 4724, + "sha256": "004f6ac5e70699b2bc581bf5fb234df1c381c9d373ad19b5e92865f552679054", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/TypeGeneralizationPolicyResolver.java", + "type": "file", + "size": 10144, + "sha256": "8a9a5115fbf4bccb0380485417eb007443dd51877f65f47f04a7b5d9b1c1beca", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/UpdateMaterializationMetrics.java", + "type": "file", + "size": 240, + "sha256": "210af610a41c81094ac3a96b10757cceb5591424e9b47659b22a57b94debd0cb", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/VerifiedExecutionEvidence.java", + "type": "file", + "size": 17187, + "sha256": "8f0dff169b13768aeded29fdd4789413b680f9441b3151613ba272b4a5927ce7", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/WorkingDocument.java", + "type": "file", + "size": 28012, + "sha256": "6e7ef00683fc8be8be5d2568f765fb2bd9feff32eac6967448f6847dfd7bec51", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/ChannelContract.java", + "type": "file", + "size": 1975, + "sha256": "2a5929a56cf2b7802ceb41c905a78833f662957b7553909cc6f5abb2ac448348", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/ChannelEventCheckpoint.java", + "type": "file", + "size": 3678, + "sha256": "e198195de2dbf3f8ce956d1722acea2510df27537c384c90268cf4d59d79e763", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/CheckpointEntry.java", + "type": "file", + "size": 2818, + "sha256": "d148e17b92259ff522c3c40812ea6a0bd706b6f3cfab0d3232f88fda3c63f6b4", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/Contract.java", + "type": "file", + "size": 2033, + "sha256": "737ea80e08c099ae12be60bde5896c51f736d8bbc27b401a317bd42e3e51c0f1", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/DocumentUpdate.java", + "type": "file", + "size": 4933, + "sha256": "601e8b2409f4943596913b5c59baa7d5c1fce03c784232e25c91c0e0e64cb671", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/DocumentUpdateChannel.java", + "type": "file", + "size": 1029, + "sha256": "1dd97d0446a830e91ae706a0d56560f74daa2d7cf00be9877a59799a0e62ab08", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/EmbeddedEventDelivery.java", + "type": "file", + "size": 1614, + "sha256": "b813f4f1dde29ea6252d43f65564be9343a4a0a7c406b08efaea30d4a5c123ee", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/EmbeddedNodeChannel.java", + "type": "file", + "size": 1593, + "sha256": "05c0778c1e08cdbafc21975f519f99199e8367aff9f1f9448f3e7ada31d12d82", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/HandlerContract.java", + "type": "file", + "size": 2757, + "sha256": "f4ce45203cded5061e4b28d4dd5cfe43995d500038a126661008ae96d55cbfbc", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/InitializationMarker.java", + "type": "file", + "size": 2172, + "sha256": "02e67e977b8ce38a5cf9805796cab2ff933a670d17d52fd15dcd727e7bb7fa98", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/JsonPatch.java", + "type": "file", + "size": 5090, + "sha256": "27241475e3519b86244d5e8e1afbd864ac84635b503f99e0a79bbf673d0b7f8f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/LifecycleChannel.java", + "type": "file", + "size": 438, + "sha256": "03751f08b27f22340be0c659f30b28b5c7f24203f45c8ce1266bb1f1f505badc", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/MarkerContract.java", + "type": "file", + "size": 270, + "sha256": "b189be460cacb10eda6f9a9f839daec4a819bc99a57be8ba7b0c634f26b5e93e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/ProcessEmbedded.java", + "type": "file", + "size": 3268, + "sha256": "50039fa0d8f3aeb5000c971cb0371ee87356dcc54d6b17e9224a64a114a30101", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/ProcessingTerminatedMarker.java", + "type": "file", + "size": 2742, + "sha256": "db1f85ea5aa632c2309cc055006ac166b35ac96852c223e603a3b655c59b5150", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/TriggeredEventChannel.java", + "type": "file", + "size": 1050, + "sha256": "317c74f44f2a5315f7e29c69ec2f34fc45852bd0d929ec113999dd8e7c229d7c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/TypeGeneralizationPolicy.java", + "type": "file", + "size": 1708, + "sha256": "dbc34b3af225d3404bcfabf836dac76198b3dd8ee968fedd7d6a8c577e9572f8", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/TypeGeneralizationRule.java", + "type": "file", + "size": 2063, + "sha256": "b19ea25106e8fa71c4b1a7e28481cff09b8d6a95e0d55edfe614ed08e07b43ec", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/model/package-info.java", + "type": "file", + "size": 1499, + "sha256": "fa0381da8bb736776d6a20c525ea4d6345a38bb1eb01d15af456f0f59503a942", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/package-info.java", + "type": "file", + "size": 2988, + "sha256": "2cff2433b89110fca46394b396ffe79046f25763013d357b70332c00435c2c58", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/registry/BlueRuntimeTypeRegistry.java", + "type": "file", + "size": 25046, + "sha256": "11b3ccf04e82e9e61e77143b9bb1ebd887ebef67990a80d6d8e6d655ab9114d0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/registry/RuntimeBlueIds.java", + "type": "file", + "size": 8702, + "sha256": "e05b2d9b18b98e5241627909e1f133d3fc81fd6819e649c4374a11c9e3baaec6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/registry/RuntimeTypeAliases.java", + "type": "file", + "size": 2610, + "sha256": "32881cf65593b19a347bfb8af2e198249cd7d95d1f7f0af5f6f19f0055af3e98", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/registry/RuntimeTypeKey.java", + "type": "file", + "size": 2105, + "sha256": "2a67507811c721800a63782f43483ea9d5f23531f70a293ae619739b79e84014", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/registry/package-info.java", + "type": "file", + "size": 1441, + "sha256": "51b25afd94f9678874a42bef717521ac37600fec9b7ad24eacaa45d1a497aa01", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/util/NodeCanonicalizer.java", + "type": "file", + "size": 3513, + "sha256": "127e16a7e9b4d541ba745230bcbba677d2ef0ed872876678cc56535d64a001ee", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/util/PointerUtils.java", + "type": "file", + "size": 9917, + "sha256": "e8be1fddca6842c629d1168635a98e92ceb4964589c79d18f0d5bc7e163690d7", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/util/ProcessorContractConstants.java", + "type": "file", + "size": 5525, + "sha256": "c97fc1c79decd344bf076793a75bc4c8aa9af54add06fb5cad72e70c2d874d50", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/util/ProcessorPointerConstants.java", + "type": "file", + "size": 3799, + "sha256": "067be17e7d7541597ac063b80dd6f6796d72eda74a19aeca7ff2f29cb7f6aa51", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/java/blue/language/processor/util/package-info.java", + "type": "file", + "size": 1388, + "sha256": "89557802951a52e3b717bbf634f698881652cb43b3d84c90c8c3f3fc92a7ec23", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/blue/language/processor/contracts-gas-1.0.yaml", + "type": "file", + "size": 5485, + "sha256": "1f4054b77fc7ef01a3e62f5b29d209e84f26e85148c91b03fe48da2c3579408f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/Channel.blue", + "type": "file", + "size": 265, + "sha256": "5e720f3a90abf95de65effce8c749e3b6beff576d1000495206795335565f80d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ChannelEventCheckpoint.blue", + "type": "file", + "size": 514, + "sha256": "3f4805232f6e22d2a32079ad1df67d5262863d7cc1e287f3b9cd64688dbdf4e0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/CheckpointEntry.blue", + "type": "file", + "size": 295, + "sha256": "aace592e4597ac5d1a33109d456e9a876c7667fefceda72d8ba04b154b170c85", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/Contract.blue", + "type": "file", + "size": 453, + "sha256": "9cf640fb810ce6ca9d194e3358aa11423733edbde0acbd1e46d0daac8e134395", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ContractExecutionResult.blue", + "type": "file", + "size": 598, + "sha256": "6b3fd65507c9db589ee4e3b5c14f68f3ba64a0c9998a82b98605bed6fbf0e9c0", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/DocumentProcessingInitiated.blue", + "type": "file", + "size": 553, + "sha256": "90a68a2a869b0a234e06aa99747b6a3dff7f52ac34fdc119db00a3caded6eec9", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/DocumentProcessingTerminated.blue", + "type": "file", + "size": 467, + "sha256": "e42553e89eefa6848784c3c4c9a1548ce69fa6015440c8b119f8ee0c6fcbb30f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/DocumentUpdate.blue", + "type": "file", + "size": 857, + "sha256": "57c55965d04db66ee88bf03cdad411529654beb94c6bc8d3fb03b2e9bed8ddcd", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/DocumentUpdateChannel.blue", + "type": "file", + "size": 320, + "sha256": "85e9be8104ea101b9e226572e85c2c83f05be5fb50f03816ab7eefbc0b2bb7b6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/EmbeddedEventDelivery.blue", + "type": "file", + "size": 313, + "sha256": "66e52077baf7f7a473f4049446cf646c79fae5fa02d0f6c0d45f41434af8459f", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/EmbeddedNodeChannel.blue", + "type": "file", + "size": 413, + "sha256": "a41af8670a1fdcf4613fc4eb784061b6145094c1bdd3c3ae5b9b2c75a8435591", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ExternalChannel.blue", + "type": "file", + "size": 358, + "sha256": "e4c3c888aa58b8a224e0faf2fff3bdc59e51f4d134f25845ef1835595b44ff2a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/FixtureEvent.blue", + "type": "file", + "size": 342, + "sha256": "dd3a17773d284cb544f56e615af861b1f555920cd9b9123a3b9824656d66220b", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/Handler.blue", + "type": "file", + "size": 527, + "sha256": "3efb8209f06f9caadbe41015704a2f787f94dc5c452a5d088e89bb1f3fe3920c", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/JsonPatchEntry.blue", + "type": "file", + "size": 485, + "sha256": "63f69547dab9adf1175aa9bdeeb24ceacd6734ddb1c584683c28464dacd7af6e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/LifecycleEventChannel.blue", + "type": "file", + "size": 215, + "sha256": "eb52de19cccda56ffe6d525151ff64af497f0e16b4f3f67ae1293a7fdfbf0121", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/Marker.blue", + "type": "file", + "size": 244, + "sha256": "8ba7b1da79cb1201b1cd63193ec9c733588cc8cd2f574664a3ef37ec2bf90bf5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ProcessEmbedded.blue", + "type": "file", + "size": 1181, + "sha256": "e8a70c30080f0afa187d12d29dccb08aa5eb4e19ae8938ea517b689df5b9fa1d", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ProcessingInitializedMarker.blue", + "type": "file", + "size": 767, + "sha256": "0ff5a8d1bc06f5a6bc9a5c4cd1c340d05c83be39697f2e966a84a67a489b32c6", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ProcessingTerminatedMarker.blue", + "type": "file", + "size": 512, + "sha256": "65de4d07b88cbfe9979e9a4e05f3bf8ff9b8086e74b4074a3d3061fb1e88ef81", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/RuntimeCounterEntry.blue", + "type": "file", + "size": 344, + "sha256": "9d7e7e5b75cbbad36556a4a48b7d17db5f62a19a537cfc2fdd624702a2da14b5", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/RuntimeLedger.blue", + "type": "file", + "size": 474, + "sha256": "788518f6f6bc8570ffef719822c3359b41c140e795e3b4ff74a7fd2c24f4f314", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ScriptedExternalChannel.blue", + "type": "file", + "size": 1544, + "sha256": "8246d62d77bc88ba45e97e70c9211e6c6377892a5e4fd170b4ae02e89c2306fc", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/ScriptedHandler.blue", + "type": "file", + "size": 249, + "sha256": "5f0bf56628d08f6fd3020edea085381a7363938fac2a67e432feb4f26ecd9bb2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/TriggeredEventChannel.blue", + "type": "file", + "size": 275, + "sha256": "e38233a8bc8799b66cab18e7532bee185577f76b99c14c169d2540d298172fa7", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/TypeGeneralizationPolicy.blue", + "type": "file", + "size": 476, + "sha256": "65eb522ae7ee74074148a2aa06452f8df26fa2364eff9205d46c94bf82b1f023", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/TypeGeneralizationRule.blue", + "type": "file", + "size": 411, + "sha256": "31d532f363bb33e347edde6f42fb85dd65e1e34893771499facfb05729dd12e2", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/registry/blue-contracts-1.0/manifest.yaml", + "type": "file", + "size": 7280, + "sha256": "04c94f12d02734ba50f8dc6f89210b79ce173557e299a136af2a45b0aabc866a", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/main/resources/specifications/blue-contracts-and-processor-specification-1.0.md", + "type": "file", + "size": 149174, + "sha256": "6406153791ed99cf97163726b8d2a272e3f0ca1078dc6c9f69b81855d81e5c81", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/test/java/blue/language/processor/BlueContractsTest.java", + "type": "file", + "size": 45076, + "sha256": "a50cc808d8efbe458d71648e6be2defbbf6fd8394959b2ec7f3d4d20435d54eb", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/test/java/blue/language/processor/EmbeddedScopePlanTest.java", + "type": "file", + "size": 11789, + "sha256": "4ac3743f2386c91e9b590b59a2ce01f6c816a8cf0367bf841feba1bbfa668f01", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/test/java/blue/language/processor/EmbeddedScopePlannerTest.java", + "type": "file", + "size": 46206, + "sha256": "1981d458a94a1ed26d3c876e4aa3484868132328420336b8c88141361498ac25", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/test/java/blue/language/processor/ExternalSubscriptionProjectionBuilderProviderOutcomeTest.java", + "type": "file", + "size": 16597, + "sha256": "b5d1188233cac2be0615fec3dbd6b23d4987f6b385179b70229e22bbf75bc14e", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/test/java/blue/language/processor/PlatformProcessInvocationPlanVerificationTest.java", + "type": "file", + "size": 59657, + "sha256": "9ab76ca7315ff6f637bb6a2dce01bcd64324022e05b0b612581c05795018a2aa", + "mode": 420 + }, + { + "path": "blue-contracts-core/src/test/java/blue/language/processor/model/ProcessEmbeddedTest.java", + "type": "file", + "size": 6235, + "sha256": "c585d2a760df2a8c1eed72e3f0aae310e081c95485562c5c9b1c364e5d7ee5e0", + "mode": 420 + }, + { + "path": "blue-language-core/build.gradle", + "type": "file", + "size": 538, + "sha256": "7eaa35b289ddc9b66090ec435c39c38f7570eb80fa9936fde4dad7de0b4b41ac", + "mode": 420 + }, + { + "path": "blue-language-core/src/jmh/java/blue/language/identity/Base58Benchmark.java", + "type": "file", + "size": 5669, + "sha256": "5a1694aa31f567f14519841316dcec2c778e93589b0f54474e8cc77bfb7ea222", + "mode": 420 + }, + { + "path": "blue-language-core/src/jmh/java/blue/language/identity/CanonicalHashBenchmark.java", + "type": "file", + "size": 3152, + "sha256": "06d773fc89dfb24980c7ad20a43bc0738ce893300b1f60e7a3a97734ece21910", + "mode": 420 + }, + { + "path": "blue-language-core/src/jmh/java/blue/language/snapshot/FrozenCanonicalDigestBenchmark.java", + "type": "file", + "size": 1360, + "sha256": "773dbcc84d19b365c18adfd6e8ac13ab5b49d4dcbc803774a9b8caa04fee9cf5", + "mode": 420 + }, + { + "path": "blue-language-core/src/jmh/java/blue/language/snapshot/FrozenNodeIdentityBenchmark.java", + "type": "file", + "size": 4079, + "sha256": "717a109e3b1d38330b2f99ba348a364ef638b1f03d5f7bc250284f5b9699adcf", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueCachePolicy.java", + "type": "file", + "size": 16754, + "sha256": "0e27a5240ff3542cc284fb45a171bbb619f66d55305ff61f2e2fbe72a649f2e2", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueCacheStats.java", + "type": "file", + "size": 6227, + "sha256": "4729acd931a8f0f8eb4b11b383ca5f6c74b1d2daffcf3c319c32de1b0e43b463", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueLanguageErrorCategory.java", + "type": "file", + "size": 1465, + "sha256": "dba67b59380d2ff3e875d51d1576377524a6442ac77a5a9aad46f1066438b732", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueLanguageErrorClassifier.java", + "type": "file", + "size": 8919, + "sha256": "bdb053384133520889ff31fa06eedf860c82d68a05c32db2b7772c62028b4086", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueOperationLimits.java", + "type": "file", + "size": 3655, + "sha256": "37ee0b88b4b9237b521ff07abaf16ed8fff95e552c51048bb5c00de0d0118859", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueOperationOutcome.java", + "type": "file", + "size": 392, + "sha256": "4c77939f22518398143b2e5173652ff49549869d1cf4d07b4cc0795ca2536ca3", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueOperationResult.java", + "type": "file", + "size": 6712, + "sha256": "6a1470c69f52a21fd2de5a947e71f1bf6cea8cea9794d0712ae9e488c1b30bb4", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/BlueViewPath.java", + "type": "file", + "size": 6798, + "sha256": "7a8cb95b47ec6e8d433d72d124c36357da9cba99b5a84ffd7c95278e80345087", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/NodeProviderOutcome.java", + "type": "file", + "size": 448, + "sha256": "aaf382c135f8693e8cee0e336d92c83772c426fadd9c3cb5b21f809c6ebb3e42", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/api/package-info.java", + "type": "file", + "size": 1000, + "sha256": "9c400ed7cb109bdf272323022f9a16f96a004616a84334fa32ad607c1821a268", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/codec/BlueCodec.java", + "type": "file", + "size": 1439, + "sha256": "497ac0d4c7fddc9f327c11875f9b841f770cd0886d5bd4e4de88e58b4f3c02c6", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/codec/BlueFormat.java", + "type": "file", + "size": 231, + "sha256": "8903850cc98508eb39a897793f4e10c60187ae5ea6b073ae23da68c21ef4ff3e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/codec/StandardBlueCodec.java", + "type": "file", + "size": 2043, + "sha256": "b9243a513eb0709bb26e3b4b7724dfb75cd5a675dd1ed779d861c04c87be635e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/codec/jackson/UncheckedObjectMapper.java", + "type": "file", + "size": 11298, + "sha256": "14b6c48a24bf34297ff5d5c991ea28072dd10aeb7ae19f50319b52b3654f24b7", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/codec/jackson/package-info.java", + "type": "file", + "size": 1459, + "sha256": "d4dfd8b1f959de739b65446abfd76916a2822423a5663aa8650ebde4dc82a78f", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/codec/package-info.java", + "type": "file", + "size": 1101, + "sha256": "a5642dd72bb7fe9471a79cd75e0838a28fba3af36f3eabed521349f6b196e51b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/conformance/CanonicalGeneralizationPatch.java", + "type": "file", + "size": 1766, + "sha256": "42dc82798310132686c9178dcf5b0006b51c4997a0a58c43dfed121f9dc4aa22", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/conformance/ConformanceEngine.java", + "type": "file", + "size": 15678, + "sha256": "81965883ddebbb806e3397c32681c2491861a805fad4dc16ee26af155a75f704", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/conformance/ConformancePlan.java", + "type": "file", + "size": 5808, + "sha256": "7db2eeeb4d3b1ba19db50a1f56f2bd0c112e86fc720926b53bd9db9d83bd2836", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/conformance/ConformanceResult.java", + "type": "file", + "size": 1466, + "sha256": "5b29280ca1c7c28e3edbd08d4b9d06e1a25836f15b675149ff013f72af04cb46", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/conformance/FrozenConformancePlanner.java", + "type": "file", + "size": 22527, + "sha256": "aeae8d2c695247b32e1c3d199c7818ac4af06f09108bba67db28207df9cde339", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/conformance/package-info.java", + "type": "file", + "size": 1081, + "sha256": "18481b1bdb42c7bfa41345a6d882a18e72021dfe58f7c80098772e982f3b9713", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/graph/BlueGraph.java", + "type": "file", + "size": 1385, + "sha256": "8c1a79e0095111c9e9ceb1b483b09d5f13b0d2a7377647b23f8599a5d19cbb65", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/graph/NodeExpander.java", + "type": "file", + "size": 7372, + "sha256": "e914d5a31c73dec2132dc66151b21c4b7fc799a4a28ea63f353733b4aac41128", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/graph/NodeExpansionEngine.java", + "type": "file", + "size": 18529, + "sha256": "ff5a9a6105db13a4be2865601ae94d456915c8de2c9465e5073ee5eb2d14b4be", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/graph/StandardBlueGraph.java", + "type": "file", + "size": 2162, + "sha256": "9f30e797bfb37fb8424811a91cb648fb381a17c3e10ad605b908a97f907f851c", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/graph/package-info.java", + "type": "file", + "size": 1027, + "sha256": "2301d1529554e2276437cb34bc1ada32a3a9b03d45281bb97f41b6815f813475", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/Base58.java", + "type": "file", + "size": 6754, + "sha256": "f967738575767fe6c919966312b42f99960d21c4b759affe3c13a2de618baa42", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/Base58Sha256Provider.java", + "type": "file", + "size": 3840, + "sha256": "b42d5502f0ab20555eacc42495df3b98a55caaead3930394b7ec9d9918a1dbf8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/BlueIdInputNormalizer.java", + "type": "file", + "size": 8365, + "sha256": "53da3a9e9a8caf0bd8fe9331b6fb0d152bf0aea9492197113bda0d26c7637fa5", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/BlueIdReferenceValidator.java", + "type": "file", + "size": 16062, + "sha256": "392172baa11e19a2eb1ea653f58aa9d1a3ce4e73df37c29277f80e090deb581b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/BlueIdentity.java", + "type": "file", + "size": 1526, + "sha256": "17d622958721a560833d148653bec21fba1ae439107850dc903309b3b54b76c5", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/BlueIds.java", + "type": "file", + "size": 9184, + "sha256": "d83538339ca936cbab02db9f7cb4b8f959a3c000df061c67c2d1f3b004e98734", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/CanonicalIdentityConstants.java", + "type": "file", + "size": 1112, + "sha256": "635a0953fdc367c0afadc64a5a829b8a60da3fa5d1e6e6559f0b2e2b361100f5", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/CanonicalIdentityInputBuilder.java", + "type": "file", + "size": 1296, + "sha256": "6a27cb748c07313f1728ea0b031b536b532b96b065a49ec5e9d91f0cef2b1bce", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/CanonicalIdentityInputReconstructor.java", + "type": "file", + "size": 11793, + "sha256": "c32769cdd20cc32f6aef07d43ee34e7f0a1e956f1447dab022754b2259724407", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/CanonicalJsonHasher.java", + "type": "file", + "size": 1052, + "sha256": "91df7f443750dfac524066524bd54386a0fd4f142ef2b8bd978f6efdcae095ca", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/CanonicalJsonValueWriter.java", + "type": "file", + "size": 14952, + "sha256": "9ef58cb46eedb6ef6e8097585ffe7e08f8ccca8534839110d14d252a01bed2b3", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/CircularSetIdentityCalculator.java", + "type": "file", + "size": 13647, + "sha256": "1450b87280b3563e7a905af941bf68ead1a0cd556725f3ff647025aea37bca4b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/DirectBlueIdCalculator.java", + "type": "file", + "size": 8873, + "sha256": "a613b9c7a283dff55518c38257ca2f6de098d31057acf738c93abd998691d4fd", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/ListBlueIdFold.java", + "type": "file", + "size": 6424, + "sha256": "f4fae0f91e48b78c81c39607262ce1b63455b94fc55f3dd34875d8521da13987", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/NodeToBlueIdInput.java", + "type": "file", + "size": 20874, + "sha256": "2ba2f0af4a5ac91d2fc5f4cd76bf1b66d762d2f29bc32e081920a12803467c80", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/ObjectBlueIdHasher.java", + "type": "file", + "size": 2385, + "sha256": "8876189f147ce3cdd0092a0040969c24bd69854f64714b408c47970d305dbbfc", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/ScalarIdentityEncoder.java", + "type": "file", + "size": 2762, + "sha256": "1ac02b76627bf497308437b4e764afab8b90ef11b868b94053db25040ddd0ad1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/ScalarNodeIdentity.java", + "type": "file", + "size": 1967, + "sha256": "44b55cebb68d7e0e74ec855c121b62e71d0bd89f91a51459f8263aa74f0d50aa", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/SchemaEnumCanonicalizer.java", + "type": "file", + "size": 5193, + "sha256": "8e4bfc7d6ddf68d96436165783e755d0f62b63467f82159cd41e21eee4b3b584", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/SourceDocumentBlueIdCalculator.java", + "type": "file", + "size": 2119, + "sha256": "c2702a34c996aeccea26063eab10a6eb8124d4ab3a66e09bb3cf92f087b7cb55", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/StandardBlueIdentity.java", + "type": "file", + "size": 2569, + "sha256": "e14d7303efff92dd08b6dd22c4098a1c6542856bb43f80c7627276232644f18c", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/StandardNodeIdentityProvider.java", + "type": "file", + "size": 870, + "sha256": "c5962eee963e17d72274d02fe6e2f0055a532bbb0d9d62406aaab48eb9d4a77e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/identity/package-info.java", + "type": "file", + "size": 1539, + "sha256": "a86e00ed773ddc8acdf8ebafff4d0d5fafca466a0b99bfd75d6a5f51fab1b3bb", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/BlueMatching.java", + "type": "file", + "size": 1856, + "sha256": "e1c7c39c8a922bc1f1e06e296b78757ccb3002ad225635301800d8b4d28711fa", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/FrozenSchemaMatcher.java", + "type": "file", + "size": 10074, + "sha256": "31ac76824ef80a37c73d97d92ad3ffacd5baf0b276406df35a67a4bdac24bfee", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/FrozenTypeMatcher.java", + "type": "file", + "size": 29147, + "sha256": "1d5eb10394c43588a005be207af68b365ee7909dace5a09be75521645aa610c1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/LabelNeutralTypeIdentity.java", + "type": "file", + "size": 2405, + "sha256": "660cd2453fcc339249e25f265760ecd135dbb4ea0aa8bdadc39ae2e988d6d3c8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/MatchingPlanCache.java", + "type": "file", + "size": 6123, + "sha256": "cf5e8c5a912df79c888aa4d9ef26b9ba98c0175cd0f946a1bd9add9ce6781330", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/MatchingRuntime.java", + "type": "file", + "size": 1884, + "sha256": "e97527803639208a6a11cc514e2b9e000860feb12cea66e064c82cf779309bed", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/NodeTypeMatcher.java", + "type": "file", + "size": 14452, + "sha256": "60a7f94787d298a8ebaca5ad994b8d50aabd2139995bc93ec29fa999480b02eb", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/matching/package-info.java", + "type": "file", + "size": 1188, + "sha256": "df4ed23cfe88e2038ac40af6a3d62c93683ed744a1bdf453ca5e0f5aefc65286", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ActiveTypeStack.java", + "type": "file", + "size": 2077, + "sha256": "08f0b3e1ba7050c314592c392e35e6e9e61a218fca55895c645724f07dfdc50e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/BlueSnapshots.java", + "type": "file", + "size": 2111, + "sha256": "622cdf2d2432808c2902ed31e109934182d3a1211d7cf5da8dca043e3ffbff36", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/CompletedValueValidator.java", + "type": "file", + "size": 16749, + "sha256": "ee84d472cc220346bb3a017d4da73b04442d514bdebe92ac28c4fa77f0605abf", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/FixedContentTask.java", + "type": "file", + "size": 339, + "sha256": "bfce56602c157b3fd2dfc8626884d2a3fc67281d6d08004066be74646e4cfc4b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/IncrementalMergingProcessorCapability.java", + "type": "file", + "size": 1161, + "sha256": "f8a3858d9863eda06f015ebcf474f8a99c7d19d424ff65113161ee0a52ca3ee8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/IncrementalValueResolutionRequest.java", + "type": "file", + "size": 6834, + "sha256": "deacf712834d7224de03d1d0df11d5a3bbf590f1fe890c768648bfec621ddb82", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/LabelPath.java", + "type": "file", + "size": 1531, + "sha256": "fd31e2c6db71323d729a20b46426b547e8c353d5e7ba4b0942cdff8b81f12f76", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/LabelProvenanceTracker.java", + "type": "file", + "size": 33333, + "sha256": "4870a56b9573a930d3b1fa715bd3af94f6eae87a7d0e05e3e93869a1b397c18e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ListOverlayMerger.java", + "type": "file", + "size": 20430, + "sha256": "71d1762e7d840a09f18d6f2b24a4b86e63b5a4cfc1cdcad219158f96d6ba9c90", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/Merger.java", + "type": "file", + "size": 9011, + "sha256": "d45f73249048f55dc243217b17fde909bbe52c504344f30c0ab7b14079d81aad", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/MergingProcessor.java", + "type": "file", + "size": 2494, + "sha256": "54440be8f046ef7598bc27a39b0c776d7440cdae7718c9b0ce066acaa6cf2d52", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/NodeResolver.java", + "type": "file", + "size": 838, + "sha256": "69e4a8e076a0aaf1423daf58dc0bda7cc0520ba2ecae889708c42572ab910255", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/NodeSpecializer.java", + "type": "file", + "size": 1868, + "sha256": "7cba2dc0afcaf5a60005d14628cc8330d2506bef0e547f394c7d962d52ce12a1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ReferenceResolver.java", + "type": "file", + "size": 21856, + "sha256": "eda221927bcb666c20fbb12959f56d0e2f7c5c7d9f3b7c6b573d0a19b534f603", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolutionEngine.java", + "type": "file", + "size": 34097, + "sha256": "57de523cda9ab6d4a2cf1f82d203d4099bdf113a421d5168acc3d8591471b50c", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolutionProvenance.java", + "type": "file", + "size": 1668, + "sha256": "061a4c5af1d665ed654cb3a59ea8f6c57b879e3e94fae0a99943da9b3b5fbe04", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolutionSession.java", + "type": "file", + "size": 1827, + "sha256": "db4f3d4f256215d7e193c4cc79005d9df6fee9d6c7cc1a92c7527de11c3a5e7e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolutionSnapshot.java", + "type": "file", + "size": 683, + "sha256": "3d3643668afa64803be98b34b7a40b7a361d82087583940160ffcc907551b9e2", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolutionSnapshotFactory.java", + "type": "file", + "size": 2864, + "sha256": "9c96a37b60aab55586aeea571e93aed29f31d7c1e4c59d4107f5a78ca80077d8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedReferenceCache.java", + "type": "file", + "size": 33584, + "sha256": "96c7855acea74532f9532f93324ca75b3416a3b9ba5a86afb45bd28f4ccbcb4b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedReferenceCacheAccounting.java", + "type": "file", + "size": 10484, + "sha256": "6dd6f20d6559b5967f99c264f071328a5905bae289487cfa0c993071dd152097", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedReferenceCacheGeneration.java", + "type": "file", + "size": 1378, + "sha256": "b818635503602f7840a547fca5001545db71f16d0ee2817582c592d243669476", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedReferenceCacheLifecycle.java", + "type": "file", + "size": 11412, + "sha256": "79dfdef726e6268ad3ac1a2f07074eb572a07064cf03849634f66344be0833d2", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedReferenceCacheStatistics.java", + "type": "file", + "size": 6993, + "sha256": "eafd9f0b3a8e7f1cd7640e09da417cbfc5c6b51529c12d5f0426bd1bd42b61c9", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedReferenceGraphIndex.java", + "type": "file", + "size": 4329, + "sha256": "0127387a19959a97e19eae0f1d03b9d1ad3350f912b25bafe2e5cd3e7343ec85", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/ResolvedSnapshot.java", + "type": "file", + "size": 11622, + "sha256": "8900907df3af581d4398036dbb597ba7e437f3162488d4c79d54926b79da2f80", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/SnapshotResolution.java", + "type": "file", + "size": 1913, + "sha256": "c0a98bce997f2ed615b097144850933fef2e98b7f2f7178ecbf3a8ccab5105c1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/VerifiedCanonicalLoadCoordinator.java", + "type": "file", + "size": 9026, + "sha256": "02c78a5423394238d84d032e26652b28137b50095f830c2a7ef47974d7dc92dd", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/VerifiedReferenceEntry.java", + "type": "file", + "size": 658, + "sha256": "7fb9823789aec040dc3f32912d8adfb985065debb09d032fde7f819a72066484", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/VerifiedReferenceResolution.java", + "type": "file", + "size": 1683, + "sha256": "a458f97af9151c657eb2b16f942bbcf8c5f7bf19b40c478db6f448c2cf51a3c8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/package-info.java", + "type": "file", + "size": 1180, + "sha256": "c57ec73c24b02bafdcfc64162abdda8da4731c98cf7fe27a4606c7b1a84ff820", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/BasicTypesVerifier.java", + "type": "file", + "size": 1529, + "sha256": "4ea8740187d35a96c4576635f72c9159da9b05753e9bb5a415880eeff5553bc1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/DictionaryProcessor.java", + "type": "file", + "size": 7052, + "sha256": "bf9e2ffb0bb24920a8c292b2c49c16bdd50e1746c67f3c24bca2297da58da23b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/ExclusiveItemsOrValueChecker.java", + "type": "file", + "size": 870, + "sha256": "2d3619d41e0ecce2f0a1968bd55db70058debe0dbb6904e3a0004ab17832a9b2", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/LeastCommonMultiple.java", + "type": "file", + "size": 1462, + "sha256": "988ff00096668dbc66701c184cdf88d1ceff5f52e15e468bbd67a3b77320e702", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/ListItemsTypeChecker.java", + "type": "file", + "size": 1420, + "sha256": "2365468dc92d38b2a683f8ce03ff163203c32d0f337ee78ee8447990ba4e890d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/ListProcessor.java", + "type": "file", + "size": 3624, + "sha256": "c352a1081d0be6d65f13821d040de2650bfcb49ef44376e6bb775416e277a5d7", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/SchemaPropagator.java", + "type": "file", + "size": 10156, + "sha256": "a1f551377338de92f81e6fb2461c47eeac1a724302914253fd4401b08dec5f67", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/SchemaVerifier.java", + "type": "file", + "size": 18129, + "sha256": "e91f5e52430557ab3804d15c5d4fdecb82e068786db8282680265c5e04ebc7c9", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/SequentialMergingProcessor.java", + "type": "file", + "size": 3303, + "sha256": "d50bd1fdc471168a66507d5898947b3e9cb0d2a15b60c67c544436fbd19d991b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/TypeAssigner.java", + "type": "file", + "size": 1356, + "sha256": "7e1229108637035a36d865d020888234d16671e00513019426e66bb6627bd9d0", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/ValuePropagator.java", + "type": "file", + "size": 2055, + "sha256": "27be9b6edc8d79ff3c762a6ea43b4b98fa4a9fb0c228430e818d462a293c0355", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/merge/processor/package-info.java", + "type": "file", + "size": 1171, + "sha256": "7d413f0213d3d67465dde303654cfa81801a9ca69ac32938204f3a7d4dd58e36", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/patching/BluePatching.java", + "type": "file", + "size": 971, + "sha256": "89004f1f590b52e4b12977aecda9f44b44b4b2c9e7ff8ed9ab8ef82a17ee7552", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/patching/package-info.java", + "type": "file", + "size": 1050, + "sha256": "b2e9695a39f33181863a495c6d59a7ab09c8ba2002fbe89762c3dbeaa30b025d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/BluePreprocessing.java", + "type": "file", + "size": 626, + "sha256": "5356043fddbf2c86db305dd19d5dcda113409fc7bb7cfd6881969042adfedbc9", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/DirectiveResolver.java", + "type": "file", + "size": 6551, + "sha256": "eacae5278124bb349a4621eb4b37199b7a278b63d07c60a54808f308e8b4fd37", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/DirectiveValidator.java", + "type": "file", + "size": 11612, + "sha256": "79de758ee3f780cfac2c36bd66a32931d4a7579b1b50f027dd227e56cb5572eb", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/ImportMapBuilder.java", + "type": "file", + "size": 4270, + "sha256": "5013c0a0a2167e2003a293d88c16501702e9e1e7e9f9c3be513d6f56eaf91a0b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/InferBasicTypesForUntypedValues.java", + "type": "file", + "size": 1391, + "sha256": "970fcd4d041251cb6d805d1b5692997eedd1da969ab04584b4116d64000f1abc", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/NodeTransformer.java", + "type": "file", + "size": 4335, + "sha256": "0f9e09d9e2b3539e792cbf2b881496689b8df7249d40345a9a4fb6cc6b76df27", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/NormalizeListPlaceholders.java", + "type": "file", + "size": 7227, + "sha256": "698cc5dea120167bb8ef5df75f7fcf17e1bba2d49359988fa5a7cbdabe168ef4", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/PreprocessingContext.java", + "type": "file", + "size": 2025, + "sha256": "400afee6cfc55915f9a7dfb66aa7871a4c90b51c7398a3af877e1a6c1c6df4d4", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/PreprocessingDirectiveResolver.java", + "type": "file", + "size": 3936, + "sha256": "1a41a3449b5502d5c59ba1367ff7aafab9f60c7b26c3939ade219d0766f91e86", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/PreprocessingLimits.java", + "type": "file", + "size": 6070, + "sha256": "b1d8aa2b2cd0eced603a01ba8fc875274010fce3885e19486b4ffeb924375261", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/PreprocessingPlan.java", + "type": "file", + "size": 2522, + "sha256": "9263e0c54489834179cee930f760dfe8819dca310e9f0bf00a80ab80ffe13999", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/Preprocessor.java", + "type": "file", + "size": 5515, + "sha256": "33a9dd6f61bd45ab28fdd38fff19d03444036af1874ce1207240c7c03b3d3ba7", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/ReleasedTransformationCompatibilityRegistry.java", + "type": "file", + "size": 2955, + "sha256": "aab2e06554cb9228a15e4100cfb71e680d64226f5348a3727815b989deba08d1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/ReplaceInlineValuesForTypeAttributesWithImports.java", + "type": "file", + "size": 2796, + "sha256": "b3c516aa8a5f5620354b2ed98140e702cf8a95e7a4212efb56fb655a3b813592", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/StandardBluePreprocessing.java", + "type": "file", + "size": 1563, + "sha256": "bda7675f3395cb2d7119a069e90bf6024540248f1318cda0a277716e3f611f53", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/StandardPreprocessingPipeline.java", + "type": "file", + "size": 12782, + "sha256": "fb9f9434c22e65d81cc3b67fd6ee0f70c90611328f9b8995080354aa85b24029", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/TransformationExecutor.java", + "type": "file", + "size": 1649, + "sha256": "c223c38697013307f9c88c872abdb69fcc0408906958fc7f1f710a44680fbd0d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/TransformationPlanBuilder.java", + "type": "file", + "size": 4974, + "sha256": "878afb0a30ea0047c5a4d87437c17f81f5d081542310af73e449769dc8b6b757", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/TransformationProcessor.java", + "type": "file", + "size": 1093, + "sha256": "00a295a5c4648f9b257ce9d52fecadc7935f8ebca456357bcba6c7efe65048c5", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/TransformationProcessorProvider.java", + "type": "file", + "size": 1317, + "sha256": "a2bf65b77b21743847bbb4658d755db19645fd6a3a986a38602e845a4c48b077", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/TransformationSnapshot.java", + "type": "file", + "size": 2648, + "sha256": "8888cf3677c4e9707591efa5e2953e2773c629c244edebafa1c61b2cc2631c8d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/package-info.java", + "type": "file", + "size": 1250, + "sha256": "708a3f364d2d4652924cf89741a074bb949103009fdb56a1c615b8f960459314", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/provider/BasicNodeProvider.java", + "type": "file", + "size": 10753, + "sha256": "c60ec218088aab6fdc026c74476cec77e9da37b76ff9c517c5d2560914f8652d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/provider/DirectoryBasedNodeProvider.java", + "type": "file", + "size": 6125, + "sha256": "c354ce6c7dc55528c3f65fed8cbe9a6226fe9fae5e72a32562441ae662b14a89", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/preprocess/provider/package-info.java", + "type": "file", + "size": 1134, + "sha256": "fa1cad99a49438588a27f94a0341caec45ffc4569ad817354845302c10702dec", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/AbstractNodeProvider.java", + "type": "file", + "size": 2991, + "sha256": "2b9033b20055205c2056642577824c369a304070fcec5e3cd24cf1bddc00a446", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/CachingNodeProvider.java", + "type": "file", + "size": 5787, + "sha256": "e2f669a2f550b19700678eaabc86f117eb9d593033f4cbff261049c3f5685883", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/CyclicAwareNodeProvider.java", + "type": "file", + "size": 1090, + "sha256": "618ee825785f86697ca06e3fb1670609617da58e0548775cc2717aee2d317204", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/CyclicSetProof.java", + "type": "file", + "size": 7745, + "sha256": "3ce68fa55e89299e4c2e57ccba6db264cc9c3416706b1d29a79b7ab47eb071f1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/CyclicSetProofResult.java", + "type": "file", + "size": 3329, + "sha256": "eaad1e3a012454b4486b7283275fc6025af2007608ebcfbf4f1c4e9abf107474", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/DirectNodeManifest.java", + "type": "file", + "size": 7879, + "sha256": "58de76b07b01b59a73e878d4da3578b6f3b167322a144deb3c69ff5f71e77850", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ExactFragmentAssembler.java", + "type": "file", + "size": 10819, + "sha256": "53b34e2a18dde78eb4903355df5bbd298cd6df97ee4641bcbf409fde37a95b26", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ExactFragmentGraphValidator.java", + "type": "file", + "size": 10038, + "sha256": "cbc2e6241289719ca5841c5647e668254b3523850de31a923c636f103d8b15bf", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ExactFragmentProvider.java", + "type": "file", + "size": 2472, + "sha256": "5456d0f62924068c71e9f9da6564a52af8260bc9bf02a6bbeb8b435c08a9e3be", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ExactFragmentSupport.java", + "type": "file", + "size": 10587, + "sha256": "b3cfab8cbe2d487b13229737c85777b2d05713b50ddf81c9298989df1e7963b5", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ExactNodeGraphFragments.java", + "type": "file", + "size": 10842, + "sha256": "fee2ecef20742c26faab49c6958b4475241f799bdbf47baa99abbe3c4e3ad3db", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/NodeContentHandler.java", + "type": "file", + "size": 20227, + "sha256": "4a03d899e109974675275a391fc4eed08ba5bcd2556a1042875e0a6acfa28bec", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/NodeProvider.java", + "type": "file", + "size": 1818, + "sha256": "0fddbfda5ecca1cd30e09c4825047dc07685efe1d9ef72375ce2a6a6885c83de", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/NodeProviderResult.java", + "type": "file", + "size": 3580, + "sha256": "60cf3b003bb335b9149cf7c95a4dbf8dced9161fdbf33a42aa26889f85094d60", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/PotentialBlueIdNodeProvider.java", + "type": "file", + "size": 1575, + "sha256": "d693fd8096ce99dfec25e7a6ee815a18c3e53b8bf80abc7272ecd8604c084c51", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/PreloadedNodeProvider.java", + "type": "file", + "size": 2081, + "sha256": "3ec330020f7ad968a92757e8568fe72c042404f187a4ab1c046bf015a460b3f7", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ProviderEvidenceVerifier.java", + "type": "file", + "size": 28088, + "sha256": "18abb4bdc48c09c80639326ee2ed7a742bce183fbf0a7532cdc31f8464d5d5fb", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ProviderMode.java", + "type": "file", + "size": 1150, + "sha256": "d31738a3d6267acaca4817ea701fe43b1036e4a013870c80633fa4ebc684a5b8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/ProviderUnavailableException.java", + "type": "file", + "size": 786, + "sha256": "c457296c0a48ebc9053fb58caf10e2cc78ae3abc023601440c836cad9f9c48ee", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/SelectiveExactFragmentAssembler.java", + "type": "file", + "size": 15359, + "sha256": "d3d4d03d4a11ffc939f468efebdb323671d0ae3eb58c1c66461ce623f2c1c992", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/SequentialNodeProvider.java", + "type": "file", + "size": 2920, + "sha256": "5315e53d0ac81a3a39568272c63f427fdbf2618809bdc7c0cb55814def73a9ec", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/SourceContentVerificationRuntime.java", + "type": "file", + "size": 2108, + "sha256": "92da2f86a15c6ac9069c011ecac8708f18bf7868278b6c144af2299acb8ff7ae", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/SourceProviderEnvironment.java", + "type": "file", + "size": 9643, + "sha256": "ee13610e0665327d26db12a1abe74ff3ec29fac22bd636b8a45debd9fe17cb76", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/Types.java", + "type": "file", + "size": 14596, + "sha256": "611a4954a1325c96aeea2e6b612793f724c310c9902b031d55e059b5096dabd3", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/VerifiedNodeProvider.java", + "type": "file", + "size": 789, + "sha256": "de75c5c392e77e4e51bbddddd9aa7d193710a9f401e73d868a9ebd93daf13238", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/VerifyingNodeProvider.java", + "type": "file", + "size": 12770, + "sha256": "f81dbe6d00c28ff0c9fdff6facf830379d918d8c924c46e2fabab7216cd4a8dc", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/provider/package-info.java", + "type": "file", + "size": 1171, + "sha256": "e421337892000b6b5ab27a116aefe0dfb20e477ec9e7e86c50b775216b0cc0ae", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/registry/BlueCoreTypeRegistry.java", + "type": "file", + "size": 15711, + "sha256": "5e01f80243d920df21bdb4cc4632aff7a09b2fa75474a08f37cac8622c9d880f", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/registry/BootstrapProvider.java", + "type": "file", + "size": 1321, + "sha256": "a50365825117aa845e92add70a8e4ea496aec5b77a6966a24f955a92832d274a", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/registry/BundledTransformationProvider.java", + "type": "file", + "size": 3052, + "sha256": "f211e753cca0d82adae4586388d932ebb2c9524c59564cab78d562ef5ec0e5d6", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/registry/NodeProviderWrapper.java", + "type": "file", + "size": 11665, + "sha256": "8360875c9a0451a2c52f06d3344ef2f7907261c6750924166eb648bdf8d3d1ac", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/registry/RegistryManifestConstants.java", + "type": "file", + "size": 3149, + "sha256": "2402bf01e2ee061cf9ec358268a853f1d906b3861b24e803d0f6b8c5d1f1044e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/registry/package-info.java", + "type": "file", + "size": 1085, + "sha256": "239e8d059d9a9f7aa851ccb9f940bcae1ed1d6b459b945dbfde1f96270d22191", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/BlueResolution.java", + "type": "file", + "size": 1845, + "sha256": "76b527d5b0f0c319242670beb14cab5b64007e4fc3b538ab2426fdb8cee16fca", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/CompositeLimits.java", + "type": "file", + "size": 1985, + "sha256": "9a0af497023695edc3ea4b38df538309018ef7e38c1c2d330a71567fba66a686", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/DeferredReferencePathLimits.java", + "type": "file", + "size": 2850, + "sha256": "12f8a3ef2fc9ae1a1c387c326535bf732eb26c8741c46aa39049565caa002f5f", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/ExcludedPathLimits.java", + "type": "file", + "size": 3174, + "sha256": "3af76c18c34aeed17df8acf13be23120d99da09070cb7c59fca63b3211ba042b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/MinimizedOverlayBuilder.java", + "type": "file", + "size": 995, + "sha256": "963fa4b7bc9541961ee153c9ba19ab3e8858afac00b6f3361bdf22179c3e14c3", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/MinimizedOverlayReconstructor.java", + "type": "file", + "size": 12556, + "sha256": "52240493d1d48ecec3198c5aaa898ae7f3b815264beeebff725a4a457a6b4e65", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/NoLimits.java", + "type": "file", + "size": 928, + "sha256": "1beb23843f609ef0889e7394d11ecadef467d0f2be0b91a1088388e66843bf45", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/NodeToPathLimitsConverter.java", + "type": "file", + "size": 2195, + "sha256": "c52f466c780dc9a5c99b25a57a50111623315dfb167ee913d1601a3f54c4fec1", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/PathLimits.java", + "type": "file", + "size": 3681, + "sha256": "6292f93d2614d57f1d7d446751c8dbeeeb3cb8e356a0b22db52afb6e9858c003", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/ReferenceCacheAdmissionPolicy.java", + "type": "file", + "size": 941, + "sha256": "4083ab36b9422bd400c6fbe7e725abaa4092216ba221bd084d4475434abf9f8e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/ResolutionLimits.java", + "type": "file", + "size": 7626, + "sha256": "5f42bc56adabcf8b2bfd0dc35f896b4a78f18779eda0257cf1f8318c4b749793", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/TypeSpecificPropertyFilter.java", + "type": "file", + "size": 2377, + "sha256": "bb32ec89c907d0ab16c6f5ce698750376031f0b71e6cc9c22a8fb7391838ad13", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/resolve/package-info.java", + "type": "file", + "size": 1519, + "sha256": "4f953e3770d78b2bc9fe080b919cd2ee9361a70630a4005eb74c238516e3ae10", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/BlueLanguage.java", + "type": "file", + "size": 7320, + "sha256": "a6e9f6cbc5f5edbb2446b7b8b465363c50e58fa6b64f59a06b82d49623e50353", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/BlueLanguageRuntime.java", + "type": "file", + "size": 33253, + "sha256": "e56ad361ff74157da21e33158b882a9e11f2d92cb86f190f4acdb08804b0af2c", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/LanguageMatchingService.java", + "type": "file", + "size": 4858, + "sha256": "8ec00f64124905581fc2f14fc4e250e0d082b0f7244f579f3100b8f95cf551c8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/LanguageProcessing.java", + "type": "file", + "size": 12963, + "sha256": "fd076a6240cee907f317cde9f826e3b92356b66270d8c5233b21f85fa05756b0", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/LanguageRuntimeAccess.java", + "type": "file", + "size": 1617, + "sha256": "f7949fc26c4e579afde628c59cc192f866677fd1a40d3ef966af597678308c88", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/LanguageRuntimeLimitedResolution.java", + "type": "file", + "size": 9396, + "sha256": "64a06c23a4de8c6e359ae9f4c398abd55fcbe8057b28a18403005ac04c9d3053", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/LanguageRuntimeServices.java", + "type": "file", + "size": 10119, + "sha256": "f83c5fd46c9d408a2be6935cdf25cd8c2455271bcfe6cb4c456a3c0cd621b449", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/LanguageRuntimeSnapshotStore.java", + "type": "file", + "size": 12918, + "sha256": "51d19807fa39a702a6631683c0b4acf2ce68df3acabf35ac29853f1a470e7d35", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/ProcessingScopeLifecycle.java", + "type": "file", + "size": 1743, + "sha256": "eec3e75b0fc571c1b2a4b61021e1b5bfe10fd762e402732609d718e8110fb433", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/RuntimeLanguageProcessing.java", + "type": "file", + "size": 35910, + "sha256": "c4d866486fa9ec67893e696eceb74f3f4e849ba5228f3869a6ff70d0b18d0df2", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/WeightedLruCache.java", + "type": "file", + "size": 7793, + "sha256": "1bde9cb6f32c77a2b32648b596b4a9cac93db1a5d56c9f45ee24a79bf18df8b0", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/runtime/package-info.java", + "type": "file", + "size": 1148, + "sha256": "e5ae83f9a6bf8f5d176803e714963e6cb503a786357522bac41c075c7ac1234f", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/BluePatch.java", + "type": "file", + "size": 614, + "sha256": "2391dff6ed4363356854e407377051cf6ac946c3c3281cc285e730a17c295024", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/BluePatchOperation.java", + "type": "file", + "size": 297, + "sha256": "4b62a4aa1ac60e47219df0b1a404955e021c2f4e4c6db01db29612701518a457", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/CanonicalOverlayPatchEngine.java", + "type": "file", + "size": 15744, + "sha256": "b93addfd5371687edb05f7ca5c435f67ace5304d49d07f9afeefca5b1920a36c", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/CanonicalPatchResult.java", + "type": "file", + "size": 1680, + "sha256": "8b40ad22501ba9641368cbac5daa06ae0896c44f3980d64b7d4c99dab7a89396", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenCanonicalDigester.java", + "type": "file", + "size": 36695, + "sha256": "a97c6e5cc61a6b4b89e5038762a13ac6e6e3795215b061cccee00e63afda9302", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenCanonicalWriter.java", + "type": "file", + "size": 20037, + "sha256": "f02eef1f36416fa8054c67e19dca664619708c0b8f5063c090eb8481f06bb13b", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNode.java", + "type": "file", + "size": 25295, + "sha256": "44eb5345e56fd50b5234cfefda6bba54084ab4e72567e84a15c6f90aef21f015", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeBuilder.java", + "type": "file", + "size": 17708, + "sha256": "f898e51fd04ec4afe297383dbe5393ee05400a96cf098772bb2dc6d5f42e5425", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeConverter.java", + "type": "file", + "size": 21124, + "sha256": "5b813283f3fedb5dcc3e439992c5baeb304d02c28f90a6dc6c44c3205a400805", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeIdentity.java", + "type": "file", + "size": 19755, + "sha256": "f6f40a53f4e885d91e5e98ab83a21f9b6bac19cbdc27389808861e7ecbb81727", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeNavigator.java", + "type": "file", + "size": 4885, + "sha256": "2052aea6fcd1c39b7ed544c22f5dc6f265a5c72df5a4a184c10c681acbb285d8", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeRetainedWeight.java", + "type": "file", + "size": 14219, + "sha256": "16ccc2af639f13eb2529cec001960fd817a0bb25ffedc27c408d5b1e1974ab24", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeStructuralKey.java", + "type": "file", + "size": 6164, + "sha256": "5efb5bba1ac5fd49cc58c8371b9441cf2bc5b0f5479afdf96a90d4bf0a7d1830", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/FrozenNodeToBlueIdInput.java", + "type": "file", + "size": 16749, + "sha256": "3ce253d943b4b4494b6f3a55490b28534761de6c5b81fb67d2e7b32e4cd30d9d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/ImmutableBluePatch.java", + "type": "file", + "size": 2843, + "sha256": "2de9143b1c7a02afeef1f18ca404a2a5a27a1a6d2ce5dc73065833e2e40fa1e9", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/java/blue/language/snapshot/package-info.java", + "type": "file", + "size": 1132, + "sha256": "03bf01aa8e5f4b49b9ea95d75a30cc02023aeabb6086328369f7e38780fcf4c4", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/META-INF/services/blue.language.model.NodeIdentityProvider", + "type": "file", + "size": 52, + "sha256": "3e011192cbfb4fdfc86701b874020a8a43333837da4da57fd657816d0d47018e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/Boolean.blue", + "type": "file", + "size": 298, + "sha256": "92cf78899ae67dcfcdb7cb837190a04545e37966236e1808895ba70eedc5331d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/Dictionary.blue", + "type": "file", + "size": 1087, + "sha256": "f5ae2d363939f16685f3c07e4a1f1f15a2fa0acbd904d03446513ce9056eb9f7", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/Double.blue", + "type": "file", + "size": 790, + "sha256": "ddb28be72c55b606cc8ebcbe358df498991c8bef6019fb1f37541dbfc3929e9e", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/Integer.blue", + "type": "file", + "size": 701, + "sha256": "7ffe52869b7ee4d8587405ce2b770622204f40631d6246620139a5a490fc6de2", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/List.blue", + "type": "file", + "size": 908, + "sha256": "908e86621bc2a84ff28eacc0c4e57504605d0575f714f456d3abbde430de0a08", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/Text.blue", + "type": "file", + "size": 530, + "sha256": "db8a4ff45cccfbb92e011ac3c79a70e6a17e57f2a807e10747e9f444c8d15fe5", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/registry/blue-language-1.0/manifest.yaml", + "type": "file", + "size": 1698, + "sha256": "aa919ae25b1c21c9a5e63213c067f83e03aded39a597adb8043d4aacd0dacf54", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/specifications/blue-language-specification-1.0.md", + "type": "file", + "size": 198796, + "sha256": "a234b0b42190a7982809781b5efdaa2e5f1ab4b7f8d870fbd1ffe7020cc7e869", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/transformation/InferBasicTypesForUntypedValues.blue", + "type": "file", + "size": 196, + "sha256": "2c65848327d613d905d073348b7f6a178e19ea7e494e5be3c29c1e748020ce52", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/transformation/ReplaceInlineTypesWithBlueIds.blue", + "type": "file", + "size": 150, + "sha256": "381880ec603f5024e502a51dc2ad476e2984bb2422439ed0d27c90472093ca1d", + "mode": 420 + }, + { + "path": "blue-language-core/src/main/resources/transformation/Transformation.blue", + "type": "file", + "size": 61, + "sha256": "3df00361932ea861837b3f88ec5686b0b1aa74f26a96433dadd728ea68c432d3", + "mode": 420 + }, + { + "path": "blue-language-core/src/test/java/blue/language/runtime/LanguageProcessingTest.java", + "type": "file", + "size": 46861, + "sha256": "52ffc93afb3e8d65b0251f022aeff4805eee433ac69233bfc5cd2b7df8e5041a", + "mode": 420 + }, + { + "path": "blue-language-ipfs/build.gradle", + "type": "file", + "size": 414, + "sha256": "09f1a8f81dbe5e6d2d31640c1fa64f380ed2f262f7c7230631d48b7f2dd9dc2c", + "mode": 420 + }, + { + "path": "blue-language-ipfs/src/main/java/blue/language/provider/ipfs/BlueIdToCid.java", + "type": "file", + "size": 3010, + "sha256": "d384b1eee09534ac2894e325450e17dedfbec01fd7478c889e70ee11c20b762f", + "mode": 420 + }, + { + "path": "blue-language-ipfs/src/main/java/blue/language/provider/ipfs/IPFSContentFetcher.java", + "type": "file", + "size": 2072, + "sha256": "868a3af125fe2c7d704eac155392b97f6f3a3b0388cc06f87a57737b8ec80acb", + "mode": 420 + }, + { + "path": "blue-language-ipfs/src/main/java/blue/language/provider/ipfs/IPFSNodeProvider.java", + "type": "file", + "size": 2373, + "sha256": "75b2635a8aa09dc129146e5f8a26bc36eea5538126fc5e898a50a5acc1be09ed", + "mode": 420 + }, + { + "path": "blue-language-ipfs/src/main/java/blue/language/provider/ipfs/IpfsBase58.java", + "type": "file", + "size": 3178, + "sha256": "691aee4b66960c43d7ab7a80c58752996dce3c6420298ffa7799daf0ba404cf2", + "mode": 420 + }, + { + "path": "blue-language-ipfs/src/main/java/blue/language/provider/ipfs/package-info.java", + "type": "file", + "size": 1398, + "sha256": "e39249eb7fc0b9d0bcee362c48c8fcd6f7d7f7f05a2cc4a0bc21fe43835311f9", + "mode": 420 + }, + { + "path": "blue-language-java/build.gradle", + "type": "file", + "size": 459, + "sha256": "70260e060a57e98d2f83993fcc8421665eaa7cc6299384171e8c580852b57ef4", + "mode": 420 + }, + { + "path": "blue-language-java/src/main/java/blue/language/Blue.java", + "type": "file", + "size": 13673, + "sha256": "aef23fd5dd2ee0908d232053e9f092ebaab51df536a91d4c85fe0bcb8c396c3d", + "mode": 420 + }, + { + "path": "blue-language-java/src/main/java/blue/language/BlueRuntime.java", + "type": "file", + "size": 15229, + "sha256": "4d35bdb53904c84cb81669693a8956eb995189619af03d8020302e8a76d1e63b", + "mode": 420 + }, + { + "path": "blue-language-java/src/main/java/blue/language/package-info.java", + "type": "file", + "size": 1544, + "sha256": "fb5aa5633398eec2abd59fe760370add6003bccd5a3072cb1b05896ba17d722a", + "mode": 420 + }, + { + "path": "blue-language-java/src/test/java/blue/language/BlueRuntimeTest.java", + "type": "file", + "size": 3460, + "sha256": "784e4764d072a178b5bf2254aa5347bcf82d065fb984258b0a9be51b5e8dbc43", + "mode": 420 + }, + { + "path": "blue-language-java/src/test/java/blue/language/BlueTest.java", + "type": "file", + "size": 4465, + "sha256": "eead5582096da18f49dbe6d1fd02706b88e23d3e70b54222df49405d235b5665", + "mode": 420 + }, + { + "path": "blue-language-mapping/build.gradle", + "type": "file", + "size": 461, + "sha256": "75a7e5b727ca227672915f574f565c27d6346718c4f030331b9388f406f9e61a", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/dictionary/DictionaryAwareExporter.java", + "type": "file", + "size": 8095, + "sha256": "9b01f8387144eefaf9563ef5953ce2a26347b7924787e294905163c6f477ede2", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/dictionary/DictionaryRegistry.java", + "type": "file", + "size": 5052, + "sha256": "8f30b3bd3776b8a81b71f210de63f12fb9d508afccb6bb8cba5182400566a7ee", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/dictionary/ExportContext.java", + "type": "file", + "size": 5024, + "sha256": "9078feb5537c60f015f9422a3384920c4a046ca6b170ccdf26f6187bbfde9241", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/dictionary/TypeDictionary.java", + "type": "file", + "size": 2329, + "sha256": "97cdf0dd4dd5df71a225852a949a677bfcf466fc4f511e698fe03b8fafa9c723", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/dictionary/package-info.java", + "type": "file", + "size": 1301, + "sha256": "d47a8a34f9c7f3dd2bd086fd414d48db952de96b27c91b70cbb211fbb49fa923", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/BlueAnnotationsBeanSerializerModifier.java", + "type": "file", + "size": 1159, + "sha256": "0e478984498be9621bd3fda1eebbff6ed3afed61583815e65b6a4a10b35c90e8", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/BlueAnnotationsSerializer.java", + "type": "file", + "size": 6501, + "sha256": "8daa25b7c0fc461a9c45459505a77258f372b1040f77cd3dc68d67583c8c948a", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/BlueIdResolver.java", + "type": "file", + "size": 4435, + "sha256": "006ff61d7783107833951e0e6de9660dae4eecd2847cb3a38729c731d3608fd1", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/BlueMapper.java", + "type": "file", + "size": 8980, + "sha256": "a4036736d56b6f9a11ef59d1b4c9a5eaef8964353f01537bf49b97c4a3edb809", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/CollectionConverter.java", + "type": "file", + "size": 8835, + "sha256": "88ba1d51a2d46e2f6959f9130e1e5a3dbf739918a31d00386a955573b6a42c95", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/ComplexObjectConverter.java", + "type": "file", + "size": 8954, + "sha256": "9b19353b1b4c513c2157b0a6b3e1a4b3b861038936fa382eb8035e35204039ca", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/Converter.java", + "type": "file", + "size": 1307, + "sha256": "fa673cf345cdd735c7246d5134581553c09691c374e4455eaf546f7551e4d278", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/ConverterFactory.java", + "type": "file", + "size": 6358, + "sha256": "571343b02d75ec3608527bc14face760d7878e678d2ff3ab9cd4a4753b7cd452", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/EnumConverter.java", + "type": "file", + "size": 787, + "sha256": "ffbdeb55b9d6882fc95cc72862fb5fb158b96eacd8612dbbcfa55af72de7b1be", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/JacksonPropertyNames.java", + "type": "file", + "size": 1495, + "sha256": "14079eba557018bfef34b8bcbb573f43e4f506f17074c551b13696a76bdb66a5", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/MapConverter.java", + "type": "file", + "size": 6293, + "sha256": "1deef9c1f784383681206c567318a8e70e80894631b093a543bfa760cbab4f6c", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/MappingObjectMapper.java", + "type": "file", + "size": 925, + "sha256": "841bdbbeee2fefc76c9c8b78c70da2555ad08c1d12c7550ee3d4556defb5052f", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/NodeConverter.java", + "type": "file", + "size": 682, + "sha256": "7856b8082eae7963c978fc9da4f5d0d0586ee7c6eece4d159a69972f575dc15b", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/NodeToObjectConverter.java", + "type": "file", + "size": 2163, + "sha256": "3e84b1ad0ad868b3f76f99719b2aea1304b0061a3740b0583ce7bef21edbf376", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/NullConverter.java", + "type": "file", + "size": 424, + "sha256": "0f8096410803e2abbb2f05c4b115c63883836617fb95d75319e7514c0461bd37", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/ObjectFactoryRegistry.java", + "type": "file", + "size": 7851, + "sha256": "15f3c4c150e396242fc2057103658bcb74087dcb1686a889353039fe2f9a1456", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/PrimitiveConverter.java", + "type": "file", + "size": 583, + "sha256": "71553c62860c33d7e34148748e6ac94b43d48524d0563f57e6663590647561c5", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/TypeClassResolver.java", + "type": "file", + "size": 8175, + "sha256": "12ff4cd944af4b489c3b6d505fd274eeca9fdc67c3d975842d34c5d9cbe71151", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/TypeCreator.java", + "type": "file", + "size": 309, + "sha256": "ce8abad30424b8711a55e7ea7155933aa81c765369e2ca08796019c0e1ed9262", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/ValueConverter.java", + "type": "file", + "size": 7274, + "sha256": "a673eb41ba971556dbaa02621881afc1c937a8436c3ec9aaedf13315459993d8", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/package-info.java", + "type": "file", + "size": 1426, + "sha256": "29eec19eca2b711568c1dbc23351d23521a8c0bbe87debe50f0a4b782ff8e29c", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/provider/ClasspathBasedNodeProvider.java", + "type": "file", + "size": 8325, + "sha256": "b406d9e3bf009ee5c4999f6e2c83a014e374f07d588244be4a49756c8e6df37f", + "mode": 420 + }, + { + "path": "blue-language-mapping/src/main/java/blue/language/mapping/provider/package-info.java", + "type": "file", + "size": 1206, + "sha256": "3c95a8a8cd3842b3cf9e6b97348a21ede3bae12cfc546e793be959e0a1c06276", + "mode": 420 + }, + { + "path": "blue-language-model/build.gradle", + "type": "file", + "size": 307, + "sha256": "5e68f53cd97864274eb56776c330b34e0ccca7eb27e2600f124fa09c723c741b", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/BlueDescription.java", + "type": "file", + "size": 567, + "sha256": "d7186566a555113301c42c0f86cb4c32ac9e431dc59cd89dd2db5d24c2d6fe37", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/BlueId.java", + "type": "file", + "size": 536, + "sha256": "b1f855f4f8e1c40cdd83d8ab95faf5d85e580280aa743e92db70ed089bf1d0c6", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/BlueName.java", + "type": "file", + "size": 546, + "sha256": "33c1475c551b6e36ae6e1c997f331972ecb5f1f2be2bf6871f955e51e88c1e7b", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/Node.java", + "type": "file", + "size": 22691, + "sha256": "d9ad86fd4a0a8bc3e58b141ce3e42438410bf6080d392181c137fe44dc146e46", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodeDeserializer.java", + "type": "file", + "size": 32470, + "sha256": "1afdbaf273335497295e7616f5d2523d9e8b8229483da2ca517bc4ec7a813728", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodeGraphCopier.java", + "type": "file", + "size": 10397, + "sha256": "f642ede6a31702087e8823924f40ec84901c98b6184b18d24e3f7a5a64c61dc5", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodeIdentities.java", + "type": "file", + "size": 1934, + "sha256": "e0c043d3247e78d242f452db3a5f7d49880a1066bb179151365c8fb00e90699a", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodeIdentityProvider.java", + "type": "file", + "size": 954, + "sha256": "028e75a3ca26b32d5e4133f6e3f563e5fddb09cd39fa61c3a4afa9c94e633698", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodePath.java", + "type": "file", + "size": 8147, + "sha256": "cb454e03f18f1bc19360e32a2425095c7e90d08b53fa0bc09283d2452dbd7991", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodePathEditor.java", + "type": "file", + "size": 5726, + "sha256": "ed5f278b259efd2892d3317ecccecbd8a14614982c14088e5e725f841d4ff222", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodePathSelector.java", + "type": "file", + "size": 6010, + "sha256": "f962637ed099d4c90876ac7fda6f67e28a42fcedbb7866ad5cd4a2107edd11d1", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodeSerializer.java", + "type": "file", + "size": 792, + "sha256": "6c42a6d520a4cbf965e5be95c8bac42e9ca0ebf09506161968d798b82b85fb07", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/NodeWireForm.java", + "type": "file", + "size": 10417, + "sha256": "c5996ee65435781fb05e758c718b9e2c228ca8882484a52dead33731514d4a95", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/Nodes.java", + "type": "file", + "size": 8515, + "sha256": "068940dbfbaf7baecbb6253c6a49e64e720244714602f415773c6ea6a0e8be17", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/Schema.java", + "type": "file", + "size": 21777, + "sha256": "1b0e3192f8597d925f7ef3c656046a73376357cef2d3c11eb619c7b52dfbeef4", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/SchemaWireForm.java", + "type": "file", + "size": 4970, + "sha256": "0d1fb92b4c41db6c5963bad3cff7005048bf4073444895d4d56f0f6c4551d15b", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/TypeBlueId.java", + "type": "file", + "size": 1566, + "sha256": "ef89ec7c59d6b4e4ba65cbc286fb9425e8d64023a2969df89332cbf4ab148ce5", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/package-info.java", + "type": "file", + "size": 1384, + "sha256": "6e2c490c9fee89771a44ba6875029d793bdaf85833a16f169d58917406298840", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/value/BlueNumbers.java", + "type": "file", + "size": 6583, + "sha256": "117e036ffcbbac158d63a376bccf7127d619f68a9075bb7608c1b289655b8456", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/value/ScalarValues.java", + "type": "file", + "size": 3754, + "sha256": "dd8768883fc794189b1f58b53db3733ba9545d500ef17dcf22d6cf880660a4dc", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/value/package-info.java", + "type": "file", + "size": 1040, + "sha256": "702859132336b6f4324dc8f7a845caeb97b5a45687775fc8cb63f926ae4f7ea9", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/wire/BlueLanguageConstants.java", + "type": "file", + "size": 8713, + "sha256": "4105df74e82cfa315035a0636ac715e83046dbf333774c314db2e626e7df45d2", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/wire/JsonPointer.java", + "type": "file", + "size": 5243, + "sha256": "54dd9989d6eb21a1f34016af16e4ea8ef4851bab43dd755fb72a3571bc0d1e17", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/wire/ParsedJsonPointer.java", + "type": "file", + "size": 6361, + "sha256": "3d8b58b84d591f8c6a7fbc74e5c8f4d2e7c7274f8105cc59e385ca397a9b815b", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/wire/SchemaPropertyConstants.java", + "type": "file", + "size": 2055, + "sha256": "51be4767be1209fc897e19383434c4d43e3116daf643f12f0e37c3578755f98b", + "mode": 420 + }, + { + "path": "blue-language-model/src/main/java/blue/language/model/wire/package-info.java", + "type": "file", + "size": 1120, + "sha256": "16f50fe9f7e12ae60849b49410eae3d81fd75419ef0d8f7eb20c09918ad4c8d6", + "mode": 420 + }, + { + "path": "blue-language-model/src/test/java/blue/language/model/wire/BlueLanguageConstantsTest.java", + "type": "file", + "size": 2641, + "sha256": "ada9441195b08c05390a9eb05e3143b4d462cb89e5e41415ab3e6ac011679d30", + "mode": 420 + }, + { + "path": "build-logic/build.gradle", + "type": "file", + "size": 2438, + "sha256": "94b96262006e40174b02db0570fb7f7b7b49483130c6b92cf19e65d6c1557559", + "mode": 420 + }, + { + "path": "build-logic/settings.gradle.kts", + "type": "file", + "size": 38, + "sha256": "ea6c8e43f66ed353489a10cd85db2a66433263e139412d71657ca4b8add1b442", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/ApiBaselinePlugin.java", + "type": "file", + "size": 3829, + "sha256": "cdea2b5d09753a59c5278a0579cc1de060076daa54a14d0860965bf508ea13d9", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/BuildLogicConstants.java", + "type": "file", + "size": 8558, + "sha256": "7625a257cc24749bd52ad2cc39e74f3d7e273b3f3e01e60056b7c262ee7c0c63", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/ConformancePackagePlugin.java", + "type": "file", + "size": 3726, + "sha256": "45872004481f96a93e72c8a7e9b3548585158eaa34d2e95aee0aff4d65d473f5", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/DocumentationQualityOrchestration.java", + "type": "file", + "size": 9681, + "sha256": "3308c2bd765b5f2e927bb60728e0bb1d69696d116baea50b5c9db873d6746702", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/FinalQualityOrchestration.java", + "type": "file", + "size": 10111, + "sha256": "ac6872b4d244568d613d14106e942e0ab4a52e6c65fa64075ab325b5a3565975", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/JReleaserPublishingPlugin.java", + "type": "file", + "size": 6978, + "sha256": "ca3499d3ae9f12b92fb465c5cac7c4a1b8a3ab0e99709666045d9b487b4f060c", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/Java8LibraryConventionsPlugin.java", + "type": "file", + "size": 8516, + "sha256": "b7fae623463c12a47f20aa435dfe1c4ad1d42fec66d86ad7d187bc8ecf5faa79", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/JmhConventionsPlugin.java", + "type": "file", + "size": 3561, + "sha256": "5644a74e74b47ac6114a70612137ec6c8e0c980648399d7f43225e19689a820e", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/ReleaseEvidencePlugin.java", + "type": "file", + "size": 14891, + "sha256": "2749e4519c8a48c4b0d3c7d8274a55d378287fa204e50d698c39c965898736f5", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/ReproducibleArchivesPlugin.java", + "type": "file", + "size": 5726, + "sha256": "dd481affbc84ff17986fb0dc0b8a62ea99fb3bbe2f3b152981f2c1099a1e8281", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/RootOrchestrationPlugin.java", + "type": "file", + "size": 48432, + "sha256": "9a7fa786c2bf70828d39bcefe5d353315846f8c87f893d8f60358fabb0f604a1", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/SemanticEvidenceOrchestration.java", + "type": "file", + "size": 29809, + "sha256": "15da058669e73ef8e52be3cdec6818150f47675a91881895f165f173d51854d5", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/AggregateReleaseReceipt.java", + "type": "file", + "size": 6092, + "sha256": "6812bb5af999212860656b5cf065b4b9d4834d5111af86c8dc2aad249822bd72", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/ApiDiff.java", + "type": "file", + "size": 2420, + "sha256": "643bbfbdc460573685a448e01ad75b85c3da8bc7f8dc06034716c8e4351cecfd", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/ArchiveReplicaComparison.java", + "type": "file", + "size": 7190, + "sha256": "2a11ca9261c89e7ae5bc5ba4970ecaddb2289e6baa5a1e890a3b550891059167", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/CleanBuildEvidence.java", + "type": "file", + "size": 13703, + "sha256": "3d90b309b746d0fbebd3ca861758185370cfb03ffcbff46cf83fd7de69b7c95c", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/DeterministicHashing.java", + "type": "file", + "size": 3926, + "sha256": "2c82449b0c1aec1289888fa0bed5e821ba9cc1571267d18e9b95bc1afd2bed03", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/DeterministicJson.java", + "type": "file", + "size": 4741, + "sha256": "7bc6d7ec5b52c42145bdb35b4682f29f15fe64d03648a75e9144a621d16dcfc9", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/DocumentationReferences.java", + "type": "file", + "size": 32600, + "sha256": "b748a2ec0dcd1a62d1f39b56767054e7e7bd83aa292e0f0b647f4c05434de882", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/DocumentationVerification.java", + "type": "file", + "size": 36098, + "sha256": "f57118ecb8d70effea959d82c000359b39f463619e7c2ca37160fb0152ffce92", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/FinalQualityEvidence.java", + "type": "file", + "size": 33989, + "sha256": "238ed6f5ff7ad423809f2866b0255803cb035c0482c82e9f4856ff09a6d7a21f", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/JUnitEvidence.java", + "type": "file", + "size": 13079, + "sha256": "d577ff2f88f15ab86407a2d5265488c51e7b66ddd58ea12cc134bb7cb74030b1", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/JavaModuleInventory.java", + "type": "file", + "size": 22446, + "sha256": "13f083bb8333f2ee3ad0fcd4b4cbd455bdafa98694fc77289caa7a4ef8ebc9ec", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/JavaPackageCycleAnalyzer.java", + "type": "file", + "size": 32125, + "sha256": "a52031ec5f7b002d497cbe5db2cf707aa521bd7035d4c4eebc5a631be5ac9c88", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/JavaPublicApiInventory.java", + "type": "file", + "size": 13019, + "sha256": "fde433a5cd31ed1dda925f04f1b25b7ef54f68e6e3639284ca6719ea095e1383", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/JavaSourceQuality.java", + "type": "file", + "size": 10745, + "sha256": "9d6d46198d9c7e398e3492d2ffa86ebd92fa3ff2e474d3519e11bc6d8e879692", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/ModuleStructureVerifier.java", + "type": "file", + "size": 14655, + "sha256": "5c340058d88b1f091489cfe3458ae5260ce4c94996d06e5be05baa8c82002630", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/PlatformInvocationMatrixEvidence.java", + "type": "file", + "size": 13035, + "sha256": "13ffcfbc55cc4cd1cae8df004605af68885737ea652849649491c2bc2dcf407b", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/ReleaseEvidence.java", + "type": "file", + "size": 1609, + "sha256": "fc6058001eff2a6c9155f44f406835db24b7a2e3e97548ec5406bae06b71c665", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/RepositorySourceFiles.java", + "type": "file", + "size": 1603, + "sha256": "e580752f71485508a34632dfd030a5c4d7be06ec137811049c56dbe9a04172b6", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/ReproducibleArchiveInspector.java", + "type": "file", + "size": 1917, + "sha256": "e1b75a59754bf5322cbfa31fbd95a30ee183c0f61e48ed5dd8ac3e9a79fa26cb", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/SourceDateEpoch.java", + "type": "file", + "size": 1204, + "sha256": "7b9386027c8e62a5bb3584cafb639fd8752b2cf5fd169ea988e1a528fb95ee6d", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/SourceReleaseArchiveVerifier.java", + "type": "file", + "size": 8683, + "sha256": "7ca8d4ca0c4d078ab2977757ce88b0f5af442177f94fe910da4b29509d54427d", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/SourceSnapshot.java", + "type": "file", + "size": 1207, + "sha256": "95666754941f1184f05147511b28e95ab3f028a0bc67e74e1cf836df382e90a9", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/support/StaleInputVerifier.java", + "type": "file", + "size": 1305, + "sha256": "80657c7e47809b5bfece19900e6350b0bf056a1eeb5c760e24e896345235a742", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/CompareApiBaselineTask.java", + "type": "file", + "size": 2445, + "sha256": "914fb30eae09cd0f98c7f7ea622fdbb70a71dd98ef49c3bac144ff43e984a3b0", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/CompareArchiveReplicasTask.java", + "type": "file", + "size": 2566, + "sha256": "e6b3236e488d6032d47cec311375bd8184ee6ce738a231c2f372efb7034856a2", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateAggregateReleaseReceiptTask.java", + "type": "file", + "size": 3430, + "sha256": "edd04911d5704362836e0403671554a84e0b4ef676e2bea88111dd6ee3db7dbc", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateChecksumFileTask.java", + "type": "file", + "size": 1591, + "sha256": "933b22bf284919297147fecb7a925957888e454cd3edac23ee5ecfcce4fd17ee", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateCleanBuildEvidenceTask.java", + "type": "file", + "size": 5664, + "sha256": "ccf6cff297600a91cfe681263922bfc2592e3b48117aa573086873abb6f04345", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateCleanSourceEvidenceTask.java", + "type": "file", + "size": 3028, + "sha256": "688e58818c61d2c50cfb4da6b11746ca6ea633249bc4cb96466f1f1fa890abf2", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateDocumentationReferencesTask.java", + "type": "file", + "size": 3958, + "sha256": "8af930af1c69fc8497e149d30b2280b4fadcd731edf02a292796969ed6a08ba8", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateDocumentationVerificationReportTask.java", + "type": "file", + "size": 4773, + "sha256": "c4c181c47db96ef8f916c3dd468d50c2510cb241a0aa55cdc90185a352e4799b", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateFileIdentityTask.java", + "type": "file", + "size": 2786, + "sha256": "1c529f70cac04ee4c7842dce390d0c2f6b2ac0b160b7b5a24d5ba46e76319f68", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateFinalQualityReportTask.java", + "type": "file", + "size": 7860, + "sha256": "174613eab24c64756cc623ab85b06828b36cdd7dc6df351bfc1d136050a3a454", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateFragmentedProcessingReportTask.java", + "type": "file", + "size": 44376, + "sha256": "852269ffc9aa97971cbbebdc9ecc04ea30a474832fddcdf9373b819f1a4dcebb", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateJavaApiInventoryTask.java", + "type": "file", + "size": 2347, + "sha256": "fe48b5291a790089e0fba30c3b9ff1303006368019743bd7549f3166cc39455b", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateJavaModuleInventoryTask.java", + "type": "file", + "size": 2140, + "sha256": "a6a6f74ca1e2f78d5cb3e16ff91a709b846c15f4698787ce2f663508d0b6e867", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateReleaseEvidenceTask.java", + "type": "file", + "size": 2579, + "sha256": "195a4af43b3594c5bc4b621510d76598fd70a11de2243ae035f10a71927d83c1", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/GenerateSourceReleaseMetadataTask.java", + "type": "file", + "size": 2314, + "sha256": "7279e4da81cd64b715ca9ceefdbf8bd3df811f5691e4e2cb346bfb5ec1412cb7", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyAggregateReleaseReceiptTask.java", + "type": "file", + "size": 4016, + "sha256": "e8f15f205f50b3139394a253f531adb52ce26672726aa7f2a5e6801843b5446b", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyBuildScriptShapeTask.java", + "type": "file", + "size": 5263, + "sha256": "938e1cee994310b46602e4c5e52231312c00c11e6dfe43cbaab256983f708d81", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyCleanBuildEvidenceTask.java", + "type": "file", + "size": 3127, + "sha256": "1ebd6050b9711477993e0317c9275ef14fdd269740e2437c8a5bab6eca21f539", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyDocumentationReportTask.java", + "type": "file", + "size": 2847, + "sha256": "7e38804dfb7960b801923c04f1fa3fbc7abd39d26787d138b690154af9dc3461", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyFinalQualityReportTask.java", + "type": "file", + "size": 2990, + "sha256": "d976ff38158f2897aff60abc6de250b75c4b1d2205d23273069a3bd9c6732f2e", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyInputIdentityTask.java", + "type": "file", + "size": 2281, + "sha256": "7e7d7b05b6ed16fe85fb194d6fb80480213a0466603284440534fc7b74630d60", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyJavaModuleStructureTask.java", + "type": "file", + "size": 3043, + "sha256": "1ee5c13427ca4649f0457ee8bd76b603d4e1683e936304b6cc92cb860e93f864", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyJavaPackageCyclesTask.java", + "type": "file", + "size": 2310, + "sha256": "05826c93230bb73ca3dbd3f8d5972e25651391d5c253a3f054f0f668889153d1", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyPublishedRepositoryTask.java", + "type": "file", + "size": 14649, + "sha256": "f945f58fab410785ad68510ef0cebb196f554bca74b918cef9ce26139fee1286", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyReleaseEnvironmentTask.java", + "type": "file", + "size": 1865, + "sha256": "947fc8e2d5ce67204642d91ddc2a811eecc10d4fd38ffda9bf4627a16b5e4326", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyReleaseEvidenceReportTask.java", + "type": "file", + "size": 24022, + "sha256": "8f6a0ca3aa44e77e6aaaf196567cd53e018daded9e4c73ddcc7e6521e275e5fb", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifyReproducibleArchivesTask.java", + "type": "file", + "size": 1092, + "sha256": "c29ae562bf12c64c95e1b43bb82cc4314c14b47e0fbebeb6c1bf3fc9b57fe0d8", + "mode": 420 + }, + { + "path": "build-logic/src/main/java/blue/buildlogic/tasks/VerifySourceReleaseArchiveTask.java", + "type": "file", + "size": 3282, + "sha256": "7218cc4284128f0fdb0618a45894ab182b675ed569646e6fb7282547e7fe4413", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/ConventionPluginsFunctionalTest.java", + "type": "file", + "size": 13055, + "sha256": "c0243511c827859e57b4cbfb9f80fd603eb45202fa94a47721adca8979c35fde", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/ConventionPluginsTest.java", + "type": "file", + "size": 22157, + "sha256": "d88c370250a3171a468967a77d432caf564e26de289b52f3ccb2ef007b03abf1", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/PluginDescriptorsTest.java", + "type": "file", + "size": 1654, + "sha256": "e6304274440f9176a555b9c18050432592aaf0f933275dfb13eea751824b614c", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/SemanticEvidenceOrchestrationTest.java", + "type": "file", + "size": 859, + "sha256": "68d289804cf047d44a81adee80610c032efb6a9de3364c73683541683bbc7c1a", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/AggregateReleaseReceiptTest.java", + "type": "file", + "size": 4217, + "sha256": "4644c59be49f53d71497e547ccbb2b4e9a683f0de79ba502b00adeee1a827be3", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/ApiDiffTest.java", + "type": "file", + "size": 767, + "sha256": "5a95775ce68ff5098c5c237a62796135b1e2f4e09972d9bd8bf2a75c8ce841ac", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/ArchiveReplicaComparisonTest.java", + "type": "file", + "size": 3279, + "sha256": "f30cb5ca05a7085ccd5fb13708fb128f8237647760b457670ba58cb886213755", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/CleanBuildEvidenceTest.java", + "type": "file", + "size": 4364, + "sha256": "af9c91ef85939f7efeb12c47c0c75cda20c755953caaae904eebfabd29864e60", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/DeterministicHashingTest.java", + "type": "file", + "size": 2797, + "sha256": "c3678075867b393806a59cc4f91f491ce111449918015af9e42daf3eb23477bb", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/DeterministicJsonTest.java", + "type": "file", + "size": 1551, + "sha256": "0d453e2febc2fb72482a716cdadddc61448733c2fb70653cfbae3a474dd094e3", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/DocumentationQualityTest.java", + "type": "file", + "size": 10947, + "sha256": "0826b9e788dfd9245c36a22955cf6da9f65a2658521122f5310cf90be7bdf027", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/FinalQualityEvidenceTest.java", + "type": "file", + "size": 6871, + "sha256": "04972c5a96e21b001ded7bfa009d22ff8037e7b98018a9f9155278d1faff09de", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/JUnitEvidenceTest.java", + "type": "file", + "size": 3920, + "sha256": "d050309612780dcd1b207e6627dc4abc6632f902b48c6509ac23eef03848b069", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/JavaModuleInventoryTest.java", + "type": "file", + "size": 6298, + "sha256": "f34a6d8f346ecaa53eb6cdf92bb8e7fcbbad375adbc097b1c4a45461336c4ea3", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/JavaPackageCycleAnalyzerTest.java", + "type": "file", + "size": 12725, + "sha256": "5c1501d9a0e09009dad41be31fa81d0fc4cd99ec88ca8e70c75211053a8ebc46", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/JavaPublicApiInventoryTest.java", + "type": "file", + "size": 3966, + "sha256": "7242ed9b35fb5f11127eed6b17aab0b8239931f092b0a3f0fc8c93acb07a0f10", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/PlatformInvocationMatrixEvidenceTest.java", + "type": "file", + "size": 4520, + "sha256": "faf8f49bb7d07424b5348c89f4dfef13292e7ad18d77e350a9846e01d4938078", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/ReleaseEvidenceTest.java", + "type": "file", + "size": 1838, + "sha256": "744c07e81398de13ffbe183796e96868c9de0fe53f032553843c8596f4d9731b", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/ReproducibleArchiveInspectorTest.java", + "type": "file", + "size": 2779, + "sha256": "7be026c8bd706102280a16d00d4ab534c8f305d0b0c8e64c6f505bdc20f4cca4", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/SourceDateEpochTest.java", + "type": "file", + "size": 1047, + "sha256": "da21507571a5839e0febec6cf444a36a13d6e26d977005d1dca86b43c4230857", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/SourceReleaseArchiveVerifierTest.java", + "type": "file", + "size": 2959, + "sha256": "2958110dfa979226b92ae758c7a6a7b144d084a576f1c3e11bca3c40434b46ea", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/StaleInputVerifierTest.java", + "type": "file", + "size": 1297, + "sha256": "20aebc9ed7bcae10d58baa0ebbd97732c37051775cb697f282b5f27fe7556133", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/support/TestJavaCompiler.java", + "type": "file", + "size": 1443, + "sha256": "685065a6da25f5ff8e8ed2c9eee92aa08586a8f495ab2fc87d2d4fca6b954de5", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/tasks/ModernizationVerificationTasksTest.java", + "type": "file", + "size": 9224, + "sha256": "0aac971deff9478fb768646d17679a7d50e579da0b9bf6141c5f4fbd16333fc2", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/tasks/ReleaseArtifactTasksTest.java", + "type": "file", + "size": 5847, + "sha256": "f9ec3de3938061ddfb37da1369fb10d6403cf6a111a4267073d6cf2bd39ac8a1", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/tasks/ReleaseEvidenceTasksTest.java", + "type": "file", + "size": 2075, + "sha256": "01839dc17e1934a640ebbacab9d354776585cf8463ed77f08ac902ca3caf0d3f", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/tasks/VerifyJavaPackageCyclesTaskTest.java", + "type": "file", + "size": 3766, + "sha256": "8f8d736aebfb74f9bb49a7e4f886d6ebbb756ca224d11d0b539bfbc187ad2497", + "mode": 420 + }, + { + "path": "build-logic/src/test/java/blue/buildlogic/tasks/VerifyReleaseEvidenceReportTaskTest.java", + "type": "file", + "size": 2770, + "sha256": "02f7f384c8029828653c2b17aaef47c359851083ef4962da1ef67b01c5843703", + "mode": 420 + }, + { + "path": "build.gradle", + "type": "file", + "size": 1296, + "sha256": "402940709ef75a0fe8b821fa63f6f5e5300f1359eb1b5d12ba126a291a21d736", + "mode": 420 + }, + { + "path": "examples/build.gradle", + "type": "file", + "size": 202, + "sha256": "31ee3c44e4dfc5a638cddb4f2b9702d5ea1e1da62f4baa2f7aff464ccadc4c0b", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/ContractsExampleSupport.java", + "type": "file", + "size": 34223, + "sha256": "a7eed728ad2603a69980fa8e2c0c23df17366c422631f0b47f7c3ed3e85a1d5a", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/CustomExternalChannelExample.java", + "type": "file", + "size": 4508, + "sha256": "3ad9714e0eb7e18a8e35151ca2f6527685f39042b8697ef1d994e923d6588b38", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/CyclicSetIdentityExample.java", + "type": "file", + "size": 3587, + "sha256": "edaedf98de1929e3e920fc97dfd866f36b12a4d5f80b9e37b1f6b6ef7ef4a091", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/DirectBlueIdExample.java", + "type": "file", + "size": 2782, + "sha256": "f5ec5f174497de8739a98bc48bd22358eda32270d6dfa2b02bb0f2c2b4e872b1", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/EmbeddedCollectionAgreementExample.java", + "type": "file", + "size": 32097, + "sha256": "5317f428eb2cc9336d32638fdf386734ad14213e166a85372e34f59af96e22e8", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/EmbeddedCollectionAgreementResult.java", + "type": "file", + "size": 5002, + "sha256": "b77ad6830cc63f644551e155715c145a4543e3022d082a4034c4cfa0235f24c4", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/ExampleSupport.java", + "type": "file", + "size": 1423, + "sha256": "53f5d1e5819551a648cd693a2db8d2d1eadfc219b735fb8f6c98d72094951cc7", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/ExpandCollapseProviderExample.java", + "type": "file", + "size": 3882, + "sha256": "efb17044c80b8274ac1f64b41a3935e16d5637be983a23e38254f8463feac7d4", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/ImmutableSnapshotExample.java", + "type": "file", + "size": 4488, + "sha256": "2f5548633b419c14aab2ba7a700b7b53c78b4a15854b24c67b37f54fade6bfb8", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/IncrementalListIdentityExample.java", + "type": "file", + "size": 4832, + "sha256": "7bd8e3cc4a6bc2e43c63fc1abc60ebe182e251e2a6be73ced5fa3846b3e3cc14", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/ParseAndSerializeExample.java", + "type": "file", + "size": 3743, + "sha256": "82e3364be59dbc37f9e57ad92971c2198b9ee04c28ca77746abade8d69e947d5", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/PersistentPatchingExample.java", + "type": "file", + "size": 4787, + "sha256": "e5f986496bfea6a34d9afc8ab0ea68c8c9df284cf029d13255dd9161364c0ca4", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/PreprocessingDirectiveExample.java", + "type": "file", + "size": 7320, + "sha256": "9a5cd984a7f2dcdb406fa9811e38980b19a9c68e5e0f07e7cfbda58b0b9e05fd", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/PureReferenceFragmentsExample.java", + "type": "file", + "size": 5423, + "sha256": "0119a19f712af992084b06909ff741864a524ea8ee2285dcba4c73d15568ea5b", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/RootOnlyEventsExample.java", + "type": "file", + "size": 4047, + "sha256": "0c4f02ca58ae7bc2e493c04059fe92b281634036815999883eeaeb9b40b66c36", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/RuntimeChildGasLedgerExample.java", + "type": "file", + "size": 3023, + "sha256": "ac6375f1b55daab3d253cf563d93cb5e445c5198d0727023a326758309c3ed8d", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/RuntimeProjectionAndIndexedDeliveryExample.java", + "type": "file", + "size": 17520, + "sha256": "714ba0bf4cc909124184f7033204160d5602c8dc49d0ba7f4ef7b6f0174f7689", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/SemanticFormsExample.java", + "type": "file", + "size": 4918, + "sha256": "b86147ad88c548dbb1f4b517bd33d081291759ba5fafad51df7de91be37e2ebf", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/SourceDocumentBlueIdExample.java", + "type": "file", + "size": 3547, + "sha256": "b80f8765172ede6ca30fb54f44a34fe74fbbed657d4f801123a7ec89d75c75aa", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/SpecializationExample.java", + "type": "file", + "size": 3344, + "sha256": "5847020e23edcc21d91450c5f8cb2224551efd781509dd13720323860ddd659e", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/UnconstrainedFieldExample.java", + "type": "file", + "size": 6717, + "sha256": "171c7b7557a896a58b0068d9b72ee8a40eaa0e2d00d220df67af3e0a28d67f4c", + "mode": 420 + }, + { + "path": "examples/src/main/java/blue/language/examples/package-info.java", + "type": "file", + "size": 381, + "sha256": "dbf9394ebfc0e93b48ce2d010efae9e3b1f04920c2ccb4fa88a0a5383ff10cfc", + "mode": 420 + }, + { + "path": "examples/src/test/java/blue/language/examples/CodecAndPreprocessingExamplesTest.java", + "type": "file", + "size": 2665, + "sha256": "5e5d6dccd36e259fb5571805a4b63fc7df6572e6ebe2157e126b46a03e0ea117", + "mode": 420 + }, + { + "path": "examples/src/test/java/blue/language/examples/ContractsProcessingExamplesTest.java", + "type": "file", + "size": 5090, + "sha256": "73126e3d91e5a63ba05128ef06144e398308ad1d95d87a5441e590d1d88cd6ac", + "mode": 420 + }, + { + "path": "examples/src/test/java/blue/language/examples/GraphAndIdentityExamplesTest.java", + "type": "file", + "size": 4043, + "sha256": "461c591a82c5bcee8861f786345d5e3bfcd86902b93a4e374e1d73fb182afa28", + "mode": 420 + }, + { + "path": "examples/src/test/java/blue/language/examples/SnapshotExamplesTest.java", + "type": "file", + "size": 1542, + "sha256": "8187fc49663dfb8596931d6f2562ab90f19a9c6af55908ebea5fcd0353c7f2d8", + "mode": 420 + }, + { + "path": "gradle.properties", + "type": "file", + "size": 132, + "sha256": "f77a6c20a1196fbc7c4939db550ad0660e5b65fb813f305d6b9df2ea9f37f191", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 368, + "sha256": "3bd25ed161cc4dd201df37990b9dcfc7173eff6ea9174ff57d5acfdd9455cb1c", + "mode": 420 + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59", + "mode": 493 + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8", + "mode": 420 + }, + { + "path": "settings.gradle.kts", + "type": "file", + "size": 409, + "sha256": "2114df3a635a677bd487018ab3a17f64d2b644ede8e679a89e2a7bbca61b7e77", + "mode": 420 + }, + { + "path": "smoke-tests/published/build.gradle", + "type": "file", + "size": 3135, + "sha256": "2563d4d4599fb632ba36f95bbb53c36a9ff5678f991185661895d3cb125e9d6b", + "mode": 420 + }, + { + "path": "smoke-tests/published/settings.gradle", + "type": "file", + "size": 150, + "sha256": "9231304cd4a0cc2f2d98b88022da53a6ccdf6cd413ed839dc68eb2fe6bed4258", + "mode": 420 + }, + { + "path": "smoke-tests/published/src/main/java/blue/smoke/PublishedArtifactSmoke.java", + "type": "file", + "size": 2304, + "sha256": "bab6308b7a66f5ee2d4bd7f25a3106663c7e7660be9921a3c96917153e2a8ea8", + "mode": 420 + }, + { + "path": "src/compat/java/blue/language/Blue.java", + "type": "file", + "size": 173930, + "sha256": "caba5d4321832a95eb4e088f91dbfdf752bf875981436aaef8fff5baa660b4fc", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/ProcessingSelectionCacheBenchmark.java", + "type": "file", + "size": 2050, + "sha256": "ec876be83007ccc41be1f55d74603ccce76803f0b903f0a427667ba3a303701c", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/ProcessingSnapshotProviderBenchmark.java", + "type": "file", + "size": 2600, + "sha256": "dbcdf563e0ad3da424a04ff04dfc8225cb4f1d74e649d46e3edb2befdffc3ac5", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/RecursiveTypeResolutionBenchmark.java", + "type": "file", + "size": 3675, + "sha256": "dbdb585295380abb9e3b58b9bf4efa7d362064c1398db6dfe5b68770d176d4f7", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/ReferenceBlueIdValidationBenchmark.java", + "type": "file", + "size": 2545, + "sha256": "667cf0a029e0f18387bc457929bf525fb10b8d9bdf9e1d52f4f9007929350285", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/SchemaValidationResolutionBenchmark.java", + "type": "file", + "size": 10028, + "sha256": "17346178c2030184d97c886b61814e3086ec77487f8f72acc4686c656243ba85", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/processor/DeepGraphPhysicalLocalityBenchmark.java", + "type": "file", + "size": 6792, + "sha256": "817b59944c4c5e373cb86fd71a0bc5e8e3589132aabc06ac17c30cefca3f8608", + "mode": 420 + }, + { + "path": "src/jmh/java/blue/language/processor/ProcessorProcessEventContextBenchmark.java", + "type": "file", + "size": 4560, + "sha256": "8a380840d35ea42d481d06716dc784699f9653682c71ff63ea92aa3d4155c81a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/BlueCacheLifecycleTest.java", + "type": "file", + "size": 73605, + "sha256": "20c84cdea46264f82c65bd1a5599cc1aee187366bf7c0685cbb3ab4277905d80", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/BlueCachePolicyTest.java", + "type": "file", + "size": 5575, + "sha256": "350a1709a607a850ba1236ed80fb9437d723bcfc6fb8df807c524916edb8322e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/BlueIdReferenceValidatorDepthTest.java", + "type": "file", + "size": 6613, + "sha256": "1abdef2e4ed3b188f9467be7d1b3defafa90386a645fa307e0794a0beebfb2bd", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/BlueIdentityAndSpecializationTest.java", + "type": "file", + "size": 6990, + "sha256": "ee3434aea74edb32b472dc5e1818782f032d49ade272467abaab9856f58c78e9", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/BlueLimitedOperationTest.java", + "type": "file", + "size": 3095, + "sha256": "428adcd7c8b1eaf547a0ce7ff566a2d18bb076820802dfbe0e5882cbb8b74273", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/BlueViewPathTest.java", + "type": "file", + "size": 4998, + "sha256": "39498235acc175b326c0b6efc8512b090fe516ee7cb125ddec5ffebe0a84cf7b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/CyclicProviderFallbackTest.java", + "type": "file", + "size": 9609, + "sha256": "fcc44605d26108399e0c85b900b602873fc1259c085c3fac40a07d5c017c3037", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/DeferredSnapshotCacheIsolationTest.java", + "type": "file", + "size": 7019, + "sha256": "9370517612581d0559e59d3793be05994ebb5451cdc43b753dfb902229475a45", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/DictionaryExportTest.java", + "type": "file", + "size": 13197, + "sha256": "81d58c2fe617f6b9c62d0e24031233088fe9d90aae2a016c7d91c0beef8c7f46", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/DictionaryProcessorTest.java", + "type": "file", + "size": 11257, + "sha256": "256b227d4af80324a43b20789be789b3d9e1424dfdd2bfdb74551f303e07829b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ExclusiveItemsOrValueCheckerTest.java", + "type": "file", + "size": 2417, + "sha256": "9b8017d1cdc95e8df1b14b010a8ace0887058d4b40889e8e4ae0e208fff873b9", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/LabelOverrideProvenanceEdgeTest.java", + "type": "file", + "size": 20823, + "sha256": "dadc62fcb13856c500ca75c9d43c9a00467b379616f96ab1e36f876b262abefb", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/LimitedCanonicalPatchTest.java", + "type": "file", + "size": 4822, + "sha256": "d3d0b248232fa4f89c577264e53bfb66791cf303d7fae17ded353c82a24ee405", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ListControlFormsTest.java", + "type": "file", + "size": 24422, + "sha256": "e017d6008b98da3611908ce666f5fc5ba9d0ca5ee0e12153cd32763138fe97a5", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ListItemsTypeCheckerTest.java", + "type": "file", + "size": 4911, + "sha256": "5a4e1d37bfee8698699314c530975037d5be1751431955502493bba6b7e0103a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ListProcessorTest.java", + "type": "file", + "size": 13330, + "sha256": "5f0a3cca55b9f99c4f42bc5a348ae9b4d1c19df808de6f91ae1cbafca2c82219", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ListTest.java", + "type": "file", + "size": 8500, + "sha256": "427860a0e6cabdeed6d74726e634af723e7b72af33a3588b9b88948cb9dd19d5", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/MaskedResolutionTest.java", + "type": "file", + "size": 12179, + "sha256": "ffcf48b23655dcc0e61e6ea8fc6b264ed7433c61443deacac23a79bf43d19855", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/MaterializedSelectedProcessingDocumentFailFirstTest.java", + "type": "file", + "size": 17921, + "sha256": "6359be98caa7f24e96e42e28f6d847c884329356571d2ec604013f48b3be6915", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/MinimizedOverlayInlineTypeTest.java", + "type": "file", + "size": 10993, + "sha256": "623beea495ec1a28ccd7550f398581de49fd59e50ade6af8d9a914ebb433cbc6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/MinimizedOverlayJsonObjectOrderTest.java", + "type": "file", + "size": 48255, + "sha256": "d1aa3c88995e88dd0caef25414f9e6922266355e9cf202437ba7fbcb8f9b2c9e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/MinimizedOverlayNestedTypedNodeTest.java", + "type": "file", + "size": 10728, + "sha256": "c5c78f97c66957108c3bf118b766641285e6ec38c696c26f38ed9345871726a2", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/MinimizedOverlayPureReferenceProvenanceTest.java", + "type": "file", + "size": 5455, + "sha256": "9bfbc333fcc25d291c775575835cfe634d026d3e1152ce146f1b0f21cfa9f873", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/NodeCloneTest.java", + "type": "file", + "size": 4492, + "sha256": "b974009cfa323fc83e5370ba27bde9cca93895d0c8e77b24c1b7214bc7f1e496", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/NodeDeserializerTest.java", + "type": "file", + "size": 39793, + "sha256": "0621cbd07714323d561535a4de29e8bd5faada21909821876dafe0fb6a1247c1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/OverlayBuildersTest.java", + "type": "file", + "size": 21852, + "sha256": "18ed1254099567a5f5ce8185f796f5880ca45a7cdaeb2e7e8d600642f2baa7aa", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/PreprocessorTest.java", + "type": "file", + "size": 17000, + "sha256": "4cf8fa2b1e43d3f1b40dfe1320005a39c7c14156557fee55d94a382f6e600ef9", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ProcessingDocumentStateInvariantFailFirstTest.java", + "type": "file", + "size": 17711, + "sha256": "989ac9f312a4238d95127420e7ce54a483c2e834567fc96aa6e2f8d5dc59972e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ProcessingSnapshotProviderProvenanceTest.java", + "type": "file", + "size": 28446, + "sha256": "0342494f4e5fa61650476c2a9e85fd95f8d0344db05f24c8c1bfc666099ee48c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/RecursiveTypeResolutionTest.java", + "type": "file", + "size": 17080, + "sha256": "f6cec8a4af9c3a1e78b999274287ebf8528f9aad0d7478fe33c4da16af1da72d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ReferenceBlueIdResolutionValidationTest.java", + "type": "file", + "size": 26327, + "sha256": "cba0dd84a82b09de8163055f7837a2151299f7408381431af8da91b23b623c8c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ResolvedInstanceSchemaValidationTest.java", + "type": "file", + "size": 45859, + "sha256": "491e68125e7f6093f0de4aa59fbd09ecf600b9dc08b2e0ad2e8fdaf759e4ade3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ResolvedProcessingSelectionCorrectnessTest.java", + "type": "file", + "size": 3032, + "sha256": "47c390b66543db3e6a45bcef8147bbc1e5f15ab8f46a44def85f4d154f940b91", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ResolvedSchemaValidationLifecycleTest.java", + "type": "file", + "size": 23795, + "sha256": "765159693b37962220a2b1212e213597fcd7b352eec071f51ff062488eb54303", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ResolvedSnapshotSelectionCacheTest.java", + "type": "file", + "size": 4886, + "sha256": "3e445b1f6cf6987c5fdd75bec9b44b76b191cdea18aae8232760b6ae122423b8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ResolvedTypeCacheHistoryRegressionTest.java", + "type": "file", + "size": 3223, + "sha256": "fdce70b0e760c71e0bb0face0f5591f97d75bd3d41b4bd6fa99ea29973aa1072", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/RootReferenceSnapshotTest.java", + "type": "file", + "size": 14938, + "sha256": "0c257024fc6be6d1de53521dfb1e8711007739e4f0d0ed5a6edce2844e1da1b1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/RootSchemaPayloadKindTest.java", + "type": "file", + "size": 9322, + "sha256": "17e70eaf330feb8e4fdc7e1e0e299dac98ce95db7b008405dd9947573e04c29c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SchemaVerifierMinLengthTest.java", + "type": "file", + "size": 8981, + "sha256": "a1ec53e4be4a54ff18f9bfed28bad386e3887015dad2db8e185c9c5c74ce1341", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SchemaVerifierTest.java", + "type": "file", + "size": 22953, + "sha256": "869a53f28276f63b61fa4910fe330f8d665418bd5e85b3f92c168925753b486b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SelectedProcessingStateCacheIsolationFailFirstTest.java", + "type": "file", + "size": 7001, + "sha256": "9e2b8020df33daab712328ce6f76db6974b2540172004312fdf0d2c190eb811f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SelfReferenceTest.java", + "type": "file", + "size": 25311, + "sha256": "a2c72880bca9bdb00e3afead6c76c1c4daf99d31b4bb9d71ffd35e0682415602", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SerializationTest.java", + "type": "file", + "size": 7963, + "sha256": "d43c8d50f5013934776c1eb8d0d695d2fd0c6641eab1719fb456eba609f641ae", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SourceDocumentBlueIdTest.java", + "type": "file", + "size": 11022, + "sha256": "736af53527a2ce1c961403b3d7f21e2fa4f985ea31bbed7122603428f6996545", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SourceStyleConventionsTest.java", + "type": "file", + "size": 40712, + "sha256": "fce3cb6f7836b6383bd5306976f3c80ba7584be3a4d1e367cc6525c5e6d3bbfa", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/SyntheticWorkflowProcessingFixture.java", + "type": "file", + "size": 5335, + "sha256": "e52c4ee0f27a91daaff7ce1a7e4d493cb9c2a2843e4beb4e39f823fc9e137f37", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/TestUtils.java", + "type": "file", + "size": 2838, + "sha256": "67b21c1ce634366e56aef444f1ccd6fe77b446ee1b3f4a49756d0a5c433c6cc8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/TrustedProviderResolutionTest.java", + "type": "file", + "size": 10322, + "sha256": "5d903fda573b50455e2f03bcb18a5e82517b2b79304293d1e83583bd569a43c0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/TypeAssignerTest.java", + "type": "file", + "size": 7464, + "sha256": "4d036d9952d5e70c6cd0732b3b802861d26595adac88b92d0b6d70b6331f9f8b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/UnconstrainedFieldDeclarationTest.java", + "type": "file", + "size": 6629, + "sha256": "70f86a07e819f3b1fd89a14155c18b9cb10bd6b900d54b9940c13efcffe15284", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/ValuePropagatorTest.java", + "type": "file", + "size": 3259, + "sha256": "322ec9686e28ef6f17b88ebea186b14e5aa1457016a8f8f71c37a0a28037852d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/VerifiedReferenceMaterializationTest.java", + "type": "file", + "size": 8289, + "sha256": "1bbb79b3258e2186106f52979c5119b42eaea1e37886e6b7da6c9c3e3b3e1411", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/architecture/LanguageCoreArchitectureTest.java", + "type": "file", + "size": 31604, + "sha256": "34f025f26f0d09eb7fff64eddc224de6f36041e891db5f09b2cbb4ddf92a7a6b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/architecture/PhaseFourModuleOwnershipArchitectureTest.java", + "type": "file", + "size": 44640, + "sha256": "fafbd53a35babed3c9c2580c1984f546574deca7267031808b080d4a700100a6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/codec/StandardBlueCodecTest.java", + "type": "file", + "size": 2055, + "sha256": "0c3815c9409e5b735a8a8b4e6ad1b42dd463ef0ed6876082a03fddd59dbb61c8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/ApiMigrationLedgerVerifier.java", + "type": "file", + "size": 13870, + "sha256": "f118541f23768826cf34c7c1da3668682dd9a140a000a4fc7894a98918c76379", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/ApiMigrationLedgerVerifierTest.java", + "type": "file", + "size": 10518, + "sha256": "abe2ef8b9696e34557049070bb083687fb65963eb825d3f0b114a8a0edc91353", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/ConformanceEngineTest.java", + "type": "file", + "size": 22156, + "sha256": "b7496ed078597989bd708a65d0a0271ca87bc0324fca7a5ae34be9b3f9b5c8ff", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/SemanticBaselineCaptureCli.java", + "type": "file", + "size": 9091, + "sha256": "577fc703d7e424316c7b8e0070e7cb9abebd3b52d913ac331d6e7ae64f3fd56e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/SemanticBaselineSupport.java", + "type": "file", + "size": 22740, + "sha256": "3061ca4b1447b04040bc673e62feb7802ed18f99a908ef47fc408fd6aac5a43a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/SemanticBaselineSupportTest.java", + "type": "file", + "size": 1876, + "sha256": "fa7a9866b2b62996e8297ba9f2ca56a0a49cea736fad8194f4d0bdae4b652300", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/SemanticBaselineVerifierCli.java", + "type": "file", + "size": 27771, + "sha256": "4806a74d30497626fa66af73541a37c780f0e15792a00d0012cde5bf5e833d4c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/api/BlueConformanceReportTest.java", + "type": "file", + "size": 21780, + "sha256": "10bd6af9727783f369b9ca75ff94a76792339876b02a34e29ca341df9c080eb6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/api/BlueContractsPackageIntegrityTest.java", + "type": "file", + "size": 6518, + "sha256": "3c6d6de4b0dff83de9c770600c7e82ed91090867673b1e6e021f94740394fff8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/api/BlueLanguageConformanceFixtureTest.java", + "type": "file", + "size": 20797, + "sha256": "ea4c356a5468010e6ea0d9d507b1c8ba438b9cfa518e27f0a0a8dfd5531890ca", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/contracts/BlueContractsConformanceFixtureTest.java", + "type": "file", + "size": 17618, + "sha256": "f6fa388d4b9ced1696de68e2db20eb6b44d7e553b8c1dfb47e7fe6c7dc00f6b4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/contracts/BlueContractsConformanceReportTest.java", + "type": "file", + "size": 21148, + "sha256": "d08f94ca0e8a1db97fb13badf07a06bda13112a67008d32926f417c2ebb7b8ca", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/contracts/ContractsAssertionEvaluatorTest.java", + "type": "file", + "size": 5218, + "sha256": "3284372e6d512336bf45a54ee6a7eb82191014e3e0e74811c84a898f40915d7a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/conformance/contracts/ContractsFixtureHarnessControlTest.java", + "type": "file", + "size": 18104, + "sha256": "5c21f7db40d7bbfc5f7f607a39bd7828bd53bac4a72c09476e47970926c5178e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/docs/LanguageDocumentationExamplesTest.java", + "type": "file", + "size": 15168, + "sha256": "68494b11f376790feccc37ee378ed1fed1b9eeb022820ccec0d6a1ba9ee4a966", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/graph/NodeExpanderTest.java", + "type": "file", + "size": 10132, + "sha256": "d15fffc7c3112f992f77a9ae4d1f0a3c372c25211a4ba80f82a5c3b77523918e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/graph/StandardBlueGraphTest.java", + "type": "file", + "size": 5527, + "sha256": "67269fdc9db0f43f626ed8d5db9fc0312ad9cac5e7964bc37678b37dbff49127", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/Base58Sha256ProviderMapperCustomizationProbe.java", + "type": "file", + "size": 2303, + "sha256": "6e407d97eeed442053f8725b5b6b612198acc0c64498502542dead22d76137ed", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/Base58Sha256ProviderTest.java", + "type": "file", + "size": 17819, + "sha256": "701a3f9f1d251dc5755088394c93d8e61457142e377bdab087fefc7a6804c085", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/Base58Test.java", + "type": "file", + "size": 7848, + "sha256": "667c71f04738b187349118c13b67fd1307022df0f159d728645f2bfc50fae79e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/BlueIdentityTest.java", + "type": "file", + "size": 3953, + "sha256": "399e445220645546354fefc7de0a0f15dcd222705cc0a2419ce43056fee96938", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/BlueIdsTest.java", + "type": "file", + "size": 3673, + "sha256": "0bf4e3c30187bdb82792ebc6d7e94a655539db19b5ca90c22080b582b618ad62", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/DirectBlueIdCalculatorTest.java", + "type": "file", + "size": 45605, + "sha256": "7c0bb3659edf86d417c8256942cdd8552fae5a36ef04df723feeac7de8062492", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/ListBlueIdFoldTest.java", + "type": "file", + "size": 5184, + "sha256": "44c5e591ced10dfbbebca22d70e96b2291a065534169b54ce15bff302fe01348", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/identity/SchemaEnumCanonicalizerTest.java", + "type": "file", + "size": 8051, + "sha256": "cbd8d98c800b0aa8a0c2a7ee159e1c5ecedeacc84d50e3f7bbe62f2341bc7f42", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/BlueAnnotationsSerializerTest.java", + "type": "file", + "size": 5524, + "sha256": "9da5b2a7539b23d750f13dff1e9e6a5b5c259367e2d0cc72beb90ce887e0dd9d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/BlueMapperIsolationTest.java", + "type": "file", + "size": 5052, + "sha256": "eb062c793bb4f41d3d0106f907efe06c2f0c0e4681812382e504c0a9ef54882f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/JsonPropertyMappingTest.java", + "type": "file", + "size": 8431, + "sha256": "14203e35155d99f8b3d588ceecbed35ef691d996c4e2b6f607857863dd41198d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/NodeToObjectConverterNullHandlingTest.java", + "type": "file", + "size": 5245, + "sha256": "357c3658236f15c629b6d0731821397bbd4ca9b2305f875448d9c62ff11cff26", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/NodeToObjectConverterTest.java", + "type": "file", + "size": 37179, + "sha256": "6eb3eaf20fb8d8054bc8806d4f26612243112dcadcbe0c49d32e83f9c8d9e160", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/TypeClassResolverTest.java", + "type": "file", + "size": 1115, + "sha256": "0f12f077c5ce6aa73eaf4f326aabc1f5bcac03dfeb648deb4897edcf46fa3dd3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Doctor.java", + "type": "file", + "size": 371, + "sha256": "9584c8d78ec6bc1d948d2d17d7ef459fd74cbbc17207d5c5cbdd617bfadb47a8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Nurse.java", + "type": "file", + "size": 182, + "sha256": "dba2c518686ce5134db372d1b97fb2bbc0933fedbabdb9c4f91ef09f48671ca2", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Person.java", + "type": "file", + "size": 673, + "sha256": "e1007fc13766022197303434a8c3bd03b8f3d31ad743b8ddc413aa8090890f28", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/PersonDictionaryExample.java", + "type": "file", + "size": 296, + "sha256": "e1005f2c11d1491d9f49c83c62d36bae36b1b5a5d8788afe6d1fd3bad0284f0f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/PersonListExample.java", + "type": "file", + "size": 851, + "sha256": "85c3dc38ba4664a45040fb480a7bd1b30dba78c495385ab7a6aeae657d849ff5", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/PersonObjectExample.java", + "type": "file", + "size": 394, + "sha256": "1fc8e78cb02113e9a7392b76546bc579d3b741cd800f8ce877adf2a243869dd1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/PersonValueExample.java", + "type": "file", + "size": 649, + "sha256": "ba3760b96f5aff6da6fb506530724599659f52800e227acc424c0e4fd850cca0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/X.java", + "type": "file", + "size": 933, + "sha256": "df6cafec163ee0770fb9ddb7e46da3c12dd740b418ab9f744481532312c278b8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/X1.java", + "type": "file", + "size": 293, + "sha256": "d1e797e4f10eaf8e50b35bbdf09a2177b812d593574f4da280884c51ad70eed5", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/X11.java", + "type": "file", + "size": 283, + "sha256": "e9e1485ff6882d7627942ebd254d1034386c29461926a1ea0fdfd39a3a3c0bde", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/X12.java", + "type": "file", + "size": 272, + "sha256": "587ff510d9377c91f99e22623dd99501a01a89fe2d29622f2a02e3749d261ba0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/X2.java", + "type": "file", + "size": 206, + "sha256": "653d9cc90143d600e0ad59a7bb676a62ea1b4ab7120d29a13ab20097232bb92a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/X3.java", + "type": "file", + "size": 428, + "sha256": "23e231f36fd8688fda5c1f8373d32899921411977559d0c06d65bb436981c40f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/XSubscription.java", + "type": "file", + "size": 409, + "sha256": "c47838ada9c5e7da8d958fdba7ecd63930066006db909f0ca6b93a416b1ccb4f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Y.java", + "type": "file", + "size": 541, + "sha256": "3395adae8cea8577478004d639dba2fa508845f604b361f6f21cb1525ec06aab", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Y1.java", + "type": "file", + "size": 241, + "sha256": "383947e18b1bbb31a7f4c439290ccd72775e20cceeb6ac4bfd885f839594740a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Z.java", + "type": "file", + "size": 208, + "sha256": "b0ba8fadd3734bda3336399b54a0a703dfac6ed50025347dc6f9452c1f09454d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/Z1.java", + "type": "file", + "size": 264, + "sha256": "d4ab2106c8f988fb0c2649b04fafd8179b83cb82c920ca2ef4e0f2e32b647c69", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/model/ZContainer.java", + "type": "file", + "size": 231, + "sha256": "e3422a183e7190656cc9ae2e2045ecdcd187707bd3bd13e324702fdd746d555f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/mapping/provider/ClasspathBasedNodeProviderTest.java", + "type": "file", + "size": 1369, + "sha256": "cd1b9fa9d0035cfdd78a4087df0858b37bb551e718aa46468376040f26db6690", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/matching/FrozenSchemaMatcherTest.java", + "type": "file", + "size": 1706, + "sha256": "5a04b7681c8efd31536cdc2b78f4e007a13f3036c4dfe610feabf15233ee0c92", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/matching/FrozenTypeMatcherCachePolicyTest.java", + "type": "file", + "size": 3983, + "sha256": "0061ae6f0c1e9d67f58749db63a17f5fd111c7ba64a742752afb0d513ea50ba1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/matching/MatchingRuntimeBoundaryTest.java", + "type": "file", + "size": 3450, + "sha256": "6cafa0ea93b93f6e840b9a23c3ef197d3e197eed7cf318b935ee8150f367ef3a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/matching/NodeTypeMatcherTest.java", + "type": "file", + "size": 77590, + "sha256": "1a93adc1fba0a0586179111fcbe7c740c44c52171ceb9c6370cda80ff11f1c71", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/merge/MergerIntegrationTest.java", + "type": "file", + "size": 3208, + "sha256": "c92a2c19b005d0b51b464ae9043b52f08318b16eb67ebf5278da3c49c3913789", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/merge/MergerResolutionSessionTest.java", + "type": "file", + "size": 6054, + "sha256": "a65702d7853a9a63b650868a1126ce2e9a972c893d0eaffe75a57ddbd8d05a58", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/merge/NodeSpecializerTest.java", + "type": "file", + "size": 2593, + "sha256": "f046985c1b186cc97d38ab1daaabd1a25078261aa8282d6cdd11345d5bc702ab", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/merge/ResolvedReferenceCacheContractTest.java", + "type": "file", + "size": 60996, + "sha256": "0ad5584bf4a35ed1bf52a1096269df5602c5993990be89fb6dffc5dd154aa286", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/merge/ResolvedSnapshotTest.java", + "type": "file", + "size": 37034, + "sha256": "e65740c767db6f1d311e03347c53b8929ec38c5ea64d4fd1b62328d6754bb8a4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/merge/processor/LeastCommonMultipleTest.java", + "type": "file", + "size": 1396, + "sha256": "453aef4e314442e27edd92b1d642443ae7f6e49ac7796b0443f9d7ccd86ca10f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/model/ModelDependencyBoundaryTest.java", + "type": "file", + "size": 2363, + "sha256": "427b25b10416e5e1b42d56ae564705e08cd6d82b5f823ec84b52abaf4d13898b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/model/ModelWireCompatibilityTest.java", + "type": "file", + "size": 1998, + "sha256": "689cd465cbeb18772793e0c6a5827ec8ead2b1d75d4d37398f91ae9cd133c211", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/model/NodeIdentityProviderTest.java", + "type": "file", + "size": 2263, + "sha256": "1c2cf00b29f24c2b77cbb385a9a98de3171534edd24181ad5fcdc7b8d0292360", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/model/NodePathTest.java", + "type": "file", + "size": 8678, + "sha256": "c9a38ac7c07512dfc5b5c98e434e73fa300bb7f89e8b2a45ea46b725e262905a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/model/NodeWireFormTest.java", + "type": "file", + "size": 16620, + "sha256": "a9bac6304e20698fc10ab3f63d7b068e5c0e24ffc21f42115b0fe184354886b9", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/model/wire/ParsedJsonPointerTest.java", + "type": "file", + "size": 4117, + "sha256": "f760dc3e9e17b19e42861dd5064feb4751a06bdeaed1e5636b7377949c3a5995", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/preprocess/PreprocessingExecutionOrderTest.java", + "type": "file", + "size": 4510, + "sha256": "ed5229aabf52eb5f03cbd7edc11ad86bee29e54cf854e83e736d8e01dc4f9697", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/preprocess/StandardBluePreprocessingTest.java", + "type": "file", + "size": 1634, + "sha256": "6e39029f96e67d3e4ed95083bc492b6a59cd3a78f4bbd7486bc7cd2f730530ab", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ActiveScopeCutOffBoundaryTest.java", + "type": "file", + "size": 9729, + "sha256": "5793e5210b399f3b4b6c51c61c72b4c5928d94fe620eb504ff86772ff8ca021a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ChannelCheckpointContextTest.java", + "type": "file", + "size": 14541, + "sha256": "5a44a0412d0256683161ab6f656095a882f80dddcee335177b442b9cad1d1b0a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ChannelCheckpointSubjectTest.java", + "type": "file", + "size": 20576, + "sha256": "5604aba5a0f405a6258f76f926ccfa9189dd67a8301de4c37a9a577ef5e70cfa", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ChannelEvaluationTest.java", + "type": "file", + "size": 1584, + "sha256": "bf1d5e762a95c7f1d6fc85815a12c073a1c55ac7653aa5a0ffa98abd1f40aeeb", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ChannelMemberSnapshotTest.java", + "type": "file", + "size": 2581, + "sha256": "33188938903abb230d86bc0e1daa72b0629fb0b0d134028b74141946d9f9a911", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ChannelRunnerTest.java", + "type": "file", + "size": 22167, + "sha256": "2f2761e0cf2b73eb8a72484bfc4474c0d96f36f8d49dcde904a6dd5382a92c79", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/CheckpointIdentityCalculatorTest.java", + "type": "file", + "size": 4390, + "sha256": "e88057f1b914d742014f3675d47523329a595fabd0869bb91f81122f31c074aa", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/CheckpointManagerTest.java", + "type": "file", + "size": 10103, + "sha256": "1438cd8105c34c1856aecea3e5e6b91a2941eb0ccca27a56ccedeff38f82f06e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractBundleCacheTest.java", + "type": "file", + "size": 6523, + "sha256": "e550194831ea0fb872b03e6bdb2d9ef424248e2d601ca9e790fec5dca1ecf2d0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractContributionResolverTest.java", + "type": "file", + "size": 15337, + "sha256": "5258651117046367ff8134ad5ceaa9a8a641335a5c19d2d52dc35bfdcc46a8b2", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractDiscoveryServicesTest.java", + "type": "file", + "size": 9941, + "sha256": "47b4285298652b6ebfc4700fc1352eb682c15d734abc3bef9b73b26aff5fa5ff", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractExecutionResultPortableLimitTest.java", + "type": "file", + "size": 14128, + "sha256": "458420ece32e366b9c8c0cabf1bc9004e1a8d08b96f268c192ac84c25defae31", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractMappingIntegrationTest.java", + "type": "file", + "size": 8513, + "sha256": "df5874e4d0f0fec9d9654e53bbc694e049c16bff8b7ec88748faaaa7586d3826", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractRecognitionMeterTest.java", + "type": "file", + "size": 15608, + "sha256": "247d8fa65357bc9d0a419f7af295941f9af1c4d11a8934c2173b118a43ed474e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/Contracts10KernelInvariantTest.java", + "type": "file", + "size": 15773, + "sha256": "878a99b9ea9f10f1ad0726c7cabafee935993ba81cb65f26f4d486372b542655", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ContractsKernelArchitectureTest.java", + "type": "file", + "size": 8758, + "sha256": "e9b379caac619ecacb0ecb578921f436d2ff641655e92437087b7119555a8237", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/CyclicProcessingBoundaryTest.java", + "type": "file", + "size": 5316, + "sha256": "472aa939ccb4f0e8f5cd4d1ec36b4acd47c6a36e980ac9553cb1f5e40fa8733b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DeepGraphPhysicalLocalityIntegrationTest.java", + "type": "file", + "size": 159137, + "sha256": "32ac415fe1ec37a06acd43fa4da8b67ff95367f3d2a8fd8107cd6c61785920c7", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DeferredSnapshotProvenancePropagationTest.java", + "type": "file", + "size": 8643, + "sha256": "474e1591f19aae5b4c5d9176d87cbff755c6a5bc7973a20e0af94077530944b8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingResultTestSupport.java", + "type": "file", + "size": 1533, + "sha256": "42bf635ca270ef302661359d3b5d56f44f54c484284d5e9490444bea6e57b057", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingRuntimeBatchPatchTest.java", + "type": "file", + "size": 27265, + "sha256": "a30f8778cef38278b128a02966b0f87716baaba91894f4fe4beadbfb7fc17342", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingRuntimeCompositionTest.java", + "type": "file", + "size": 2675, + "sha256": "06fd13c170ec8eda1671702c64a00d51292b415e65c53f899c02f2523af89f5f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingRuntimeDeferredPublicationTest.java", + "type": "file", + "size": 10732, + "sha256": "531ff58c9d6d37634fa0a26bcf77728ec0aa77d194b5632ae51d2b6dc6f5d3ef", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingRuntimeJsonPatchTest.java", + "type": "file", + "size": 14739, + "sha256": "d6b40af5814931e4d4d1b28adc72a8c6dc3648e0b7d10d5fdc02368b399be3fe", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingRuntimeOwnershipTest.java", + "type": "file", + "size": 5037, + "sha256": "7e78f2a8d3aebedf9816f647c7b50a98b926d109745aec40bc088627b1a5d955", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessingRuntimeTestAccess.java", + "type": "file", + "size": 1824, + "sha256": "2c741c9cf57879da0719cba16d8692102540300821892c96f6bd11972dbdf711", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorBatchPatchTest.java", + "type": "file", + "size": 13060, + "sha256": "eb884b1b641dcdefd2a937e9f6b9d2e3becddbc57f94acd75bbca1473eed6334", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorBoundaryTest.java", + "type": "file", + "size": 26943, + "sha256": "e032c1e17b5726732d9de4a7e0d32640ccda8822a614202790ba2457cef09644", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorCapabilityTest.java", + "type": "file", + "size": 11209, + "sha256": "89dfc06d4d813c68297b9bb90d56ef784f036e7e60ce2a4084b9deafdd813a4c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorConfigurationTest.java", + "type": "file", + "size": 9000, + "sha256": "66746576c7ac94d8f0976cd8071da60f99454eb6f7ef611cfaa197f8a1a584ad", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorDefaultTypeResolverTest.java", + "type": "file", + "size": 3198, + "sha256": "eaf05327d00e1a7316b30defdb728fe874bd55d4311564980a1baec0f110cfc3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorEventImmutabilityTest.java", + "type": "file", + "size": 2707, + "sha256": "6612ded6e266161ad95bba08a236afd6945378e9c6dde490e0053250c17eee24", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorGasTest.java", + "type": "file", + "size": 55190, + "sha256": "e58e381a7226cb43bb96b0457baec7a72ef03129cd5f6ed886d20a45d071c661", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorGeneralizationTest.java", + "type": "file", + "size": 53583, + "sha256": "a7f3aceb0ab15bff0529e51ccba765064eab4781666a7fb63c436c48cf4faada", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorHandlerFailureTest.java", + "type": "file", + "size": 21234, + "sha256": "b3782f3cd44b34da157088dd0d2745b1dc5f6f3481931b84d936e2699856fb60", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorInitializationTest.java", + "type": "file", + "size": 52837, + "sha256": "1b75a637ceef0f83e0ba399f103c699c457606dfd281c42d584c9ed44dea362d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorResolvedSnapshotParityTest.java", + "type": "file", + "size": 27168, + "sha256": "46c7b66730551c1980579bc85bddc6b900bb89292ded8d5db1ec977ac1fab626", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorSnapshotTransactionTest.java", + "type": "file", + "size": 49264, + "sha256": "0a02791b0678de0c54cb170b438391cf6a808c97363b5c220e682ba76a75847b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorTerminationTest.java", + "type": "file", + "size": 7819, + "sha256": "cb230269c09fd930fac08be8df4443920997631e9f9b29194c6220b78c1c857e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentProcessorTestFactory.java", + "type": "file", + "size": 1259, + "sha256": "60bed141f1be37b879b8f064f3b14ae2e12cc1e3d9ad015b25a11247dd46a9d6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentUpdateChannelTest.java", + "type": "file", + "size": 14594, + "sha256": "576f4c200683fc0ad30bb9c3e73536860e21182b95046d569b66e15deaed00f9", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentUpdateOccurrenceTest.java", + "type": "file", + "size": 3270, + "sha256": "c304489582e8e76c9fe3ab9b991afc13a6ed53cbb55ccebd9e512c88c2252cb5", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/DocumentUpdateRouterTest.java", + "type": "file", + "size": 2137, + "sha256": "d8d6a5b84b94cf5c9ac3215c39f921b10be04498f995f8baf6263768bd9e8420", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/EffectiveContractRefreshAndReferenceResultTest.java", + "type": "file", + "size": 20067, + "sha256": "8442070cf1edca2deed80733e967b25c3c7a1206dc4b649b24fa7d8cec667d53", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/EffectiveFragmentationCatalogTest.java", + "type": "file", + "size": 51772, + "sha256": "685408d06928fae87fbbaa12fc31b52fca86aff9543153f36367c142859c88dc", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/EffectiveSubscriptionSurfaceValidatorTest.java", + "type": "file", + "size": 26208, + "sha256": "aec5ab5129a69dfcc68056e3be08ae194114ac6003d97b7dd333e54f2aca3548", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/EmbeddedCollectionLifecycleIntegrationTest.java", + "type": "file", + "size": 20040, + "sha256": "d3aaf6b3b00592272fa9d67a65e097d88e093940a54e1ba137d33aa562fe7323", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/EmbeddedSurfacePreflightTest.java", + "type": "file", + "size": 9747, + "sha256": "158a044a4145714a6786f136bfd3f697a55d177819a540cd9f1116105a08f7af", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/EvidenceClassificationViewTest.java", + "type": "file", + "size": 19602, + "sha256": "c3e6444a89b65a020025b959fd40c075dbc85e3da80c8e30ddfa8f3fe6e4f6a7", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExecutableBodyFieldMetadataTest.java", + "type": "file", + "size": 57105, + "sha256": "8459c2bc3b0dc979034dbc0e77bbd5f6c2a3c5adc53ff58c1bac7a40af31b118", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExecutableBodyPathCatalogStrictLocalityTest.java", + "type": "file", + "size": 8355, + "sha256": "e82acde379a19abbf6a71a67af617080f740c624789248e3609338f3158bf933", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExternalChannelCatalogContextTest.java", + "type": "file", + "size": 55949, + "sha256": "07b2a402e96f332cc5b9586a1b4d538a64d7ab525ad72b4b769cde54644aa0a6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExternalChannelDependencyContextTest.java", + "type": "file", + "size": 74442, + "sha256": "a67a991518dbc15b7bf0a3b7cd0675ac5a6c3eaee5c74277f59cbecd5dddbe4a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExternalChannelDependencySnapshotValueTest.java", + "type": "file", + "size": 7849, + "sha256": "a9ffb9a8160bf0c519a61b1f171a75a887648d0172556e4d0be4d62ac8262807", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExternalChannelHostedOutputAdmissionTest.java", + "type": "file", + "size": 13177, + "sha256": "01c79e17220ef2317288002d3f3c7415994f86bd34a1ee305a10b722f55c7a8c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExternalChannelPatternMatchingTest.java", + "type": "file", + "size": 63828, + "sha256": "0d74d9a2b2c15a8e439d38b9e6fbca10a27369f691f5f7816f1e64731d657ed7", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ExternalDeliveryPlanTrustBoundaryTest.java", + "type": "file", + "size": 64303, + "sha256": "a7413ffcb4b62212d7cba670a3a7d8993f7456ed8ff91501765aa4b716756770", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/FailureCapture.java", + "type": "file", + "size": 1291, + "sha256": "fffe634e5d960d9fbcadbc76ee733ff818400a14a40c6771974d8bfbaccb4d10", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/FragmentedProcessingFailureMatrixTest.java", + "type": "file", + "size": 34286, + "sha256": "a9f3e4e009ef09c8582fc3706ce126023dd9228dae44a043d2396768b002bf17", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/FragmentedProcessingLocalityIntegrationTest.java", + "type": "file", + "size": 64167, + "sha256": "7e9967d7d4829a22373d9faaa054b7902c83402c2612420ad2ab40a61fd7bc8f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/FrozenJsonPatchApiTest.java", + "type": "file", + "size": 25985, + "sha256": "c462d8fa933a5565630fa85271d65627c272a8268359702dd2463e002432e414", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/GasReactionBoundaryTest.java", + "type": "file", + "size": 32833, + "sha256": "e0e5a05dd2bb79db75a43c9d0b4ac8e47667f410878af41f830d68d280524c54", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/GasScheduleTestFixtures.java", + "type": "file", + "size": 2999, + "sha256": "c36cb2de63cae92699f841c01f1b331188be7e0437eee4e60cd1dec865da1cee", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/HandlerMatchContextDeclaredTypeLineageTest.java", + "type": "file", + "size": 55533, + "sha256": "8150e7502da6c6b8c72c1fa0a9e1b3d335d73d34792602abc43b75db746f72d4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/HandlerMatchContextExactReferenceTest.java", + "type": "file", + "size": 4852, + "sha256": "c72d99f05a0804b3895149a1e542c63dfdefe965ccbce2b4b3e9400002eb3698", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ImmutableJsonPatchTest.java", + "type": "file", + "size": 5985, + "sha256": "83aec5132c270cbef2ec09f275685f59c03e4d0911aa7f1e4356ba3d25c2e61f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ImmutablePatchPlannerTest.java", + "type": "file", + "size": 12678, + "sha256": "19a4ced5bdbe6bc226788e38d7f14267e0353ede856eacfa02e7436ad398be1d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/IndexedDeliveryEvaluatorTest.java", + "type": "file", + "size": 56082, + "sha256": "7ca214cc305c15b9b66e8b754b36d3a79c4920f45b523b29afe5243034f6c299", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/InternalEventOccurrenceFifoTest.java", + "type": "file", + "size": 20225, + "sha256": "17cc7c65026c2bf8e49771063b075307ff2a845c95289f7a990f77de1fb9ff13", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/LanguageRuntimeAccessContractIntegrationTest.java", + "type": "file", + "size": 3532, + "sha256": "f793a8926b2e9bbf939d1af5c1668af05882adafebe238e13c6e73f75c575c5b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/LogicalDeliveryRoutingTest.java", + "type": "file", + "size": 81242, + "sha256": "4a7dae5499f53c8594622b55f5286f28b71436d0e8a6bd51adbe681a587001de", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PatchImpactIncrementalResolutionTest.java", + "type": "file", + "size": 39897, + "sha256": "15dcdcb6442ad56d9b853535738c09836c9792356c84fd9ceaa0e474671a75aa", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PatchPlanningEngineCollectionTest.java", + "type": "file", + "size": 6148, + "sha256": "a7a844ca338cb0ddc0e98841f0e9f86997fcaccf02d5f3e316e32bbe0e773a96", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PatchSequenceRandomizedDifferentialTest.java", + "type": "file", + "size": 9362, + "sha256": "460b3aabe5ebbad3248febec4db52405d2dd4e6be93b23ec8ee9365112510356", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PatchSequenceRetentionStressTest.java", + "type": "file", + "size": 4956, + "sha256": "b9a6d085c7c95111527de7b0a0f8a6e96742dafa3807657d5c45a74c214f68b6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PersistentMutationPortableLimitTest.java", + "type": "file", + "size": 1594, + "sha256": "c2d56ad9c7c67bd46623b1fd543d60575d98b21bfe54794e3753899e780296ec", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PlatformCommitCompanionTest.java", + "type": "file", + "size": 5892, + "sha256": "01fc208bfb924ec97c2a463e8bb8556d766f20a38f6e201eb6d1d70775ed128e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PortableLimitGasPrecedenceTest.java", + "type": "file", + "size": 4546, + "sha256": "dfd2df5eeba404e81dab7db33218f64563fb541b7a95d411509fac53d9b42e0e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PostAdmissionPhaseExecutionTest.java", + "type": "file", + "size": 22677, + "sha256": "375b762f34289b0691dbaf46956cb21f442d7fa4e624910f3418e952a0ae64ac", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PreparedPatchSequenceTest.java", + "type": "file", + "size": 37369, + "sha256": "7c0090f5a8ae71c740babec7648ee3b4fe58889e2a1bc0c42f77ee2a26769994", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessEmbeddedTest.java", + "type": "file", + "size": 39941, + "sha256": "f2e8e855209e56acbcdbff318ce3dbf49ed8481fc6c12fd89c71e13c6a9832b8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingInputAdmissionTest.java", + "type": "file", + "size": 34050, + "sha256": "8ed5f13a24ff0ab95ec004d90b65a760634f594aed7413be8785efcdb63d9161", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingMetricReferenceCli.java", + "type": "file", + "size": 409, + "sha256": "793ab084f2309122b4cfa15ae0219ea4ddb24eb5d99a0256556d8d9970bc592a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingMetricReferenceDocumentationTest.java", + "type": "file", + "size": 2087, + "sha256": "4b78fb0e719bc395832049eaa8ea1f83443006f797c993037c92a6fc04955e34", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingObserverTest.java", + "type": "file", + "size": 9097, + "sha256": "c109fb5f2b33c100bd0fe09819ed088b793b4b703d9631517fc9f3175e3a84b6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingPhasePipelineTest.java", + "type": "file", + "size": 5316, + "sha256": "1d0b2d949d9ce26ee8e5aded93551604d5a58e021e15e2a09e36748073e3dea7", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingSnapshotBootstrapTest.java", + "type": "file", + "size": 10405, + "sha256": "b8fde4cc0c4b89afd46e065515332ca5abfed9f5d899afbfedaae933b0dd3219", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingSnapshotManagerPreservationTest.java", + "type": "file", + "size": 3692, + "sha256": "94cf5c112ac0ff1c4454b3b18454a73bf1186e53a19494f3e79d2c0d63d0be27", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessingSnapshotProviderPatchTest.java", + "type": "file", + "size": 40923, + "sha256": "0e516fdbae52bc622fe13297c85abd1bf2db98af1b70d39ff27cd676276c0dee", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorExecutionContextTest.java", + "type": "file", + "size": 18166, + "sha256": "07156f1d5b858a8abb20386694a17c441ac839b05dd6bb0efe6871d71053f052", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorLifecycleServicesTest.java", + "type": "file", + "size": 2943, + "sha256": "bf6da063f59e0edfccd48bdf083087206be83a64570f8dcaf3dadc82b4585b1a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorOwnedCacheLifecycleTest.java", + "type": "file", + "size": 8601, + "sha256": "cb3261a57ad14a52a1e34f3410f8f48763bcc751549642f680a39e2df5405e1d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorPhasePrecedenceTest.java", + "type": "file", + "size": 26182, + "sha256": "81cc126c0e227f568295473ab41a7906df866598a4acc1d89081afc9f9fb29a0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorPreviewOwnershipTest.java", + "type": "file", + "size": 15294, + "sha256": "16cc720d443ad65bc74b3038c5655030d86b5551ffc10b695a2429b49b797e9c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorProcessEventContextTest.java", + "type": "file", + "size": 44044, + "sha256": "ef6216815d3e0b88f2263fe733d73347b648c18b6b6cb0061c5de13f93c40408", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorRuntimeAccessTest.java", + "type": "file", + "size": 38980, + "sha256": "fc0d17c63704ce2f073e49f70a2d27dd99c5abf74bd72d40cebd1e5e54c9cf22", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorStaticSafetyTest.java", + "type": "file", + "size": 10309, + "sha256": "8f7e733edfeef70350fa8509a163644abe6a0e3842c8d15ea7b642ed02dba9c8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProcessorTestSupport.java", + "type": "file", + "size": 3490, + "sha256": "a7ed2cc7bdf063c7d3792bde720a0fe132224d7954dfeebd4d2ba4af4b63700b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ProtectedStateGuardTest.java", + "type": "file", + "size": 27473, + "sha256": "2b6acad1f1e55459302c05ea22b812b1e18d9790d608e63e77333de1e0142337", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/PublishedSnapshotRoundTripTest.java", + "type": "file", + "size": 7562, + "sha256": "9eb632da57f5d780dc2ad2652e52097c2b1661b38d267a5e3cdcf79f826cefdd", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RecordingProcessingMetricsSinkTest.java", + "type": "file", + "size": 6977, + "sha256": "29564a67d582c7900c23892efe52c8a16a0596d675b070797aa2c8db06def212", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RegisteredContractProviderEvidenceTest.java", + "type": "file", + "size": 14527, + "sha256": "f12f1b0c9efeb9676a5a3a6b601c4386c7764048e3353b3b03a74294b5920280", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ResolvedSnapshotPatchTransactionTest.java", + "type": "file", + "size": 19428, + "sha256": "e8982a99b9ed830feb5d126267132c29628503c0ec4004bcb03435b7cf32f58f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RevisionBoundNoMatchProgressTest.java", + "type": "file", + "size": 3204, + "sha256": "fcb392797670a1c7250070890a12c5d95ec7efce8b5aff643d5b5a18c0f7ad09", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RoutingDecompositionTest.java", + "type": "file", + "size": 4368, + "sha256": "153c4d5406fedb5ac46350dfdd12a9bc8f9e935384d365526e4faefcc8b5f346", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RuntimeTraceEvidenceCli.java", + "type": "file", + "size": 31175, + "sha256": "1df19e0fdef1d20903df9182373b2b8f664ba5b2b816a989e88ad387d5e9f758", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RuntimeWorkSessionProcessorPhaseIntegrationTest.java", + "type": "file", + "size": 25408, + "sha256": "d3edcb60c908ba2a650c04ed865a915c0868390a884749ae13fc12b03224a65e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RuntimeWorkSessionTest.java", + "type": "file", + "size": 34927, + "sha256": "615b5a7db800967d393ab981026c02ae3ffaf96902d0e6004bc6f1c7a990d80a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/RuntimeWorkSharedBudgetTest.java", + "type": "file", + "size": 7248, + "sha256": "be36b439ce1bf1de5d92bd323707263f3777408b752c42dc19e6eb8d607895d8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ScopeIdentityErrorMapperTest.java", + "type": "file", + "size": 4095, + "sha256": "536df721c608452525295a9ff1405b745e4192bf8b0639c0b98747ed047d9c93", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ScopeMutationServicesTest.java", + "type": "file", + "size": 7023, + "sha256": "e96e1acc8a8165a7298de79daaa186573e4d4414a2abe2991e97eacff25f84e8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/ScopeSourceProjectionTest.java", + "type": "file", + "size": 38417, + "sha256": "1252e608068f22422e8e09166260f6749330cef3a569b177c4bfac5c8241b4bc", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SelectedExecutableBodyCapabilityTest.java", + "type": "file", + "size": 15080, + "sha256": "8089f4ddea28d13f8ec38d2b57fa6a1501f24deda829d6f15d111e7b40e776a8", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SelectedExecutableBodyDemandGasTest.java", + "type": "file", + "size": 5681, + "sha256": "07d5f7e86abfa98ceff6d88e897a8ed3c8050529d4ab1a70d2d17ee560ef4b73", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SelectedExecutableBodyProviderProvenanceTest.java", + "type": "file", + "size": 16792, + "sha256": "c56b2d12c8deffaf7cdb9fc6782380862a7e8d7b53c8dbbc59b831c068c9a918", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SelectedScopeContentBlueIdFailFirstTest.java", + "type": "file", + "size": 30855, + "sha256": "c72954b4ef00d866d5f332b166dd86d75513519b06b414b770c8408eb61c0b45", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SemanticLocalityEvidenceWriter.java", + "type": "file", + "size": 1373, + "sha256": "8481f4adc51175e72a7638680b5ef5adc372dd5975fbd874ceb198e0ccff94a2", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SemanticOutputBoundaryTest.java", + "type": "file", + "size": 53148, + "sha256": "d4cb224b5c367d320cf60cd70a8f49f233d6cab874e631c35d183e63027766e7", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SequentialPatchPlanningSessionTest.java", + "type": "file", + "size": 8126, + "sha256": "7e9f7be04675fb937c33a8dc02064cbf56363ed88a5c95ba7aaf1f6576060e6a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SubscriptionSurfaceProjectionTest.java", + "type": "file", + "size": 29521, + "sha256": "5496c48f8808b8efecc6d951b17a4f20356cf68df7a4cca9068d3cb9ae049135", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SubscriptionValidationServicesTest.java", + "type": "file", + "size": 16148, + "sha256": "44a3b643ffadab313d8ecaa300298e95938794b258e88416caa4da0743b51aa1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/SubtypeAssignablePredicateTest.java", + "type": "file", + "size": 7842, + "sha256": "060a8291d5d0a83b560c876524cfe379c8d59ee248a541237204339145e987b3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/TerminationConformanceTest.java", + "type": "file", + "size": 43657, + "sha256": "2dd596679306c9799918b73ca2b03ddedeab386f65e8a08b45f8881b95ea439c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/TestEventChannelTest.java", + "type": "file", + "size": 17616, + "sha256": "f056a894c959605e664dbfe79ef779cee008b931ac0a78ebeaf9b24c2550e904", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/ContractsFixtureConstants.java", + "type": "file", + "size": 10429, + "sha256": "fc322901009a3a9e1bd0527782dd5e8fa8f5b68c455a9643ace376e2b4759778", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/MockExternalChannel.java", + "type": "file", + "size": 5843, + "sha256": "781c87d69a1c3cf06f405e4a9034fac0d4e13af9d6c5e6fdf60079af5716a60c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/MockExternalChannelProcessor.java", + "type": "file", + "size": 10227, + "sha256": "3d8dc87ab52914baae4d5cb70263973363de45c04600005bd8279163b344c533", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/MockHandler.java", + "type": "file", + "size": 900, + "sha256": "f7ccf112b85c98bfd16dff87cd8d64a8e2c879decf68047ab04aa95518eafe67", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/MockHandlerProcessor.java", + "type": "file", + "size": 2077, + "sha256": "367357b4e082bb31b5ca4e4f2be07fdb3a4670587ed307b0306a193f8d838553", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/MockTypeBlueIds.java", + "type": "file", + "size": 551, + "sha256": "68cd094a4ceb5ed1b4eb38a0af835ad9dba16bff97d4a57fb92da3618442ad18", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/conformance/ScriptedContractsRuntime.java", + "type": "file", + "size": 22678, + "sha256": "9e45d1c1a614ad9127572e086c5318ef43b7474c89c183689fc91af04bf0080a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/ApplyBatchPatchContractProcessor.java", + "type": "file", + "size": 1208, + "sha256": "50e50864b1852a77bcc79aba3a9a9d5bd6fb99bb38127988cf55a15fc17e4602", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/AssertDocumentUpdateContractProcessor.java", + "type": "file", + "size": 3729, + "sha256": "055951ae52d476bc394a71f54c66c54f6bfb0563986cb3ddbdc103e55dd61c89", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/CutOffProbeContractProcessor.java", + "type": "file", + "size": 1692, + "sha256": "affc8b13a0077f67ec189b56e4bd346ec3ec94c4aeff766263ad29adc60b0546", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/EmitEventsContractProcessor.java", + "type": "file", + "size": 1417, + "sha256": "5a599b12baf77dd9ceecb96ee74012211b6812f168068929d770d523099e6a5f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/IncrementPropertyContractProcessor.java", + "type": "file", + "size": 2276, + "sha256": "b56fe030a688dca39de6762af97262c498781c77b1d4a17d089057b5eb9506b4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/MutateEmbeddedPathsContractProcessor.java", + "type": "file", + "size": 1198, + "sha256": "c5c4d7c6fd4237e1e945c4d33b83ed357a961dbfb1dfe1ca448a3549e179493b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/MutateEventContractProcessor.java", + "type": "file", + "size": 688, + "sha256": "4886997a2ccb909e47c7d1cc9f44986ad7a9319891d83b37e6d43914cb62fc2a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/NormalizingTestEventChannelProcessor.java", + "type": "file", + "size": 2806, + "sha256": "61a9ffd00e9cac2de50324ae65a0a4049a5b0632725af9ca0a1d94aadfb31a3b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/RecordDocumentUpdateContractProcessor.java", + "type": "file", + "size": 955, + "sha256": "4097c8c1794b6bead1337ef4eafd77132502bc240bb1874132b50a969ec58712", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/RemoveIfPresentContractProcessor.java", + "type": "file", + "size": 1047, + "sha256": "fde226401af1640a8b9021e0533e6e47fea8b18d7a61200744ac2f7fd0b5d605", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/RemovePropertyContractProcessor.java", + "type": "file", + "size": 1187, + "sha256": "91e0a1ec3e1d1c7bb1cd875e4099346e21fffde204058252cc20c95ae6b5e165", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/SetPropertyContractProcessor.java", + "type": "file", + "size": 1944, + "sha256": "636d82f657f926dc0f315f42cd9fb5c8574d62bfd2a33564004ff32de5bc5b6e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/SetPropertyOnEventContractProcessor.java", + "type": "file", + "size": 1477, + "sha256": "d5069f7aa45ed7f28224f20e0a20a4a6a63cda518e720165d945f502a45ab26a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/TerminateScopeContractProcessor.java", + "type": "file", + "size": 1414, + "sha256": "8862fb416c4c9c95536ae3381ae8b93735d81f73ba4968f72f7bdf90eef1e8e1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/contracts/TestEventChannelProcessor.java", + "type": "file", + "size": 3552, + "sha256": "8e6390677797cb99ac046b8a81ebe92e3d6be1f31e89281cab429b68745f1829", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/external/ExternalContractIntegrationTest.java", + "type": "file", + "size": 40305, + "sha256": "805bbd3b29024bede5dd847f5725807ce4097596e95bbfd8926ab5b023d1f13f", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/ApplyBatchPatch.java", + "type": "file", + "size": 572, + "sha256": "c9c7cb4c7cea46e3d9a25116854ae52eef5dbbbe22f5bd10594d04ed963dd7b0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/AssertDocumentUpdate.java", + "type": "file", + "size": 1660, + "sha256": "aa09bfc05f1c3600b9c8dd6fe7b0fe7f727e0344b2e2a6b2151ea635f86abf6a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/CutOffProbe.java", + "type": "file", + "size": 2898, + "sha256": "501fd91b81eee6a21a06cc632d408b3e403979b06f3b79efb31280ff73243965", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/EmitEvents.java", + "type": "file", + "size": 962, + "sha256": "16ae5185312588fcc7a941ed6d81d1aee38e12ea746860da260cd894bd1e04d6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/IncrementProperty.java", + "type": "file", + "size": 455, + "sha256": "9491ce3f9acb9d41d12974825df7b8e69873d08cdd44ce03403847410fa89a84", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/MutateEmbeddedPaths.java", + "type": "file", + "size": 255, + "sha256": "6bb76a649a147735e4535517f02808bf74d650204277b9a3f897c7951eb3b31a", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/MutateEvent.java", + "type": "file", + "size": 238, + "sha256": "848b2a0fcdd2be69bc96ccc47f982d165edac2064449689a9d23e5e3cb283118", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/ProcessingFailureMarker.java", + "type": "file", + "size": 533, + "sha256": "2db51a8ee952a4ca99bc2497b626341ad239e2364191b88ebacd7cd8a82e87be", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/ProcessorTestTypeBlueIds.java", + "type": "file", + "size": 3647, + "sha256": "ffa459d757847d5166d6d48882e3d81be9dd51bcc11b3feb08d61db9440030a4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/RecordDocumentUpdate.java", + "type": "file", + "size": 203, + "sha256": "f68462cae920af8802151d57473d9212ab61be0a044156cc8b029e058e1ffbc3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/RemoveIfPresent.java", + "type": "file", + "size": 527, + "sha256": "f91a956695e94cfe3a75cec44cb6ce1601933bb4c3e8d92d124a2f78e25314e4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/RemoveProperty.java", + "type": "file", + "size": 449, + "sha256": "e750587201834df96c8fd27ef4d44efdb1d80193d8c0b1d76afe0409939a5b28", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/SetProperty.java", + "type": "file", + "size": 807, + "sha256": "e96be206910fe10fe363a58d66979a1cd3848782b92196bfce26993d67dd2dc0", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/SetPropertyOnEvent.java", + "type": "file", + "size": 975, + "sha256": "fd3e99da6811b89dfacad04e0ff93886aa04e3fa48aff39b5cb8b0337d3f076e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/TerminateScope.java", + "type": "file", + "size": 960, + "sha256": "bcdcfd36b2399f8bf68014ef529491a8d63511305c517b4e02a2577b669954bd", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/TestEvent.java", + "type": "file", + "size": 1422, + "sha256": "e31ff649e63338a390ae1dd947ab0fff2d6d2d73fc09f26b694ab4fb8e876686", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/model/TestEventChannel.java", + "type": "file", + "size": 440, + "sha256": "b69ff361d544ca39863e7dc0ec9da9ed019d7295bd5eafaee3d7e2943d3ae4c3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/registry/BlueRuntimeTypeRegistryTest.java", + "type": "file", + "size": 10811, + "sha256": "0738ada84aa8e28320d287afbd3b489a521ee917e93f28b2304a80d264728b14", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/util/PointerUtilsTest.java", + "type": "file", + "size": 4303, + "sha256": "0579bb2869749a0d0e2c8b8d2ca84772292b5b5a86be4a6afb3a72c7cb1017c4", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/processor/util/ProcessorPointerConstantsTest.java", + "type": "file", + "size": 2613, + "sha256": "a487fb66ec234c59d1bd8f3e6ba07e75caf51662e437dcb6a82f9daa150f4dc1", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/BootstrapProviderVerificationTest.java", + "type": "file", + "size": 6317, + "sha256": "142de676721df1bc14714e77493a2bb8d1e5605b361da5a628e43c3e6d532389", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/CachingNodeProviderTest.java", + "type": "file", + "size": 9182, + "sha256": "0320b24b446e8e1425d82cb35b0adb10ed0168345f6c9dedfe03250341a36510", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/DirectNodeManifestTest.java", + "type": "file", + "size": 3556, + "sha256": "404555e90f723d95f7df3a095476de2749722a9238c3681bfe7e41188c0205db", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/ExactNodeGraphFragmentsTest.java", + "type": "file", + "size": 34351, + "sha256": "6c089902054798f76e6cbaa2bab463aaa176beef15f12c0e828dca24c406f30c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/NodeProviderWrapperTest.java", + "type": "file", + "size": 4574, + "sha256": "aa6f620ce1cdee4d7193530abaa22f3c69e6301c87460925cb12ba0c7e91a14b", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/ProviderCanonicalIngestionTest.java", + "type": "file", + "size": 10628, + "sha256": "da9225d1503a5275ee573064fcc43f8ff16555321dc60eea047d19fc6a749ef7", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/ProviderEvidenceVerifierTest.java", + "type": "file", + "size": 9592, + "sha256": "b73e133b43f5677422ec0d0fa994c09e60e36a50f6605223a51da2fd654defea", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/TypesTest.java", + "type": "file", + "size": 5105, + "sha256": "8feef0a7d0db0e1fc71c785bcf6c2aead608725165ac6e8f035dc0b888f1df16", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/VerifyingNodeProviderResultSemanticsTest.java", + "type": "file", + "size": 20535, + "sha256": "a736c456b9f259eec039e8f3d148b929cd562b1d60c690f5fb6ea8c6d02d0e97", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/provider/ipfs/BlueIdToCidTest.java", + "type": "file", + "size": 5568, + "sha256": "8ff1a197f4bd449d821d3dea004f5d8db3bf792a27333b7e3e357040c20dfccb", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/registry/BlueCoreTypeRegistryTest.java", + "type": "file", + "size": 1778, + "sha256": "ce936deb084d49242176ea72f8aeca12a3b500375f655e0e7b87c2f5f1b15b61", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/resolve/NodeToResolutionLimitsTest.java", + "type": "file", + "size": 6139, + "sha256": "31aa8141d2c330fbe8cfe04e0abe2bdfca79428e7a44553daa018bad57bd09b6", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/resolve/ResolutionLimitsTest.java", + "type": "file", + "size": 11719, + "sha256": "a81593d81add4605cdf130504610942570ec10244c0804cee9ce6b65028e436e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/resolve/TypeSpecificPropertyFilterTest.java", + "type": "file", + "size": 7503, + "sha256": "ac4f9a5987474bd53c7c21e63f4651040701a3e945edb9db51c64f68fc412983", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/runtime/BlueLanguageCompositionTest.java", + "type": "file", + "size": 10222, + "sha256": "ec9a5b4d31f69225821779e8701c13f95ceaee8f12b5fdd660edb78f6928f6d3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/runtime/WeightedLruCacheTest.java", + "type": "file", + "size": 3963, + "sha256": "adea75c90d02892ba66666fa25a8ed58f1e57432032e7b451503fa904cc30b3c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/PrintAllBlueIdsAndCanonicalJsons.java", + "type": "file", + "size": 1382, + "sha256": "29f698ce46cd73145ec1281064f6b735a93493e56fd001f3fa5250bf3ed4c0ac", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/README.md", + "type": "file", + "size": 1719, + "sha256": "1e225b5feba2d54f4955091fc5a7e555625d65608929d0a8cb6c339aa3f2657d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/Sample1Print.java", + "type": "file", + "size": 703, + "sha256": "8c17ff42a92911a589eead02ff4f642701ea0fa312bcd7a4011915201ef89abb", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/Sample2Resolve.java", + "type": "file", + "size": 789, + "sha256": "7e53c551a4424d2f543feb8dc048f9dab91b9b099a3b5d60dcded2b53e6cd43e", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/add-to-ipfs.sh", + "type": "file", + "size": 418, + "sha256": "76ca40d24e2967bece44109ced2e90add5e49fc4e76109109f8fdf131dcde51d", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/input.txt", + "type": "file", + "size": 105, + "sha256": "8b2e483a94c01a7d06b64ac389442c4ab3ae9b7bf328bb15747733d2508dacd3", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/samples/ipfs/sample.blue", + "type": "file", + "size": 35, + "sha256": "93089ee57effa47adb1db6aba5a70bee2c5521fb4bb7d75cbbcf21a434d10306", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/snapshot/CanonicalOverlayPatchEngineTest.java", + "type": "file", + "size": 12277, + "sha256": "a5c0c6aae4228d943a2588829a1e21160373ce11a51c8ff1e5dda7f28eaff4dd", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/snapshot/FrozenCanonicalDigesterTest.java", + "type": "file", + "size": 37475, + "sha256": "5fc75018f57f06440624167f967c1eb844b8ccf1f6da5ff3ccf852d90e1a8b1c", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/snapshot/FrozenNodeDecompositionTest.java", + "type": "file", + "size": 3437, + "sha256": "fce586d82d0d5b7f593f0a27ed9c366c427bbaf37a04ef473e34fcedc0639755", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/snapshot/FrozenNodeRetainedWeightTest.java", + "type": "file", + "size": 4696, + "sha256": "e58a638d9f9eb72ca201a62d63d937da7d95c25f7c6dc6c747000a18ceda2aa2", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/snapshot/FrozenNodeStructuralInternerTest.java", + "type": "file", + "size": 16876, + "sha256": "b95faa2445891e81f310e0f8d11807b6c5f5adbddd411b37dc78246e10ba80ea", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/snapshot/FrozenNodeTest.java", + "type": "file", + "size": 53914, + "sha256": "3c3196910f51c4bb7a2de11781601c222c018fc23598103cfb154954f96a2003", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/testing/RepositoryLayout.java", + "type": "file", + "size": 4256, + "sha256": "97858b7c2a6b91d99b11f9e315eeb32345fbacd1836e5e29a7b420499803ae35", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/utils/PropertyNameNormalizer.java", + "type": "file", + "size": 1922, + "sha256": "09e574204d5816127402e8d19b5166dba43f4b99477bee7d3c964423d3bed540", + "mode": 420 + }, + { + "path": "src/test/java/blue/language/utils/RandomMergeTest.java", + "type": "file", + "size": 921, + "sha256": "faafba13bd7390775bff823cc16f497783ff1abbeb0a1d3b37c09ea6dc13da59", + "mode": 420 + }, + { + "path": "src/test/resources/processor/contracts/all-contracts.blue", + "type": "file", + "size": 1088, + "sha256": "c3e29969bc34ad5eb4be9bf4d383d8263596ff4e4c95fc18e21c85f4431fcb38", + "mode": 420 + }, + { + "path": "src/test/resources/sample.blue", + "type": "file", + "size": 124, + "sha256": "f9066162ccc51a8aae4cc2b5f8e5bce324e2e67af82ec0c1c1fb8b7b8d35970d", + "mode": 420 + }, + { + "path": "src/test/resources/samples/1.blue", + "type": "file", + "size": 24, + "sha256": "ae7d3541a6bc00a316baf70e1baa54b4100237f9189686823b22efea26642ba7", + "mode": 420 + }, + { + "path": "src/test/resources/samples/2.json", + "type": "file", + "size": 34, + "sha256": "654b428327ab9ec94ee382cd9ad0bbb20966779e16a07edb153b49492dbdff18", + "mode": 420 + }, + { + "path": "src/test/resources/samples/3.yaml", + "type": "file", + "size": 19, + "sha256": "4811adfc2252bd4da05cb3bc8c5db5e5d58868acdee5659a8b67d60eb5fdada6", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Detail.blue", + "type": "file", + "size": 71, + "sha256": "1eb9dc9f70a12c1652b14a47d0d2761ac71b3b38b9302dd6b2ee01c0978cf5ab", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Hattori1.blue", + "type": "file", + "size": 922, + "sha256": "fbb083f062444ae23c8b32fc27d13a7e55c9cf922cdb5f897611329e64767cb2", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Hattori2.blue", + "type": "file", + "size": 1779, + "sha256": "b1e0201146add6d86d01bb4311e1cd4f544debcf9225959efc3f481dde9e5dc7", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Hattori3.blue", + "type": "file", + "size": 129, + "sha256": "552429a23629c81d11cac68de9e854ea351f39009dbe65424ba3f405179e7d72", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Ingredient.blue", + "type": "file", + "size": 801, + "sha256": "230d8ba191e5778a43551b3211df14422dd165f5e75dfe1e6dcf9a6e3088336a", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Limits.blue", + "type": "file", + "size": 371, + "sha256": "3c1994d9a1ba100ed00719283bb42c795927f9fd9e33570b107c548b5072e067", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Person.blue", + "type": "file", + "size": 127, + "sha256": "62f7f70f9e90c41591c467574c13d52f3500b6a95e01941cab32b7fd0d5ce7a8", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Pet.blue", + "type": "file", + "size": 205, + "sha256": "024e77bf10304a1eb708952d6dd03cb09e9e77316ffda20b0a9c3c81ec9e2950", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Price.blue", + "type": "file", + "size": 62, + "sha256": "b68958a031250985938b701cb147be129fb0d2846ccb1386bfdca12b8304fdfc", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Product.blue", + "type": "file", + "size": 172, + "sha256": "35937e07f922c7496583741f710f6a05532b448e6153c9170d7a145fd9716fff", + "mode": 420 + }, + { + "path": "src/test/resources/samples/Toy.blue", + "type": "file", + "size": 184, + "sha256": "e5b05768bc3cbb82d9c4b3f855a86f5f28c5a76900bfd8f11f246d4378b3137e", + "mode": 420 + } + ], + "sha256": "30b673793084ded81f8abf73315d6b0d98c8f001399fbb668d60546ade9e7216" + } + } + ], + "baseline": { + "projectPath": "/private/tmp/round13-baseline-project", + "archivePath": "/Users/piotr/data/blue-contract-java/Archive.zip", + "archiveSha256": "2f303afd9435937145ce7fe09eb655ff1a05ee6ed7484faea62d93544a3ccf3e", + "productionFiles": 108, + "mainSourceManifestSha256": "b3a78f551809d377db3a7c50002cc942470dade26b5b4bd14e361085862e92ac", + "archiveTreeManifest": { + "algorithm": "SHA-256", + "includeMode": false, + "files": 289, + "entries": [ + { + "path": "build.gradle", + "type": "file", + "size": 86592, + "sha256": "be8dbadbd3ab8c32af9609cf97b277c39e73b3e3b41766040a76d3b953837ca7" + }, + { + "path": "CHANGELOG.md", + "type": "file", + "size": 2667, + "sha256": "e9e36b68ef94ae49e60b0c6b8fa8d6fe4f1ced21ba94fb86d0d69ef213ffbd33" + }, + { + "path": "CONTRIBUTING.md", + "type": "file", + "size": 2061, + "sha256": "223bbaa3167ef279f8f77de35fe0849bd0a7c575d7d45c32681f3730353f5b3d" + }, + { + "path": "docs/architecture/compact-engine.md", + "type": "file", + "size": 2499, + "sha256": "0bc6ee79e33d8800f61bfe5f43595b56a22a456e19aa4afdd0bc22a6e64895b7" + }, + { + "path": "docs/development/build-and-test.md", + "type": "file", + "size": 3539, + "sha256": "f86477d7cdc214b38eda80323122417c1814fb2114973740edd2fc9e7c3e6a20" + }, + { + "path": "docs/development/internals.md", + "type": "file", + "size": 2604, + "sha256": "d9adbf8ba4bceacec1f5b70774fa4bc3f94254aad5233fae7bada91d1140dfa5" + }, + { + "path": "docs/development/releasing.md", + "type": "file", + "size": 2809, + "sha256": "d674989f2244df58f9b5b26973c19aef50a5fc9bb1b78181ab4a31c0f230a395" + }, + { + "path": "docs/development/test-strategy.md", + "type": "file", + "size": 3507, + "sha256": "3748ede8211d0e66907ddd13711cab56440ce7a6bdbedf918f3ae2ddc457bbf5" + }, + { + "path": "docs/examples/counter.md", + "type": "file", + "size": 791, + "sha256": "94fe0eeb4e6d5cd8cb57c83af158469efbcea0dd62d46a234b466c4439648a6e" + }, + { + "path": "docs/examples/large-host-paynote.md", + "type": "file", + "size": 801, + "sha256": "31c9bd0dca78b3f11993d8fcdd2934e98b5ee35dc5e2f4e4d58957f658874d96" + }, + { + "path": "docs/examples/nba-catch-up.md", + "type": "file", + "size": 933, + "sha256": "68071db1884a4cbbb772a51f773fb8645e0494ad2ef711829057706d87518193" + }, + { + "path": "docs/examples/nba-shared-game-lifecycle.md", + "type": "file", + "size": 2611, + "sha256": "b52250821328749a961675c089c4d6f05d21ffc412a02b65b67361c3190ac2fb" + }, + { + "path": "docs/limitations.md", + "type": "file", + "size": 3107, + "sha256": "09766590367f5652ecb82035c8a6a3356f3e0a413d8abcd092cea6b6d2a2eb05" + }, + { + "path": "docs/migration-from-2.x.md", + "type": "file", + "size": 1134, + "sha256": "ff6c5d364859aa1e3b744efebc0d96d714df993b3504333cbd66dce7860e2003" + }, + { + "path": "docs/operations/failure-model.md", + "type": "file", + "size": 3904, + "sha256": "c2d555ca36ea7912da36507ab740a662ae1549e38ffd2961bf3edd9d688898ce" + }, + { + "path": "docs/performance/host-vs-frozen-time.md", + "type": "file", + "size": 8060, + "sha256": "4b99e72b8c376b0e65fd006d1876d10ba2b0def128436071883a925e5eafddf7" + }, + { + "path": "docs/reference/metrics.md", + "type": "file", + "size": 4253, + "sha256": "ad1e8e7a0bf664b546a2cd399bf617453d4e7802b66c36a8c7fa843223158a0c" + }, + { + "path": "docs/reference/public-api.md", + "type": "file", + "size": 6045, + "sha256": "7bf5e6cb28b4f8bf489c62d7c2b528221e22ea860703c613d61fd41b52880d3e" + }, + { + "path": "docs/releases/3.0.0-rc.1-evidence.json", + "type": "file", + "size": 15911, + "sha256": "9cd10d6baa89d764d19fb71983421636f1fa073fa9ebe0d67705468821ce7308" + }, + { + "path": "docs/releases/3.0.0-rc.1-test-report.md", + "type": "file", + "size": 8707, + "sha256": "6e94c0f1324ed7f0156c455f254c96f2df7e8be2136adc0b48fe094e32647bde" + }, + { + "path": "docs/releases/3.0.0-rc.1.md", + "type": "file", + "size": 5077, + "sha256": "4db09879ad98f587914dc0ebf147ecd7c51a03c2cad98243771d6bda0450a808" + }, + { + "path": "docs/releases/evidence/round11/baseline-large-host-timings.json", + "type": "file", + "size": 19653, + "sha256": "f230aee7f6db4e3d29c8831d1c7654236af6b8e4af3cbb6253daa2e545c23ca2" + }, + { + "path": "docs/releases/evidence/round11/baseline-runtime-comparison.json", + "type": "file", + "size": 10594, + "sha256": "5cd3ba34437f92de9a5efd4e12954aca3b94c82710164aaf507c2257fbcee213" + }, + { + "path": "docs/releases/evidence/round11/baseline-runtime-provenance.json", + "type": "file", + "size": 1937, + "sha256": "d9a819b69c4fa529299f80ba29f0df61458d1dcf19c4dc1fe6ab795be2afabef" + }, + { + "path": "docs/releases/evidence/round11/final-large-host-timings.json", + "type": "file", + "size": 19659, + "sha256": "9cc8eec2f2c51b43ad776d6c4b65ee86114c66f6116bcf6880cd0ddda2f8be94" + }, + { + "path": "docs/releases/evidence/round11/final-runtime-comparison.json", + "type": "file", + "size": 10590, + "sha256": "905f40b44c690fa3a964c5a01c47005659f1c2acf590a4243ad5ac363d24bc64" + }, + { + "path": "docs/releases/evidence/round11/final-runtime-provenance.json", + "type": "file", + "size": 1937, + "sha256": "267259f74cbe941b23aa81dbe850a56004d07522bed1e54f9a2f213ed01925b2" + }, + { + "path": "docs/releases/evidence/round12/nba-shared-game-lifecycle.json", + "type": "file", + "size": 9547, + "sha256": "433b69a010866cc004f92c701bd6f338a770cf01a2efa845df24e907779de38c" + }, + { + "path": "docs/releases/evidence/round12/three-scenario-p95-provenance.json", + "type": "file", + "size": 27776, + "sha256": "754fc50fb92985f35b2e563a46054d85b21f082349537a94079d8f8ee3cf06a0" + }, + { + "path": "docs/releases/round11-verification.schema.json", + "type": "file", + "size": 20884, + "sha256": "e39d0e3f9128a0156b90f237f71cfe28b3074121f86d4368a051d74da0d9ae62" + }, + { + "path": "docs/releases/round12-verification.schema.json", + "type": "file", + "size": 19282, + "sha256": "004d1db5281a76f388051a3db7bc2b0e232fc7839d5dbdf39b26d5feccb9d117" + }, + { + "path": "docs/semantics/historical-catch-up.md", + "type": "file", + "size": 4066, + "sha256": "d3a59f35bcac9ebbc316ca0b75dfb8b7ec94bd6b1c7da7b39bd9b2918e4e58da" + }, + { + "path": "docs/semantics/identity-and-revisions.md", + "type": "file", + "size": 1761, + "sha256": "6ceda5ff886bf526dfcb5324772ff3e55fa5bf01da414755291603bcf5dc3c94" + }, + { + "path": "docs/semantics/initialization-causality.md", + "type": "file", + "size": 2382, + "sha256": "17027ba18527e5ef682fb22bbdd49a4b5c74af5bbacf494142f62612cc957a19" + }, + { + "path": "docs/semantics/process-embedded-documents.md", + "type": "file", + "size": 2586, + "sha256": "774b525e1ad79a85055a16b2cd4363df9e333c15bbbdb21b18ed9de40744e46d" + }, + { + "path": "gradle.lockfile", + "type": "file", + "size": 6364, + "sha256": "29a6e1996f88f07ae56e4c720409c092440bc6ada197125a0dfef01722c3e94c" + }, + { + "path": "gradle.properties", + "type": "file", + "size": 149, + "sha256": "fd73e91317a576be9fd707ad36cef2eeb5ff5dd0cba71163d8cc308fa65827c3" + }, + { + "path": "gradle/bex-source.lock", + "type": "file", + "size": 153, + "sha256": "01c96c7e76c1a75dd6a0dfd09656d6449957fb144dd363f78756fc55685db414" + }, + { + "path": "gradle/published-artifact.lockfile", + "type": "file", + "size": 7929, + "sha256": "b4e7b78bcd7ae92959b61f882a0c762a56484a57d8d6a1388c1ffabb962bb157" + }, + { + "path": "gradle/repository-source.lock", + "type": "file", + "size": 399, + "sha256": "fd3b055108ef65a7d54e09c9d9c619c208a3e1f7518b6e1f514b75d41637fff8" + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 281, + "sha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9" + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59" + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8" + }, + { + "path": "LICENSE", + "type": "file", + "size": 1069, + "sha256": "483137f72d5dd7a31bd0e8a0c6931443b3f378f6b2f1ff0d9afa721da3bc7c14" + }, + { + "path": "README.md", + "type": "file", + "size": 4380, + "sha256": "9aa565c33ba1f1d304fec70d61a882ba6206de6f9bbcd099542ccccca29dae52" + }, + { + "path": "SECURITY.md", + "type": "file", + "size": 1070, + "sha256": "1b8efea9fb2fdef0727a90bb06c7182599c4a6587afdb327f10c7adaef7e9d54" + }, + { + "path": "settings.gradle", + "type": "file", + "size": 1401, + "sha256": "a7ca5851f9f6632071ce12cf0f62098d995ec9ac2462ee003a187c23b62dd6cb" + }, + { + "path": "src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java", + "type": "file", + "size": 12440, + "sha256": "78496c9c639ff104673be6c6bb790fa567187027a7d09b5b407583c42c365d64" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java", + "type": "file", + "size": 3011, + "sha256": "f6f17f73e85184800c11634a7e60b0528c4585cd7b4c44220b4b7cece8bf9419" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java", + "type": "file", + "size": 4976, + "sha256": "9c1e965de37749ef7f36607cdaaeb4962c2c29ef02fdd0f78f5dab9a4d128b60" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java", + "type": "file", + "size": 514, + "sha256": "380b431289752f6665ca59fda1f325429730b5bb684fff944ba2df74543e4ded" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java", + "type": "file", + "size": 4680, + "sha256": "d0a273adbc99c0c18a4fc7ff3a64026cb43c387998b4ad1088c3f2286638f201" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java", + "type": "file", + "size": 10221, + "sha256": "2c942d0a6bd84d3a1987e352642e7b4442798899bf4b6e2027e6b397bb407b1b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java", + "type": "file", + "size": 9870, + "sha256": "e23826a96e7b599bb7f9feef8e807125e08417add80b486cd9ecc2363d618e29" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java", + "type": "file", + "size": 6706, + "sha256": "3104429a73c3a3b23251bc79472f203550aae28d0e884715b23a290ada46c93b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java", + "type": "file", + "size": 10201, + "sha256": "328b69fc78772bfe088c74cb6512a564acd76a735300303b940eb56f5c02a10a" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java", + "type": "file", + "size": 4593, + "sha256": "e2bfb328a215690bd46d2e0be00aa8aa5ee2508309fa3ae0e537611d3bf8d2a7" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java", + "type": "file", + "size": 4675, + "sha256": "f82870e379becec8d97c9aabd8e64ed161d98955f71c3c139d79478dff7e281b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java", + "type": "file", + "size": 1441, + "sha256": "12f539f7f7abb65684638edf2f27454c03942d1be926bfb1251609a5f2c05be3" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java", + "type": "file", + "size": 5192, + "sha256": "e0abdba40898c7b32d6a6e144671465d50a4f55616ff00fa80dbde5126620750" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineMetrics.java", + "type": "file", + "size": 451, + "sha256": "e6e29db83c762bb3e3f8d31cd8135829162093442790de0099d99d291bd3c0fe" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java", + "type": "file", + "size": 4430, + "sha256": "ffb6d657da46f1c40002db86a4c8d6d08f3935cb74d2b5d95bebb07d45b43c6c" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java", + "type": "file", + "size": 4375, + "sha256": "bdd966ee344b2408f3928e36aeaf468a08d04ffcb1f3ded080f695748975087b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java", + "type": "file", + "size": 22201, + "sha256": "670730a7c01fa0954542096d9a871bbfe27a4345f20e3d7b1feeb0282347d318" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java", + "type": "file", + "size": 6789, + "sha256": "ccff385ab6725a464275bd091f4473ad112995457e96c5c15386ddbfa2da0e5e" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java", + "type": "file", + "size": 7710, + "sha256": "17fbdba43aecd38bd7bb962ec72e3430dcb94104484d0224f8deadd4566b263a" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java", + "type": "file", + "size": 19999, + "sha256": "83a6f2bd173c345ab02a2bd3d75342fc13099aa59b27913b794e21d2b634602e" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java", + "type": "file", + "size": 5891, + "sha256": "1e6fec04d5e15a32c87e73dc4edeac38ab5527181b8892c7f14eaf3ec9ed7752" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java", + "type": "file", + "size": 7047, + "sha256": "985bd959dadde30b676465fe632ba278b19715c9c48226445ba8bdbbbf9cac65" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java", + "type": "file", + "size": 3532, + "sha256": "0a948ecec4c6f6055aaa904d691dc463ad5348859e900ef3cc3e17cfec57c91d" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java", + "type": "file", + "size": 4414, + "sha256": "a4feb1e24a26bbf9e27b47de7ee3b543e9e0f957255319e873b271ebb23ef177" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java", + "type": "file", + "size": 10487, + "sha256": "e77d51152af77ac8ac596ed9a05ed716847637a026163b023c25db075ea6c959" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java", + "type": "file", + "size": 5759, + "sha256": "cbdae0f75ebbe6f6025f99b94acc7b829ad4f618a0ede82002c34126b2c28209" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java", + "type": "file", + "size": 4670, + "sha256": "508e313ed7301271c77d05f0309f37db0d23e30fb9fc0e553820ce95d4cd5d2b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java", + "type": "file", + "size": 11619, + "sha256": "d18de80ec40d21f356a90fc35d3853b73739dfb5776af3e62f2b58c23e7b7f90" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java", + "type": "file", + "size": 6796, + "sha256": "31f83a4d27f5b1f3f6e5e883872a1a856ba0d5c8ad118457191ebf33be48f47c" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java", + "type": "file", + "size": 5511, + "sha256": "4faa69118ee5ca0e702e65bf4f082c3c165887ed7c97e7a820bac1b85958c97c" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java", + "type": "file", + "size": 25437, + "sha256": "585e261777a66d55e484588de93bdde693b520d92246e16791f1bca69d004691" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java", + "type": "file", + "size": 8418, + "sha256": "ba3ed3185ea834f29d82146b647fe542ea7243f27dc06777d0ae7f533e5fd902" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java", + "type": "file", + "size": 23996, + "sha256": "40ed6760d0154c23546d8cdd56c55fc10ebb9e4a238dbbe642a95d8b6e528467" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "type": "file", + "size": 4285, + "sha256": "294e2090b5b6a1cf268d0023d75dfc14d4f6e50ed05c1a7a91ef1601536c2cc3" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java", + "type": "file", + "size": 6508, + "sha256": "faf106c2f001f8a1ca3718ceeeabb7b0ced02dc89d7ae5a272907a448961deeb" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java", + "type": "file", + "size": 5467, + "sha256": "fa70b05d2a41d1c3d4a2ec75b3f14f1a46f5aa24bfc4a9e922df8886a5932d77" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java", + "type": "file", + "size": 14000, + "sha256": "d91349d08b0de841c13a30060ee744034190b191fb219c7aba6d169ded7c73b5" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java", + "type": "file", + "size": 6939, + "sha256": "efce315cf3fc73fd61f20e6782dbf27d533bd76e1e66909b20c9bce614ff3812" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java", + "type": "file", + "size": 2896, + "sha256": "2b2ccb52f2022b45ead879d43800be38d5999e84f892f3b6590416c26427f46d" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java", + "type": "file", + "size": 13917, + "sha256": "1d53341ee4e10fb4212071b0df50a1ef3ae285e171e8a0feb64499e41da41550" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestEngine.java", + "type": "file", + "size": 10275, + "sha256": "e7328f5f744d5c9961a9f7f3068200313cc5dd774a18f675af81234c8e4b229b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestResources.java", + "type": "file", + "size": 623, + "sha256": "f009e1f1f06ee77532dd0d4ec6a0060d788e6cc269332c57c9764bd4b12cbdcb" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java", + "type": "file", + "size": 3800, + "sha256": "c78ce197d92e6c188a1f2e5ceccb6b989f5b8b7e568ed95784ee609e4ce56361" + }, + { + "path": "src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java", + "type": "file", + "size": 9668, + "sha256": "e98771126befedcf8bdce2bbc48dba401493331af0c2d8305ba332a62af35834" + }, + { + "path": "src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml", + "type": "file", + "size": 1016, + "sha256": "8e742418d6770518666c73e5df73ee997b6457d6524b89742fee8d09afc4de14" + }, + { + "path": "src/integrationTest/resources/examples/clean/composite-routing-counter.yaml", + "type": "file", + "size": 1067, + "sha256": "e459db2cb88face8f3d0b59b968aab5521f378506b97aad0bcef7f8d9e2f98a0" + }, + { + "path": "src/integrationTest/resources/examples/clean/counter.yaml", + "type": "file", + "size": 1781, + "sha256": "11fa9fc75576aed46469325b0277833cd906c37ed2c65065c3a8b95a53e7bc2b" + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml", + "type": "file", + "size": 2473, + "sha256": "b54ccde1413c39cbf4d1f5b3443e2e358bc44deb9cd87c67c43b257d179e02d5" + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml", + "type": "file", + "size": 712, + "sha256": "53ca74bee658d05133e4aeb58bfc7d9abb4b937b6c031d2ebc81c47a5d15cadf" + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml", + "type": "file", + "size": 2858, + "sha256": "0d46e54b59e3e066e51c133ec37da101201c8084746da3f4216bdebf1cb755fb" + }, + { + "path": "src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml", + "type": "file", + "size": 3815, + "sha256": "0d8d6e8dcd4e9336af0c2665ce007bf49b3215dd1c3bff8ba40fee1f48e5aab2" + }, + { + "path": "src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml", + "type": "file", + "size": 1387, + "sha256": "a6ee31e05a0315d5b76c3317eeb87fb2001bb351274d12a2f100c19364d79b9a" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml", + "type": "file", + "size": 2232, + "sha256": "55b4039a06c5122af2673a8df0fa4ce24999a272ca0c8d97d97113017e513794" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter-B.yaml", + "type": "file", + "size": 685, + "sha256": "c279094dbc51e6808b57df32900d309128c4a208ed1cf4ead18d3e429e573b76" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter.yaml", + "type": "file", + "size": 861, + "sha256": "b316afb6cfb8916d39a7fd7238949e4b0a58b4d72a0b4b4841459ee40895013e" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-middle.yaml", + "type": "file", + "size": 1636, + "sha256": "f8ff02ba4b96ecd15e6a37a97c8b0bd823ddeb759ea98009752c33fbb453de9e" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-parent.yaml", + "type": "file", + "size": 1806, + "sha256": "6b59cc2ec0caa942519d8dd3acc8551f2ccd304e0bd62546d316694168494bf2" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-root.yaml", + "type": "file", + "size": 1667, + "sha256": "6867661338a8aad572a175cd2c17583232638d630e8f1ed7778229859c82a7c0" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-state-parent.yaml", + "type": "file", + "size": 1721, + "sha256": "1fdb042ca076370a728fff9f85d17d4943e0a02b9ef69a2ed49f4c30fd980f8b" + }, + { + "path": "src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml", + "type": "file", + "size": 2298, + "sha256": "55df230d6bf92d2bdbfa6b183bc4c251f6b973405fb7d0e663f4b0f29f7b5bff" + }, + { + "path": "src/integrationTest/resources/examples/clean/large-order-host.yaml", + "type": "file", + "size": 61233, + "sha256": "fef41c534a7d17857e9d16b96431caacb8bfebda48c9f0d4319bcea6e27de12d" + }, + { + "path": "src/integrationTest/resources/examples/clean/large-paynote.yaml", + "type": "file", + "size": 46821, + "sha256": "717bbb6eb03c0a9152a02bbcea1fc7d7ba8c8cafdbdf891ef2d23a7a0e2ca0ad" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game-host.yaml", + "type": "file", + "size": 3088, + "sha256": "4b5dde50c0f4c207df1565a21f23236cca7fc235be0fbebab518676d123c8223" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game.yaml", + "type": "file", + "size": 2743, + "sha256": "b14276e9dc6a4b466f6c8b5768adea908debe5cf0e824505fdd044c3b60d3364" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-round10-slate.yaml", + "type": "file", + "size": 4543, + "sha256": "cd901c6ea01cd88d076bf6e8059e8d9cab0771aebf8a9f17e869b4b3f16678f9" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-statistics.yaml", + "type": "file", + "size": 2075, + "sha256": "995d90a08f8e2aa44a5909c96e7f3cc55251f96ba9ad658966ff3d1ffe8a0e2b" + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml", + "type": "file", + "size": 1962, + "sha256": "ec74999d4773a7b2b295e4283fe46b6736aaf9edbf28610690e2083035b3cdec" + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml", + "type": "file", + "size": 1688, + "sha256": "68eeec3a735088787f2d51975fc5302cef23b6acd93881aee9f805134b627a5f" + }, + { + "path": "src/integrationTest/resources/examples/clean/ownership-parent.yaml", + "type": "file", + "size": 2131, + "sha256": "89553db67b23c3f8cb1b0afbf858a508c67ae7540058f6ce2d1abf1143c2e6d4" + }, + { + "path": "src/integrationTest/resources/examples/clean/package-paynote.yaml", + "type": "file", + "size": 35820, + "sha256": "bb8c0e1baa6575c39b60d9479684661e66a8499c408d770dbee3ccadfcb4d964" + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-child.yaml", + "type": "file", + "size": 634, + "sha256": "42c20ca938631c29e49ba00e50a307ff50699e19f35493b106855f6bc5457555" + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-parent.yaml", + "type": "file", + "size": 2425, + "sha256": "2ff67f0de3a2062f3944a1b9f01db25c92ed71ef78496e984a4cefe990510b2e" + }, + { + "path": "src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml", + "type": "file", + "size": 1663, + "sha256": "7b0a2b7df4a5b12c3ddc7903a1a37d5300da408570329787d0d66f04f48faac9" + }, + { + "path": "src/integrationTest/resources/examples/clean/three-child-history-parent.yaml", + "type": "file", + "size": 1835, + "sha256": "de40d09653378aac24047833db002198a3721a3f44a22038fa344bef2f7bb307" + }, + { + "path": "src/integrationTest/resources/examples/clean/whole-request-sink.yaml", + "type": "file", + "size": 1195, + "sha256": "09987601d39a2797dcfd3498c7025b53731d9c2180e9317b6465a16be202d8f1" + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml", + "type": "file", + "size": 4278, + "sha256": "bb3ce407a600e8abd4157b33a82958076a60429dc2f9b14a90e4ca426f31a9a7" + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-path-host.yaml", + "type": "file", + "size": 2912, + "sha256": "aced734ec5af1bc2328074ae93d304bf95400e7de26e2efc1de864af640ba837" + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml", + "type": "file", + "size": 1000, + "sha256": "e07e98fd746bc23b42e398d9026acdec297a5a9adc861314a64f9e7793e96694" + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml", + "type": "file", + "size": 3371, + "sha256": "28756bc4bb33918219fbb7196ae648301a480af19f1f4035ab181612d372edd0" + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml", + "type": "file", + "size": 900, + "sha256": "03944ca9332879ce65f9b407d0711a64d943e2f81100ddf087a855260d7e8b3c" + }, + { + "path": "src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml", + "type": "file", + "size": 2498, + "sha256": "975eca38288929d7340190e7310bb45f72ec2ea2bd5553976c4aec7165c31df7" + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "type": "file", + "size": 3386, + "sha256": "bf1b7998dd9064f32f04d2ba285b5afd449643abf77f3e3563b60f472e3e9121" + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml", + "type": "file", + "size": 4314, + "sha256": "12ce455c643098c28af4baf9356a4d1d6893809a2f838c7bb827044856143900" + }, + { + "path": "src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml", + "type": "file", + "size": 5185, + "sha256": "a0f5279b934197fdf260b3e0d08b06b6d24abf8004e02c3b09c6e3817ae1049c" + }, + { + "path": "src/main/java/blue/coordination/api/ActivationMode.java", + "type": "file", + "size": 666, + "sha256": "79ce6f7662fc4671a4ac1a7a18d84d7cb7696a63687e5ceaecffd6e68c8d8893" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationEngine.java", + "type": "file", + "size": 6450, + "sha256": "46ec1dafa2e4c58e7a836f412f91dadcfb49be6a572740f9affb85a88aa7750b" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationErrorCode.java", + "type": "file", + "size": 1370, + "sha256": "c449b951d8e993dbfafb5514ed5e1361172c5d01a1aa2706c84c9956ee19c3e1" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationException.java", + "type": "file", + "size": 1470, + "sha256": "2766012278f72938976738a0159b44c2764413052e83e96131414e757ef7b36f" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationMetrics.java", + "type": "file", + "size": 5968, + "sha256": "e327ff223ab536ffe848920841e47ef1600b3fd568ba7ffd532d471cc46d448b" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentDispatchOutcome.java", + "type": "file", + "size": 663, + "sha256": "10ffbf0910304962f5b173a6e6a9ec349394b48301765d373be5fcc7bf0ffe2d" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentId.java", + "type": "file", + "size": 1071, + "sha256": "60f8585b74680cb76f56d551f8046c7aee38296b650589d2681308bc75a95bd1" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentRevision.java", + "type": "file", + "size": 8200, + "sha256": "d98e687f347994c1b396b76d90b5e497f55f30fd765fe60feff52353e2dee0bd" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentSnapshot.java", + "type": "file", + "size": 3850, + "sha256": "df6df15e2d87348efb66f10cf55239e75c39760f9fa16e28018a8d351faa40da" + }, + { + "path": "src/main/java/blue/coordination/api/ExactValue.java", + "type": "file", + "size": 4956, + "sha256": "d36091dec85df288e8d47aa5595706073d61f76500b498bed50a13cf8d52dafe" + }, + { + "path": "src/main/java/blue/coordination/api/Operation.java", + "type": "file", + "size": 2715, + "sha256": "c8fa668f948715977d9d24b4beedc7b8114406d92c15052a72c54a8b0d33d180" + }, + { + "path": "src/main/java/blue/coordination/api/ProcessingDrainReceipt.java", + "type": "file", + "size": 4920, + "sha256": "b291f998ca2e408b82dc333918f03263a8b24d8dbc4aecb57e2e9d73c0d039e1" + }, + { + "path": "src/main/java/blue/coordination/api/SessionStatus.java", + "type": "file", + "size": 579, + "sha256": "75c061ebeab1ce1d4820e7117d239c4d019d90a7cc625efd96451d84dde495e4" + }, + { + "path": "src/main/java/blue/coordination/api/Timeline.java", + "type": "file", + "size": 677, + "sha256": "f92011beb2999ce36db5733e8f6af9c898fabe782da8e5d81640d7a55b6fe15b" + }, + { + "path": "src/main/java/blue/coordination/api/TimelineAppendReceipt.java", + "type": "file", + "size": 743, + "sha256": "9c0011629e52d54ae85700e6bf97978a21b2ad74b01b40b0ecc6fa5481667443" + }, + { + "path": "src/main/java/blue/coordination/api/TimelineEntry.java", + "type": "file", + "size": 1862, + "sha256": "3541a8340dc9c7d568467b76853abc4a70feadf1c43784f6c76eca979220ec10" + }, + { + "path": "src/main/java/blue/coordination/internal/BlueRuntime.java", + "type": "file", + "size": 16365, + "sha256": "06ba2a04124a0c9f22e442110bdd457a54ecd7bd8617dc7fdf369a099a17e9cc" + }, + { + "path": "src/main/java/blue/coordination/internal/CatchUpBarrier.java", + "type": "file", + "size": 6889, + "sha256": "72586ae7095da713645feba5a4415fc1f1e0b48f1612bbc05f4a733f507e269a" + }, + { + "path": "src/main/java/blue/coordination/internal/CheckpointDomainEvidence.java", + "type": "file", + "size": 3196, + "sha256": "aab3b12ceec18ef2a26388ba6ffbfdfe9a820e25e4a4dac9674f68414e4ef49f" + }, + { + "path": "src/main/java/blue/coordination/internal/CompletenessEvidence.java", + "type": "file", + "size": 1993, + "sha256": "0ca8f7dbaa30ae223a9bae6a14763941707ef841ef4f19b9889f4bfeb143e59e" + }, + { + "path": "src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java", + "type": "file", + "size": 32117, + "sha256": "8165cb8f8f9fbbbcc1ff7ba0dd10f963db4a42efc98d91316b4b1bd604358a81" + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentIdentityReader.java", + "type": "file", + "size": 1817, + "sha256": "5cbf9dd47b0b7637cef370721a76536a0cce84faf0551d5667577013edcbb874" + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentSession.java", + "type": "file", + "size": 12903, + "sha256": "d9686a96b58cda59d1bb361785603ba72e27b4f2faf610cbd321ec3833b49658" + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java", + "type": "file", + "size": 46540, + "sha256": "95a80fe17de9bef8de5e900a6abaedc809de0aaef7e80e14b4d10695691c0e9d" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedBoundary.java", + "type": "file", + "size": 1014, + "sha256": "66b0357435d1e8e4f1f866335581de80fe74ddc1b7242bc96a100e97cae399a3" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedEpochCursor.java", + "type": "file", + "size": 978, + "sha256": "bb6d55e3af2a136fbe38f8d97574ebb153436a94b043679455deb99068601048" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedEpochInput.java", + "type": "file", + "size": 9950, + "sha256": "9b298c77ea0e762b111735d43a8f028a8bdd8de78c955c3dc99f9e8b0f2bcc4c" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedLayoutPlan.java", + "type": "file", + "size": 7864, + "sha256": "75ae055f027322e2093ecbbd8c485d3938e04ed5d3c40524cdfd2b514aa4933d" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOccurrence.java", + "type": "file", + "size": 919, + "sha256": "25710aee0ce926adf0a1ba3db07902e67a4c1f9477db13d12acaf3d65b6e16e6" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOnlyLayout.java", + "type": "file", + "size": 3744, + "sha256": "ed03ee6f1cac01f42c948ffa21efed4cf43b20fb0b8b5549b2694bb0b1289a6e" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOnlyLayoutBuilder.java", + "type": "file", + "size": 26664, + "sha256": "f4f6e3a88502916012b7485c4f105734ee4fccb0c0be0f322ef5ca3ec732737e" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddingBinding.java", + "type": "file", + "size": 3985, + "sha256": "e911f6da1f114c7a219ef492e84ed561a586ca5947c332993714c39a6c84ac2e" + }, + { + "path": "src/main/java/blue/coordination/internal/EngineMetrics.java", + "type": "file", + "size": 7864, + "sha256": "f4715484267abfe97f58dd23b927ee586eee6bed103ac529d7cccabfe4e95cd9" + }, + { + "path": "src/main/java/blue/coordination/internal/HistoricalAvailabilityControl.java", + "type": "file", + "size": 683, + "sha256": "7bacf10f06efccdfcd64e4a9492e357a2e6c35e7a898816889a921c430c3c3e0" + }, + { + "path": "src/main/java/blue/coordination/internal/HistoricalStep.java", + "type": "file", + "size": 2423, + "sha256": "8947f15a61214f92fd6f4306739961a46b86c9c07a038ae7dcc57d9b3dd5147d" + }, + { + "path": "src/main/java/blue/coordination/internal/InMemoryDocumentStore.java", + "type": "file", + "size": 1636, + "sha256": "f228640af729383957e5bfc5af8e38365c59117384a1bf236755b86c7bf473aa" + }, + { + "path": "src/main/java/blue/coordination/internal/InMemoryTimelineJournal.java", + "type": "file", + "size": 15319, + "sha256": "b1888f16d53934d7950a16c27b94527040eefe2c7b342d3c645201df5c452fb0" + }, + { + "path": "src/main/java/blue/coordination/internal/InternalProcessOutcome.java", + "type": "file", + "size": 862, + "sha256": "583da428dcef1e879637a40b1d5ceb1b3a000d3c05955a19adb44c99f613507a" + }, + { + "path": "src/main/java/blue/coordination/internal/OperationRouteIndex.java", + "type": "file", + "size": 13446, + "sha256": "60b24035f260b87662b41d74725d6de83688b5b93a2d5b9e7b849fbacd3ae1bc" + }, + { + "path": "src/main/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshot.java", + "type": "file", + "size": 12510, + "sha256": "ea9d88b925098e9fce76e20caebb9b90c7cf29e032b0b524ff68acc0f04295e1" + }, + { + "path": "src/main/java/blue/coordination/internal/RoutingSurface.java", + "type": "file", + "size": 12774, + "sha256": "4e00ddd669196ebf2036264861df83d52ff7814f77e8fabcfd49622a0678e0f4" + }, + { + "path": "src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java", + "type": "file", + "size": 110264, + "sha256": "25608eb253db692bb8c37ecac6eaddfe16f7efadce33d0e1c792af28fb7c5459" + }, + { + "path": "src/main/java/blue/coordination/internal/SourceSurfaceIdentity.java", + "type": "file", + "size": 8380, + "sha256": "1a23b305455fbe2381f3f98eff0494ed4ba0b0fe5acc503f1cb59aad5a74bae5" + }, + { + "path": "src/main/java/blue/coordination/internal/WholeObjectStore.java", + "type": "file", + "size": 10161, + "sha256": "4e5dac2eba1fafdbb071ec17d729ae3274180d7e42c201d4e0adb1118033445d" + }, + { + "path": "src/main/java/blue/coordination/internal/WholeRequestEntryFactory.java", + "type": "file", + "size": 11951, + "sha256": "50812a6238555f962b2e49d3067c60c0e161bfb0a3814cedda88399ac9db4314" + }, + { + "path": "src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java", + "type": "file", + "size": 5256, + "sha256": "303688c2d25429e9ea26e29d042cccf51a62ea3402c91b3fe2edb263bef6173c" + }, + { + "path": "src/main/java/blue/coordination/processor/AllTimelinesExternalSubscriptionFunctions.java", + "type": "file", + "size": 8576, + "sha256": "93de278eb76efbada326739e33062f3de2ebd17de2db49b54f8bd2f38a7b33bf" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java", + "type": "file", + "size": 73529, + "sha256": "17bcd73edd7c4f72c089f3cb27b2a2a9da5dcbf9767026537a23a27d845ac68c" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java", + "type": "file", + "size": 8031, + "sha256": "82916b18749b3fdf32a579ff97c0247f528f76ab890f686f16ea6485922d76aa" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexWorkflowStepContext.java", + "type": "file", + "size": 1023, + "sha256": "d53b007d184b4e8cb5cdc61e318f072e8355b6016b417871c18a46bd1528ea77" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/ProcessingEventIdentityObserver.java", + "type": "file", + "size": 1366, + "sha256": "c748423c4bac185498560937d7b9fada3913c7fa94fe7e79b1190dacbb0052fe" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java", + "type": "file", + "size": 16256, + "sha256": "53d7fe70598b3c9b1214ec95b72b059dec846b9c09b45932401639fd812569d8" + }, + { + "path": "src/main/java/blue/coordination/processor/BlueSemanticIdentity.java", + "type": "file", + "size": 5422, + "sha256": "bf776957e6a78bf12eaf60e167bba3beb75151b6845b6d98992c598ba6194977" + }, + { + "path": "src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java", + "type": "file", + "size": 2389, + "sha256": "1e8b60e105c48112f45335a33774c870310041f31725236b2ff7a6594396369d" + }, + { + "path": "src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java", + "type": "file", + "size": 5834, + "sha256": "0cb608cf6f7a7f1f74270acc70732eae83f41aade7ccfee6613d98e5bc260608" + }, + { + "path": "src/main/java/blue/coordination/processor/CompositeTimelineExternalSubscriptionFunctions.java", + "type": "file", + "size": 8278, + "sha256": "3ecb0ab1d3ef9e7da82fac1f6d9d873e2a96b72e0f962254e1bf22dad466db36" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java", + "type": "file", + "size": 1345, + "sha256": "6f33041450b2b4ce40b4fdb2dcd1c1cd9a6fbac2e6025fb98f87adef5172bc7d" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationCurrentRepositoryIdentities.java", + "type": "file", + "size": 6199, + "sha256": "75298ca2b99c7cd458e0a969fb4f2ae30b43e4094adbcccd978ece18aeab6e59" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationEventNodes.java", + "type": "file", + "size": 37307, + "sha256": "5eff1567cef6d11baba16fddc58f0a80d7f132b5ef20221314e27ec335028fc6" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessHeaderBridge.java", + "type": "file", + "size": 1010, + "sha256": "b97bcfaa796b91e8240bc400e4c2fc7858411e03c898dfd059c55e79d7bca8bf" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java", + "type": "file", + "size": 5742, + "sha256": "7ffe2557650ad9817f247114be810c94d57a48f7f9c0f807dedc94649ee4f3fa" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessors.java", + "type": "file", + "size": 14822, + "sha256": "d5479be29e90942632748f566239b9a02693af77887e11f27d76bd3db9cfa3d2" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeGas.java", + "type": "file", + "size": 3567, + "sha256": "b47b849723d1fd4659dc37e5a96fec2a80a29ae76037eff584f0ed2202edbc73" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeLimits.java", + "type": "file", + "size": 1249, + "sha256": "c5b57bf6863993875915916c6380de2bd0e80755b39b4900f5be24e91e88f2ab" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeRegistrations.java", + "type": "file", + "size": 5870, + "sha256": "504e34d80c3e9da73dd0b34a3c4b54b983b783d0c4985a7f105c3ee15a91d97c" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationSemanticTypeIdentities.java", + "type": "file", + "size": 7927, + "sha256": "b5d62a7fff3c578cde361a7079063c4b3cc9a20f54704d44a9d8765b072d65d9" + }, + { + "path": "src/main/java/blue/coordination/processor/CurrentRepositoryMarkerProcessor.java", + "type": "file", + "size": 905, + "sha256": "3dca459f91a9b4c5194fda340617d82eb21299406980122bc4b745cdb3679ad3" + }, + { + "path": "src/main/java/blue/coordination/processor/HandlerChannelResolver.java", + "type": "file", + "size": 2014, + "sha256": "b3a9d8382160ae54ab216fecea24d4936581bbe42a796845628793fb9668b5cd" + }, + { + "path": "src/main/java/blue/coordination/processor/OperationProcessor.java", + "type": "file", + "size": 1290, + "sha256": "a76a31c9ca445c8ba3fd7a2dfd396ae867230f0912fda1ef8ceaf8cd35963200" + }, + { + "path": "src/main/java/blue/coordination/processor/OperationRequestMatcher.java", + "type": "file", + "size": 3870, + "sha256": "90605c1b6700e3bdfcd607c2065b9dbe211bb72bf3de3074ea4634afd4bebc87" + }, + { + "path": "src/main/java/blue/coordination/processor/OperationRequestRoutingFunctions.java", + "type": "file", + "size": 5853, + "sha256": "0563c636de339796973e74dda6a17272f538ecec125da0b3f7df05df32756a11" + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java", + "type": "file", + "size": 1855, + "sha256": "2322c2fdd2bc80b859b267cae1139a03e0edf2c0c32d28b7384df0a8f86fa646" + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java", + "type": "file", + "size": 2783, + "sha256": "501f5e8bc7a84f40706ce48952ccb6c95b057aeed9c81634505b27ce7b4c6f6a" + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java", + "type": "file", + "size": 2709, + "sha256": "11c97379b72d470811d201ee138ca1b6f5416573a7e836d687283f521ef35a2d" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationBexIntrinsicsSupport.java", + "type": "file", + "size": 4518, + "sha256": "5b28a5ed4a8a90e642ebf635c384912b044964f5f328ca321365c624f2e1f007" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationProcessHeaderSupport.java", + "type": "file", + "size": 7566, + "sha256": "f57ad7aac649d932e14916b80c05e7f179ae8f9c2c271eddae8c47c7130eb6a0" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationRuntimeGasSupport.java", + "type": "file", + "size": 17535, + "sha256": "27a287f1d596c3ec90022d284f34d1bf0be54472581017320d7141a3fbd071c7" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationRuntimeLimitsSupport.java", + "type": "file", + "size": 771, + "sha256": "6d379f96c5d80e93eb58b3f14d495e214dc602c3fee5b2576e121b028b0eca8e" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineChannelProcessor.java", + "type": "file", + "size": 2465, + "sha256": "8a1661cf357ad585804b331d1a1954a1ab799d576d7b0f8834d3a98cdbf642be" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineChannelSubtypeProcessor.java", + "type": "file", + "size": 3076, + "sha256": "ca6df55d4df3ea750038540d5e4da53317749a2fa44a598077970e931535f454" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineExternalSubscriptionFunctions.java", + "type": "file", + "size": 9691, + "sha256": "eff291b0d52799e607f6382a34c2f5199b9865fa1b562dbcb750ce2ec1561b0c" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineMemberSubscriptions.java", + "type": "file", + "size": 6415, + "sha256": "bc3b4ec6373505da8a6be320274c85bc73dbd9843f60bc5cd6e80780db9584bd" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineProviderSupport.java", + "type": "file", + "size": 30237, + "sha256": "4d860258e47559797303a464bdc64d4c3bfd5453bac8a42be3ec4fb7b23801ba" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineSubscriptionProjection.java", + "type": "file", + "size": 20284, + "sha256": "5b89382fa2624deaaeb38518dab034b95840baa9249ba53452c28039034c6de6" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java", + "type": "file", + "size": 7035, + "sha256": "3cf75791f45396c488179a7115ca02648e2dab2e71de17aca8efa6bdd6dfdfc9" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java", + "type": "file", + "size": 3786, + "sha256": "91a530444649428cf59d102194a5ba4fed1ed37c6090a408422453a082454c1d" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java", + "type": "file", + "size": 12855, + "sha256": "5d2a42652ea8d04ba4e29600b7abeb683ddeb5f04f85de2f8965f040b6a385a4" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java", + "type": "file", + "size": 9477, + "sha256": "7411943c73250a55f2e18870beb9b9cb8aa3966f43ada4d63919b9b9a73b39d8" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramPlanCache.java", + "type": "file", + "size": 8080, + "sha256": "ec34ef76b715643e61ec7c6d1839bb0819ea81926c65054679c3e023088bf7ac" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java", + "type": "file", + "size": 30355, + "sha256": "386969a8bb8e8ad6db60f6c54200e4f8154507585e99380e59265a5c8c53c732" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java", + "type": "file", + "size": 424, + "sha256": "e0b9d99cd0f8f2270031677ab55831ee4f7b5aff2a4f563bf3505c38c72fe312" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java", + "type": "file", + "size": 14508, + "sha256": "e2dcf639efee652e2baadd54326809a9377e4eb446276deb9ac11fde945aebf8" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java", + "type": "file", + "size": 3653, + "sha256": "b2bb8336b55946701014f43d50c74cfd15b651389f6a6fbb2c2687333b7c7a77" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/NodeUtil.java", + "type": "file", + "size": 2738, + "sha256": "d57d18cac1ebc953562cb72e67e6ac59224f044d91b03955558f0d4d72258356" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java", + "type": "file", + "size": 18477, + "sha256": "1fba96f4bde1fcdc72329a6529895270c4b3360ee4b676d1b7d7a3ef9e9128dd" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java", + "type": "file", + "size": 6288, + "sha256": "4fbb99d2b295047f55a591deed9fd820b85799416dc823593f91b680393b57b9" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java", + "type": "file", + "size": 30137, + "sha256": "888205c2fb8d0fb9d2945c8d8185abbeccfbd577b4a0d8e2dc02187669ffad11" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java", + "type": "file", + "size": 9855, + "sha256": "5739dd4e5d6ef4661794242afc6e2291708dc0a61cb14630a1642750e7829ae7" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java", + "type": "file", + "size": 13844, + "sha256": "06df499e090b7c0758d3a802c85ae21fade4ef2add9f91b8f0df34a37f04c58d" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java", + "type": "file", + "size": 2380, + "sha256": "7c6525dde55bc5818b772555537b805dd5e3fa8477b4afaa01153ff2848e1f2c" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java", + "type": "file", + "size": 4009, + "sha256": "c4f07ab0c0ba2f39e7a8c6f45e386646671dfa86ab8e2405f81ed4fbc1048b93" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java", + "type": "file", + "size": 12700, + "sha256": "e7b5a224db28f218cb34537c271361d0fbc701429b7f0761f16330d3004f6196" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHost.java", + "type": "file", + "size": 14208, + "sha256": "abee6405f8d9b6a03943660ffd0647694e242f9086acf4ab3c8d16b031907b5b" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowExecutionState.java", + "type": "file", + "size": 7107, + "sha256": "bb7c30387e2e103559d010adfae80585417899ff6247fdc5e0fc6b4f926a1acc" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java", + "type": "file", + "size": 1220, + "sha256": "49fae0b32d22093bc23e53ad0b3791c9130db7f371750b7a772bee8f98daa13b" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java", + "type": "file", + "size": 433, + "sha256": "0995f54a1b8569698cec726840b0feb930704be469986c06976c3587e02213b9" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java", + "type": "file", + "size": 1937, + "sha256": "10e29bdf6f90455a6cee5e0c3d3a62ca0f52db28d42eaa0b9e32a03af38ed50d" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepTypeProfile.java", + "type": "file", + "size": 6282, + "sha256": "ef1785667b008ad04699250e50ca82c744ec3ead9d4ce3152b26fd311d9c5420" + }, + { + "path": "src/main/resources/blue/coordination/processor/coordination-gas-1.0.yaml", + "type": "file", + "size": 2352, + "sha256": "9fcdc22563152cdd8cb37f9ea739477ced5f7a9e3088aecaf246812c3a3c6bab" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java", + "type": "file", + "size": 5673, + "sha256": "9afcaebcc2a8a84b380c65d1b9ad3a4a9ecf733b6164418f1fb9e752712714fc" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java", + "type": "file", + "size": 5025, + "sha256": "e8e0c69f50d162da46b1c96193fbcf0fcf8d69282cf83dc78225b755075c4df1" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java", + "type": "file", + "size": 10706, + "sha256": "6c8d4f6cdb5dd5c0d83b04b1d82bcab34786775aa46458df5e1dfeb420c1776e" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java", + "type": "file", + "size": 14580, + "sha256": "f12a5139bb97b4cda738c4e4e3f3959617276949ddfbd3c9673389081d8432a9" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java", + "type": "file", + "size": 9237, + "sha256": "7be29715cdbc26c629c3dda3383405be0fcb4ccfa907d7ed234095e5030f854c" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java", + "type": "file", + "size": 19368, + "sha256": "7753fae42dd382d21556057113bba58ba762fe5d24cd331064044b1589b39681" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java", + "type": "file", + "size": 23203, + "sha256": "8f0caa9458254b1eb4ada2be65acbadc0ab7ea2762c64a12888324b7c25cf3ce" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java", + "type": "file", + "size": 2532, + "sha256": "92519fb69108da319a8adaca915257bce64bc05db94a97046e3a42f48970343f" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java", + "type": "file", + "size": 31675, + "sha256": "ca6b8ee53c6c328c59dc0092f376ba5d16662dd8a4208a8b9415dd7a4bda2a29" + }, + { + "path": "src/test/java/blue/coordination/api/CoordinationEngineTest.java", + "type": "file", + "size": 5623, + "sha256": "1471b4512e9901ec624303103152bf8ff90c30a688c8f1b4c56ae37257e3e2f7" + }, + { + "path": "src/test/java/blue/coordination/api/DocumentRevisionInitializationCausalityTest.java", + "type": "file", + "size": 4757, + "sha256": "8b92d39f233f675d4a143039a4efb13a9353bbee988450206f2106fc8caf17f2" + }, + { + "path": "src/test/java/blue/coordination/api/PublicValueContractTest.java", + "type": "file", + "size": 8261, + "sha256": "aabcb85bd7e06b2ba9e3339882fb6bdb0482a908d7425bea32e84e367e37240f" + }, + { + "path": "src/test/java/blue/coordination/internal/CatchUpBarrierTest.java", + "type": "file", + "size": 2853, + "sha256": "e410305198d395a51da0c416dd988c0f8ce7c781000aa303f939816bdd1e4b2f" + }, + { + "path": "src/test/java/blue/coordination/internal/DocumentAdmissionCauseTest.java", + "type": "file", + "size": 3704, + "sha256": "47db2d3fcf501c831efb490b01e61a3c761375c60bbe528ad8d8c7672ac3d6fb" + }, + { + "path": "src/test/java/blue/coordination/internal/DocumentSessionStateEpochsTest.java", + "type": "file", + "size": 8477, + "sha256": "b86c6940ffb46659b0678322ad9fce219d5be82e395a86fe4d8f81aacae8ef57" + }, + { + "path": "src/test/java/blue/coordination/internal/DocumentTransitionProcessorSubscriptionDeltaTest.java", + "type": "file", + "size": 8139, + "sha256": "0f80fedc6d1b7bcdac68618dce45c90051c1e0faeb6dec1e2040ea3aba96be88" + }, + { + "path": "src/test/java/blue/coordination/internal/EmbeddedEpochInputEventEvidenceTest.java", + "type": "file", + "size": 3525, + "sha256": "5e3940b7996fd99d1cb013b2c070c7c50d6c317700e5a106ae95d1d838a6921a" + }, + { + "path": "src/test/java/blue/coordination/internal/EmbeddedEpochInputInitializationCausalityTest.java", + "type": "file", + "size": 3261, + "sha256": "c90abe36989483079d7e974d430179c8b33a9a5d59a2ff0e100060f430db74a6" + }, + { + "path": "src/test/java/blue/coordination/internal/EmbeddingBindingCanonicalOrderTest.java", + "type": "file", + "size": 6249, + "sha256": "0819c678793ff786966c48d7860ca2bb17e9ea171b3000d89c6a5e0abf5858c8" + }, + { + "path": "src/test/java/blue/coordination/internal/EngineMetricsTest.java", + "type": "file", + "size": 7606, + "sha256": "050356df462950ea1bda94bcdef8eddfed193680f230be085203a604b14c49b0" + }, + { + "path": "src/test/java/blue/coordination/internal/InMemoryTimelineJournalHistoricalStepTest.java", + "type": "file", + "size": 12641, + "sha256": "2ff9067dd3399c9936ef49de9b323dbd65dfb32cb208c65cb24d1170649041a3" + }, + { + "path": "src/test/java/blue/coordination/internal/OperationRouteIndexTest.java", + "type": "file", + "size": 10881, + "sha256": "24449b35bd15571fb8d4ac25bd458afaa231a63add048b7aa049b9885c58244d" + }, + { + "path": "src/test/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshotTest.java", + "type": "file", + "size": 6453, + "sha256": "a0ad7b6788c3d1d7406d97c6dea09aa6db1b512c0461ee4854ab6e6d6312c701" + }, + { + "path": "src/test/java/blue/coordination/internal/SourceSurfaceIdentityTest.java", + "type": "file", + "size": 18800, + "sha256": "d8bdaa59285b8141046537dc98690d1981ba161ea80cefac6d962da8c8393bfa" + }, + { + "path": "src/test/java/blue/coordination/internal/WholeObjectStoreTest.java", + "type": "file", + "size": 5004, + "sha256": "fb6cb3599a29bface3cc7b607e09d9a4e9a48a13cb224be0bec2fbf94572c448" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/BexProcessingMetricsTest.java", + "type": "file", + "size": 18375, + "sha256": "02480821af391303555fa7ff71d25be0eaa77e55caf83ce2f3e70eca5887b650" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidence.java", + "type": "file", + "size": 3954, + "sha256": "6f31d8b90e3b684e1373df5d41020a62d97712a5aefc5a10d6002b8b4f9b3c34" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidenceTest.java", + "type": "file", + "size": 3958, + "sha256": "27206ebd75b7263a356f1bad34b73cbcdf27e0634b1d35e46c0d79073ee475d0" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentViewTest.java", + "type": "file", + "size": 14480, + "sha256": "47a16478a3e795f817cebfcd8cf95e52d8ed612af81ed0543adc99c480cadabc" + }, + { + "path": "src/test/java/blue/coordination/processor/CoordinationProcessorsTest.java", + "type": "file", + "size": 10762, + "sha256": "109562a21ef117022c8a57c12b448dd9760aa2c9bb01f027f5c6ca8db23d48f6" + }, + { + "path": "src/test/java/blue/coordination/processor/CoordinationRuntimeRegistrationsTest.java", + "type": "file", + "size": 3627, + "sha256": "262ad49759d425234435a2e9f0747acba625b5dfb4c76fdd811414c89cb43186" + }, + { + "path": "src/test/java/blue/coordination/processor/CoordinationTestRuntime.java", + "type": "file", + "size": 17899, + "sha256": "8bf4fe7f15bc67da93f6719213b2f74a16aa281142d210433e10393e9f45c0fa" + }, + { + "path": "src/test/java/blue/coordination/processor/CurrentRepositoryExactNodeProvider.java", + "type": "file", + "size": 6562, + "sha256": "af897320d9b57c6b599090702d7e46794626f11a40d51125f2d3728dca22b9e9" + }, + { + "path": "src/test/java/blue/coordination/processor/SelectedWorkflowBodyLocalityTest.java", + "type": "file", + "size": 7012, + "sha256": "b0a349774be496501cd3f6a4edba2405a4a1f129a11a397eacb43c2eb03341b2" + }, + { + "path": "src/test/java/blue/coordination/processor/TimelineCheckpointSubjectTest.java", + "type": "file", + "size": 9719, + "sha256": "d1b42723772fa1246b703a5b09c882034121dcb6d08f5300ee4902d18e5c8e36" + }, + { + "path": "src/test/java/blue/coordination/processor/TimelineProviderSupportFinalSemanticsTest.java", + "type": "file", + "size": 16411, + "sha256": "8e507c964483087f96fa3ca45229ef947ffb6a5c16d90814191ee54a1a400fc8" + }, + { + "path": "src/test/java/blue/coordination/processor/TimelineSubscriptionProjectionTest.java", + "type": "file", + "size": 37155, + "sha256": "2c546862f3466d578417411eed386e7c474f70efbdc819073b3da83e65dfbc1c" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/ComputeEffectPlanTest.java", + "type": "file", + "size": 37990, + "sha256": "99cbaaa16c50e8bcdb28fe9ad60ad096a10b96b59f6d6300a46748c328e41625" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/ComputeProgramPlanCacheTest.java", + "type": "file", + "size": 18422, + "sha256": "8fb0a7d3fd7a243777dbd71a18b3526ac80250a565f39e5befd8e20879653e76" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/NodeUtilTest.java", + "type": "file", + "size": 2558, + "sha256": "e53ca654149abaf46f0aa19a9b10f7f61ede7ef88a503e50712ac549aca0673a" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCacheTest.java", + "type": "file", + "size": 26524, + "sha256": "98f522448e47beb569282a0362a0b13980818f4ba61261d13ad8595358115778" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/StaticUpdatePlanTest.java", + "type": "file", + "size": 10302, + "sha256": "fc87e32bb1b8d4a7feb0dc92f967c93eefc820e91717b1bdcc7696e9bc2e93dc" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHostTest.java", + "type": "file", + "size": 10101, + "sha256": "244bc5cf2c1a7cbefd12712508842dc1a6273f80a28692037f2c2eec63c824d6" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/WorkflowExecutionStateTest.java", + "type": "file", + "size": 4428, + "sha256": "bdd3d6d5ca67e9f8be441577a576703e0441b7ec4845432f9a2341f72d6fe4e2" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/WorkflowPatchEntryTest.java", + "type": "file", + "size": 2400, + "sha256": "a21c7e29344b2a36c38f791af4035d96a32070dd59bd1fcef6bb0f60ebd96734" + }, + { + "path": "src/test/java/blue/language/processor/RuntimeWorkSessionTestSupport.java", + "type": "file", + "size": 661, + "sha256": "6dde3302376eed0e872d31f7f92040b79f53fab292d3050f76811dbd7fd745f3" + }, + { + "path": "src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java", + "type": "file", + "size": 7018, + "sha256": "4135d7e6335091242aba44e624fefeb1bd07ea0fd9023111e602e349b790dba8" + }, + { + "path": "START-HERE.md", + "type": "file", + "size": 2663, + "sha256": "d74d729cdb52f92186c4964d0aafb68a376fce214d2554ab286971a82d86e00a" + } + ], + "sha256": "43a814e26780ccf870dea269ea1187b0372ca8ce183fd5d09e57cd639cfcdbe5" + }, + "projectTreeManifest": { + "algorithm": "SHA-256", + "includeMode": false, + "files": 293, + "entries": [ + { + "path": ".cz.toml", + "type": "file", + "size": 99, + "sha256": "2a4dc5464760ba429e99012998be2068384aefbd1d926571f45e9f24c1dca417" + }, + { + "path": "CHANGELOG.md", + "type": "file", + "size": 2667, + "sha256": "e9e36b68ef94ae49e60b0c6b8fa8d6fe4f1ced21ba94fb86d0d69ef213ffbd33" + }, + { + "path": "CONTRIBUTING.md", + "type": "file", + "size": 2061, + "sha256": "223bbaa3167ef279f8f77de35fe0849bd0a7c575d7d45c32681f3730353f5b3d" + }, + { + "path": "LICENSE", + "type": "file", + "size": 1069, + "sha256": "483137f72d5dd7a31bd0e8a0c6931443b3f378f6b2f1ff0d9afa721da3bc7c14" + }, + { + "path": "README.md", + "type": "file", + "size": 4380, + "sha256": "9aa565c33ba1f1d304fec70d61a882ba6206de6f9bbcd099542ccccca29dae52" + }, + { + "path": "SECURITY.md", + "type": "file", + "size": 1070, + "sha256": "1b8efea9fb2fdef0727a90bb06c7182599c4a6587afdb327f10c7adaef7e9d54" + }, + { + "path": "START-HERE.md", + "type": "file", + "size": 2663, + "sha256": "d74d729cdb52f92186c4964d0aafb68a376fce214d2554ab286971a82d86e00a" + }, + { + "path": "build.gradle", + "type": "file", + "size": 88033, + "sha256": "3558f123a1c83cd50441f94af31682c6931c1d44074b20e691c9c74c21c32f1b" + }, + { + "path": "docs/architecture/compact-engine.md", + "type": "file", + "size": 2499, + "sha256": "0bc6ee79e33d8800f61bfe5f43595b56a22a456e19aa4afdd0bc22a6e64895b7" + }, + { + "path": "docs/development/build-and-test.md", + "type": "file", + "size": 3539, + "sha256": "f86477d7cdc214b38eda80323122417c1814fb2114973740edd2fc9e7c3e6a20" + }, + { + "path": "docs/development/internals.md", + "type": "file", + "size": 2604, + "sha256": "d9adbf8ba4bceacec1f5b70774fa4bc3f94254aad5233fae7bada91d1140dfa5" + }, + { + "path": "docs/development/releasing.md", + "type": "file", + "size": 2809, + "sha256": "d674989f2244df58f9b5b26973c19aef50a5fc9bb1b78181ab4a31c0f230a395" + }, + { + "path": "docs/development/test-strategy.md", + "type": "file", + "size": 3507, + "sha256": "3748ede8211d0e66907ddd13711cab56440ce7a6bdbedf918f3ae2ddc457bbf5" + }, + { + "path": "docs/examples/counter.md", + "type": "file", + "size": 791, + "sha256": "94fe0eeb4e6d5cd8cb57c83af158469efbcea0dd62d46a234b466c4439648a6e" + }, + { + "path": "docs/examples/large-host-paynote.md", + "type": "file", + "size": 801, + "sha256": "31c9bd0dca78b3f11993d8fcdd2934e98b5ee35dc5e2f4e4d58957f658874d96" + }, + { + "path": "docs/examples/nba-catch-up.md", + "type": "file", + "size": 933, + "sha256": "68071db1884a4cbbb772a51f773fb8645e0494ad2ef711829057706d87518193" + }, + { + "path": "docs/examples/nba-shared-game-lifecycle.md", + "type": "file", + "size": 2611, + "sha256": "b52250821328749a961675c089c4d6f05d21ffc412a02b65b67361c3190ac2fb" + }, + { + "path": "docs/limitations.md", + "type": "file", + "size": 3107, + "sha256": "09766590367f5652ecb82035c8a6a3356f3e0a413d8abcd092cea6b6d2a2eb05" + }, + { + "path": "docs/migration-from-2.x.md", + "type": "file", + "size": 1134, + "sha256": "ff6c5d364859aa1e3b744efebc0d96d714df993b3504333cbd66dce7860e2003" + }, + { + "path": "docs/operations/failure-model.md", + "type": "file", + "size": 3904, + "sha256": "c2d555ca36ea7912da36507ab740a662ae1549e38ffd2961bf3edd9d688898ce" + }, + { + "path": "docs/performance/host-vs-frozen-time.md", + "type": "file", + "size": 8060, + "sha256": "4b99e72b8c376b0e65fd006d1876d10ba2b0def128436071883a925e5eafddf7" + }, + { + "path": "docs/reference/metrics.md", + "type": "file", + "size": 4253, + "sha256": "ad1e8e7a0bf664b546a2cd399bf617453d4e7802b66c36a8c7fa843223158a0c" + }, + { + "path": "docs/reference/public-api.md", + "type": "file", + "size": 6045, + "sha256": "7bf5e6cb28b4f8bf489c62d7c2b528221e22ea860703c613d61fd41b52880d3e" + }, + { + "path": "docs/releases/3.0.0-rc.1-evidence.json", + "type": "file", + "size": 15911, + "sha256": "9cd10d6baa89d764d19fb71983421636f1fa073fa9ebe0d67705468821ce7308" + }, + { + "path": "docs/releases/3.0.0-rc.1-test-report.md", + "type": "file", + "size": 8707, + "sha256": "6e94c0f1324ed7f0156c455f254c96f2df7e8be2136adc0b48fe094e32647bde" + }, + { + "path": "docs/releases/3.0.0-rc.1.md", + "type": "file", + "size": 5077, + "sha256": "4db09879ad98f587914dc0ebf147ecd7c51a03c2cad98243771d6bda0450a808" + }, + { + "path": "docs/releases/evidence/round11/baseline-large-host-timings.json", + "type": "file", + "size": 19653, + "sha256": "f230aee7f6db4e3d29c8831d1c7654236af6b8e4af3cbb6253daa2e545c23ca2" + }, + { + "path": "docs/releases/evidence/round11/baseline-runtime-comparison.json", + "type": "file", + "size": 10594, + "sha256": "5cd3ba34437f92de9a5efd4e12954aca3b94c82710164aaf507c2257fbcee213" + }, + { + "path": "docs/releases/evidence/round11/baseline-runtime-provenance.json", + "type": "file", + "size": 1937, + "sha256": "d9a819b69c4fa529299f80ba29f0df61458d1dcf19c4dc1fe6ab795be2afabef" + }, + { + "path": "docs/releases/evidence/round11/final-large-host-timings.json", + "type": "file", + "size": 19659, + "sha256": "9cc8eec2f2c51b43ad776d6c4b65ee86114c66f6116bcf6880cd0ddda2f8be94" + }, + { + "path": "docs/releases/evidence/round11/final-runtime-comparison.json", + "type": "file", + "size": 10590, + "sha256": "905f40b44c690fa3a964c5a01c47005659f1c2acf590a4243ad5ac363d24bc64" + }, + { + "path": "docs/releases/evidence/round11/final-runtime-provenance.json", + "type": "file", + "size": 1937, + "sha256": "267259f74cbe941b23aa81dbe850a56004d07522bed1e54f9a2f213ed01925b2" + }, + { + "path": "docs/releases/evidence/round12/nba-shared-game-lifecycle.json", + "type": "file", + "size": 9547, + "sha256": "433b69a010866cc004f92c701bd6f338a770cf01a2efa845df24e907779de38c" + }, + { + "path": "docs/releases/evidence/round12/three-scenario-p95-provenance.json", + "type": "file", + "size": 27776, + "sha256": "754fc50fb92985f35b2e563a46054d85b21f082349537a94079d8f8ee3cf06a0" + }, + { + "path": "docs/releases/round11-verification.schema.json", + "type": "file", + "size": 20884, + "sha256": "e39d0e3f9128a0156b90f237f71cfe28b3074121f86d4368a051d74da0d9ae62" + }, + { + "path": "docs/releases/round12-verification.schema.json", + "type": "file", + "size": 19282, + "sha256": "004d1db5281a76f388051a3db7bc2b0e232fc7839d5dbdf39b26d5feccb9d117" + }, + { + "path": "docs/semantics/historical-catch-up.md", + "type": "file", + "size": 4066, + "sha256": "d3a59f35bcac9ebbc316ca0b75dfb8b7ec94bd6b1c7da7b39bd9b2918e4e58da" + }, + { + "path": "docs/semantics/identity-and-revisions.md", + "type": "file", + "size": 1761, + "sha256": "6ceda5ff886bf526dfcb5324772ff3e55fa5bf01da414755291603bcf5dc3c94" + }, + { + "path": "docs/semantics/initialization-causality.md", + "type": "file", + "size": 2382, + "sha256": "17027ba18527e5ef682fb22bbdd49a4b5c74af5bbacf494142f62612cc957a19" + }, + { + "path": "docs/semantics/process-embedded-documents.md", + "type": "file", + "size": 2586, + "sha256": "774b525e1ad79a85055a16b2cd4363df9e333c15bbbdb21b18ed9de40744e46d" + }, + { + "path": "gradle.lockfile", + "type": "file", + "size": 6364, + "sha256": "29a6e1996f88f07ae56e4c720409c092440bc6ada197125a0dfef01722c3e94c" + }, + { + "path": "gradle.properties", + "type": "file", + "size": 149, + "sha256": "fd73e91317a576be9fd707ad36cef2eeb5ff5dd0cba71163d8cc308fa65827c3" + }, + { + "path": "gradle/bex-source.lock", + "type": "file", + "size": 153, + "sha256": "01c96c7e76c1a75dd6a0dfd09656d6449957fb144dd363f78756fc55685db414" + }, + { + "path": "gradle/published-artifact.lockfile", + "type": "file", + "size": 7929, + "sha256": "b4e7b78bcd7ae92959b61f882a0c762a56484a57d8d6a1388c1ffabb962bb157" + }, + { + "path": "gradle/repository-source.lock", + "type": "file", + "size": 399, + "sha256": "fd3b055108ef65a7d54e09c9d9c619c208a3e1f7518b6e1f514b75d41637fff8" + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7" + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 281, + "sha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9" + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59" + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8" + }, + { + "path": "settings.gradle", + "type": "file", + "size": 1401, + "sha256": "a7ca5851f9f6632071ce12cf0f62098d995ec9ac2462ee003a187c23b62dd6cb" + }, + { + "path": "src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java", + "type": "file", + "size": 12440, + "sha256": "78496c9c639ff104673be6c6bb790fa567187027a7d09b5b407583c42c365d64" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java", + "type": "file", + "size": 3011, + "sha256": "f6f17f73e85184800c11634a7e60b0528c4585cd7b4c44220b4b7cece8bf9419" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java", + "type": "file", + "size": 4976, + "sha256": "9c1e965de37749ef7f36607cdaaeb4962c2c29ef02fdd0f78f5dab9a4d128b60" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java", + "type": "file", + "size": 514, + "sha256": "380b431289752f6665ca59fda1f325429730b5bb684fff944ba2df74543e4ded" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java", + "type": "file", + "size": 4680, + "sha256": "d0a273adbc99c0c18a4fc7ff3a64026cb43c387998b4ad1088c3f2286638f201" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java", + "type": "file", + "size": 10221, + "sha256": "2c942d0a6bd84d3a1987e352642e7b4442798899bf4b6e2027e6b397bb407b1b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java", + "type": "file", + "size": 9870, + "sha256": "e23826a96e7b599bb7f9feef8e807125e08417add80b486cd9ecc2363d618e29" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java", + "type": "file", + "size": 6706, + "sha256": "3104429a73c3a3b23251bc79472f203550aae28d0e884715b23a290ada46c93b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java", + "type": "file", + "size": 10201, + "sha256": "328b69fc78772bfe088c74cb6512a564acd76a735300303b940eb56f5c02a10a" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java", + "type": "file", + "size": 4593, + "sha256": "e2bfb328a215690bd46d2e0be00aa8aa5ee2508309fa3ae0e537611d3bf8d2a7" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java", + "type": "file", + "size": 4675, + "sha256": "f82870e379becec8d97c9aabd8e64ed161d98955f71c3c139d79478dff7e281b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java", + "type": "file", + "size": 1441, + "sha256": "12f539f7f7abb65684638edf2f27454c03942d1be926bfb1251609a5f2c05be3" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java", + "type": "file", + "size": 5192, + "sha256": "e0abdba40898c7b32d6a6e144671465d50a4f55616ff00fa80dbde5126620750" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineMetrics.java", + "type": "file", + "size": 451, + "sha256": "e6e29db83c762bb3e3f8d31cd8135829162093442790de0099d99d291bd3c0fe" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java", + "type": "file", + "size": 4430, + "sha256": "ffb6d657da46f1c40002db86a4c8d6d08f3935cb74d2b5d95bebb07d45b43c6c" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java", + "type": "file", + "size": 4375, + "sha256": "bdd966ee344b2408f3928e36aeaf468a08d04ffcb1f3ded080f695748975087b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java", + "type": "file", + "size": 22201, + "sha256": "670730a7c01fa0954542096d9a871bbfe27a4345f20e3d7b1feeb0282347d318" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java", + "type": "file", + "size": 6789, + "sha256": "ccff385ab6725a464275bd091f4473ad112995457e96c5c15386ddbfa2da0e5e" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java", + "type": "file", + "size": 7710, + "sha256": "17fbdba43aecd38bd7bb962ec72e3430dcb94104484d0224f8deadd4566b263a" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java", + "type": "file", + "size": 19999, + "sha256": "83a6f2bd173c345ab02a2bd3d75342fc13099aa59b27913b794e21d2b634602e" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java", + "type": "file", + "size": 5891, + "sha256": "1e6fec04d5e15a32c87e73dc4edeac38ab5527181b8892c7f14eaf3ec9ed7752" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java", + "type": "file", + "size": 7047, + "sha256": "985bd959dadde30b676465fe632ba278b19715c9c48226445ba8bdbbbf9cac65" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java", + "type": "file", + "size": 3532, + "sha256": "0a948ecec4c6f6055aaa904d691dc463ad5348859e900ef3cc3e17cfec57c91d" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java", + "type": "file", + "size": 4414, + "sha256": "a4feb1e24a26bbf9e27b47de7ee3b543e9e0f957255319e873b271ebb23ef177" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java", + "type": "file", + "size": 10487, + "sha256": "e77d51152af77ac8ac596ed9a05ed716847637a026163b023c25db075ea6c959" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java", + "type": "file", + "size": 5759, + "sha256": "cbdae0f75ebbe6f6025f99b94acc7b829ad4f618a0ede82002c34126b2c28209" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java", + "type": "file", + "size": 4670, + "sha256": "508e313ed7301271c77d05f0309f37db0d23e30fb9fc0e553820ce95d4cd5d2b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java", + "type": "file", + "size": 11619, + "sha256": "d18de80ec40d21f356a90fc35d3853b73739dfb5776af3e62f2b58c23e7b7f90" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java", + "type": "file", + "size": 6796, + "sha256": "31f83a4d27f5b1f3f6e5e883872a1a856ba0d5c8ad118457191ebf33be48f47c" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java", + "type": "file", + "size": 5771, + "sha256": "f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java", + "type": "file", + "size": 5511, + "sha256": "4faa69118ee5ca0e702e65bf4f082c3c165887ed7c97e7a820bac1b85958c97c" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java", + "type": "file", + "size": 25437, + "sha256": "585e261777a66d55e484588de93bdde693b520d92246e16791f1bca69d004691" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java", + "type": "file", + "size": 8418, + "sha256": "ba3ed3185ea834f29d82146b647fe542ea7243f27dc06777d0ae7f533e5fd902" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java", + "type": "file", + "size": 23996, + "sha256": "40ed6760d0154c23546d8cdd56c55fc10ebb9e4a238dbbe642a95d8b6e528467" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "type": "file", + "size": 4285, + "sha256": "294e2090b5b6a1cf268d0023d75dfc14d4f6e50ed05c1a7a91ef1601536c2cc3" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java", + "type": "file", + "size": 6508, + "sha256": "faf106c2f001f8a1ca3718ceeeabb7b0ced02dc89d7ae5a272907a448961deeb" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java", + "type": "file", + "size": 5467, + "sha256": "fa70b05d2a41d1c3d4a2ec75b3f14f1a46f5aa24bfc4a9e922df8886a5932d77" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java", + "type": "file", + "size": 14000, + "sha256": "d91349d08b0de841c13a30060ee744034190b191fb219c7aba6d169ded7c73b5" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java", + "type": "file", + "size": 6939, + "sha256": "efce315cf3fc73fd61f20e6782dbf27d533bd76e1e66909b20c9bce614ff3812" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java", + "type": "file", + "size": 2896, + "sha256": "2b2ccb52f2022b45ead879d43800be38d5999e84f892f3b6590416c26427f46d" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java", + "type": "file", + "size": 13917, + "sha256": "1d53341ee4e10fb4212071b0df50a1ef3ae285e171e8a0feb64499e41da41550" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestEngine.java", + "type": "file", + "size": 10375, + "sha256": "bf282e92b0f861d9352eb2ac7e05183c25337bb3462cd55151c1f045ebd9d4c0" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestResources.java", + "type": "file", + "size": 623, + "sha256": "f009e1f1f06ee77532dd0d4ec6a0060d788e6cc269332c57c9764bd4b12cbdcb" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java", + "type": "file", + "size": 3800, + "sha256": "c78ce197d92e6c188a1f2e5ceccb6b989f5b8b7e568ed95784ee609e4ce56361" + }, + { + "path": "src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java", + "type": "file", + "size": 9668, + "sha256": "e98771126befedcf8bdce2bbc48dba401493331af0c2d8305ba332a62af35834" + }, + { + "path": "src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml", + "type": "file", + "size": 1016, + "sha256": "8e742418d6770518666c73e5df73ee997b6457d6524b89742fee8d09afc4de14" + }, + { + "path": "src/integrationTest/resources/examples/clean/composite-routing-counter.yaml", + "type": "file", + "size": 1067, + "sha256": "e459db2cb88face8f3d0b59b968aab5521f378506b97aad0bcef7f8d9e2f98a0" + }, + { + "path": "src/integrationTest/resources/examples/clean/counter.yaml", + "type": "file", + "size": 1781, + "sha256": "11fa9fc75576aed46469325b0277833cd906c37ed2c65065c3a8b95a53e7bc2b" + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml", + "type": "file", + "size": 2473, + "sha256": "b54ccde1413c39cbf4d1f5b3443e2e358bc44deb9cd87c67c43b257d179e02d5" + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml", + "type": "file", + "size": 712, + "sha256": "53ca74bee658d05133e4aeb58bfc7d9abb4b937b6c031d2ebc81c47a5d15cadf" + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml", + "type": "file", + "size": 2858, + "sha256": "0d46e54b59e3e066e51c133ec37da101201c8084746da3f4216bdebf1cb755fb" + }, + { + "path": "src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml", + "type": "file", + "size": 3815, + "sha256": "0d8d6e8dcd4e9336af0c2665ce007bf49b3215dd1c3bff8ba40fee1f48e5aab2" + }, + { + "path": "src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml", + "type": "file", + "size": 1387, + "sha256": "a6ee31e05a0315d5b76c3317eeb87fb2001bb351274d12a2f100c19364d79b9a" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml", + "type": "file", + "size": 2232, + "sha256": "55b4039a06c5122af2673a8df0fa4ce24999a272ca0c8d97d97113017e513794" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter-B.yaml", + "type": "file", + "size": 685, + "sha256": "c279094dbc51e6808b57df32900d309128c4a208ed1cf4ead18d3e429e573b76" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter.yaml", + "type": "file", + "size": 861, + "sha256": "b316afb6cfb8916d39a7fd7238949e4b0a58b4d72a0b4b4841459ee40895013e" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-middle.yaml", + "type": "file", + "size": 1636, + "sha256": "f8ff02ba4b96ecd15e6a37a97c8b0bd823ddeb759ea98009752c33fbb453de9e" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-parent.yaml", + "type": "file", + "size": 1806, + "sha256": "6b59cc2ec0caa942519d8dd3acc8551f2ccd304e0bd62546d316694168494bf2" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-root.yaml", + "type": "file", + "size": 1667, + "sha256": "6867661338a8aad572a175cd2c17583232638d630e8f1ed7778229859c82a7c0" + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-state-parent.yaml", + "type": "file", + "size": 1721, + "sha256": "1fdb042ca076370a728fff9f85d17d4943e0a02b9ef69a2ed49f4c30fd980f8b" + }, + { + "path": "src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml", + "type": "file", + "size": 2298, + "sha256": "55df230d6bf92d2bdbfa6b183bc4c251f6b973405fb7d0e663f4b0f29f7b5bff" + }, + { + "path": "src/integrationTest/resources/examples/clean/large-order-host.yaml", + "type": "file", + "size": 61233, + "sha256": "fef41c534a7d17857e9d16b96431caacb8bfebda48c9f0d4319bcea6e27de12d" + }, + { + "path": "src/integrationTest/resources/examples/clean/large-paynote.yaml", + "type": "file", + "size": 46821, + "sha256": "717bbb6eb03c0a9152a02bbcea1fc7d7ba8c8cafdbdf891ef2d23a7a0e2ca0ad" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game-host.yaml", + "type": "file", + "size": 3088, + "sha256": "4b5dde50c0f4c207df1565a21f23236cca7fc235be0fbebab518676d123c8223" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game.yaml", + "type": "file", + "size": 2743, + "sha256": "b14276e9dc6a4b466f6c8b5768adea908debe5cf0e824505fdd044c3b60d3364" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-round10-slate.yaml", + "type": "file", + "size": 4543, + "sha256": "cd901c6ea01cd88d076bf6e8059e8d9cab0771aebf8a9f17e869b4b3f16678f9" + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-statistics.yaml", + "type": "file", + "size": 2075, + "sha256": "995d90a08f8e2aa44a5909c96e7f3cc55251f96ba9ad658966ff3d1ffe8a0e2b" + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml", + "type": "file", + "size": 1962, + "sha256": "ec74999d4773a7b2b295e4283fe46b6736aaf9edbf28610690e2083035b3cdec" + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml", + "type": "file", + "size": 1688, + "sha256": "68eeec3a735088787f2d51975fc5302cef23b6acd93881aee9f805134b627a5f" + }, + { + "path": "src/integrationTest/resources/examples/clean/ownership-parent.yaml", + "type": "file", + "size": 2131, + "sha256": "89553db67b23c3f8cb1b0afbf858a508c67ae7540058f6ce2d1abf1143c2e6d4" + }, + { + "path": "src/integrationTest/resources/examples/clean/package-paynote.yaml", + "type": "file", + "size": 35820, + "sha256": "bb8c0e1baa6575c39b60d9479684661e66a8499c408d770dbee3ccadfcb4d964" + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-child.yaml", + "type": "file", + "size": 634, + "sha256": "42c20ca938631c29e49ba00e50a307ff50699e19f35493b106855f6bc5457555" + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-parent.yaml", + "type": "file", + "size": 2425, + "sha256": "2ff67f0de3a2062f3944a1b9f01db25c92ed71ef78496e984a4cefe990510b2e" + }, + { + "path": "src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml", + "type": "file", + "size": 1663, + "sha256": "7b0a2b7df4a5b12c3ddc7903a1a37d5300da408570329787d0d66f04f48faac9" + }, + { + "path": "src/integrationTest/resources/examples/clean/three-child-history-parent.yaml", + "type": "file", + "size": 1835, + "sha256": "de40d09653378aac24047833db002198a3721a3f44a22038fa344bef2f7bb307" + }, + { + "path": "src/integrationTest/resources/examples/clean/whole-request-sink.yaml", + "type": "file", + "size": 1195, + "sha256": "09987601d39a2797dcfd3498c7025b53731d9c2180e9317b6465a16be202d8f1" + }, + { + "path": "src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml", + "type": "file", + "size": 6798, + "sha256": "b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b" + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml", + "type": "file", + "size": 4278, + "sha256": "bb3ce407a600e8abd4157b33a82958076a60429dc2f9b14a90e4ca426f31a9a7" + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-path-host.yaml", + "type": "file", + "size": 2912, + "sha256": "aced734ec5af1bc2328074ae93d304bf95400e7de26e2efc1de864af640ba837" + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml", + "type": "file", + "size": 1000, + "sha256": "e07e98fd746bc23b42e398d9026acdec297a5a9adc861314a64f9e7793e96694" + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml", + "type": "file", + "size": 3371, + "sha256": "28756bc4bb33918219fbb7196ae648301a480af19f1f4035ab181612d372edd0" + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml", + "type": "file", + "size": 900, + "sha256": "03944ca9332879ce65f9b407d0711a64d943e2f81100ddf087a855260d7e8b3c" + }, + { + "path": "src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml", + "type": "file", + "size": 2498, + "sha256": "975eca38288929d7340190e7310bb45f72ec2ea2bd5553976c4aec7165c31df7" + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "type": "file", + "size": 3386, + "sha256": "bf1b7998dd9064f32f04d2ba285b5afd449643abf77f3e3563b60f472e3e9121" + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml", + "type": "file", + "size": 4314, + "sha256": "12ce455c643098c28af4baf9356a4d1d6893809a2f838c7bb827044856143900" + }, + { + "path": "src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml", + "type": "file", + "size": 5185, + "sha256": "a0f5279b934197fdf260b3e0d08b06b6d24abf8004e02c3b09c6e3817ae1049c" + }, + { + "path": "src/main/java/blue/coordination/api/ActivationMode.java", + "type": "file", + "size": 666, + "sha256": "79ce6f7662fc4671a4ac1a7a18d84d7cb7696a63687e5ceaecffd6e68c8d8893" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationEngine.java", + "type": "file", + "size": 6450, + "sha256": "46ec1dafa2e4c58e7a836f412f91dadcfb49be6a572740f9affb85a88aa7750b" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationErrorCode.java", + "type": "file", + "size": 1370, + "sha256": "c449b951d8e993dbfafb5514ed5e1361172c5d01a1aa2706c84c9956ee19c3e1" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationException.java", + "type": "file", + "size": 1470, + "sha256": "2766012278f72938976738a0159b44c2764413052e83e96131414e757ef7b36f" + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationMetrics.java", + "type": "file", + "size": 5968, + "sha256": "e327ff223ab536ffe848920841e47ef1600b3fd568ba7ffd532d471cc46d448b" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentDispatchOutcome.java", + "type": "file", + "size": 663, + "sha256": "10ffbf0910304962f5b173a6e6a9ec349394b48301765d373be5fcc7bf0ffe2d" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentId.java", + "type": "file", + "size": 1071, + "sha256": "60f8585b74680cb76f56d551f8046c7aee38296b650589d2681308bc75a95bd1" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentRevision.java", + "type": "file", + "size": 8200, + "sha256": "d98e687f347994c1b396b76d90b5e497f55f30fd765fe60feff52353e2dee0bd" + }, + { + "path": "src/main/java/blue/coordination/api/DocumentSnapshot.java", + "type": "file", + "size": 3850, + "sha256": "df6df15e2d87348efb66f10cf55239e75c39760f9fa16e28018a8d351faa40da" + }, + { + "path": "src/main/java/blue/coordination/api/ExactValue.java", + "type": "file", + "size": 4956, + "sha256": "d36091dec85df288e8d47aa5595706073d61f76500b498bed50a13cf8d52dafe" + }, + { + "path": "src/main/java/blue/coordination/api/Operation.java", + "type": "file", + "size": 2715, + "sha256": "c8fa668f948715977d9d24b4beedc7b8114406d92c15052a72c54a8b0d33d180" + }, + { + "path": "src/main/java/blue/coordination/api/ProcessingDrainReceipt.java", + "type": "file", + "size": 4920, + "sha256": "b291f998ca2e408b82dc333918f03263a8b24d8dbc4aecb57e2e9d73c0d039e1" + }, + { + "path": "src/main/java/blue/coordination/api/SessionStatus.java", + "type": "file", + "size": 579, + "sha256": "75c061ebeab1ce1d4820e7117d239c4d019d90a7cc625efd96451d84dde495e4" + }, + { + "path": "src/main/java/blue/coordination/api/Timeline.java", + "type": "file", + "size": 677, + "sha256": "f92011beb2999ce36db5733e8f6af9c898fabe782da8e5d81640d7a55b6fe15b" + }, + { + "path": "src/main/java/blue/coordination/api/TimelineAppendReceipt.java", + "type": "file", + "size": 743, + "sha256": "9c0011629e52d54ae85700e6bf97978a21b2ad74b01b40b0ecc6fa5481667443" + }, + { + "path": "src/main/java/blue/coordination/api/TimelineEntry.java", + "type": "file", + "size": 1862, + "sha256": "3541a8340dc9c7d568467b76853abc4a70feadf1c43784f6c76eca979220ec10" + }, + { + "path": "src/main/java/blue/coordination/internal/BlueRuntime.java", + "type": "file", + "size": 16365, + "sha256": "06ba2a04124a0c9f22e442110bdd457a54ecd7bd8617dc7fdf369a099a17e9cc" + }, + { + "path": "src/main/java/blue/coordination/internal/CatchUpBarrier.java", + "type": "file", + "size": 6889, + "sha256": "72586ae7095da713645feba5a4415fc1f1e0b48f1612bbc05f4a733f507e269a" + }, + { + "path": "src/main/java/blue/coordination/internal/CheckpointDomainEvidence.java", + "type": "file", + "size": 3196, + "sha256": "aab3b12ceec18ef2a26388ba6ffbfdfe9a820e25e4a4dac9674f68414e4ef49f" + }, + { + "path": "src/main/java/blue/coordination/internal/CompletenessEvidence.java", + "type": "file", + "size": 1993, + "sha256": "0ca8f7dbaa30ae223a9bae6a14763941707ef841ef4f19b9889f4bfeb143e59e" + }, + { + "path": "src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java", + "type": "file", + "size": 32117, + "sha256": "8165cb8f8f9fbbbcc1ff7ba0dd10f963db4a42efc98d91316b4b1bd604358a81" + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentIdentityReader.java", + "type": "file", + "size": 1817, + "sha256": "5cbf9dd47b0b7637cef370721a76536a0cce84faf0551d5667577013edcbb874" + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentSession.java", + "type": "file", + "size": 12903, + "sha256": "d9686a96b58cda59d1bb361785603ba72e27b4f2faf610cbd321ec3833b49658" + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java", + "type": "file", + "size": 46540, + "sha256": "95a80fe17de9bef8de5e900a6abaedc809de0aaef7e80e14b4d10695691c0e9d" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedBoundary.java", + "type": "file", + "size": 1014, + "sha256": "66b0357435d1e8e4f1f866335581de80fe74ddc1b7242bc96a100e97cae399a3" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedEpochCursor.java", + "type": "file", + "size": 978, + "sha256": "bb6d55e3af2a136fbe38f8d97574ebb153436a94b043679455deb99068601048" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedEpochInput.java", + "type": "file", + "size": 9950, + "sha256": "9b298c77ea0e762b111735d43a8f028a8bdd8de78c955c3dc99f9e8b0f2bcc4c" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedLayoutPlan.java", + "type": "file", + "size": 7864, + "sha256": "75ae055f027322e2093ecbbd8c485d3938e04ed5d3c40524cdfd2b514aa4933d" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOccurrence.java", + "type": "file", + "size": 919, + "sha256": "25710aee0ce926adf0a1ba3db07902e67a4c1f9477db13d12acaf3d65b6e16e6" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOnlyLayout.java", + "type": "file", + "size": 3744, + "sha256": "ed03ee6f1cac01f42c948ffa21efed4cf43b20fb0b8b5549b2694bb0b1289a6e" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOnlyLayoutBuilder.java", + "type": "file", + "size": 26664, + "sha256": "f4f6e3a88502916012b7485c4f105734ee4fccb0c0be0f322ef5ca3ec732737e" + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddingBinding.java", + "type": "file", + "size": 3985, + "sha256": "e911f6da1f114c7a219ef492e84ed561a586ca5947c332993714c39a6c84ac2e" + }, + { + "path": "src/main/java/blue/coordination/internal/EngineMetrics.java", + "type": "file", + "size": 7864, + "sha256": "f4715484267abfe97f58dd23b927ee586eee6bed103ac529d7cccabfe4e95cd9" + }, + { + "path": "src/main/java/blue/coordination/internal/HistoricalAvailabilityControl.java", + "type": "file", + "size": 683, + "sha256": "7bacf10f06efccdfcd64e4a9492e357a2e6c35e7a898816889a921c430c3c3e0" + }, + { + "path": "src/main/java/blue/coordination/internal/HistoricalStep.java", + "type": "file", + "size": 2423, + "sha256": "8947f15a61214f92fd6f4306739961a46b86c9c07a038ae7dcc57d9b3dd5147d" + }, + { + "path": "src/main/java/blue/coordination/internal/InMemoryDocumentStore.java", + "type": "file", + "size": 1636, + "sha256": "f228640af729383957e5bfc5af8e38365c59117384a1bf236755b86c7bf473aa" + }, + { + "path": "src/main/java/blue/coordination/internal/InMemoryTimelineJournal.java", + "type": "file", + "size": 15319, + "sha256": "b1888f16d53934d7950a16c27b94527040eefe2c7b342d3c645201df5c452fb0" + }, + { + "path": "src/main/java/blue/coordination/internal/InternalProcessOutcome.java", + "type": "file", + "size": 862, + "sha256": "583da428dcef1e879637a40b1d5ceb1b3a000d3c05955a19adb44c99f613507a" + }, + { + "path": "src/main/java/blue/coordination/internal/OperationRouteIndex.java", + "type": "file", + "size": 13446, + "sha256": "60b24035f260b87662b41d74725d6de83688b5b93a2d5b9e7b849fbacd3ae1bc" + }, + { + "path": "src/main/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshot.java", + "type": "file", + "size": 12510, + "sha256": "ea9d88b925098e9fce76e20caebb9b90c7cf29e032b0b524ff68acc0f04295e1" + }, + { + "path": "src/main/java/blue/coordination/internal/RoutingSurface.java", + "type": "file", + "size": 12774, + "sha256": "4e00ddd669196ebf2036264861df83d52ff7814f77e8fabcfd49622a0678e0f4" + }, + { + "path": "src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java", + "type": "file", + "size": 110264, + "sha256": "25608eb253db692bb8c37ecac6eaddfe16f7efadce33d0e1c792af28fb7c5459" + }, + { + "path": "src/main/java/blue/coordination/internal/SourceSurfaceIdentity.java", + "type": "file", + "size": 8380, + "sha256": "1a23b305455fbe2381f3f98eff0494ed4ba0b0fe5acc503f1cb59aad5a74bae5" + }, + { + "path": "src/main/java/blue/coordination/internal/WholeObjectStore.java", + "type": "file", + "size": 10161, + "sha256": "4e5dac2eba1fafdbb071ec17d729ae3274180d7e42c201d4e0adb1118033445d" + }, + { + "path": "src/main/java/blue/coordination/internal/WholeRequestEntryFactory.java", + "type": "file", + "size": 11951, + "sha256": "50812a6238555f962b2e49d3067c60c0e161bfb0a3814cedda88399ac9db4314" + }, + { + "path": "src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java", + "type": "file", + "size": 5256, + "sha256": "303688c2d25429e9ea26e29d042cccf51a62ea3402c91b3fe2edb263bef6173c" + }, + { + "path": "src/main/java/blue/coordination/processor/AllTimelinesExternalSubscriptionFunctions.java", + "type": "file", + "size": 8576, + "sha256": "93de278eb76efbada326739e33062f3de2ebd17de2db49b54f8bd2f38a7b33bf" + }, + { + "path": "src/main/java/blue/coordination/processor/BlueSemanticIdentity.java", + "type": "file", + "size": 5422, + "sha256": "bf776957e6a78bf12eaf60e167bba3beb75151b6845b6d98992c598ba6194977" + }, + { + "path": "src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java", + "type": "file", + "size": 2389, + "sha256": "1e8b60e105c48112f45335a33774c870310041f31725236b2ff7a6594396369d" + }, + { + "path": "src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java", + "type": "file", + "size": 5834, + "sha256": "0cb608cf6f7a7f1f74270acc70732eae83f41aade7ccfee6613d98e5bc260608" + }, + { + "path": "src/main/java/blue/coordination/processor/CompositeTimelineExternalSubscriptionFunctions.java", + "type": "file", + "size": 8278, + "sha256": "3ecb0ab1d3ef9e7da82fac1f6d9d873e2a96b72e0f962254e1bf22dad466db36" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java", + "type": "file", + "size": 1345, + "sha256": "6f33041450b2b4ce40b4fdb2dcd1c1cd9a6fbac2e6025fb98f87adef5172bc7d" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationCurrentRepositoryIdentities.java", + "type": "file", + "size": 6199, + "sha256": "75298ca2b99c7cd458e0a969fb4f2ae30b43e4094adbcccd978ece18aeab6e59" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationEventNodes.java", + "type": "file", + "size": 37307, + "sha256": "5eff1567cef6d11baba16fddc58f0a80d7f132b5ef20221314e27ec335028fc6" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessHeaderBridge.java", + "type": "file", + "size": 1010, + "sha256": "b97bcfaa796b91e8240bc400e4c2fc7858411e03c898dfd059c55e79d7bca8bf" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java", + "type": "file", + "size": 5742, + "sha256": "7ffe2557650ad9817f247114be810c94d57a48f7f9c0f807dedc94649ee4f3fa" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessors.java", + "type": "file", + "size": 14822, + "sha256": "d5479be29e90942632748f566239b9a02693af77887e11f27d76bd3db9cfa3d2" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeGas.java", + "type": "file", + "size": 3567, + "sha256": "b47b849723d1fd4659dc37e5a96fec2a80a29ae76037eff584f0ed2202edbc73" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeLimits.java", + "type": "file", + "size": 1249, + "sha256": "c5b57bf6863993875915916c6380de2bd0e80755b39b4900f5be24e91e88f2ab" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeRegistrations.java", + "type": "file", + "size": 5870, + "sha256": "504e34d80c3e9da73dd0b34a3c4b54b983b783d0c4985a7f105c3ee15a91d97c" + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationSemanticTypeIdentities.java", + "type": "file", + "size": 7927, + "sha256": "b5d62a7fff3c578cde361a7079063c4b3cc9a20f54704d44a9d8765b072d65d9" + }, + { + "path": "src/main/java/blue/coordination/processor/CurrentRepositoryMarkerProcessor.java", + "type": "file", + "size": 905, + "sha256": "3dca459f91a9b4c5194fda340617d82eb21299406980122bc4b745cdb3679ad3" + }, + { + "path": "src/main/java/blue/coordination/processor/HandlerChannelResolver.java", + "type": "file", + "size": 2014, + "sha256": "b3a9d8382160ae54ab216fecea24d4936581bbe42a796845628793fb9668b5cd" + }, + { + "path": "src/main/java/blue/coordination/processor/OperationProcessor.java", + "type": "file", + "size": 1290, + "sha256": "a76a31c9ca445c8ba3fd7a2dfd396ae867230f0912fda1ef8ceaf8cd35963200" + }, + { + "path": "src/main/java/blue/coordination/processor/OperationRequestMatcher.java", + "type": "file", + "size": 3870, + "sha256": "90605c1b6700e3bdfcd607c2065b9dbe211bb72bf3de3074ea4634afd4bebc87" + }, + { + "path": "src/main/java/blue/coordination/processor/OperationRequestRoutingFunctions.java", + "type": "file", + "size": 5853, + "sha256": "0563c636de339796973e74dda6a17272f538ecec125da0b3f7df05df32756a11" + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java", + "type": "file", + "size": 1855, + "sha256": "2322c2fdd2bc80b859b267cae1139a03e0edf2c0c32d28b7384df0a8f86fa646" + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java", + "type": "file", + "size": 2783, + "sha256": "501f5e8bc7a84f40706ce48952ccb6c95b057aeed9c81634505b27ce7b4c6f6a" + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java", + "type": "file", + "size": 2709, + "sha256": "11c97379b72d470811d201ee138ca1b6f5416573a7e836d687283f521ef35a2d" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineChannelProcessor.java", + "type": "file", + "size": 2465, + "sha256": "8a1661cf357ad585804b331d1a1954a1ab799d576d7b0f8834d3a98cdbf642be" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineChannelSubtypeProcessor.java", + "type": "file", + "size": 3076, + "sha256": "ca6df55d4df3ea750038540d5e4da53317749a2fa44a598077970e931535f454" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineExternalSubscriptionFunctions.java", + "type": "file", + "size": 9691, + "sha256": "eff291b0d52799e607f6382a34c2f5199b9865fa1b562dbcb750ce2ec1561b0c" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineMemberSubscriptions.java", + "type": "file", + "size": 6415, + "sha256": "bc3b4ec6373505da8a6be320274c85bc73dbd9843f60bc5cd6e80780db9584bd" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineProviderSupport.java", + "type": "file", + "size": 30237, + "sha256": "4d860258e47559797303a464bdc64d4c3bfd5453bac8a42be3ec4fb7b23801ba" + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineSubscriptionProjection.java", + "type": "file", + "size": 20284, + "sha256": "5b89382fa2624deaaeb38518dab034b95840baa9249ba53452c28039034c6de6" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java", + "type": "file", + "size": 73529, + "sha256": "17bcd73edd7c4f72c089f3cb27b2a2a9da5dcbf9767026537a23a27d845ac68c" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java", + "type": "file", + "size": 8031, + "sha256": "82916b18749b3fdf32a579ff97c0247f528f76ab890f686f16ea6485922d76aa" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexWorkflowStepContext.java", + "type": "file", + "size": 1023, + "sha256": "d53b007d184b4e8cb5cdc61e318f072e8355b6016b417871c18a46bd1528ea77" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/ProcessingEventIdentityObserver.java", + "type": "file", + "size": 1366, + "sha256": "c748423c4bac185498560937d7b9fada3913c7fa94fe7e79b1190dacbb0052fe" + }, + { + "path": "src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java", + "type": "file", + "size": 16256, + "sha256": "53d7fe70598b3c9b1214ec95b72b059dec846b9c09b45932401639fd812569d8" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationBexIntrinsicsSupport.java", + "type": "file", + "size": 4518, + "sha256": "5b28a5ed4a8a90e642ebf635c384912b044964f5f328ca321365c624f2e1f007" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationProcessHeaderSupport.java", + "type": "file", + "size": 7566, + "sha256": "f57ad7aac649d932e14916b80c05e7f179ae8f9c2c271eddae8c47c7130eb6a0" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationRuntimeGasSupport.java", + "type": "file", + "size": 17535, + "sha256": "27a287f1d596c3ec90022d284f34d1bf0be54472581017320d7141a3fbd071c7" + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationRuntimeLimitsSupport.java", + "type": "file", + "size": 771, + "sha256": "6d379f96c5d80e93eb58b3f14d495e214dc602c3fee5b2576e121b028b0eca8e" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java", + "type": "file", + "size": 7035, + "sha256": "3cf75791f45396c488179a7115ca02648e2dab2e71de17aca8efa6bdd6dfdfc9" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java", + "type": "file", + "size": 3786, + "sha256": "91a530444649428cf59d102194a5ba4fed1ed37c6090a408422453a082454c1d" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java", + "type": "file", + "size": 12855, + "sha256": "5d2a42652ea8d04ba4e29600b7abeb683ddeb5f04f85de2f8965f040b6a385a4" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java", + "type": "file", + "size": 9477, + "sha256": "7411943c73250a55f2e18870beb9b9cb8aa3966f43ada4d63919b9b9a73b39d8" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramPlanCache.java", + "type": "file", + "size": 8080, + "sha256": "ec34ef76b715643e61ec7c6d1839bb0819ea81926c65054679c3e023088bf7ac" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java", + "type": "file", + "size": 30355, + "sha256": "386969a8bb8e8ad6db60f6c54200e4f8154507585e99380e59265a5c8c53c732" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java", + "type": "file", + "size": 424, + "sha256": "e0b9d99cd0f8f2270031677ab55831ee4f7b5aff2a4f563bf3505c38c72fe312" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java", + "type": "file", + "size": 14508, + "sha256": "e2dcf639efee652e2baadd54326809a9377e4eb446276deb9ac11fde945aebf8" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java", + "type": "file", + "size": 3653, + "sha256": "b2bb8336b55946701014f43d50c74cfd15b651389f6a6fbb2c2687333b7c7a77" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/NodeUtil.java", + "type": "file", + "size": 2738, + "sha256": "d57d18cac1ebc953562cb72e67e6ac59224f044d91b03955558f0d4d72258356" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java", + "type": "file", + "size": 18477, + "sha256": "1fba96f4bde1fcdc72329a6529895270c4b3360ee4b676d1b7d7a3ef9e9128dd" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java", + "type": "file", + "size": 6288, + "sha256": "4fbb99d2b295047f55a591deed9fd820b85799416dc823593f91b680393b57b9" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java", + "type": "file", + "size": 30137, + "sha256": "888205c2fb8d0fb9d2945c8d8185abbeccfbd577b4a0d8e2dc02187669ffad11" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java", + "type": "file", + "size": 9855, + "sha256": "5739dd4e5d6ef4661794242afc6e2291708dc0a61cb14630a1642750e7829ae7" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java", + "type": "file", + "size": 13844, + "sha256": "06df499e090b7c0758d3a802c85ae21fade4ef2add9f91b8f0df34a37f04c58d" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java", + "type": "file", + "size": 2380, + "sha256": "7c6525dde55bc5818b772555537b805dd5e3fa8477b4afaa01153ff2848e1f2c" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java", + "type": "file", + "size": 4009, + "sha256": "c4f07ab0c0ba2f39e7a8c6f45e386646671dfa86ab8e2405f81ed4fbc1048b93" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java", + "type": "file", + "size": 12700, + "sha256": "e7b5a224db28f218cb34537c271361d0fbc701429b7f0761f16330d3004f6196" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHost.java", + "type": "file", + "size": 14208, + "sha256": "abee6405f8d9b6a03943660ffd0647694e242f9086acf4ab3c8d16b031907b5b" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowExecutionState.java", + "type": "file", + "size": 7107, + "sha256": "bb7c30387e2e103559d010adfae80585417899ff6247fdc5e0fc6b4f926a1acc" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java", + "type": "file", + "size": 1220, + "sha256": "49fae0b32d22093bc23e53ad0b3791c9130db7f371750b7a772bee8f98daa13b" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java", + "type": "file", + "size": 433, + "sha256": "0995f54a1b8569698cec726840b0feb930704be469986c06976c3587e02213b9" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java", + "type": "file", + "size": 1937, + "sha256": "10e29bdf6f90455a6cee5e0c3d3a62ca0f52db28d42eaa0b9e32a03af38ed50d" + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepTypeProfile.java", + "type": "file", + "size": 6282, + "sha256": "ef1785667b008ad04699250e50ca82c744ec3ead9d4ce3152b26fd311d9c5420" + }, + { + "path": "src/main/resources/blue/coordination/processor/coordination-gas-1.0.yaml", + "type": "file", + "size": 2352, + "sha256": "9fcdc22563152cdd8cb37f9ea739477ced5f7a9e3088aecaf246812c3a3c6bab" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java", + "type": "file", + "size": 5673, + "sha256": "9afcaebcc2a8a84b380c65d1b9ad3a4a9ecf733b6164418f1fb9e752712714fc" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java", + "type": "file", + "size": 5025, + "sha256": "e8e0c69f50d162da46b1c96193fbcf0fcf8d69282cf83dc78225b755075c4df1" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java", + "type": "file", + "size": 10706, + "sha256": "6c8d4f6cdb5dd5c0d83b04b1d82bcab34786775aa46458df5e1dfeb420c1776e" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java", + "type": "file", + "size": 14580, + "sha256": "f12a5139bb97b4cda738c4e4e3f3959617276949ddfbd3c9673389081d8432a9" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java", + "type": "file", + "size": 9237, + "sha256": "7be29715cdbc26c629c3dda3383405be0fcb4ccfa907d7ed234095e5030f854c" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java", + "type": "file", + "size": 34841, + "sha256": "cbb936435d13c4bf5678fc6addedbf625801a4edc52c453c8a441caa1a2bf8d3" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java", + "type": "file", + "size": 19368, + "sha256": "7753fae42dd382d21556057113bba58ba762fe5d24cd331064044b1589b39681" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java", + "type": "file", + "size": 23203, + "sha256": "8f0caa9458254b1eb4ada2be65acbadc0ab7ea2762c64a12888324b7c25cf3ce" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java", + "type": "file", + "size": 2532, + "sha256": "92519fb69108da319a8adaca915257bce64bc05db94a97046e3a42f48970343f" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java", + "type": "file", + "size": 31675, + "sha256": "ca6b8ee53c6c328c59dc0092f376ba5d16662dd8a4208a8b9415dd7a4bda2a29" + }, + { + "path": "src/test/java/blue/coordination/api/CoordinationEngineTest.java", + "type": "file", + "size": 5623, + "sha256": "1471b4512e9901ec624303103152bf8ff90c30a688c8f1b4c56ae37257e3e2f7" + }, + { + "path": "src/test/java/blue/coordination/api/DocumentRevisionInitializationCausalityTest.java", + "type": "file", + "size": 4757, + "sha256": "8b92d39f233f675d4a143039a4efb13a9353bbee988450206f2106fc8caf17f2" + }, + { + "path": "src/test/java/blue/coordination/api/PublicValueContractTest.java", + "type": "file", + "size": 8261, + "sha256": "aabcb85bd7e06b2ba9e3339882fb6bdb0482a908d7425bea32e84e367e37240f" + }, + { + "path": "src/test/java/blue/coordination/internal/CatchUpBarrierTest.java", + "type": "file", + "size": 2853, + "sha256": "e410305198d395a51da0c416dd988c0f8ce7c781000aa303f939816bdd1e4b2f" + }, + { + "path": "src/test/java/blue/coordination/internal/DocumentAdmissionCauseTest.java", + "type": "file", + "size": 3704, + "sha256": "47db2d3fcf501c831efb490b01e61a3c761375c60bbe528ad8d8c7672ac3d6fb" + }, + { + "path": "src/test/java/blue/coordination/internal/DocumentSessionStateEpochsTest.java", + "type": "file", + "size": 8477, + "sha256": "b86c6940ffb46659b0678322ad9fce219d5be82e395a86fe4d8f81aacae8ef57" + }, + { + "path": "src/test/java/blue/coordination/internal/DocumentTransitionProcessorSubscriptionDeltaTest.java", + "type": "file", + "size": 8139, + "sha256": "0f80fedc6d1b7bcdac68618dce45c90051c1e0faeb6dec1e2040ea3aba96be88" + }, + { + "path": "src/test/java/blue/coordination/internal/EmbeddedEpochInputEventEvidenceTest.java", + "type": "file", + "size": 3525, + "sha256": "5e3940b7996fd99d1cb013b2c070c7c50d6c317700e5a106ae95d1d838a6921a" + }, + { + "path": "src/test/java/blue/coordination/internal/EmbeddedEpochInputInitializationCausalityTest.java", + "type": "file", + "size": 3261, + "sha256": "c90abe36989483079d7e974d430179c8b33a9a5d59a2ff0e100060f430db74a6" + }, + { + "path": "src/test/java/blue/coordination/internal/EmbeddingBindingCanonicalOrderTest.java", + "type": "file", + "size": 6249, + "sha256": "0819c678793ff786966c48d7860ca2bb17e9ea171b3000d89c6a5e0abf5858c8" + }, + { + "path": "src/test/java/blue/coordination/internal/EngineMetricsTest.java", + "type": "file", + "size": 7606, + "sha256": "050356df462950ea1bda94bcdef8eddfed193680f230be085203a604b14c49b0" + }, + { + "path": "src/test/java/blue/coordination/internal/InMemoryTimelineJournalHistoricalStepTest.java", + "type": "file", + "size": 12641, + "sha256": "2ff9067dd3399c9936ef49de9b323dbd65dfb32cb208c65cb24d1170649041a3" + }, + { + "path": "src/test/java/blue/coordination/internal/OperationRouteIndexTest.java", + "type": "file", + "size": 10881, + "sha256": "24449b35bd15571fb8d4ac25bd458afaa231a63add048b7aa049b9885c58244d" + }, + { + "path": "src/test/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshotTest.java", + "type": "file", + "size": 6453, + "sha256": "a0ad7b6788c3d1d7406d97c6dea09aa6db1b512c0461ee4854ab6e6d6312c701" + }, + { + "path": "src/test/java/blue/coordination/internal/SourceSurfaceIdentityTest.java", + "type": "file", + "size": 18800, + "sha256": "d8bdaa59285b8141046537dc98690d1981ba161ea80cefac6d962da8c8393bfa" + }, + { + "path": "src/test/java/blue/coordination/internal/WholeObjectStoreTest.java", + "type": "file", + "size": 5004, + "sha256": "fb6cb3599a29bface3cc7b607e09d9a4e9a48a13cb224be0bec2fbf94572c448" + }, + { + "path": "src/test/java/blue/coordination/processor/CoordinationProcessorsTest.java", + "type": "file", + "size": 10762, + "sha256": "109562a21ef117022c8a57c12b448dd9760aa2c9bb01f027f5c6ca8db23d48f6" + }, + { + "path": "src/test/java/blue/coordination/processor/CoordinationRuntimeRegistrationsTest.java", + "type": "file", + "size": 3627, + "sha256": "262ad49759d425234435a2e9f0747acba625b5dfb4c76fdd811414c89cb43186" + }, + { + "path": "src/test/java/blue/coordination/processor/CoordinationTestRuntime.java", + "type": "file", + "size": 17899, + "sha256": "8bf4fe7f15bc67da93f6719213b2f74a16aa281142d210433e10393e9f45c0fa" + }, + { + "path": "src/test/java/blue/coordination/processor/CurrentRepositoryExactNodeProvider.java", + "type": "file", + "size": 6562, + "sha256": "af897320d9b57c6b599090702d7e46794626f11a40d51125f2d3728dca22b9e9" + }, + { + "path": "src/test/java/blue/coordination/processor/SelectedWorkflowBodyLocalityTest.java", + "type": "file", + "size": 7012, + "sha256": "b0a349774be496501cd3f6a4edba2405a4a1f129a11a397eacb43c2eb03341b2" + }, + { + "path": "src/test/java/blue/coordination/processor/TimelineCheckpointSubjectTest.java", + "type": "file", + "size": 9719, + "sha256": "d1b42723772fa1246b703a5b09c882034121dcb6d08f5300ee4902d18e5c8e36" + }, + { + "path": "src/test/java/blue/coordination/processor/TimelineProviderSupportFinalSemanticsTest.java", + "type": "file", + "size": 16411, + "sha256": "8e507c964483087f96fa3ca45229ef947ffb6a5c16d90814191ee54a1a400fc8" + }, + { + "path": "src/test/java/blue/coordination/processor/TimelineSubscriptionProjectionTest.java", + "type": "file", + "size": 37155, + "sha256": "2c546862f3466d578417411eed386e7c474f70efbdc819073b3da83e65dfbc1c" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/BexProcessingMetricsTest.java", + "type": "file", + "size": 18375, + "sha256": "02480821af391303555fa7ff71d25be0eaa77e55caf83ce2f3e70eca5887b650" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidence.java", + "type": "file", + "size": 3954, + "sha256": "6f31d8b90e3b684e1373df5d41020a62d97712a5aefc5a10d6002b8b4f9b3c34" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidenceTest.java", + "type": "file", + "size": 3958, + "sha256": "27206ebd75b7263a356f1bad34b73cbcdf27e0634b1d35e46c0d79073ee475d0" + }, + { + "path": "src/test/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentViewTest.java", + "type": "file", + "size": 14480, + "sha256": "47a16478a3e795f817cebfcd8cf95e52d8ed612af81ed0543adc99c480cadabc" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/ComputeEffectPlanTest.java", + "type": "file", + "size": 37990, + "sha256": "99cbaaa16c50e8bcdb28fe9ad60ad096a10b96b59f6d6300a46748c328e41625" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/ComputeProgramPlanCacheTest.java", + "type": "file", + "size": 18422, + "sha256": "8fb0a7d3fd7a243777dbd71a18b3526ac80250a565f39e5befd8e20879653e76" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/NodeUtilTest.java", + "type": "file", + "size": 2558, + "sha256": "e53ca654149abaf46f0aa19a9b10f7f61ede7ef88a503e50712ac549aca0673a" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCacheTest.java", + "type": "file", + "size": 26524, + "sha256": "98f522448e47beb569282a0362a0b13980818f4ba61261d13ad8595358115778" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/StaticUpdatePlanTest.java", + "type": "file", + "size": 10302, + "sha256": "fc87e32bb1b8d4a7feb0dc92f967c93eefc820e91717b1bdcc7696e9bc2e93dc" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHostTest.java", + "type": "file", + "size": 10101, + "sha256": "244bc5cf2c1a7cbefd12712508842dc1a6273f80a28692037f2c2eec63c824d6" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/WorkflowExecutionStateTest.java", + "type": "file", + "size": 4428, + "sha256": "bdd3d6d5ca67e9f8be441577a576703e0441b7ec4845432f9a2341f72d6fe4e2" + }, + { + "path": "src/test/java/blue/coordination/processor/workflow/WorkflowPatchEntryTest.java", + "type": "file", + "size": 2400, + "sha256": "a21c7e29344b2a36c38f791af4035d96a32070dd59bd1fcef6bb0f60ebd96734" + }, + { + "path": "src/test/java/blue/language/processor/RuntimeWorkSessionTestSupport.java", + "type": "file", + "size": 661, + "sha256": "6dde3302376eed0e872d31f7f92040b79f53fab292d3050f76811dbd7fd745f3" + }, + { + "path": "src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java", + "type": "file", + "size": 7018, + "sha256": "4135d7e6335091242aba44e624fefeb1bd07ea0fd9023111e602e349b790dba8" + } + ], + "sha256": "725aa0c397493e55b95a14cd74179dae39d8ad43b1310841ca7ac25057f99809" + }, + "allowedHarnessDifferences": [ + { + "path": ".cz.toml", + "kind": "ADDED", + "archiveSha256": null, + "projectSha256": "2a4dc5464760ba429e99012998be2068384aefbd1d926571f45e9f24c1dca417" + }, + { + "path": "build.gradle", + "kind": "MODIFIED", + "archiveSha256": "be8dbadbd3ab8c32af9609cf97b277c39e73b3e3b41766040a76d3b953837ca7", + "projectSha256": "3558f123a1c83cd50441f94af31682c6931c1d44074b20e691c9c74c21c32f1b" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java", + "kind": "ADDED", + "archiveSha256": null, + "projectSha256": "f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1" + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestEngine.java", + "kind": "MODIFIED", + "archiveSha256": "e7328f5f744d5c9961a9f7f3068200313cc5dd774a18f675af81234c8e4b229b", + "projectSha256": "bf282e92b0f861d9352eb2ac7e05183c25337bb3462cd55151c1f045ebd9d4c0" + }, + { + "path": "src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml", + "kind": "ADDED", + "archiveSha256": null, + "projectSha256": "b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b" + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java", + "kind": "ADDED", + "archiveSha256": null, + "projectSha256": "cbb936435d13c4bf5678fc6addedbf625801a4edc52c453c8a441caa1a2bf8d3" + } + ], + "productionSourceFilesChanged": false, + "archiveOmittedCzToml": true, + "czTomlShimLines": 4, + "buildShimLines": 4, + "applicationPathEvidence": "READ_ONLY_COMPLETED_CATCH_UP_PROJECTION" + }, + "candidate": { + "projectPath": "/Users/piotr/data/blue-contract-java", + "implementationHead": "699f019cb9fa1d484a070a5d46a2335fd1cd2dce", + "worktreeStatusSha256": "0f28a44f7863e7e598146c455c040074b54f3ac2617c33deaea33be131082666", + "productionFiles": 109, + "mainSourceManifestSha256": "d0dad91fe3c2d5627c3b1900543b2a82cc9ea323afbb85ad06256da4e2cf3124", + "executionSurfaceManifest": { + "algorithm": "SHA-256", + "includeMode": true, + "files": 228, + "entries": [ + { + "path": ".cz.toml", + "type": "file", + "size": 157, + "sha256": "9a4d68a699e78ff604c2e909bf6d7ecd82bd20b4f365ea85ad666d88bb1a0610", + "mode": 420 + }, + { + "path": "build.gradle", + "type": "file", + "size": 131371, + "sha256": "3f3e494b9f3d8510d0400b7c388113a5b44e7a84866d1f2545f4f0b8ed55134f", + "mode": 420 + }, + { + "path": "gradle.lockfile", + "type": "file", + "size": 6364, + "sha256": "29a6e1996f88f07ae56e4c720409c092440bc6ada197125a0dfef01722c3e94c", + "mode": 420 + }, + { + "path": "gradle.properties", + "type": "file", + "size": 149, + "sha256": "fd73e91317a576be9fd707ad36cef2eeb5ff5dd0cba71163d8cc308fa65827c3", + "mode": 420 + }, + { + "path": "gradle/bex-source.lock", + "type": "file", + "size": 153, + "sha256": "01c96c7e76c1a75dd6a0dfd09656d6449957fb144dd363f78756fc55685db414", + "mode": 420 + }, + { + "path": "gradle/published-artifact.lockfile", + "type": "file", + "size": 7929, + "sha256": "b4e7b78bcd7ae92959b61f882a0c762a56484a57d8d6a1388c1ffabb962bb157", + "mode": 420 + }, + { + "path": "gradle/repository-source.lock", + "type": "file", + "size": 399, + "sha256": "fd3b055108ef65a7d54e09c9d9c619c208a3e1f7518b6e1f514b75d41637fff8", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.jar", + "type": "file", + "size": 48462, + "sha256": "497c8c2a7e5031f6aa847f88104aa80a93532ec32ee17bdb8d1d2f67a194a9c7", + "mode": 420 + }, + { + "path": "gradle/wrapper/gradle-wrapper.properties", + "type": "file", + "size": 281, + "sha256": "e74d4f107d2feab989b9a041a02e2d2b85567ff48415c9c7add5ecc19abd19f9", + "mode": 420 + }, + { + "path": "gradlew", + "type": "file", + "size": 8656, + "sha256": "a5a5c199ba02189ae8c46a334223371a20599d9c298ef65e7540ede4a3f72d59", + "mode": 493 + }, + { + "path": "gradlew.bat", + "type": "file", + "size": 2848, + "sha256": "d539676c48b596afda64c963ec8f7ee56c7b3fe7e3b81d1dbe2d1a1e3dd9e9f8", + "mode": 420 + }, + { + "path": "scripts/round13-ab-evidence.mjs", + "type": "file", + "size": 65897, + "sha256": "e33c17c94f8cec762980375005e7632e1a7cd05b378adbfd38376d2fe721bf50", + "mode": 493 + }, + { + "path": "scripts/run-round13-same-machine-ab.sh", + "type": "file", + "size": 3196, + "sha256": "996210570704b32caf3a3886044f8f1b34c69824c7ba4a0f4518fea2352c7b5d", + "mode": 493 + }, + { + "path": "settings.gradle", + "type": "file", + "size": 1401, + "sha256": "a7ca5851f9f6632071ce12cf0f62098d995ec9ac2462ee003a187c23b62dd6cb", + "mode": 420 + }, + { + "path": "src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java", + "type": "file", + "size": 16844, + "sha256": "94ee77eb48ad3c4693ae57e80d1ad25e26e47f71ec82a49703438d6db2e8f498", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java", + "type": "file", + "size": 3011, + "sha256": "f6f17f73e85184800c11634a7e60b0528c4585cd7b4c44220b4b7cece8bf9419", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java", + "type": "file", + "size": 4976, + "sha256": "9c1e965de37749ef7f36607cdaaeb4962c2c29ef02fdd0f78f5dab9a4d128b60", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java", + "type": "file", + "size": 514, + "sha256": "380b431289752f6665ca59fda1f325429730b5bb684fff944ba2df74543e4ded", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java", + "type": "file", + "size": 4680, + "sha256": "d0a273adbc99c0c18a4fc7ff3a64026cb43c387998b4ad1088c3f2286638f201", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java", + "type": "file", + "size": 10221, + "sha256": "2c942d0a6bd84d3a1987e352642e7b4442798899bf4b6e2027e6b397bb407b1b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java", + "type": "file", + "size": 9870, + "sha256": "e23826a96e7b599bb7f9feef8e807125e08417add80b486cd9ecc2363d618e29", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java", + "type": "file", + "size": 6706, + "sha256": "3104429a73c3a3b23251bc79472f203550aae28d0e884715b23a290ada46c93b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java", + "type": "file", + "size": 10201, + "sha256": "328b69fc78772bfe088c74cb6512a564acd76a735300303b940eb56f5c02a10a", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java", + "type": "file", + "size": 4593, + "sha256": "e2bfb328a215690bd46d2e0be00aa8aa5ee2508309fa3ae0e537611d3bf8d2a7", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java", + "type": "file", + "size": 4675, + "sha256": "f82870e379becec8d97c9aabd8e64ed161d98955f71c3c139d79478dff7e281b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java", + "type": "file", + "size": 1441, + "sha256": "12f539f7f7abb65684638edf2f27454c03942d1be926bfb1251609a5f2c05be3", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java", + "type": "file", + "size": 5192, + "sha256": "e0abdba40898c7b32d6a6e144671465d50a4f55616ff00fa80dbde5126620750", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineMetrics.java", + "type": "file", + "size": 451, + "sha256": "e6e29db83c762bb3e3f8d31cd8135829162093442790de0099d99d291bd3c0fe", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java", + "type": "file", + "size": 6240, + "sha256": "747f6475b5bee3ac857e6106be4e492b5897c654f8f098c890e1f4e7113dddc0", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/EngineTestSupportMetricVocabularyTest.java", + "type": "file", + "size": 2671, + "sha256": "8ee8e62bf1bdb07ab728a61147d3b2399c3805f9b39400e4c07b557aeb7e5980", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java", + "type": "file", + "size": 4375, + "sha256": "bdd966ee344b2408f3928e36aeaf468a08d04ffcb1f3ded080f695748975087b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java", + "type": "file", + "size": 22201, + "sha256": "670730a7c01fa0954542096d9a871bbfe27a4345f20e3d7b1feeb0282347d318", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java", + "type": "file", + "size": 6789, + "sha256": "ccff385ab6725a464275bd091f4473ad112995457e96c5c15386ddbfa2da0e5e", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java", + "type": "file", + "size": 7710, + "sha256": "17fbdba43aecd38bd7bb962ec72e3430dcb94104484d0224f8deadd4566b263a", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java", + "type": "file", + "size": 19999, + "sha256": "83a6f2bd173c345ab02a2bd3d75342fc13099aa59b27913b794e21d2b634602e", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java", + "type": "file", + "size": 5891, + "sha256": "1e6fec04d5e15a32c87e73dc4edeac38ab5527181b8892c7f14eaf3ec9ed7752", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java", + "type": "file", + "size": 7047, + "sha256": "985bd959dadde30b676465fe632ba278b19715c9c48226445ba8bdbbbf9cac65", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java", + "type": "file", + "size": 3532, + "sha256": "0a948ecec4c6f6055aaa904d691dc463ad5348859e900ef3cc3e17cfec57c91d", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java", + "type": "file", + "size": 4414, + "sha256": "a4feb1e24a26bbf9e27b47de7ee3b543e9e0f957255319e873b271ebb23ef177", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java", + "type": "file", + "size": 10487, + "sha256": "e77d51152af77ac8ac596ed9a05ed716847637a026163b023c25db075ea6c959", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java", + "type": "file", + "size": 5759, + "sha256": "cbdae0f75ebbe6f6025f99b94acc7b829ad4f618a0ede82002c34126b2c28209", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java", + "type": "file", + "size": 4670, + "sha256": "508e313ed7301271c77d05f0309f37db0d23e30fb9fc0e553820ce95d4cd5d2b", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java", + "type": "file", + "size": 11619, + "sha256": "d18de80ec40d21f356a90fc35d3853b73739dfb5776af3e62f2b58c23e7b7f90", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java", + "type": "file", + "size": 6796, + "sha256": "31f83a4d27f5b1f3f6e5e883872a1a856ba0d5c8ad118457191ebf33be48f47c", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceCorrectnessIntegrationTest.java", + "type": "file", + "size": 14879, + "sha256": "444e84794b483224a5b9ed272058f59709f9492eaf76588a0953dfd47fe31cdf", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java", + "type": "file", + "size": 5771, + "sha256": "f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceRetryTest.java", + "type": "file", + "size": 6015, + "sha256": "b700e3d7473bb3959ddb47a3eb27195a7587aecc0d3545ce762217c09a7204bc", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java", + "type": "file", + "size": 5511, + "sha256": "4faa69118ee5ca0e702e65bf4f082c3c165887ed7c97e7a820bac1b85958c97c", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java", + "type": "file", + "size": 25437, + "sha256": "585e261777a66d55e484588de93bdde693b520d92246e16791f1bca69d004691", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java", + "type": "file", + "size": 8418, + "sha256": "ba3ed3185ea834f29d82146b647fe542ea7243f27dc06777d0ae7f533e5fd902", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/RetryStructuralCountersIntegrationTest.java", + "type": "file", + "size": 5733, + "sha256": "bb29b66c70ba9e9dcde072712ab75d7324f66b4794593c0c1dfacb2d789c40e4", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java", + "type": "file", + "size": 23996, + "sha256": "40ed6760d0154c23546d8cdd56c55fc10ebb9e4a238dbbe642a95d8b6e528467", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "type": "file", + "size": 4285, + "sha256": "294e2090b5b6a1cf268d0023d75dfc14d4f6e50ed05c1a7a91ef1601536c2cc3", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java", + "type": "file", + "size": 6508, + "sha256": "faf106c2f001f8a1ca3718ceeeabb7b0ced02dc89d7ae5a272907a448961deeb", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java", + "type": "file", + "size": 5467, + "sha256": "fa70b05d2a41d1c3d4a2ec75b3f14f1a46f5aa24bfc4a9e922df8886a5932d77", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java", + "type": "file", + "size": 14000, + "sha256": "d91349d08b0de841c13a30060ee744034190b191fb219c7aba6d169ded7c73b5", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java", + "type": "file", + "size": 6939, + "sha256": "efce315cf3fc73fd61f20e6782dbf27d533bd76e1e66909b20c9bce614ff3812", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java", + "type": "file", + "size": 2896, + "sha256": "2b2ccb52f2022b45ead879d43800be38d5999e84f892f3b6590416c26427f46d", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java", + "type": "file", + "size": 13917, + "sha256": "1d53341ee4e10fb4212071b0df50a1ef3ae285e171e8a0feb64499e41da41550", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestEngine.java", + "type": "file", + "size": 10657, + "sha256": "db89b8b927f862fc5d1a50a7df22bd3e95b30542b36a51262a6900e37d019e0a", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/TestResources.java", + "type": "file", + "size": 623, + "sha256": "f009e1f1f06ee77532dd0d4ec6a0060d788e6cc269332c57c9764bd4b12cbdcb", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java", + "type": "file", + "size": 3800, + "sha256": "c78ce197d92e6c188a1f2e5ceccb6b989f5b8b7e568ed95784ee609e4ce56361", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java", + "type": "file", + "size": 9668, + "sha256": "e98771126befedcf8bdce2bbc48dba401493331af0c2d8305ba332a62af35834", + "mode": 420 + }, + { + "path": "src/integrationTest/java/blue/coordination/internal/EmbeddedReceiptRetryIdentityIntegrationTest.java", + "type": "file", + "size": 7947, + "sha256": "29d139b65a366a095f5616cfc427430ebac971905c984561f3deec1b5982167e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml", + "type": "file", + "size": 1016, + "sha256": "8e742418d6770518666c73e5df73ee997b6457d6524b89742fee8d09afc4de14", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/composite-routing-counter.yaml", + "type": "file", + "size": 1067, + "sha256": "e459db2cb88face8f3d0b59b968aab5521f378506b97aad0bcef7f8d9e2f98a0", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/counter.yaml", + "type": "file", + "size": 1781, + "sha256": "11fa9fc75576aed46469325b0277833cd906c37ed2c65065c3a8b95a53e7bc2b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml", + "type": "file", + "size": 2473, + "sha256": "b54ccde1413c39cbf4d1f5b3443e2e358bc44deb9cd87c67c43b257d179e02d5", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml", + "type": "file", + "size": 712, + "sha256": "53ca74bee658d05133e4aeb58bfc7d9abb4b937b6c031d2ebc81c47a5d15cadf", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml", + "type": "file", + "size": 2858, + "sha256": "0d46e54b59e3e066e51c133ec37da101201c8084746da3f4216bdebf1cb755fb", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml", + "type": "file", + "size": 3815, + "sha256": "0d8d6e8dcd4e9336af0c2665ce007bf49b3215dd1c3bff8ba40fee1f48e5aab2", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml", + "type": "file", + "size": 1387, + "sha256": "a6ee31e05a0315d5b76c3317eeb87fb2001bb351274d12a2f100c19364d79b9a", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml", + "type": "file", + "size": 2232, + "sha256": "55b4039a06c5122af2673a8df0fa4ce24999a272ca0c8d97d97113017e513794", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter-B.yaml", + "type": "file", + "size": 685, + "sha256": "c279094dbc51e6808b57df32900d309128c4a208ed1cf4ead18d3e429e573b76", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-counter.yaml", + "type": "file", + "size": 861, + "sha256": "b316afb6cfb8916d39a7fd7238949e4b0a58b4d72a0b4b4841459ee40895013e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-middle.yaml", + "type": "file", + "size": 1636, + "sha256": "f8ff02ba4b96ecd15e6a37a97c8b0bd823ddeb759ea98009752c33fbb453de9e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-parent.yaml", + "type": "file", + "size": 1806, + "sha256": "6b59cc2ec0caa942519d8dd3acc8551f2ccd304e0bd62546d316694168494bf2", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-root.yaml", + "type": "file", + "size": 1667, + "sha256": "6867661338a8aad572a175cd2c17583232638d630e8f1ed7778229859c82a7c0", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/embedded-state-parent.yaml", + "type": "file", + "size": 1721, + "sha256": "1fdb042ca076370a728fff9f85d17d4943e0a02b9ef69a2ed49f4c30fd980f8b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml", + "type": "file", + "size": 2298, + "sha256": "55df230d6bf92d2bdbfa6b183bc4c251f6b973405fb7d0e663f4b0f29f7b5bff", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/large-order-host.yaml", + "type": "file", + "size": 61233, + "sha256": "fef41c534a7d17857e9d16b96431caacb8bfebda48c9f0d4319bcea6e27de12d", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/large-paynote.yaml", + "type": "file", + "size": 46821, + "sha256": "717bbb6eb03c0a9152a02bbcea1fc7d7ba8c8cafdbdf891ef2d23a7a0e2ca0ad", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game-host.yaml", + "type": "file", + "size": 3088, + "sha256": "4b5dde50c0f4c207df1565a21f23236cca7fc235be0fbebab518676d123c8223", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-game.yaml", + "type": "file", + "size": 2743, + "sha256": "b14276e9dc6a4b466f6c8b5768adea908debe5cf0e824505fdd044c3b60d3364", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-round10-slate.yaml", + "type": "file", + "size": 4543, + "sha256": "cd901c6ea01cd88d076bf6e8059e8d9cab0771aebf8a9f17e869b4b3f16678f9", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nba-statistics.yaml", + "type": "file", + "size": 2075, + "sha256": "995d90a08f8e2aa44a5909c96e7f3cc55251f96ba9ad658966ff3d1ffe8a0e2b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml", + "type": "file", + "size": 1962, + "sha256": "ec74999d4773a7b2b295e4283fe46b6736aaf9edbf28610690e2083035b3cdec", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml", + "type": "file", + "size": 1688, + "sha256": "68eeec3a735088787f2d51975fc5302cef23b6acd93881aee9f805134b627a5f", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/ownership-parent.yaml", + "type": "file", + "size": 2131, + "sha256": "89553db67b23c3f8cb1b0afbf858a508c67ae7540058f6ce2d1abf1143c2e6d4", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/package-paynote.yaml", + "type": "file", + "size": 35820, + "sha256": "bb8c0e1baa6575c39b60d9479684661e66a8499c408d770dbee3ccadfcb4d964", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-child.yaml", + "type": "file", + "size": 634, + "sha256": "42c20ca938631c29e49ba00e50a307ff50699e19f35493b106855f6bc5457555", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/root-isolation-parent.yaml", + "type": "file", + "size": 2425, + "sha256": "2ff67f0de3a2062f3944a1b9f01db25c92ed71ef78496e984a4cefe990510b2e", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml", + "type": "file", + "size": 1663, + "sha256": "7b0a2b7df4a5b12c3ddc7903a1a37d5300da408570329787d0d66f04f48faac9", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/three-child-history-parent.yaml", + "type": "file", + "size": 1835, + "sha256": "de40d09653378aac24047833db002198a3721a3f44a22038fa344bef2f7bb307", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/clean/whole-request-sink.yaml", + "type": "file", + "size": 1195, + "sha256": "09987601d39a2797dcfd3498c7025b53731d9c2180e9317b6465a16be202d8f1", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml", + "type": "file", + "size": 6798, + "sha256": "b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml", + "type": "file", + "size": 4278, + "sha256": "bb3ce407a600e8abd4157b33a82958076a60429dc2f9b14a90e4ca426f31a9a7", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/dynamic-path-host.yaml", + "type": "file", + "size": 2912, + "sha256": "aced734ec5af1bc2328074ae93d304bf95400e7de26e2efc1de864af640ba837", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml", + "type": "file", + "size": 1000, + "sha256": "e07e98fd746bc23b42e398d9026acdec297a5a9adc861314a64f9e7793e96694", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml", + "type": "file", + "size": 3371, + "sha256": "28756bc4bb33918219fbb7196ae648301a480af19f1f4035ab181612d372edd0", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml", + "type": "file", + "size": 900, + "sha256": "03944ca9332879ce65f9b407d0711a64d943e2f81100ddf087a855260d7e8b3c", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml", + "type": "file", + "size": 2498, + "sha256": "975eca38288929d7340190e7310bb45f72ec2ea2bd5553976c4aec7165c31df7", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "type": "file", + "size": 3386, + "sha256": "bf1b7998dd9064f32f04d2ba285b5afd449643abf77f3e3563b60f472e3e9121", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml", + "type": "file", + "size": 4314, + "sha256": "12ce455c643098c28af4baf9356a4d1d6893809a2f838c7bb827044856143900", + "mode": 420 + }, + { + "path": "src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml", + "type": "file", + "size": 5185, + "sha256": "a0f5279b934197fdf260b3e0d08b06b6d24abf8004e02c3b09c6e3817ae1049c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/ActivationMode.java", + "type": "file", + "size": 666, + "sha256": "79ce6f7662fc4671a4ac1a7a18d84d7cb7696a63687e5ceaecffd6e68c8d8893", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationEngine.java", + "type": "file", + "size": 6450, + "sha256": "46ec1dafa2e4c58e7a836f412f91dadcfb49be6a572740f9affb85a88aa7750b", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationErrorCode.java", + "type": "file", + "size": 1370, + "sha256": "c449b951d8e993dbfafb5514ed5e1361172c5d01a1aa2706c84c9956ee19c3e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationException.java", + "type": "file", + "size": 1470, + "sha256": "2766012278f72938976738a0159b44c2764413052e83e96131414e757ef7b36f", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/CoordinationMetrics.java", + "type": "file", + "size": 6060, + "sha256": "0e0eb9e94596e9aa43c717528219a9b7687c0a46077a2493f660603e3d7e22c1", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/DocumentDispatchOutcome.java", + "type": "file", + "size": 663, + "sha256": "10ffbf0910304962f5b173a6e6a9ec349394b48301765d373be5fcc7bf0ffe2d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/DocumentId.java", + "type": "file", + "size": 1071, + "sha256": "60f8585b74680cb76f56d551f8046c7aee38296b650589d2681308bc75a95bd1", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/DocumentRevision.java", + "type": "file", + "size": 8200, + "sha256": "d98e687f347994c1b396b76d90b5e497f55f30fd765fe60feff52353e2dee0bd", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/DocumentSnapshot.java", + "type": "file", + "size": 3850, + "sha256": "df6df15e2d87348efb66f10cf55239e75c39760f9fa16e28018a8d351faa40da", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/ExactValue.java", + "type": "file", + "size": 4956, + "sha256": "d36091dec85df288e8d47aa5595706073d61f76500b498bed50a13cf8d52dafe", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/Operation.java", + "type": "file", + "size": 2715, + "sha256": "c8fa668f948715977d9d24b4beedc7b8114406d92c15052a72c54a8b0d33d180", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/ProcessingDrainReceipt.java", + "type": "file", + "size": 4920, + "sha256": "b291f998ca2e408b82dc333918f03263a8b24d8dbc4aecb57e2e9d73c0d039e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/SessionStatus.java", + "type": "file", + "size": 579, + "sha256": "75c061ebeab1ce1d4820e7117d239c4d019d90a7cc625efd96451d84dde495e4", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/Timeline.java", + "type": "file", + "size": 677, + "sha256": "f92011beb2999ce36db5733e8f6af9c898fabe782da8e5d81640d7a55b6fe15b", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/TimelineAppendReceipt.java", + "type": "file", + "size": 743, + "sha256": "9c0011629e52d54ae85700e6bf97978a21b2ad74b01b40b0ecc6fa5481667443", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/api/TimelineEntry.java", + "type": "file", + "size": 1862, + "sha256": "3541a8340dc9c7d568467b76853abc4a70feadf1c43784f6c76eca979220ec10", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/BlueRuntime.java", + "type": "file", + "size": 16365, + "sha256": "06ba2a04124a0c9f22e442110bdd457a54ecd7bd8617dc7fdf369a099a17e9cc", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/CatchUpBarrier.java", + "type": "file", + "size": 6889, + "sha256": "72586ae7095da713645feba5a4415fc1f1e0b48f1612bbc05f4a733f507e269a", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/CheckpointDomainEvidence.java", + "type": "file", + "size": 3196, + "sha256": "aab3b12ceec18ef2a26388ba6ffbfdfe9a820e25e4a4dac9674f68414e4ef49f", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/CompletenessEvidence.java", + "type": "file", + "size": 1993, + "sha256": "0ca8f7dbaa30ae223a9bae6a14763941707ef841ef4f19b9889f4bfeb143e59e", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java", + "type": "file", + "size": 32117, + "sha256": "8165cb8f8f9fbbbcc1ff7ba0dd10f963db4a42efc98d91316b4b1bd604358a81", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentIdentityReader.java", + "type": "file", + "size": 1817, + "sha256": "5cbf9dd47b0b7637cef370721a76536a0cce84faf0551d5667577013edcbb874", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentSession.java", + "type": "file", + "size": 12890, + "sha256": "313113573efa094bab656887ee94a7e923cab933fc1f04dea52ab860f2efd1de", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java", + "type": "file", + "size": 46936, + "sha256": "1dffca151277b61caf8ef3860ec67aaa3767fdd4b49fd3040a062659fca2d7cc", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedBoundary.java", + "type": "file", + "size": 1014, + "sha256": "66b0357435d1e8e4f1f866335581de80fe74ddc1b7242bc96a100e97cae399a3", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedEpochCursor.java", + "type": "file", + "size": 978, + "sha256": "bb6d55e3af2a136fbe38f8d97574ebb153436a94b043679455deb99068601048", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedEpochInput.java", + "type": "file", + "size": 9950, + "sha256": "9b298c77ea0e762b111735d43a8f028a8bdd8de78c955c3dc99f9e8b0f2bcc4c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedLayoutPlan.java", + "type": "file", + "size": 7864, + "sha256": "75ae055f027322e2093ecbbd8c485d3938e04ed5d3c40524cdfd2b514aa4933d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOccurrence.java", + "type": "file", + "size": 919, + "sha256": "25710aee0ce926adf0a1ba3db07902e67a4c1f9477db13d12acaf3d65b6e16e6", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOnlyLayout.java", + "type": "file", + "size": 3744, + "sha256": "ed03ee6f1cac01f42c948ffa21efed4cf43b20fb0b8b5549b2694bb0b1289a6e", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddedOnlyLayoutBuilder.java", + "type": "file", + "size": 26664, + "sha256": "f4f6e3a88502916012b7485c4f105734ee4fccb0c0be0f322ef5ca3ec732737e", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EmbeddingBinding.java", + "type": "file", + "size": 4423, + "sha256": "7249697c8e8c3393f2815f537398e553620fedbd11b2c677aa2e7a2c83145b59", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/EngineMetrics.java", + "type": "file", + "size": 8224, + "sha256": "0a53f55cc44299aa0472aad0b4e721ebb3547cb8bd5eb6d4365311648f65c0f9", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/HistoricalAvailabilityControl.java", + "type": "file", + "size": 683, + "sha256": "7bacf10f06efccdfcd64e4a9492e357a2e6c35e7a898816889a921c430c3c3e0", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/HistoricalStep.java", + "type": "file", + "size": 2423, + "sha256": "8947f15a61214f92fd6f4306739961a46b86c9c07a038ae7dcc57d9b3dd5147d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/InMemoryDocumentStore.java", + "type": "file", + "size": 1636, + "sha256": "f228640af729383957e5bfc5af8e38365c59117384a1bf236755b86c7bf473aa", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/InMemoryTimelineJournal.java", + "type": "file", + "size": 15319, + "sha256": "b1888f16d53934d7950a16c27b94527040eefe2c7b342d3c645201df5c452fb0", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/InternalProcessOutcome.java", + "type": "file", + "size": 862, + "sha256": "583da428dcef1e879637a40b1d5ceb1b3a000d3c05955a19adb44c99f613507a", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/InvalidAdmissionEvidenceException.java", + "type": "file", + "size": 379, + "sha256": "f71d6e6ab3089e366cfabab70f61fddab6e99f289d8cb7ff4f813655a3e7aaeb", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/OperationRouteIndex.java", + "type": "file", + "size": 13446, + "sha256": "60b24035f260b87662b41d74725d6de83688b5b93a2d5b9e7b849fbacd3ae1bc", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshot.java", + "type": "file", + "size": 12510, + "sha256": "ea9d88b925098e9fce76e20caebb9b90c7cf29e032b0b524ff68acc0f04295e1", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/RoutingSurface.java", + "type": "file", + "size": 12774, + "sha256": "4e00ddd669196ebf2036264861df83d52ff7814f77e8fabcfd49622a0678e0f4", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java", + "type": "file", + "size": 120346, + "sha256": "a4896f72917c9c76904a86e799ccc3aa367f2a9aaa4261c426ea493e04105bf0", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/SourceSurfaceIdentity.java", + "type": "file", + "size": 8380, + "sha256": "1a23b305455fbe2381f3f98eff0494ed4ba0b0fe5acc503f1cb59aad5a74bae5", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/WholeObjectStore.java", + "type": "file", + "size": 10161, + "sha256": "4e5dac2eba1fafdbb071ec17d729ae3274180d7e42c201d4e0adb1118033445d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/internal/WholeRequestEntryFactory.java", + "type": "file", + "size": 11951, + "sha256": "50812a6238555f962b2e49d3067c60c0e161bfb0a3814cedda88399ac9db4314", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java", + "type": "file", + "size": 5256, + "sha256": "303688c2d25429e9ea26e29d042cccf51a62ea3402c91b3fe2edb263bef6173c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/AllTimelinesExternalSubscriptionFunctions.java", + "type": "file", + "size": 8576, + "sha256": "93de278eb76efbada326739e33062f3de2ebd17de2db49b54f8bd2f38a7b33bf", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/BlueSemanticIdentity.java", + "type": "file", + "size": 5422, + "sha256": "bf776957e6a78bf12eaf60e167bba3beb75151b6845b6d98992c598ba6194977", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java", + "type": "file", + "size": 2389, + "sha256": "1e8b60e105c48112f45335a33774c870310041f31725236b2ff7a6594396369d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java", + "type": "file", + "size": 5834, + "sha256": "0cb608cf6f7a7f1f74270acc70732eae83f41aade7ccfee6613d98e5bc260608", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CompositeTimelineExternalSubscriptionFunctions.java", + "type": "file", + "size": 8278, + "sha256": "3ecb0ab1d3ef9e7da82fac1f6d9d873e2a96b72e0f962254e1bf22dad466db36", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java", + "type": "file", + "size": 1345, + "sha256": "6f33041450b2b4ce40b4fdb2dcd1c1cd9a6fbac2e6025fb98f87adef5172bc7d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationCurrentRepositoryIdentities.java", + "type": "file", + "size": 6199, + "sha256": "75298ca2b99c7cd458e0a969fb4f2ae30b43e4094adbcccd978ece18aeab6e59", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationEventNodes.java", + "type": "file", + "size": 37307, + "sha256": "5eff1567cef6d11baba16fddc58f0a80d7f132b5ef20221314e27ec335028fc6", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessHeaderBridge.java", + "type": "file", + "size": 1010, + "sha256": "b97bcfaa796b91e8240bc400e4c2fc7858411e03c898dfd059c55e79d7bca8bf", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java", + "type": "file", + "size": 5742, + "sha256": "7ffe2557650ad9817f247114be810c94d57a48f7f9c0f807dedc94649ee4f3fa", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationProcessors.java", + "type": "file", + "size": 14822, + "sha256": "d5479be29e90942632748f566239b9a02693af77887e11f27d76bd3db9cfa3d2", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeGas.java", + "type": "file", + "size": 3567, + "sha256": "b47b849723d1fd4659dc37e5a96fec2a80a29ae76037eff584f0ed2202edbc73", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeLimits.java", + "type": "file", + "size": 1249, + "sha256": "c5b57bf6863993875915916c6380de2bd0e80755b39b4900f5be24e91e88f2ab", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationRuntimeRegistrations.java", + "type": "file", + "size": 5870, + "sha256": "504e34d80c3e9da73dd0b34a3c4b54b983b783d0c4985a7f105c3ee15a91d97c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CoordinationSemanticTypeIdentities.java", + "type": "file", + "size": 7927, + "sha256": "b5d62a7fff3c578cde361a7079063c4b3cc9a20f54704d44a9d8765b072d65d9", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/CurrentRepositoryMarkerProcessor.java", + "type": "file", + "size": 905, + "sha256": "3dca459f91a9b4c5194fda340617d82eb21299406980122bc4b745cdb3679ad3", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/HandlerChannelResolver.java", + "type": "file", + "size": 2014, + "sha256": "b3a9d8382160ae54ab216fecea24d4936581bbe42a796845628793fb9668b5cd", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/OperationProcessor.java", + "type": "file", + "size": 1290, + "sha256": "a76a31c9ca445c8ba3fd7a2dfd396ae867230f0912fda1ef8ceaf8cd35963200", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/OperationRequestMatcher.java", + "type": "file", + "size": 3870, + "sha256": "90605c1b6700e3bdfcd607c2065b9dbe211bb72bf3de3074ea4634afd4bebc87", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/OperationRequestRoutingFunctions.java", + "type": "file", + "size": 5853, + "sha256": "0563c636de339796973e74dda6a17272f538ecec125da0b3f7df05df32756a11", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java", + "type": "file", + "size": 1855, + "sha256": "2322c2fdd2bc80b859b267cae1139a03e0edf2c0c32d28b7384df0a8f86fa646", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java", + "type": "file", + "size": 2783, + "sha256": "501f5e8bc7a84f40706ce48952ccb6c95b057aeed9c81634505b27ce7b4c6f6a", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java", + "type": "file", + "size": 2709, + "sha256": "11c97379b72d470811d201ee138ca1b6f5416573a7e836d687283f521ef35a2d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineChannelProcessor.java", + "type": "file", + "size": 2465, + "sha256": "8a1661cf357ad585804b331d1a1954a1ab799d576d7b0f8834d3a98cdbf642be", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineChannelSubtypeProcessor.java", + "type": "file", + "size": 3076, + "sha256": "ca6df55d4df3ea750038540d5e4da53317749a2fa44a598077970e931535f454", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineExternalSubscriptionFunctions.java", + "type": "file", + "size": 9691, + "sha256": "eff291b0d52799e607f6382a34c2f5199b9865fa1b562dbcb750ce2ec1561b0c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineMemberSubscriptions.java", + "type": "file", + "size": 6415, + "sha256": "bc3b4ec6373505da8a6be320274c85bc73dbd9843f60bc5cd6e80780db9584bd", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineProviderSupport.java", + "type": "file", + "size": 30237, + "sha256": "4d860258e47559797303a464bdc64d4c3bfd5453bac8a42be3ec4fb7b23801ba", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/TimelineSubscriptionProjection.java", + "type": "file", + "size": 20284, + "sha256": "5b89382fa2624deaaeb38518dab034b95840baa9249ba53452c28039034c6de6", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java", + "type": "file", + "size": 73529, + "sha256": "17bcd73edd7c4f72c089f3cb27b2a2a9da5dcbf9767026537a23a27d845ac68c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java", + "type": "file", + "size": 8031, + "sha256": "82916b18749b3fdf32a579ff97c0247f528f76ab890f686f16ea6485922d76aa", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/bex/BexWorkflowStepContext.java", + "type": "file", + "size": 1023, + "sha256": "d53b007d184b4e8cb5cdc61e318f072e8355b6016b417871c18a46bd1528ea77", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/bex/ProcessingEventIdentityObserver.java", + "type": "file", + "size": 1366, + "sha256": "c748423c4bac185498560937d7b9fada3913c7fa94fe7e79b1190dacbb0052fe", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java", + "type": "file", + "size": 16256, + "sha256": "53d7fe70598b3c9b1214ec95b72b059dec846b9c09b45932401639fd812569d8", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationBexIntrinsicsSupport.java", + "type": "file", + "size": 4518, + "sha256": "5b28a5ed4a8a90e642ebf635c384912b044964f5f328ca321365c624f2e1f007", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationProcessHeaderSupport.java", + "type": "file", + "size": 7566, + "sha256": "f57ad7aac649d932e14916b80c05e7f179ae8f9c2c271eddae8c47c7130eb6a0", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationRuntimeGasSupport.java", + "type": "file", + "size": 17535, + "sha256": "27a287f1d596c3ec90022d284f34d1bf0be54472581017320d7141a3fbd071c7", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/support/CoordinationRuntimeLimitsSupport.java", + "type": "file", + "size": 771, + "sha256": "6d379f96c5d80e93eb58b3f14d495e214dc602c3fee5b2576e121b028b0eca8e", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java", + "type": "file", + "size": 7035, + "sha256": "3cf75791f45396c488179a7115ca02648e2dab2e71de17aca8efa6bdd6dfdfc9", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java", + "type": "file", + "size": 3786, + "sha256": "91a530444649428cf59d102194a5ba4fed1ed37c6090a408422453a082454c1d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java", + "type": "file", + "size": 12855, + "sha256": "5d2a42652ea8d04ba4e29600b7abeb683ddeb5f04f85de2f8965f040b6a385a4", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java", + "type": "file", + "size": 9477, + "sha256": "7411943c73250a55f2e18870beb9b9cb8aa3966f43ada4d63919b9b9a73b39d8", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeProgramPlanCache.java", + "type": "file", + "size": 8080, + "sha256": "ec34ef76b715643e61ec7c6d1839bb0819ea81926c65054679c3e023088bf7ac", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java", + "type": "file", + "size": 30355, + "sha256": "386969a8bb8e8ad6db60f6c54200e4f8154507585e99380e59265a5c8c53c732", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java", + "type": "file", + "size": 424, + "sha256": "e0b9d99cd0f8f2270031677ab55831ee4f7b5aff2a4f563bf3505c38c72fe312", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java", + "type": "file", + "size": 14508, + "sha256": "e2dcf639efee652e2baadd54326809a9377e4eb446276deb9ac11fde945aebf8", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java", + "type": "file", + "size": 3653, + "sha256": "b2bb8336b55946701014f43d50c74cfd15b651389f6a6fbb2c2687333b7c7a77", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/NodeUtil.java", + "type": "file", + "size": 2738, + "sha256": "d57d18cac1ebc953562cb72e67e6ac59224f044d91b03955558f0d4d72258356", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java", + "type": "file", + "size": 18477, + "sha256": "1fba96f4bde1fcdc72329a6529895270c4b3360ee4b676d1b7d7a3ef9e9128dd", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java", + "type": "file", + "size": 6288, + "sha256": "4fbb99d2b295047f55a591deed9fd820b85799416dc823593f91b680393b57b9", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java", + "type": "file", + "size": 30137, + "sha256": "888205c2fb8d0fb9d2945c8d8185abbeccfbd577b4a0d8e2dc02187669ffad11", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java", + "type": "file", + "size": 9855, + "sha256": "5739dd4e5d6ef4661794242afc6e2291708dc0a61cb14630a1642750e7829ae7", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java", + "type": "file", + "size": 13844, + "sha256": "06df499e090b7c0758d3a802c85ae21fade4ef2add9f91b8f0df34a37f04c58d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java", + "type": "file", + "size": 2380, + "sha256": "7c6525dde55bc5818b772555537b805dd5e3fa8477b4afaa01153ff2848e1f2c", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java", + "type": "file", + "size": 4009, + "sha256": "c4f07ab0c0ba2f39e7a8c6f45e386646671dfa86ab8e2405f81ed4fbc1048b93", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java", + "type": "file", + "size": 12700, + "sha256": "e7b5a224db28f218cb34537c271361d0fbc701429b7f0761f16330d3004f6196", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHost.java", + "type": "file", + "size": 14208, + "sha256": "abee6405f8d9b6a03943660ffd0647694e242f9086acf4ab3c8d16b031907b5b", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowExecutionState.java", + "type": "file", + "size": 7107, + "sha256": "bb7c30387e2e103559d010adfae80585417899ff6247fdc5e0fc6b4f926a1acc", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java", + "type": "file", + "size": 1220, + "sha256": "49fae0b32d22093bc23e53ad0b3791c9130db7f371750b7a772bee8f98daa13b", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java", + "type": "file", + "size": 433, + "sha256": "0995f54a1b8569698cec726840b0feb930704be469986c06976c3587e02213b9", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java", + "type": "file", + "size": 1937, + "sha256": "10e29bdf6f90455a6cee5e0c3d3a62ca0f52db28d42eaa0b9e32a03af38ed50d", + "mode": 420 + }, + { + "path": "src/main/java/blue/coordination/processor/workflow/WorkflowStepTypeProfile.java", + "type": "file", + "size": 6282, + "sha256": "ef1785667b008ad04699250e50ca82c744ec3ead9d4ce3152b26fd311d9c5420", + "mode": 420 + }, + { + "path": "src/main/resources/blue/coordination/processor/coordination-gas-1.0.yaml", + "type": "file", + "size": 2352, + "sha256": "9fcdc22563152cdd8cb37f9ea739477ced5f7a9e3088aecaf246812c3a3c6bab", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java", + "type": "file", + "size": 5673, + "sha256": "9afcaebcc2a8a84b380c65d1b9ad3a4a9ecf733b6164418f1fb9e752712714fc", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java", + "type": "file", + "size": 5025, + "sha256": "e8e0c69f50d162da46b1c96193fbcf0fcf8d69282cf83dc78225b755075c4df1", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java", + "type": "file", + "size": 10706, + "sha256": "6c8d4f6cdb5dd5c0d83b04b1d82bcab34786775aa46458df5e1dfeb420c1776e", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java", + "type": "file", + "size": 14580, + "sha256": "f12a5139bb97b4cda738c4e4e3f3959617276949ddfbd3c9673389081d8432a9", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java", + "type": "file", + "size": 9237, + "sha256": "7be29715cdbc26c629c3dda3383405be0fcb4ccfa907d7ed234095e5030f854c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceDeterminismScenarioTest.java", + "type": "file", + "size": 8761, + "sha256": "b2cfa67b28a17b1f8b24cbc427699c7fc151c6cde858a4c2a81944175de49851", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java", + "type": "file", + "size": 34953, + "sha256": "e0ad65c7f1e7cd1e58eee1c6cd31d4932ae0b9336d29177f6e13cdc254f5982c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceInitializationTest.java", + "type": "file", + "size": 5248, + "sha256": "741836e3fe22cbf4df814f6df99c920af5da6a4f08dc53dd172f7aa805a21481", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java", + "type": "file", + "size": 19368, + "sha256": "7753fae42dd382d21556057113bba58ba762fe5d24cd331064044b1589b39681", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java", + "type": "file", + "size": 24321, + "sha256": "98887e7b42b7f1c15f550dff7178ed241bd53e44c85b4702a2abe2106f45c07c", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java", + "type": "file", + "size": 2532, + "sha256": "92519fb69108da319a8adaca915257bce64bc05db94a97046e3a42f48970343f", + "mode": 420 + }, + { + "path": "src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java", + "type": "file", + "size": 31675, + "sha256": "ca6b8ee53c6c328c59dc0092f376ba5d16662dd8a4208a8b9415dd7a4bda2a29", + "mode": 420 + }, + { + "path": "src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java", + "type": "file", + "size": 10025, + "sha256": "273ebc45d5b53e72265d44f99e50810ffa627ed7b9dbdd3fb52a34ec6acb46c7", + "mode": 420 + } + ], + "sha256": "1690fead363a9fcfab0951d68eb80754dd434f3c0e3e96059722211840cee04e" + }, + "applicationPathEvidence": "COMMITTED_OCCURRENCE_CAUSE" + }, + "rawSampleSequence": [ + { + "ordinal": 1, + "pair": 1, + "variant": "baseline", + "startedAt": "2026-08-11T12:02:06.340Z", + "endedAt": "2026-08-11T12:02:30.862Z", + "rawPath": "baseline/1.json", + "rawSha256": "cbed8808a51f9989605433da59daab5fe1484da162bfcdf49927b69823d7876e", + "canonicalSha256": "4a1e1f0f27023ae19670ce71bff1cc80f0527723cdde2e5bdea548739c9e5e77", + "entrySha256": "388f4af27760299fc18a45818986fffde7173db54cc987aebeaa79cbb2bfe9b6" + }, + { + "ordinal": 2, + "pair": 1, + "variant": "candidate", + "startedAt": "2026-08-11T12:02:30.930Z", + "endedAt": "2026-08-11T12:02:53.463Z", + "rawPath": "candidate/1.json", + "rawSha256": "a8f35d42485764a400f853329f81f345ccc012071cae27a9e0d14aad5d3eef73", + "canonicalSha256": "cc251e82bec53ca7a1c4f2a76c2d2a42a1749e4d6f53bc803b3b10fa8472d420", + "entrySha256": "a76e018018458b927b26caaa7e685d8eb2b16457f0d86c6ec3538eee542303b6" + }, + { + "ordinal": 3, + "pair": 2, + "variant": "candidate", + "startedAt": "2026-08-11T12:02:53.528Z", + "endedAt": "2026-08-11T12:03:15.893Z", + "rawPath": "candidate/2.json", + "rawSha256": "6a20b025b6e657e2371980208b81baf3f3dbacc3a9119c695dcb1e70cb8f9b96", + "canonicalSha256": "41a126bdc978ba035983112916eb55b87a8766df7a24f24ec17df6e7d6bc37bd", + "entrySha256": "51cc160a0dedbdc1ee5fa986f28e628bdab4a0bbea8c2d4abe02ad146fb14e61" + }, + { + "ordinal": 4, + "pair": 2, + "variant": "baseline", + "startedAt": "2026-08-11T12:03:15.960Z", + "endedAt": "2026-08-11T12:03:38.374Z", + "rawPath": "baseline/2.json", + "rawSha256": "2d710e19cdc66b6bfa611286c486500a7fffd12c93c613b65bdd6984e2d109ed", + "canonicalSha256": "f8890959f06322dd8ff07522fc80b9eae7dac3ef81700ca69e9592479ee9c2f9", + "entrySha256": "69310b0b96803c61030a22978ac4277fa33dc8839f4a0111d2f7918568e7de45" + }, + { + "ordinal": 5, + "pair": 3, + "variant": "baseline", + "startedAt": "2026-08-11T12:03:38.443Z", + "endedAt": "2026-08-11T12:04:00.668Z", + "rawPath": "baseline/3.json", + "rawSha256": "aabb2fc954f6709d6ec38291d5e86db3c9801600592f93359e2059c73c43a93a", + "canonicalSha256": "adba7ccb53c7b55a28146a8ff71329575254c36118747d3e0dce85d5bbc2e481", + "entrySha256": "9f3fbeb20dea1dde6d5717f1d4e9448224a6237234bc6ad7a2bfbe94d87eb36a" + }, + { + "ordinal": 6, + "pair": 3, + "variant": "candidate", + "startedAt": "2026-08-11T12:04:00.732Z", + "endedAt": "2026-08-11T12:04:23.426Z", + "rawPath": "candidate/3.json", + "rawSha256": "e0f445d9ce57ff164dc42118e430efede6361df1446f7be5b51c615b8b9d7af3", + "canonicalSha256": "1b0de99420444933f50790133866dc4e41b4cf74b6b91402a9a90c3376b58a95", + "entrySha256": "47d7295c2587065274754d811d198e9f48a7669104e9ccbc2576cececf569783" + }, + { + "ordinal": 7, + "pair": 4, + "variant": "candidate", + "startedAt": "2026-08-11T12:04:23.493Z", + "endedAt": "2026-08-11T12:04:46.015Z", + "rawPath": "candidate/4.json", + "rawSha256": "3af5ed98add6757ddc0cb1efeaf14e16d6a33dafcbfb83e5881c59982ae40806", + "canonicalSha256": "3406369bb0d90defa657be95e96e1ba091417051c424a8ca19f03136d8659be5", + "entrySha256": "5752a3302cda295fca62d6d006d213f0368ce707225681720a60684e31481607" + }, + { + "ordinal": 8, + "pair": 4, + "variant": "baseline", + "startedAt": "2026-08-11T12:04:46.081Z", + "endedAt": "2026-08-11T12:05:08.531Z", + "rawPath": "baseline/4.json", + "rawSha256": "cf9a368013b359a16695244411d39df237c89a2a13ed9724e6b95ce3f96e78e3", + "canonicalSha256": "73473fea2440828bc2b422005497565702a8d10267b12805731be0bd75cf800c", + "entrySha256": "25f02b3bf6cbd965aa43690cc3d0be0e4c7bdd5e84a0f3cc8d0c9ed352610b63" + }, + { + "ordinal": 9, + "pair": 5, + "variant": "baseline", + "startedAt": "2026-08-11T12:05:08.603Z", + "endedAt": "2026-08-11T12:05:31.260Z", + "rawPath": "baseline/5.json", + "rawSha256": "16e701d0086bcbb0468fe16bd5dcad8e8b8c6df7fdbd2f7e60b39f9daef38167", + "canonicalSha256": "f12ef930e26d551eed832dc23300321b8ba2224ae14510053126627ff3e27b55", + "entrySha256": "eec5efbfb72678888caade042192c9e654ab2a836814f65f72046a0c285a8bf1" + }, + { + "ordinal": 10, + "pair": 5, + "variant": "candidate", + "startedAt": "2026-08-11T12:05:31.328Z", + "endedAt": "2026-08-11T12:05:54.438Z", + "rawPath": "candidate/5.json", + "rawSha256": "9a40d21e5697262a6d08f98e3a01e319fef3577af3321ed08630d77c4ffca766", + "canonicalSha256": "95b874a85963858e38e7f7eed4ea5ce934bdc160d86f123b431cb6ccc3fed481", + "entrySha256": "956b20748e861875592601eb35391bb23a01ca64d3573c7b66f12dbd44a216dc" + }, + { + "ordinal": 11, + "pair": 6, + "variant": "candidate", + "startedAt": "2026-08-11T12:05:54.505Z", + "endedAt": "2026-08-11T12:06:17.373Z", + "rawPath": "candidate/6.json", + "rawSha256": "d04ce026dbffe0409921dcfa09e7c2ec0537b2cac8c500aa815c6fa0a45da20f", + "canonicalSha256": "cbc3602b05f04edabdd286536a0bfd9fcdffabe0e6677af527110faa735e6090", + "entrySha256": "09016bbe3b49192dbf7ee74d35919be901bf38966de69fe3b3ee8f8ffffec2a4" + }, + { + "ordinal": 12, + "pair": 6, + "variant": "baseline", + "startedAt": "2026-08-11T12:06:17.444Z", + "endedAt": "2026-08-11T12:06:40.348Z", + "rawPath": "baseline/6.json", + "rawSha256": "8e3f14b13833d9719096fd84ef4ee8c2bc6f7d0d5015bb188fb55cc304aa7ac4", + "canonicalSha256": "081410ab41be728d98eee2f3248037de74eced1773e9a1194bc1b07abccd9445", + "entrySha256": "8c821ed42b7614ee365f10d2d422813d9c539b80369e5e899bd9b492adc67a6e" + }, + { + "ordinal": 13, + "pair": 7, + "variant": "baseline", + "startedAt": "2026-08-11T12:06:40.415Z", + "endedAt": "2026-08-11T12:07:03.065Z", + "rawPath": "baseline/7.json", + "rawSha256": "25a897bfedf113681689884b37cc59a8bc9f4ab2c38d02d9d4a12818b532a460", + "canonicalSha256": "13d1d10c7a7682da6b0d4d7416c8416c4e2737a9fe54a53912c668fbb6aa2cb1", + "entrySha256": "8b11a1f6346102c269f5163dce6074079416b58c4d1d69df7a5876b42ed7b8bb" + }, + { + "ordinal": 14, + "pair": 7, + "variant": "candidate", + "startedAt": "2026-08-11T12:07:03.130Z", + "endedAt": "2026-08-11T12:07:26.208Z", + "rawPath": "candidate/7.json", + "rawSha256": "0995bbc771ba049f25da8f2e30fbdc53d0aece92d331d2ff2d08a2fc3fd9b009", + "canonicalSha256": "b46edbe4f91541e00749dd1091fc8a8bffcf3094662098cb3a94b6977f9a7b7d", + "entrySha256": "0110fe0e5880d34e177d01edc6c4ecd1f7c30b7931c3602536f4c027d961b598" + }, + { + "ordinal": 15, + "pair": 8, + "variant": "candidate", + "startedAt": "2026-08-11T12:07:26.274Z", + "endedAt": "2026-08-11T12:07:48.763Z", + "rawPath": "candidate/8.json", + "rawSha256": "94854fb1d21d651f84d874b3264ef793f975bca4fac3be485ff6eadc43b689d5", + "canonicalSha256": "772f05ebe6ad1f111f620fa438b273f1aae4992bb287123a2a1f41af3f7fcb9a", + "entrySha256": "44f770c797d856c0819391280fb8c791d0830870c58cf82c5c454040f465e78d" + }, + { + "ordinal": 16, + "pair": 8, + "variant": "baseline", + "startedAt": "2026-08-11T12:07:48.837Z", + "endedAt": "2026-08-11T12:08:11.094Z", + "rawPath": "baseline/8.json", + "rawSha256": "97ee49687bff1a27c48f9eb49ae0ef9a5008ca3724bde30c537e004785ad6ab7", + "canonicalSha256": "5d208c7254ff97993ad9cca41f99ad462bb04a8c128f1643fbc207497d3706c0", + "entrySha256": "6d3286859b0146fb5b264717b3d7754176a3d52f62a9f61456c3d914392892a9" + }, + { + "ordinal": 17, + "pair": 9, + "variant": "baseline", + "startedAt": "2026-08-11T12:08:11.162Z", + "endedAt": "2026-08-11T12:08:33.670Z", + "rawPath": "baseline/9.json", + "rawSha256": "bfd75b69e20acfef674d927b3160e70df216d75b6101b846c24aab43df17f2d0", + "canonicalSha256": "2d3d7dab9db6108d7076fb98f2353217f78ecabc048b7fa8bc132aa93e3e2294", + "entrySha256": "5488ba0c0e52de6ae9b2a9258352396e5b93a2ec569d426080062f9b9325b7c1" + }, + { + "ordinal": 18, + "pair": 9, + "variant": "candidate", + "startedAt": "2026-08-11T12:08:33.736Z", + "endedAt": "2026-08-11T12:08:56.231Z", + "rawPath": "candidate/9.json", + "rawSha256": "11311b08586989bea0a7b4fe3d698834483daac6d2fdc0d4d54712181d775a18", + "canonicalSha256": "5acd5bea56b99700dd3964ea238ce0dd45d5eabfc7ce32f995b62fa69c18fb6c", + "entrySha256": "1ad4701619a9537db68976334b764f66eca10be6d8bd23a738618d643b92370e" + }, + { + "ordinal": 19, + "pair": 10, + "variant": "candidate", + "startedAt": "2026-08-11T12:08:56.296Z", + "endedAt": "2026-08-11T12:09:18.839Z", + "rawPath": "candidate/10.json", + "rawSha256": "5617f98f6eedeafd07efbd4cc408ba9c9f26b6e7f2e7a8cbd127edf92db6bb80", + "canonicalSha256": "400fbc9b155443f3661b46ee3ed1206e42b00ddfec985dc11d793ec017458a84", + "entrySha256": "a2e88bce477dba26882a845f60560aa0f86c2268dcfda87ab08c32fa6fc7646a" + }, + { + "ordinal": 20, + "pair": 10, + "variant": "baseline", + "startedAt": "2026-08-11T12:09:18.905Z", + "endedAt": "2026-08-11T12:09:40.987Z", + "rawPath": "baseline/10.json", + "rawSha256": "7e6023f80d3feebdff05e8c53f96c511e865c919ea46b9ce180f4df1b2392f04", + "canonicalSha256": "269912a685c8816b3166ff444b937f30779dd24097a47afb8247d1777d10b83f", + "entrySha256": "222b10e6dc3aef2e79464be91aad2c08916abc000a47872b5123046ebde91086" + }, + { + "ordinal": 21, + "pair": 11, + "variant": "baseline", + "startedAt": "2026-08-11T12:09:41.057Z", + "endedAt": "2026-08-11T12:10:03.943Z", + "rawPath": "baseline/11.json", + "rawSha256": "e120852b6603dd4750a4cc35614ce0614524501adc5fffe623447790f64a10e8", + "canonicalSha256": "67551eedb100b0865741c6740dcb26967a8dca331dd8bf53ffc0ee0e74ed5dde", + "entrySha256": "b25477dba1445439fe7f38768af9af799ee5179cc947ff286a7ad8b5430586ea" + }, + { + "ordinal": 22, + "pair": 11, + "variant": "candidate", + "startedAt": "2026-08-11T12:10:04.010Z", + "endedAt": "2026-08-11T12:10:26.838Z", + "rawPath": "candidate/11.json", + "rawSha256": "18eb629ee2d0191909609b9b6014bd85f7802dadb8faf52ccec03bbc7f9b3d2e", + "canonicalSha256": "aaff05fa3c46a70bc003f253e5f4888e49592035b08ac75c03a624e78d87d426", + "entrySha256": "25025cea061cd47305f2550aed384c52a03c3b99486cf5117b82c5165db07f39" + }, + { + "ordinal": 23, + "pair": 12, + "variant": "candidate", + "startedAt": "2026-08-11T12:10:26.903Z", + "endedAt": "2026-08-11T12:10:49.471Z", + "rawPath": "candidate/12.json", + "rawSha256": "9a5170f983b930a30ede46bac5693fdca5933488508182eea058e9fd26738aec", + "canonicalSha256": "23f010decc8c9d29f8a864c7efa37f46138dbcfc2a8fb406db298caae5eaa98e", + "entrySha256": "a5ae8aea0b16dd96a5b8883887dfe3468c1b033f1a95b0838c23a8eca0444659" + }, + { + "ordinal": 24, + "pair": 12, + "variant": "baseline", + "startedAt": "2026-08-11T12:10:49.538Z", + "endedAt": "2026-08-11T12:11:11.918Z", + "rawPath": "baseline/12.json", + "rawSha256": "30fc388d6d0eed9ffd8ba6b5addc62ea2005fe527f03124b6596bbf5dcdf1f1e", + "canonicalSha256": "8b886295aaebe0a37068f26e11f1010fc32f97dd1ff6a6f9bab26526b16dea2e", + "entrySha256": "4e2545e1b7d41cac2e6e0164a19f2aaf97847a99543b115928afa8f340ab3921" + }, + { + "ordinal": 25, + "pair": 13, + "variant": "baseline", + "startedAt": "2026-08-11T12:11:11.986Z", + "endedAt": "2026-08-11T12:11:34.659Z", + "rawPath": "baseline/13.json", + "rawSha256": "d11f23c85d519721df5b7564055355fc3ba355651853163fee148f3078a5fd96", + "canonicalSha256": "03bc99a51e75d3b919228436d8ff42d18e1fdf78550bb4b0575969f49981149a", + "entrySha256": "d1a43cf3049da7af8eae7f75f933f618ba7a34b263beb9034f26f7691b954dbb" + }, + { + "ordinal": 26, + "pair": 13, + "variant": "candidate", + "startedAt": "2026-08-11T12:11:34.730Z", + "endedAt": "2026-08-11T12:11:58.145Z", + "rawPath": "candidate/13.json", + "rawSha256": "b00273901a9f230c9bcc9fc2dff6fde2ca7d5627ea556928e6195010daa84298", + "canonicalSha256": "f9bd80562a4d4f8397fc5500375b0271586342573b3cdd4ee9bc4e78340c4e96", + "entrySha256": "7743898fc9679cc19874ac028585b2f89b2f8a2d91ce7f8c15bf8403f0ee7eb1" + }, + { + "ordinal": 27, + "pair": 14, + "variant": "candidate", + "startedAt": "2026-08-11T12:11:58.211Z", + "endedAt": "2026-08-11T12:12:20.686Z", + "rawPath": "candidate/14.json", + "rawSha256": "c62cbb684b0eafeb7ca97c37f49ecbdda5f18682cb7df8beb0a631fce73bc051", + "canonicalSha256": "a4b113dadde911f2aa1498044f820ff82a2829cc4802c91c709fe07550d2d4a8", + "entrySha256": "3bcd255a57cf67fa8f7571ee8ad0dd866c5ed481b3444d6e5d4a51127910c7ca" + }, + { + "ordinal": 28, + "pair": 14, + "variant": "baseline", + "startedAt": "2026-08-11T12:12:20.750Z", + "endedAt": "2026-08-11T12:12:42.689Z", + "rawPath": "baseline/14.json", + "rawSha256": "9845759c25f66a77a94738e426a5942034380ca5952e53ddb48a1f1033b3ff9e", + "canonicalSha256": "ae391b48d9f405e3e167495d5288e50d5e23268da05c965e2cdcf2d5c4c1bb3f", + "entrySha256": "ea13bfc6f1a42cab57e6ab0f9a23f2a1992135c2e15c25bd1ff126f43a79ab72" + }, + { + "ordinal": 29, + "pair": 15, + "variant": "baseline", + "startedAt": "2026-08-11T12:12:42.754Z", + "endedAt": "2026-08-11T12:13:04.744Z", + "rawPath": "baseline/15.json", + "rawSha256": "02a7d082046514bb2823eafbb67194525604093437c7d492099f9113efe0b822", + "canonicalSha256": "514322bcdefceb702b86d48546dddc34530f1d2bf2e524d903d8a96bafbd6321", + "entrySha256": "a7e8b69f0091f467a6c8977b132bc87b7c3da376a9e910bce7ab463d3114693f" + }, + { + "ordinal": 30, + "pair": 15, + "variant": "candidate", + "startedAt": "2026-08-11T12:13:04.810Z", + "endedAt": "2026-08-11T12:13:27.229Z", + "rawPath": "candidate/15.json", + "rawSha256": "6fb2afec85636d155af7fe134877ec94319e2881fe65a1bf27367d6adf4ecd7f", + "canonicalSha256": "52324732e03da1714e87f79291b5a9ebb2a67a6b306491dafff965d8e93d7300", + "entrySha256": "3d2d1ab99e4c21c90b0958f0b2a1c3d20157e4d4984ea4c0adb38bdb1a2fd948" + }, + { + "ordinal": 31, + "pair": 16, + "variant": "candidate", + "startedAt": "2026-08-11T12:13:27.296Z", + "endedAt": "2026-08-11T12:13:49.892Z", + "rawPath": "candidate/16.json", + "rawSha256": "52bb63eb12f1010581b00c1b8fc7941c87dcbff616b97cb6bb6a924f713fef97", + "canonicalSha256": "9357c2b67eb82eab18ac8525fb7e2ef40863342d2f7fa3e3083a13f7681d0f18", + "entrySha256": "98844086266f18cd331c4603c41e4411706b1a1eed034864cc227a7dd189572a" + }, + { + "ordinal": 32, + "pair": 16, + "variant": "baseline", + "startedAt": "2026-08-11T12:13:49.960Z", + "endedAt": "2026-08-11T12:14:12.521Z", + "rawPath": "baseline/16.json", + "rawSha256": "b0455992222da1adc34667db93dc56af48e4f15f5f027c707d2d6a47988a8d0f", + "canonicalSha256": "dfddcb08264da4a0a0a99bd9e4d5101a456125c7543b6a03888705d42eb6d4c7", + "entrySha256": "541d87f7c7a6e24e0da8560b50ec4f8fc9e82e6c79aa7463374f9d8d64ca341e" + }, + { + "ordinal": 33, + "pair": 17, + "variant": "baseline", + "startedAt": "2026-08-11T12:14:12.595Z", + "endedAt": "2026-08-11T12:14:35.099Z", + "rawPath": "baseline/17.json", + "rawSha256": "a502abf91b4b8b325cdf7b9615b1d48882e162d7fccf5d5fd16fd4ffd44ef2df", + "canonicalSha256": "dcef102a0097aed90649047d8fd0e914d9e2ec7e055d93d257444fa884da6ca2", + "entrySha256": "57b87fa908d559f7280f7f08d0a89b69ce5549d33e47d6794e2a33facf265385" + }, + { + "ordinal": 34, + "pair": 17, + "variant": "candidate", + "startedAt": "2026-08-11T12:14:35.166Z", + "endedAt": "2026-08-11T12:14:57.624Z", + "rawPath": "candidate/17.json", + "rawSha256": "3279e1c3425013d7c4e50adae02fcb68631fc24a4081c006a9aca0d878b91090", + "canonicalSha256": "5f66d955c532f6135a172f10423ff107c929a8957167b08866eb892974d4b2fe", + "entrySha256": "799736fd7d9a2c08d3b5e2706736c10c3f8bb9c50b1660190cb91c912d8b9715" + }, + { + "ordinal": 35, + "pair": 18, + "variant": "candidate", + "startedAt": "2026-08-11T12:14:57.693Z", + "endedAt": "2026-08-11T12:15:20.294Z", + "rawPath": "candidate/18.json", + "rawSha256": "eb4b349fc85905773fb82fbd9df6597e2a852d23e304f93e258d1c1abb13eafd", + "canonicalSha256": "e7dca835071683b24d50928babb68a5cc61f1b45212494c042f90e0ef7d54a31", + "entrySha256": "c3226df745a1fa9b3d0b335fbecb30a292f21229e70f568d284fb1533a9c1d18" + }, + { + "ordinal": 36, + "pair": 18, + "variant": "baseline", + "startedAt": "2026-08-11T12:15:20.361Z", + "endedAt": "2026-08-11T12:15:42.804Z", + "rawPath": "baseline/18.json", + "rawSha256": "9ca428ec48cc6ebde121caacabf25cb3aedaaa852a8d35534c6a8cee512b11a8", + "canonicalSha256": "23a8369e82c182262b31db432d1b0441eb8edd82718a491d479a0ed84acd64e9", + "entrySha256": "e663a2309badec44d35687aa16b65c83277e5adb10f5ec1af0fd2e778f5a7ccb" + }, + { + "ordinal": 37, + "pair": 19, + "variant": "baseline", + "startedAt": "2026-08-11T12:15:42.874Z", + "endedAt": "2026-08-11T12:16:05.559Z", + "rawPath": "baseline/19.json", + "rawSha256": "2f60eafe45a0190ca95ae22314ef37e617bcc0a95b0b0018b46efbf76d51982d", + "canonicalSha256": "c4f3b50ea7f39b9653f72264c8bbb2ec5077f7fe788d9d446ec596de93f5e478", + "entrySha256": "1d8c4f9d2d8b2fc69c7980b41240523b7709fac46011d298e470605bb7e2bc4a" + }, + { + "ordinal": 38, + "pair": 19, + "variant": "candidate", + "startedAt": "2026-08-11T12:16:05.627Z", + "endedAt": "2026-08-11T12:16:28.668Z", + "rawPath": "candidate/19.json", + "rawSha256": "729aa43ae376286d422eae43ed60f29d906c5d83ddd67efd0d9ffa1e0f12753b", + "canonicalSha256": "110abdf9cb47fc3cc92ea58624c3b90e35e411f3e53f8104d8df8dc371ac66e3", + "entrySha256": "654ee3325ebdf5fc2d864cbd7c24ecbe096063a06dc5f6d3df41d5edd1b675ad" + }, + { + "ordinal": 39, + "pair": 20, + "variant": "candidate", + "startedAt": "2026-08-11T12:16:28.736Z", + "endedAt": "2026-08-11T12:16:51.483Z", + "rawPath": "candidate/20.json", + "rawSha256": "6d097fe62d7e4006829c2f8924b20229b30535898cf297750493015238df6faa", + "canonicalSha256": "ac123e102a11dbe7f1a524bb7f322c0151f158f56fe180a925250accd4a1b063", + "entrySha256": "4610d2e5140368d3549e3452a4895b9d32c8f1102afef56185a04fb05975cc84" + }, + { + "ordinal": 40, + "pair": 20, + "variant": "baseline", + "startedAt": "2026-08-11T12:16:51.550Z", + "endedAt": "2026-08-11T12:17:13.984Z", + "rawPath": "baseline/20.json", + "rawSha256": "fc11ae0198494b8cdbd7defad14be2267aca2093e619dfd147938164cb4a7242", + "canonicalSha256": "04c476ccac1371ba6b65de7de4761c3034cae304ad6691ed90a1237de3ab7e2d", + "entrySha256": "2a416d95f854fb6ff77345db52742f257a224229dc2d4a990f1e8dcfe1c2d52d" + }, + { + "ordinal": 41, + "pair": 21, + "variant": "baseline", + "startedAt": "2026-08-11T12:17:14.055Z", + "endedAt": "2026-08-11T12:17:36.697Z", + "rawPath": "baseline/21.json", + "rawSha256": "80268ece8eb55393d0b4b6603a1c222ebc6fcfb328d7ddc185e078481436343c", + "canonicalSha256": "ba1a6c444c20fee39f31cc1295681b18fc5c108db89ace94b4579d13d60a78a2", + "entrySha256": "ba710e58df29a6a664bc6022e8663efd20134c9ed3f77187591bca9e94951b18" + }, + { + "ordinal": 42, + "pair": 21, + "variant": "candidate", + "startedAt": "2026-08-11T12:17:36.764Z", + "endedAt": "2026-08-11T12:17:59.535Z", + "rawPath": "candidate/21.json", + "rawSha256": "398513591c30e8708c13f1bb66c7785fb91db7bb61d25b82e78bf3c7baca005c", + "canonicalSha256": "106fa216c4eb5342deea7d530ebc8bffebe10479ec9f6356da74a3add80ef4ec", + "entrySha256": "824c098e680df1304eb1e843259a6ea2d969a6fe3242e19fc588c82bc7b908b2" + }, + { + "ordinal": 43, + "pair": 22, + "variant": "candidate", + "startedAt": "2026-08-11T12:17:59.607Z", + "endedAt": "2026-08-11T12:18:22.190Z", + "rawPath": "candidate/22.json", + "rawSha256": "5cc192c537b83a6222911381822f7d24838ee2b03ff47b486d8394350aa61bc3", + "canonicalSha256": "e0a921d9cdd297ba113cbcaa7b3093935ab660430e0f48be3fa92fd79574d927", + "entrySha256": "50d8565765ef26b8c5b06744ac3b4a77f064a4ff1bd1b988669c9f6461213c58" + }, + { + "ordinal": 44, + "pair": 22, + "variant": "baseline", + "startedAt": "2026-08-11T12:18:22.263Z", + "endedAt": "2026-08-11T12:18:44.967Z", + "rawPath": "baseline/22.json", + "rawSha256": "4e119e1c150b08fcf005d58b1cedc70ecaafafc53a4c6fe5d24e39dee1a4a841", + "canonicalSha256": "d3eb494a23c6367ce126db65a8fca6d8f95f54fda28e4e33e109c63263e37ebd", + "entrySha256": "7187e24ff6a14d559c08c12a7b23886abed136851c4f7ede899586d90ca72cd5" + }, + { + "ordinal": 45, + "pair": 23, + "variant": "baseline", + "startedAt": "2026-08-11T12:18:45.038Z", + "endedAt": "2026-08-11T12:19:07.654Z", + "rawPath": "baseline/23.json", + "rawSha256": "0bd7dfcf307dc023f3661b65d88afa9ec3bf1ecf28f74172191bf9ae6c6fcc20", + "canonicalSha256": "03a2a1545cc47780b712a1178eeb772522c75efc53c0f91a36687270b139ebf3", + "entrySha256": "765dd25d17912624dc5cc0b9f5db165dc263db44fecbac3961630af209ca80c9" + }, + { + "ordinal": 46, + "pair": 23, + "variant": "candidate", + "startedAt": "2026-08-11T12:19:07.727Z", + "endedAt": "2026-08-11T12:19:30.453Z", + "rawPath": "candidate/23.json", + "rawSha256": "88efe4ab80db228c37b653b5b5a266261b68f9841b11f460318c081cd56dceec", + "canonicalSha256": "e8f88a1ede7e58cae02b172360a566d2e933e2305b2671e739d7f54e98322394", + "entrySha256": "932f9b380e9617f44047c732b175726ee4a780cbe8de8539add67a797ddb7dbd" + }, + { + "ordinal": 47, + "pair": 24, + "variant": "candidate", + "startedAt": "2026-08-11T12:19:30.521Z", + "endedAt": "2026-08-11T12:19:53.112Z", + "rawPath": "candidate/24.json", + "rawSha256": "4771f376d4cc4533ac11d454fbb8657dd30d4127a67dc1bebfb0e1ccbb82bfaa", + "canonicalSha256": "4d8484c628c3b357e3d042674c82417223469044018aa680d255a0a531a5c532", + "entrySha256": "b81fd24e740307c2957101dec42793e006371a15ec1a8ae40987fc74bb612814" + }, + { + "ordinal": 48, + "pair": 24, + "variant": "baseline", + "startedAt": "2026-08-11T12:19:53.179Z", + "endedAt": "2026-08-11T12:20:15.733Z", + "rawPath": "baseline/24.json", + "rawSha256": "9b7fcac5bf31e6031f300e26dcdef77860f43144937a92e6612b17b555670de1", + "canonicalSha256": "c5783d79fb3285d61f22d950156cbe5a1286db8c0cf630debe908847362b4086", + "entrySha256": "66fcdf4efba8edce17df138aaeae786e5cc95b3b3be53059dca0cbe5857396b0" + }, + { + "ordinal": 49, + "pair": 25, + "variant": "baseline", + "startedAt": "2026-08-11T12:20:15.803Z", + "endedAt": "2026-08-11T12:20:38.394Z", + "rawPath": "baseline/25.json", + "rawSha256": "69d7abffcf7acb401c4b0dee0d2c80f5185f3b6e6c52275d2e71408abdb5b5b3", + "canonicalSha256": "9bc12140e282a8501dd3f5018323551c0e8699685558f205a1c3503a61717c1f", + "entrySha256": "4c1bb389a081fcd7b7884fe3bf2371da302e5d19ded96dca9bd50db629dfcb49" + }, + { + "ordinal": 50, + "pair": 25, + "variant": "candidate", + "startedAt": "2026-08-11T12:20:38.467Z", + "endedAt": "2026-08-11T12:21:01.177Z", + "rawPath": "candidate/25.json", + "rawSha256": "39362f5ec2900518d54cc01be3ec52d0d9db1b735eb7157fcfdc9ee05b48dd38", + "canonicalSha256": "c721e6dd3f0b0a46c97dc763576b8169ecfc0d6d8a4c6a334cabff16a3e6b7f9", + "entrySha256": "241203cde1dc6605ccc0634ea02e266436a52da9ee10cabdcf5c0bf60d1ad679" + }, + { + "ordinal": 51, + "pair": 26, + "variant": "candidate", + "startedAt": "2026-08-11T12:21:01.245Z", + "endedAt": "2026-08-11T12:21:23.795Z", + "rawPath": "candidate/26.json", + "rawSha256": "fe2cac2c203a3bfd4ae60eee674471d5179c68028ba6d3b0b7c5a17cd5e46c38", + "canonicalSha256": "44b9b0bf792f5e4e2985121a19572b826ecf26dec4cb995b64ec1407439e5795", + "entrySha256": "9c3eb57854d7d958e864958db1edf7651f36dc0ae912a1115e18b9790a6119b4" + }, + { + "ordinal": 52, + "pair": 26, + "variant": "baseline", + "startedAt": "2026-08-11T12:21:23.864Z", + "endedAt": "2026-08-11T12:21:46.417Z", + "rawPath": "baseline/26.json", + "rawSha256": "d06ef8cac37d22da76041c603e7c311138cd65852269151e2a476bbcbd8d8ab9", + "canonicalSha256": "1583e999ea507f918714831910dd94cb4a130b85d3784a9dbf560d901134af3f", + "entrySha256": "a8feca33d9222ebf172abf9a7797cf7ca4548d0e074e367c40d00e1b207380cb" + }, + { + "ordinal": 53, + "pair": 27, + "variant": "baseline", + "startedAt": "2026-08-11T12:21:46.485Z", + "endedAt": "2026-08-11T12:22:09.067Z", + "rawPath": "baseline/27.json", + "rawSha256": "7efc1ece96f0403a4378f15328f96dd5a3447653fc77add0a23e05c3903cb9a9", + "canonicalSha256": "595643698bf2df7dcdf869660ef082af8b8efd25f9f695bf28cb334d65724941", + "entrySha256": "00fbdbf523ff28c7ff784a41f9b9af499ecfffba5638ffe7e94ecef1a4940d8d" + }, + { + "ordinal": 54, + "pair": 27, + "variant": "candidate", + "startedAt": "2026-08-11T12:22:09.139Z", + "endedAt": "2026-08-11T12:22:31.489Z", + "rawPath": "candidate/27.json", + "rawSha256": "762dca0bc4bfb396e493cc0d815c37c234acfc962b752e1d68a961aab5cb23f5", + "canonicalSha256": "d829793819f673c0be3c0f3c201090b3e908c4cf70aaf83de90f1bce0b3f30c0", + "entrySha256": "39ccdf14eefe0ce0606956680b487b29e86cbab6ff903719c96f65c188977a44" + }, + { + "ordinal": 55, + "pair": 28, + "variant": "candidate", + "startedAt": "2026-08-11T12:22:31.562Z", + "endedAt": "2026-08-11T12:22:54.069Z", + "rawPath": "candidate/28.json", + "rawSha256": "47f78770bdea1933839cd82a60d939954f074f66515d6ac54549f36d48970967", + "canonicalSha256": "b0d50628ae73d1f692af51416e6159889d7d53c773d386bdf6397674f7b30eab", + "entrySha256": "d9d6cc8c7a339b65fddd64db8fc619b4fd5e732434b2cdb5a51c90f9676d799b" + }, + { + "ordinal": 56, + "pair": 28, + "variant": "baseline", + "startedAt": "2026-08-11T12:22:54.139Z", + "endedAt": "2026-08-11T12:23:16.634Z", + "rawPath": "baseline/28.json", + "rawSha256": "f7ba7e448029fd674fb8fd1384452df0084d0e61cbbe9a2f9dc20ccc7fe3a68b", + "canonicalSha256": "c055998243070e6811d00303468b110c5085e8dfef562b245309704b9fce6e26", + "entrySha256": "924219fdd3a89c7c8a02e46fd4bf5f4a21449009d50764bc07bd1c519257be10" + }, + { + "ordinal": 57, + "pair": 29, + "variant": "baseline", + "startedAt": "2026-08-11T12:23:16.706Z", + "endedAt": "2026-08-11T12:23:39.278Z", + "rawPath": "baseline/29.json", + "rawSha256": "fbf4ec1bfa2532b0c0de5068036b7801ef687353f8a2c118d599d06d55a51c75", + "canonicalSha256": "71fd6e41e8fd00beebf73f7dc7b8817ba8d3d63926bba6c0aae4aa43fddf112d", + "entrySha256": "ecb795bc46aff0da020d5ebb59a4be252e67af64495899b13d5cb2cf7e0d5747" + }, + { + "ordinal": 58, + "pair": 29, + "variant": "candidate", + "startedAt": "2026-08-11T12:23:39.345Z", + "endedAt": "2026-08-11T12:24:02.020Z", + "rawPath": "candidate/29.json", + "rawSha256": "d4246e49a3e51d5eea178383a54cb53fae34b922b1596b0f81b06e6ad9044bc2", + "canonicalSha256": "005c767cca579489c11b44d13126630f9a4cbf028571e53336fec92373c3a427", + "entrySha256": "12d1e9a00f8f7397b04674cb191972cd65fdfbddc68b80d800927a64fa875472" + }, + { + "ordinal": 59, + "pair": 30, + "variant": "candidate", + "startedAt": "2026-08-11T12:24:02.087Z", + "endedAt": "2026-08-11T12:24:25.309Z", + "rawPath": "candidate/30.json", + "rawSha256": "ccc7a449ed8607925afa2d4f90c8c81da77bd2f65548831db02ee5bfdd337232", + "canonicalSha256": "22e20bc62524db97fa254c62e1043c7609b85eb9d5f136fd8ace76101ead2af3", + "entrySha256": "ef23b1d30f4aeac75a37eac6543d633bf17a949a58a8696d31d999a3629d1bf0" + }, + { + "ordinal": 60, + "pair": 30, + "variant": "baseline", + "startedAt": "2026-08-11T12:24:25.378Z", + "endedAt": "2026-08-11T12:24:48.205Z", + "rawPath": "baseline/30.json", + "rawSha256": "c4ab46083777f72af5b38fc74fc60f62dff7570d37c28ea61f6eb8b6911e5207", + "canonicalSha256": "136a22da7ff319926d2c23a493b0730c41343a92e0f5234a59edd052f3720a53", + "entrySha256": "72dd87480b1f2e25113d18dbbc7321c6ed57271117692f0e63ea7c68512da19d" + } + ] +} diff --git a/docs/releases/round11-verification.schema.json b/docs/releases/round11-verification.schema.json new file mode 100644 index 0000000..c706090 --- /dev/null +++ b/docs/releases/round11-verification.schema.json @@ -0,0 +1,584 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "round11-verification.schema.json", + "title": "Blue Coordination Round 11 release evidence", + "type": "object", + "additionalProperties": false, + "required": [ + "schemaVersion", + "release", + "profile", + "evidenceDate", + "verdict", + "source", + "status", + "shape", + "baseline", + "tests", + "runtimes", + "readinessProofs", + "sourceSurfaceIdentity", + "performance", + "structuralEvidence", + "scenarios", + "blueBasic", + "playground", + "publicationEvidence", + "artifacts", + "sourceArchive", + "capabilities", + "blockers", + "limitations", + "notClaimed", + "mustRegenerateAfterFinalTree" + ], + "properties": { + "$schema": { "const": "round11-verification.schema.json" }, + "schemaVersion": { "const": "2.0.0" }, + "release": { "const": "3.0.0-rc.1" }, + "profile": { "const": "ROUND11_READINESS_CLOSURE" }, + "evidenceDate": { "type": "string", "format": "date" }, + "verdict": { "$ref": "#/$defs/finalStatus" }, + "source": { "$ref": "#/$defs/sourceEvidence" }, + "status": { "$ref": "#/$defs/readinessStatuses" }, + "shape": { "$ref": "#/$defs/shapeEvidence" }, + "baseline": { "$ref": "#/$defs/testEvidence" }, + "tests": { "$ref": "#/$defs/finalTestEvidence" }, + "runtimes": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { "$ref": "#/$defs/runtimeEvidence" } + }, + "readinessProofs": { + "type": "array", + "minItems": 4, + "maxItems": 4, + "items": { "$ref": "#/$defs/readinessProof" } + }, + "sourceSurfaceIdentity": { "$ref": "#/$defs/sourceSurfaceEvidence" }, + "performance": { "$ref": "#/$defs/performanceEvidence" }, + "structuralEvidence": { "$ref": "#/$defs/structuralEvidence" }, + "scenarios": { "$ref": "#/$defs/scenarioEvidence" }, + "blueBasic": { "$ref": "#/$defs/blueBasicEvidence" }, + "playground": { "$ref": "#/$defs/playgroundEvidence" }, + "publicationEvidence": { "$ref": "#/$defs/publicationEvidence" }, + "artifacts": { "$ref": "#/$defs/artifactEvidence" }, + "sourceArchive": { "$ref": "#/$defs/sourceArchiveEvidence" }, + "capabilities": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "classification", "blocker", "summary"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "classification": { "type": "string", "minLength": 1 }, + "blocker": { "type": "boolean" }, + "summary": { "type": "string", "minLength": 1 } + } + } + }, + "blockers": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": ["id", "category", "summary"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "category": { + "enum": ["semantic-upstream", "artifact-upstream", "scope"] + }, + "summary": { "type": "string", "minLength": 1 } + } + } + }, + "limitations": { "$ref": "#/$defs/nonemptyObject" }, + "notClaimed": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "mustRegenerateAfterFinalTree": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 } + } + }, + "$defs": { + "id": { "type": "string", "pattern": "^[a-z0-9-]+$" }, + "sha1": { "type": "string", "pattern": "^[0-9a-f]{40}$" }, + "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, + "nullableSha1": { + "oneOf": [ + { "$ref": "#/$defs/sha1" }, + { "type": "null" } + ] + }, + "nullableSha256": { + "oneOf": [ + { "$ref": "#/$defs/sha256" }, + { "type": "null" } + ] + }, + "finalStatus": { + "enum": [ + "PASS", + "PASS_HARD_GATE", + "BLOCKED", + "BLOCKED_SCOPE", + "BLOCKED_UPSTREAM", + "FAIL" + ] + }, + "nonnegativeInteger": { "type": "integer", "minimum": 0 }, + "nonnegativeNumber": { "type": "number", "minimum": 0 }, + "nonemptyObject": { "type": "object", "minProperties": 1 }, + "sourceEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "baseCommit", + "candidateCommit", + "worktree", + "dirtyReason", + "mainSourceManifestAlgorithm", + "mainSourceManifestSha256" + ], + "properties": { + "baseCommit": { "$ref": "#/$defs/sha1" }, + "candidateCommit": { "$ref": "#/$defs/nullableSha1" }, + "worktree": { "enum": ["CLEAN", "DIRTY"] }, + "dirtyReason": { "type": ["string", "null"] }, + "mainSourceManifestAlgorithm": { "type": "string", "minLength": 1 }, + "mainSourceManifestSha256": { "$ref": "#/$defs/sha256" } + } + }, + "readinessStatuses": { + "type": "object", + "additionalProperties": false, + "required": [ + "temporalArchitectureReady", + "inMemoryEngineWorkingReady", + "providerBackedReady", + "mandateAgentReady", + "playgroundLatencyReady", + "publicRcReady" + ], + "properties": { + "temporalArchitectureReady": { "$ref": "#/$defs/finalStatus" }, + "inMemoryEngineWorkingReady": { "$ref": "#/$defs/finalStatus" }, + "providerBackedReady": { "$ref": "#/$defs/finalStatus" }, + "mandateAgentReady": { "$ref": "#/$defs/finalStatus" }, + "playgroundLatencyReady": { "$ref": "#/$defs/finalStatus" }, + "publicRcReady": { "$ref": "#/$defs/finalStatus" } + } + }, + "shapeEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "limits", + "productionClasses", + "productionLines", + "publicApiSourceTypes", + "newProductionClassesMaximum", + "newPublicApiTypes" + ], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "limits": { + "type": "object", + "additionalProperties": false, + "required": ["productionClasses", "productionLines", "publicApiSourceTypes"], + "properties": { + "productionClasses": { "$ref": "#/$defs/nonnegativeInteger" }, + "productionLines": { "$ref": "#/$defs/nonnegativeInteger" }, + "publicApiSourceTypes": { "$ref": "#/$defs/nonnegativeInteger" } + } + }, + "productionClasses": { "$ref": "#/$defs/nonnegativeInteger" }, + "productionLines": { "$ref": "#/$defs/nonnegativeInteger" }, + "publicApiSourceTypes": { "$ref": "#/$defs/nonnegativeInteger" }, + "newProductionClassesMaximum": { "$ref": "#/$defs/nonnegativeInteger" }, + "newPublicApiTypes": { "$ref": "#/$defs/nonnegativeInteger" } + } + }, + "suite": { + "type": "object", + "additionalProperties": false, + "required": ["name", "tests", "classes", "failures", "errors", "skipped"], + "properties": { + "name": { + "enum": ["test", "integrationTest", "consumerTest", "scenarioTest"] + }, + "status": { "$ref": "#/$defs/finalStatus" }, + "tests": { "$ref": "#/$defs/nonnegativeInteger" }, + "classes": { "$ref": "#/$defs/nonnegativeInteger" }, + "failures": { "$ref": "#/$defs/nonnegativeInteger" }, + "errors": { "$ref": "#/$defs/nonnegativeInteger" }, + "skipped": { "$ref": "#/$defs/nonnegativeInteger" } + } + }, + "finalSuite": { + "allOf": [ + { "$ref": "#/$defs/suite" }, + { "required": ["status"] } + ] + }, + "testEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", "tests", "classes", "failures", "errors", "skipped", "suites" + ], + "properties": { + "profile": { "type": "string", "minLength": 1 }, + "status": { "$ref": "#/$defs/finalStatus" }, + "tests": { "$ref": "#/$defs/nonnegativeInteger" }, + "classes": { "$ref": "#/$defs/nonnegativeInteger" }, + "failures": { "$ref": "#/$defs/nonnegativeInteger" }, + "errors": { "$ref": "#/$defs/nonnegativeInteger" }, + "skipped": { "$ref": "#/$defs/nonnegativeInteger" }, + "suites": { + "type": "array", + "minItems": 4, + "maxItems": 4, + "items": { "$ref": "#/$defs/suite" } + } + } + }, + "finalTestEvidence": { + "allOf": [ + { "$ref": "#/$defs/testEvidence" }, + { + "properties": { + "suites": { + "type": "array", + "minItems": 4, + "maxItems": 4, + "items": { "$ref": "#/$defs/finalSuite" } + } + } + } + ] + }, + "runtimeEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["java", "gate", "status", "durationSeconds"], + "properties": { + "java": { "enum": ["17", "21"] }, + "gate": { "type": "string", "minLength": 1 }, + "status": { "$ref": "#/$defs/finalStatus" }, + "durationSeconds": { "$ref": "#/$defs/nonnegativeInteger" } + } + }, + "readinessProof": { + "type": "object", + "additionalProperties": false, + "required": ["id", "status"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "status": { "$ref": "#/$defs/finalStatus" }, + "parentProcessReruns": { "$ref": "#/$defs/nonnegativeInteger" }, + "childProcessReruns": { "$ref": "#/$defs/nonnegativeInteger" }, + "childReplays": { "$ref": "#/$defs/nonnegativeInteger" } + } + }, + "sourceSurfaceEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "algorithm", + "mutableBusinessBlueIdExcludedByDesign", + "businessOnlyTransitionReusesIdentity", + "realSourceSurfaceChangeInvalidatesIdentity", + "canonicalOrderingAndDelimiterSafety" + ], + "properties": { + "algorithm": { "type": "string", "minLength": 1 }, + "mutableBusinessBlueIdExcludedByDesign": { "const": true }, + "businessOnlyTransitionReusesIdentity": { "$ref": "#/$defs/finalStatus" }, + "realSourceSurfaceChangeInvalidatesIdentity": { "$ref": "#/$defs/finalStatus" }, + "canonicalOrderingAndDelimiterSafety": { "$ref": "#/$defs/finalStatus" } + } + }, + "latencySplit": { + "type": "object", + "additionalProperties": false, + "required": ["total", "frozen", "host"], + "properties": { + "total": { "$ref": "#/$defs/nonnegativeNumber" }, + "frozen": { "$ref": "#/$defs/nonnegativeNumber" }, + "host": { "$ref": "#/$defs/nonnegativeNumber" } + } + }, + "singleRunEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["warmOrdinary", "warmPayNotePlusParent", "threeLayerRestaurantProduct"], + "properties": { + "warmOrdinary": { "$ref": "#/$defs/latencySplit" }, + "warmPayNotePlusParent": { "$ref": "#/$defs/latencySplit" }, + "threeLayerRestaurantProduct": { "$ref": "#/$defs/latencySplit" } + } + }, + "performanceEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "preferredHostP95RegressionPercent", + "hardHostP95RegressionPercent", + "baselineSingleRunMs", + "round11SingleRunMs", + "repeatedP95Rows", + "baselineRuntimeEvidenceSha256", + "baselineProvenanceSha256", + "baselineTimingEvidenceSha256", + "round11RuntimeEvidenceSha256", + "round11ProvenanceSha256", + "round11TimingEvidenceSha256", + "evidenceFiles" + ], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "preferredHostP95RegressionPercent": { "$ref": "#/$defs/nonnegativeNumber" }, + "hardHostP95RegressionPercent": { "$ref": "#/$defs/nonnegativeNumber" }, + "baselineSingleRunMs": { "$ref": "#/$defs/singleRunEvidence" }, + "round11SingleRunMs": { "$ref": "#/$defs/singleRunEvidence" }, + "repeatedP95Rows": { "$ref": "#/$defs/repeatedP95Evidence" }, + "baselineRuntimeEvidenceSha256": { "$ref": "#/$defs/sha256" }, + "baselineProvenanceSha256": { "$ref": "#/$defs/sha256" }, + "baselineTimingEvidenceSha256": { "$ref": "#/$defs/sha256" }, + "round11RuntimeEvidenceSha256": { "$ref": "#/$defs/sha256" }, + "round11ProvenanceSha256": { "$ref": "#/$defs/sha256" }, + "round11TimingEvidenceSha256": { "$ref": "#/$defs/sha256" }, + "evidenceFiles": { + "type": "object", + "additionalProperties": false, + "required": [ + "baselineRuntimeComparison", + "baselineRuntimeProvenance", + "baselineLargeHostTimings", + "round11RuntimeComparison", + "round11RuntimeProvenance", + "round11LargeHostTimings" + ], + "properties": { + "baselineRuntimeComparison": { "type": "string", "minLength": 1 }, + "baselineRuntimeProvenance": { "type": "string", "minLength": 1 }, + "baselineLargeHostTimings": { "type": "string", "minLength": 1 }, + "round11RuntimeComparison": { "type": "string", "minLength": 1 }, + "round11RuntimeProvenance": { "type": "string", "minLength": 1 }, + "round11LargeHostTimings": { "type": "string", "minLength": 1 } + } + } + } + }, + "repeatedP95Evidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "hostOverheadAroundOneProcess", + "existingChildCatchUpP95Ms", + "nbaCatchUpP95Ms" + ], + "properties": { + "hostOverheadAroundOneProcess": { + "type": "object", + "additionalProperties": false, + "required": [ + "baselineP95Ms", + "round11P50Ms", + "round11P95Ms", + "round11P99Ms", + "round11MaxMs", + "regressionPercent", + "preferredGate", + "hardGate" + ], + "properties": { + "baselineP95Ms": { "$ref": "#/$defs/nonnegativeNumber" }, + "round11P50Ms": { "$ref": "#/$defs/nonnegativeNumber" }, + "round11P95Ms": { "$ref": "#/$defs/nonnegativeNumber" }, + "round11P99Ms": { "$ref": "#/$defs/nonnegativeNumber" }, + "round11MaxMs": { "$ref": "#/$defs/nonnegativeNumber" }, + "regressionPercent": { "type": "number" }, + "preferredGate": { "enum": ["PASS", "MISS"] }, + "hardGate": { "enum": ["PASS", "FAIL"] } + } + }, + "existingChildCatchUpP95Ms": { "$ref": "#/$defs/nonnegativeNumber" }, + "nbaCatchUpP95Ms": { "$ref": "#/$defs/nonnegativeNumber" } + } + }, + "zeroCounters": { + "type": "object", + "additionalProperties": false, + "required": [ + "REQUEST_FRAGMENTS", + "TIMELINE_ENTRY_FRAGMENTS", + "ORDINARY_NODE_FRAGMENTS", + "FULL_ENVIRONMENT_SCANS", + "SOURCE_REPLAYS_PER_PARENT", + "POST_PROCESS_FULL_PROJECTIONS", + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY", + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY" + ], + "properties": { + "REQUEST_FRAGMENTS": { "const": 0 }, + "TIMELINE_ENTRY_FRAGMENTS": { "const": 0 }, + "ORDINARY_NODE_FRAGMENTS": { "const": 0 }, + "FULL_ENVIRONMENT_SCANS": { "const": 0 }, + "SOURCE_REPLAYS_PER_PARENT": { "const": 0 }, + "POST_PROCESS_FULL_PROJECTIONS": { "const": 0 }, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": { "const": 0 }, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": { "const": 0 } + } + }, + "structuralEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["status", "requiredZeroCounters"], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "requiredZeroCounters": { "$ref": "#/$defs/zeroCounters" } + } + }, + "scenarioEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["wadowiceStressOracle", "nba", "canonicalRepositoryWadowice"], + "properties": { + "wadowiceStressOracle": { "$ref": "#/$defs/finalStatus" }, + "nba": { "$ref": "#/$defs/finalStatus" }, + "canonicalRepositoryWadowice": { "const": "NOT_PROVEN" } + } + }, + "basicSuite": { + "type": "object", + "additionalProperties": false, + "required": ["name", "status", "tests", "classes", "failures", "errors", "skipped"], + "properties": { + "name": { + "enum": ["test", "consumerTest", "performanceTest", "runtimeCampaign", "scenarioTest"] + }, + "status": { "$ref": "#/$defs/finalStatus" }, + "tests": { "$ref": "#/$defs/nonnegativeInteger" }, + "classes": { "$ref": "#/$defs/nonnegativeInteger" }, + "failures": { "$ref": "#/$defs/nonnegativeInteger" }, + "errors": { "$ref": "#/$defs/nonnegativeInteger" }, + "skipped": { "$ref": "#/$defs/nonnegativeInteger" } + } + }, + "blueBasicEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", "gate", "durationSeconds", "tests", "classes", "failures", "errors", "skipped", "suites" + ], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "gate": { "type": "string", "minLength": 1 }, + "durationSeconds": { "$ref": "#/$defs/nonnegativeInteger" }, + "tests": { "$ref": "#/$defs/nonnegativeInteger" }, + "classes": { "$ref": "#/$defs/nonnegativeInteger" }, + "failures": { "$ref": "#/$defs/nonnegativeInteger" }, + "errors": { "$ref": "#/$defs/nonnegativeInteger" }, + "skipped": { "$ref": "#/$defs/nonnegativeInteger" }, + "suites": { + "type": "array", + "minItems": 5, + "maxItems": 5, + "items": { "$ref": "#/$defs/basicSuite" } + } + } + }, + "playgroundEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["status", "gate", "durationSeconds", "dependencyBoundary"], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "gate": { "type": "string", "minLength": 1 }, + "durationSeconds": { "$ref": "#/$defs/nonnegativeInteger" }, + "dependencyBoundary": { "type": "string", "minLength": 1 } + } + }, + "publicationEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "gate", + "durationSeconds", + "resolvedCoordinates", + "missingCoordinates", + "versionConflict", + "externalConsumerSmokeBuild" + ], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "gate": { "type": "string", "minLength": 1 }, + "durationSeconds": { "$ref": "#/$defs/nonnegativeInteger" }, + "resolvedCoordinates": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "missingCoordinates": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "versionConflict": { "type": "string", "minLength": 1 }, + "externalConsumerSmokeBuild": { "$ref": "#/$defs/finalStatus" } + } + }, + "artifactEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", "mainJarSha256", "sourcesJarSha256", "javadocJarSha256", "testFixturesJarSha256" + ], + "properties": { + "status": { "$ref": "#/$defs/finalStatus" }, + "mainJarSha256": { "$ref": "#/$defs/sha256" }, + "sourcesJarSha256": { "$ref": "#/$defs/sha256" }, + "javadocJarSha256": { "$ref": "#/$defs/sha256" }, + "testFixturesJarSha256": { "$ref": "#/$defs/sha256" } + } + }, + "sourceArchiveEvidence": { + "type": "object", + "additionalProperties": false, + "required": [ + "configuration", + "authoritativeVersionFile", + "authoritativeVersionFileIncluded", + "exportIgnored", + "extractedConfiguration", + "publishedArtifactSmokeBuild", + "sha256", + "pendingReason" + ], + "properties": { + "configuration": { "const": "CONFIGURED" }, + "authoritativeVersionFile": { "const": ".cz.toml" }, + "authoritativeVersionFileIncluded": { "const": true }, + "exportIgnored": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 } + }, + "extractedConfiguration": { + "enum": ["PASS", "PENDING_VERIFICATION"] + }, + "publishedArtifactSmokeBuild": { "$ref": "#/$defs/finalStatus" }, + "sha256": { "$ref": "#/$defs/nullableSha256" }, + "pendingReason": { "type": ["string", "null"] } + } + } + } +} diff --git a/docs/releases/round12-verification.schema.json b/docs/releases/round12-verification.schema.json new file mode 100644 index 0000000..227b6f3 --- /dev/null +++ b/docs/releases/round12-verification.schema.json @@ -0,0 +1,590 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "round12-verification.schema.json", + "title": "Blue Coordination Round 12 release evidence", + "type": "object", + "additionalProperties": false, + "required": [ + "$schema", + "schemaVersion", + "release", + "profile", + "evidenceState", + "evidenceDate", + "verdict", + "source", + "executionBinding", + "status", + "shape", + "tests", + "runtimes", + "proofs", + "performance", + "structuralEvidence", + "artifacts", + "sourceArchive", + "publicationEvidence", + "capabilities", + "blockers", + "limitations", + "notClaimed", + "finalizationRequirements" + ], + "properties": { + "$schema": { "const": "round12-verification.schema.json" }, + "schemaVersion": { "const": "3.0.0" }, + "release": { "const": "3.0.0-rc.1" }, + "profile": { "const": "ROUND12_INITIALIZATION_LIFECYCLE" }, + "evidenceState": { "enum": ["INTERIM", "FINAL"] }, + "evidenceDate": { "type": "string", "format": "date" }, + "verdict": { "$ref": "#/$defs/status" }, + "source": { "$ref": "#/$defs/source" }, + "executionBinding": { "$ref": "#/$defs/executionBinding" }, + "status": { "$ref": "#/$defs/readiness" }, + "shape": { "$ref": "#/$defs/shape" }, + "tests": { "$ref": "#/$defs/tests" }, + "runtimes": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { "$ref": "#/$defs/runtime" } + }, + "proofs": { + "type": "array", + "minItems": 6, + "maxItems": 6, + "items": { "$ref": "#/$defs/proof" } + }, + "performance": { "$ref": "#/$defs/performance" }, + "structuralEvidence": { "$ref": "#/$defs/structural" }, + "artifacts": { "$ref": "#/$defs/artifacts" }, + "sourceArchive": { "$ref": "#/$defs/sourceArchive" }, + "publicationEvidence": { "$ref": "#/$defs/publication" }, + "capabilities": { + "type": "array", + "items": { "$ref": "#/$defs/capability" } + }, + "blockers": { + "type": "array", + "items": { "$ref": "#/$defs/blocker" } + }, + "limitations": { "type": "object", "minProperties": 1 }, + "notClaimed": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "finalizationRequirements": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 } + } + }, + "$defs": { + "id": { "type": "string", "pattern": "^[a-z0-9-]+$" }, + "sha1": { "type": "string", "pattern": "^[0-9a-f]{40}$" }, + "sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" }, + "nullableSha1": { + "oneOf": [ + { "$ref": "#/$defs/sha1" }, + { "type": "null" } + ] + }, + "nullableSha256": { + "oneOf": [ + { "$ref": "#/$defs/sha256" }, + { "type": "null" } + ] + }, + "nullableNonnegativeInteger": { + "type": ["integer", "null"], + "minimum": 0 + }, + "status": { + "enum": [ + "PASS", + "PASS_HARD_GATE", + "PENDING_VERIFICATION", + "BLOCKED", + "BLOCKED_SCOPE", + "BLOCKED_UPSTREAM", + "FAIL" + ] + }, + "source": { + "type": "object", + "additionalProperties": false, + "required": [ + "baseCommit", + "candidateCommit", + "binding", + "worktree", + "dirtyReason", + "mainSourceManifestAlgorithm", + "mainSourceManifestSha256" + ], + "properties": { + "baseCommit": { "$ref": "#/$defs/sha1" }, + "candidateCommit": { "$ref": "#/$defs/nullableSha1" }, + "binding": { + "enum": [ + "BASE_COMMIT_PLUS_DIRTY_WORKTREE_MANIFEST", + "CANDIDATE_COMMIT" + ] + }, + "worktree": { "enum": ["CLEAN", "DIRTY"] }, + "dirtyReason": { "type": ["string", "null"] }, + "mainSourceManifestAlgorithm": { "type": "string", "minLength": 1 }, + "mainSourceManifestSha256": { "$ref": "#/$defs/sha256" } + } + }, + "executionBinding": { + "type": "object", + "additionalProperties": false, + "required": ["kind", "mainSourceManifestSha256", "candidateCommit"], + "properties": { + "kind": { + "enum": [ + "PENDING", + "WORKTREE_EXECUTION", + "CANDIDATE_COMMIT_EXECUTION" + ] + }, + "mainSourceManifestSha256": { "$ref": "#/$defs/nullableSha256" }, + "candidateCommit": { "$ref": "#/$defs/nullableSha1" } + } + }, + "readiness": { + "type": "object", + "additionalProperties": false, + "required": [ + "temporalArchitectureReady", + "inMemoryEngineWorkingReady", + "providerBackedReady", + "mandateAgentReady", + "playgroundLatencyReady", + "publicRcReady" + ], + "properties": { + "temporalArchitectureReady": { "$ref": "#/$defs/status" }, + "inMemoryEngineWorkingReady": { "$ref": "#/$defs/status" }, + "providerBackedReady": { "$ref": "#/$defs/status" }, + "mandateAgentReady": { "$ref": "#/$defs/status" }, + "playgroundLatencyReady": { "$ref": "#/$defs/status" }, + "publicRcReady": { "$ref": "#/$defs/status" } + } + }, + "limits": { + "type": "object", + "additionalProperties": false, + "required": ["productionClasses", "productionLines", "publicApiSourceTypes"], + "properties": { + "productionClasses": { "type": "integer", "minimum": 0 }, + "productionLines": { "type": "integer", "minimum": 0 }, + "publicApiSourceTypes": { "type": "integer", "minimum": 0 } + } + }, + "shape": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "basis", + "limits", + "productionClasses", + "productionLines", + "publicApiSourceTypes" + ], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "basis": { "const": "STATIC_WORKTREE_SNAPSHOT" }, + "limits": { "$ref": "#/$defs/limits" }, + "productionClasses": { "type": "integer", "minimum": 0 }, + "productionLines": { "type": "integer", "minimum": 0 }, + "publicApiSourceTypes": { "type": "integer", "minimum": 0 } + } + }, + "suite": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "status", + "tests", + "classes", + "failures", + "errors", + "skipped" + ], + "properties": { + "name": { + "enum": ["test", "integrationTest", "consumerTest", "scenarioTest"] + }, + "status": { "$ref": "#/$defs/status" }, + "tests": { "type": "integer", "minimum": 0 }, + "classes": { "type": "integer", "minimum": 0 }, + "failures": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "errors": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "skipped": { "$ref": "#/$defs/nullableNonnegativeInteger" } + } + }, + "tests": { + "type": "object", + "additionalProperties": false, + "required": [ + "inventoryBasis", + "executionStatus", + "finalTreeRequired", + "tests", + "classes", + "failures", + "errors", + "skipped", + "suites" + ], + "properties": { + "inventoryBasis": { "const": "STATIC_SOURCE_INVENTORY" }, + "executionStatus": { "$ref": "#/$defs/status" }, + "finalTreeRequired": { "const": true }, + "tests": { "type": "integer", "minimum": 0 }, + "classes": { "type": "integer", "minimum": 0 }, + "failures": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "errors": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "skipped": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "suites": { + "type": "array", + "minItems": 4, + "maxItems": 4, + "items": { "$ref": "#/$defs/suite" } + } + } + }, + "runtime": { + "type": "object", + "additionalProperties": false, + "required": ["java", "gate", "status", "durationSeconds"], + "properties": { + "java": { "enum": ["17", "21"] }, + "gate": { "type": "string", "minLength": 1 }, + "status": { "$ref": "#/$defs/status" }, + "durationSeconds": { "$ref": "#/$defs/nullableNonnegativeInteger" } + } + }, + "proof": { + "type": "object", + "additionalProperties": false, + "required": ["id", "sourceSet", "testClass", "testMethod", "status"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "sourceSet": { + "enum": ["test", "integrationTest", "scenarioTest"] + }, + "testClass": { "type": "string", "minLength": 1 }, + "testMethod": { "type": "string", "minLength": 1 }, + "status": { "$ref": "#/$defs/status" } + } + }, + "latencySplit": { + "type": "object", + "additionalProperties": false, + "required": ["total", "frozen", "host"], + "properties": { + "total": { "type": "number", "minimum": 0 }, + "frozen": { "type": "number", "minimum": 0 }, + "host": { "type": "number", "minimum": 0 } + } + }, + "singleRun": { + "type": "object", + "additionalProperties": false, + "required": ["warmOrdinary", "warmPayNotePlusParent", "threeLayerRestaurantProduct"], + "properties": { + "warmOrdinary": { "$ref": "#/$defs/latencySplit" }, + "warmPayNotePlusParent": { "$ref": "#/$defs/latencySplit" }, + "threeLayerRestaurantProduct": { "$ref": "#/$defs/latencySplit" } + } + }, + "historicalPerformance": { + "type": "object", + "additionalProperties": false, + "required": [ + "classification", + "profile", + "candidateCommit", + "sameSourceAsRound12", + "promptRetainedBaselineSingleRunMs", + "round11ObservedSingleRunMs", + "repeatedP95Rows", + "evidenceFiles" + ], + "properties": { + "classification": { "const": "HISTORICAL_BASELINE_ONLY" }, + "profile": { "const": "ROUND11_READINESS_CLOSURE" }, + "candidateCommit": { "$ref": "#/$defs/sha1" }, + "sameSourceAsRound12": { "const": false }, + "promptRetainedBaselineSingleRunMs": { "$ref": "#/$defs/singleRun" }, + "round11ObservedSingleRunMs": { "$ref": "#/$defs/singleRun" }, + "repeatedP95Rows": { "type": "object", "minProperties": 1 }, + "evidenceFiles": { + "type": "object", + "minProperties": 6, + "additionalProperties": { "$ref": "#/$defs/evidenceFile" } + } + } + }, + "round12Performance": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "finalTreeRequired", + "preferredHostP95RegressionPercent", + "hardHostP95RegressionPercent", + "nbaLifecycleEvidence", + "sameScenarioP95" + ], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "finalTreeRequired": { "const": true }, + "preferredHostP95RegressionPercent": { "type": "number", "minimum": 0 }, + "hardHostP95RegressionPercent": { "type": "number", "minimum": 0 }, + "nbaLifecycleEvidence": { + "$ref": "#/$defs/nbaLifecycleEvidence" + }, + "sameScenarioP95": { "$ref": "#/$defs/sameScenarioP95" } + } + }, + "nbaLifecycleEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["status", "evidenceFiles"], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "evidenceFiles": { + "type": "array", + "items": { "$ref": "#/$defs/evidenceFile" } + } + } + }, + "sameScenarioP95": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "singleRunMs", + "repeatedP95Rows", + "evidenceFiles" + ], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "singleRunMs": { + "oneOf": [ + { "$ref": "#/$defs/singleRun" }, + { "type": "null" } + ] + }, + "repeatedP95Rows": { + "oneOf": [ + { "$ref": "#/$defs/repeatedP95Rows" }, + { "type": "null" } + ] + }, + "evidenceFiles": { + "type": "array", + "items": { "$ref": "#/$defs/evidenceFile" } + } + } + }, + "p95Row": { + "type": "object", + "additionalProperties": false, + "required": [ + "baselineHostMs", + "round12P95Ms", + "regressionPercent", + "preferredGate", + "hardGate" + ], + "properties": { + "baselineHostMs": { "type": "number", "exclusiveMinimum": 0 }, + "round12P95Ms": { "type": "number", "minimum": 0 }, + "regressionPercent": { "type": "number" }, + "preferredGate": { "enum": ["PASS", "MISS"] }, + "hardGate": { "enum": ["PASS", "FAIL"] } + } + }, + "repeatedP95Rows": { + "type": "object", + "additionalProperties": false, + "required": [ + "warmOrdinary", + "warmPayNotePlusParent", + "threeLayerRestaurantProduct" + ], + "properties": { + "warmOrdinary": { "$ref": "#/$defs/p95Row" }, + "warmPayNotePlusParent": { "$ref": "#/$defs/p95Row" }, + "threeLayerRestaurantProduct": { "$ref": "#/$defs/p95Row" } + } + }, + "evidenceFile": { + "type": "object", + "additionalProperties": false, + "required": ["path", "sha256"], + "properties": { + "path": { "type": "string", "minLength": 1 }, + "sha256": { "$ref": "#/$defs/sha256" } + } + }, + "performance": { + "type": "object", + "additionalProperties": false, + "required": ["round12Campaign", "historicalRound11Baseline"], + "properties": { + "round12Campaign": { "$ref": "#/$defs/round12Performance" }, + "historicalRound11Baseline": { "$ref": "#/$defs/historicalPerformance" } + } + }, + "zeroCounters": { + "type": "object", + "additionalProperties": false, + "required": [ + "REQUEST_FRAGMENTS", + "TIMELINE_ENTRY_FRAGMENTS", + "ORDINARY_NODE_FRAGMENTS", + "FULL_ENVIRONMENT_SCANS", + "SOURCE_REPLAYS_PER_PARENT", + "POST_PROCESS_FULL_PROJECTIONS", + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY", + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY" + ], + "properties": { + "REQUEST_FRAGMENTS": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "TIMELINE_ENTRY_FRAGMENTS": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "ORDINARY_NODE_FRAGMENTS": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "FULL_ENVIRONMENT_SCANS": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "SOURCE_REPLAYS_PER_PARENT": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "POST_PROCESS_FULL_PROJECTIONS": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY": { "$ref": "#/$defs/nullableNonnegativeInteger" } + } + }, + "structural": { + "type": "object", + "additionalProperties": false, + "required": ["status", "finalTreeRequired", "requiredZeroCounters"], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "finalTreeRequired": { "const": true }, + "requiredZeroCounters": { "$ref": "#/$defs/zeroCounters" } + } + }, + "artifacts": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "finalTreeRequired", + "mainJarSha256", + "sourcesJarSha256", + "javadocJarSha256", + "testFixturesJarSha256" + ], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "finalTreeRequired": { "const": true }, + "mainJarSha256": { "$ref": "#/$defs/nullableSha256" }, + "sourcesJarSha256": { "$ref": "#/$defs/nullableSha256" }, + "javadocJarSha256": { "$ref": "#/$defs/nullableSha256" }, + "testFixturesJarSha256": { "$ref": "#/$defs/nullableSha256" } + } + }, + "sourceArchive": { + "type": "object", + "additionalProperties": false, + "required": [ + "configuration", + "finalTreeRequired", + "authoritativeVersionFile", + "authoritativeVersionFileIncluded", + "reproducibleFileOrder", + "preserveFileTimestamps", + "duplicatesStrategy", + "exportIgnored", + "extractedConfiguration", + "focusedTests", + "focusedTestsStatus", + "publishedArtifactSmokeBuild", + "detachedHashEvidence", + "pendingReason" + ], + "properties": { + "configuration": { "const": "CONFIGURED" }, + "finalTreeRequired": { "const": true }, + "authoritativeVersionFile": { "const": ".cz.toml" }, + "authoritativeVersionFileIncluded": { "const": true }, + "reproducibleFileOrder": { "const": true }, + "preserveFileTimestamps": { "const": false }, + "duplicatesStrategy": { "const": "FAIL" }, + "exportIgnored": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 } + }, + "extractedConfiguration": { "$ref": "#/$defs/status" }, + "focusedTests": { + "type": "array", + "minItems": 1, + "items": { "type": "string", "minLength": 1 } + }, + "focusedTestsStatus": { "$ref": "#/$defs/status" }, + "publishedArtifactSmokeBuild": { "$ref": "#/$defs/status" }, + "detachedHashEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["status", "mode", "sidecarPath", "embeddedInSourceArchive"], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "mode": { "const": "DETACHED_POST_BUILD_SIDECAR" }, + "sidecarPath": { "type": "string", "minLength": 1 }, + "embeddedInSourceArchive": { "const": false } + } + }, + "pendingReason": { "type": ["string", "null"] } + } + }, + "publication": { + "type": "object", + "additionalProperties": false, + "required": ["status", "gate", "durationSeconds", "notes"], + "properties": { + "status": { "$ref": "#/$defs/status" }, + "gate": { "type": "string", "minLength": 1 }, + "durationSeconds": { "$ref": "#/$defs/nullableNonnegativeInteger" }, + "notes": { "type": "string", "minLength": 1 } + } + }, + "capability": { + "type": "object", + "additionalProperties": false, + "required": ["id", "classification", "blocker", "summary"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "classification": { "type": "string", "minLength": 1 }, + "blocker": { "type": "boolean" }, + "summary": { "type": "string", "minLength": 1 } + } + }, + "blocker": { + "type": "object", + "additionalProperties": false, + "required": ["id", "category", "summary"], + "properties": { + "id": { "$ref": "#/$defs/id" }, + "category": { + "enum": ["semantic-upstream", "artifact-upstream", "scope", "verification"] + }, + "summary": { "type": "string", "minLength": 1 } + } + } + } +} diff --git a/docs/releases/round13-verification.schema.json b/docs/releases/round13-verification.schema.json new file mode 100644 index 0000000..7a66c4e --- /dev/null +++ b/docs/releases/round13-verification.schema.json @@ -0,0 +1,531 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "round13-verification.schema.json", + "title": "Blue Coordination Round 13 Playground verification evidence", + "type": "object", + "additionalProperties": false, + "required": [ + "$schema", + "schemaVersion", + "release", + "profile", + "evidenceState", + "evidenceDate", + "releasePolicy", + "status", + "verdict", + "source", + "executionBinding", + "shape", + "tests", + "runtimes", + "proofs", + "performance", + "structuralEvidence", + "artifacts", + "sourceArchive", + "publicationEvidence", + "capabilities", + "blockers", + "finalizationRequirements", + "limitations", + "notClaimed" + ], + "properties": { + "$schema": { "const": "round13-verification.schema.json" }, + "schemaVersion": { "const": "4.1.0" }, + "release": { "const": "3.0.0-rc.1" }, + "profile": { "const": "ROUND13_PLAYGROUND_FIVE_OCCURRENCE" }, + "evidenceState": { "enum": ["INTERIM", "FINAL"] }, + "evidenceDate": { "type": "string", "format": "date" }, + "releasePolicy": { "$ref": "#/$defs/releasePolicy" }, + "status": { + "type": "object", + "additionalProperties": false, + "required": [ + "temporalArchitectureReady", + "inMemoryEngineWorkingReady", + "playgroundCoreReady", + "playgroundLatencyReady", + "providerBackedReady", + "mandateAgentReady", + "publicRcReady" + ], + "properties": { + "temporalArchitectureReady": { "$ref": "#/$defs/readiness" }, + "inMemoryEngineWorkingReady": { "$ref": "#/$defs/readiness" }, + "playgroundCoreReady": { "$ref": "#/$defs/readiness" }, + "playgroundLatencyReady": { "$ref": "#/$defs/readiness" }, + "providerBackedReady": { "const": "OUT_OF_SCOPE" }, + "mandateAgentReady": { "const": "OUT_OF_SCOPE" }, + "publicRcReady": { "$ref": "#/$defs/readiness" } + } + }, + "verdict": { "$ref": "#/$defs/readiness" }, + "source": { "$ref": "#/$defs/source" }, + "executionBinding": { "$ref": "#/$defs/executionBinding" }, + "shape": { "$ref": "#/$defs/shape" }, + "tests": { "$ref": "#/$defs/tests" }, + "runtimes": { + "type": "array", + "minItems": 2, + "maxItems": 2, + "items": { "$ref": "#/$defs/runtime" } + }, + "proofs": { + "type": "array", + "minItems": 7, + "maxItems": 7, + "items": { "$ref": "#/$defs/proof" } + }, + "performance": { "$ref": "#/$defs/performance" }, + "structuralEvidence": { "$ref": "#/$defs/structuralEvidence" }, + "artifacts": { "$ref": "#/$defs/artifacts" }, + "sourceArchive": { "$ref": "#/$defs/sourceArchive" }, + "publicationEvidence": { "$ref": "#/$defs/publicationEvidence" }, + "capabilities": { + "type": "array", + "items": { "$ref": "#/$defs/classification" } + }, + "blockers": { + "type": "array", + "items": { "$ref": "#/$defs/classification" } + }, + "finalizationRequirements": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "limitations": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "notClaimed": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + } + }, + "$defs": { + "readiness": { + "enum": [ + "PASS", + "PASS_HARD_GATE", + "PASS_WITH_KNOWN_PERFORMANCE_LIMITATION", + "PENDING_VERIFICATION", + "BLOCKED", + "FAIL", + "OUT_OF_SCOPE" + ] + }, + "executionStatus": { + "enum": ["PASS", "PENDING_VERIFICATION", "FAIL", "BLOCKED_UPSTREAM"] + }, + "campaignStatus": { + "enum": [ + "PASS", + "PASS_HARD_GATE", + "PENDING_VERIFICATION", + "FAIL" + ] + }, + "sha256": { + "type": ["string", "null"], + "pattern": "^[0-9a-f]{64}$" + }, + "releasePolicy": { + "type": "object", + "additionalProperties": false, + "required": [ + "mode", + "exactRelease", + "decision", + "performanceReleaseBlocking", + "stableReleaseEligible", + "nonPerformanceGatesRequired", + "explicitWorkflowOptInRequired" + ], + "properties": { + "mode": { "const": "RC_WITH_KNOWN_PERFORMANCE_LIMITATION" }, + "exactRelease": { "const": "3.0.0-rc.1" }, + "decision": { + "const": "PASS_WITH_KNOWN_PERFORMANCE_LIMITATION" + }, + "performanceReleaseBlocking": { "const": false }, + "stableReleaseEligible": { "const": false }, + "nonPerformanceGatesRequired": { "const": true }, + "explicitWorkflowOptInRequired": { "const": true } + } + }, + "source": { + "type": "object", + "additionalProperties": false, + "required": [ + "baseCommit", + "candidateCommit", + "binding", + "worktree", + "dirtyReason", + "mainSourceManifestAlgorithm", + "mainSourceManifestSha256" + ], + "properties": { + "baseCommit": { "type": "string", "pattern": "^[0-9a-f]{40}$" }, + "candidateCommit": { + "type": ["string", "null"], + "pattern": "^[0-9a-f]{40}$", + "description": "The tested implementation/source commit. FINAL permits a later evidence-only HEAD when this commit is its ancestor and the current main-source manifest still matches." + }, + "binding": { + "enum": [ + "BASE_COMMIT_PLUS_DIRTY_WORKTREE_MANIFEST", + "CANDIDATE_COMMIT" + ] + }, + "worktree": { "enum": ["DIRTY", "CLEAN"] }, + "dirtyReason": { "type": ["string", "null"] }, + "mainSourceManifestAlgorithm": { "type": "string", "minLength": 1 }, + "mainSourceManifestSha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + } + } + }, + "executionBinding": { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "mainSourceManifestSha256", + "candidateCommit", + "reason" + ], + "properties": { + "kind": { + "enum": [ + "PENDING", + "WORKTREE_EXECUTION", + "CANDIDATE_COMMIT_EXECUTION" + ] + }, + "mainSourceManifestSha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "candidateCommit": { + "type": ["string", "null"], + "pattern": "^[0-9a-f]{40}$" + }, + "reason": { "type": ["string", "null"] } + } + }, + "shape": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "basis", + "productionClasses", + "productionLines", + "publicApiSourceTypes", + "limits", + "limitRevisionReason" + ], + "properties": { + "status": { "enum": ["PASS", "FAIL"] }, + "basis": { "const": "STATIC_WORKTREE_SNAPSHOT" }, + "productionClasses": { "type": "integer", "minimum": 0 }, + "productionLines": { "type": "integer", "minimum": 0 }, + "publicApiSourceTypes": { "type": "integer", "minimum": 0 }, + "limits": { + "type": "object", + "additionalProperties": false, + "required": [ + "productionClasses", + "productionLines", + "publicApiSourceTypes" + ], + "properties": { + "productionClasses": { "type": "integer", "minimum": 1 }, + "productionLines": { "type": "integer", "minimum": 1 }, + "publicApiSourceTypes": { "type": "integer", "minimum": 1 } + } + }, + "limitRevisionReason": { "type": "string", "minLength": 1 } + } + }, + "tests": { + "type": "object", + "additionalProperties": false, + "required": [ + "inventoryBasis", + "executionStatus", + "finalTreeRequired", + "tests", + "classes", + "failures", + "errors", + "skipped", + "suites" + ], + "properties": { + "inventoryBasis": { "const": "STATIC_SOURCE_INVENTORY" }, + "executionStatus": { "$ref": "#/$defs/executionStatus" }, + "finalTreeRequired": { "const": true }, + "tests": { "type": "integer", "minimum": 0 }, + "classes": { "type": "integer", "minimum": 0 }, + "failures": { "type": ["integer", "null"], "minimum": 0 }, + "errors": { "type": ["integer", "null"], "minimum": 0 }, + "skipped": { "type": ["integer", "null"], "minimum": 0 }, + "suites": { + "type": "array", + "minItems": 4, + "maxItems": 4, + "items": { "$ref": "#/$defs/suite" } + } + } + }, + "suite": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "status", + "tests", + "classes", + "failures", + "errors", + "skipped" + ], + "properties": { + "name": { + "enum": ["test", "integrationTest", "consumerTest", "scenarioTest"] + }, + "status": { "$ref": "#/$defs/executionStatus" }, + "tests": { "type": "integer", "minimum": 0 }, + "classes": { "type": "integer", "minimum": 0 }, + "failures": { "type": ["integer", "null"], "minimum": 0 }, + "errors": { "type": ["integer", "null"], "minimum": 0 }, + "skipped": { "type": ["integer", "null"], "minimum": 0 } + } + }, + "runtime": { + "type": "object", + "additionalProperties": false, + "required": ["java", "gate", "status", "durationSeconds"], + "properties": { + "java": { "enum": ["17", "21"] }, + "gate": { "type": "string", "minLength": 1 }, + "status": { "$ref": "#/$defs/executionStatus" }, + "durationSeconds": { "type": ["number", "null"], "exclusiveMinimum": 0 } + } + }, + "proof": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "sourceSet", + "testClass", + "testMethod", + "task", + "status" + ], + "properties": { + "id": { "type": "string", "minLength": 1 }, + "sourceSet": { + "enum": ["test", "integrationTest", "consumerTest", "scenarioTest", "performance"] + }, + "testClass": { "type": ["string", "null"] }, + "testMethod": { "type": ["string", "null"] }, + "task": { "type": "string", "minLength": 1 }, + "status": { "$ref": "#/$defs/executionStatus" } + } + }, + "performance": { + "type": "object", + "additionalProperties": false, + "required": ["round13Campaign", "historicalRound12"], + "properties": { + "round13Campaign": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "comparison", + "baselineArchive", + "baselineSha256", + "candidateTask", + "warmups", + "requiredSamples", + "measuredSamples", + "runtimeMarkdown", + "runtimeJson", + "runtimeProvenanceJson", + "pendingReason" + ], + "properties": { + "status": { "$ref": "#/$defs/campaignStatus" }, + "comparison": { "const": "SAME_MACHINE_INTERLEAVED_AB" }, + "baselineArchive": { "const": "Archive.zip" }, + "baselineSha256": { + "type": "string", + "pattern": "^[0-9a-f]{64}$" + }, + "candidateTask": { "const": "round13PlaygroundSample" }, + "warmups": { "type": "integer", "minimum": 0 }, + "requiredSamples": { "type": "integer", "minimum": 30 }, + "measuredSamples": { "type": "integer", "minimum": 0 }, + "runtimeMarkdown": { + "enum": [ + null, + "docs/releases/evidence/round13/five-occurrence-runtime.md" + ] + }, + "runtimeJson": { + "enum": [ + null, + "docs/releases/evidence/round13/five-occurrence-runtime.json" + ] + }, + "runtimeProvenanceJson": { + "enum": [ + null, + "docs/releases/evidence/round13/runtime-provenance.json" + ] + }, + "pendingReason": { "type": ["string", "null"] } + } + }, + "historicalRound12": { + "type": "object", + "additionalProperties": false, + "required": ["classification", "decisionBasis", "summary"], + "properties": { + "classification": { "const": "HISTORICAL_ONLY" }, + "decisionBasis": { "const": false }, + "summary": { "type": "string", "minLength": 1 } + } + } + } + }, + "structuralEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["status", "finalTreeRequired", "requiredZeroCounters"], + "properties": { + "status": { "$ref": "#/$defs/executionStatus" }, + "finalTreeRequired": { "const": true }, + "requiredZeroCounters": { + "type": "object", + "minProperties": 8, + "maxProperties": 8, + "additionalProperties": { "type": ["integer", "null"], "minimum": 0 } + } + } + }, + "artifacts": { + "type": "object", + "additionalProperties": false, + "required": [ + "status", + "finalTreeRequired", + "mainJarSha256", + "sourcesJarSha256", + "javadocJarSha256", + "testFixturesJarSha256" + ], + "properties": { + "status": { "$ref": "#/$defs/executionStatus" }, + "finalTreeRequired": { "const": true }, + "mainJarSha256": { "$ref": "#/$defs/sha256" }, + "sourcesJarSha256": { "$ref": "#/$defs/sha256" }, + "javadocJarSha256": { "$ref": "#/$defs/sha256" }, + "testFixturesJarSha256": { "$ref": "#/$defs/sha256" } + } + }, + "sourceArchive": { + "type": "object", + "additionalProperties": false, + "required": [ + "configuration", + "finalTreeRequired", + "authoritativeVersionFile", + "authoritativeVersionFileIncluded", + "reproducibleFileOrder", + "preserveFileTimestamps", + "duplicatesStrategy", + "exportIgnored", + "extractedConfiguration", + "focusedTestsStatus", + "publishedArtifactSmokeBuild", + "verificationReceipt", + "checksum", + "pendingReason" + ], + "properties": { + "configuration": { "const": "CONFIGURED" }, + "finalTreeRequired": { "const": true }, + "authoritativeVersionFile": { "const": ".cz.toml" }, + "authoritativeVersionFileIncluded": { "const": true }, + "reproducibleFileOrder": { "const": true }, + "preserveFileTimestamps": { "const": false }, + "duplicatesStrategy": { "const": "FAIL" }, + "exportIgnored": { + "type": "array", + "items": { "type": "string", "minLength": 1 } + }, + "extractedConfiguration": { "$ref": "#/$defs/executionStatus" }, + "focusedTestsStatus": { "$ref": "#/$defs/executionStatus" }, + "publishedArtifactSmokeBuild": { "$ref": "#/$defs/executionStatus" }, + "verificationReceipt": { + "type": "object", + "additionalProperties": false, + "required": ["schemaId", "path"], + "properties": { + "schemaId": { + "const": "blue-coordination-round13-source-archive-verification-v1" + }, + "path": { + "const": "build/reports/round13/source-archive-verification.json" + } + } + }, + "checksum": { + "type": "object", + "additionalProperties": false, + "required": ["mode", "path", "digest"], + "properties": { + "mode": { "const": "DETACHED_SHA256_SIDECAR" }, + "path": { + "const": "build/distributions/blue-coordination-java-3.0.0-rc.1-source.zip.sha256" + }, + "digest": { "type": "null" } + } + }, + "pendingReason": { "type": ["string", "null"] } + } + }, + "publicationEvidence": { + "type": "object", + "additionalProperties": false, + "required": ["status", "gate", "durationSeconds", "notes"], + "properties": { + "status": { "$ref": "#/$defs/executionStatus" }, + "gate": { "type": "string", "minLength": 1 }, + "durationSeconds": { "type": ["number", "null"], "exclusiveMinimum": 0 }, + "notes": { "type": "string", "minLength": 1 } + } + }, + "classification": { + "type": "object", + "additionalProperties": false, + "required": ["id", "category", "summary"], + "properties": { + "id": { "type": "string", "minLength": 1 }, + "category": { + "enum": ["scope", "verification", "artifact-upstream", "capability"] + }, + "summary": { "type": "string", "minLength": 1 } + } + } + } +} diff --git a/docs/semantics/historical-catch-up.md b/docs/semantics/historical-catch-up.md new file mode 100644 index 0000000..45bc2c5 --- /dev/null +++ b/docs/semantics/historical-catch-up.md @@ -0,0 +1,66 @@ +# Historical catch-up + +An attachment captures exact cause evidence and an exclusive canonical cutoff +`T`. A verified frontier `F` defines the historical interval `F < entry < T`; +the attachment entry itself is never delivered to a newly activated child. +Initialization is a processor-managed prerequisite epoch, not a provider event: +it commits and reaches every containing occurrence before historical replay. + +Admission evidence can be bound to one exact `(parent DocumentId, absolute +occurrence path)`. The binding records the child DocumentId, supplied-state +BlueId, admitted epoch when required, activation mode, verified frontier, +proof identity, and attachment-entry identity. A broad child default remains a +convenience only; an exact occurrence plan is authoritative and is consumed +atomically with graph publication. + +State identity does not always identify history position. If a child returns to +an earlier exact state, the repeated BlueId can name several epochs. Admission +without an explicit epoch therefore fails closed once recurrence is known; +supplying an epoch validates that exact retained revision in constant time. + +Existing children are never reprocessed for epochs already committed: each +parent consumes missing child epochs through its own cursor. Unseen children +process eligible historical source entries exactly once. Entries admitted after +a closed local frontier remain outside it even if their human timestamp is +older; canonical provider order and completeness evidence are authoritative. + +Completeness evidence is bound to the exact active source surface rather than +the child document's unrelated business-state BlueId. The identity includes the +binding generation, active subscription intervals, source contributions, +checkpoint domains, dependency evidence, Channel catalog membership, and +compiled external routes. Ordinary state changes therefore reuse valid +completeness evidence; a real source-surface or activation change invalidates it. + +Several children introduced by one parent transition share one extendable +barrier. Their initialization and historical work merge by source order, depth, +canonical path, DocumentId, and epoch identity. Replay is iterative: after each +transition the runtime reconciles Timeline subscriptions, `Process Embedded` +bindings, nested barriers, and source completeness before asking for another +candidate. An unmet prerequisite defers progress; it is not automatically a +semantic failure. + +A parent becomes `READY` only when every child is initialized or terminated, +every eligible interval is proven complete, all nested barriers are complete, +every child epoch is terminally processed, and every parent cursor and embedded +state agree through the cutoff. A later external entry cannot overtake this +work. + +Top-level admission uses the same advancement engine. `FULL_HISTORY` starts at +the complete beginning, `FROM_FRONTIER` requires verified nonzero evidence, and +`FROM_NOW` establishes a birth frontier without replay. + +A work-bounded drain may pause an open entry or catch-up frame between frozen +PROCESS commits. The frame, barrier, graph generation, document-local cursors, +and committed receipts remain retained, so continuation does not replay a +completed child or parent transition. The budget is a deterministic work bound, +not a wall-clock timeout and not a preemption point inside PROCESS or INITIALIZE. + +The bundled provider proves only its revisioned in-memory journal. Its closed +historical feeder distinguishes an eligible entry, proven complete/empty, +temporarily unavailable, and invalid evidence; unavailable is never interpreted +as an empty interval. Inside the same live engine, the in-memory coordinator can +be reconstructed around retained document, journal, and scheduler state and +resume exact entry-frame/barrier/cursor progress. This is not fresh-engine or +serialized-state recovery. General external frontier import and cross-process +recovery remain pending until a durable provider supplies revision-complete +cursors and passes the restart/store release gates. diff --git a/docs/semantics/identity-and-revisions.md b/docs/semantics/identity-and-revisions.md new file mode 100644 index 0000000..a29250d --- /dev/null +++ b/docs/semantics/identity-and-revisions.md @@ -0,0 +1,32 @@ +# Identity and revisions + +Every retained whole value has a verified BlueId. `ExactValue` keeps the frozen +value and, when available, the original resolved snapshot. Public reads return +immutable values or detached node copies. + +`DocumentSnapshot` distinguishes authored initial identity from current exact +state. It also exposes immutable physical-object, embedded-child, boundary, and +routing evidence for diagnostics. + +`DocumentId` and state BlueId are deliberately different. One `DocumentId` has +an ordered epoch history with potentially many state BlueIds. Different +DocumentIds remain independent even when their exact current state has the same +BlueId. When an existing managed document is attached, a verified current state +attaches directly, a verified historical state catches up through later known +epochs, and an unknown divergent state fails closed or requires an explicit +fork. + +`DocumentRevision` records document identity, epoch, root application order, +revision kind, before/after exact values, source Timeline Entry, catch-up cause, +emitted events, and processing gas. Initialization has no source entry; a +Timeline revision always has one. + +One immutable `EmbeddingBinding` names a parent occurrence, child DocumentId, +path, activation generation, admitted child state, and attachment evidence. +`EmbeddedEpochCursor` separately names the latest child epoch incorporated by +that occurrence. Removing and re-adding a path creates a new activation +generation and a fresh cursor without deleting immutable child audit history. + +The journal owns global and per-Timeline sequence numbers. Failed append parsing +does not consume either sequence or logical time. Failed top-level admission +does not publish a document, route, object, or metric fact. diff --git a/docs/semantics/initialization-causality.md b/docs/semantics/initialization-causality.md new file mode 100644 index 0000000..afe1f1a --- /dev/null +++ b/docs/semantics/initialization-causality.md @@ -0,0 +1,56 @@ +# Initialization causality and embedded lifecycle events + +Initialization is a deterministic processor-managed document transition. It is +not an externally authored Timeline Entry and must not be assigned a fabricated +provider timestamp. + +Every initialization revision nevertheless carries exact causal evidence: + +- the document-local epoch and application order; +- the canonical external-order frontier at which the document became active; +- a real causal BlueId: a retained top-level admission cause or attachment entry; +- `CatchUpCause` for a document activated through `Process Embedded`; +- ordered Root events emitted by lifecycle handlers; +- exact frozen processing gas. + +For a host that adds a processable child, the order is: + +```text +host initialization +host attachment transition E +child initialization caused by E +host application of the child initialization epoch +historical child epochs before E, when required +live entries after E +``` + +The child never processes the attachment entry itself. Initialization events are +stored once on the child's epoch. Every containing document applies that same +immutable epoch through the processor-owned embedded input. A second host that +later embeds the same `DocumentId` reuses the existing child session and applies +the retained initialization epoch; it does not initialize the child again. + +Application reads remain closed until graph publication, initialization, +catch-up, and all required child-epoch applications are complete. Audit reads +may inspect a committed `CATCHING_UP` state. + +## Time model + +Initialization has no external source timestamp because no Timeline Provider +published it. It has two deterministic coordinates instead: + +```text +causal source order + The admission or attachment frontier that made initialization required. + +document application order + The position of the initialization transition in that document's history. +``` + +An internal monotonic value used to identify the exact processor-owned input is +not an external timestamp and must never participate in cross-provider order. + +Top-level admission retains an internal `Coordination/Document Admission Cause` +whole object. Its BlueId binds the stable `DocumentId`, exact authored state, +admission policy, and typed admission-frontier tuple. Retries reuse that BlueId; +embedded initialization instead retains the exact attachment entry BlueId. diff --git a/docs/semantics/process-embedded-documents.md b/docs/semantics/process-embedded-documents.md new file mode 100644 index 0000000..445d492 --- /dev/null +++ b/docs/semantics/process-embedded-documents.md @@ -0,0 +1,44 @@ +# Managed Process Embedded documents + +The only document-dependency model is the effective `Process Embedded` graph +derived from `paths` and `collectionPaths`. Ordinary nested maps, lists, and +large values remain inline unless that effective contract establishes a process +boundary. The runtime does not add a second authored link protocol, target set, +wave model, consistency mode, or SCC planner. + +Every processable document has a stable `DocumentId` and immutable epoch +history. A state BlueId identifies one exact state, not the continuing history. +The same DocumentId may occur under several parent paths: its direct Timeline +transition runs once, while each occurrence applies the resulting epochs through +its own cursor. Different DocumentIds remain independent even when their current +state BlueIds are equal. + +`EmbeddingBinding` contains immutable topology and activation identity. +`EmbeddedEpochCursor` contains progress as replaceable persisted state. This +separation keeps graph snapshots stable and lets one parent lag or retry without +changing another parent or the child history. + +A containing document applies a child epoch through exact frozen PROCESS. The +engine supplies a private `EmbeddedEpochInput` with parent/path/generation +evidence, old and new child BlueIds, and ordered `EventOccurrence` records. The +parent processor verifies the old state, performs replacement, runs reactions, +and commits its new epoch. The host never pre-mutates the child field, and the +input is never a synthetic provider Timeline Entry. + +Activation policy is admission metadata, not another field on the canonical +`Process Embedded` contract. A new occurrence may be born at attachment, import +complete history, import from a verified frontier, attach a proven current +state, or remain a passive snapshot. A document with no effective contracts and +no processable descendants remains ordinary content unless explicitly admitted +as a managed process. + +Removing an occurrence retires its binding and source projection but preserves +history. Re-adding the path creates a new activation generation and cursor. A +known current child state attaches directly; a known older epoch catches up +through missing epochs; an unknown divergent state fails closed or requires an +explicit fork. Cycles are rejected before topology or receipts publish. + +This managed epoch/history behavior is the Round 10.1 Coordination temporal +profile. It uses frozen Language, Contracts, BEX, and Repository transitions but +does not claim these cross-document histories are already normative Contracts +1.0 behavior. diff --git a/gradle.lockfile b/gradle.lockfile new file mode 100644 index 0000000..e89dbeb --- /dev/null +++ b/gradle.lockfile @@ -0,0 +1,37 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +# To regenerate this file, run: ./gradlew :dependencies --write-locks +blue.language:blue-contracts-core:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-core:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-ipfs:3.1.0-rc.20=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-java:3.1.0-rc.20=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-mapping:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-model:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-annotations:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-core:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-databind:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson:jackson-bom:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.google.code.findbugs:jsr305:3.0.2=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +commons-codec:commons-codec:1.11=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +commons-logging:commons-logging:1.2=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +io.github.erdtman:java-json-canonicalization:1.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.apache.httpcomponents:httpclient:4.5.14=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.apache.httpcomponents:httpcore:4.4.16=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.apiguardian:apiguardian-api:1.1.2=consumerTestCompileClasspath,integrationTestCompileClasspath,scenarioTestCompileClasspath,testCompileClasspath +org.bouncycastle:bcprov-jdk18on:1.78.1=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.javassist:javassist:3.28.0-GA=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.14.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,scenarioTestRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.14.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,scenarioTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.14.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,scenarioTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.reflections:reflections:0.10.2=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:1.7.32=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.yaml:snakeyaml:2.0=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +empty=annotationProcessor,consumerTestAnnotationProcessor,integrationTestAnnotationProcessor,scenarioTestAnnotationProcessor,testAnnotationProcessor,testFixturesAnnotationProcessor diff --git a/gradle.properties b/gradle.properties index 4ac81a4..a4991af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,4 @@ org.gradle.java.installations.auto-download=true -org.gradle.java.installations.fromEnv=JAVA_HOME_8_X64,JAVA_HOME_8_ARM64,JAVA8_HOME +org.gradle.caching=true +org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8 +org.gradle.warning.mode=all diff --git a/gradle/bex-source.lock b/gradle/bex-source.lock new file mode 100644 index 0000000..e23c6b4 --- /dev/null +++ b/gradle/bex-source.lock @@ -0,0 +1,3 @@ +coordinate=blue.bex:blue-bex-core:1.1.0-rc.3 +contractsCoordinate=blue.bex:blue-bex-contracts:1.1.0-rc.3 +commit=ffd78f1732a86e99bc0a28d42ff90a0eba4e90e9 diff --git a/gradle/published-artifact.lockfile b/gradle/published-artifact.lockfile new file mode 100644 index 0000000..0aea4da --- /dev/null +++ b/gradle/published-artifact.lockfile @@ -0,0 +1,40 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +# To regenerate this file, run: ./gradlew :dependencies --write-locks +blue.bex:blue-bex-contracts:1.1.0-rc.3=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.bex:blue-bex-core:1.1.0-rc.3=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-contracts-core:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-core:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-ipfs:3.1.0-rc.20=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-java:3.1.0-rc.20=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-mapping:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.language:blue-language-model:3.1.0-rc.20=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +blue.repo:blue-repo-java:3.0.0-rc.21=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-annotations:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-core:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.core:jackson-databind:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.15.2=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.fasterxml.jackson:jackson-bom:2.15.2=compileClasspath,consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.google.code.findbugs:jsr305:3.0.2=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +commons-codec:commons-codec:1.11=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +commons-logging:commons-logging:1.2=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +io.github.erdtman:java-json-canonicalization:1.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.apache.httpcomponents:httpclient:4.5.14=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.apache.httpcomponents:httpcore:4.4.16=integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.apiguardian:apiguardian-api:1.1.2=consumerTestCompileClasspath,integrationTestCompileClasspath,scenarioTestCompileClasspath,testCompileClasspath +org.bouncycastle:bcprov-jdk18on:1.78.1=compileClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.javassist:javassist:3.28.0-GA=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.14.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,scenarioTestRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.14.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,scenarioTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.14.1=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,scenarioTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.14.1=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=consumerTestCompileClasspath,consumerTestRuntimeClasspath,integrationTestCompileClasspath,integrationTestRuntimeClasspath,scenarioTestCompileClasspath,scenarioTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.reflections:reflections:0.10.2=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:1.7.32=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.yaml:snakeyaml:2.0=consumerTestRuntimeClasspath,integrationTestRuntimeClasspath,runtimeClasspath,scenarioTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +empty=annotationProcessor,consumerTestAnnotationProcessor,integrationTestAnnotationProcessor,scenarioTestAnnotationProcessor,testAnnotationProcessor,testFixturesAnnotationProcessor diff --git a/gradle/repository-source.lock b/gradle/repository-source.lock new file mode 100644 index 0000000..09a0eb5 --- /dev/null +++ b/gradle/repository-source.lock @@ -0,0 +1,5 @@ +# Optional local-composite diagnostic input matching the published rc.21 API. +coordinate=blue.repo:blue-repo-java:3.0.0-rc.21 +baseCommit=2fcf29bf060ed114c971194adb6f8b747899aee2 +workspaceDiffSha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +languageCommit=505a654699b86b42bf0e282ddf94560a91529bcf diff --git a/scripts/round13-ab-evidence.mjs b/scripts/round13-ab-evidence.mjs new file mode 100755 index 0000000..5e80eb0 --- /dev/null +++ b/scripts/round13-ab-evidence.mjs @@ -0,0 +1,1668 @@ +#!/usr/bin/env node + +import { execFileSync, spawnSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { + appendFileSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, + readdirSync, realpathSync, statSync, writeFileSync +} from 'node:fs'; +import { + arch as osArch, cpus as osCpus, hostname as osHostname, + platform as osPlatform, release as osRelease, totalmem as osTotalMemory +} from 'node:os'; +import { basename, dirname, join, resolve, sep } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const RUNTIME_SCHEMA = 'blue-coordination-round13-five-occurrence-runtime-v3'; +const PROVENANCE_SCHEMA = 'blue-coordination-round13-runtime-provenance-v3'; +const PREFLIGHT_SCHEMA = 'blue-coordination-round13-ab-preflight-v3'; +const LEDGER_SCHEMA = 'blue-coordination-round13-ab-ledger-entry-v1'; +const POSTFLIGHT_SCHEMA = 'blue-coordination-round13-ab-postflight-v3'; +const SAMPLE_SCHEMA = 'round13-playground-sample-v3'; +const HELPER_CAMPAIGN_SCHEMA = 'round13-playground-campaign-v3'; +const PUBLISHED_DEPENDENCIES_SCHEMA = + 'blue-coordination-round13-published-dependencies-v1'; +const NO_POSTFLIGHT_TOOLING_CHANGES_MARKER = + 'NO_POSTFLIGHT_TOOLING_CHANGES'; +const NO_POSTFLIGHT_TOOLING_CHANGES_REASON = + 'The tracked importer and receipt generator are the same frozen file, and the ' + + 'runner, current Round12NbaEvidence, candidate execution and harness surfaces, ' + + 'fixtures, published lock and resolved artifact bytes, wrapper, baseline archive ' + + 'and project, Java runtime, and physical host must match their exact preflight ' + + 'bindings through postflight, receipt generation, and independent verification. ' + + 'No postflight tooling or test-lane substitution is permitted.'; +const ROUND12_NBA_EVIDENCE_PATH = + 'src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java'; +const BASELINE_HASH = + '2f303afd9435937145ce7fe09eb655ff1a05ee6ed7484faea62d93544a3ccf3e'; +const EXPECTED_PATHS = [ + '/children/alphaFirst', + '/children/alphaSecond', + '/children/betaFirst', + '/children/betaSecond', + '/children/gamma' +]; +const COMMON_ZERO_COUNTERS = [ + 'UNRELATED_DOCUMENT_READS', + 'REQUEST_FRAGMENTS', + 'TIMELINE_ENTRY_FRAGMENTS', + 'ORDINARY_NODE_FRAGMENTS', + 'FULL_ENVIRONMENT_SCANS', + 'SOURCE_REPLAYS_PER_PARENT', + 'POST_PROCESS_FULL_PROJECTIONS' +]; +const CANDIDATE_ONLY_ZERO_COUNTERS = [ + 'PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY', + 'CHILD_PROCESS_RERUNS_ON_PARENT_RETRY' +]; +const FIXTURE_FILES = [ + 'src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java', + 'src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java', + 'src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml', + 'src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml' +]; +const HARNESS_HELPER = + 'src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java'; +const PUBLISHED_RESOLVER = 'scripts/round13-published-dependencies.gradle'; +const LOCK_FILES = ['gradle/published-artifact.lockfile']; +const REQUIRED_PUBLISHED_COORDINATES = [ + 'blue.bex:blue-bex-contracts:1.1.0-rc.3', + 'blue.bex:blue-bex-core:1.1.0-rc.3', + 'blue.repo:blue-repo-java:3.0.0-rc.21' +]; +const BASELINE_ALLOWED_DIFFERENCES = { + '.cz.toml': 'ADDED', + 'build.gradle': 'MODIFIED', + 'gradle/published-artifact.lockfile': 'MODIFIED', + 'src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java': + 'ADDED', + 'src/integrationTest/java/blue/coordination/integration/TestEngine.java': 'MODIFIED', + 'src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml': + 'ADDED', + 'src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java': + 'ADDED' +}; +const BASELINE_EXPECTED_SHIM_SHA256 = { + '.cz.toml': '2a4dc5464760ba429e99012998be2068384aefbd1d926571f45e9f24c1dca417', + 'build.gradle': '8138b85771895cbd36c3f8a8f2e6eda7672d0f13aedf2208b51c91c1acdf8732', + 'gradle/published-artifact.lockfile': + '34d91fc93d0123477bcab36d52462e27f3dacd0586ad0afa7072f303d4d7fc12', + 'src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java': + 'f12e892c213bbcf74d09e2b71ba1fe8f73327eead07ad3ffda3d3197a74b52f1', + 'src/integrationTest/java/blue/coordination/integration/TestEngine.java': + 'bf282e92b0f861d9352eb2ac7e05183c25337bb3462cd55151c1f045ebd9d4c0', + 'src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml': + 'b1e94c039d0fd0df70b0c803ebe921a290d1590bac69a9073fe4910ca8939b6b', + 'src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java': + 'cbb936435d13c4bf5678fc6addedbf625801a4edc52c453c8a441caa1a2bf8d3' +}; +const METRICS = [ + 'requestPreparationNanos', + 'appendNanos', + 'routeNanos', + 'embeddedInputPreparationNanos', + 'hostBeforeFrozenNanos', + 'processFrozenNanos', + 'initializationFrozenNanos', + 'frozenNanos', + 'hostAfterFrozenNanos', + 'initializationHostBeforeFrozenNanos', + 'initializationHostAfterFrozenNanos', + 'graphPublicationNanos', + 'coordinationHostNanos', + 'totalNanos' +]; +const FIXED_COUNTS = { + wholeObjectsAdded: 4, + wholeObjectInsertions: 42, + wholeObjectDuplicates: 31, + journalEntries: 1, + documentCount: 4, + routeRows: 13, + embeddingBindings: 5, + childSessionsCreated: 3, + childSessionsReused: 2, + childInitializationCalls: 3, + childInitializationRevisions: 3, + externalProcessCalls: 1, + embeddedEpochProcessCalls: 5, + initializationApplications: 5, + initializationEventsForwarded: 5, + parentApplications: 5, + frozenProcessCalls: 6, + hostInitializationEvents: 5, + alphaInitializationEvents: 2, + betaInitializationEvents: 2, + gammaInitializationEvents: 1, + hostRevisionApplications: 5 +}; +const GATE_SPECS = { + appendP95: ['appendNanos', 250_000, 1_000_000], + routeP95: ['routeNanos', 50_000, 200_000], + coordinationHostP95: ['coordinationHostNanos', 120_000_000, 250_000_000], + totalP95: ['totalNanos', 2_500_000_000, 4_000_000_000] +}; +const RUNTIME_STRING_FIELDS = [ + 'javaVersion', 'javaVendor', 'javaHome', 'osName', 'osVersion', 'osArch' +]; +const IGNORED_TREE_SEGMENTS = new Set([ + '.git', '.gradle', 'build', 'out', 'target', 'node_modules' +]); +const ROOT_BUILD_FILES = new Set([ + '.cz.toml', 'build.gradle', 'build.gradle.kts', 'settings.gradle', + 'settings.gradle.kts', 'gradle.properties', 'gradlew', 'gradlew.bat' +]); + +function fail(message) { + throw new Error(message); +} + +function parseArgs(argv) { + const result = {}; + const modes = new Set([ + 'verify', 'self-test', 'capture-preflight', 'append-ledger', 'capture-postflight' + ]); + for (let index = 0; index < argv.length; index += 1) { + const value = argv[index]; + if (!value.startsWith('--')) fail(`Unexpected argument ${value}`); + const key = value.slice(2); + if (modes.has(key)) { + result[key] = true; + continue; + } + if (index + 1 >= argv.length) fail(`Missing value for ${value}`); + result[key] = argv[index += 1]; + } + const selected = [...modes].filter(mode => result[mode]); + if (selected.length > 1) fail(`Choose only one mode, got ${selected.join(', ')}`); + return result; +} + +function required(args, key) { + if (!args[key]) fail(`Missing --${key}`); + return resolve(args[key]); +} + +function requiredText(args, key) { + if (!args[key] || !String(args[key]).trim()) fail(`Missing --${key}`); + return String(args[key]); +} + +function requiredInteger(args, key) { + const value = Number.parseInt(requiredText(args, key), 10); + if (!Number.isSafeInteger(value)) fail(`Invalid --${key}`); + return value; +} + +function sha256(value) { + return createHash('sha256').update(value).digest('hex'); +} + +function canonicalValue(value) { + if (Array.isArray(value)) return value.map(canonicalValue); + if (value !== null && typeof value === 'object') { + return Object.fromEntries(Object.keys(value).sort() + .map(key => [key, canonicalValue(value[key])])); + } + return value; +} + +function canonicalJson(value) { + return JSON.stringify(canonicalValue(value)); +} + +function compare(label, actual, expected) { + if (canonicalJson(actual) !== canonicalJson(expected)) fail(`${label} differs`); +} + +function readJson(file) { + try { + return JSON.parse(readFileSync(file, 'utf8')); + } catch (error) { + fail(`${file}: invalid JSON (${error.message})`); + } +} + +function writeJson(file, value) { + mkdirSync(dirname(file), { recursive: true }); + writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`); +} + +function slash(path) { + return path.split(sep).join('/'); +} + +function isMetadataPath(path) { + const parts = path.split('/'); + return parts.includes('__MACOSX') || parts.includes('.DS_Store') + || parts.some(part => part.startsWith('._')); +} + +function shouldIgnoreTreePath(path) { + if (isMetadataPath(path)) return true; + return path.split('/').some(part => IGNORED_TREE_SEGMENTS.has(part)); +} + +function walkFiles(root, current = '') { + const directory = current ? join(root, current) : root; + return readdirSync(directory).sort().flatMap(name => { + const path = current ? `${slash(current)}/${name}` : name; + if (shouldIgnoreTreePath(path)) return []; + const file = join(root, path); + const stat = lstatSync(file); + if (stat.isDirectory()) return walkFiles(root, path); + return [path]; + }); +} + +function fileEntry(root, path, includeMode) { + const file = join(root, path); + const stat = lstatSync(file); + const bytes = stat.isSymbolicLink() + ? Buffer.from(`SYMLINK\0${readlinkSync(file)}`) + : readFileSync(file); + const entry = { + path, + type: stat.isSymbolicLink() ? 'symlink' : 'file', + size: bytes.length, + sha256: sha256(bytes) + }; + if (includeMode) entry.mode = stat.mode & 0o777; + return entry; +} + +function manifestDigest(entries, includeMode) { + const rows = entries.map(entry => [ + entry.path, entry.type, entry.size, entry.sha256, + includeMode ? entry.mode : '' + ].join('\0')); + return sha256(rows.join('\n')); +} + +function manifestFromPaths(root, paths, includeMode = true) { + const entries = [...new Set(paths)].sort().map(path => fileEntry(root, path, includeMode)); + return { + algorithm: 'SHA-256', + includeMode, + files: entries.length, + entries, + sha256: manifestDigest(entries, includeMode) + }; +} + +function manifestFromFilter(root, predicate, includeMode = true) { + return manifestFromPaths(root, walkFiles(root).filter(predicate), includeMode); +} + +function codePointCompare(left, right) { + return left < right ? -1 : left > right ? 1 : 0; +} + +function localePathCompare(left, right) { + return left.localeCompare(right); +} + +function validateStoredManifest(label, manifest, comparator = codePointCompare) { + if (manifest?.algorithm !== 'SHA-256' || !Array.isArray(manifest.entries) + || manifest.files !== manifest.entries.length + || typeof manifest.includeMode !== 'boolean') fail(`${label}: malformed manifest`); + let previous = ''; + for (const entry of manifest.entries) { + if (typeof entry.path !== 'string' || !entry.path + || (previous && comparator(previous, entry.path) >= 0) + || !['file', 'symlink'].includes(entry.type) + || !Number.isSafeInteger(entry.size) || entry.size < 0 + || !/^[0-9a-f]{64}$/.test(entry.sha256) + || (manifest.includeMode + && (!Number.isSafeInteger(entry.mode) || entry.mode < 0))) { + fail(`${label}: invalid manifest entry`); + } + previous = entry.path; + } + if (manifest.sha256 !== manifestDigest(manifest.entries, manifest.includeMode)) { + fail(`${label}: manifest digest differs`); + } +} + +function mainSourceManifest(project) { + const root = join(project, 'src/main/java'); + const rows = walkFiles(root).filter(path => path.endsWith('.java')).sort() + .map(path => `src/main/java/${path} ${sha256(readFileSync(join(root, path)))}`); + return { files: rows.length, sha256: sha256(rows.join('\n')) }; +} + +function isBuildInput(path) { + const name = basename(path); + return ROOT_BUILD_FILES.has(name) || path.startsWith('gradle/') + || path.includes('/gradle/') || name.endsWith('.lockfile') + || name.endsWith('-source.lock'); +} + +function isCandidateExecutionPath(path) { + return path.startsWith('src/main/') || path.startsWith('src/scenarioTest/') + || path.startsWith('src/integrationTest/') || path.startsWith('src/consumerTest/') + || path.startsWith('src/testFixtures/') || path.startsWith('scripts/') + || isBuildInput(path); +} + +function isHarnessPath(path) { + return path.startsWith('src/scenarioTest/') || path.startsWith('src/integrationTest/') + || path.startsWith('src/consumerTest/') || path.startsWith('src/testFixtures/') + || path === 'scripts/round13-ab-evidence.mjs' + || path === 'scripts/run-round13-same-machine-ab.sh' || isBuildInput(path); +} + +function fileBindings(project, paths) { + return paths.map(path => { + const file = join(project, path); + if (!existsSync(file)) fail(`${project}: missing binding ${path}`); + return { path, size: statSync(file).size, sha256: sha256(readFileSync(file)) }; + }); +} + +function bindingHash(rows) { + return sha256(rows.map(row => `${row.path} ${row.size} ${row.sha256}`).join('\n')); +} + +function gitOutput(project, ...args) { + return execFileSync('git', ['-C', project, ...args], { + encoding: 'utf8' + }).trim(); +} + +function archiveFiles(archive) { + const names = execFileSync('unzip', ['-Z1', archive], { + encoding: 'utf8', maxBuffer: 32 * 1024 * 1024 + }).split(/\r?\n/).filter(Boolean).filter(name => !name.endsWith('/')); + const meaningful = names.filter(name => !isMetadataPath(name)); + const hasRootBuild = meaningful.includes('build.gradle'); + let prefix = ''; + if (!hasRootBuild) { + const firstParts = new Set(meaningful.map(name => name.split('/')[0])); + if (firstParts.size !== 1) fail('Archive root layout is ambiguous'); + prefix = `${[...firstParts][0]}/`; + } + return meaningful.map(entry => ({ + entry, + path: entry.startsWith(prefix) ? entry.slice(prefix.length) : entry + })).filter(row => row.path && !shouldIgnoreTreePath(row.path)); +} + +function archiveManifest(archive) { + const entries = archiveFiles(archive).map(({ entry, path }) => { + const bytes = execFileSync('unzip', ['-p', archive, entry], { + encoding: null, maxBuffer: 64 * 1024 * 1024 + }); + return { path, type: 'file', size: bytes.length, sha256: sha256(bytes) }; + }).sort((a, b) => a.path.localeCompare(b.path)); + return { + algorithm: 'SHA-256', + includeMode: false, + files: entries.length, + entries, + sha256: manifestDigest(entries, false) + }; +} + +function baselineTreeBinding(project, archive) { + const archived = archiveManifest(archive); + const local = manifestFromPaths(project, walkFiles(project), false); + const archiveByPath = new Map(archived.entries.map(entry => [entry.path, entry])); + const localByPath = new Map(local.entries.map(entry => [entry.path, entry])); + const paths = [...new Set([...archiveByPath.keys(), ...localByPath.keys()])].sort(); + const differences = []; + for (const path of paths) { + const before = archiveByPath.get(path); + const after = localByPath.get(path); + if (before && after && before.sha256 === after.sha256 && before.size === after.size) { + continue; + } + differences.push({ + path, + kind: before && after ? 'MODIFIED' : before ? 'REMOVED' : 'ADDED', + archiveSha256: before?.sha256 ?? null, + projectSha256: after?.sha256 ?? null + }); + } + compare('baseline harness difference allowlist', + Object.fromEntries(differences.map(row => [row.path, row.kind])), + BASELINE_ALLOWED_DIFFERENCES); + compare('baseline harness pinned post-shim hashes', + Object.fromEntries(differences.map(row => [row.path, row.projectSha256])), + BASELINE_EXPECTED_SHIM_SHA256); + return { archiveManifest: archived, projectManifest: local, differences }; +} + +function sysctlInteger(name) { + const result = spawnSync('sysctl', ['-n', name], { encoding: 'utf8' }); + if (result.status !== 0) return null; + const value = Number.parseInt(result.stdout.trim(), 10); + return Number.isSafeInteger(value) && value > 0 ? value : null; +} + +function sysctlText(name) { + const result = spawnSync('sysctl', ['-n', name], { encoding: 'utf8' }); + return result.status === 0 && result.stdout.trim() ? result.stdout.trim() : null; +} + +function darwinHardwareProfile() { + const result = spawnSync('system_profiler', ['SPHardwareDataType'], { + encoding: 'utf8', maxBuffer: 4 * 1024 * 1024 + }); + if (result.status !== 0) return {}; + const cores = result.stdout.match(/Total Number of Cores:\s*(\d+)/); + const chip = result.stdout.match(/^\s*Chip:\s*(.+)$/m); + return { + physicalCpuCount: cores ? Number.parseInt(cores[1], 10) : null, + cpuModel: chip?.[1]?.trim() ?? null + }; +} + +function hostIdentity() { + const cpuRows = osCpus(); + const logicalFallback = cpuRows.length; + const darwin = osPlatform() === 'darwin'; + const hardware = darwin ? darwinHardwareProfile() : {}; + const sysctlPhysical = darwin && !hardware.physicalCpuCount + ? sysctlInteger('hw.physicalcpu') : null; + const details = { + hostname: osHostname(), + platform: osPlatform(), + kernelRelease: osRelease(), + architecture: osArch(), + cpuModel: darwin + ? hardware.cpuModel ?? sysctlText('machdep.cpu.brand_string') ?? cpuRows[0]?.model + : cpuRows[0]?.model, + physicalCpuCount: hardware.physicalCpuCount ?? sysctlPhysical ?? logicalFallback, + physicalCpuCountSource: hardware.physicalCpuCount + ? 'DARWIN_SYSTEM_PROFILER' + : sysctlPhysical ? 'DARWIN_SYSCTL' : 'LOGICAL_FALLBACK', + logicalCpuCount: darwin + ? sysctlInteger('hw.logicalcpu') ?? logicalFallback + : logicalFallback, + totalMemoryBytes: darwin + ? sysctlInteger('hw.memsize') ?? osTotalMemory() + : osTotalMemory() + }; + if (!details.hostname || !details.cpuModel || !details.physicalCpuCount + || !details.logicalCpuCount || !details.totalMemoryBytes) { + fail('Physical host identity is incomplete'); + } + return { ...details, sha256: sha256(canonicalJson(details)) }; +} + +function parseRunner(runner) { + const body = readFileSync(runner, 'utf8'); + for (const marker of [ + '-PtestJavaVersion=17', + '-PblueDependencyMode=published-artifact', + 'warmups=3', + 'samples=30', + 'pair % 2 == 1', + '--capture-preflight', + '--append-ledger', + '--capture-postflight' + ]) { + if (!body.includes(marker)) fail(`Runner lacks ${marker}`); + } + for (const forbidden of [ + '-PblueDependencyMode=local-composite', + '-PblueBexCompositePath=', + '-PblueRepositoryCompositePath=', + '-PbluePublishedRepository=' + ]) { + if (body.includes(forbidden)) fail(`Runner contains forbidden binding ${forbidden}`); + } + const javaHome = body.match(/export\s+JAVA_HOME=(?:"([^"]+)"|'([^']+)'|([^\s]+))/); + if (!javaHome) fail('Runner Java binding is incomplete'); + return { + body, + javaHome: realpathSync(resolve(javaHome[1] || javaHome[2] || javaHome[3])) + }; +} + +function runChecked(command, arguments_, options = {}) { + const result = spawnSync(command, arguments_, { + encoding: 'utf8', maxBuffer: 32 * 1024 * 1024, ...options + }); + if (result.status !== 0) { + fail(`${command} ${arguments_.join(' ')} failed: ${result.stderr || result.stdout}`); + } + return `${result.stdout ?? ''}${result.stderr ?? ''}`.replace(/\r\n/g, '\n').trim(); +} + +function validatePublishedDependencyManifest(manifest, label) { + if (manifest?.schemaId !== PUBLISHED_DEPENDENCIES_SCHEMA + || manifest.dependencyMode !== 'published-artifact' + || manifest.configuration !== 'scenarioTestRuntimeClasspath' + || !Array.isArray(manifest.components) || !Array.isArray(manifest.artifacts) + || manifest.components.some((value, index) => + typeof value !== 'string' || !value + || (index > 0 && manifest.components[index - 1] >= value))) { + fail(`${label}: malformed published dependency manifest`); + } + for (const coordinate of REQUIRED_PUBLISHED_COORDINATES) { + if (!manifest.components.includes(coordinate)) { + fail(`${label}: missing required published module ${coordinate}`); + } + } + let previous = ''; + for (const artifact of manifest.artifacts) { + const key = `${artifact.component}\0${artifact.fileName}\0${artifact.sha256}`; + if (typeof artifact.component !== 'string' || !manifest.components.includes( + artifact.component) || typeof artifact.fileName !== 'string' || !artifact.fileName + || !Number.isSafeInteger(artifact.size) || artifact.size < 0 + || !/^[0-9a-f]{64}$/.test(artifact.sha256) + || (previous && previous >= key)) { + fail(`${label}: malformed published artifact binding`); + } + previous = key; + } +} + +function publishedDependencyManifest(project, javaHome, resolver) { + const output = runChecked(join(project, 'gradlew'), [ + '--no-daemon', + '--max-workers=1', + '--console=plain', + '--quiet', + '--init-script', resolver, + 'round13PublishedDependencyManifest', + '-PtestJavaVersion=17', + '-PblueDependencyMode=published-artifact' + ], { + cwd: project, + env: { ...process.env, JAVA_HOME: javaHome } + }); + const rows = output.split(/\r?\n/).filter(line => + line.startsWith('ROUND13_PUBLISHED_DEPENDENCIES_BASE64=')); + if (rows.length !== 1) fail(`${project}: published dependency marker differs`); + let manifest; + try { + manifest = JSON.parse(Buffer.from(rows[0].slice( + 'ROUND13_PUBLISHED_DEPENDENCIES_BASE64='.length), 'base64').toString('utf8')); + } catch (error) { + fail(`${project}: invalid published dependency manifest (${error.message})`); + } + validatePublishedDependencyManifest(manifest, project); + return manifest; +} + +function javaPreflight(javaHome) { + const output = runChecked(join(javaHome, 'bin/java'), [ + '-XshowSettings:properties', '-version' + ]); + const property = name => { + const match = output.match(new RegExp( + `^\\s*${name.replaceAll('.', '\\.')}\\s*=\\s*(.+)$`, 'm')); + if (!match) fail(`Java preflight lacks ${name}`); + return match[1].trim(); + }; + const logicalProcessors = osCpus().length; + if (logicalProcessors <= 0) fail('Java preflight lacks CPU count'); + const identity = { + javaVersion: property('java.version'), + javaVendor: property('java.vendor'), + javaHome: realpathSync(property('java.home')), + osName: property('os.name'), + osVersion: property('os.version'), + osArch: property('os.arch'), + availableProcessors: logicalProcessors + }; + if (!/^17(?:\.|$)/.test(identity.javaVersion)) fail('Runner JDK is not Java 17'); + return { identity, settingsSha256: sha256(output) }; +} + +function gradlePreflight(project, javaHome) { + const output = runChecked(join(project, 'gradlew'), ['--version'], { + cwd: project, + env: { ...process.env, JAVA_HOME: javaHome } + }); + if (!/^Gradle\s+\d+/m.test(output) || !/JVM:\s+17(?:\.|\s)/.test(output)) { + fail(`${project}: Gradle wrapper is not running on Java 17`); + } + return { output, sha256: sha256(output) }; +} + +function captureBindings({ + rawRoot, baselineProject, candidateProject, archive, runner, samples, warmups +}) { + if (samples !== 30 || warmups !== 3) fail('Round 13 requires 30 samples and 3 warmups'); + if (sha256(readFileSync(archive)) !== BASELINE_HASH) fail('Archive.zip hash differs'); + const runnerBinding = parseRunner(runner); + const importerBinding = currentGeneratorMetadata(candidateProject); + const resolverBinding = trackedToolMetadata( + join(candidateProject, PUBLISHED_RESOLVER)); + const importer = importerBinding.path; + if (realpathSync(join(candidateProject, 'scripts/round13-ab-evidence.mjs')) + !== importer) fail('Campaign must use the candidate importer'); + if (realpathSync(join(candidateProject, 'scripts/run-round13-same-machine-ab.sh')) + !== realpathSync(runner)) fail('Campaign must use the tracked candidate runner'); + const baselineTree = baselineTreeBinding(baselineProject, archive); + const czLines = readFileSync(join(baselineProject, '.cz.toml'), 'utf8') + .split(/\r?\n/).filter(Boolean); + if (czLines.length !== 4 || !czLines.includes('version = "3.0.0-rc.1"')) { + fail('Baseline four-line .cz.toml shim differs'); + } + const baselineMain = mainSourceManifest(baselineProject); + const candidateMain = mainSourceManifest(candidateProject); + const baselineLocks = fileBindings(baselineProject, LOCK_FILES); + const candidateLocks = fileBindings(candidateProject, LOCK_FILES); + compare('Gradle/source locks', baselineLocks, candidateLocks); + const baselineFixture = fileBindings(baselineProject, FIXTURE_FILES); + const candidateFixture = fileBindings(candidateProject, FIXTURE_FILES); + compare('consumed fixtures', baselineFixture, candidateFixture); + const wrapperPath = 'gradle/wrapper/gradle-wrapper.properties'; + const baselineWrapper = fileBindings(baselineProject, [wrapperPath]); + const candidateWrapper = fileBindings(candidateProject, [wrapperPath]); + compare('Gradle wrapper properties', baselineWrapper, candidateWrapper); + const java = javaPreflight(runnerBinding.javaHome); + const baselineGradle = gradlePreflight(baselineProject, runnerBinding.javaHome); + const candidateGradle = gradlePreflight(candidateProject, runnerBinding.javaHome); + compare('Gradle --version identity', baselineGradle, candidateGradle); + const baselinePublished = publishedDependencyManifest( + baselineProject, runnerBinding.javaHome, resolverBinding.path); + const candidatePublished = publishedDependencyManifest( + candidateProject, runnerBinding.javaHome, resolverBinding.path); + compare('published dependency manifests', baselinePublished, candidatePublished); + return { + integrityMode: 'FULL_CONTENT_MANIFESTS_AND_OBSERVED_COMPLETION_LEDGER', + rawRoot: realpathSync(rawRoot), + samplesPerVariant: samples, + warmups, + order: 'ODD_BASELINE_CANDIDATE_EVEN_CANDIDATE_BASELINE', + runner: { + path: realpathSync(runner), + sha256: sha256(readFileSync(runner)), + dependencyMode: 'published-artifact', + testJavaVersion: 17 + }, + importer: importerBinding, + runtimePreflight: java, + hostIdentity: hostIdentity(), + gradlePreflight: { + baseline: baselineGradle, + candidate: candidateGradle, + sameWrapper: true + }, + wrapper: { + baseline: baselineWrapper, + candidate: candidateWrapper, + bindingSha256: bindingHash(candidateWrapper) + }, + locks: { + baseline: baselineLocks, + candidate: candidateLocks, + bindingSha256: bindingHash(candidateLocks) + }, + fixture: { + baseline: baselineFixture, + candidate: candidateFixture, + bindingSha256: bindingHash(candidateFixture) + }, + baseline: { + projectPath: realpathSync(baselineProject), + archivePath: realpathSync(archive), + archiveSha256: BASELINE_HASH, + mainSourceManifest: baselineMain, + ...baselineTree + }, + candidate: { + projectPath: realpathSync(candidateProject), + implementationHead: gitOutput(candidateProject, 'rev-parse', 'HEAD'), + mainSourceManifest: candidateMain, + executionSurfaceManifest: manifestFromFilter( + candidateProject, isCandidateExecutionPath), + harnessSurfaceManifest: manifestFromFilter(candidateProject, isHarnessPath), + round12NbaEvidence: fileEntry( + candidateProject, ROUND12_NBA_EVIDENCE_PATH, true) + }, + publishedDependencies: { + resolver: resolverBinding, + requiredCoordinates: REQUIRED_PUBLISHED_COORDINATES, + baseline: baselinePublished, + candidate: candidatePublished, + sameResolution: true, + bindingSha256: sha256(canonicalJson(candidatePublished)) + } + }; +} + +function bindingEnvelope(schemaId, campaignId, capturedAt, bindings) { + return { + schemaId, + campaignId, + capturedAt, + bindings, + bindingsSha256: sha256(canonicalJson(bindings)) + }; +} + +function validateEnvelope(envelope, schema, label) { + if (envelope?.schemaId !== schema || typeof envelope.campaignId !== 'string' + || !envelope.campaignId || !validTimestamp(envelope.capturedAt) + || envelope.bindingsSha256 !== sha256(canonicalJson(envelope.bindings))) { + fail(`${label}: invalid binding envelope`); + } +} + +function validTimestamp(value) { + return typeof value === 'string' && Number.isFinite(Date.parse(value)); +} + +function capturePreflight(args) { + const rawRoot = required(args, 'raw'); + const baselineProject = required(args, 'baseline'); + const candidateProject = required(args, 'candidate'); + const archive = required(args, 'archive'); + const runner = required(args, 'runner'); + const output = required(args, 'output'); + const campaignId = requiredText(args, 'campaign-id'); + const samples = requiredInteger(args, 'samples'); + const warmups = requiredInteger(args, 'warmups'); + if (existsSync(output)) fail(`Preflight output already exists: ${output}`); + if (output !== join(rawRoot, 'preflight-bindings.json')) { + fail('Preflight receipt must use the canonical raw-root path'); + } + const bindings = captureBindings({ + rawRoot, baselineProject, candidateProject, archive, runner, samples, warmups + }); + writeJson(output, bindingEnvelope( + PREFLIGHT_SCHEMA, campaignId, new Date().toISOString(), bindings)); + console.log(`ROUND13_AB_PREFLIGHT=${output}`); +} + +function expectedVariant(ordinal) { + const pair = Math.ceil(ordinal / 2); + const first = pair % 2 === 1 ? 'baseline' : 'candidate'; + return ordinal % 2 === 1 ? first : first === 'baseline' ? 'candidate' : 'baseline'; +} + +function validateRuntimeIdentity(runtime, label) { + if (runtime === null || typeof runtime !== 'object' || Array.isArray(runtime)) { + fail(`${label}: runtime identity missing`); + } + for (const field of RUNTIME_STRING_FIELDS) { + if (typeof runtime[field] !== 'string' || !runtime[field].trim()) { + fail(`${label}: runtime.${field} missing`); + } + } + if (!/^17(?:\.|$)/.test(runtime.javaVersion) + || !Array.isArray(runtime.jvmInputArguments) + || runtime.jvmInputArguments.some(argument => + typeof argument !== 'string' || !argument.trim()) + || runtime.jvmInputArguments.some(argument => + argument.startsWith('-Dblue.coordination.round13.sample=')) + || !runtime.jvmInputArguments.includes('-Dblue.coordination.round13.warmups=3') + || !Number.isSafeInteger(runtime.availableProcessors) + || runtime.availableProcessors <= 0) fail(`${label}: invalid runtime identity`); +} + +function validateSample(sample, variant, label) { + if (sample.schemaVersion !== SAMPLE_SCHEMA) fail(`${label}: bad sample schema`); + if (typeof sample.entryBlueId !== 'string' || !sample.entryBlueId.trim()) { + fail(`${label}: entryBlueId missing`); + } + validateRuntimeIdentity(sample.runtime, label); + compare(`${label}: application paths`, sample.applicationPaths, EXPECTED_PATHS); + for (const [name, expected] of Object.entries(FIXED_COUNTS)) { + if (sample[name] !== expected) fail(`${label}: ${name}=${sample[name]}`); + } + for (const name of METRICS) { + if (!Number.isSafeInteger(sample[name]) || sample[name] < 0) { + fail(`${label}: invalid ${name}`); + } + } + if (sample.frozenNanos !== sample.processFrozenNanos + + sample.initializationFrozenNanos) fail(`${label}: frozen total differs`); + if (sample.totalNanos < sample.frozenNanos) { + fail(`${label}: total time is smaller than frozen time`); + } + if (sample.coordinationHostNanos !== sample.totalNanos - sample.frozenNanos) { + fail(`${label}: host remainder differs`); + } + const counters = sample.forbiddenCounters; + if (counters === null || typeof counters !== 'object' || Array.isArray(counters)) { + fail(`${label}: counters missing`); + } + const expected = variant === 'baseline' + ? COMMON_ZERO_COUNTERS + : [...COMMON_ZERO_COUNTERS, ...CANDIDATE_ONLY_ZERO_COUNTERS]; + compare(`${label}: counter vocabulary`, Object.keys(counters).sort(), [...expected].sort()); + for (const name of expected) { + if (counters[name] !== 0) fail(`${label}: ${name} must be zero`); + } + if (variant === 'baseline' && CANDIDATE_ONLY_ZERO_COUNTERS.some( + name => Object.hasOwn(counters, name))) { + fail(`${label}: baseline must not fabricate retry counters`); + } +} + +function ledgerRecordDigest(record) { + const copy = { ...record }; + delete copy.entrySha256; + return sha256(canonicalJson(copy)); +} + +function parseLedgerBytes(bytes, label, requireComplete = false) { + const body = bytes.toString('utf8'); + const lines = body ? body.split(/\r?\n/).filter(Boolean) : []; + const records = []; + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index]; + let record; + try { + record = JSON.parse(line); + } catch (error) { + fail(`${label}: ledger line ${index + 1} is invalid JSON`); + } + if (record.schemaId !== LEDGER_SCHEMA || record.ordinal !== index + 1 + || typeof record.campaignId !== 'string' || !record.campaignId + || record.pair !== Math.ceil(record.ordinal / 2) + || record.variant !== expectedVariant(record.ordinal) + || record.rawPath !== `${record.variant}/${record.pair}.json` + || record.sampleSchema !== SAMPLE_SCHEMA + || typeof record.entryBlueId !== 'string' || !record.entryBlueId.trim() + || !validTimestamp(record.startedAt) || !validTimestamp(record.endedAt) + || Date.parse(record.endedAt) < Date.parse(record.startedAt) + || !/^[0-9a-f]{64}$/.test(record.rawSha256) + || !/^[0-9a-f]{64}$/.test(record.canonicalSha256) + || !/^[0-9a-f]{64}$/.test(record.runnerSha256) + || !/^[0-9a-f]{64}$/.test(record.importerSha256) + || !/^[0-9a-f]{64}$/.test(record.preflightSha256) + || record.previousEntrySha256 !== (index === 0 ? null : records[index - 1].entrySha256) + || (index > 0 + && Date.parse(record.startedAt) < Date.parse(records[index - 1].endedAt)) + || record.entrySha256 !== ledgerRecordDigest(record)) { + fail(`${label}: invalid ledger record ${index + 1}`); + } + records.push(record); + } + if (records.length > 60 || (requireComplete && records.length !== 60)) { + fail(`${label}: expected ${requireComplete ? 'exactly 60' : 'at most 60'} records`); + } + return records; +} + +function assertRawInventory(rawRoot) { + const expected = Array.from({ length: 30 }, (_, index) => `${index + 1}.json`); + for (const variant of ['baseline', 'candidate']) { + const actual = readdirSync(join(rawRoot, variant)) + .filter(name => name.endsWith('.json')) + .sort((left, right) => Number.parseInt(left, 10) - Number.parseInt(right, 10)); + compare(`${variant} raw sample inventory`, actual, expected); + } +} + +function assertRuntimeMatchesPreflight(sampleRuntime, bindings, label) { + const java = bindings.runtimePreflight.identity; + for (const field of RUNTIME_STRING_FIELDS) { + const actual = field === 'javaHome' ? realpathSync(sampleRuntime[field]) : sampleRuntime[field]; + if (actual !== java[field]) fail(`${label}: runtime.${field} differs from preflight`); + } + if (sampleRuntime.availableProcessors !== java.availableProcessors) { + fail(`${label}: availableProcessors differs from preflight`); + } +} + +function appendLedger(args) { + const preflightPath = required(args, 'preflight'); + const ledgerPath = required(args, 'ledger'); + const rawPath = required(args, 'raw-sample'); + const runner = required(args, 'runner'); + const campaignId = requiredText(args, 'campaign-id'); + const ordinal = requiredInteger(args, 'ordinal'); + const pair = requiredInteger(args, 'pair'); + const variant = requiredText(args, 'variant'); + const startedAt = requiredText(args, 'started-at'); + const endedAt = requiredText(args, 'ended-at'); + const preflightBytes = readFileSync(preflightPath); + const preflight = JSON.parse(preflightBytes); + validateEnvelope(preflight, PREFLIGHT_SCHEMA, 'preflight'); + if (preflightPath !== join(preflight.bindings.rawRoot, 'preflight-bindings.json') + || ledgerPath !== join(preflight.bindings.rawRoot, 'completion-ledger.jsonl')) { + fail('Ledger receipts must use canonical raw-root paths'); + } + if (campaignId !== preflight.campaignId || pair !== Math.ceil(ordinal / 2) + || variant !== expectedVariant(ordinal) || !validTimestamp(startedAt) + || !validTimestamp(endedAt) || Date.parse(endedAt) < Date.parse(startedAt)) { + fail('Ledger invocation does not match campaign order'); + } + const expectedRaw = resolve(preflight.bindings.rawRoot, variant, `${pair}.json`); + if (rawPath !== expectedRaw) fail(`Raw path differs: ${rawPath}`); + if (sha256(readFileSync(runner)) !== preflight.bindings.runner.sha256 + || sha256(readFileSync(fileURLToPath(import.meta.url))) + !== preflight.bindings.importer.sha256 + || process.version !== preflight.bindings.importer.nodeVersion + || realpathSync(process.execPath) !== preflight.bindings.importer.nodeExecutable) { + fail('Runner/importer changed during campaign'); + } + const existingBytes = existsSync(ledgerPath) ? readFileSync(ledgerPath) : Buffer.alloc(0); + const existing = parseLedgerBytes(existingBytes, 'completion ledger'); + if (ordinal !== existing.length + 1) fail('Ledger ordinal is not the next completion'); + const raw = readFileSync(rawPath); + const sample = JSON.parse(raw); + validateSample(sample, variant, `${variant}/${pair}`); + assertRuntimeMatchesPreflight(sample.runtime, preflight.bindings, `${variant}/${pair}`); + if (existing.length > 0 && sample.entryBlueId !== existing[0].entryBlueId) { + fail('entryBlueId differs across campaign rows'); + } + const record = { + schemaId: LEDGER_SCHEMA, + campaignId, + ordinal, + pair, + variant, + startedAt, + endedAt, + rawPath: `${variant}/${pair}.json`, + rawSha256: sha256(raw), + canonicalSha256: sha256(canonicalJson(sample)), + sampleSchema: SAMPLE_SCHEMA, + entryBlueId: sample.entryBlueId, + runnerSha256: preflight.bindings.runner.sha256, + importerSha256: preflight.bindings.importer.sha256, + preflightSha256: sha256(preflightBytes), + previousEntrySha256: existing.at(-1)?.entrySha256 ?? null + }; + record.entrySha256 = ledgerRecordDigest(record); + mkdirSync(dirname(ledgerPath), { recursive: true }); + appendFileSync(ledgerPath, `${JSON.stringify(record)}\n`); + console.log(`ROUND13_AB_LEDGER_ORDINAL=${ordinal}`); +} + +function validateLedgerAgainstRaw(records, rawRoot, preflightBytes, bindings) { + const entryBlueIds = new Set(); + let runtime; + for (const record of records) { + if (record.campaignId !== JSON.parse(preflightBytes).campaignId + || record.preflightSha256 !== sha256(preflightBytes) + || record.runnerSha256 !== bindings.runner.sha256 + || record.importerSha256 !== bindings.importer.sha256) { + fail(`ledger/${record.ordinal}: binding differs`); + } + const raw = readFileSync(join(rawRoot, record.rawPath)); + if (record.rawSha256 !== sha256(raw)) fail(`ledger/${record.ordinal}: raw hash differs`); + const sample = JSON.parse(raw); + validateSample(sample, record.variant, record.rawPath); + if (record.canonicalSha256 !== sha256(canonicalJson(sample))) { + fail(`ledger/${record.ordinal}: canonical hash differs`); + } + if (record.entryBlueId !== sample.entryBlueId) { + fail(`ledger/${record.ordinal}: entryBlueId differs`); + } + assertRuntimeMatchesPreflight(sample.runtime, bindings, record.rawPath); + entryBlueIds.add(sample.entryBlueId); + if (runtime === undefined) runtime = sample.runtime; + else compare(`${record.rawPath}: runtime identity`, sample.runtime, runtime); + } + if (entryBlueIds.size !== 1) fail('All 60 rows must share one entryBlueId'); + return runtime; +} + +function capturePostflight(args) { + const rawRoot = required(args, 'raw'); + const baselineProject = required(args, 'baseline'); + const candidateProject = required(args, 'candidate'); + const archive = required(args, 'archive'); + const runner = required(args, 'runner'); + const preflightPath = required(args, 'preflight'); + const ledgerPath = required(args, 'ledger'); + const output = required(args, 'output'); + const campaignId = requiredText(args, 'campaign-id'); + if (existsSync(output)) fail(`Postflight output already exists: ${output}`); + const preflightBytes = readFileSync(preflightPath); + const preflight = JSON.parse(preflightBytes); + validateEnvelope(preflight, PREFLIGHT_SCHEMA, 'preflight'); + if (preflightPath !== join(rawRoot, 'preflight-bindings.json') + || ledgerPath !== join(rawRoot, 'completion-ledger.jsonl') + || output !== join(rawRoot, 'postflight-bindings.json')) { + fail('Postflight receipts must use canonical raw-root paths'); + } + if (preflight.campaignId !== campaignId) fail('Postflight campaign ID differs'); + const ledgerBytes = readFileSync(ledgerPath); + const records = parseLedgerBytes(ledgerBytes, 'completion ledger', true); + const bindings = captureBindings({ + rawRoot, + baselineProject, + candidateProject, + archive, + runner, + samples: preflight.bindings.samplesPerVariant, + warmups: preflight.bindings.warmups + }); + compare('postflight bindings', bindings, preflight.bindings); + validateLedgerAgainstRaw(records, rawRoot, preflightBytes, bindings); + const postflight = { + ...bindingEnvelope(POSTFLIGHT_SCHEMA, campaignId, new Date().toISOString(), bindings), + preflightSha256: sha256(preflightBytes), + completionLedgerSha256: sha256(ledgerBytes), + completedRows: records.length, + finalLedgerEntrySha256: records.at(-1).entrySha256 + }; + writeJson(output, postflight); + console.log(`ROUND13_AB_POSTFLIGHT=${output}`); +} + +function distribution(rows, metric) { + const values = rows.map(row => row.sample[metric]).sort((a, b) => a - b); + const at = fraction => values[Math.max(0, Math.ceil(values.length * fraction) - 1)]; + return { p50Nanos: at(0.5), p95Nanos: at(0.95), maximumNanos: values.at(-1) }; +} + +function distributions(rows) { + return Object.fromEntries(METRICS.map(metric => [metric, distribution(rows, metric)])); +} + +function decision(candidateDistributions) { + const gates = Object.fromEntries(Object.entries(GATE_SPECS).map( + ([name, [metric, preferred, hard]]) => { + const observed = candidateDistributions[metric].p95Nanos; + return [name, { + metric, + statistic: 'p95Nanos', + observedCandidateNanos: observed, + preferredMaxNanos: preferred, + hardMaxNanos: hard, + preferredStatus: observed <= preferred ? 'PASS' : 'MISS', + hardStatus: observed <= hard ? 'PASS' : 'FAIL' + }]; + })); + const hardPass = Object.values(gates).every(gate => gate.hardStatus === 'PASS'); + const preferredPass = Object.values(gates).every( + gate => gate.preferredStatus === 'PASS'); + return { + overallStatus: !hardPass ? 'FAIL' : preferredPass ? 'PASS' : 'PASS_HARD_GATE', + gates + }; +} + +function validateCampaignBundle(preflightBytes, ledgerBytes, postflightBytes, rawRoot) { + const preflight = JSON.parse(preflightBytes); + const postflight = JSON.parse(postflightBytes); + validateEnvelope(preflight, PREFLIGHT_SCHEMA, 'preflight'); + validateEnvelope(postflight, POSTFLIGHT_SCHEMA, 'postflight'); + if (preflight.campaignId !== postflight.campaignId + || postflight.preflightSha256 !== sha256(preflightBytes) + || postflight.completionLedgerSha256 !== sha256(ledgerBytes) + || postflight.completedRows !== 60 + || preflight.bindingsSha256 !== postflight.bindingsSha256) { + fail('Preflight/postflight campaign chain differs'); + } + compare('preflight/postflight bindings', preflight.bindings, postflight.bindings); + assertRawInventory(rawRoot); + const records = parseLedgerBytes(ledgerBytes, 'completion ledger', true); + if (postflight.finalLedgerEntrySha256 !== records.at(-1).entrySha256) { + fail('Postflight final ledger hash differs'); + } + const runtime = validateLedgerAgainstRaw( + records, rawRoot, preflightBytes, preflight.bindings); + return { preflight, postflight, records, runtime }; +} + +function trackedToolMetadata(file) { + const path = realpathSync(file); + const bytes = readFileSync(path); + const stat = lstatSync(path); + return { + path, + sha256: sha256(bytes), + size: bytes.length, + mode: stat.mode & 0o777, + nodeVersion: process.version, + nodeExecutable: realpathSync(process.execPath) + }; +} + +function currentGeneratorMetadata(candidateProject) { + const path = realpathSync(fileURLToPath(import.meta.url)); + const expectedPath = realpathSync( + join(candidateProject, 'scripts/round13-ab-evidence.mjs')); + if (path !== expectedPath) fail('Receipt generation must use the candidate generator'); + return trackedToolMetadata(path); +} + +function exactToolingDisclosure(bindings, candidateProject) { + const importerAndReceiptGenerator = currentGeneratorMetadata(candidateProject); + compare('current importer and receipt generator', + importerAndReceiptGenerator, bindings.importer); + const round12NbaEvidence = fileEntry( + candidateProject, ROUND12_NBA_EVIDENCE_PATH, true); + compare('current Round12NbaEvidence', + round12NbaEvidence, bindings.candidate.round12NbaEvidence); + return { + marker: NO_POSTFLIGHT_TOOLING_CHANGES_MARKER, + reason: NO_POSTFLIGHT_TOOLING_CHANGES_REASON, + postflightToolingChanges: false, + importerAndReceiptGenerator, + publishedDependencyResolver: trackedToolMetadata( + join(candidateProject, PUBLISHED_RESOLVER)), + round12NbaEvidence + }; +} + +function validateToolingDisclosure(disclosure, bindings, candidateProject) { + if (disclosure?.marker !== NO_POSTFLIGHT_TOOLING_CHANGES_MARKER + || disclosure.reason !== NO_POSTFLIGHT_TOOLING_CHANGES_REASON + || disclosure.postflightToolingChanges !== false) { + fail('No-postflight-tooling-changes disclosure differs'); + } + const current = exactToolingDisclosure(bindings, candidateProject); + compare('frozen tooling disclosure', disclosure, current); + return current; +} + +function toolingDisclosureSummary(disclosure) { + return { + marker: disclosure.marker, + reason: disclosure.reason, + postflightToolingChanges: disclosure.postflightToolingChanges, + importerSha256: disclosure.importerAndReceiptGenerator.sha256, + receiptGeneratorPath: disclosure.importerAndReceiptGenerator.path, + receiptGeneratorSha256: disclosure.importerAndReceiptGenerator.sha256, + publishedDependencyResolver: disclosure.publishedDependencyResolver, + round12NbaEvidence: disclosure.round12NbaEvidence + }; +} + +function verifyCurrentManifest(label, root, predicate, expected) { + validateStoredManifest(label, expected); + compare(label, manifestFromFilter(root, predicate, expected.includeMode), expected); +} + +function isAncestor(project, commit) { + const result = spawnSync('git', ['-C', project, 'merge-base', '--is-ancestor', commit, 'HEAD']); + return result.status === 0; +} + +function verifyCurrentBindings(bindings, candidateOverride, toolingDisclosure) { + if (bindings.integrityMode !== 'FULL_CONTENT_MANIFESTS_AND_OBSERVED_COMPLETION_LEDGER' + || bindings.samplesPerVariant !== 30 || bindings.warmups !== 3 + || bindings.baseline.archiveSha256 !== BASELINE_HASH + || bindings.runner.dependencyMode !== 'published-artifact') { + fail('Binding profile differs'); + } + const candidate = realpathSync(candidateOverride); + if (candidate !== bindings.candidate.projectPath) fail('Candidate project path differs'); + validateToolingDisclosure(toolingDisclosure, bindings, candidate); + if (sha256(readFileSync(bindings.runner.path)) !== bindings.runner.sha256 + || sha256(readFileSync(bindings.importer.path)) !== bindings.importer.sha256 + || process.version !== bindings.importer.nodeVersion + || realpathSync(process.execPath) !== bindings.importer.nodeExecutable) { + fail('Current runner/importer/Node runtime differs from campaign'); + } + const resolver = trackedToolMetadata(join(candidate, PUBLISHED_RESOLVER)); + compare('current published dependency resolver', resolver, + bindings.publishedDependencies.resolver); + if (sha256(readFileSync(bindings.baseline.archivePath)) !== BASELINE_HASH) { + fail('Current Archive.zip differs'); + } + validateStoredManifest( + 'archive tree', bindings.baseline.archiveManifest, localePathCompare); + compare('current archive tree', archiveManifest(bindings.baseline.archivePath), + bindings.baseline.archiveManifest); + validateStoredManifest('baseline project tree', bindings.baseline.projectManifest); + compare('baseline difference allowlist', + Object.fromEntries(bindings.baseline.differences.map(row => [row.path, row.kind])), + BASELINE_ALLOWED_DIFFERENCES); + compare('baseline pinned post-shim hashes', + Object.fromEntries(bindings.baseline.differences.map( + row => [row.path, row.projectSha256])), + BASELINE_EXPECTED_SHIM_SHA256); + const currentMain = mainSourceManifest(candidate); + compare('candidate main-source manifest', currentMain, bindings.candidate.mainSourceManifest); + verifyCurrentManifest('candidate execution surface', candidate, + isCandidateExecutionPath, bindings.candidate.executionSurfaceManifest); + verifyCurrentManifest('candidate harness surface', candidate, + isHarnessPath, bindings.candidate.harnessSurfaceManifest); + if (!isAncestor(candidate, bindings.candidate.implementationHead)) { + fail('Tested implementation commit is not an ancestor of candidate HEAD'); + } + if (existsSync(bindings.baseline.projectPath)) { + compare('current baseline tree', + manifestFromPaths(bindings.baseline.projectPath, + walkFiles(bindings.baseline.projectPath), false), + bindings.baseline.projectManifest); + } + const runnerBinding = parseRunner(bindings.runner.path); + const currentCandidatePublished = publishedDependencyManifest( + candidate, runnerBinding.javaHome, resolver.path); + compare('current candidate published dependencies', currentCandidatePublished, + bindings.publishedDependencies.candidate); + if (existsSync(bindings.baseline.projectPath)) { + const currentBaselinePublished = publishedDependencyManifest( + bindings.baseline.projectPath, runnerBinding.javaHome, resolver.path); + compare('current baseline published dependencies', currentBaselinePublished, + bindings.publishedDependencies.baseline); + } + compare('required published dependency coordinates', + bindings.publishedDependencies.requiredCoordinates, + REQUIRED_PUBLISHED_COORDINATES); + if (bindings.publishedDependencies.sameResolution !== true + || bindings.publishedDependencies.bindingSha256 + !== sha256(canonicalJson(bindings.publishedDependencies.candidate))) { + fail('Published dependency binding differs'); + } + compare('baseline/candidate published dependencies', + bindings.publishedDependencies.baseline, + bindings.publishedDependencies.candidate); + const java = javaPreflight(runnerBinding.javaHome); + compare('current Java preflight identity', + java.identity, bindings.runtimePreflight.identity); + compare('current host identity', hostIdentity(), bindings.hostIdentity); + for (const manifest of [ + bindings.candidate.executionSurfaceManifest, + bindings.candidate.harnessSurfaceManifest + ]) validateStoredManifest('execution surface', manifest); + if (bindingHash(bindings.fixture.candidate) !== bindings.fixture.bindingSha256 + || bindingHash(bindings.locks.candidate) !== bindings.locks.bindingSha256 + || bindingHash(bindings.wrapper.candidate) !== bindings.wrapper.bindingSha256) { + fail('Stored fixture/lock/wrapper binding differs'); + } +} + +function rowsFromCampaign(records, rawRoot) { + const variants = { baseline: [], candidate: [] }; + for (const record of records) { + const raw = readFileSync(join(rawRoot, record.rawPath)); + const sample = JSON.parse(raw); + variants[record.variant].push({ + pair: record.pair, + ordinal: record.ordinal, + startedAt: record.startedAt, + endedAt: record.endedAt, + rawSha256: record.rawSha256, + canonicalSha256: record.canonicalSha256, + rawBase64: raw.toString('base64'), + sample + }); + } + for (const variant of Object.keys(variants)) { + variants[variant].sort((a, b) => a.pair - b.pair); + } + return variants; +} + +function decodeIntegrity(provenance) { + const integrity = provenance.integrity; + if (integrity?.mode !== 'FULL_CONTENT_MANIFESTS_AND_OBSERVED_COMPLETION_LEDGER') { + fail('Campaign integrity mode differs'); + } + for (const name of ['preflightBase64', 'completionLedgerBase64', 'postflightBase64']) { + if (typeof integrity[name] !== 'string' || !integrity[name]) { + fail(`Campaign integrity lacks ${name}`); + } + } + const bytes = { + preflightBytes: Buffer.from(integrity.preflightBase64, 'base64'), + ledgerBytes: Buffer.from(integrity.completionLedgerBase64, 'base64'), + postflightBytes: Buffer.from(integrity.postflightBase64, 'base64') + }; + if (integrity.preflightSha256 !== sha256(bytes.preflightBytes) + || integrity.completionLedgerSha256 !== sha256(bytes.ledgerBytes) + || integrity.postflightSha256 !== sha256(bytes.postflightBytes)) { + fail('Embedded campaign byte hashes differ'); + } + return bytes; +} + +function validateCanonical(runtime, provenance, candidateProject, verifyBindings = true) { + if (runtime.schemaId !== RUNTIME_SCHEMA || provenance.schemaId !== PROVENANCE_SCHEMA) { + fail('Canonical schema ID differs'); + } + if (runtime.comparison !== 'SAME_MACHINE_INTERLEAVED_AB' + || provenance.comparison !== 'SAME_MACHINE_INTERLEAVED_AB' + || runtime.warmups !== 3 || provenance.warmups !== 3 + || runtime.samplesPerVariant !== 30 || provenance.samplesPerVariant !== 30) { + fail('Campaign shape differs'); + } + const bytes = decodeIntegrity(provenance); + const preflight = JSON.parse(bytes.preflightBytes); + const postflight = JSON.parse(bytes.postflightBytes); + validateEnvelope(preflight, PREFLIGHT_SCHEMA, 'embedded preflight'); + validateEnvelope(postflight, POSTFLIGHT_SCHEMA, 'embedded postflight'); + const ledger = parseLedgerBytes(bytes.ledgerBytes, 'embedded completion ledger', true); + if (preflight.campaignId !== runtime.campaignId + || runtime.campaignId !== provenance.campaignId + || postflight.campaignId !== runtime.campaignId + || postflight.preflightSha256 !== sha256(bytes.preflightBytes) + || postflight.completionLedgerSha256 !== sha256(bytes.ledgerBytes) + || postflight.completedRows !== 60 + || preflight.bindingsSha256 !== postflight.bindingsSha256 + || provenance.integrity.bindingsSha256 !== preflight.bindingsSha256 + || provenance.integrity.importerSha256 !== preflight.bindings.importer.sha256 + || provenance.integrity.receiptGeneratorSha256 + !== provenance.toolingDisclosure?.importerAndReceiptGenerator?.sha256 + || postflight.finalLedgerEntrySha256 !== ledger.at(-1).entrySha256) { + fail('Embedded campaign chain differs'); + } + compare('embedded preflight/postflight bindings', preflight.bindings, postflight.bindings); + compare('published dependency provenance', provenance.publishedDependencies, + preflight.bindings.publishedDependencies); + if (preflight.bindings.runner.dependencyMode !== 'published-artifact' + || preflight.bindings.publishedDependencies.sameResolution !== true) { + fail('Published dependency provenance differs'); + } + if (verifyBindings) verifyCurrentBindings( + preflight.bindings, candidateProject, provenance.toolingDisclosure); + compare('runtime tooling disclosure', runtime.toolingDisclosure, + toolingDisclosureSummary(provenance.toolingDisclosure)); + if (provenance.baseline.archiveSha256 !== BASELINE_HASH) { + fail('Baseline archive binding differs'); + } + compare('baseline unavailable counters', provenance.baselineUnavailableCounters, + CANDIDATE_ONLY_ZERO_COUNTERS); + if (provenance.runtime.javaMajor !== 17 || provenance.runtime.sameRuntime !== true + || provenance.gradle.sameWrapper !== true || provenance.locks.sameLocks !== true + || provenance.fixture.sameFixture !== true + || provenance.harness.sampleSchema !== SAMPLE_SCHEMA + || provenance.harness.helperCampaignSchema !== HELPER_CAMPAIGN_SCHEMA + || provenance.baseline.productionSourceFilesChanged !== false + || provenance.baseline.archiveOmittedCzToml !== true + || provenance.baseline.czTomlShimLines !== 4 + || provenance.baseline.applicationPathEvidence + !== 'READ_ONLY_COMPLETED_CATCH_UP_PROJECTION' + || provenance.candidate.applicationPathEvidence + !== 'COMMITTED_OCCURRENCE_CAUSE') fail('Runtime/fixture baseline provenance differs'); + validateRuntimeIdentity(provenance.runtime.identity, 'provenance runtime'); + const allEntryBlueIds = new Set(); + let commonRuntime; + const runtimeRowsByOrdinal = new Map(); + for (const variant of ['baseline', 'candidate']) { + const rows = runtime.variants?.[variant]?.rawSamples; + if (!Array.isArray(rows) || rows.length !== 30) fail(`${variant}: need 30 rows`); + rows.forEach((row, index) => { + if (row.pair !== index + 1 || row.ordinal < 1 || row.ordinal > 60 + || typeof row.rawBase64 !== 'string') fail(`${variant}: row shape differs`); + const raw = Buffer.from(row.rawBase64, 'base64'); + if (sha256(raw) !== row.rawSha256) fail(`${variant}/${row.pair}: raw hash differs`); + const decoded = JSON.parse(raw); + compare(`${variant}/${row.pair}: raw sample`, decoded, row.sample); + validateSample(row.sample, variant, `${variant}/${row.pair}`); + if (row.canonicalSha256 !== sha256(canonicalJson(row.sample))) { + fail(`${variant}/${row.pair}: canonical hash differs`); + } + allEntryBlueIds.add(row.sample.entryBlueId); + if (commonRuntime === undefined) commonRuntime = row.sample.runtime; + else compare(`${variant}/${row.pair}: runtime identity`, row.sample.runtime, commonRuntime); + runtimeRowsByOrdinal.set(row.ordinal, { variant, row }); + }); + compare(`${variant} distributions`, runtime.variants[variant].distributions, + distributions(rows)); + } + if (allEntryBlueIds.size !== 1 || runtimeRowsByOrdinal.size !== 60) { + fail('Campaign rows must share one entryBlueId and 60 unique ordinals'); + } + compare('runtime/provenance identity', commonRuntime, provenance.runtime.identity); + for (const record of ledger) { + const bound = runtimeRowsByOrdinal.get(record.ordinal); + if (record.campaignId !== preflight.campaignId + || record.preflightSha256 !== sha256(bytes.preflightBytes) + || record.runnerSha256 !== preflight.bindings.runner.sha256 + || record.importerSha256 !== preflight.bindings.importer.sha256 + || !bound || bound.variant !== record.variant || bound.row.pair !== record.pair + || bound.row.rawSha256 !== record.rawSha256 + || bound.row.canonicalSha256 !== record.canonicalSha256 + || bound.row.startedAt !== record.startedAt || bound.row.endedAt !== record.endedAt + || bound.row.sample.entryBlueId !== record.entryBlueId) { + fail(`ledger/runtime row ${record.ordinal} differs`); + } + } + compare('runtime top-level identity', runtime.runtimeIdentity, commonRuntime); + compare('observed sample sequence', provenance.rawSampleSequence, + ledger.map(record => ({ + ordinal: record.ordinal, + pair: record.pair, + variant: record.variant, + startedAt: record.startedAt, + endedAt: record.endedAt, + rawPath: record.rawPath, + rawSha256: record.rawSha256, + canonicalSha256: record.canonicalSha256, + entrySha256: record.entrySha256 + }))); + compare('candidate decision', runtime.candidateDecision, + decision(runtime.variants.candidate.distributions)); + const main = mainSourceManifest(candidateProject); + if (provenance.candidate.mainSourceManifestSha256 !== main.sha256 + || provenance.candidate.productionFiles !== main.files) { + fail('Candidate main-source manifest is stale'); + } + return runtime.candidateDecision.overallStatus; +} + +function renderMarkdown(runtime) { + const tooling = runtime.toolingDisclosure; + const lines = [ + '# Round 13 five-occurrence same-machine A/B', '', + `> **${tooling.marker}:** ${tooling.reason}`, '>', + '> Postflight tooling changes: **no**. The campaign importer and receipt ' + + `generator are the same frozen file: \`${tooling.importerSha256}\`. ` + + `Published dependency resolver: \`${tooling.publishedDependencyResolver.sha256}\`. ` + + `Current Round12NbaEvidence: \`${tooling.round12NbaEvidence.sha256}\` ` + + `(${tooling.round12NbaEvidence.size} bytes, mode ` + + `0${tooling.round12NbaEvidence.mode.toString(8)}).`, '', + `Schema: \`${RUNTIME_SCHEMA}\`.`, '', + `Campaign: \`${runtime.campaignId}\`. Entry Blue ID: \`${runtime.entryBlueId}\`.`, '', + 'Warmups: 3. Samples: 30 baseline + 30 candidate. Observed order: odd A/B, even B/A.', '', + '| Variant | Span | p50 ms | p95 ms | max ms |', + '| --- | --- | ---: | ---: | ---: |' + ]; + for (const variant of ['baseline', 'candidate']) { + for (const metric of METRICS) { + const value = runtime.variants[variant].distributions[metric]; + lines.push(`| ${variant} | ${metric} | ${(value.p50Nanos / 1e6).toFixed(6)} | ${(value.p95Nanos / 1e6).toFixed(6)} | ${(value.maximumNanos / 1e6).toFixed(6)} |`); + } + } + lines.push('', '## Structural counts', '', + '| Count | Baseline (every row) | Candidate (every row) |', + '| --- | ---: | ---: |'); + for (const [name, value] of Object.entries(FIXED_COUNTS)) { + lines.push(`| ${name} | ${value} | ${value} |`); + } + lines.push('', '## Forbidden-work counters', '', + '| Counter | Baseline (every row) | Candidate (every row) |', + '| --- | ---: | ---: |'); + for (const name of COMMON_ZERO_COUNTERS) lines.push(`| ${name} | 0 | 0 |`); + for (const name of CANDIDATE_ONLY_ZERO_COUNTERS) { + lines.push(`| ${name} | unavailable in Archive.zip | 0 |`); + } + lines.push('', '## Candidate gates', '', + '| Candidate gate | Observed p95 ms | Preferred | Hard |', + '| --- | ---: | --- | --- |'); + for (const [name, gate] of Object.entries(runtime.candidateDecision.gates)) { + lines.push(`| ${name} | ${(gate.observedCandidateNanos / 1e6).toFixed(6)} | ${gate.preferredStatus} | ${gate.hardStatus} |`); + } + lines.push('', `Overall: \`${runtime.candidateDecision.overallStatus}\`.`, ''); + return `${lines.join('\n')}\n`; +} + +function generate(args) { + const rawRoot = required(args, 'raw'); + const baselineProject = required(args, 'baseline'); + const candidateProject = required(args, 'candidate'); + const archive = required(args, 'archive'); + const runner = required(args, 'runner'); + const output = required(args, 'output'); + const preflightPath = join(rawRoot, 'preflight-bindings.json'); + const ledgerPath = join(rawRoot, 'completion-ledger.jsonl'); + const postflightPath = join(rawRoot, 'postflight-bindings.json'); + for (const file of [preflightPath, ledgerPath, postflightPath]) { + if (!existsSync(file)) fail(`Campaign receipt is missing: ${file}`); + } + const preflightBytes = readFileSync(preflightPath); + const ledgerBytes = readFileSync(ledgerPath); + const postflightBytes = readFileSync(postflightPath); + const campaign = validateCampaignBundle( + preflightBytes, ledgerBytes, postflightBytes, rawRoot); + const bindings = campaign.preflight.bindings; + if (realpathSync(baselineProject) !== bindings.baseline.projectPath + || realpathSync(candidateProject) !== bindings.candidate.projectPath + || realpathSync(archive) !== bindings.baseline.archivePath + || realpathSync(runner) !== bindings.runner.path) fail('Importer paths differ from preflight'); + const toolingDisclosure = exactToolingDisclosure(bindings, candidateProject); + verifyCurrentBindings(bindings, candidateProject, toolingDisclosure); + const variantRows = rowsFromCampaign(campaign.records, rawRoot); + const variants = Object.fromEntries(['baseline', 'candidate'].map(variant => [ + variant, + { + rawSamples: variantRows[variant], + distributions: distributions(variantRows[variant]) + } + ])); + const generatedAt = new Date().toISOString(); + const runtime = { + schemaId: RUNTIME_SCHEMA, + generatedAt, + campaignId: campaign.preflight.campaignId, + comparison: 'SAME_MACHINE_INTERLEAVED_AB', + warmups: 3, + samplesPerVariant: 30, + entryBlueId: campaign.records[0].entryBlueId, + runtimeIdentity: campaign.runtime, + toolingDisclosure: toolingDisclosureSummary(toolingDisclosure), + variants, + candidateDecision: decision(variants.candidate.distributions) + }; + const wrapperPath = 'gradle/wrapper/gradle-wrapper.properties'; + const candidateStatus = gitOutput( + candidateProject, 'status', '--porcelain', '--untracked-files=normal'); + const provenance = { + schemaId: PROVENANCE_SCHEMA, + generatedAt, + campaignId: campaign.preflight.campaignId, + comparison: 'SAME_MACHINE_INTERLEAVED_AB', + warmups: 3, + samplesPerVariant: 30, + baselineUnavailableCounters: CANDIDATE_ONLY_ZERO_COUNTERS, + toolingDisclosure, + integrity: { + mode: 'FULL_CONTENT_MANIFESTS_AND_OBSERVED_COMPLETION_LEDGER', + preflightBase64: preflightBytes.toString('base64'), + completionLedgerBase64: ledgerBytes.toString('base64'), + postflightBase64: postflightBytes.toString('base64'), + preflightSha256: sha256(preflightBytes), + completionLedgerSha256: sha256(ledgerBytes), + postflightSha256: sha256(postflightBytes), + bindingsSha256: campaign.preflight.bindingsSha256, + importerSha256: bindings.importer.sha256, + receiptGeneratorSha256: + toolingDisclosure.importerAndReceiptGenerator.sha256 + }, + runner: bindings.runner, + runtime: { + javaMajor: 17, + javaHome: bindings.runtimePreflight.identity.javaHome, + identity: campaign.runtime, + preflight: bindings.runtimePreflight, + bindingSha256: sha256(canonicalJson(campaign.runtime)), + sameRuntime: true + }, + gradle: { + distributionUrl: readFileSync(join(candidateProject, wrapperPath), 'utf8') + .split(/\r?\n/).find(line => line.startsWith('distributionUrl='))?.slice(16), + preflight: bindings.gradlePreflight, + baselineWrapperSha256: bindings.wrapper.baseline[0].sha256, + candidateWrapperSha256: bindings.wrapper.candidate[0].sha256, + sameWrapper: true + }, + harness: { + sampleSchema: SAMPLE_SCHEMA, + helperCampaignSchema: HELPER_CAMPAIGN_SCHEMA, + baselineHelperSha256: sha256(readFileSync(join(baselineProject, HARNESS_HELPER))), + candidateHelperSha256: sha256(readFileSync(join(candidateProject, HARNESS_HELPER))), + candidateSurfaceManifest: bindings.candidate.harnessSurfaceManifest, + baselineDifferences: [ + 'RETRY_COUNTERS_UNAVAILABLE_NOT_ZERO', + 'APPLICATION_PATH_FROM_READ_ONLY_CATCH_UP_PROJECTION' + ] + }, + locks: { ...bindings.locks, sameLocks: true }, + fixture: { ...bindings.fixture, sameFixture: true }, + publishedDependencies: bindings.publishedDependencies, + baseline: { + projectPath: bindings.baseline.projectPath, + archivePath: bindings.baseline.archivePath, + archiveSha256: BASELINE_HASH, + productionFiles: bindings.baseline.mainSourceManifest.files, + mainSourceManifestSha256: bindings.baseline.mainSourceManifest.sha256, + archiveTreeManifest: bindings.baseline.archiveManifest, + projectTreeManifest: bindings.baseline.projectManifest, + allowedHarnessDifferences: bindings.baseline.differences, + productionSourceFilesChanged: false, + archiveOmittedCzToml: true, + czTomlShimLines: 4, + buildShimLines: 4, + applicationPathEvidence: 'READ_ONLY_COMPLETED_CATCH_UP_PROJECTION' + }, + candidate: { + projectPath: bindings.candidate.projectPath, + implementationHead: bindings.candidate.implementationHead, + // Compatibility with the existing FINAL gate. Integrity uses manifests above. + worktreeStatusSha256: sha256(candidateStatus), + productionFiles: bindings.candidate.mainSourceManifest.files, + mainSourceManifestSha256: bindings.candidate.mainSourceManifest.sha256, + executionSurfaceManifest: bindings.candidate.executionSurfaceManifest, + applicationPathEvidence: 'COMMITTED_OCCURRENCE_CAUSE' + }, + rawSampleSequence: campaign.records.map(record => ({ + ordinal: record.ordinal, + pair: record.pair, + variant: record.variant, + startedAt: record.startedAt, + endedAt: record.endedAt, + rawPath: record.rawPath, + rawSha256: record.rawSha256, + canonicalSha256: record.canonicalSha256, + entrySha256: record.entrySha256 + })) + }; + validateCanonical(runtime, provenance, candidateProject); + mkdirSync(output, { recursive: true }); + const runtimePath = join(output, 'five-occurrence-runtime.json'); + const provenancePath = join(output, 'runtime-provenance.json'); + const markdownPath = join(output, 'five-occurrence-runtime.md'); + writeJson(runtimePath, runtime); + writeJson(provenancePath, provenance); + writeFileSync(markdownPath, renderMarkdown(runtime)); + console.log(`ROUND13_RUNTIME_JSON=${runtimePath}`); + console.log(`ROUND13_RUNTIME_MARKDOWN=${markdownPath}`); + console.log(`ROUND13_RUNTIME_PROVENANCE=${provenancePath}`); +} + +function verify(args) { + const candidateProject = required(args, 'candidate'); + const runtimePath = required(args, 'runtime'); + const provenancePath = required(args, 'provenance'); + const markdownPath = required(args, 'markdown'); + const runtime = readJson(runtimePath); + const provenance = readJson(provenancePath); + const status = validateCanonical(runtime, provenance, candidateProject); + const markdown = readFileSync(markdownPath, 'utf8'); + if (markdown !== renderMarkdown(runtime)) fail('Runtime Markdown differs from JSON'); + console.log(`ROUND13_AB_VERIFIED=${status}`); +} + +function selfTest(args) { + const candidateProject = required(args, 'candidate'); + const runner = required(args, 'runner'); + currentGeneratorMetadata(candidateProject); + const runnerBinding = parseRunner(runner); + const resolver = trackedToolMetadata(join(candidateProject, PUBLISHED_RESOLVER)); + const manifest = publishedDependencyManifest( + candidateProject, runnerBinding.javaHome, resolver.path); + console.log(`ROUND13_AB_PUBLISHED_TOOLING_VERIFIED=${sha256(canonicalJson(manifest))}`); +} + +try { + const args = parseArgs(process.argv.slice(2)); + if (args.verify) verify(args); + else if (args['self-test']) selfTest(args); + else if (args['capture-preflight']) capturePreflight(args); + else if (args['append-ledger']) appendLedger(args); + else if (args['capture-postflight']) capturePostflight(args); + else generate(args); +} catch (error) { + console.error(`Round 13 A/B evidence error: ${error.message}`); + process.exitCode = 1; +} diff --git a/scripts/round13-published-dependencies.gradle b/scripts/round13-published-dependencies.gradle new file mode 100644 index 0000000..6be2856 --- /dev/null +++ b/scripts/round13-published-dependencies.gradle @@ -0,0 +1,100 @@ +import groovy.json.JsonOutput +import java.security.MessageDigest +import org.gradle.api.artifacts.component.ModuleComponentIdentifier +import org.gradle.api.artifacts.component.ProjectComponentIdentifier + +/* + * Frozen Round 13 init script. It records the exact published modules and + * artifact bytes used by the scenario classpath without adding a project task + * to the historical baseline source tree. + */ +gradle.projectsEvaluated { + def project = gradle.rootProject + project.tasks.register('round13PublishedDependencyManifest') { + group = 'verification' + description = 'Prints the frozen Round 13 published dependency manifest.' + + doLast { + String dependencyMode = project.providers.gradleProperty( + 'blueDependencyMode').orNull + if (dependencyMode != 'published-artifact') { + throw new GradleException( + 'Round 13 dependency capture requires published-artifact mode') + } + def configuration = project.configurations.findByName( + 'scenarioTestRuntimeClasspath') + if (configuration == null) { + throw new GradleException( + 'scenarioTestRuntimeClasspath is unavailable') + } + + def resolution = configuration.incoming.resolutionResult + def foreignProjects = resolution.allComponents.findAll { component -> + component.id instanceof ProjectComponentIdentifier + && component.id != resolution.rootComponent.get().id + } + if (!foreignProjects.empty) { + throw new GradleException( + 'Published Round 13 classpath contains project/composite dependencies: ' + + foreignProjects.collect { it.id.displayName }) + } + + def components = resolution.allComponents + .findAll { it.id instanceof ModuleComponentIdentifier } + .collect { component -> + def id = component.id as ModuleComponentIdentifier + "${id.group}:${id.module}:${id.version}".toString() + }.unique().sort() + def hash = { File file -> + MessageDigest digest = MessageDigest.getInstance('SHA-256') + file.withInputStream { input -> + byte[] buffer = new byte[8192] + int read + while ((read = input.read(buffer)) != -1) { + digest.update(buffer, 0, read) + } + } + digest.digest().encodeHex().toString() + } + def artifacts = configuration.incoming.artifacts.artifacts.collect { + artifact -> + if (artifact.id.componentIdentifier + == resolution.rootComponent.get().id) { + return null + } + if (!(artifact.id.componentIdentifier + instanceof ModuleComponentIdentifier)) { + String buildRoot = project.layout.buildDirectory.get() + .asFile.canonicalPath + File.separator + if (artifact.file.canonicalPath.startsWith(buildRoot)) { + return null + } + throw new GradleException( + 'Published Round 13 classpath contains an external ' + + 'non-module artifact: ' + artifact.id.displayName) + } + def id = artifact.id.componentIdentifier as ModuleComponentIdentifier + [ + component: "${id.group}:${id.module}:${id.version}".toString(), + fileName: artifact.file.name, + size: artifact.file.length(), + sha256: hash(artifact.file) + ] + }.findAll { it != null }.sort { left, right -> + (left.component <=> right.component) + ?: (left.fileName <=> right.fileName) + ?: (left.sha256 <=> right.sha256) + } + def manifest = [ + schemaId: 'blue-coordination-round13-published-dependencies-v1', + dependencyMode: dependencyMode, + configuration: configuration.name, + components: components, + artifacts: artifacts + ] + String encoded = Base64.encoder.encodeToString( + JsonOutput.toJson(manifest).getBytes('UTF-8')) + println "ROUND13_PUBLISHED_DEPENDENCIES_BASE64=${encoded}" + } + } +} diff --git a/scripts/run-round13-same-machine-ab.sh b/scripts/run-round13-same-machine-ab.sh new file mode 100755 index 0000000..bef12cf --- /dev/null +++ b/scripts/run-round13-same-machine-ab.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ $# -ne 4 ]]; then + echo "usage: $0 BASELINE_PROJECT CANDIDATE_PROJECT ARCHIVE_ZIP EMPTY_OUTPUT_DIR" >&2 + exit 2 +fi + +baseline=$(cd "$1" && pwd -P) +candidate=$(cd "$2" && pwd -P) +archive=$(cd "$(dirname "$3")" && pwd -P)/$(basename "$3") +output=$4 +runner=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/$(basename "${BASH_SOURCE[0]}") +importer="$candidate/scripts/round13-ab-evidence.mjs" +samples=30 +warmups=3 + +if [[ ! -f "$archive" || ! -f "$importer" ]]; then + echo "archive or importer is missing" >&2 + exit 2 +fi +if [[ -e "$output" ]]; then + if [[ ! -d "$output" || -n "$(ls -A "$output")" ]]; then + echo "output must be a unique nonexistent or empty directory: $output" >&2 + exit 2 + fi +else + mkdir -p "$output" +fi +output=$(cd "$output" && pwd -P) +mkdir "$output/baseline" "$output/candidate" + +export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home +campaign_id=$(node -e 'console.log(require("node:crypto").randomUUID())') +preflight="$output/preflight-bindings.json" +ledger="$output/completion-ledger.jsonl" +postflight="$output/postflight-bindings.json" + +node "$importer" --capture-preflight \ + --raw "$output" \ + --baseline "$baseline" \ + --candidate "$candidate" \ + --archive "$archive" \ + --runner "$runner" \ + --campaign-id "$campaign_id" \ + --samples "$samples" \ + --warmups "$warmups" \ + --output "$preflight" + +run_one() { + local project=$1 + local variant=$2 + local pair=$3 + local ordinal=$4 + local raw="$output/$variant/$pair.json" + local started_at + local ended_at + started_at=$(node -e 'console.log(new Date().toISOString())') + ( + cd "$project" + ./gradlew round13PlaygroundSample --rerun-tasks --console=plain --quiet \ + -PtestJavaVersion=17 \ + -PblueDependencyMode=published-artifact \ + -Dblue.coordination.round13.warmups="$warmups" \ + -Dblue.coordination.round13.sample="$raw" + ) + ended_at=$(node -e 'console.log(new Date().toISOString())') + node "$importer" --append-ledger \ + --preflight "$preflight" \ + --ledger "$ledger" \ + --raw-sample "$raw" \ + --campaign-id "$campaign_id" \ + --ordinal "$ordinal" \ + --pair "$pair" \ + --variant "$variant" \ + --started-at "$started_at" \ + --ended-at "$ended_at" \ + --runner "$runner" +} + +ordinal=0 +for ((pair=1; pair<=samples; pair++)); do + if (( pair % 2 == 1 )); then + ordinal=$((ordinal + 1)); run_one "$baseline" baseline "$pair" "$ordinal" + ordinal=$((ordinal + 1)); run_one "$candidate" candidate "$pair" "$ordinal" + else + ordinal=$((ordinal + 1)); run_one "$candidate" candidate "$pair" "$ordinal" + ordinal=$((ordinal + 1)); run_one "$baseline" baseline "$pair" "$ordinal" + fi +done + +node "$importer" --capture-postflight \ + --raw "$output" \ + --baseline "$baseline" \ + --candidate "$candidate" \ + --archive "$archive" \ + --runner "$runner" \ + --campaign-id "$campaign_id" \ + --preflight "$preflight" \ + --ledger "$ledger" \ + --output "$postflight" + +echo "ROUND13_AB_CAMPAIGN=$campaign_id" +echo "ROUND13_AB_RAW=$output" diff --git a/settings.gradle b/settings.gradle index 58270ff..cecc5b8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,15 +1,42 @@ -plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + } } rootProject.name = 'blue-coordination-java' -def localBlueRepository = file('../blue-repository-java') -if (providers.gradleProperty('useLocalBlueRepository').map { it.toBoolean() }.getOrElse(false) - && localBlueRepository.isDirectory()) { - includeBuild(localBlueRepository) { - dependencySubstitution { - substitute module('blue.repo:blue-repo-java') using project(':') +def dependencyMode = providers.gradleProperty('blueDependencyMode') + .getOrElse('published-artifact') + .trim() +if (!(dependencyMode in ['local-composite', 'published-artifact'])) { + throw new GradleException( + 'blueDependencyMode must be local-composite or published-artifact') +} + +if (dependencyMode == 'local-composite') { + def localBex = file(providers.gradleProperty('blueBexCompositePath') + .getOrElse('../blue-bex-java')) + if (localBex.isDirectory()) { + includeBuild(localBex) { + dependencySubstitution { + substitute(module('blue.bex:blue-bex-core')) + .using(project(':blue-bex-core')) + substitute(module('blue.bex:blue-bex-contracts')) + .using(project(':blue-bex-contracts')) + } + } + } + def localRepository = file(providers.gradleProperty( + 'blueRepositoryCompositePath') + .getOrElse('../blue-repository-java')) + if (localRepository.isDirectory()) { + includeBuild(localRepository) { + dependencySubstitution { + substitute(module('blue.repo:blue-repo-java')) + .using(project(':')) + } } } } diff --git a/src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java b/src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java new file mode 100644 index 0000000..ac872af --- /dev/null +++ b/src/consumerTest/java/blue/coordination/consumer/PublishedArtifactConsumerTest.java @@ -0,0 +1,370 @@ +package blue.coordination.consumer; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationMetrics; +import blue.coordination.api.DocumentId; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Public-API-only smoke scenarios resolved from the published Maven artifact. */ +final class PublishedArtifactConsumerTest { + private static final long T0 = 1_700_000_000_000_000L; + + @Test + void counterExternalApiExample() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + "examples/clean-counter/alice", "alice"); + Timeline bob = engine.registerTimeline( + "examples/clean-counter/bob", "bob"); + DocumentId counter = DocumentId.of("counter"); + engine.startDocument( + counter, resource("examples/clean/counter.yaml")); + engine.append(alice, Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + engine.append(bob, Operation.yaml( + "decrement", "bobChannel", "amount: 1")); + var first = engine.drain( + new CoordinationEngine.DrainBudget(1L, 1L)); + assertTrue(first.paused()); + assertEquals(1L, first.committedProcessTransitions()); + var second = engine.drain( + new CoordinationEngine.DrainBudget(1L, 1L)); + assertTrue(second.quiescent()); + assertEquals(1L, second.committedProcessTransitions()); + assertEquals(engine.document(counter).blueId(), + engine.auditDocument(counter).blueId()); + assertEquals(2L, integer(engine, counter, "/counter")); + } + } + + @Test + void largeOrdinaryRequestAppendsWholeWithoutTarget() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline unmatched = engine.registerTimeline( + "consumer/unmatched", "consumer"); + ExactValue payNote = engine.exactValue( + resource("examples/clean/large-paynote.yaml")); + ExactValue request = engine.referenceRequest("payload", payNote); + var entry = engine.append( + unmatched, + Operation.exact("store", "unmatchedChannel", request)); + assertEquals(0, engine.routeTargetCount(entry)); + assertEquals(1, engine.metrics().journalEntryCount()); + assertEquals(0L, engine.metrics().counter( + CoordinationMetrics.Counter.REQUEST_FRAGMENTS)); + assertEquals(0L, engine.metrics().counter( + CoordinationMetrics.Counter.TIMELINE_ENTRY_FRAGMENTS)); + } + } + + @Test + void largeHostCanAttachAuthorizeAndConfirmPayNote() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + "examples/large-order/alice", "alice"); + Timeline admin = engine.registerTimeline( + "examples/order/myos-admin", "myos-admin"); + Timeline restaurant = engine.registerTimeline( + "examples/order/david", "david"); + DocumentId host = DocumentId.of("large-order-host"); + DocumentId payNote = DocumentId.of("large-paynote"); + String payNoteYaml = resource( + "examples/clean/large-paynote.yaml"); + engine.startDocument( + host, resource("examples/clean/large-order-host.yaml")); + appendAndDrain(engine, + alice, + Operation.exact( + "attachPayNote", + "ownerChannel", + engine.referenceRequest( + "document", + engine.exactValue(payNoteYaml)))); + appendAndDrain(engine, + admin, + Operation.yaml( + "authorizeAmount", + "guarantorChannel", + "authorizationId: CONSUMER-1\n" + + "amountMinor: 65000\n" + + "currency: PLN")); + appendAndDrain(engine, + admin, + Operation.yaml( + "authorizeAmount", + "guarantorChannel", + "authorizationId: CONSUMER-2\n" + + "amountMinor: 65000\n" + + "currency: PLN")); + appendAndDrain(engine, + restaurant, + Operation.yaml( + "confirmProduct", + "providerChannel", + "confirmationReference: CONSUMER-DINNER")); + + assertEquals("Authorized", text( + engine, payNote, "/authorization/state")); + assertEquals("Authorized", text( + engine, host, "/payNote/authorization/state")); + assertEquals(Boolean.TRUE, engine.document(host).valueAt( + "/payNote/productConditions/restaurant/product/confirmed") + .copyNode().getValue()); + assertEquals(2, engine.document(host).physicalObjectCount()); + } + } + + @Test + void existingSharedChildAdvancesTwoParents() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + String childYaml = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.registerTimeline( + "examples/embedded/A", "alice"); + Timeline firstTimeline = engine.registerTimeline( + "examples/embedded/parent-one", "bob-one"); + Timeline secondTimeline = engine.registerTimeline( + "examples/embedded/parent-two", "bob-two"); + DocumentId child = DocumentId.of("embedded-counter-A"); + DocumentId first = DocumentId.of("embedded-parent-one"); + DocumentId second = DocumentId.of("embedded-parent-two"); + engine.startDocument(child, childYaml); + appendAndDrain(engine, childTimeline, Operation.yaml( + "increment", "ownerChannel", "amount: 2")); + engine.startDocument(first, parentDefinition( + "embedded-parent-one", + "examples/embedded/parent-one", + "bob-one")); + engine.startDocument(second, parentDefinition( + "embedded-parent-two", + "examples/embedded/parent-two", + "bob-two")); + ExactValue childReference = engine.referenceRequest( + "document", engine.exactValue(childYaml)); + appendAndDrain(engine, firstTimeline, Operation.exact( + "attachChild", "ownerChannel", childReference)); + appendAndDrain(engine, secondTimeline, Operation.exact( + "attachChild", "ownerChannel", childReference)); + appendAndDrain(engine, childTimeline, Operation.yaml( + "increment", "ownerChannel", "amount: 5")); + + assertEquals(7L, integer(engine, child, "/counter")); + assertEquals(7L, integer(engine, first, "/child/counter")); + assertEquals(7L, integer(engine, second, "/child/counter")); + } + } + + @Test + void nbaHistoricalGameCatchesStatisticsUp() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + String gameYaml = resource("examples/clean/nba-game.yaml"); + Timeline gameFeed = engine.registerTimeline( + "examples/nba/game-2016-lal-min", "nba-feed"); + Timeline commissioner = engine.registerTimeline( + "examples/nba/statistics", "commissioner"); + DocumentId game = DocumentId.of("nba-game-2016-lal-min"); + DocumentId statistics = DocumentId.of("nba-statistics"); + engine.startDocument(game, gameYaml); + dispatch(engine, gameFeed, T0 + 100, "startGame", "{}"); + dispatch(engine, gameFeed, T0 + 200, "homeScores", "points: 2"); + dispatch(engine, gameFeed, T0 + 300, "awayScores", "points: 3"); + dispatch(engine, gameFeed, T0 + 400, "endGame", "{}"); + int gameRevisions = engine.history(game).size(); + engine.startDocument( + statistics, + resource("examples/clean/nba-statistics.yaml")); + appendAndDrain(engine, + commissioner, + Operation.exact( + "attachGame", + "commissionerChannel", + engine.referenceRequest( + "document", engine.exactValue(gameYaml)))); + + assertEquals("Final", text( + engine, statistics, "/observedStatus")); + assertEquals(2L, integer( + engine, statistics, "/observedHomeScore")); + assertEquals(3L, integer( + engine, statistics, "/observedAwayScore")); + assertEquals(gameRevisions, engine.history(game).size()); + assertTrue(engine.effectiveTimelineIds(statistics).contains( + "examples/nba/game-2016-lal-min")); + } + } + + @Test + void fiveEmbeddedOccurrencesReuseThreeManagedDocuments() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline owner = engine.registerTimeline( + "examples/playground/five-occurrence/host", + "playground-owner"); + engine.registerTimeline( + "examples/playground/five-occurrence/alpha", + "playground-feed-alpha"); + engine.registerTimeline( + "examples/playground/five-occurrence/beta", + "playground-feed-beta"); + engine.registerTimeline( + "examples/playground/five-occurrence/gamma", + "playground-feed-gamma"); + DocumentId host = DocumentId.of( + "playground-five-occurrence-host"); + engine.startDocument(host, resource( + "examples/playground/five-occurrence-initialization-host.yaml")); + + int wholeObjectsBeforeRequest = + engine.metrics().wholeObjectCount(); + ExactValue request = engine.exactValue( + fiveDocumentRequest(engine)); + assertEquals(4, + engine.metrics().wholeObjectCount() + - wholeObjectsBeforeRequest, + "three unique child bodies plus one whole request"); + appendAndDrain(engine, owner, Operation.exact( + "attachFiveDocuments", + "ownerChannel", + request)); + + assertEquals(4, engine.metrics().documentCount()); + assertEquals(5, engine.document(host).embeddedChildren().size()); + assertEquals(5L, integer( + engine, host, "/initializationEventCount")); + assertEquals(2L, integer( + engine, host, "/alphaInitializationEventCount")); + assertEquals(2L, integer( + engine, host, "/betaInitializationEventCount")); + assertEquals(1L, integer( + engine, host, "/gammaInitializationEventCount")); + assertEquals(1, engine.history( + DocumentId.of("playground-game-alpha")).size()); + assertEquals(1, engine.history( + DocumentId.of("playground-game-beta")).size()); + assertEquals(1, engine.history( + DocumentId.of("playground-game-gamma")).size()); + } + } + + private static String fiveDocumentRequest( + CoordinationEngine engine) throws IOException { + String template = resource( + "examples/round12/nba-lifecycle-game.yaml"); + ExactValue alpha = engine.exactValue(gameDefinition( + template, + "playground-game-alpha", + "examples/playground/five-occurrence/alpha", + "playground-feed-alpha")); + ExactValue beta = engine.exactValue(gameDefinition( + template, + "playground-game-beta", + "examples/playground/five-occurrence/beta", + "playground-feed-beta")); + ExactValue gamma = engine.exactValue(gameDefinition( + template, + "playground-game-gamma", + "examples/playground/five-occurrence/gamma", + "playground-feed-gamma")); + return "documents:\n" + + childReference("betaSecond", beta) + + childReference("alphaSecond", alpha) + + childReference("gamma", gamma) + + childReference("betaFirst", beta) + + childReference("alphaFirst", alpha); + } + + private static String childReference(String key, ExactValue value) { + return " " + key + ":\n" + + " blueId: " + value.blueId() + "\n"; + } + + private static String gameDefinition( + String template, + String documentId, + String timelineId, + String actorId) { + return template + .replace("documentId: nba-lifecycle-game", + "documentId: " + documentId) + .replace("timelineId: examples/round12/nba/game", + "timelineId: " + timelineId) + .replace("accountId: nba-feed", + "accountId: " + actorId); + } + + + private static void dispatch( + CoordinationEngine engine, + Timeline timeline, + long timestamp, + String operation, + String request) { + var entry = engine.appendAt( + timeline, + Operation.yaml(operation, "gameFeed", request), + timestamp); + engine.drainThrough(entry.sourceOrderKey()); + } + + private static void appendAndDrain( + CoordinationEngine engine, + Timeline timeline, + Operation operation) { + var entry = engine.append(timeline, operation); + engine.drainThrough(entry.sourceOrderKey()); + } + + private static String parentDefinition( + String documentId, + String timelineId, + String actorId) throws IOException { + return resource("examples/clean/embedded-state-parent.yaml") + .replace("documentId: embedded-state-parent", + "documentId: " + documentId) + .replace("coordination/internal/embedded-state-parent", + "coordination/internal/" + documentId) + .replace("timelineId: examples/embedded/state-parent", + "timelineId: " + timelineId) + .replace("accountId: bob", "accountId: " + actorId); + } + + private static long integer( + CoordinationEngine engine, + DocumentId document, + String pointer) { + Object value = engine.document(document).valueAt(pointer) + .copyNode().getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + return ((Number) value).longValue(); + } + + private static String text( + CoordinationEngine engine, + DocumentId document, + String pointer) { + return (String) engine.document(document).valueAt(pointer) + .copyNode().getValue(); + } + + private static String resource(String path) throws IOException { + try (InputStream stream = PublishedArtifactConsumerTest.class + .getClassLoader().getResourceAsStream(path)) { + if (stream == null) { + throw new IOException("Missing resource " + path); + } + return new String(stream.readAllBytes(), StandardCharsets.UTF_8); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java b/src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java new file mode 100644 index 0000000..f334da0 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/AppendAdmissionAtomicityTest.java @@ -0,0 +1,73 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Timeline append commits journal coordinates and logical time together. */ +final class AppendAdmissionAtomicityTest { + @Test + void invalidEntryDoesNotConsumeClockSequenceOrPredecessor() { + try (TestEngine engine = TestEngine.create(); + TestEngine fresh = TestEngine.create()) { + var timeline = engine.timeline("atomic/alice", "alice"); + var freshTimeline = fresh.timeline("atomic/alice", "alice"); + long clockBefore = engine.logicalClockMicros(); + int objectsBefore = engine.wholeObjectCount(); + + assertThrows( + RuntimeException.class, + () -> engine.append( + timeline, + Operation.yaml( + "increment", "ownerChannel", "["))); + + assertEquals(0, engine.journalSize()); + assertEquals(clockBefore, engine.logicalClockMicros()); + assertEquals(objectsBefore, engine.wholeObjectCount()); + + var retry = engine.append( + timeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + var expected = fresh.append( + freshTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + + assertEquals(expected.timestampMicros(), retry.timestampMicros()); + assertEquals(expected.blueId(), retry.blueId()); + assertEquals(1L, retry.globalSequence()); + assertEquals(1L, retry.timelineSequence()); + assertEquals(1, engine.journalSize()); + } + } + + @Test + void invalidExplicitTimestampAppendDoesNotAdvanceClock() { + try (TestEngine engine = TestEngine.create()) { + var timeline = engine.timeline("atomic/alice", "alice"); + long clockBefore = engine.logicalClockMicros(); + + assertThrows( + RuntimeException.class, + () -> engine.appendAt( + timeline, + Operation.yaml( + "increment", "ownerChannel", "["), + clockBefore + 100L)); + + assertEquals(clockBefore, engine.logicalClockMicros()); + assertEquals(0, engine.journalSize()); + var entry = engine.append( + timeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + assertEquals(clockBefore + 1L, entry.timestampMicros()); + assertEquals(1L, entry.globalSequence()); + assertEquals(1L, entry.timelineSequence()); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java new file mode 100644 index 0000000..30df98a --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/CacheSemanticParityIntegrationTest.java @@ -0,0 +1,113 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Release gate: cache warmth cannot alter committed semantics or gas. */ +final class CacheSemanticParityIntegrationTest { + private static final long TIMESTAMP = 1_720_000_000_000_000L; + + @Test + void coldAndWarmRetryCommitIdenticalRevisionsEventsCausalityAndGas() + throws Exception { + try (TestEngine cold = TestEngine.create(); + TestEngine warm = TestEngine.create()) { + String source = resource("examples/clean/counter.yaml"); + Timeline coldTimeline = cold.timeline( + "examples/clean-counter/alice", "alice"); + Timeline warmTimeline = warm.timeline( + "examples/clean-counter/alice", "alice"); + cold.start("counter", source); + warm.start("counter", source); + TimelineEntry coldEntry = cold.appendAt( + coldTimeline, increment(), TIMESTAMP); + TimelineEntry warmEntry = warm.appendAt( + warmTimeline, increment(), TIMESTAMP); + assertEquals(coldEntry.blueId(), warmEntry.blueId()); + + EngineMetrics.MetricsSnapshot beforeWarmup = + warm.metricsSnapshot(); + warm.failOnceAt(TestEngine.FailurePoint + .AFTER_FROZEN_BEFORE_STAGE); + assertThrows(TestEngine.InjectedFailureException.class, + () -> warm.dispatch(warmEntry)); + assertEquals(1L, delta(beforeWarmup, warm.metricsSnapshot()) + .counter("frozenProcessCalls"), + "the failed attempt must finish one cache-warming PROCESS"); + assertEquals(1, warm.history("counter").size(), + "the cache-warming attempt must not commit a revision"); + assertTrue(warm.languageCacheStats().entries() > 0, + "the retry must run against a populated runtime cache"); + warm.clearFailureInjection(); + + cold.dispatch(coldEntry); + warm.dispatch(warmEntry); + + List coldTrace = evidence( + cold.history("counter")); + List warmTrace = evidence( + warm.history("counter")); + assertEquals(coldTrace, warmTrace); + assertEquals(cold.session("counter").current().blueId(), + warm.session("counter").current().blueId()); + assertTrue(coldTrace.stream() + .allMatch(revision -> revision.processingGas() > 0L)); + assertEquals(1, coldTrace.get(1).eventBlueIds().size()); + assertEquals(coldEntry.blueId(), + coldTrace.get(1).causalEntryBlueId()); + } + } + + private static Operation increment() { + return Operation.yaml( + "increment", "aliceChannel", "amount: 3"); + } + + private static List evidence( + List revisions) { + return revisions.stream().map(revision -> new RevisionEvidence( + revision.documentId().value(), + revision.epoch(), + revision.rootApplicationOrder(), + revision.kind(), + revision.before().map(value -> value.blueId()).orElse(null), + revision.after().blueId(), + revision.sourceEntry().map(TimelineEntry::blueId) + .orElse(null), + revision.sourceOrderKey().orElse(null), + revision.causalEntryBlueId().orElse(null), + revision.catchUpCause().orElse(null), + revision.emittedEvents().stream() + .map(DirectBlueIdCalculator::calculateBlueId) + .toList(), + revision.processingGas())).toList(); + } + + private record RevisionEvidence( + String documentId, + long epoch, + long rootApplicationOrder, + DocumentRevision.Kind kind, + String beforeBlueId, + String afterBlueId, + String sourceEntryBlueId, + ExternalOrderKey sourceOrder, + String causalEntryBlueId, + DocumentRevision.CatchUpCause catchUpCause, + List eventBlueIds, + long processingGas) { + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java b/src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java new file mode 100644 index 0000000..89aabca --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/CatchUpPlan.java @@ -0,0 +1,21 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentId; + +/** Read-only catch-up plan compatibility projection. */ +record CatchUpPlan(Link link, Status status) { + enum Status { + PENDING_INITIALIZATION, + REPLAYING, + COMPLETE, + BLOCKED + } + + record Link( + DocumentId parentDocumentId, + DocumentId childDocumentId, + String occurrencePath, + long appliedChildEpoch, + long activationGeneration) { + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java b/src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java new file mode 100644 index 0000000..7fb53ea --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/ConcurrentEmbeddedChildCreationTest.java @@ -0,0 +1,109 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +final class ConcurrentEmbeddedChildCreationTest { + @Test + void twoParentsAttachingSameUnseenChildCreateOneSession() throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + + String template = resource( + "examples/clean/embedded-state-parent.yaml"); + Timeline firstTimeline = engine.timeline( + "examples/embedded/state-parent-1", "bob-1"); + Timeline secondTimeline = engine.timeline( + "examples/embedded/state-parent-2", "bob-2"); + engine.start( + "embedded-state-parent-1", + parent(template, "1")); + engine.start( + "embedded-state-parent-2", + parent(template, "2")); + var first = engine.append( + firstTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + var second = engine.append( + secondTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + ExecutorService executor = Executors.newFixedThreadPool(2); + try { + CountDownLatch ready = new CountDownLatch(2); + CountDownLatch start = new CountDownLatch(1); + Future firstResult = executor.submit(() -> { + ready.countDown(); + await(start); + engine.dispatch(first); + }); + Future secondResult = executor.submit(() -> { + ready.countDown(); + await(start); + engine.dispatch(second); + }); + ready.await(); + start.countDown(); + firstResult.get(); + secondResult.get(); + } finally { + executor.shutdownNow(); + } + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(1L, work.counter("embedding.childSessionsCreated")); + assertEquals(1L, work.counter("embedding.childSessionsReused")); + assertEquals(1L, work.counter("preparedRuntimeCompilations"), + "only the single-flight child is prepared in this delta"); + assertEquals(1L, work.counter("sessionsCreated"), + "the two parents already exist; no duplicate child is created"); + assertEquals(1L, integer( + engine, "embedded-state-parent-1", "/child/counter")); + assertEquals(1L, integer( + engine, "embedded-state-parent-2", "/child/counter")); + } + } + + private static String parent(String template, String suffix) { + return template + .replace("embedded-state-parent", "embedded-state-parent-" + suffix) + .replace("examples/embedded/state-parent", + "examples/embedded/state-parent-" + suffix) + .replace("accountId: bob", "accountId: bob-" + suffix); + } + + private static void await(CountDownLatch latch) { + try { + latch.await(); + } catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + throw new IllegalStateException(interrupted); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java new file mode 100644 index 0000000..a6e9e59 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/CoreBehaviorIntegrationTest.java @@ -0,0 +1,214 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Set; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.assertProcessingTimeAttribution; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** End-to-end semantic contracts that every release must execute. */ +final class CoreBehaviorIntegrationTest { + private static final long T0 = 1_700_000_000_000_000L; + + @Test + void counterRoutesAliceAndBobExactlyOnceWithoutGenericSplitting() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline alice = engine.timeline( + "examples/clean-counter/alice", "alice"); + Timeline bob = engine.timeline( + "examples/clean-counter/bob", "bob"); + engine.start("counter", resource("examples/clean/counter.yaml")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.appendAndDispatch(alice, Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + engine.appendAndDispatch(bob, Operation.yaml( + "decrement", "bobChannel", "amount: 1")); + + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(2L, integer(engine, "counter", "/counter")); + assertEquals(2L, engine.session("counter").epoch()); + assertEquals(2, engine.journalSize()); + assertEquals(2L, work.counter( + "process.frozenContractsInvocations")); + assertEquals(2L, work.counter("routing.targetsSelected")); + assertEquals(2L, work.counter( + "process.commitCompanionDeltasApplied")); + assertEquals(2L, work.counter("process.routingSurfaceReused")); + assertProcessingTimeAttribution(work); + assertNoGenericSplitting(work); + } + } + + @Test + void ordinaryPayNoteIsOneWholeInlineValue() throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline alice = engine.timeline( + "examples/whole-request/alice", "alice"); + engine.start("whole-request-sink", resource( + "examples/clean/whole-request-sink.yaml")); + String payNoteYaml = resource( + "examples/clean/package-paynote.yaml"); + var request = engine.referencedValueRequest( + "payload", payNoteYaml); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.appendAndDispatch(alice, Operation.exact( + "storePayload", "aliceChannel", request)); + + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + Node stored = engine.value("whole-request-sink", "/payload"); + String storedBlueId = stored.isReferenceOnly() + ? stored.getBlueId() + : DirectBlueIdCalculator.calculateBlueId(stored); + Node expected = engine.exactRequest(payNoteYaml).copyNode(); + assertEquals(DirectBlueIdCalculator.calculateBlueId(expected), + storedBlueId); + assertEquals(1, engine.session("whole-request-sink") + .layout().physicalObjectCount()); + assertEquals(0, engine.session("whole-request-sink") + .layout().embeddedDocumentCount()); + assertEquals(1L, work.counter( + "process.frozenContractsInvocations")); + assertEquals(0L, work.counter("layout.catalogCompilations")); + assertNoGenericSplitting(work); + } + } + + @Test + void existingChildRevisionsCatchParentUpWithoutSourceReplay() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline child = engine.timeline("examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + increment(engine, child, T0 + 100L, 1); + increment(engine, child, T0 + 200L, 2); + increment(engine, child, T0 + 300L, 3); + int childHistoryBefore = engine.history( + "embedded-counter-A").size(); + + Timeline parent = engine.timeline("examples/embedded/B", "bob"); + engine.start("embedded-parent-B", resource( + "examples/clean/embedded-parent.yaml")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.dispatch(engine.appendAt(parent, Operation.exact( + "attachChild", "ownerChannel", + engine.embeddedDocumentRequest(childInitial)), + T0 + 1_000L)); + + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(SessionStatus.READY, + engine.session("embedded-parent-B").status()); + assertEquals(6L, integer( + engine, "embedded-parent-B", "/child/counter")); + assertEquals(childHistoryBefore, + engine.history("embedded-counter-A").size()); + assertEquals(Set.of("examples/embedded/A", "examples/embedded/B"), + engine.effectiveTimelineIds("embedded-parent-B")); + assertEquals(1L, work.counter("embedding.childSessionsReused")); + assertEquals(0L, work.counter("catchUp.childEntriesProcessed")); + assertEquals(4L, work.counter( + "catchUp.parentRevisionApplications")); + assertNoGenericSplitting(work); + } + } + + @Test + void completedNbaGameCatchesUpAndContinuesLiveWithoutReplay() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String gameInitial = resource("examples/clean/nba-game.yaml"); + Timeline gameFeed = engine.timeline( + "examples/nba/game-2016-lal-min", "nba-feed"); + engine.start("nba-game-2016-lal-min", gameInitial); + game(engine, gameFeed, T0 + 100L, "startGame", "{}"); + game(engine, gameFeed, T0 + 200L, "homeScores", "points: 2"); + game(engine, gameFeed, T0 + 300L, "awayScores", "points: 3"); + game(engine, gameFeed, T0 + 400L, "endGame", "{}"); + List gameHistory = engine.history( + "nba-game-2016-lal-min"); + + Timeline commissioner = engine.timeline( + "examples/nba/statistics", "commissioner"); + engine.start("nba-statistics", resource( + "examples/clean/nba-statistics.yaml")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.dispatch(engine.appendAt(commissioner, Operation.exact( + "attachGame", "commissionerChannel", + engine.embeddedDocumentRequest(gameInitial)), + T0 + 1_000L)); + + EngineTestSupport.MetricDelta catchUp = delta( + before, engine.metricsSnapshot()); + assertEquals("Final", text( + engine, "nba-statistics", "/observedStatus")); + assertEquals(2L, integer( + engine, "nba-statistics", "/observedHomeScore")); + assertEquals(3L, integer( + engine, "nba-statistics", "/observedAwayScore")); + assertEquals(gameHistory.size(), + engine.history("nba-game-2016-lal-min").size()); + assertEquals(0L, catchUp.counter("catchUp.childEntriesProcessed")); + assertEquals(5L, catchUp.counter( + "catchUp.parentRevisionApplications")); + + EngineMetrics.MetricsSnapshot beforeLive = engine.metricsSnapshot(); + game(engine, gameFeed, T0 + 2_000L, + "homeScores", "points: 1"); + EngineTestSupport.MetricDelta live = delta( + beforeLive, engine.metricsSnapshot()); + assertEquals(3L, integer( + engine, "nba-statistics", "/observedHomeScore")); + assertEquals(3L, integer( + engine, "nba-statistics", "/observedPlayCount")); + assertEquals(2L, live.counter( + "process.frozenContractsInvocations")); + assertFalse(engine.history("nba-statistics").get( + engine.history("nba-statistics").size() - 1) + .causalEntryBlueId().isEmpty()); + assertProcessingTimeAttribution(live); + assertNoGenericSplitting(live); + } + } + + private static void increment( + TestEngine engine, + Timeline timeline, + long timestamp, + int amount) { + engine.dispatch(engine.appendAt(timeline, Operation.yaml( + "increment", "ownerChannel", "amount: " + amount), + timestamp)); + } + + private static void game( + TestEngine engine, + Timeline timeline, + long timestamp, + String operation, + String request) { + engine.dispatch(engine.appendAt(timeline, Operation.yaml( + operation, "gameFeed", request), timestamp)); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java new file mode 100644 index 0000000..2550740 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/DeepSameEntryOrderingIntegrationTest.java @@ -0,0 +1,213 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentDispatchOutcome; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.snapshot.FrozenNode; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Exact entry-frame ordering for Root -> A1 -> A11 direct delivery. */ +final class DeepSameEntryOrderingIntegrationTest { + + @Test + void oneEntryProcessesDeepestFirstAndSettlesEveryEpochBeforeItsParent() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String leafSource = resource( + "examples/clean/deep-same-entry-a11.yaml"); + String middleSource = resource( + "examples/clean/deep-same-entry-a1.yaml"); + String rootSource = resource( + "examples/clean/deep-same-entry-root.yaml"); + Timeline shared = engine.timeline( + "examples/deep-same-entry/shared", "shared-actor"); + Timeline middleSetup = engine.timeline( + "examples/deep-same-entry/a1-setup", "a1-owner"); + Timeline rootSetup = engine.timeline( + "examples/deep-same-entry/root-setup", "root-owner"); + + engine.start("deep-same-entry-a11", leafSource); + engine.start("deep-same-entry-a1", middleSource); + engine.appendAndDispatch(middleSetup, Operation.exact( + "attachChild", + "setupChannel", + engine.embeddedDocumentRequest(leafSource))); + engine.start("deep-same-entry-root", rootSource); + engine.appendAndDispatch(rootSetup, Operation.exact( + "attachChild", + "setupChannel", + engine.embeddedDocumentRequest(middleSource))); + + long middleApplicationsBefore = integer( + engine, "deep-same-entry-a1", "/childApplications"); + long rootApplicationsBefore = integer( + engine, "deep-same-entry-root", "/childApplications"); + int leafHistoryBefore = engine.history( + "deep-same-entry-a11").size(); + int middleHistoryBefore = engine.history( + "deep-same-entry-a1").size(); + int rootHistoryBefore = engine.history( + "deep-same-entry-root").size(); + + TimelineEntry entry = engine.append(shared, Operation.yaml( + "advance", "sharedChannel", "amount: 1")); + assertEquals(3, engine.routeTargetCount(entry)); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + ProcessingDrainReceipt receipt = engine.dispatch(entry); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(List.of(entry), receipt.processedEntries()); + assertEquals(List.of( + "deep-same-entry-a11|TIMELINE_ENTRY", + "deep-same-entry-a1|EMBEDDED_REVISION_APPLICATION", + "deep-same-entry-a1|TIMELINE_ENTRY", + "deep-same-entry-root|EMBEDDED_REVISION_APPLICATION", + "deep-same-entry-root|EMBEDDED_REVISION_APPLICATION", + "deep-same-entry-root|TIMELINE_ENTRY"), + trace(receipt.outcomesFor(entry.blueId()))); + + List leafRevisions = tail( + engine.history("deep-same-entry-a11"), leafHistoryBefore); + List middleRevisions = tail( + engine.history("deep-same-entry-a1"), middleHistoryBefore); + List rootRevisions = tail( + engine.history("deep-same-entry-root"), rootHistoryBefore); + assertKinds(leafRevisions, + DocumentRevision.Kind.TIMELINE_ENTRY); + assertKinds(middleRevisions, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.TIMELINE_ENTRY); + assertKinds(rootRevisions, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.TIMELINE_ENTRY); + + assertCausalSegment(entry, leafRevisions); + assertCausalSegment(entry, middleRevisions); + assertCausalSegment(entry, rootRevisions); + assertApplicationOrder(middleRevisions); + assertApplicationOrder(rootRevisions); + + assertEquals(1L, number( + middleRevisions.get(0), "/child/directCount")); + assertEquals(0L, number( + middleRevisions.get(0), "/directCount")); + assertEquals(1L, number( + middleRevisions.get(1), "/childDirectCountSeenByDirect")); + assertEquals(1L, number( + middleRevisions.get(1), "/directCount")); + + assertEquals(0L, number( + rootRevisions.get(0), "/child/directCount")); + assertEquals(1L, number( + rootRevisions.get(0), "/child/child/directCount")); + assertEquals(1L, number( + rootRevisions.get(1), "/child/directCount")); + assertEquals(1L, number( + rootRevisions.get(2), "/a1DirectCountSeenByDirect")); + assertEquals(1L, number( + rootRevisions.get(2), "/a11DirectCountSeenByDirect")); + assertEquals(middleApplicationsBefore + 1L, number( + rootRevisions.get(2), + "/a1ChildApplicationsSeenByDirect")); + + assertEquals(1L, integer( + engine, "deep-same-entry-a11", "/directCount")); + assertEquals(1L, integer( + engine, "deep-same-entry-a1", "/directCount")); + assertEquals(1L, integer( + engine, "deep-same-entry-root", "/directCount")); + assertEquals(middleApplicationsBefore + 1L, integer( + engine, "deep-same-entry-a1", "/childApplications")); + assertEquals(rootApplicationsBefore + 2L, integer( + engine, "deep-same-entry-root", "/childApplications")); + + assertEquals(3L, work.counter("temporal.externalProcessCalls")); + assertEquals(3L, work.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(6L, work.counter("frozenProcessCalls")); + assertEquals(0L, work.counter( + "temporal.externalProcessDeduplicated")); + assertNoGenericSplitting(work); + } + } + + private static List trace( + List outcomes) { + return outcomes.stream() + .map(outcome -> outcome.documentId().value() + "|" + + outcome.revision().kind()) + .toList(); + } + + private static List tail( + List history, + int previousSize) { + return history.subList(previousSize, history.size()); + } + + private static void assertKinds( + List revisions, + DocumentRevision.Kind... expected) { + assertEquals(List.of(expected), revisions.stream() + .map(DocumentRevision::kind) + .toList()); + } + + private static void assertCausalSegment( + TimelineEntry entry, + List revisions) { + for (DocumentRevision revision : revisions) { + assertEquals(entry.sourceOrderKey(), + revision.sourceOrderKey().orElseThrow()); + assertEquals(entry.blueId(), + revision.causalEntryBlueId().orElseThrow()); + if (revision.kind() == DocumentRevision.Kind.TIMELINE_ENTRY) { + assertEquals(entry, + revision.sourceEntry().orElseThrow()); + } else { + assertFalse(revision.sourceEntry().isPresent()); + } + } + } + + private static void assertApplicationOrder( + List revisions) { + for (int index = 1; index < revisions.size(); index++) { + assertTrue(revisions.get(index - 1).rootApplicationOrder() + < revisions.get(index).rootApplicationOrder()); + } + } + + private static long number(DocumentRevision revision, String path) { + FrozenNode selected = revision.after().canonicalAt(path); + if (selected == null || selected.getValue() == null) { + throw new AssertionError("Missing numeric value at " + path); + } + Object value = selected.getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected numeric value at " + path + + " but got " + value); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java new file mode 100644 index 0000000..53b5dff --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/DynamicHistoricalSourceSurfaceIntegrationTest.java @@ -0,0 +1,149 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** Historical contract changes must immediately redefine the source surface. */ +final class DynamicHistoricalSourceSurfaceIntegrationTest { + private static final long T0 = 1_737_000_000_000_000L; + private static final String DOCUMENT = "dynamic-source-surface"; + private static final String OWNER_TIMELINE = + "examples/dynamic-source-surface/owner"; + private static final String DYNAMIC_TIMELINE = + "examples/dynamic-source-surface/dynamic"; + + @Test + void historicalAddAndRemovalRefreshTheSurfaceBeforeNextSelection() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline(OWNER_TIMELINE, "owner"); + Timeline dynamic = engine.timeline( + DYNAMIC_TIMELINE, "dynamic-owner"); + + ExactValue dynamicChannel = engine.registerType(""" + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/dynamic-source-surface/dynamic + actor: + type: MyOS/Principal Actor + accountId: dynamic-owner + """); + ExactValue dynamicHandler = engine.registerType(""" + type: Coordination/Sequential Workflow Operation + channel: dynamicChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /total + val: {$add: [$document: /total, $binding: event/message/request/amount]} + - $return: true + """); + TimelineEntry beforeActivation = engine.appendAt( + dynamic, applyDynamic(100L), T0 + 50L); + TimelineEntry activation = engine.appendAt( + owner, + activateDynamic(dynamicChannel, dynamicHandler), + T0 + 100L); + TimelineEntry active = engine.appendAt( + dynamic, applyDynamic(2L), T0 + 200L); + TimelineEntry retirement = engine.appendAt( + owner, retireDynamic(), T0 + 300L); + TimelineEntry afterRetirement = engine.appendAt( + dynamic, applyDynamic(1_000L), T0 + 400L); + + engine.start( + DOCUMENT, + resource("examples/clean/dynamic-source-surface.yaml"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + + assertEquals(2L, integer(engine, DOCUMENT, "/total"), + "only the entry inside the dynamic active interval runs"); + assertEquals(Boolean.TRUE, + engine.value(DOCUMENT, "/activated").getValue()); + assertEquals(Boolean.TRUE, + engine.value(DOCUMENT, "/retired").getValue()); + assertEquals( + List.of( + activation.blueId(), + active.blueId(), + retirement.blueId()), + processedTimelineEntries(engine), + "the feeder must reselect after both surface changes"); + assertEquals(Set.of(OWNER_TIMELINE), + engine.effectiveTimelineIds(DOCUMENT), + "the retired dynamic Timeline must leave the surface"); + assertEquals(0, engine.routeTargetCount(beforeActivation)); + assertEquals(0, engine.routeTargetCount(active)); + assertEquals(0, engine.routeTargetCount(afterRetirement)); + assertEquals(1, engine.routeTargetCount(activation)); + assertEquals(1, engine.routeTargetCount(retirement)); + + int historySize = engine.history(DOCUMENT).size(); + TimelineEntry liveAfterRetirement = engine.appendAt( + dynamic, applyDynamic(10_000L), T0 + 500L); + assertEquals(0, engine.routeTargetCount(liveAfterRetirement)); + engine.dispatch(liveAfterRetirement); + + assertEquals(2L, integer(engine, DOCUMENT, "/total")); + assertEquals(historySize, engine.history(DOCUMENT).size(), + "removed handlers cannot receive later live entries"); + EngineMetrics.MetricsSnapshot metrics = engine.metricsSnapshot(); + assertEquals(2L, metrics.counters().get( + "process.incrementalSubscriptionReprojections")); + assertEquals(0L, metrics.counters().getOrDefault( + "process.postProcessFullProjections", 0L)); + } + } + + private static Operation activateDynamic( + ExactValue channel, + ExactValue handler) { + Map fields = new LinkedHashMap<>(); + fields.put("dynamicChannel", channel.referenceNode()); + fields.put("dynamicHandler", handler.referenceNode()); + return Operation.exact( + "activateDynamic", + "ownerChannel", + ExactValue.verified(new Node().properties(fields))); + } + + private static Operation retireDynamic() { + return Operation.yaml( + "retireDynamic", "ownerChannel", "{}"); + } + + private static Operation applyDynamic(long amount) { + return Operation.yaml( + "applyDynamic", "dynamicChannel", "amount: " + amount); + } + + private static List processedTimelineEntries(TestEngine engine) { + return engine.history(DOCUMENT).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .map(revision -> revision.sourceEntry() + .orElseThrow().blueId()) + .toList(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java b/src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java new file mode 100644 index 0000000..a38e3ff --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedHistoricalPathActivationTest.java @@ -0,0 +1,205 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Historical child entries settle inside a newly activated fixed-path frame. */ +final class DynamicProcessEmbeddedHistoricalPathActivationTest { + private static final long T0 = 1_748_000_000_000_000L; + private static final String HOST_ID = "dynamic-path-host"; + private static final String GAME_ID = "round12-dynamic-history-game"; + + @Test + void activationInitializesThenCatchesHistoryBeforeTheNextParentEntry() + throws Exception { + String gameYaml = Round12NbaFixtures.game( + GAME_ID, + "examples/round12/dynamic/history/game", + "round12-history-feed"); + String hostYaml = withCatchUpObservation( + Round12NbaFixtures.dynamicPathHost(gameYaml)); + + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/round12/dynamic/path/host", + "path-owner"); + Timeline game = engine.timeline( + "examples/round12/dynamic/history/game", + "round12-history-feed"); + + engine.start(HOST_ID, hostYaml); + TimelineEntry started = engine.appendAt( + game, Round12NbaFixtures.startGame(), T0 + 100L); + TimelineEntry scored = engine.appendAt( + game, Round12NbaFixtures.homeScores(2), T0 + 200L); + TimelineEntry activation = engine.appendAt( + owner, + Operation.yaml( + "activateGameProcessing", "ownerChannel", "{}"), + T0 + 1_000L); + TimelineEntry nextParent = engine.appendAt( + owner, + Operation.yaml( + "observeCaughtUpGame", "ownerChannel", "{}"), + T0 + 2_000L); + + assertEquals(0, engine.routeTargetCount(started)); + assertEquals(0, engine.routeTargetCount(scored)); + assertTrue(started.sourceOrderKey().compareTo( + activation.sourceOrderKey()) < 0); + assertTrue(scored.sourceOrderKey().compareTo( + activation.sourceOrderKey()) < 0); + assertTrue(activation.sourceOrderKey().compareTo( + nextParent.sourceOrderKey()) < 0); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.dispatch(nextParent); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(SessionStatus.READY, + engine.session(HOST_ID).status()); + assertEquals(SessionStatus.READY, + engine.session(GAME_ID).status()); + assertEquals(Map.of("/game", GAME_ID), + engine.embeddedDocuments(HOST_ID)); + assertEquals("Live", text( + engine, HOST_ID, "/observedStatusBeforeNext")); + assertEquals(2L, integer( + engine, HOST_ID, "/observedHomeScoreBeforeNext")); + assertEquals(1L, integer( + engine, HOST_ID, "/nextParentEntryCount")); + assertEquals(2L, integer(engine, GAME_ID, "/homeScore")); + assertEquals(1L, integer( + engine, GAME_ID, "/initializationCount")); + + List childHistory = engine.history(GAME_ID); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION, + DocumentRevision.Kind.TIMELINE_ENTRY, + DocumentRevision.Kind.TIMELINE_ENTRY), + childHistory.stream().map(DocumentRevision::kind).toList()); + assertEquals(List.of( + activation.blueId(), + started.blueId(), + scored.blueId()), + childHistory.stream() + .map(revision -> revision.causalEntryBlueId() + .orElseThrow()) + .toList()); + assertEquals(List.of(started.blueId(), scored.blueId()), + childHistory.stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .map(TimelineEntry::blueId) + .toList()); + assertFalse(childHistory.stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .anyMatch(entry -> entry.blueId().equals( + activation.blueId())), + "the activating parent entry cannot enter child history"); + + List parentAfterInitialization = + engine.history(HOST_ID).subList( + 1, engine.history(HOST_ID).size()); + assertEquals(List.of( + DocumentRevision.Kind.TIMELINE_ENTRY, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.TIMELINE_ENTRY), + parentAfterInitialization.stream() + .map(DocumentRevision::kind) + .toList()); + assertEquals(List.of( + activation.blueId(), + activation.blueId(), + started.blueId(), + scored.blueId(), + nextParent.blueId()), + parentAfterInitialization.stream() + .map(revision -> revision.causalEntryBlueId() + .orElseThrow()) + .toList(), + "initialization and both historical epochs must precede " + + "the next parent PROCESS call"); + DocumentRevision observed = parentAfterInitialization.get(4); + assertEquals("Live", observed.before().orElseThrow() + .canonicalAt("/game/status").getValue()); + assertEquals(2L, integerValue( + observed, "/game/homeScore")); + + assertEquals(1L, work.counter( + "embedding.childSessionsCreated")); + assertEquals(2L, work.counter( + "catchUp.childEntriesProcessed")); + assertEquals(1L, work.counter( + "temporal.initializationEpochApplications")); + assertEquals(3L, work.counter( + "temporal.parentEpochApplications")); + assertNoGenericSplitting(work); + } + } + + private static String withCatchUpObservation(String hostYaml) { + return hostYaml + .replace( + "revisionApplications: 0", + "revisionApplications: 0\n" + + "nextParentEntryCount: 0\n" + + "observedStatusBeforeNext: None\n" + + "observedHomeScoreBeforeNext: 0") + .replace( + " coordinationApplyEmbeddedRevision:\n", + " observeCaughtUpGame:\n" + + " type: Coordination/Sequential Workflow Operation\n" + + " channel: ownerChannel\n" + + " request: {}\n" + + " steps:\n" + + " - type: Coordination/Compute\n" + + " do:\n" + + " - $appendChange:\n" + + " op: replace\n" + + " path: /observedStatusBeforeNext\n" + + " val: {$document: /game/status}\n" + + " - $appendChange:\n" + + " op: replace\n" + + " path: /observedHomeScoreBeforeNext\n" + + " val: {$document: /game/homeScore}\n" + + " - $appendChange:\n" + + " op: replace\n" + + " path: /nextParentEntryCount\n" + + " val: {$add: [$document: /nextParentEntryCount, 1]}\n" + + " - $return: true\n" + + " coordinationApplyEmbeddedRevision:\n"); + } + + private static long integerValue( + DocumentRevision revision, + String path) { + Object value = revision.before().orElseThrow() + .canonicalAt(path).getValue(); + if (value instanceof java.math.BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected Integer at " + path + + " but got " + value); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java b/src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java new file mode 100644 index 0000000..eadeea0 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/DynamicProcessEmbeddedPathActivationTest.java @@ -0,0 +1,98 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** A normal inline value becomes managed only after a contract delta adds /game. */ +final class DynamicProcessEmbeddedPathActivationTest { + private static final String HOST_ID = "dynamic-path-host"; + private static final String GAME_ID = "round12-dynamic-path-game"; + + @Test + void addingProcessEmbeddedPathInitializesExistingInlineDocument() + throws Exception { + String gameYaml = Round12NbaFixtures.game( + GAME_ID, + "examples/round12/dynamic/path/game", + "round12-path-feed"); + String hostYaml = Round12NbaFixtures.dynamicPathHost(gameYaml); + + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/round12/dynamic/path/host", + "path-owner"); + Timeline game = engine.timeline( + "examples/round12/dynamic/path/game", + "round12-path-feed"); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.start(HOST_ID, hostYaml); + assertEquals(1, engine.documentCount()); + assertEquals(Map.of(), engine.embeddedDocuments(HOST_ID)); + assertEquals(1, engine.history(HOST_ID).size()); + assertEquals(1L, integer(engine, HOST_ID, + "/hostInitializationCount")); + + TimelineEntry activation = engine.append( + owner, + Operation.yaml( + "activateGameProcessing", "ownerChannel", "{}")); + engine.dispatch(activation); + + assertEquals(2, engine.documentCount()); + assertEquals(Map.of("/game", GAME_ID), + engine.embeddedDocuments(HOST_ID)); + assertEquals(1, engine.history(GAME_ID).size()); + DocumentRevision initialization = engine.history(GAME_ID).get(0); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + initialization.kind()); + assertTrue(initialization.sourceEntry().isEmpty()); + assertEquals(activation.blueId(), + initialization.causalEntryBlueId().orElseThrow()); + assertEquals(activation.blueId(), + initialization.catchUpCause().orElseThrow() + .attachmentEntryBlueId()); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + assertTrue(Boolean.TRUE.equals(engine.value( + HOST_ID, "/gameInitialized").getValue())); + assertEquals(1L, integer(engine, HOST_ID, + "/gameInitializationEventCount")); + assertEquals(1L, integer(engine, HOST_ID, + "/revisionApplications")); + assertFalse(engine.history(GAME_ID).stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .anyMatch(entry -> entry.blueId().equals( + activation.blueId())), + "the entry that activates /game must not be delivered to it"); + + engine.appendAndDispatch(game, Round12NbaFixtures.startGame()); + assertEquals("Live", EngineTestSupport.text( + engine, HOST_ID, "/game/status")); + assertEquals(2L, integer(engine, HOST_ID, + "/revisionApplications")); + + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(1L, work.counter( + "embedding.childSessionsCreated")); + assertEquals(1L, work.counter( + "temporal.initializationEpochApplications")); + assertEquals(1L, work.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertNoGenericSplitting(work); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java new file mode 100644 index 0000000..fe32b7b --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/EmbeddedEpochEventOccurrenceIntegrationTest.java @@ -0,0 +1,98 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +/** Exact indexed child-event evidence crossing the frozen parent boundary. */ +final class EmbeddedEpochEventOccurrenceIntegrationTest { + private static final String PARENT = "duplicate-event-parent"; + private static final String CHILD = "duplicate-event-child"; + + @Test + void duplicateEventIdentitiesRetainBothOrderedOccurrencesInParentProcess() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline childTimeline = engine.timeline( + "examples/duplicate-events/child", "alice"); + engine.start(PARENT, resource( + "examples/clean/duplicate-event-embedded-parent.yaml")); + int parentHistoryBefore = engine.history(PARENT).size(); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + TimelineEntry entry = engine.append( + childTimeline, + Operation.yaml("advance", "childChannel", "{}")); + engine.drain(); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + DocumentRevision childRevision = last(engine.history(CHILD)); + DocumentRevision parentRevision = last(engine.history(PARENT)); + List events = childRevision.emittedEvents(); + assertEquals(2, events.size()); + String eventBlueId = DirectBlueIdCalculator.calculateBlueId( + events.get(0)); + assertEquals(eventBlueId, + DirectBlueIdCalculator.calculateBlueId(events.get(1)), + "the two semantic events deliberately share one BlueId"); + + assertEquals(0L, integer(engine, PARENT, + "/oldChildValueSeen"), + "parent PROCESS must start from the old child state"); + assertEquals(1L, integer(engine, PARENT, + "/incomingChildValueSeen")); + assertEquals(0L, integer(engine, PARENT, + "/firstOccurrenceIndexSeen")); + assertEquals(1L, integer(engine, PARENT, + "/secondOccurrenceIndexSeen")); + assertEquals(eventBlueId, text(engine, PARENT, + "/firstEventBlueIdSeen")); + assertEquals(eventBlueId, text(engine, PARENT, + "/secondEventBlueIdSeen")); + assertEquals(text(engine, PARENT, + "/firstEventTypeBlueIdSeen"), + text(engine, PARENT, + "/secondEventTypeBlueIdSeen")); + assertFalse(text(engine, PARENT, + "/firstEventTypeBlueIdSeen").isBlank()); + + assertEquals(DocumentRevision.Kind.TIMELINE_ENTRY, + childRevision.kind()); + assertEquals(DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + parentRevision.kind()); + assertEquals(entry.blueId(), childRevision.causalEntryBlueId() + .orElseThrow()); + assertEquals(entry.blueId(), parentRevision.causalEntryBlueId() + .orElseThrow()); + assertEquals(childRevision.before().orElseThrow().blueId(), + parentRevision.before().orElseThrow() + .canonicalBlueIdAt("/child")); + assertEquals(childRevision.after().blueId(), + parentRevision.after().canonicalBlueIdAt("/child")); + assertEquals(parentHistoryBefore + 1, + engine.history(PARENT).size()); + assertEquals(1L, work.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(1L, work.counter( + "temporal.parentEpochApplications")); + } + } + + private static DocumentRevision last(List history) { + return history.get(history.size() - 1); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java b/src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java new file mode 100644 index 0000000..bad1db3 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyLayout.java @@ -0,0 +1,59 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentSnapshot; +import blue.coordination.api.ExactValue; +import blue.language.model.Node; + +import java.util.List; + +/** Read-only physical-layout evidence projected from DocumentSnapshot. */ +final class EmbeddedOnlyLayout { + private final DocumentSnapshot snapshot; + + EmbeddedOnlyLayout(DocumentSnapshot snapshot) { + this.snapshot = snapshot; + } + + String rootBlueId() { + return snapshot.blueId(); + } + + int physicalObjectCount() { + return snapshot.physicalObjectCount(); + } + + int embeddedDocumentCount() { + return snapshot.embeddedChildren().size(); + } + + int splitterCreatedEdgeCount() { + return snapshot.processEmbeddedBoundaries().size(); + } + + List boundaries() { + return snapshot.processEmbeddedBoundaries().stream() + .map(Boundary::new) + .toList(); + } + + ExactValue stored(String scopePath) { + return snapshot.physicalObject(scopePath); + } + + Node reconstructRoot() { + return snapshot.current().copyNode(); + } + + RoutingSurface routingSurface() { + return new RoutingSurface(snapshot.routingDefinitions()); + } + + record Boundary(String childScopePath) { + } + + record RoutingSurface(List definitions) { + RoutingSurface { + definitions = List.copyOf(definitions); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java b/src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java new file mode 100644 index 0000000..816118a --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/EmbeddedOnlyStoragePolicyTest.java @@ -0,0 +1,106 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.language.model.NodePathEditor; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Proves the physical model: whole Roots plus only Process Embedded cuts. */ +final class EmbeddedOnlyStoragePolicyTest { + private static final long T0 = 1_730_000_000_000_000L; + + @Test + void ordinaryLargeDocumentAndRequestsStayWholeWhileEmbeddedChildIsOneCut() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String payNote = resource("examples/clean/package-paynote.yaml"); + EngineMetrics.MetricsSnapshot beforePayNote = + engine.metricsSnapshot(); + engine.start("standalone-paynote", payNote); + EngineTestSupport.MetricDelta payNoteWork = delta( + beforePayNote, engine.metricsSnapshot()); + + EmbeddedOnlyLayout payNoteLayout = + engine.session("standalone-paynote").layout(); + assertEquals(1, payNoteLayout.physicalObjectCount()); + assertEquals(0, payNoteLayout.embeddedDocumentCount()); + assertEquals(0, payNoteLayout.splitterCreatedEdgeCount()); + assertTrue(payNoteLayout.boundaries().isEmpty()); + assertEquals(payNoteLayout.rootBlueId(), + DirectBlueIdCalculator.calculateBlueId( + payNoteLayout.stored("/").copyNode())); + assertNoGenericSplitting(payNoteWork); + + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + String parentInitial = resource( + "examples/clean/embedded-parent.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + Timeline parentTimeline = engine.timeline( + "examples/embedded/B", "bob"); + engine.start("embedded-counter-A", childInitial); + var childEntry = engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 4"), + T0 + 100L); + engine.dispatch(childEntry); + engine.start("embedded-parent-B", parentInitial); + + EngineMetrics.MetricsSnapshot beforeAttach = + engine.metricsSnapshot(); + var attach = engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial)), + T0 + 1_000L); + engine.dispatch(attach); + EngineTestSupport.MetricDelta attachWork = delta( + beforeAttach, engine.metricsSnapshot()); + + EmbeddedOnlyLayout parentLayout = + engine.session("embedded-parent-B").layout(); + assertEquals(2, parentLayout.physicalObjectCount()); + assertEquals(1, parentLayout.embeddedDocumentCount()); + assertEquals(1, parentLayout.splitterCreatedEdgeCount()); + assertEquals(1, parentLayout.boundaries().size()); + assertEquals("/child", + parentLayout.boundaries().get(0).childScopePath()); + + Node storedRoot = parentLayout.stored("/").copyNode(); + Node storedChildReference = NodePathEditor.getOrNull( + storedRoot, "/child"); + assertTrue(storedChildReference != null + && storedChildReference.isReferenceOnly(), + "Only the effective Process Embedded child is cut"); + Node storedChild = parentLayout.stored("/child").copyNode(); + assertFalse(storedChild.isReferenceOnly(), + "The child is retained once as a whole exact document"); + Node reconstructed = parentLayout.reconstructRoot(); + assertEquals(parentLayout.rootBlueId(), + DirectBlueIdCalculator.calculateBlueId(reconstructed)); + assertEquals( + parentLayout.stored("/child").blueId(), + storedChildReference.getBlueId()); + + assertTrue(attachWork.counter("journal.entriesStoredWhole") >= 1L); + assertTrue(attachWork.counter( + "wholeObjectStore.purpose.timeline-request") >= 1L); + assertTrue(attachWork.counter( + "wholeObjectStore.purpose.timeline-entry") >= 1L); + assertNoGenericSplitting(attachWork); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/EngineMetrics.java b/src/integrationTest/java/blue/coordination/integration/EngineMetrics.java new file mode 100644 index 0000000..cc61736 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/EngineMetrics.java @@ -0,0 +1,18 @@ +package blue.coordination.integration; + +import java.util.Map; + +/** Immutable test projection of the engine's public metric snapshot. */ +final class EngineMetrics { + private EngineMetrics() { + } + + record MetricsSnapshot( + Map counters, + Map phaseNanos) { + MetricsSnapshot { + counters = Map.copyOf(counters); + phaseNanos = Map.copyOf(phaseNanos); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java b/src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java new file mode 100644 index 0000000..8c00276 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java @@ -0,0 +1,151 @@ +package blue.coordination.integration; + +import blue.language.model.Node; + +import java.math.BigInteger; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Focused helpers for the clean basic-engine acceptance tests. */ +final class EngineTestSupport { + private EngineTestSupport() { + } + + static String resource(String path) throws Exception { + return TestResources.read(path); + } + + static String payloadRequest(String payloadYaml) { + return "payload:\n" + indent(payloadYaml.strip(), 2) + "\n"; + } + + static String indent(String text, int spaces) { + String prefix = " ".repeat(spaces); + return text.lines() + .map(line -> prefix + line) + .reduce((left, right) -> left + "\n" + right) + .orElse(prefix); + } + + static long integer(TestEngine engine, String doc, String path) { + Node node = engine.value(doc, path); + assertNotNull(node.getValue(), "Missing scalar at " + doc + path); + Object value = node.getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected Integer at " + doc + path + + " but got " + value); + } + + static String text(TestEngine engine, String doc, String path) { + Object value = engine.value(doc, path).getValue(); + if (!(value instanceof String text)) { + throw new AssertionError("Expected Text at " + doc + path + + " but got " + value); + } + return text; + } + + static MetricDelta delta( + EngineMetrics.MetricsSnapshot before, + EngineMetrics.MetricsSnapshot after) { + Map counters = new LinkedHashMap<>(); + after.counters().forEach((key, value) -> counters.put( + key, value - before.counters().getOrDefault(key, 0L))); + Map phases = new LinkedHashMap<>(); + after.phaseNanos().forEach((key, value) -> phases.put( + key, value - before.phaseNanos().getOrDefault(key, 0L))); + return new MetricDelta(counters, phases); + } + + static void assertNoGenericSplitting(MetricDelta delta) { + assertEquals(0L, delta.counter("UNRELATED_DOCUMENT_READS")); + assertEquals(0L, delta.counter("REQUEST_FRAGMENTS")); + assertEquals(0L, delta.counter("TIMELINE_ENTRY_FRAGMENTS")); + assertEquals(0L, delta.counter("ORDINARY_NODE_FRAGMENTS")); + assertEquals(0L, delta.counter("FULL_ENVIRONMENT_SCANS")); + assertEquals(0L, delta.counter("SOURCE_REPLAYS_PER_PARENT")); + assertEquals(0L, delta.counter("POST_PROCESS_FULL_PROJECTIONS")); + assertEquals(0L, delta.counter( + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY")); + assertEquals(0L, delta.counter( + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY")); + } + + /** Proves that user-visible frozen time is neither lost nor called host work. */ + static void assertProcessingTimeAttribution(MetricDelta delta) { + long frozen = delta.nanos("process.frozen"); + assertTrue(frozen > 0L, "PROCESS must record frozen semantic time"); + assertEquals(frozen, + delta.nanos("process.frozenContractsOnce") + + delta.nanos("process.embeddedFrozen"), + "aggregate frozen time must include direct and embedded lanes"); + long frozenInternals = delta.nanos("process.deliveryPlanDerivation") + + delta.nanos("process.platformCommit"); + assertTrue(frozenInternals > 0L, + "frozen PROCESS must expose its two upstream macro phases"); + assertTrue(frozenInternals <= frozen, + "nested frozen timers cannot exceed their parent timer"); + assertTrue(delta.nanos("process.hostBeforeFrozen") > 0L); + assertTrue(delta.nanos("process.hostAfterFrozen") > 0L); + } + + record MetricDelta( + Map counters, + Map phaseNanos) { + /* + * Raw diagnostic metrics are sparse: production creates their map + * entry only when the corresponding work happens. These names have + * real production sites and are intentionally asserted as zero on + * paths that must avoid that work. Keep this exception list closed so + * a misspelling cannot become an accidental zero. + */ + private static final Set SPARSE_ZERO_COUNTERS = Set.of( + "childHistoricalProcessCalls", + "journal.rollbacks", + "layout.externalManagedChildMutationsRejected", + "temporal.graphGenerationsPublished"); + private static final Set SPARSE_ZERO_PHASES = Set.of( + "process.embeddedFrozen"); + + long counter(String name) { + return requireMeasurement( + counters, SPARSE_ZERO_COUNTERS, name, "counter"); + } + + long nanos(String phase) { + return requireMeasurement( + phaseNanos, SPARSE_ZERO_PHASES, phase, "phase timer"); + } + + double millis(String phase) { + return nanos(phase) / 1_000_000.0; + } + + private static long requireMeasurement( + Map measurements, + Set sparseZeroVocabulary, + String name, + String kind) { + if (measurements.containsKey(name)) { + return measurements.get(name); + } + if (sparseZeroVocabulary.contains(name)) { + return 0L; + } + throw new AssertionError("Unknown or unproduced " + kind + + " '" + name + "'. Structural metric assertions " + + "must use a name present in the engine snapshot or " + + "the closed sparse-zero vocabulary."); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/EngineTestSupportMetricVocabularyTest.java b/src/integrationTest/java/blue/coordination/integration/EngineTestSupportMetricVocabularyTest.java new file mode 100644 index 0000000..3290b5f --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/EngineTestSupportMetricVocabularyTest.java @@ -0,0 +1,58 @@ +package blue.coordination.integration; + +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Regression coverage for fail-closed structural metric assertions. */ +final class EngineTestSupportMetricVocabularyTest { + @Test + void unknownCounterAndTimerNamesCannotMasqueradeAsZero() { + EngineTestSupport.MetricDelta work = delta( + snapshot( + Map.of( + "REQUEST_FRAGMENTS", 0L, + "temporal.parentEpochApplications", 7L), + Map.of("process.frozen", 11L)), + snapshot( + Map.of( + "REQUEST_FRAGMENTS", 0L, + "temporal.parentEpochApplications", 7L), + Map.of("process.frozen", 11L))); + + assertEquals(0L, work.counter("REQUEST_FRAGMENTS"), + "a registered canonical counter may legitimately stay zero"); + assertEquals(0L, + work.counter("temporal.parentEpochApplications"), + "a produced raw structural counter may stay unchanged"); + assertEquals(0L, work.counter("childHistoricalProcessCalls"), + "a declared sparse production counter may be absent at zero"); + assertEquals(0L, work.nanos("process.frozen"), + "a produced phase timer may stay unchanged"); + assertEquals(0L, work.nanos("process.embeddedFrozen"), + "a declared sparse production timer may be absent at zero"); + + AssertionError counterFailure = assertThrows(AssertionError.class, + () -> work.counter( + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRTY")); + assertTrue(counterFailure.getMessage().contains( + "Unknown or unproduced counter")); + assertThrows(AssertionError.class, () -> work.counter( + "CHILD_PROCESS_RERUNS_ON_PRAENT_RETRY")); + AssertionError timerFailure = assertThrows(AssertionError.class, + () -> work.nanos("process.frozn")); + assertTrue(timerFailure.getMessage().contains( + "Unknown or unproduced phase timer")); + } + + private static EngineMetrics.MetricsSnapshot snapshot( + Map counters, + Map phaseNanos) { + return new EngineMetrics.MetricsSnapshot(counters, phaseNanos); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java b/src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java new file mode 100644 index 0000000..17263ae --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/ExistingEmbeddedStateOnlyCatchUpTest.java @@ -0,0 +1,95 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Timeline; +import blue.language.snapshot.FrozenNode; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** Existing child revisions cross the exact parent PROCESS boundary once each. */ +final class ExistingEmbeddedStateOnlyCatchUpTest { + @Test + void attachmentReusesChildHistoryAndProcessesEveryParentEpochExactlyOnce() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + for (int index = 0; index < 20; index++) { + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + } + int childRevisions = engine.history( + "embedded-counter-A").size(); + + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(20L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(childRevisions, engine.history( + "embedded-counter-A").size()); + assertEquals(22L, work.counter("frozenProcessCalls"), + "attachment plus initialization and twenty child epochs"); + assertEquals(21L, work.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(0L, work.counter("childHistoricalProcessCalls")); + assertEquals(21L, work.counter("childRevisionApplications")); + assertEquals(21L, work.counter( + "revisionApplicationReceiptsCommitted")); + + List appliedStates = engine.history("embedded-state-parent") + .stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION) + .map(ExistingEmbeddedStateOnlyCatchUpTest::childCounter) + .toList(); + assertEquals(21, appliedStates.size()); + assertEquals(0L, appliedStates.get(0)); + for (int index = 1; index < appliedStates.size(); index++) { + assertEquals((long) index, appliedStates.get(index), + "every parent revision must retain the corresponding " + + "intermediate child state"); + } + } + } + + private static long childCounter(DocumentRevision revision) { + FrozenNode value = revision.after().canonicalAt("/child/counter"); + if (value == null || value.getValue() == null) { + throw new AssertionError("Missing /child/counter in parent revision"); + } + Object scalar = value.getValue(); + if (scalar instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (scalar instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected numeric child counter, got " + scalar); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java b/src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java new file mode 100644 index 0000000..955d81a --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/FailureRetryAtomicityTest.java @@ -0,0 +1,457 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** State, cursors, indexes, and receipts publish as one retryable unit. */ +final class FailureRetryAtomicityTest { + @Test + void stagedChildFailureRollsBackOnlyHostDeltaAndTerminalRetryReconciles() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + var attachment = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + int routeRowsBefore = engine.routeRowCount(); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STAGING_CHILD_SESSION); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + assertEquals(1L, engine.session( + "embedded-state-parent").epoch(), + "the external parent commit is durable"); + assertEquals(SessionStatus.CATCHING_UP, engine.session( + "embedded-state-parent").status(), + "a committed parent with an unpublished graph is not READY"); + assertNotReady(engine, "embedded-state-parent"); + assertEquals(1, engine.documentCount(), + "the staged child is not a committed managed document"); + assertEquals(routeRowsBefore, engine.routeRowCount(), + "staged child route rows roll back with its session"); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty()); + assertTrue(engine.catchUpPlans().isEmpty(), + "graph, barrier, and cursor publication roll back together"); + assertEquals(1L, engine.history("embedded-state-parent").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .count()); + int objectsAfterFirstFailure = engine.wholeObjectCount(); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STAGING_CHILD_SESSION); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + assertEquals(1, engine.documentCount()); + assertEquals(routeRowsBefore, engine.routeRowCount()); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty()); + assertTrue(engine.catchUpPlans().isEmpty()); + assertEquals(SessionStatus.CATCHING_UP, engine.session( + "embedded-state-parent").status()); + assertNotReady(engine, "embedded-state-parent"); + assertEquals(objectsAfterFirstFailure, engine.wholeObjectCount(), + "repeated terminal reconciliation has exact object rollback"); + assertEquals(1L, engine.history("embedded-state-parent").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .count(), + "terminal retry cannot rerun the committed parent PROCESS"); + + engine.clearFailureInjection(); + engine.dispatch(attachment); + + assertEquals(2, engine.documentCount()); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status()); + assertEquals(engine.session( + "embedded-state-parent").epoch(), engine.readyDocument( + "embedded-state-parent").epoch()); + assertEquals("embedded-counter-A", engine.embeddedDocuments( + "embedded-state-parent").get("/child")); + assertEquals(1L, integer( + engine, "embedded-state-parent", "/child/counter")); + CatchUpPlan evidence = engine.catchUpPlans().get(0); + assertEquals(CatchUpPlan.Status.COMPLETE, evidence.status()); + assertEquals(1L, evidence.link().appliedChildEpoch()); + assertEquals(1L, evidence.link().activationGeneration(), + "rolled-back activation state must not skip a generation"); + } + } + + @Test + void childCommitSurvivesARepeatedFailureBeforeParentCommit() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + var liveChildEntry = engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 4")); + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STATE_SWAP_BEFORE_RETURN); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(liveChildEntry)); + assertEquals(1L, engine.session("embedded-counter-A").epoch()); + assertEquals(4L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(0L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(SessionStatus.CATCHING_UP, engine.session( + "embedded-state-parent").status(), + "a parent becomes non-ready as soon as its child commits"); + assertNotReady(engine, "embedded-state-parent"); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_FROZEN_BEFORE_STAGE); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(liveChildEntry)); + assertEquals(1L, engine.session("embedded-counter-A").epoch(), + "parent failure cannot roll back the child commit"); + assertEquals(2, engine.history("embedded-counter-A").size()); + assertEquals(0L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(0L, engine.catchUpPlans().get(0) + .link().appliedChildEpoch()); + assertEquals(SessionStatus.CATCHING_UP, engine.session( + "embedded-state-parent").status()); + assertNotReady(engine, "embedded-state-parent"); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + engine.dispatch(liveChildEntry); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + + assertEquals(1L, retry.counter("frozenProcessCalls"), + "retry runs only the missing parent application"); + assertEquals(2, engine.history("embedded-counter-A").size()); + assertEquals(4L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(1L, engine.catchUpPlans().get(0) + .link().appliedChildEpoch()); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status()); + assertEquals(engine.session( + "embedded-state-parent").epoch(), + engine.readyDocument( + "embedded-state-parent").epoch()); + } + } + + @Test + void restartRebuildsQueueAndAppliesOnlyTheMissingParentTransition() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + var childEntry = engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 5")); + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STATE_SWAP_BEFORE_RETURN); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(childEntry)); + assertEquals(5L, integer( + engine, "embedded-counter-A", "/counter")); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_FROZEN_BEFORE_STAGE); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(childEntry)); + assertEquals(0L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(2, engine.history("embedded-counter-A").size()); + assertEquals(0L, engine.catchUpPlans().get(0) + .link().appliedChildEpoch()); + + engine.forceLegacyReadyMarker("embedded-state-parent"); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status(), + "simulate the stale marker retained by a pre-Round-11 " + + "crash boundary"); + assertNotReady(engine, "embedded-state-parent"); + EngineMetrics.MetricsSnapshot beforeRestart = + engine.metricsSnapshot(); + engine.restartFromStores(); + EngineTestSupport.MetricDelta restart = delta( + beforeRestart, engine.metricsSnapshot()); + assertEquals(SessionStatus.CATCHING_UP, engine.session( + "embedded-state-parent").status(), + "restart must normalize stale READY evidence"); + assertEquals(1L, restart.counter( + "temporal.recoveredReadinessRepairs")); + assertNotReady(engine, "embedded-state-parent"); + EngineMetrics.MetricsSnapshot beforeResume = + engine.metricsSnapshot(); + engine.dispatch(childEntry); + EngineTestSupport.MetricDelta resume = delta( + beforeResume, engine.metricsSnapshot()); + + assertEquals(5L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(2, engine.history("embedded-counter-A").size(), + "recovery must not reinitialize or reprocess the child"); + assertEquals(0L, resume.counter("temporal.externalProcessCalls"), + "the committed child PROCESS must not replay"); + assertEquals(1L, resume.counter( + "process.embeddedEpochProcessCalls"), + "resume executes exactly the missing parent application"); + assertEquals(1L, resume.counter( + "process.frozenContractsInvocations")); + assertEquals(1L, resume.counter( + "temporal.parentEpochApplications")); + assertEquals(1L, engine.catchUpPlans().get(0) + .link().appliedChildEpoch()); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status()); + assertEquals(engine.session( + "embedded-state-parent").epoch(), + engine.readyDocument( + "embedded-state-parent").epoch()); + assertEquals(1L, engine.history("embedded-counter-A").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + assertEquals(1L, engine.history( + "embedded-state-parent").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + } + } + + @Test + void committedEmbeddedEpochSurvivesRestartAndReconcilesItsCursorOnce() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2")); + + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + var attachment = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_APPLYING_CHILD_REVISION); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + assertEquals(2L, engine.session( + "embedded-state-parent").epoch()); + assertEquals("embedded-counter-A", engine.embeddedDocuments( + "embedded-state-parent").get("/child")); + assertEquals(0L, engine.session("embedded-counter-A").epoch()); + + engine.restartFromStores(); + engine.dispatch(attachment); + assertEquals(3L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(3, engine.history("embedded-counter-A").size()); + assertEquals(5, engine.history( + "embedded-state-parent").size()); + + EngineMetrics.MetricsSnapshot beforeDuplicate = + engine.metricsSnapshot(); + engine.dispatch(attachment); + EngineTestSupport.MetricDelta duplicate = delta( + beforeDuplicate, engine.metricsSnapshot()); + assertEquals(0L, duplicate.counter("frozenProcessCalls")); + } + } + + @Test + void committedStateWithLostResponseIsReconciledFromDeliveryReceipt() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline alice = engine.timeline( + "examples/clean-counter/alice", "alice"); + engine.start( + "counter", + resource("examples/clean/counter.yaml")); + var entry = engine.append( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + EngineMetrics.MetricsSnapshot beforeFailure = + engine.metricsSnapshot(); + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STATE_SWAP_BEFORE_RETURN); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(entry)); + assertEquals(3L, integer(engine, "counter", "/counter")); + assertEquals(1L, delta(beforeFailure, engine.metricsSnapshot()) + .counter("EXTERNAL_PROCESS_CALLS")); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + assertEquals(0, engine.dispatch(entry).outcomes().size(), + "receipt reconciliation commits no new transition in " + + "the retry call"); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + assertEquals(0L, retry.counter("frozenProcessCalls")); + assertEquals(0L, retry.counter("EXTERNAL_PROCESS_CALLS")); + assertEquals(3L, integer(engine, "counter", "/counter")); + } + } + @Test + void privateEmbeddedInputNeverChangesExternalJournalFrontier() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-middle.yaml"); + engine.start("embedded-middle-A", childInitial); + engine.start( + "embedded-root-B", + resource("examples/clean/embedded-root.yaml")); + Timeline rootTimeline = engine.timeline( + "examples/embedded/root", "root-owner"); + var attachment = engine.append( + rootTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + int journalBeforeDispatch = engine.journalSize(); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_APPLYING_CHILD_REVISION); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + + assertEquals(journalBeforeDispatch, engine.journalSize(), + "processor-owned embedded input is never journaled"); + assertEquals(0L, engine.metricsSnapshot().counters() + .getOrDefault("journal.rollbacks", 0L)); + assertEquals(2L, engine.session("embedded-root-B").epoch()); + assertEquals("embedded-middle-A", engine.embeddedDocuments( + "embedded-root-B").get("/child")); + + engine.clearFailureInjection(); + engine.dispatch(attachment); + assertEquals(journalBeforeDispatch, engine.journalSize(), + "retry reconciles the document-local receipt only"); + assertEquals(2L, engine.session("embedded-root-B").epoch()); + assertEquals(1L, integer( + engine, + "embedded-root-B", + "/childRevisionApplications")); + + int journalAfterCommit = engine.journalSize(); + engine.dispatch(attachment); + assertEquals(journalAfterCommit, engine.journalSize(), + "receipt replay cannot append an internal event"); + var next = engine.append( + rootTimeline, + Operation.yaml("ignored", "ownerChannel", "{}")); + assertEquals(attachment.timestampMicros() + 1L, + next.timestampMicros()); + assertEquals(attachment.globalSequence() + 1L, + next.globalSequence()); + } + } + + private static void assertNotReady( + TestEngine engine, + String documentId) { + CoordinationException failure = assertThrows( + CoordinationException.class, + () -> engine.readyDocument(documentId)); + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_READY, + failure.code()); + } + +} diff --git a/src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java new file mode 100644 index 0000000..588ef79 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/HistoricalSourceSurfaceIntervalIntegrationTest.java @@ -0,0 +1,154 @@ +package blue.coordination.integration; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Dynamic nested history must refresh routing from exact active intervals. */ +final class HistoricalSourceSurfaceIntervalIntegrationTest { + private static final long T0 = 1_736_000_000_000_000L; + private static final String ROOT = "historical-surface-root"; + private static final String CONTROLLER = + "historical-surface-controller"; + private static final String LEAF = "historical-surface-leaf"; + + @Test + void historicalAttachmentActivatesOnlyItsExactNestedSourceInterval() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String leaf = leafSource(); + String controller = parentSource( + CONTROLLER, + "examples/historical-surface/controller", + "controller-owner"); + Timeline leafTimeline = engine.timeline( + "examples/historical-surface/leaf", "leaf-owner"); + Timeline controllerTimeline = engine.timeline( + "examples/historical-surface/controller", + "controller-owner"); + Timeline rootTimeline = engine.timeline( + "examples/historical-surface/root", "root-owner"); + + TimelineEntry excluded = engine.appendAt( + leafTimeline, increment(100L), T0 + 100L); + TimelineEntry activation = engine.appendAt( + controllerTimeline, + attach(engine, leaf), + T0 + 200L); + engine.configureEmbeddedAdmission( + LEAF, + ActivationMode.IMPORT_FROM_FRONTIER, + activation.sourceOrderKey()); + TimelineEntry historical = engine.appendAt( + leafTimeline, increment(3L), T0 + 300L); + + assertTrue(excluded.sourceOrderKey().compareTo( + activation.sourceOrderKey()) < 0); + assertTrue(activation.sourceOrderKey().compareTo( + historical.sourceOrderKey()) < 0); + + engine.start( + ROOT, + parentSource( + ROOT, + "examples/historical-surface/root", + "root-owner")); + TimelineEntry rootAttachment = engine.appendAt( + rootTimeline, + attach(engine, controller), + T0 + 1_000L); + + engine.dispatch(rootAttachment); + + assertEquals(0, engine.routeTargetCount(excluded), + "the lower-exclusive frontier must reject older facts"); + assertEquals(1, engine.routeTargetCount(historical), + "the newly active leaf surface must admit later history"); + assertEquals(3L, integer(engine, LEAF, "/counter")); + assertEquals(3L, integer( + engine, CONTROLLER, "/child/counter")); + assertEquals(3L, integer( + engine, ROOT, "/child/child/counter")); + assertEquals(activation.blueId(), engine.history(LEAF).get(0) + .causalEntryBlueId().orElseThrow(), + "the historical controller transition owns admission"); + assertEquals( + List.of(historical.blueId()), + processedTimelineEntries(engine)); + + TimelineEntry live = engine.appendAt( + leafTimeline, increment(2L), T0 + 1_100L); + assertEquals(1, engine.routeTargetCount(live)); + engine.dispatch(live); + + assertEquals(5L, integer(engine, LEAF, "/counter")); + assertEquals(5L, integer( + engine, CONTROLLER, "/child/counter")); + assertEquals(5L, integer( + engine, ROOT, "/child/child/counter")); + assertEquals( + List.of(historical.blueId(), live.blueId()), + processedTimelineEntries(engine), + "excluded history must never leak into the live interval"); + + int leafHistorySize = engine.history(LEAF).size(); + engine.dispatch(live); + assertEquals(leafHistorySize, engine.history(LEAF).size(), + "re-draining the live cutoff must be idempotent"); + } + } + + private static Operation increment(long amount) { + return Operation.yaml( + "increment", "ownerChannel", "amount: " + amount); + } + + private static Operation attach(TestEngine engine, String document) { + return Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(document)); + } + + private static List processedTimelineEntries(TestEngine engine) { + return engine.history(LEAF).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .map(revision -> revision.sourceEntry() + .orElseThrow().blueId()) + .toList(); + } + + private static String leafSource() throws Exception { + return resource("examples/clean/embedded-counter.yaml") + .replace("documentId: embedded-counter-A", + "documentId: " + LEAF) + .replace("timelineId: examples/embedded/A", + "timelineId: examples/historical-surface/leaf") + .replace("accountId: alice", "accountId: leaf-owner"); + } + + private static String parentSource( + String documentId, + String timelineId, + String actorId) throws Exception { + return resource("examples/clean/embedded-state-parent.yaml") + .replace("documentId: embedded-state-parent", + "documentId: " + documentId) + .replace("coordination/internal/embedded-state-parent", + "coordination/internal/" + documentId) + .replace("timelineId: examples/embedded/state-parent", + "timelineId: " + timelineId) + .replace("accountId: bob", "accountId: " + actorId); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java new file mode 100644 index 0000000..06839e2 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/InitializationLifecycleEventOrderingIntegrationTest.java @@ -0,0 +1,175 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Exact initialization-event evidence crossing frozen parent PROCESS. */ +final class InitializationLifecycleEventOrderingIntegrationTest { + private static final String PARENT = + "r12-initialization-event-parent"; + private static final String PARENT_RESOURCE = + "examples/round12/initialization-event-observer-parent.yaml"; + private static final String PARENT_TIMELINE = + "examples/round12/initialization-events/parent"; + private static final String PARENT_ACTOR = + "round12-initialization-event-observer"; + + @Test + void lifecycleHandlerRetainsTwoIdenticalInitializationEvents() + throws Exception { + String childId = "round12-duplicate-initialization-events"; + try (TestEngine engine = TestEngine.create()) { + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + TimelineEntry attachment = attach(engine, + "examples/round12/initialization-duplicate-events-child.yaml"); + + DocumentRevision initialization = initialization( + engine, childId, attachment); + List events = initialization.emittedEvents(); + assertEquals(2, events.size()); + assertEquals("Round12/Identical Initialization Event", + kind(events.get(0))); + assertEquals(kind(events.get(0)), kind(events.get(1))); + + String eventBlueId = DirectBlueIdCalculator.calculateBlueId( + events.get(0)); + assertEquals(eventBlueId, + DirectBlueIdCalculator.calculateBlueId(events.get(1)), + "the lifecycle handler deliberately emits one exact value twice"); + + assertParentEvidence(engine, eventBlueId, eventBlueId, + kind(events.get(0)), kind(events.get(1))); + assertEquals(1L, integer(engine, childId, + "/initializationCount")); + assertInitializationWork(engine, before); + } + } + + @Test + void lifecycleHandlerRetainsInitializationEventsInEmissionOrder() + throws Exception { + String childId = "round12-ordered-initialization-events"; + try (TestEngine engine = TestEngine.create()) { + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + TimelineEntry attachment = attach(engine, + "examples/round12/initialization-ordered-events-child.yaml"); + + DocumentRevision initialization = initialization( + engine, childId, attachment); + List events = initialization.emittedEvents(); + assertEquals(2, events.size()); + assertEquals("Round12/Initialization Event A", + kind(events.get(0))); + assertEquals("Round12/Initialization Event B", + kind(events.get(1))); + + String firstBlueId = DirectBlueIdCalculator.calculateBlueId( + events.get(0)); + String secondBlueId = DirectBlueIdCalculator.calculateBlueId( + events.get(1)); + assertNotEquals(firstBlueId, secondBlueId); + assertParentEvidence(engine, firstBlueId, secondBlueId, + kind(events.get(0)), kind(events.get(1))); + assertEquals(1L, integer(engine, childId, + "/initializationCount")); + assertInitializationWork(engine, before); + } + } + + private static TimelineEntry attach( + TestEngine engine, + String childResource) throws Exception { + Timeline parentTimeline = engine.timeline( + PARENT_TIMELINE, PARENT_ACTOR); + engine.start(PARENT, resource(PARENT_RESOURCE)); + TimelineEntry attachment = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "parentChannel", + engine.embeddedDocumentRequest( + resource(childResource)))); + engine.dispatch(attachment); + return attachment; + } + + private static DocumentRevision initialization( + TestEngine engine, + String childId, + TimelineEntry attachment) { + List history = engine.history(childId); + assertEquals(1, history.size(), + "the embedded child must initialize exactly once"); + DocumentRevision initialization = history.get(0); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + initialization.kind()); + assertTrue(initialization.sourceEntry().isEmpty(), + "initialization is not an external Timeline Entry"); + assertEquals(attachment.blueId(), + initialization.causalEntryBlueId().orElseThrow()); + assertTrue(initialization.sourceOrderKey().isPresent()); + assertFalse(initialization.catchUpCause().isEmpty()); + return initialization; + } + + private static void assertParentEvidence( + TestEngine engine, + String firstBlueId, + String secondBlueId, + String firstKind, + String secondKind) { + assertEquals(1L, integer(engine, PARENT, + "/initializationApplications")); + assertEquals(2L, integer(engine, PARENT, + "/observedEventCount")); + assertEquals(0L, integer(engine, PARENT, + "/firstOccurrenceIndex")); + assertEquals(1L, integer(engine, PARENT, + "/secondOccurrenceIndex")); + assertEquals(firstBlueId, text(engine, PARENT, + "/firstEventBlueId")); + assertEquals(secondBlueId, text(engine, PARENT, + "/secondEventBlueId")); + assertEquals(firstKind, text(engine, PARENT, + "/firstEventKind")); + assertEquals(secondKind, text(engine, PARENT, + "/secondEventKind")); + + List parentHistory = engine.history(PARENT); + assertEquals(1L, parentHistory.stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION) + .count()); + } + + private static void assertInitializationWork( + TestEngine engine, + EngineMetrics.MetricsSnapshot before) { + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(1L, work.counter( + "temporal.initializationEpochApplications")); + assertEquals(2L, work.counter( + "temporal.initializationEventOccurrencesForwarded")); + } + + private static String kind(Node event) { + return (String) event.getProperties().get("kind").getValue(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java b/src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java new file mode 100644 index 0000000..554c74a --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/InitializationRetryIdempotencyTest.java @@ -0,0 +1,417 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationException; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Initialization events and epochs remain exactly-once across graph-publication retry. */ +final class InitializationRetryIdempotencyTest { + private static final String HOST_ID = "dynamic-path-host"; + private static final String GAME_ID = "round12-retry-game"; + + @Test + void retryPublishesOneChildInitializationWithoutRepeatingParentOperation() + throws Exception { + String gameYaml = Round12NbaFixtures.game( + GAME_ID, + "examples/round12/retry/game", + "round12-retry-feed"); + String hostYaml = Round12NbaFixtures.dynamicPathHost(gameYaml) + .replace( + "timelineId: examples/round12/dynamic/path/host", + "timelineId: examples/round12/retry/host") + .replace("accountId: path-owner", + "accountId: round12-retry-owner"); + + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/round12/retry/host", + "round12-retry-owner"); + engine.timeline( + "examples/round12/retry/game", + "round12-retry-feed"); + engine.start(HOST_ID, hostYaml); + TimelineEntry activation = engine.append( + owner, + Operation.yaml( + "activateGameProcessing", "ownerChannel", "{}")); + + engine.failOnceAt(TestEngine.FailurePoint.AFTER_STAGING_CHILD_SESSION); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(activation)); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(HOST_ID).status()); + assertThrows(CoordinationException.class, + () -> engine.readyDocument(HOST_ID)); + assertEquals(1L, engine.history(HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .count(), + "the already committed parent operation must not repeat"); + + engine.clearFailureInjection(); + engine.dispatch(activation); + + assertEquals(SessionStatus.READY, + engine.readyDocument(HOST_ID).status()); + assertEquals(1L, engine.history(HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .count()); + assertEquals(1L, engine.history(HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .count()); + assertEquals(1, engine.history(GAME_ID).size()); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + engine.history(GAME_ID).get(0).kind()); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + assertEquals(1L, integer(engine, HOST_ID, + "/gameInitializationEventCount")); + assertEquals(1L, integer(engine, HOST_ID, + "/revisionApplications")); + } + } + + @Test + void failedParentInitializationApplicationDoesNotRollbackChildOrPeer() + throws Exception { + String gameId = "round12-isolation-game"; + String firstHostId = "round12-isolation-host-one"; + String secondHostId = "round12-isolation-host-two"; + String gameYaml = Round12NbaFixtures.game( + gameId, + "examples/round12/isolation/game", + "round12-isolation-feed"); + String firstHostYaml = Round12NbaFixtures.host( + firstHostId, + "examples/round12/isolation/host-one", + "round12-isolation-owner-one"); + String secondHostYaml = Round12NbaFixtures.host( + secondHostId, + "examples/round12/isolation/host-two", + "round12-isolation-owner-two"); + + try (TestEngine engine = TestEngine.create()) { + engine.timeline( + "examples/round12/isolation/game", + "round12-isolation-feed"); + Timeline firstHost = engine.timeline( + "examples/round12/isolation/host-one", + "round12-isolation-owner-one"); + Timeline secondHost = engine.timeline( + "examples/round12/isolation/host-two", + "round12-isolation-owner-two"); + + engine.start(firstHostId, firstHostYaml); + engine.appendAndDispatch( + firstHost, Round12NbaFixtures.attach(gameYaml, engine)); + int childHistorySize = engine.history(gameId).size(); + int successfulParentHistorySize = + engine.history(firstHostId).size(); + assertEquals(1L, initializationRevisions(engine, gameId)); + assertEquals(1L, integer(engine, gameId, + "/initializationCount")); + assertEquals(1L, integer(engine, firstHostId, + "/gameInitializationEventCount")); + assertEquals(SessionStatus.READY, + engine.readyDocument(firstHostId).status()); + + engine.start(secondHostId, secondHostYaml); + TimelineEntry secondAttachment = engine.append( + secondHost, Round12NbaFixtures.attach(gameYaml, engine)); + engine.failOnceAt( + TestEngine.FailurePoint.AFTER_STATE_SWAP_BEFORE_RETURN); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(secondAttachment)); + assertEquals(1L, timelineRevisions(engine, secondHostId)); + assertEquals(0L, embeddedApplications(engine, secondHostId)); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(secondHostId).status()); + + EngineMetrics.MetricsSnapshot beforeApplicationFailure = + engine.metricsSnapshot(); + engine.failOnceAt( + TestEngine.FailurePoint.AFTER_FROZEN_BEFORE_STAGE); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(secondAttachment)); + EngineTestSupport.MetricDelta failedApplication = delta( + beforeApplicationFailure, engine.metricsSnapshot()); + + assertEquals(1L, failedApplication.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(0L, failedApplication.counter( + "temporal.initializationEpochApplications")); + assertEquals(0L, failedApplication.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(0L, failedApplication.counter( + "temporal.parentEpochApplications")); + assertEquals(childHistorySize, engine.history(gameId).size()); + assertEquals(1L, initializationRevisions(engine, gameId)); + assertEquals(1L, integer(engine, gameId, + "/initializationCount")); + assertEquals(successfulParentHistorySize, + engine.history(firstHostId).size()); + assertEquals(1L, integer(engine, firstHostId, + "/gameInitializationEventCount")); + assertEquals(SessionStatus.READY, + engine.readyDocument(firstHostId).status()); + assertEquals(0L, embeddedApplications(engine, secondHostId)); + assertEquals(0L, integer(engine, secondHostId, + "/gameInitializationEventCount")); + assertEquals(0L, integer(engine, secondHostId, + "/revisionApplications")); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(secondHostId).status()); + assertThrows(CoordinationException.class, + () -> engine.readyDocument(secondHostId)); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + engine.dispatch(secondAttachment); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + + assertEquals(0L, retry.counter("temporal.externalProcessCalls")); + assertEquals(1L, retry.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(1L, retry.counter( + "temporal.initializationEpochApplications")); + assertEquals(1L, retry.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(0L, retry.counter("childHistoricalProcessCalls")); + assertEquals(childHistorySize, engine.history(gameId).size()); + assertEquals(successfulParentHistorySize, + engine.history(firstHostId).size()); + assertEquals(1L, embeddedApplications(engine, secondHostId)); + assertEquals(1L, integer(engine, secondHostId, + "/gameInitializationEventCount")); + assertEquals(1L, integer(engine, secondHostId, + "/revisionApplications")); + assertEquals(SessionStatus.READY, + engine.readyDocument(secondHostId).status()); + } + } + + @Test + void restartBeforeParentApplicationReusesCommittedInitializationEpoch() + throws Exception { + String gameId = "round12-recovery-game"; + String firstHostId = "round12-recovery-host-one"; + String recoveringHostId = "round12-recovery-host-two"; + String gameYaml = Round12NbaFixtures.game( + gameId, + "examples/round12/recovery/game", + "round12-recovery-feed"); + String firstHostYaml = Round12NbaFixtures.host( + firstHostId, + "examples/round12/recovery/host-one", + "round12-recovery-owner-one"); + String recoveringHostYaml = Round12NbaFixtures.host( + recoveringHostId, + "examples/round12/recovery/host-two", + "round12-recovery-owner-two"); + + try (TestEngine engine = TestEngine.create()) { + engine.timeline( + "examples/round12/recovery/game", + "round12-recovery-feed"); + Timeline firstHost = engine.timeline( + "examples/round12/recovery/host-one", + "round12-recovery-owner-one"); + Timeline recoveringHost = engine.timeline( + "examples/round12/recovery/host-two", + "round12-recovery-owner-two"); + + engine.start(firstHostId, firstHostYaml); + TimelineEntry firstAttachment = engine.append( + firstHost, Round12NbaFixtures.attach(gameYaml, engine)); + engine.dispatch(firstAttachment); + int childHistorySize = engine.history(gameId).size(); + String initializationCause = engine.history(gameId).get(0) + .causalEntryBlueId().orElseThrow(); + assertEquals(1L, initializationRevisions(engine, gameId)); + assertEquals(firstAttachment.blueId(), initializationCause); + assertEquals(1L, integer(engine, gameId, + "/initializationCount")); + + engine.start(recoveringHostId, recoveringHostYaml); + TimelineEntry recoveringAttachment = engine.append( + recoveringHost, + Round12NbaFixtures.attach(gameYaml, engine)); + engine.failOnceAt( + TestEngine.FailurePoint.AFTER_STATE_SWAP_BEFORE_RETURN); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(recoveringAttachment)); + + assertEquals(SessionStatus.CATCHING_UP, + engine.session(recoveringHostId).status()); + assertEquals(1L, timelineRevisions(engine, recoveringHostId)); + assertEquals(0L, embeddedApplications( + engine, recoveringHostId)); + assertEquals(0L, integer(engine, recoveringHostId, + "/gameInitializationEventCount")); + assertEquals(childHistorySize, engine.history(gameId).size()); + assertEquals(1L, initializationRevisions(engine, gameId)); + assertEquals(initializationCause, engine.history(gameId).get(0) + .causalEntryBlueId().orElseThrow()); + + engine.restartFromStores(); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(recoveringHostId).status()); + assertThrows(CoordinationException.class, + () -> engine.readyDocument(recoveringHostId)); + + EngineMetrics.MetricsSnapshot beforeResume = + engine.metricsSnapshot(); + engine.dispatch(recoveringAttachment); + EngineTestSupport.MetricDelta resume = delta( + beforeResume, engine.metricsSnapshot()); + + assertEquals(0L, resume.counter( + "temporal.externalProcessCalls"), + "the committed attachment must not run again"); + assertEquals(1L, resume.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(1L, resume.counter( + "temporal.initializationEpochApplications")); + assertEquals(1L, resume.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(0L, resume.counter("childHistoricalProcessCalls")); + assertEquals(childHistorySize, engine.history(gameId).size()); + assertEquals(1L, initializationRevisions(engine, gameId)); + assertEquals(initializationCause, engine.history(gameId).get(0) + .causalEntryBlueId().orElseThrow()); + assertEquals(1L, integer(engine, gameId, + "/initializationCount")); + assertEquals(1L, timelineRevisions(engine, recoveringHostId)); + assertEquals(1L, embeddedApplications( + engine, recoveringHostId)); + assertEquals(1L, integer(engine, recoveringHostId, + "/gameInitializationEventCount")); + assertEquals(1L, integer(engine, recoveringHostId, + "/revisionApplications")); + assertEquals(SessionStatus.READY, + engine.readyDocument(recoveringHostId).status()); + } + } + + @Test + void postCommitInitializationRecoveryDoesNotCountTheReceiptTwice() + throws Exception { + String gameYaml = Round12NbaFixtures.game( + GAME_ID, + "examples/round12/retry/game", + "round12-retry-feed"); + String hostYaml = Round12NbaFixtures.dynamicPathHost(gameYaml) + .replace( + "timelineId: examples/round12/dynamic/path/host", + "timelineId: examples/round12/retry/host") + .replace("accountId: path-owner", + "accountId: round12-retry-owner"); + + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/round12/retry/host", + "round12-retry-owner"); + engine.timeline( + "examples/round12/retry/game", + "round12-retry-feed"); + engine.start(HOST_ID, hostYaml); + TimelineEntry activation = engine.append( + owner, + Operation.yaml( + "activateGameProcessing", "ownerChannel", "{}")); + + EngineMetrics.MetricsSnapshot beforeFailure = + engine.metricsSnapshot(); + engine.failOnceAt( + TestEngine.FailurePoint.AFTER_APPLYING_CHILD_REVISION); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(activation)); + EngineTestSupport.MetricDelta committed = delta( + beforeFailure, engine.metricsSnapshot()); + + assertEquals(1L, committed.counter( + "temporal.initializationEpochApplications")); + assertEquals(1L, committed.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(1L, embeddedApplications(engine, HOST_ID)); + assertEquals(1L, integer(engine, HOST_ID, + "/gameInitializationEventCount")); + assertEquals(1L, initializationRevisions(engine, GAME_ID)); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(HOST_ID).status()); + assertThrows(CoordinationException.class, + () -> engine.readyDocument(HOST_ID)); + + engine.restartFromStores(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + engine.dispatch(activation); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + + assertEquals(0L, retry.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(0L, retry.counter( + "temporal.initializationEpochApplications")); + assertEquals(0L, retry.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(1L, embeddedApplications(engine, HOST_ID)); + assertEquals(1L, integer(engine, HOST_ID, + "/gameInitializationEventCount")); + assertEquals(1L, initializationRevisions(engine, GAME_ID)); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + assertEquals(SessionStatus.READY, + engine.readyDocument(HOST_ID).status()); + } + } + + private static long initializationRevisions( + TestEngine engine, + String documentId) { + return revisionCount( + engine, documentId, DocumentRevision.Kind.INITIALIZATION); + } + + private static long timelineRevisions( + TestEngine engine, + String documentId) { + return revisionCount( + engine, documentId, DocumentRevision.Kind.TIMELINE_ENTRY); + } + + private static long embeddedApplications( + TestEngine engine, + String documentId) { + return revisionCount( + engine, + documentId, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION); + } + + private static long revisionCount( + TestEngine engine, + String documentId, + DocumentRevision.Kind kind) { + return engine.history(documentId).stream() + .filter(revision -> revision.kind() == kind) + .count(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java b/src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java new file mode 100644 index 0000000..28fe15e --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/LateAdmissionEmbeddedHistoryTest.java @@ -0,0 +1,133 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** A child first discovered at attachment is initialized and replays journal history once. */ +final class LateAdmissionEmbeddedHistoryTest { + private static final long T0 = 1_710_000_000_000_000L; + + @Test + void missingChildSessionIsCreatedThenCaughtUpFromCompleteHistory() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + + // The source history exists before Coordination has admitted A. + engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1"), + T0 + 100); + engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2"), + T0 + 200); + engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 3"), + T0 + 300); + + engine.start( + "embedded-parent-B", + resource("examples/clean/embedded-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/B", "bob"); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + var attach = engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial)), + T0 + 1_000); + engine.dispatch(attach); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(SessionStatus.READY, + engine.session("embedded-parent-B").status()); + assertEquals(6L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(6L, integer( + engine, "embedded-parent-B", "/childCounter")); + assertEquals(4, engine.history("embedded-counter-A").size()); + assertEquals(6, engine.history("embedded-parent-B").size()); + assertEquals(1L, work.counter( + "embedding.childSessionsCreated")); + assertEquals(3L, work.counter( + "catchUp.childEntriesProcessed")); + assertEquals(4L, work.counter( + "catchUp.parentRevisionApplications")); + assertEquals(8L, work.counter( + "process.frozenContractsInvocations")); + assertNoGenericSplitting(work); + } + } + + @Test + void laterAppendWithEarlierSourceOrderIsSelectedBeforeAttachment() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1"), + T0 + 100L); + + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + var attachment = engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial)), + T0 + 1_000L); + var laterAppend = engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2"), + T0 + 200L); + + EngineMetrics.MetricsSnapshot beforeAttach = + engine.metricsSnapshot(); + engine.dispatch(attachment); + EngineTestSupport.MetricDelta attachWork = delta( + beforeAttach, engine.metricsSnapshot()); + assertEquals(3L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(2L, attachWork.counter( + "childHistoricalProcessCalls"), + "the global feeder ordered both entries before the " + + "attachment; late admission then replays them " + + "into the newly managed child"); + + engine.dispatch(laterAppend); + assertEquals(3L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(3L, integer( + engine, "embedded-state-parent", "/child/counter")); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java new file mode 100644 index 0000000..8fd1627 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/ManagedChildCollectionMembershipMutationIntegrationTest.java @@ -0,0 +1,144 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.indent; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** A child revision may change sibling membership owned by its parent. */ +final class ManagedChildCollectionMembershipMutationIntegrationTest { + private static final String PARENT = "managed-child-membership-parent"; + private static final String ALPHA = "embedded-counter-A"; + private static final String BETA = "embedded-counter-B"; + + @Test + void childApplicationAddsThenRemovesParentOwnedCollectionSibling() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String parent = parentFixture( + registeredBetaBlueId(engine), + engine.exactRequest("{}").blueId()); + Timeline alpha = engine.timeline("examples/embedded/A", "alice"); + EngineMetrics.MetricsSnapshot beforeStart = engine.metricsSnapshot(); + engine.start(PARENT, parent); + EngineTestSupport.MetricDelta start = delta( + beforeStart, engine.metricsSnapshot()); + + assertEquals(Map.of( + "/games/alpha", ALPHA, + "/games/beta", BETA), engine.embeddedDocuments(PARENT)); + assertEquals(3, engine.documentCount()); + assertEquals(3, engine.session(PARENT).layout().physicalObjectCount()); + assertEquals(SessionStatus.READY, engine.session(PARENT).status()); + assertEquals(2L, start.counter("layout.ownedMembershipRefreshes")); + assertNoGenericSplitting(start); + + List initial = engine.history(PARENT); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION), + initial.stream().map(DocumentRevision::kind).toList()); + assertNull(initial.get(0).after().canonicalAt("/games/beta")); + assertNotNull(initial.get(1).after().canonicalAt("/games/beta")); + assertEquals(0L, integer(engine, PARENT, "/games/alpha/counter")); + + EngineMetrics.MetricsSnapshot beforeRemoval = + engine.metricsSnapshot(); + engine.appendAndDispatch(alpha, Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + EngineTestSupport.MetricDelta removal = delta( + beforeRemoval, engine.metricsSnapshot()); + + assertEquals(Map.of("/games/alpha", ALPHA), + engine.embeddedDocuments(PARENT)); + assertEquals(SessionStatus.READY, engine.session(PARENT).status()); + assertEquals(1L, integer(engine, PARENT, "/games/alpha/counter")); + assertEquals(DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + engine.history(PARENT).get(3).kind()); + assertNull(engine.history(PARENT).get(3).after() + .canonicalAt("/games/beta")); + assertEquals(1L, removal.counter("embedding.bindingsRetired")); + assertEquals(1L, removal.counter( + "layout.ownedMembershipRefreshes")); + assertEquals(1L, removal.counter("layout.catalogCompilations")); + assertNoGenericSplitting(removal); + assertEquals(List.of(DocumentRevision.Kind.INITIALIZATION), + engine.history(BETA).stream() + .map(DocumentRevision::kind).toList()); + } + } + + @Test + void childApplicationRevalidatesPortableCollectionLimit() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String parent = parentFixture( + registeredBetaBlueId(engine), + engine.exactRequest(overflowMembers()).blueId()); + Timeline alpha = engine.timeline("examples/embedded/A", "alice"); + engine.start(PARENT, parent); + int parentHistory = engine.history(PARENT).size(); + + IllegalStateException failure = assertThrows( + IllegalStateException.class, + () -> engine.appendAndDispatch(alpha, Operation.yaml( + "increment", "ownerChannel", "amount: 2"))); + + assertTrue(failure.getMessage().contains( + "PORTABLE_LIMIT_EXCEEDED: Portable limit exceeded: " + + "processEmbeddedPathsPerScope")); + assertEquals(parentHistory, engine.history(PARENT).size()); + assertEquals(Map.of( + "/games/alpha", ALPHA, + "/games/beta", BETA), engine.embeddedDocuments(PARENT)); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(PARENT).status()); + assertEquals(0L, integer(engine, PARENT, "/games/alpha/counter")); + assertEquals(2L, integer(engine, ALPHA, "/counter")); + } + } + + private static String parentFixture( + String betaBlueId, + String overflowBlueId) throws Exception { + return resource( + "examples/round12/managed-child-collection-membership-parent.yaml") + .replace(" alpha: __ALPHA_DOCUMENT__", + " alpha:\n" + indent(resource( + "examples/clean/embedded-counter.yaml").strip(), 4)) + .replace("__BETA_BLUE_ID__", betaBlueId) + .replace("__OVERFLOW_BLUE_ID__", overflowBlueId); + } + + private static String registeredBetaBlueId(TestEngine engine) + throws Exception { + return engine.exactRequest(resource( + "examples/clean/embedded-counter-B.yaml")).blueId(); + } + + private static String overflowMembers() { + StringBuilder result = new StringBuilder(); + for (int index = 0; index < 4_097; index++) { + result.append("member").append(index) + .append(": {documentId: overflow-member-") + .append(index).append("}\n"); + } + return result.toString().stripTrailing(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java b/src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java new file mode 100644 index 0000000..5664d12 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/ManagedChildOwnershipGuardTest.java @@ -0,0 +1,76 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.TimelineEntry; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** An external parent operation cannot mutate a managed child's state. */ +final class ManagedChildOwnershipGuardTest { + @Test + void rejectedParentMutationRollsBackAndCreatesNoDeliveryReceipt() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline shared = engine.timeline( + "examples/root-isolation/shared", "alice"); + engine.start( + "root-isolation-parent", + resource("examples/clean/root-isolation-parent.yaml")); + engine.appendAndDispatch( + shared, + Operation.exact( + "attachChild", + "sharedChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/root-isolation-child.yaml")))); + + long parentEpoch = engine.session("root-isolation-parent").epoch(); + long childEpoch = engine.session("root-isolation-child").epoch(); + TimelineEntry illegal = engine.append( + shared, + Operation.yaml( + "mutateChildIllegally", + "sharedChannel", + "amount: 7")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + IllegalStateException first = assertThrows( + IllegalStateException.class, + () -> engine.dispatch(illegal)); + IllegalStateException retry = assertThrows( + IllegalStateException.class, + () -> engine.dispatch(illegal)); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertTrue(first.getMessage().contains( + "attempted to mutate managed child"), + first::getMessage); + assertTrue(retry.getMessage().contains( + "attempted to mutate managed child"), + retry::getMessage); + assertEquals(parentEpoch, + engine.session("root-isolation-parent").epoch()); + assertEquals(childEpoch, + engine.session("root-isolation-child").epoch()); + assertEquals(SessionStatus.READY, + engine.session("root-isolation-parent").status()); + assertEquals(0L, integer( + engine, "root-isolation-child", "/childCount")); + assertEquals(0L, integer( + engine, "root-isolation-parent", "/child/childCount")); + assertEquals(2L, work.counter( + "layout.externalManagedChildMutationsRejected")); + assertEquals(2L, work.counter( + "process.frozenContractsInvocations")); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java b/src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java new file mode 100644 index 0000000..6904d36 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/ManagedDocumentIsolationTest.java @@ -0,0 +1,92 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** Parent and child may share an operation without double-processing the child. */ +final class ManagedDocumentIsolationTest { + @Test + void sharedOperationExecutesOncePerManagedDocumentThenOneEpochPropagation() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline shared = engine.timeline( + "examples/root-isolation/shared", "alice"); + engine.start( + "root-isolation-parent", + resource("examples/clean/root-isolation-parent.yaml")); + engine.appendAndDispatch( + shared, + Operation.exact( + "attachChild", + "sharedChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/root-isolation-child.yaml")))); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.appendAndDispatch( + shared, + Operation.yaml("collide", "sharedChannel", "{}")); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(1L, integer( + engine, "root-isolation-parent", "/rootCount")); + assertEquals(1L, integer( + engine, "root-isolation-child", "/childCount")); + assertEquals(1L, integer( + engine, + "root-isolation-parent", + "/child/childCount")); + assertEquals(2L, integer( + engine, + "root-isolation-parent", + "/childRevisionApplications")); + assertEquals(3L, work.counter( + "process.frozenContractsInvocations"), + "parent external + child external + parent revision"); + assertEquals(3L, work.counter( + "process.concreteOwnershipRootInputs")); + assertEquals(3L, work.counter( + "process.referenceOnlyEventInputs")); + assertEquals(0L, work.counter( + "POST_PROCESS_FULL_PROJECTIONS")); + assertEquals(3L, work.counter( + "process.commitCompanionDeltasApplied")); + assertEquals(0L, work.counter( + "layout.externalManagedChildMutationsRejected")); + assertEquals( + engine.session("root-isolation-parent").layout().rootBlueId(), + engine.session("root-isolation-parent").layout() + .stored("/").blueId()); + assertEquals( + engine.session("root-isolation-child").layout().rootBlueId(), + engine.session("root-isolation-child").layout() + .stored("/").blueId()); + assertEquals(3L, work.counter( + "temporal.graphIdentityMatches")); + assertEquals(2L, work.counter( + "temporal.graphIdentityOccurrencesCompared")); + assertEquals(0L, work.counter( + "temporal.graphDeltaPreviews")); + assertEquals(0L, work.counter( + "temporal.graphForwardBucketsUpdated")); + assertEquals(0L, work.counter( + "temporal.graphReconciliations")); + assertEquals(3L, work.counter( + "routing.surfacePublicationsSkipped")); + assertEquals(0L, work.counter( + "routing.surfaceCompilations")); + assertEquals(3L, work.counter("layout.plansReused")); + assertEquals(0L, work.counter("layout.catalogCompilations")); + assertEquals(3L, work.counter("GRAPH_SNAPSHOTS_REUSED")); + assertNoGenericSplitting(work); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java b/src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java new file mode 100644 index 0000000..a8e32e5 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/MultiChildSynchronizedCatchUpTest.java @@ -0,0 +1,250 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +/** Three newly attached histories share one source-ordered parent barrier. */ +final class MultiChildSynchronizedCatchUpTest { + private static final long T0 = 1_710_000_000_000_000L; + + @Test + void threeHistoriesMergeByCanonicalOrderUnderOneBarrier() + throws Exception { + Outcome canonical = run(AppendOrder.CANONICAL); + Outcome shuffled = run(AppendOrder.SHUFFLED); + + assertNotEquals(canonical.appendSequences(), + shuffled.appendSequences(), + "the two runs must use genuinely different insertion order"); + assertEquals(canonical.sourceEntryBlueIds(), + shuffled.sourceEntryBlueIds(), + "canonical source facts must retain the same identities"); + assertEquals(canonical.parentBlueId(), shuffled.parentBlueId()); + assertEquals(canonical.parentState(), shuffled.parentState()); + assertEquals(canonical.parentTrace(), shuffled.parentTrace()); + } + + private static Outcome run(AppendOrder appendOrder) throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline aTimeline = engine.timeline( + "examples/embedded/A", "alice"); + Timeline bTimeline = engine.timeline( + "examples/embedded/B", "brenda"); + Timeline cTimeline = engine.timeline( + "examples/embedded/C", "carol"); + Timeline parentTimeline = engine.timeline( + "examples/embedded/three-child-parent", "bob"); + ExactValue a = engine.registerType(child( + "child-a", "examples/embedded/A", "alice")); + ExactValue b = engine.registerType(child( + "child-b", "examples/embedded/B", "brenda")); + ExactValue c = engine.registerType(child( + "child-c", "examples/embedded/C", "carol")); + + Entries entries = appendHistory( + engine, appendOrder, aTimeline, bTimeline, cTimeline); + + engine.start( + "three-child-history-parent", + resource("examples/clean/three-child-history-parent.yaml")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + TimelineEntry attachment = engine.appendAt( + parentTimeline, + Operation.exact( + "attachAll", + "ownerChannel", + referencedRequest(a, b, c)), + T0 + 1_000L); + engine.dispatch(attachment); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(3L, integer(engine, "child-a", "/counter")); + assertEquals(30L, integer(engine, "child-b", "/counter")); + assertEquals(100L, integer(engine, "child-c", "/counter")); + assertEquals(3L, integer( + engine, "three-child-history-parent", + "/children/a/counter")); + assertEquals(30L, integer( + engine, "three-child-history-parent", + "/children/b/counter")); + assertEquals(100L, integer( + engine, "three-child-history-parent", + "/children/c/counter")); + + List parentHistory = engine.history( + "three-child-history-parent"); + List causalOrder = parentHistory.stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION) + .map(revision -> revision.causalEntryBlueId() + .orElseThrow()) + .toList(); + assertEquals(List.of( + attachment.blueId(), + attachment.blueId(), + attachment.blueId(), + entries.a1().blueId(), + entries.b1().blueId(), + entries.a2().blueId(), + entries.c1().blueId(), + entries.b2().blueId()), causalOrder); + assertEquals(1L, work.counter( + "temporal.catchUpBarriersCreated")); + assertEquals(1L, work.counter( + "temporal.catchUpBarriersCompleted")); + assertEquals(5L, work.counter( + "temporal.historicalEntriesReplayed")); + assertEquals(5L, work.counter("childHistoricalProcessCalls")); + assertEquals(8L, work.counter( + "temporal.parentEpochApplications")); + assertEquals(2L, work.counter( + "process.embeddedInput.eventTemplatesCompiled")); + assertEquals(6L, work.counter( + "process.embeddedInput.eventTemplateHits")); + + return new Outcome( + engine.session("three-child-history-parent") + .current().blueId(), + new ParentState( + integer(engine, "three-child-history-parent", + "/children/a/counter"), + integer(engine, "three-child-history-parent", + "/children/b/counter"), + integer(engine, "three-child-history-parent", + "/children/c/counter")), + parentHistory.stream() + .map(revision -> new ParentTrace( + revision.kind(), + revision.causalEntryBlueId() + .orElseThrow(), + revision.rootApplicationOrder(), + revision.after().blueId())) + .toList(), + entries.canonicalOrder().stream() + .map(TimelineEntry::blueId) + .toList(), + entries.canonicalOrder().stream() + .map(TimelineEntry::globalSequence) + .toList()); + } + } + + private static Entries appendHistory( + TestEngine engine, + AppendOrder appendOrder, + Timeline aTimeline, + Timeline bTimeline, + Timeline cTimeline) { + return switch (appendOrder) { + case CANONICAL -> new Entries( + engineAppend(engine, aTimeline, 1, 100L), + engineAppend(engine, bTimeline, 10, 150L), + engineAppend(engine, aTimeline, 2, 200L), + engineAppend(engine, cTimeline, 100, 250L), + engineAppend(engine, bTimeline, 20, 300L)); + case SHUFFLED -> { + TimelineEntry c1 = engineAppend( + engine, cTimeline, 100, 250L); + TimelineEntry b1 = engineAppend( + engine, bTimeline, 10, 150L); + TimelineEntry a1 = engineAppend( + engine, aTimeline, 1, 100L); + TimelineEntry b2 = engineAppend( + engine, bTimeline, 20, 300L); + TimelineEntry a2 = engineAppend( + engine, aTimeline, 2, 200L); + yield new Entries(a1, b1, a2, c1, b2); + } + }; + } + + private static TimelineEntry engineAppend( + TestEngine engine, + Timeline timeline, + long amount, + long timestampOffset) { + return engine.appendAt( + timeline, increment(amount), T0 + timestampOffset); + } + + private static ExactValue referencedRequest( + ExactValue a, + ExactValue b, + ExactValue c) { + Map fields = new LinkedHashMap<>(); + fields.put("a", a.referenceNode()); + fields.put("b", b.referenceNode()); + fields.put("c", c.referenceNode()); + return ExactValue.verified(new Node().properties(fields)); + } + + private static Operation increment(long amount) { + return Operation.yaml( + "increment", "ownerChannel", "amount: " + amount); + } + + private static String child( + String documentId, + String timelineId, + String actorId) throws Exception { + return resource("examples/clean/embedded-counter.yaml") + .replace("documentId: embedded-counter-A", + "documentId: " + documentId) + .replace("timelineId: examples/embedded/A", + "timelineId: " + timelineId) + .replace("accountId: alice", "accountId: " + actorId); + } + + private enum AppendOrder { + CANONICAL, + SHUFFLED + } + + private record Entries( + TimelineEntry a1, + TimelineEntry b1, + TimelineEntry a2, + TimelineEntry c1, + TimelineEntry b2) { + private List canonicalOrder() { + return List.of(a1, b1, a2, c1, b2); + } + } + + private record ParentState( + long childA, + long childB, + long childC) { + } + + private record ParentTrace( + DocumentRevision.Kind kind, + String causalEntryBlueId, + long applicationOrder, + String afterBlueId) { + } + + private record Outcome( + String parentBlueId, + ParentState parentState, + List parentTrace, + List sourceEntryBlueIds, + List appendSequences) { + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java b/src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java new file mode 100644 index 0000000..c0ea896 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/NestedEmbeddedCatchUpTest.java @@ -0,0 +1,126 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import java.util.Set; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** Root -> Emb1 -> Emb2 catch-up, reuse, and live propagation. */ +final class NestedEmbeddedCatchUpTest { + private static final long T0 = 1_720_000_000_000_000L; + + @Test + void nestedInitialStatesCatchUpRecursivelyAndLiveRevisionPropagatesOnce() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String leafInitial = resource( + "examples/clean/embedded-counter.yaml"); + String middleInitial = resource( + "examples/clean/embedded-middle.yaml"); + String rootInitial = resource( + "examples/clean/embedded-root.yaml"); + + Timeline leafTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", leafInitial); + var plusTwo = engine.appendAt( + leafTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2"), + T0 + 100); + engine.dispatch(plusTwo); + + Timeline middleTimeline = engine.timeline( + "examples/embedded/middle", "middle-owner"); + engine.start("embedded-middle-A", middleInitial); + var attachLeaf = engine.appendAt( + middleTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(leafInitial)), + T0 + 1_000); + engine.dispatch(attachLeaf); + assertEquals(2L, integer( + engine, "embedded-middle-A", "/childCounter")); + + int leafHistoryBeforeRoot = engine.history( + "embedded-counter-A").size(); + int middleHistoryBeforeRoot = engine.history( + "embedded-middle-A").size(); + Timeline rootTimeline = engine.timeline( + "examples/embedded/root", "root-owner"); + engine.start("embedded-root-B", rootInitial); + EngineMetrics.MetricsSnapshot beforeRootAttach = + engine.metricsSnapshot(); + var attachMiddle = engine.appendAt( + rootTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(middleInitial)), + T0 + 2_000); + engine.dispatch(attachMiddle); + EngineTestSupport.MetricDelta rootAttachWork = delta( + beforeRootAttach, engine.metricsSnapshot()); + + assertEquals(SessionStatus.READY, + engine.session("embedded-root-B").status()); + assertEquals(2L, integer( + engine, "embedded-root-B", "/leafCounter")); + assertEquals(2, + engine.session("embedded-root-B") + .layout().physicalObjectCount(), + "A Root owns only its direct child; the middle session " + + "owns the leaf boundary"); + assertEquals(2, + engine.session("embedded-middle-A") + .layout().physicalObjectCount()); + assertEquals(1, + engine.session("embedded-counter-A") + .layout().physicalObjectCount()); + assertEquals(leafHistoryBeforeRoot, + engine.history("embedded-counter-A").size()); + assertEquals(middleHistoryBeforeRoot, + engine.history("embedded-middle-A").size()); + assertEquals( + Set.of( + "examples/embedded/A", + "examples/embedded/middle", + "examples/embedded/root"), + engine.effectiveTimelineIds("embedded-root-B")); + assertNoGenericSplitting(rootAttachWork); + + EngineMetrics.MetricsSnapshot beforeLive = engine.metricsSnapshot(); + var plusThree = engine.appendAt( + leafTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 3"), + T0 + 3_000); + engine.dispatch(plusThree); + EngineTestSupport.MetricDelta liveWork = delta( + beforeLive, engine.metricsSnapshot()); + + assertEquals(5L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(5L, integer( + engine, "embedded-middle-A", "/childCounter")); + assertEquals(5L, integer( + engine, "embedded-root-B", "/leafCounter")); + assertEquals(3L, liveWork.counter( + "process.frozenContractsInvocations"), + "Leaf, middle, and root each advance exactly once"); + assertEquals(2L, liveWork.counter( + "catchUp.parentRevisionApplications")); + assertNoGenericSplitting(liveWork); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java new file mode 100644 index 0000000..858a269 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/NestedOwnedScopePlanInvalidationIntegrationTest.java @@ -0,0 +1,105 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** A managed child's authored contracts invalidate only that child's plan. */ +final class NestedOwnedScopePlanInvalidationIntegrationTest { + private static final long T0 = 1_738_000_000_000_000L; + private static final String ROOT = "nested-owned-surface-root"; + private static final String CHILD = "nested-owned-surface-child"; + private static final String DYNAMIC_TIMELINE = + "examples/nested-owned-surface/dynamic"; + + @Test + void nestedChannelAdditionDoesNotInvalidateItsContainingRootPlan() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/nested-owned-surface/owner", "nested-owner"); + Timeline dynamic = engine.timeline( + DYNAMIC_TIMELINE, "dynamic-owner"); + engine.start( + ROOT, + resource("examples/clean/" + + "nested-owned-dynamic-surface.yaml")); + + ExactValue channel = engine.registerType(""" + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nested-owned-surface/dynamic + actor: + type: MyOS/Principal Actor + accountId: dynamic-owner + """); + ExactValue handler = engine.registerType(""" + type: Coordination/Sequential Workflow Operation + channel: dynamicChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /total + val: {$add: [$document: /total, $binding: event/message/request/amount]} + - $return: true + """); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + TimelineEntry activation = engine.appendAt( + owner, activate(channel, handler), T0 + 100L); + TimelineEntry dynamicEntry = engine.appendAt( + dynamic, + Operation.yaml( + "applyDynamic", "dynamicChannel", "amount: 2"), + T0 + 200L); + + engine.dispatch(dynamicEntry); + + assertEquals(2L, integer(engine, CHILD, "/total")); + assertEquals(2L, integer(engine, ROOT, "/child/total")); + assertEquals( + List.of(activation.blueId(), dynamicEntry.blueId()), + engine.history(CHILD).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .map(revision -> revision.sourceEntry() + .orElseThrow().blueId()) + .toList()); + assertTrue(engine.effectiveTimelineIds(ROOT) + .contains(DYNAMIC_TIMELINE)); + assertEquals(1L, delta(before, engine.metricsSnapshot()).counter( + "layout.plansRecompiledAfterContractChange"), + "only the managed child's own plan may refresh"); + } + } + + private static Operation activate( + ExactValue channel, + ExactValue handler) { + Map fields = new LinkedHashMap<>(); + fields.put("dynamicChannel", channel.referenceNode()); + fields.put("dynamicHandler", handler.referenceNode()); + return Operation.exact( + "activateDynamic", + "ownerChannel", + ExactValue.verified(new Node().properties(fields))); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java b/src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java new file mode 100644 index 0000000..89b7ca4 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/NestedSiblingGlobalCatchUpOrderingTest.java @@ -0,0 +1,247 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.indent; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Global source ordering across one sibling and one nested catch-up branch. */ +final class NestedSiblingGlobalCatchUpOrderingTest { + private static final long T0 = 1_735_000_000_000_000L; + + @Test + void earlierSiblingHistoryPrecedesLaterNestedHistoryUnderOneRootBarrier() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String a11Source = leafSource(); + ExactValue a1 = engine.registerType(middleSource(a11Source)); + ExactValue a2 = engine.registerType(a2Source()); + Timeline a11Timeline = engine.timeline( + "examples/nested-sibling/a11", "a11-owner"); + Timeline a2Timeline = engine.timeline( + "examples/nested-sibling/a2", "a2-owner"); + Timeline rootTimeline = engine.timeline( + "examples/nested-sibling/root", "root-owner"); + + // Deliberately append the later nested entry first. The barrier + // must use canonical source order, never append/caller order. + TimelineEntry a11Entry = engine.appendAt( + a11Timeline, + Operation.yaml( + "advance", "sharedChannel", "amount: 11"), + T0 + 200L); + TimelineEntry a2Entry = engine.appendAt( + a2Timeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2"), + T0 + 100L); + assertTrue(a2Entry.sourceOrderKey().compareTo( + a11Entry.sourceOrderKey()) < 0); + + engine.start( + "nested-sibling-history-root", + resource("examples/clean/nested-sibling-history-root.yaml")); + String rootInitializationCause = engine.history( + "nested-sibling-history-root").get(0) + .causalEntryBlueId().orElseThrow(); + TimelineEntry attachment = engine.appendAt( + rootTimeline, + Operation.exact( + "attachBoth", + "ownerChannel", + attachmentRequest(a1, a2)), + T0 + 1_000L); + engine.dispatch(attachment); + + assertEquals(List.of( + trace(DocumentRevision.Kind.INITIALIZATION, + attachment), + trace(DocumentRevision.Kind.TIMELINE_ENTRY, + a2Entry)), + trace(engine.history("nested-sibling-a2"))); + assertEquals(List.of( + trace(DocumentRevision.Kind.INITIALIZATION, + attachment), + trace(DocumentRevision.Kind.TIMELINE_ENTRY, + a11Entry)), + trace(engine.history("nested-sibling-a11"))); + assertEquals(List.of( + trace(DocumentRevision.Kind.INITIALIZATION, + attachment), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + attachment), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + a11Entry)), + trace(engine.history("nested-sibling-a1"))); + + List rootTrace = trace(engine.history( + "nested-sibling-history-root")); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION + "|" + + rootInitializationCause, + trace(DocumentRevision.Kind.TIMELINE_ENTRY, + attachment), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + attachment), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + attachment), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + attachment), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + a2Entry), + trace( + DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION, + a11Entry)), + rootTrace, + "every initialization application must precede the " + + "globally ordered A2 then A11 history"); + + assertEquals(2L, integer( + engine, "nested-sibling-a2", "/counter")); + assertEquals(11L, integer( + engine, "nested-sibling-a11", "/directCount")); + assertEquals(2L, integer( + engine, "nested-sibling-a1", "/childApplications")); + assertEquals(11L, integer( + engine, + "nested-sibling-history-root", + "/children/a1/child/directCount")); + assertEquals(2L, integer( + engine, + "nested-sibling-history-root", + "/children/a2/counter")); + } + } + + @Test + void unavailableHistoryDefersTheEntryFrameAndResumesWithoutOvertaking() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + ExactValue a1 = engine.registerType(middleSource(leafSource())); + ExactValue a2 = engine.registerType(a2Source()); + Timeline a11Timeline = engine.timeline( + "examples/nested-sibling/a11", "a11-owner"); + Timeline a2Timeline = engine.timeline( + "examples/nested-sibling/a2", "a2-owner"); + Timeline rootTimeline = engine.timeline( + "examples/nested-sibling/root", "root-owner"); + engine.appendAt(a11Timeline, Operation.yaml( + "advance", "sharedChannel", "amount: 11"), T0 + 200L); + engine.appendAt(a2Timeline, Operation.yaml( + "increment", "ownerChannel", "amount: 2"), T0 + 100L); + engine.start( + "nested-sibling-history-root", + resource("examples/clean/nested-sibling-history-root.yaml")); + TimelineEntry attachment = engine.appendAt( + rootTimeline, + Operation.exact( + "attachBoth", + "ownerChannel", + attachmentRequest(a1, a2)), + T0 + 1_000L); + + engine.makeHistoricalUnavailable("provider temporarily offline"); + ProcessingDrainReceipt deferred = engine.dispatch(attachment); + + assertFalse(deferred.processedEntries().contains(attachment)); + assertEquals(2, deferred.processedEntries().size(), + "earlier source entries remain globally drainable even " + + "before their managed documents exist"); + assertFalse(deferred.quiescent()); + assertTrue(deferred.blocked()); + assertEquals(SessionStatus.CATCHING_UP, + engine.session("nested-sibling-history-root").status()); + assertEquals(1, engine.history("nested-sibling-a2").size()); + assertEquals(1, engine.history("nested-sibling-a11").size()); + + engine.makeHistoricalAvailable(); + ProcessingDrainReceipt resumed = engine.dispatch(attachment); + + assertEquals(List.of(attachment), resumed.processedEntries()); + assertTrue(resumed.quiescent()); + assertEquals(2L, integer( + engine, "nested-sibling-a2", "/counter")); + assertEquals(11L, integer( + engine, "nested-sibling-a11", "/directCount")); + assertEquals(SessionStatus.READY, + engine.session("nested-sibling-history-root").status()); + } + } + + private static ExactValue attachmentRequest( + ExactValue a1, + ExactValue a2) { + Map fields = new LinkedHashMap<>(); + fields.put("a1", a1.referenceNode()); + fields.put("a2", a2.referenceNode()); + return ExactValue.verified(new Node().properties(fields)); + } + + private static String leafSource() throws Exception { + return resource("examples/clean/deep-same-entry-a11.yaml") + .replace("deep-same-entry-a11", "nested-sibling-a11") + .replace("examples/deep-same-entry/shared", + "examples/nested-sibling/a11") + .replace("shared-actor", "a11-owner"); + } + + private static String middleSource(String leaf) throws Exception { + String middle = resource("examples/clean/deep-same-entry-a1.yaml") + .replace("deep-same-entry-a1", "nested-sibling-a1") + .replace("examples/deep-same-entry/shared", + "examples/nested-sibling/a1-unused") + .replace("shared-actor", "a1-unused"); + return middle.stripTrailing() + "\nchild:\n" + + indent(leaf.strip(), 2) + "\n"; + } + + private static String a2Source() throws Exception { + return resource("examples/clean/embedded-counter-B.yaml") + .replace("embedded-counter-B", "nested-sibling-a2") + .replace("examples/embedded/B", + "examples/nested-sibling/a2") + .replace("beatrice", "a2-owner"); + } + + private static List trace(List revisions) { + return revisions.stream() + .map(revision -> revision.kind() + "|" + + revision.causalEntryBlueId().orElseThrow()) + .toList(); + } + + private static String trace( + DocumentRevision.Kind kind, + TimelineEntry cause) { + return kind + "|" + cause.blueId(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java new file mode 100644 index 0000000..635c883 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/NonScalarRoutingIntegrationTest.java @@ -0,0 +1,164 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationMetrics; +import blue.coordination.api.DocumentId; +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; +import java.util.Set; + +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Real-engine routing coverage beyond one scalar Timeline Channel. */ +final class NonScalarRoutingIntegrationTest { + private static final String ALICE_TIMELINE = + "examples/routing/alice"; + private static final String BOB_TIMELINE = + "examples/routing/bob"; + private static final String CHARLIE_TIMELINE = + "examples/routing/charlie"; + private static final long T0 = 1_710_000_000_000_000L; + + @Test + void compositeTimelineRoutesOnlyItsDeclaredMemberSources() + throws Exception { + verifyAggregateRouting( + DocumentId.of("composite-routing-counter"), + "examples/clean/composite-routing-counter.yaml"); + } + + @Test + void allTimelinesRoutesOnlyTheFrozenSameScopeTimelineFamily() + throws Exception { + verifyAggregateRouting( + DocumentId.of("all-timelines-routing-counter"), + "examples/clean/all-timelines-routing-counter.yaml"); + } + + @Test + void fromNowRouteIntervalExcludesBacklogStillInTheGlobalJournal() + throws Exception { + DocumentId counter = DocumentId.of("counter"); + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + "examples/clean-counter/alice", "alice"); + TimelineEntry oldOne = engine.appendAt( + alice, increment(5), T0 + 100L); + TimelineEntry oldTwo = engine.appendAt( + alice, increment(7), T0 + 200L); + + engine.startDocument( + counter, + resource("examples/clean/counter.yaml"), + CoordinationEngine.AdmissionPolicy.FROM_NOW, + null); + TimelineEntry live = engine.appendAt( + alice, increment(3), T0 + 300L); + + assertEquals(0, engine.routeTargetCount(oldOne)); + assertEquals(0, engine.routeTargetCount(oldTwo)); + assertEquals(1, engine.routeTargetCount(live)); + long processBefore = engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS); + + ProcessingDrainReceipt receipt = engine.drain(); + + assertEquals( + List.of(oldOne.blueId(), oldTwo.blueId(), live.blueId()), + entryIds(receipt.processedEntries())); + assertTrue(receipt.outcomesFor(oldOne.blueId()).isEmpty()); + assertTrue(receipt.outcomesFor(oldTwo.blueId()).isEmpty()); + assertEquals(1, receipt.outcomesFor(live.blueId()).size()); + assertEquals(3L, counter(engine, counter)); + assertEquals(1L, engine.document(counter).epoch()); + assertEquals( + List.of(live.blueId()), + engine.history(counter).stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .map(TimelineEntry::blueId) + .toList()); + assertEquals(processBefore + 1L, engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + } + } + + private static void verifyAggregateRouting( + DocumentId documentId, + String resourcePath) throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + ALICE_TIMELINE, "alice"); + Timeline bob = engine.registerTimeline( + BOB_TIMELINE, "bob"); + Timeline charlie = engine.registerTimeline( + CHARLIE_TIMELINE, "charlie"); + engine.startDocument(documentId, resource(resourcePath)); + + TimelineEntry aliceEntry = engine.appendAt( + alice, add(2), T0 + 100L); + TimelineEntry bobEntry = engine.appendAt( + bob, add(3), T0 + 200L); + TimelineEntry unrelated = engine.appendAt( + charlie, add(7), T0 + 300L); + + assertEquals(1, engine.routeTargetCount(aliceEntry)); + assertEquals(1, engine.routeTargetCount(bobEntry)); + assertEquals(0, engine.routeTargetCount(unrelated)); + assertEquals( + Set.of(ALICE_TIMELINE, BOB_TIMELINE), + engine.effectiveTimelineIds(documentId)); + + ProcessingDrainReceipt receipt = engine.drain(); + + assertEquals( + List.of( + aliceEntry.blueId(), + bobEntry.blueId(), + unrelated.blueId()), + entryIds(receipt.processedEntries())); + assertEquals(1, receipt.outcomesFor(aliceEntry.blueId()).size()); + assertEquals(1, receipt.outcomesFor(bobEntry.blueId()).size()); + assertTrue(receipt.outcomesFor(unrelated.blueId()).isEmpty()); + assertEquals(5L, counter(engine, documentId)); + assertEquals(2L, engine.document(documentId).epoch()); + } + } + + private static Operation add(long amount) { + return Operation.yaml( + "add", "aggregateChannel", "amount: " + amount); + } + + private static Operation increment(long amount) { + return Operation.yaml( + "increment", "aliceChannel", "amount: " + amount); + } + + private static List entryIds(List entries) { + return entries.stream().map(TimelineEntry::blueId).toList(); + } + + private static long counter( + CoordinationEngine engine, + DocumentId documentId) { + Object value = engine.document(documentId) + .valueAt("/counter") + .copyNode() + .getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected numeric /counter, got " + value); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceCorrectnessIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceCorrectnessIntegrationTest.java new file mode 100644 index 0000000..cd12973 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceCorrectnessIntegrationTest.java @@ -0,0 +1,306 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.internal.CoordinationTestControl; +import blue.language.identity.DirectBlueIdCalculator; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Focused Round 13 duplicate-occurrence correctness proofs. */ +final class PlaygroundFiveOccurrenceCorrectnessIntegrationTest { + private static final String HOST = + PlaygroundFiveOccurrenceFixtures.HOST_ID; + private static final String ALPHA_FIRST_PATH = "/children/alphaFirst"; + private static final String ALPHA_SECOND_PATH = "/children/alphaSecond"; + + @Test + void conflictingStatesAreRejectedAndCoherentRetryWorksOnSameEngine() + throws Exception { + String alphaYaml = Round12NbaFixtures.game( + PlaygroundFiveOccurrenceFixtures.ALPHA_ID, + PlaygroundFiveOccurrenceFixtures.alphaTimeline(), + "playground-feed-alpha"); + String conflictingAlphaYaml = alphaYaml.replace( + "homeScore: 0", "homeScore: 99"); + + try (TestEngine engine = initializedHost()) { + Timeline owner = owner(engine); + ExactValue alpha = engine.exactValue(alphaYaml); + ExactValue conflictingAlpha = engine.exactValue( + conflictingAlphaYaml); + long hostEpochBefore = engine.session(HOST).epoch(); + String hostBlueIdBefore = engine.session(HOST).current().blueId(); + int hostHistoryBefore = engine.history(HOST).size(); + var rejected = engine.append(owner, attachment( + engine, + orderedDocuments( + PlaygroundFiveOccurrenceFixtures.ALPHA_FIRST, + alpha, + PlaygroundFiveOccurrenceFixtures.ALPHA_SECOND, + conflictingAlpha))); + + IllegalStateException failure = assertThrows( + IllegalStateException.class, + () -> engine.dispatch(rejected)); + + assertTrue(failure.getMessage().contains( + "Invalid admission evidence: conflicting supplied states"), + failure::getMessage); + assertEquals(1, engine.documentCount(), + "the conflicting child must not leave any managed session"); + assertEquals(hostEpochBefore, engine.session(HOST).epoch(), + "invalid attachment evidence cannot commit a Host epoch"); + assertEquals(hostBlueIdBefore, + engine.session(HOST).current().blueId()); + assertEquals(SessionStatus.READY, + engine.session(HOST).status()); + assertEquals(hostBlueIdBefore, + engine.readyDocument(HOST).current().blueId(), + "only the prior coherent Host epoch remains READY"); + assertTrue(engine.embeddedDocuments(HOST).isEmpty()); + assertEquals(hostHistoryBefore, engine.history(HOST).size(), + "the rejected attachment is atomic at the Host revision"); + + engine.appendAndDispatch(owner, attachment( + engine, + orderedDocuments( + PlaygroundFiveOccurrenceFixtures.ALPHA_FIRST, + alpha, + PlaygroundFiveOccurrenceFixtures.ALPHA_SECOND, + alpha))); + + assertEquals(2, engine.documentCount()); + assertEquals(Map.of( + ALPHA_FIRST_PATH, + PlaygroundFiveOccurrenceFixtures.ALPHA_ID, + ALPHA_SECOND_PATH, + PlaygroundFiveOccurrenceFixtures.ALPHA_ID), + engine.embeddedDocuments(HOST)); + assertEquals(1L, engine.history( + PlaygroundFiveOccurrenceFixtures.ALPHA_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + assertEquals(SessionStatus.READY, + engine.readyDocument(HOST).status()); + assertEquals(hostHistoryBefore + 3, engine.history(HOST).size(), + "one coherent external transition and two occurrence " + + "applications commit exactly once"); + assertEquals(2, engine.journalSize(), + "the immutable rejected entry and coherent retry are both " + + "retained"); + } + } + + @Test + void removingAndReaddingOneDuplicateUsesOneSourceProcessAndFreshCursor() + throws Exception { + try (TestEngine engine = initializedHostWithAlphaReattachment()) { + Timeline owner = owner(engine); + engine.appendAndDispatch( + owner, PlaygroundFiveOccurrenceFixtures.attachFive(engine)); + + CoordinationTestControl.EmbeddedOccurrenceEvidence oldSecond = + occurrence(engine, ALPHA_SECOND_PATH); + CoordinationTestControl.EmbeddedOccurrenceEvidence stableFirst = + occurrence(engine, ALPHA_FIRST_PATH); + assertEquals(0L, oldSecond.appliedChildEpoch()); + assertEquals(1, oldSecond.committedReceiptIds().size()); + + Timeline gamma = engine.timeline( + PlaygroundFiveOccurrenceFixtures.gammaTimeline(), + "playground-feed-gamma"); + engine.appendAndDispatch(gamma, Round12NbaFixtures.startGame()); + + assertTrue(engine.embeddedOccurrenceEvidence().stream() + .noneMatch(evidence -> evidence.bindingId().equals( + oldSecond.bindingId())), + "the retired cursor must leave the active graph"); + assertEquals(stableFirst.bindingId(), + occurrence(engine, ALPHA_FIRST_PATH).bindingId()); + + EngineMetrics.MetricsSnapshot beforeAdvance = + engine.metricsSnapshot(); + Timeline alpha = engine.timeline( + PlaygroundFiveOccurrenceFixtures.alphaTimeline(), + "playground-feed-alpha"); + engine.appendAndDispatch(alpha, Round12NbaFixtures.startGame()); + EngineTestSupport.MetricDelta advance = delta( + beforeAdvance, engine.metricsSnapshot()); + + assertEquals(1L, advance.counter( + "temporal.externalProcessCalls")); + assertEquals(1L, advance.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(1L, advance.counter( + "temporal.parentEpochApplications")); + assertEquals(1L, occurrence( + engine, ALPHA_FIRST_PATH).appliedChildEpoch()); + assertTrue(engine.embeddedOccurrenceEvidence().stream() + .noneMatch(evidence -> evidence.occurrencePath().equals( + ALPHA_SECOND_PATH))); + assertEquals("Live", text(engine, HOST, + ALPHA_FIRST_PATH + "/status")); + assertEquals(SessionStatus.READY, + engine.readyDocument(HOST).status()); + + int parentHistoryBeforeReadd = engine.history(HOST).size(); + engine.appendAndDispatch( + gamma, Round12NbaFixtures.homeScores(1)); + + CoordinationTestControl.EmbeddedOccurrenceEvidence newSecond = + occurrence(engine, ALPHA_SECOND_PATH); + assertNotEquals(oldSecond.bindingId(), newSecond.bindingId()); + assertTrue(newSecond.activationGeneration() + > oldSecond.activationGeneration()); + assertEquals(1L, newSecond.appliedChildEpoch()); + assertEquals(2, newSecond.committedReceiptIds().size(), + "the fresh occurrence catches initialization and the missing " + + "live epoch exactly once each"); + assertTrue(newSecond.committedReceiptIds().stream() + .allMatch(receipt -> receipt.contains( + newSecond.bindingId()))); + assertEquals(stableFirst.bindingId(), + occurrence(engine, ALPHA_FIRST_PATH).bindingId(), + "the continuously active occurrence retains its cursor"); + assertEquals(parentHistoryBeforeReadd + 3, + engine.history(HOST).size(), + "one external replacement plus exactly two alphaSecond " + + "catch-up applications"); + assertEquals("Live", text(engine, HOST, + ALPHA_SECOND_PATH + "/status")); + assertEquals(1L, engine.history( + PlaygroundFiveOccurrenceFixtures.ALPHA_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + assertEquals(SessionStatus.READY, + engine.readyDocument(HOST).status()); + } + } + + @Test + void oneInitializationEventBlueIdHasDistinctOccurrenceReceipts() + throws Exception { + try (TestEngine engine = initializedHost()) { + engine.appendAndDispatch( + owner(engine), + PlaygroundFiveOccurrenceFixtures.attachFive(engine)); + + DocumentRevision alphaInitialization = engine.history( + PlaygroundFiveOccurrenceFixtures.ALPHA_ID).get(0); + assertEquals(1, alphaInitialization.emittedEvents().size()); + String eventBlueId = DirectBlueIdCalculator.calculateBlueId( + alphaInitialization.emittedEvents().get(0)); + assertTrue(!eventBlueId.isBlank()); + assertEquals(2L, integer(engine, HOST, + "/alphaInitializationEventCount"), + "the Host observes the one exact initialization event at " + + "both alpha paths"); + assertEquals(eventBlueId, text(engine, HOST, + "/alphaFirstInitializationEventBlueId")); + assertEquals(eventBlueId, text(engine, HOST, + "/alphaSecondInitializationEventBlueId")); + + List alphaPaths = engine.history(HOST).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .map(revision -> revision.catchUpCause() + .orElseThrow().occurrencePath()) + .filter(path -> path.equals(ALPHA_FIRST_PATH) + || path.equals(ALPHA_SECOND_PATH)) + .toList(); + assertEquals(List.of( + ALPHA_FIRST_PATH, ALPHA_SECOND_PATH), alphaPaths); + + CoordinationTestControl.EmbeddedOccurrenceEvidence first = + occurrence(engine, ALPHA_FIRST_PATH); + CoordinationTestControl.EmbeddedOccurrenceEvidence second = + occurrence(engine, ALPHA_SECOND_PATH); + assertNotEquals(first.bindingId(), second.bindingId()); + assertEquals(1, first.committedReceiptIds().size()); + assertEquals(1, second.committedReceiptIds().size()); + assertNotEquals(first.committedReceiptIds().get(0), + second.committedReceiptIds().get(0), + "each occurrence commits its own parent application receipt"); + } + } + + private static TestEngine initializedHost() throws Exception { + TestEngine engine = TestEngine.create(); + PlaygroundFiveOccurrenceFixtures.registerChildTimelines(engine); + engine.start(HOST, resource( + PlaygroundFiveOccurrenceFixtures.HOST_RESOURCE)); + return engine; + } + + private static TestEngine initializedHostWithAlphaReattachment() + throws Exception { + TestEngine engine = TestEngine.create(); + PlaygroundFiveOccurrenceFixtures.registerChildTimelines(engine); + ExactValue alpha = PlaygroundFiveOccurrenceFixtures.alpha(engine); + String host = resource( + PlaygroundFiveOccurrenceFixtures.HOST_RESOURCE).replace( + "alphaReattachment: None", + "alphaReattachment:\n blueId: " + alpha.blueId()); + engine.start(HOST, host); + return engine; + } + + private static Timeline owner(TestEngine engine) { + return engine.timeline( + PlaygroundFiveOccurrenceFixtures.HOST_TIMELINE, + PlaygroundFiveOccurrenceFixtures.HOST_ACTOR); + } + + private static Operation attachment( + TestEngine engine, + Map documents) { + StringBuilder request = new StringBuilder("documents:\n"); + documents.forEach((key, value) -> request + .append(" ").append(key).append(":\n") + .append(" blueId: ").append(value.blueId()).append('\n')); + return Operation.exact( + "attachFiveDocuments", + "ownerChannel", + engine.exactRequest(request.toString())); + } + + private static Map orderedDocuments( + String firstKey, + ExactValue first, + String secondKey, + ExactValue second) { + Map result = new LinkedHashMap<>(); + result.put(firstKey, first); + result.put(secondKey, second); + return result; + } + + private static CoordinationTestControl.EmbeddedOccurrenceEvidence occurrence( + TestEngine engine, + String path) { + return engine.embeddedOccurrenceEvidence().stream() + .filter(evidence -> evidence.parentDocumentId().equals(HOST)) + .filter(evidence -> evidence.occurrencePath().equals(path)) + .findFirst() + .orElseThrow(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java b/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java new file mode 100644 index 0000000..9bbc82b --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceFixtures.java @@ -0,0 +1,160 @@ +package blue.coordination.integration; + +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** Shared exact fixtures for the five-occurrence Playground acceptance lane. */ +final class PlaygroundFiveOccurrenceFixtures { + static final String HOST_ID = "playground-five-occurrence-host"; + static final String HOST_RESOURCE = + "examples/playground/five-occurrence-initialization-host.yaml"; + static final String HOST_TIMELINE = + "examples/playground/five-occurrence/host"; + static final String HOST_ACTOR = "playground-owner"; + static final String ALPHA_ID = "playground-game-alpha"; + static final String BETA_ID = "playground-game-beta"; + static final String GAMMA_ID = "playground-game-gamma"; + static final String ALPHA_FIRST = "alphaFirst"; + static final String ALPHA_SECOND = "alphaSecond"; + static final String BETA_FIRST = "betaFirst"; + static final String BETA_SECOND = "betaSecond"; + static final String GAMMA = "gamma"; + + static final List DELIBERATELY_UNORDERED_KEYS = List.of( + BETA_SECOND, + ALPHA_SECOND, + GAMMA, + BETA_FIRST, + ALPHA_FIRST); + static final List REVERSE_KEYS = List.of( + ALPHA_FIRST, + BETA_FIRST, + GAMMA, + ALPHA_SECOND, + BETA_SECOND); + + private PlaygroundFiveOccurrenceFixtures() { + } + + static void registerChildTimelines(TestEngine engine) { + engine.timeline(alphaTimeline(), "playground-feed-alpha"); + engine.timeline(betaTimeline(), "playground-feed-beta"); + engine.timeline(gammaTimeline(), "playground-feed-gamma"); + } + + /** + * Retains each unique child body once, then authors the five occurrences as + * exact BlueId references. The request therefore proves both logical + * session reuse and whole-object provider reuse. + */ + static Operation attachFive(TestEngine engine) throws Exception { + return replaceDocuments(engine, DELIBERATELY_UNORDERED_KEYS); + } + + /** Authors any ordered subset of the five stable-key occurrences. */ + static Operation replaceDocuments( + TestEngine engine, + List orderedKeys) throws Exception { + ExactValue alpha = alpha(engine); + ExactValue beta = beta(engine); + ExactValue gamma = gamma(engine); + return Operation.exact( + "attachFiveDocuments", + "ownerChannel", + engine.exactRequest(referenceRequest( + alpha, beta, gamma, orderedKeys))); + } + + static String referenceRequest( + ExactValue alpha, + ExactValue beta, + ExactValue gamma) { + return referenceRequest( + alpha, beta, gamma, DELIBERATELY_UNORDERED_KEYS); + } + + static String referenceRequest( + ExactValue alpha, + ExactValue beta, + ExactValue gamma, + List orderedKeys) { + Map values = Map.of( + ALPHA_FIRST, alpha, + ALPHA_SECOND, alpha, + BETA_FIRST, beta, + BETA_SECOND, beta, + GAMMA, gamma); + Map requestedDocuments = new LinkedHashMap<>(); + for (String key : List.copyOf(orderedKeys)) { + ExactValue value = values.get(key); + if (value == null) { + throw new IllegalArgumentException( + "Unknown five-occurrence key " + key); + } + requestedDocuments.put(key, value.blueId()); + } + StringBuilder result = new StringBuilder("documents:\n"); + requestedDocuments.forEach((key, blueId) -> result + .append(" ").append(key).append(":\n") + .append(" blueId: ").append(blueId).append('\n')); + return result.toString(); + } + + static Map expectedBindings() { + return Map.of( + "/children/alphaFirst", ALPHA_ID, + "/children/alphaSecond", ALPHA_ID, + "/children/betaFirst", BETA_ID, + "/children/betaSecond", BETA_ID, + "/children/gamma", GAMMA_ID); + } + + static java.util.List expectedApplicationPaths() { + return java.util.List.of( + "/children/alphaFirst", + "/children/alphaSecond", + "/children/betaFirst", + "/children/betaSecond", + "/children/gamma"); + } + + private static ExactValue exactGame( + TestEngine engine, + String documentId, + String timelineId, + String actorId) throws Exception { + return engine.exactValue(Round12NbaFixtures.game( + documentId, timelineId, actorId)); + } + + static ExactValue alpha(TestEngine engine) throws Exception { + return exactGame( + engine, ALPHA_ID, alphaTimeline(), "playground-feed-alpha"); + } + + static ExactValue beta(TestEngine engine) throws Exception { + return exactGame( + engine, BETA_ID, betaTimeline(), "playground-feed-beta"); + } + + static ExactValue gamma(TestEngine engine) throws Exception { + return exactGame( + engine, GAMMA_ID, gammaTimeline(), "playground-feed-gamma"); + } + + static String alphaTimeline() { + return "examples/playground/five-occurrence/alpha"; + } + + static String betaTimeline() { + return "examples/playground/five-occurrence/beta"; + } + + static String gammaTimeline() { + return "examples/playground/five-occurrence/gamma"; + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceRetryTest.java b/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceRetryTest.java new file mode 100644 index 0000000..5701f52 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceRetryTest.java @@ -0,0 +1,127 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Retry proof for a partially published five-occurrence initialization. */ +final class PlaygroundFiveOccurrenceRetryTest { + @Test + void retryCompletesFiveOccurrenceFanoutWithoutReinitializingChildren() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + PlaygroundFiveOccurrenceFixtures.HOST_TIMELINE, + PlaygroundFiveOccurrenceFixtures.HOST_ACTOR); + PlaygroundFiveOccurrenceFixtures.registerChildTimelines(engine); + engine.start( + PlaygroundFiveOccurrenceFixtures.HOST_ID, + resource(PlaygroundFiveOccurrenceFixtures.HOST_RESOURCE)); + TimelineEntry attachment = engine.append( + owner, + PlaygroundFiveOccurrenceFixtures.attachFive(engine)); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.failOnceAt( + TestEngine.FailurePoint.AFTER_APPLYING_CHILD_REVISION); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + assertEquals(SessionStatus.CATCHING_UP, + engine.session(PlaygroundFiveOccurrenceFixtures.HOST_ID) + .status()); + assertEquals(1L, integer( + engine, + PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/initializationEventCount")); + assertEquals(1L, integer( + engine, + PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/revisionApplications")); + assertEquals(1L, engine.history( + PlaygroundFiveOccurrenceFixtures.HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .count(), "the failure follows one committed parent prefix"); + for (String child : childIds()) { + assertEquals(1L, initializationRevisions(engine, child), + child + " must already be initialized before retry"); + assertEquals(1L, integer( + engine, child, "/initializationCount"), child); + } + EngineTestSupport.MetricDelta failedAttempt = delta( + before, engine.metricsSnapshot()); + assertEquals(1L, + failedAttempt.counter("EXTERNAL_PROCESS_CALLS")); + assertEquals(3L, + failedAttempt.counter("DOCUMENT_INITIALIZATIONS")); + assertEquals(1L, + failedAttempt.counter("EMBEDDED_EPOCH_PROCESS_CALLS")); + engine.clearFailureInjection(); + + engine.dispatch(attachment); + EngineTestSupport.MetricDelta completed = delta( + before, engine.metricsSnapshot()); + + assertEquals(SessionStatus.READY, + engine.readyDocument( + PlaygroundFiveOccurrenceFixtures.HOST_ID).status()); + assertEquals(5L, integer( + engine, + PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/initializationEventCount")); + assertEquals(5L, integer( + engine, + PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/revisionApplications")); + assertEquals(5L, engine.history( + PlaygroundFiveOccurrenceFixtures.HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .count()); + for (String child : childIds()) { + assertEquals(1L, initializationRevisions(engine, child), + child); + assertEquals(1L, integer( + engine, child, "/initializationCount"), child); + } + assertEquals(1L, completed.counter("EXTERNAL_PROCESS_CALLS"), + "retry cannot rerun the external Host PROCESS"); + assertEquals(3L, completed.counter("DOCUMENT_INITIALIZATIONS"), + "retry cannot reinitialize a managed child"); + assertEquals(5L, + completed.counter("EMBEDDED_EPOCH_PROCESS_CALLS"), + "the committed prefix plus four remaining occurrences " + + "must each cross PROCESS exactly once"); + assertNoGenericSplitting(completed); + } + } + + private static List childIds() { + return List.of( + PlaygroundFiveOccurrenceFixtures.ALPHA_ID, + PlaygroundFiveOccurrenceFixtures.BETA_ID, + PlaygroundFiveOccurrenceFixtures.GAMMA_ID); + } + + private static long initializationRevisions( + TestEngine engine, + String child) { + return engine.history(child).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count(); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java new file mode 100644 index 0000000..8327b98 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/ProcessEmbeddedCollectionPathsIntegrationTest.java @@ -0,0 +1,115 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.language.model.Node; +import blue.language.model.NodePathEditor; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Dynamic stable-key {@code collectionPaths} membership and storage policy. */ +final class ProcessEmbeddedCollectionPathsIntegrationTest { + + @Test + void discoversAddsAndRemovesCanonicalMapMembersWithoutOrdinarySplitting() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/embedded/collection-parent", "bob"); + engine.start("embedded-collection-parent", resource( + "examples/clean/embedded-collection-parent.yaml")); + + assertEquals(Map.of(), engine.embeddedDocuments( + "embedded-collection-parent")); + assertEquals(1, engine.session("embedded-collection-parent") + .layout().physicalObjectCount()); + + EngineMetrics.MetricsSnapshot beforeFirst = + engine.metricsSnapshot(); + engine.appendAndDispatch(owner, Operation.exact( + "attachGameA", + "ownerChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/embedded-counter.yaml")))); + EngineTestSupport.MetricDelta first = delta( + beforeFirst, engine.metricsSnapshot()); + + assertEquals(Map.of( + "/games/game-a", "embedded-counter-A"), + engine.embeddedDocuments("embedded-collection-parent")); + assertEquals(2, engine.session("embedded-collection-parent") + .layout().physicalObjectCount()); + assertTrue(first.counter("layout.plansReused") > 0L); + assertTrue(first.counter("layout.collectionCatalogRefreshes") > 0L); + assertTrue(first.counter("process.embeddedEpochProcessCalls") > 0L); + assertNoGenericSplitting(first); + assertOrdinaryPayloadRemainsInline(engine); + + EngineMetrics.MetricsSnapshot beforeSecond = + engine.metricsSnapshot(); + engine.appendAndDispatch(owner, Operation.exact( + "attachEscapedGame", + "ownerChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/embedded-counter-B.yaml")))); + EngineTestSupport.MetricDelta second = delta( + beforeSecond, engine.metricsSnapshot()); + + assertEquals(Map.of( + "/games/game-a", "embedded-counter-A", + "/games/game~1a~0b", "embedded-counter-B"), + engine.embeddedDocuments("embedded-collection-parent")); + assertEquals( + List.of( + "/games/game-a", "/games/game~1a~0b"), + engine.session("embedded-collection-parent") + .layout().boundaries().stream() + .map(EmbeddedOnlyLayout.Boundary::childScopePath) + .toList()); + assertEquals(3, engine.session("embedded-collection-parent") + .layout().physicalObjectCount()); + assertTrue(second.counter("layout.plansReused") > 0L); + assertTrue(second.counter("layout.collectionCatalogRefreshes") + > 0L); + assertTrue(second.counter("process.embeddedEpochProcessCalls") + > 0L); + assertNoGenericSplitting(second); + + EngineMetrics.MetricsSnapshot beforeRemoval = + engine.metricsSnapshot(); + engine.appendAndDispatch(owner, Operation.yaml( + "removeGameA", "ownerChannel", "{}")); + EngineTestSupport.MetricDelta removal = delta( + beforeRemoval, engine.metricsSnapshot()); + + assertEquals(Map.of( + "/games/game~1a~0b", "embedded-counter-B"), + engine.embeddedDocuments("embedded-collection-parent")); + assertEquals(2, engine.session("embedded-collection-parent") + .layout().physicalObjectCount()); + assertTrue(removal.counter("layout.plansReused") > 0L); + assertTrue(removal.counter("layout.collectionCatalogRefreshes") + > 0L); + assertNoGenericSplitting(removal); + assertOrdinaryPayloadRemainsInline(engine); + } + } + + private static void assertOrdinaryPayloadRemainsInline(TestEngine engine) { + Node storedRoot = engine.session("embedded-collection-parent") + .layout().stored("/").copyNode(); + Node ordinary = NodePathEditor.getOrNull( + storedRoot, "/ordinaryPayload"); + assertTrue(ordinary != null); + assertFalse(ordinary.isReferenceOnly()); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java new file mode 100644 index 0000000..097849f --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/PublicTemporalFeederIntegrationTest.java @@ -0,0 +1,542 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.CoordinationMetrics; +import blue.coordination.api.DocumentId; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineAppendReceipt; +import blue.coordination.api.TimelineEntry; +import blue.coordination.api.SessionStatus; +import blue.coordination.internal.CoordinationTestControl; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Public contracts for exact append and environment-selected global drain. */ +final class PublicTemporalFeederIntegrationTest { + private static final DocumentId COUNTER = DocumentId.of("counter"); + private static final DocumentId COUNTER_A = DocumentId.of("counter-a"); + private static final DocumentId COUNTER_B = DocumentId.of("counter-b"); + private static final String ALICE_TIMELINE = + "examples/clean-counter/alice"; + private static final String BOB_TIMELINE = + "examples/clean-counter/bob"; + private static final long T0 = 1_700_000_000_000_000L; + + @Test + void exactNodeAdmissionIsIdempotentAndRejectsClaimedIdentityForgery() + throws Exception { + try (CoordinationEngine source = CoordinationEngine.inMemory(); + CoordinationEngine target = CoordinationEngine.inMemory()) { + Timeline sourceAlice = source.registerTimeline( + ALICE_TIMELINE, "alice"); + TimelineEntry canonical = source.append( + sourceAlice, + Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + + target.registerTimeline(ALICE_TIMELINE, "alice"); + target.exactValue("amount: 3"); + Node exactEntry = canonical.exactEvent().copyNode(); + + TimelineAppendReceipt admitted = + target.appendTimelineEntry(exactEntry); + assertTrue(admitted.stored()); + assertEquals(canonical.blueId(), admitted.entry().blueId()); + assertEquals(1, admitted.journalEntryCount()); + assertEquals(1, target.metrics().journalEntryCount()); + assertEquals(0L, target.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + assertTrue(target.metrics().nanos( + CoordinationMetrics.Phase.APPEND_TOTAL) > 0L); + + TimelineAppendReceipt duplicate = target.appendTimelineEntry( + canonical.exactEvent().copyNode()); + assertFalse(duplicate.stored()); + assertEquals(canonical.blueId(), duplicate.entry().blueId()); + assertEquals(1, duplicate.journalEntryCount()); + assertEquals(1, target.metrics().journalEntryCount()); + + Node delegated = canonical.exactEvent().copyNode() + .properties("onBehalfOf", + new Node().blueId(canonical.blueId())); + IllegalArgumentException unsupportedMandate = assertThrows( + IllegalArgumentException.class, + () -> target.appendTimelineEntry(delegated)); + assertTrue(unsupportedMandate.getMessage().contains( + "Mandate resolver")); + assertEquals(1, target.metrics().journalEntryCount()); + + Node missingDocument = canonical.exactEvent().copyNode(); + missingDocument.getProperties().get("message").properties( + "requireExactDocumentVersion", new Node().value(true)); + assertThrows(IllegalArgumentException.class, + () -> target.appendTimelineEntry(missingDocument)); + assertEquals(1, target.metrics().journalEntryCount()); + + Node forged = canonical.exactEvent().copyNode(); + forged.getProperties() + .get("actor") + .getProperties() + .get("accountId") + .value("mallory"); + forged.blueId(canonical.blueId()); + + assertThrows( + IllegalArgumentException.class, + () -> target.appendTimelineEntry(forged)); + assertEquals(1, target.metrics().journalEntryCount()); + + target.drain(); + TimelineAppendReceipt replayAfterDrain = + target.appendTimelineEntry(canonical.exactEvent().copyNode()); + assertFalse(replayAfterDrain.stored()); + assertEquals(1, replayAfterDrain.journalEntryCount()); + } + } + + @Test + void oneExactAdmissionBuildsAndStoresOneEntryForSeveralRecipients() + throws Exception { + try (CoordinationEngine source = CoordinationEngine.inMemory(); + CoordinationEngine target = CoordinationEngine.inMemory()) { + Timeline sourceAlice = source.registerTimeline( + ALICE_TIMELINE, "alice"); + TimelineEntry canonical = source.append( + sourceAlice, + Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + + target.registerTimeline(ALICE_TIMELINE, "alice"); + ExactValue retainedRequest = target.exactValue("amount: 3"); + assertEquals(canonical.exactRequest().blueId(), + retainedRequest.blueId()); + target.startDocument(COUNTER_A, counterYaml(COUNTER_A)); + target.startDocument(COUNTER_B, counterYaml(COUNTER_B)); + CoordinationTestControl control = + CoordinationTestControl.attach(target); + CoordinationTestControl.MetricsSnapshot before = + control.metricsSnapshot(); + + TimelineAppendReceipt admission = target.appendTimelineEntry( + canonical.exactEvent().copyNode()); + CoordinationTestControl.MetricsSnapshot after = + control.metricsSnapshot(); + + assertTrue(admission.stored()); + assertEquals(canonical.blueId(), admission.entry().blueId()); + assertEquals(1, admission.journalEntryCount()); + assertEquals(1L, diagnosticDelta( + before, after, "append.entriesBuilt")); + assertEquals(1L, diagnosticDelta( + before, after, "wholeObjectStore.insertions")); + assertEquals(1L, diagnosticDelta( + before, after, "journal.entriesStoredWhole")); + assertEquals(2, target.routeTargetCount(admission.entry())); + + ProcessingDrainReceipt drained = target.drain(); + assertEquals(List.of(COUNTER_A, COUNTER_B), + drained.outcomesFor(admission.entry().blueId()).stream() + .map(outcome -> outcome.documentId()) + .toList()); + assertEquals(3L, counter(target, COUNTER_A)); + assertEquals(3L, counter(target, COUNTER_B)); + assertEquals(1, target.metrics().journalEntryCount()); + } + } + + @Test + void normalReadsFailClosedUntilAuditStateBecomesReady() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline(ALICE_TIMELINE, "alice"); + engine.append(alice, Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + CoordinationTestControl control = + CoordinationTestControl.attach(engine); + control.makeHistoricalUnavailable("provider window pending"); + + var admitted = engine.startDocument( + COUNTER, + resource("examples/clean/counter.yaml"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + assertEquals(SessionStatus.CATCHING_UP, admitted.status()); + assertEquals(SessionStatus.CATCHING_UP, + engine.auditDocument(COUNTER).status()); + CoordinationException notReady = assertThrows( + CoordinationException.class, + () -> engine.document(COUNTER)); + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_READY, + notReady.code()); + assertEquals(1, engine.history(COUNTER).size(), + "audit history stays available during catch-up"); + + control.makeHistoricalAvailable(); + assertTrue(engine.drain().quiescent()); + assertEquals(SessionStatus.READY, + engine.document(COUNTER).status()); + assertEquals(3L, counter(engine)); + } + } + + @Test + void boundedDrainResumesAnOpenEntryWithoutRepeatingFrozenProcess() + throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline(ALICE_TIMELINE, "alice"); + engine.startDocument(COUNTER_A, counterYaml(COUNTER_A)); + engine.startDocument(COUNTER_B, counterYaml(COUNTER_B)); + TimelineEntry first = engine.append(alice, Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + TimelineEntry second = engine.append(alice, Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + CoordinationTestControl control = + CoordinationTestControl.attach(engine); + long callsBefore = engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS); + + ProcessingDrainReceipt transitionPause = engine.drain( + new CoordinationEngine.DrainBudget(1L, 10L)); + assertTrue(transitionPause.paused()); + assertFalse(transitionPause.quiescent()); + assertFalse(transitionPause.blocked()); + assertEquals(1L, transitionPause.committedProcessTransitions()); + assertEquals(List.of(COUNTER_A), transitionPause.outcomes().stream() + .map(outcome -> outcome.documentId()).toList()); + assertTrue(transitionPause.processedEntries().isEmpty(), + "a partially committed entry is not a completed entry"); + assertTrue(transitionPause.processedThrough().isEmpty()); + + control.restartFromStores(); + ProcessingDrainReceipt selectionPause = engine.drain( + new CoordinationEngine.DrainBudget(10L, 1L)); + assertTrue(selectionPause.paused()); + assertFalse(selectionPause.blocked()); + assertEquals(1L, selectionPause.committedProcessTransitions()); + assertEquals(List.of(COUNTER_B), selectionPause.outcomes().stream() + .map(outcome -> outcome.documentId()).toList(), + "resume reports only the PROCESS committed in this call"); + assertEquals(List.of(first.blueId()), + entryIds(selectionPause.processedEntries())); + + ProcessingDrainReceipt completed = engine.drain( + new CoordinationEngine.DrainBudget(10L, 1L)); + assertFalse(completed.paused()); + assertFalse(completed.blocked()); + assertTrue(completed.quiescent()); + assertEquals(2L, completed.committedProcessTransitions()); + assertEquals(List.of(COUNTER_A, COUNTER_B), + completed.outcomes().stream() + .map(outcome -> outcome.documentId()).toList()); + assertEquals(List.of(second.blueId()), + entryIds(completed.processedEntries())); + assertEquals(6L, counter(engine, COUNTER_A)); + assertEquals(6L, counter(engine, COUNTER_B)); + assertEquals(4L, engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS) + - callsBefore, + "resumption cannot rerun a committed frozen PROCESS"); + assertTrue(transitionPause.elapsedNanos() > 0L); + assertTrue(selectionPause.elapsedNanos() > 0L); + assertTrue(completed.elapsedNanos() > 0L); + } + } + + @Test + void appendStoresWorkWithoutInvokingProcess() throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + ALICE_TIMELINE, "alice"); + engine.startDocument( + COUNTER, resource("examples/clean/counter.yaml")); + long processBefore = engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS); + + TimelineEntry entry = engine.append( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + + assertEquals(1, engine.metrics().journalEntryCount()); + assertEquals(0L, counter(engine)); + assertEquals(0L, engine.document(COUNTER).epoch()); + assertEquals(processBefore, engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + + ProcessingDrainReceipt drained = engine.drain(); + assertEquals(List.of(entry.blueId()), entryIds( + drained.processedEntries())); + assertEquals(1, drained.outcomesFor(entry.blueId()).size()); + assertTrue(drained.quiescent()); + assertEquals(3L, counter(engine)); + assertEquals(1L, engine.document(COUNTER).epoch()); + assertTrue(engine.metrics().nanos( + CoordinationMetrics.Phase.PROCESS_ROUTE_LOOKUP) > 0L); + } + } + + @Test + void exactDocumentTargetUsesCurrentOrAnyRetainedEpochWithoutProcessingOnAppend() + throws Exception { + try (CoordinationEngine source = CoordinationEngine.inMemory(); + CoordinationEngine target = CoordinationEngine.inMemory()) { + Timeline sourceAlice = source.registerTimeline( + ALICE_TIMELINE, "alice"); + TimelineEntry template1 = source.appendAt(sourceAlice, + Operation.yaml("increment", "aliceChannel", "amount: 3"), + T0 + 100L); + TimelineEntry template2 = source.appendAt(sourceAlice, + Operation.yaml("increment", "aliceChannel", "amount: 3"), + T0 + 200L); + TimelineEntry template3 = source.appendAt(sourceAlice, + Operation.yaml("increment", "aliceChannel", "amount: 3"), + T0 + 300L); + TimelineEntry template4 = source.appendAt(sourceAlice, + Operation.yaml("increment", "aliceChannel", "amount: 3"), + T0 + 400L); + + target.registerTimeline(ALICE_TIMELINE, "alice"); + target.exactValue("amount: 3"); + target.startDocument(COUNTER_A, counterYaml(COUNTER_A)); + target.startDocument(COUNTER_B, counterYaml(COUNTER_B)); + ExactValue initialA = target.document(COUNTER_A).current(); + long processBefore = target.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS); + + TimelineAppendReceipt current = target.appendTimelineEntry( + targeted(template1, initialA, true, null)); + TimelineAppendReceipt staleExact = target.appendTimelineEntry( + targeted(template2, initialA, true, + current.entry().blueId())); + TimelineAppendReceipt retained = target.appendTimelineEntry( + targeted(template3, initialA, false, + staleExact.entry().blueId())); + TimelineAppendReceipt implicitRetained = target.appendTimelineEntry( + targeted(template4, initialA, null, + retained.entry().blueId())); + + assertEquals(processBefore, target.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + assertEquals("external-provider", current.entry().exactEvent() + .canonicalAt("/source").getValue()); + assertEquals(initialA.blueId(), current.entry().exactEvent() + .canonicalAt("/message/document").getReferenceBlueId()); + assertEquals(Boolean.TRUE, current.entry().exactEvent() + .canonicalAt("/message/requireExactDocumentVersion") + .getValue()); + + ProcessingDrainReceipt drained = target.drain(); + assertEquals(List.of(current.entry().blueId(), + staleExact.entry().blueId(), + retained.entry().blueId(), + implicitRetained.entry().blueId()), + entryIds(drained.processedEntries())); + assertEquals(List.of(COUNTER_A), drained.outcomesFor( + current.entry().blueId()).stream() + .map(outcome -> outcome.documentId()).toList()); + assertTrue(drained.outcomesFor( + staleExact.entry().blueId()).isEmpty()); + assertEquals(List.of(COUNTER_A), drained.outcomesFor( + retained.entry().blueId()).stream() + .map(outcome -> outcome.documentId()).toList()); + assertEquals(List.of(COUNTER_A), drained.outcomesFor( + implicitRetained.entry().blueId()).stream() + .map(outcome -> outcome.documentId()).toList()); + assertEquals(9L, counter(target, COUNTER_A)); + assertEquals(0L, counter(target, COUNTER_B)); + } + } + + @Test + void drainSelectsShuffledCrossTimelineEntriesByExternalOrder() + throws Exception { + try (CoordinationEngine engine = counterEngine()) { + Timeline alice = engine.registerTimeline( + ALICE_TIMELINE, "alice"); + Timeline bob = engine.registerTimeline(BOB_TIMELINE, "bob"); + + TimelineEntry middle = engine.appendAt( + bob, + Operation.yaml( + "decrement", "bobChannel", "amount: 1"), + T0 + 200L); + TimelineEntry early = engine.appendAt( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 3"), + T0 + 100L); + TimelineEntry late = engine.appendAt( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 10"), + T0 + 300L); + + assertEquals( + List.of(1L, 2L, 3L), + List.of( + middle.globalSequence(), + early.globalSequence(), + late.globalSequence())); + + ProcessingDrainReceipt drained = engine.drain(); + + assertEquals( + List.of(early.blueId(), middle.blueId(), late.blueId()), + entryIds(drained.processedEntries())); + assertEquals( + List.of(early.blueId(), middle.blueId(), late.blueId()), + committedSourceEntryIds(engine)); + assertEquals(12L, counter(engine)); + assertTrue(drained.quiescent()); + } + } + + @Test + void drainThroughProcessesEveryEarlierEntryAndIsIdempotent() + throws Exception { + try (CoordinationEngine engine = counterEngine()) { + Timeline alice = engine.registerTimeline( + ALICE_TIMELINE, "alice"); + Timeline bob = engine.registerTimeline(BOB_TIMELINE, "bob"); + + TimelineEntry middle = engine.appendAt( + bob, + Operation.yaml( + "decrement", "bobChannel", "amount: 1"), + T0 + 200L); + TimelineEntry early = engine.appendAt( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 3"), + T0 + 100L); + TimelineEntry late = engine.appendAt( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 10"), + T0 + 300L); + + ProcessingDrainReceipt first = engine.drainThrough( + middle.sourceOrderKey()); + assertEquals( + List.of(early.blueId(), middle.blueId()), + entryIds(first.processedEntries())); + assertEquals(2L, counter(engine)); + assertEquals(2L, engine.document(COUNTER).epoch()); + assertTrue(first.quiescent()); + + long processBeforeRetry = engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS); + ProcessingDrainReceipt duplicate = engine.drainThrough( + middle.sourceOrderKey()); + assertTrue(duplicate.processedEntries().isEmpty()); + assertTrue(duplicate.outcomes().isEmpty()); + assertTrue(duplicate.quiescent()); + assertEquals(processBeforeRetry, engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + assertEquals(2L, counter(engine)); + + ProcessingDrainReceipt remainder = engine.drainThrough( + late.sourceOrderKey()); + assertEquals( + List.of(late.blueId()), + entryIds(remainder.processedEntries())); + assertEquals(12L, counter(engine)); + assertEquals(3L, engine.document(COUNTER).epoch()); + assertTrue(remainder.quiescent()); + } + } + + private static CoordinationEngine counterEngine() throws Exception { + CoordinationEngine engine = CoordinationEngine.inMemory(); + try { + engine.startDocument( + COUNTER, resource("examples/clean/counter.yaml")); + return engine; + } catch (RuntimeException | Error failure) { + engine.close(); + throw failure; + } + } + + private static List entryIds(List entries) { + return entries.stream().map(TimelineEntry::blueId).toList(); + } + + private static List committedSourceEntryIds( + CoordinationEngine engine) { + return engine.history(COUNTER).stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .map(TimelineEntry::blueId) + .toList(); + } + + private static long counter(CoordinationEngine engine) { + return counter(engine, COUNTER); + } + + private static long counter( + CoordinationEngine engine, + DocumentId documentId) { + Object value = engine.document(documentId) + .valueAt("/counter") + .copyNode() + .getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected numeric /counter, got " + value); + } + + private static String counterYaml(DocumentId documentId) + throws Exception { + return resource("examples/clean/counter.yaml").replace( + "documentId: counter", "documentId: " + documentId.value()); + } + + private static Node targeted( + TimelineEntry template, + ExactValue document, + Boolean exact, + String previousBlueId) { + Node entry = template.exactEvent().copyNode(); + Node message = entry.getProperties().get("message"); + message.properties("document", document.referenceNode()); + if (exact == null) { + message.getProperties().remove("requireExactDocumentVersion"); + } else { + message.properties("requireExactDocumentVersion", + new Node().value(exact)); + } + entry.properties("source", new Node().value("external-provider")); + if (previousBlueId == null) { + entry.getProperties().remove("prevEntry"); + } else { + entry.properties("prevEntry", new Node().blueId(previousBlueId)); + } + return entry; + } + + private static long diagnosticDelta( + CoordinationTestControl.MetricsSnapshot before, + CoordinationTestControl.MetricsSnapshot after, + String name) { + return after.counters().getOrDefault(name, 0L) + - before.counters().getOrDefault(name, 0L); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java b/src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java new file mode 100644 index 0000000..81b0136 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/RemovalCycleAndReattachmentTest.java @@ -0,0 +1,178 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +final class RemovalCycleAndReattachmentTest { + @Test + void detachedParentStopsMovingAndReattachUsesFreshCursorWithoutReplay() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + long firstGeneration = activationGeneration(engine); + engine.appendAndDispatch( + parentTimeline, + Operation.yaml( + "detachChild", "ownerChannel", "{}")); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty()); + + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2")); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty(), + "removed inverse edge must not receive live revisions"); + int childHistorySize = engine.history( + "embedded-counter-A").size(); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(3L, integer( + engine, "embedded-state-parent", "/child/counter")); + assertEquals(3L, work.counter("childRevisionApplications"), + "reattachment creates a fresh generation and applies " + + "initialization plus both known child epochs"); + assertEquals(0L, work.counter("childHistoricalProcessCalls")); + assertTrue(activationGeneration(engine) > firstGeneration); + assertEquals(childHistorySize, + engine.history("embedded-counter-A").size()); + assertEquals(1L, engine.history("embedded-counter-A").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + } + } + + @Test + void directCycleFailsBeforeAnySessionLinkCursorOrReceiptPublishes() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String parentInitial = resource( + "examples/clean/embedded-state-parent.yaml"); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start("embedded-state-parent", parentInitial); + var cycle = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(parentInitial))); + + assertThrows( + IllegalStateException.class, + () -> engine.dispatch(cycle)); + assertEquals(0L, engine.session( + "embedded-state-parent").epoch()); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status()); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty()); + } + } + + @Test + void threeRootCycleFailsBeforeAttemptedEdgeOrReceiptPublishes() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String template = resource( + "examples/clean/embedded-state-parent.yaml"); + String first = parent(template, "a"); + String second = parent(template, "b"); + String third = parent(template, "c"); + engine.start("embedded-state-parent-a", first); + engine.start("embedded-state-parent-b", second); + engine.start("embedded-state-parent-c", third); + Timeline firstTimeline = engine.timeline( + "examples/embedded/state-parent-a", "bob-a"); + Timeline secondTimeline = engine.timeline( + "examples/embedded/state-parent-b", "bob-b"); + Timeline thirdTimeline = engine.timeline( + "examples/embedded/state-parent-c", "bob-c"); + engine.appendAndDispatch(firstTimeline, Operation.exact( + "attachChild", "ownerChannel", + engine.embeddedDocumentRequest(second))); + engine.appendAndDispatch(secondTimeline, Operation.exact( + "attachChild", "ownerChannel", + engine.embeddedDocumentRequest(third))); + + var closingEdge = engine.append( + thirdTimeline, + Operation.exact( + "attachChild", "ownerChannel", + engine.embeddedDocumentRequest(first))); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + assertThrows(IllegalStateException.class, + () -> engine.dispatch(closingEdge)); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertTrue(engine.embeddedDocuments( + "embedded-state-parent-c").isEmpty()); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent-c").status()); + assertEquals(0L, engine.session( + "embedded-state-parent-c").epoch()); + assertEquals(0L, work.counter("deliveryReceiptsCommitted")); + assertEquals(0L, work.counter( + "revisionApplicationReceiptsCommitted")); + } + } + + private static long activationGeneration(TestEngine engine) { + return engine.catchUpPlans().stream() + .filter(plan -> plan.link().parentDocumentId().value().equals( + "embedded-state-parent")) + .filter(plan -> plan.link().occurrencePath().equals("/child")) + .mapToLong(plan -> plan.link().activationGeneration()) + .max().orElseThrow(); + } + + private static String parent(String template, String suffix) { + return template + .replace("embedded-state-parent", + "embedded-state-parent-" + suffix) + .replace("examples/embedded/state-parent", + "examples/embedded/state-parent-" + suffix) + .replace("accountId: bob", "accountId: bob-" + suffix); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/RetryStructuralCountersIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/RetryStructuralCountersIntegrationTest.java new file mode 100644 index 0000000..090e4be --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/RetryStructuralCountersIntegrationTest.java @@ -0,0 +1,124 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Production retry paths account for any actual duplicate frozen PROCESS. */ +final class RetryStructuralCountersIntegrationTest { + @Test + void graphRetryReconcilesACommittedParentWithoutAnotherProcess() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + var attachment = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/embedded-counter.yaml")))); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STAGING_CHILD_SESSION); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + assertEquals(1L, engine.session( + "embedded-state-parent").epoch()); + assertEquals(SessionStatus.CATCHING_UP, engine.session( + "embedded-state-parent").status()); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + engine.dispatch(attachment); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + + assertTrue(retry.counters().containsKey( + "temporal.parentProcessRerunsOnGraphRetry"), + "the graph-retry monitor must produce its raw source"); + assertEquals(0L, retry.counter( + "process.externalInvocationsStarted")); + assertEquals(0L, retry.counter( + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY")); + assertEquals(0L, retry.counter( + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY")); + EngineTestSupport.assertNoGenericSplitting(retry); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status()); + } + } + + @Test + void parentRetryReconcilesACommittedChildWithoutAnotherProcess() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childSource = resource( + "examples/clean/embedded-counter.yaml"); + engine.start("embedded-counter-A", childSource); + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childSource))); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + var childEntry = engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 4")); + + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STATE_SWAP_BEFORE_RETURN); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(childEntry)); + assertEquals(4L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(0L, integer( + engine, "embedded-state-parent", "/child/counter")); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + engine.dispatch(childEntry); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + + assertTrue(retry.counters().containsKey( + "temporal.childProcessRerunsOnParentRetry"), + "the parent-retry monitor must produce its raw source"); + assertEquals(0L, retry.counter( + "process.externalInvocationsStarted")); + assertEquals(1L, retry.counter( + "EMBEDDED_EPOCH_PROCESS_CALLS")); + assertEquals(0L, retry.counter( + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY")); + assertEquals(0L, retry.counter( + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY")); + EngineTestSupport.assertNoGenericSplitting(retry); + assertEquals(4L, integer( + engine, "embedded-state-parent", "/child/counter")); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java new file mode 100644 index 0000000..7d9be4e --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/Round10InitializationIdentityIntegrationTest.java @@ -0,0 +1,521 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.snapshot.FrozenNode; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Focused Round 10 ordering and historical-state identity acceptance. */ +final class Round10InitializationIdentityIntegrationTest { + private static final long T0 = 1_730_000_000_000_000L; + + @Test + void authoredManagedChildGetsItsOwnEpochZeroBeforeParentApplication() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + engine.start("initial-embedded-parent", resource( + "examples/clean/initial-embedded-parent.yaml")); + + List parent = engine.history( + "initial-embedded-parent"); + List child = engine.history( + "initial-embedded-child"); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION), + parent.stream().map(DocumentRevision::kind).toList()); + assertEquals(List.of(DocumentRevision.Kind.INITIALIZATION), + child.stream().map(DocumentRevision::kind).toList()); + assertEquals(child.get(0).before().orElseThrow().blueId(), + parent.get(0).after().canonicalBlueIdAt("/child")); + assertEquals(child.get(0).after().blueId(), + parent.get(1).after().canonicalBlueIdAt("/child")); + assertEquals(SessionStatus.READY, + engine.session("initial-embedded-parent").status()); + } + } + + @Test + void unavailableInitialChildHistoryCannotPublishReadyState() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline rootTimeline = engine.timeline( + "examples/embedded/initial-parent", "bob"); + engine.appendAt( + rootTimeline, + Operation.yaml( + "incrementRoot", "ownerChannel", "amount: 4"), + T0 + 50L); + engine.makeHistoricalUnavailable("provider unavailable"); + engine.start( + "initial-embedded-parent", + resource("examples/clean/initial-embedded-parent.yaml"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + + assertEquals(SessionStatus.CATCHING_UP, + engine.session("initial-embedded-parent").status()); + engine.restartFromStores(); + assertEquals(SessionStatus.CATCHING_UP, + engine.session("initial-embedded-parent").status()); + engine.makeHistoricalAvailable(); + assertTrue(engine.drain().quiescent()); + assertEquals(SessionStatus.READY, + engine.session("initial-embedded-parent").status()); + assertEquals(4L, integer( + engine, "initial-embedded-parent", "/rootCounter")); + } + } + + @Test + void initialChildAndRootHistoryMergeByGlobalSourceOrder() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline rootTimeline = engine.timeline( + "examples/embedded/initial-parent", "bob"); + Timeline childTimeline = engine.timeline( + "examples/embedded/initial", "alice"); + TimelineEntry rootFirst = engine.appendAt( + rootTimeline, + Operation.yaml( + "incrementRoot", "ownerChannel", "amount: 4"), + T0 + 100L); + TimelineEntry childSecond = engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 7"), + T0 + 200L); + + engine.start( + "initial-embedded-parent", + resource("examples/clean/initial-embedded-parent.yaml"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + + List history = engine.history( + "initial-embedded-parent"); + assertEquals(List.of( + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.TIMELINE_ENTRY, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION), + history.subList(1, history.size()).stream() + .map(DocumentRevision::kind) + .toList()); + assertEquals(List.of( + history.get(0).causalEntryBlueId().orElseThrow(), + rootFirst.blueId(), + childSecond.blueId()), + history.subList(1, history.size()).stream() + .map(revision -> revision.causalEntryBlueId() + .orElseThrow()) + .toList()); + DocumentRevision rootRevision = history.get(2); + assertEquals(0L, childCounter( + rootRevision.before().orElseThrow()), + "the earlier Root entry cannot observe future child history"); + assertEquals(7L, childCounter(history.get(3))); + } + } + + @Test + void failedHistoricalStartRetainsCommittedAdmissionAndRestartResumes() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline rootTimeline = engine.timeline( + "examples/embedded/initial-parent", "bob"); + engine.appendAt( + rootTimeline, + Operation.yaml( + "incrementRoot", "ownerChannel", "amount: 4"), + T0 + 100L); + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STATE_SWAP_BEFORE_RETURN); + + assertThrows(RuntimeException.class, () -> engine.start( + "initial-embedded-parent", + resource("examples/clean/initial-embedded-parent.yaml"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null)); + assertEquals(2, engine.documentCount(), + "the committed Root and initialized child must be retained"); + assertEquals(SessionStatus.CATCHING_UP, + engine.session("initial-embedded-parent").status()); + + engine.clearFailureInjection(); + engine.restartFromStores(); + assertTrue(engine.drain().quiescent()); + assertEquals(SessionStatus.READY, + engine.session("initial-embedded-parent").status()); + assertEquals(4L, integer( + engine, "initial-embedded-parent", "/rootCounter")); + assertEquals(1L, engine.history("initial-embedded-parent").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.TIMELINE_ENTRY) + .count(), "restart must reconcile, not rerun, Root PROCESS"); + } + } + + @Test + void failedHistoricalStartBeforeFirstCommitIsDeltaCleanAndRetryable() + throws Exception { + String authored = resource( + "examples/clean/initial-embedded-parent.yaml"); + try (TestEngine engine = TestEngine.create()) { + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_STAGING_CHILD_SESSION); + + assertThrows(RuntimeException.class, () -> engine.start( + "initial-embedded-parent", + authored, + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null)); + assertEquals(0, engine.documentCount(), + "an admission with no committed transition must vanish"); + assertEquals(0, engine.routeRowCount()); + + engine.clearFailureInjection(); + engine.start( + "initial-embedded-parent", + authored, + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + assertEquals(SessionStatus.READY, + engine.session("initial-embedded-parent").status()); + assertEquals(2, engine.documentCount()); + } + } + + @Test + void invalidTopLevelCompletenessEvidenceBlocksPendingAdmission() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline rootTimeline = engine.timeline( + "examples/embedded/initial-parent", "bob"); + engine.appendAt( + rootTimeline, + Operation.yaml( + "incrementRoot", "ownerChannel", "amount: 4"), + T0 + 100L); + engine.makeHistoricalUnavailable("provider unavailable"); + engine.start( + "initial-embedded-parent", + resource("examples/clean/initial-embedded-parent.yaml"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + + engine.invalidateHistoricalEvidence("invalid provider cursor"); + assertThrows(RuntimeException.class, engine::drain); + assertEquals(SessionStatus.BLOCKED, + engine.session("initial-embedded-parent").status()); + engine.restartFromStores(); + assertEquals(SessionStatus.BLOCKED, + engine.session("initial-embedded-parent").status()); + assertThrows(RuntimeException.class, engine::drain); + } + } + + @Test + void initializationEpochPrecedesHistoricalProcessEvenWhenHistoryIsEarlier() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + var firstHistorical = engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1"), + T0 + 100L); + engine.appendAt( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2"), + T0 + 200L); + + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + var attachment = engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial)), + T0 + 1_000L); + assertTrue(firstHistorical.sourceOrderKey().compareTo( + attachment.sourceOrderKey()) < 0, + "the child history must be strictly before attachment"); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.dispatch(attachment); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + List applications = embeddedApplications( + engine, "embedded-state-parent"); + assertEquals(List.of(0L, 1L, 3L), applications.stream() + .map(Round10InitializationIdentityIntegrationTest + ::childCounter) + .toList(), + "initialization must cross the parent PROCESS boundary " + + "before any H rootHistory = engine.history( + "embedded-state-parent"); + assertEquals(List.of( + DocumentRevision.Kind.TIMELINE_ENTRY, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.TIMELINE_ENTRY), + rootHistory.subList(1, rootHistory.size()).stream() + .map(DocumentRevision::kind) + .toList()); + assertEquals(List.of( + r1.blueId(), + r1.blueId(), + c1.blueId(), + r2.blueId()), + rootHistory.subList(1, rootHistory.size()).stream() + .map(revision -> revision.causalEntryBlueId() + .orElseThrow()) + .toList()); + + DocumentRevision r2Revision = rootHistory.get( + rootHistory.size() - 1); + assertEquals(7L, childCounter( + r2Revision.before().orElseThrow()), + "R2 must PROCESS the exact Root state containing C1"); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty()); + assertEquals(7L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(List.of(c1.blueId()), engine.history( + "embedded-counter-A").stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .map(TimelineEntry::blueId) + .toList(), + "the child must not join its introducing R1 frame"); + } + } + + @Test + void knownHistoricalStateAppliesOnlyEpochsAfterTheSuppliedState() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + incrementAt(engine, childTimeline, T0 + 100L, 1); + ExactValue knownEpochOne = engine.history( + "embedded-counter-A").get(1).after(); + incrementAt(engine, childTimeline, T0 + 200L, 2); + incrementAt(engine, childTimeline, T0 + 300L, 3); + int childHistoryBefore = engine.history( + "embedded-counter-A").size(); + + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + engine.dispatch(engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(knownEpochOne)), + T0 + 1_000L)); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + List parentHistory = engine.history( + "embedded-state-parent"); + assertEquals(1L, childCounter(parentHistory.get(1)), + "the attachment commit must retain the supplied epoch"); + assertEquals(List.of(3L, 6L), embeddedApplications( + engine, "embedded-state-parent").stream() + .map(Round10InitializationIdentityIntegrationTest + ::childCounter) + .toList(), + "only epochs two and three are missing from epoch one"); + assertEquals(2L, work.counter("childRevisionApplications")); + assertEquals(0L, work.counter("childHistoricalProcessCalls")); + assertEquals(childHistoryBefore, + engine.history("embedded-counter-A").size()); + assertEquals(6L, integer( + engine, "embedded-state-parent", "/child/counter")); + } + } + + @Test + void unknownDivergentStateRejectsBeforeParentOrTopologyCommit() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2")); + + engine.start( + "embedded-state-parent", + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + int parentHistoryBefore = engine.history( + "embedded-state-parent").size(); + int childHistoryBefore = engine.history( + "embedded-counter-A").size(); + String parentStateBefore = engine.history( + "embedded-state-parent").get(parentHistoryBefore - 1) + .after().blueId(); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + String divergent = childInitial.replace( + "counter: 0", "counter: 99"); + IllegalStateException failure = assertThrows( + IllegalStateException.class, + () -> engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(divergent)))); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertTrue(failure.getMessage().contains( + "Invalid admission evidence: unknown state"), + failure::getMessage); + assertEquals(0L, engine.session( + "embedded-state-parent").epoch()); + assertEquals(SessionStatus.READY, engine.session( + "embedded-state-parent").status()); + assertEquals(parentHistoryBefore, + engine.history("embedded-state-parent").size()); + assertEquals(parentStateBefore, engine.history( + "embedded-state-parent").get(parentHistoryBefore - 1) + .after().blueId()); + assertTrue(engine.embeddedDocuments( + "embedded-state-parent").isEmpty()); + assertEquals(childHistoryBefore, + engine.history("embedded-counter-A").size()); + assertEquals(0L, work.counter("deliveryReceiptsCommitted")); + assertEquals(0L, work.counter( + "temporal.graphGenerationsPublished")); + } + } + + private static void incrementAt( + TestEngine engine, + Timeline timeline, + long timestamp, + int amount) { + engine.dispatch(engine.appendAt( + timeline, + Operation.yaml( + "increment", "ownerChannel", "amount: " + amount), + timestamp)); + } + + private static List embeddedApplications( + TestEngine engine, + String parentDocumentId) { + return engine.history(parentDocumentId).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION) + .toList(); + } + + private static long childCounter(DocumentRevision revision) { + return childCounter(revision.after()); + } + + private static long childCounter(ExactValue state) { + FrozenNode value = state.canonicalAt("/child/counter"); + if (value == null || value.getValue() == null) { + throw new AssertionError("Missing /child/counter in parent revision"); + } + Object scalar = value.getValue(); + if (scalar instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (scalar instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected numeric child counter, got " + scalar); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java b/src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java new file mode 100644 index 0000000..691db7b --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java @@ -0,0 +1,115 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** Deterministic source builders shared by the Round 12 lifecycle scenarios. */ +final class Round12NbaFixtures { + static final String GAME_RESOURCE = + "examples/round12/nba-lifecycle-game.yaml"; + static final String HOST_RESOURCE = + "examples/round12/nba-lifecycle-host.yaml"; + static final String PATH_HOST_RESOURCE = + "examples/round12/dynamic-path-host.yaml"; + static final String COLLECTION_HOST_RESOURCE = + "examples/round12/dynamic-collection-host.yaml"; + + private Round12NbaFixtures() { + } + + static String game( + String documentId, + String timelineId, + String actorId) throws Exception { + return EngineTestSupport.resource(GAME_RESOURCE) + .replace("documentId: nba-lifecycle-game", + "documentId: " + documentId) + .replace("timelineId: examples/round12/nba/game", + "timelineId: " + timelineId) + .replace("accountId: nba-feed", + "accountId: " + actorId); + } + + static String host( + String documentId, + String timelineId, + String actorId) throws Exception { + return EngineTestSupport.resource(HOST_RESOURCE) + .replace("documentId: nba-lifecycle-host", + "documentId: " + documentId) + .replace("timelineId: examples/round12/nba/host", + "timelineId: " + timelineId) + .replace("accountId: host-owner", + "accountId: " + actorId) + .replace("timelineId: coordination/internal/round12/nba-host", + "timelineId: coordination/internal/" + documentId); + } + + static String dynamicPathHost(String exactGameYaml) throws Exception { + return EngineTestSupport.resource(PATH_HOST_RESOURCE).replace( + "game: __GAME_DOCUMENT__", + "game:\n" + EngineTestSupport.indent( + exactGameYaml.strip(), 2)); + } + + static String dynamicCollectionHost( + Map exactGamesByKey) throws Exception { + StringBuilder games = new StringBuilder("games:\n"); + exactGamesByKey.forEach((key, yaml) -> games + .append(" ").append(key).append(":\n") + .append(EngineTestSupport.indent(yaml.strip(), 4)) + .append('\n')); + return EngineTestSupport.resource(COLLECTION_HOST_RESOURCE).replace( + "games: __GAME_COLLECTION__", games.toString().stripTrailing()); + } + + static Map deliberatelyUnorderedGames() throws Exception { + Map games = new LinkedHashMap<>(); + games.put("zulu", game( + "round12-game-zulu", + "examples/round12/nba/game-zulu", + "nba-feed-zulu")); + games.put("alpha", game( + "round12-game-alpha", + "examples/round12/nba/game-alpha", + "nba-feed-alpha")); + games.put("middle", game( + "round12-game-middle", + "examples/round12/nba/game-middle", + "nba-feed-middle")); + return games; + } + + static Operation attach(String gameYaml, TestEngine engine) { + return Operation.exact( + "attachGame", + "hostChannel", + engine.embeddedDocumentRequest(gameYaml)); + } + + static Operation startGame() { + return Operation.yaml("startGame", "gameFeed", "{}"); + } + + static Operation homeScores(int points) { + return Operation.yaml( + "homeScores", "gameFeed", "points: " + points); + } + + static Operation awayScores(int points) { + return Operation.yaml( + "awayScores", "gameFeed", "points: " + points); + } + + static Operation endGame() { + return Operation.yaml("endGame", "gameFeed", "{}"); + } + + static long counter( + EngineMetrics.MetricsSnapshot metrics, + String name) { + return metrics.counters().getOrDefault(name, 0L); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java b/src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java new file mode 100644 index 0000000..a2d0eb5 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/SameDocumentInitialIdentityTest.java @@ -0,0 +1,143 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * A stable document identity accepts verified known epochs and rejects an + * unknown divergent body without changing the existing managed lineage. + */ +final class SameDocumentInitialIdentityTest { + @Test + void equalExactStatesWithDifferentDocumentIdsKeepIndependentHistories() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String identityFreeCounter = resource( + "examples/clean/embedded-counter.yaml") + .replace("documentId: embedded-counter-A\n", ""); + Timeline timeline = engine.timeline( + "examples/embedded/A", "alice"); + + engine.start("counter-lineage-one", identityFreeCounter); + engine.start("counter-lineage-two", identityFreeCounter); + + assertEquals( + engine.session("counter-lineage-one").current().blueId(), + engine.session("counter-lineage-two").current().blueId()); + + engine.appendAndDispatch( + timeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 4")); + + assertEquals(4L, integer( + engine, "counter-lineage-one", "/counter")); + assertEquals(4L, integer( + engine, "counter-lineage-two", "/counter")); + assertEquals(2, engine.history("counter-lineage-one").size()); + assertEquals(2, engine.history("counter-lineage-two").size()); + assertEquals("counter-lineage-one", engine.history( + "counter-lineage-one").get(1).documentId().value()); + assertEquals("counter-lineage-two", engine.history( + "counter-lineage-two").get(1).documentId().value()); + } + } + + @Test + void sameDocumentIsReusedButUnknownDivergentStateIsRejectedAtomically() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + engine.start("embedded-counter-A", childInitial); + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 2")); + + Timeline firstParentTimeline = engine.timeline( + "examples/embedded/identity-parent-one", "bob-one"); + engine.start( + "identity-parent-one", + parentDefinition( + "identity-parent-one", + "examples/embedded/identity-parent-one", + "bob-one")); + engine.appendAndDispatch( + firstParentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + assertEquals(2L, integer( + engine, "identity-parent-one", "/child/counter")); + assertEquals( + "embedded-counter-A", + engine.embeddedDocuments("identity-parent-one") + .get("/child")); + + Timeline secondParentTimeline = engine.timeline( + "examples/embedded/identity-parent-two", "bob-two"); + engine.start( + "identity-parent-two", + parentDefinition( + "identity-parent-two", + "examples/embedded/identity-parent-two", + "bob-two")); + long secondParentEpochBefore = engine.session( + "identity-parent-two").epoch(); + int childHistoryBefore = engine.history( + "embedded-counter-A").size(); + + String conflictingInitial = childInitial.replace( + "counter: 0", "counter: 99"); + IllegalStateException failure = assertThrows( + IllegalStateException.class, + () -> engine.appendAndDispatch( + secondParentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest( + conflictingInitial)))); + + assertTrue(failure.getMessage().contains( + "Invalid admission evidence: unknown state"), + failure::getMessage); + assertEquals(secondParentEpochBefore, + engine.session("identity-parent-two").epoch()); + assertTrue(engine.embeddedDocuments( + "identity-parent-two").isEmpty()); + assertEquals(childHistoryBefore, + engine.history("embedded-counter-A").size()); + assertEquals(2L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(2L, integer( + engine, "identity-parent-one", "/child/counter")); + } + } + + private static String parentDefinition( + String documentId, + String timelineId, + String actorId) throws Exception { + return resource("examples/clean/embedded-state-parent.yaml") + .replace("documentId: embedded-state-parent", + "documentId: " + documentId) + .replace("coordination/internal/embedded-state-parent", + "coordination/internal/" + documentId) + .replace("timelineId: examples/embedded/state-parent", + "timelineId: " + timelineId) + .replace("accountId: bob", "accountId: " + actorId); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java b/src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java new file mode 100644 index 0000000..9988846 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoOccurrencesTest.java @@ -0,0 +1,115 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** One child transition is reused across two occurrences in the same parent. */ +final class SharedManagedChildTwoOccurrencesTest { + @Test + void oneDirectChildProcessAdvancesBothOccurrenceCursors() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String child = resource("examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + Timeline parentTimeline = engine.timeline( + "examples/embedded/two-occurrences-parent", "bob"); + engine.start("embedded-counter-A", child); + engine.start( + "shared-child-two-occurrences-parent", + resource("examples/clean/" + + "shared-child-two-occurrences-parent.yaml")); + EngineMetrics.MetricsSnapshot beforeAttachment = + engine.metricsSnapshot(); + engine.appendAndDispatch( + parentTimeline, + Operation.exact( + "attachTwice", + "ownerChannel", + engine.embeddedDocumentRequest(child))); + EngineTestSupport.MetricDelta attachment = delta( + beforeAttachment, engine.metricsSnapshot()); + + assertEquals("embedded-counter-A", engine.embeddedDocuments( + "shared-child-two-occurrences-parent").get("/left")); + assertEquals("embedded-counter-A", engine.embeddedDocuments( + "shared-child-two-occurrences-parent").get("/right")); + assertEquals(1L, engine.history("embedded-counter-A").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + assertEquals(2L, engine.history( + "shared-child-two-occurrences-parent").stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .count(), + "each occurrence applies child initialization once"); + assertEquals(2L, attachment.counter( + "temporal.initializationEpochApplications")); + assertEquals(2L, attachment.counter( + "temporal.parentEpochApplications")); + assertOccurrenceCursors(engine, 0L); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 3")); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(3L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(3L, integer( + engine, + "shared-child-two-occurrences-parent", + "/left/counter")); + assertEquals(3L, integer( + engine, + "shared-child-two-occurrences-parent", + "/right/counter")); + assertEquals(1L, work.counter("temporal.externalProcessCalls")); + assertEquals(2L, work.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(2L, work.counter( + "temporal.parentEpochApplications")); + assertOccurrenceCursors(engine, 1L); + } + } + + private static void assertOccurrenceCursors( + TestEngine engine, + long expectedChildEpoch) { + List plans = engine.catchUpPlans().stream() + .filter(plan -> plan.link().parentDocumentId().value().equals( + "shared-child-two-occurrences-parent")) + .filter(plan -> plan.link().childDocumentId().value().equals( + "embedded-counter-A")) + .sorted((left, right) -> left.link().occurrencePath() + .compareTo(right.link().occurrencePath())) + .toList(); + + assertEquals(List.of("/left", "/right"), plans.stream() + .map(plan -> plan.link().occurrencePath()) + .toList()); + assertEquals(List.of(expectedChildEpoch, expectedChildEpoch), + plans.stream() + .map(plan -> plan.link().appliedChildEpoch()) + .toList(), + "each occurrence owns an independent child-epoch cursor"); + assertEquals(List.of( + CatchUpPlan.Status.COMPLETE, + CatchUpPlan.Status.COMPLETE), + plans.stream().map(CatchUpPlan::status).toList()); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java b/src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java new file mode 100644 index 0000000..042da91 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/SharedManagedChildTwoParentsTest.java @@ -0,0 +1,295 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** One managed child advances once and publishes one epoch to each parent. */ +final class SharedManagedChildTwoParentsTest { + @Test + void oneChildRevisionConvergesTwoParentsWithoutReprocessingTheChild() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + Timeline firstParentTimeline = engine.timeline( + "examples/embedded/parent-one", "bob-one"); + Timeline secondParentTimeline = engine.timeline( + "examples/embedded/parent-two", "bob-two"); + + engine.start("embedded-counter-A", childInitial); + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 1")); + + engine.start( + "embedded-parent-one", + parentDefinition( + "embedded-parent-one", + "examples/embedded/parent-one", + "bob-one")); + engine.appendAndDispatch( + firstParentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + engine.start( + "embedded-parent-two", + parentDefinition( + "embedded-parent-two", + "examples/embedded/parent-two", + "bob-two")); + engine.appendAndDispatch( + secondParentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + assertEquals(2L, integer( + engine, "embedded-parent-one", "/child/counter")); + assertEquals(2L, integer( + engine, "embedded-parent-two", "/child/counter")); + int childHistoryBefore = engine.history("embedded-counter-A").size(); + int firstParentHistoryBefore = engine.history( + "embedded-parent-one").size(); + int secondParentHistoryBefore = engine.history( + "embedded-parent-two").size(); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.appendAndDispatch( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 5")); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(7L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(7L, integer( + engine, "embedded-parent-one", "/child/counter")); + assertEquals(7L, integer( + engine, "embedded-parent-two", "/child/counter")); + assertEquals(childHistoryBefore + 1, + engine.history("embedded-counter-A").size()); + assertEquals(firstParentHistoryBefore + 1, + engine.history("embedded-parent-one").size()); + assertEquals(secondParentHistoryBefore + 1, + engine.history("embedded-parent-two").size()); + assertEquals(3L, work.counter( + "process.frozenContractsInvocations"), + "one child and two exact parent PROCESS invocations"); + assertEquals(1L, work.counter( + "temporal.externalProcessCalls")); + assertEquals(2L, work.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(2L, work.counter( + "catchUp.parentRevisionApplications")); + assertEquals(2L, work.counter("childRevisionApplications")); + assertEquals(0L, work.counter("childHistoricalProcessCalls")); + } + } + + @Test + void failedSharedParentRetryRunsOnlyItsMissingApplication() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childInitial = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + Timeline firstParentTimeline = engine.timeline( + "examples/embedded/parent-one", "bob-one"); + Timeline secondParentTimeline = engine.timeline( + "examples/embedded/parent-two", "bob-two"); + + engine.start("embedded-counter-A", childInitial); + engine.start( + "embedded-parent-one", + parentDefinition( + "embedded-parent-one", + "examples/embedded/parent-one", + "bob-one")); + engine.appendAndDispatch( + firstParentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + engine.start( + "embedded-parent-two", + parentDefinition( + "embedded-parent-two", + "examples/embedded/parent-two", + "bob-two")); + engine.appendAndDispatch( + secondParentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childInitial))); + + int childHistoryBefore = engine.history( + "embedded-counter-A").size(); + int firstParentHistoryBefore = engine.history( + "embedded-parent-one").size(); + int secondParentHistoryBefore = engine.history( + "embedded-parent-two").size(); + EngineMetrics.MetricsSnapshot beforeFailure = + engine.metricsSnapshot(); + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_APPLYING_CHILD_REVISION); + var childEntry = engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 5")); + assertThrows(RuntimeException.class, engine::drain); + EngineTestSupport.MetricDelta failed = delta( + beforeFailure, engine.metricsSnapshot()); + + assertEquals(2L, failed.counter("frozenProcessCalls"), + "one child and one committed parent PROCESS run"); + assertEquals(1L, failed.counter( + "temporal.externalProcessCalls")); + assertEquals(1L, failed.counter( + "process.embeddedEpochProcessCalls")); + assertEquals(1L, failed.counter( + "PARENT_EPOCH_APPLICATIONS")); + assertEquals(childHistoryBefore + 1, + engine.history("embedded-counter-A").size()); + assertEquals(firstParentHistoryBefore + 1, + engine.history("embedded-parent-one").size(), + "the first parent commit survives its lost response"); + assertEquals(secondParentHistoryBefore, + engine.history("embedded-parent-two").size(), + "the other parent remains independently pending"); + assertEquals(5L, integer( + engine, "embedded-counter-A", "/counter")); + assertEquals(5L, integer( + engine, "embedded-parent-one", "/child/counter")); + assertEquals(0L, integer( + engine, "embedded-parent-two", "/child/counter")); + assertEquals(0L, plan( + engine, "embedded-parent-one").link() + .appliedChildEpoch(), + "cursor stays behind until commit-companion recovery"); + assertEquals(0L, plan( + engine, "embedded-parent-two").link() + .appliedChildEpoch()); + assertEquals(SessionStatus.CATCHING_UP, + engine.session("embedded-parent-one").status()); + assertEquals(SessionStatus.CATCHING_UP, + engine.session("embedded-parent-two").status()); + assertNotReady(engine, "embedded-parent-one"); + assertNotReady(engine, "embedded-parent-two"); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeRetry = + engine.metricsSnapshot(); + assertTrue(engine.drain().quiescent()); + EngineTestSupport.MetricDelta retry = delta( + beforeRetry, engine.metricsSnapshot()); + + assertEquals(1L, retry.counter("frozenProcessCalls"), + "retry runs only the failed second-parent application"); + assertEquals(0L, retry.counter("temporal.externalProcessCalls")); + assertEquals(1L, retry.counter( + "PARENT_EPOCH_APPLICATIONS")); + assertTrue(retry.nanos("process.hostAfterFrozen") > 0L); + assertEquals(childHistoryBefore + 1, + engine.history("embedded-counter-A").size()); + assertEquals(firstParentHistoryBefore + 1, + engine.history("embedded-parent-one").size(), + "the committed parent is reconciled, not processed again"); + assertEquals(secondParentHistoryBefore + 1, + engine.history("embedded-parent-two").size()); + assertEquals(1L, revisionsCausedBy( + engine, "embedded-counter-A", childEntry.blueId())); + assertEquals(1L, revisionsCausedBy( + engine, "embedded-parent-one", childEntry.blueId())); + assertEquals(1L, revisionsCausedBy( + engine, "embedded-parent-two", childEntry.blueId())); + assertEquals(5L, integer( + engine, "embedded-parent-one", "/child/counter")); + assertEquals(5L, integer( + engine, "embedded-parent-two", "/child/counter")); + assertEquals(1L, plan( + engine, "embedded-parent-one").link() + .appliedChildEpoch()); + assertEquals(1L, plan( + engine, "embedded-parent-two").link() + .appliedChildEpoch()); + assertEquals(SessionStatus.READY, + engine.readyDocument("embedded-parent-one").status()); + assertEquals(SessionStatus.READY, + engine.readyDocument("embedded-parent-two").status()); + } + } + + private static void assertNotReady( + TestEngine engine, + String documentId) { + CoordinationException failure = assertThrows( + CoordinationException.class, + () -> engine.readyDocument(documentId)); + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_READY, + failure.code()); + } + + private static long revisionsCausedBy( + TestEngine engine, + String documentId, + String entryBlueId) { + return engine.history(documentId).stream() + .filter(revision -> revision.kind() + != DocumentRevision.Kind.INITIALIZATION) + .filter(revision -> revision.causalEntryBlueId() + .filter(entryBlueId::equals) + .isPresent()) + .count(); + } + + private static CatchUpPlan plan( + TestEngine engine, + String parentDocumentId) { + return engine.catchUpPlans().stream() + .filter(candidate -> candidate.link().parentDocumentId() + .value().equals(parentDocumentId)) + .findFirst() + .orElseThrow(); + } + + private static String parentDefinition( + String documentId, + String timelineId, + String actorId) throws Exception { + return resource("examples/clean/embedded-state-parent.yaml") + .replace("documentId: embedded-state-parent", + "documentId: " + documentId) + .replace("timelineId: examples/embedded/state-parent", + "timelineId: " + timelineId) + .replace("coordination/internal/embedded-state-parent", + "coordination/internal/" + documentId) + .replace("accountId: bob", "accountId: " + actorId); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java new file mode 100644 index 0000000..8a0e761 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/SourceSurfaceIdentityIntegrationTest.java @@ -0,0 +1,153 @@ +package blue.coordination.integration; + +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** End-to-end evidence that completeness follows sources, not business state. */ +final class SourceSurfaceIdentityIntegrationTest { + private static final long T0 = 1_738_000_000_000_000L; + private static final String CHILD = "source-identity-child"; + private static final String PARENT = "source-identity-parent"; + private static final String OWNER_TIMELINE = + "examples/source-identity/owner"; + private static final String DYNAMIC_TIMELINE = + "examples/source-identity/dynamic"; + + @Test + void businessOnlyTransitionReusesIdentityAndRouteChangeInvalidatesIt() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline(OWNER_TIMELINE, "owner"); + Timeline dynamic = engine.timeline( + DYNAMIC_TIMELINE, "dynamic-owner"); + Timeline parent = engine.timeline( + "examples/source-identity/parent", "parent-owner"); + engine.start(CHILD, childSource()); + engine.start(PARENT, parentSource()); + + var attachment = engine.appendAt( + parent, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest( + engine.session(CHILD).current())), + T0 + 100L); + engine.dispatch(attachment); + long initialEvidenceResolutions = counter( + engine.metricsSnapshot(), + "journal.sourceSurfaceIdentitiesResolved"); + assertTrue(initialEvidenceResolutions > 0L, + "initial catch-up must close with exact source evidence"); + + ExactValue dynamicChannel = engine.registerType(""" + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/source-identity/dynamic + actor: + type: MyOS/Principal Actor + accountId: dynamic-owner + """); + ExactValue dynamicHandler = engine.registerType(""" + type: Coordination/Sequential Workflow Operation + channel: dynamicChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /total + val: {$add: [$document: /total, $binding: event/message/request/amount]} + - $return: true + """); + var activation = engine.appendAt( + owner, + activateDynamic(dynamicChannel, dynamicHandler), + T0 + 200L); + engine.dispatch(activation); + var businessOnly = engine.appendAt( + dynamic, + Operation.yaml( + "applyDynamic", "dynamicChannel", "amount: 2"), + T0 + 300L); + engine.dispatch(businessOnly); + assertEquals(2L, integer(engine, CHILD, "/total")); + assertEquals(initialEvidenceResolutions, counter( + engine.metricsSnapshot(), + "journal.sourceSurfaceIdentitiesResolved"), + "eligible business delivery must not re-hash the surface"); + + var retirement = engine.appendAt( + owner, + Operation.yaml("retireDynamic", "ownerChannel", "{}"), + T0 + 400L); + engine.dispatch(retirement); + assertEquals(2L, integer(engine, PARENT, "/child/total")); + + long beforeFreshWindow = counter(engine.metricsSnapshot(), + "journal.sourceSurfaceIdentitiesResolved"); + engine.dispatch(engine.appendAt(parent, Operation.yaml( + "detachChild", "ownerChannel", "{}"), T0 + 500L)); + engine.dispatch(engine.appendAt(parent, Operation.exact( + "attachChild", "ownerChannel", + engine.embeddedDocumentRequest( + engine.session(CHILD).current())), T0 + 600L)); + assertTrue(counter(engine.metricsSnapshot(), + "journal.sourceSurfaceIdentitiesResolved") + > beforeFreshWindow, + "a new binding after source change needs fresh evidence"); + assertEquals(2L, integer(engine, PARENT, "/child/total")); + } + } + + private static long counter( + EngineMetrics.MetricsSnapshot snapshot, + String name) { + return snapshot.counters().getOrDefault(name, 0L); + } + + private static Operation activateDynamic( + ExactValue channel, + ExactValue handler) { + Map fields = new LinkedHashMap<>(); + fields.put("dynamicChannel", channel.referenceNode()); + fields.put("dynamicHandler", handler.referenceNode()); + return Operation.exact( + "activateDynamic", + "ownerChannel", + ExactValue.verified(new Node().properties(fields))); + } + + private static String childSource() throws Exception { + return resource("examples/clean/dynamic-source-surface.yaml") + .replace("documentId: dynamic-source-surface", + "documentId: " + CHILD) + .replace("examples/dynamic-source-surface/owner", + OWNER_TIMELINE); + } + + private static String parentSource() throws Exception { + return resource("examples/clean/embedded-state-parent.yaml") + .replace("documentId: embedded-state-parent", + "documentId: " + PARENT) + .replace("coordination/internal/embedded-state-parent", + "coordination/internal/" + PARENT) + .replace("timelineId: examples/embedded/state-parent", + "timelineId: examples/source-identity/parent") + .replace("accountId: bob", "accountId: parent-owner"); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java b/src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java new file mode 100644 index 0000000..712cc9a --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/StartAdmissionAtomicityTest.java @@ -0,0 +1,62 @@ +package blue.coordination.integration; + +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.indent; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Top-level admission publishes documents and routing as one unit. */ +final class StartAdmissionAtomicityTest { + @Test + void rejectedTopLevelSelfCyclePublishesNothingAndRetryMatchesFresh() + throws Exception { + String parent = resource( + "examples/clean/root-isolation-parent.yaml"); + String child = resource( + "examples/clean/root-isolation-child.yaml"); + String cyclicChild = child.replace( + "documentId: root-isolation-child", + "documentId: root-isolation-parent"); + String invalidTopLevel = parent + "\nchild:\n" + + indent(cyclicChild, 2); + + try (TestEngine engine = TestEngine.create(); + TestEngine fresh = TestEngine.create()) { + int objectsBefore = engine.wholeObjectCount(); + int journalBefore = engine.journalSize(); + long clockBefore = engine.logicalClockMicros(); + EngineMetrics.MetricsSnapshot metricsBefore = + engine.metricsSnapshot(); + + assertThrows( + IllegalStateException.class, + () -> engine.start( + "root-isolation-parent", invalidTopLevel)); + + assertEquals(0, engine.documentCount()); + assertEquals(0, engine.routeRowCount()); + assertEquals(objectsBefore, engine.wholeObjectCount()); + assertEquals(journalBefore, engine.journalSize()); + assertEquals(clockBefore, engine.logicalClockMicros()); + assertEquals( + metricsBefore.counters().getOrDefault( + "sessionsCreated", 0L), + engine.metricsSnapshot().counters().getOrDefault( + "sessionsCreated", 0L)); + + var retry = engine.start("root-isolation-parent", parent); + var expected = fresh.start("root-isolation-parent", parent); + assertEquals(expected.authoredInitialBlueId(), + retry.authoredInitialBlueId()); + assertEquals(expected.layout().rootBlueId(), + retry.layout().rootBlueId()); + assertEquals(expected.layout().routingSurface().definitions(), + retry.layout().routingSurface().definitions()); + assertEquals(fresh.documentCount(), engine.documentCount()); + assertEquals(fresh.routeRowCount(), engine.routeRowCount()); + assertEquals(fresh.wholeObjectCount(), engine.wholeObjectCount()); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java b/src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java new file mode 100644 index 0000000..3b33995 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/TemporalAdmissionPolicyIntegrationTest.java @@ -0,0 +1,315 @@ +package blue.coordination.integration; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Host-owned admission policies; Process Embedded remains paths-only. */ +final class TemporalAdmissionPolicyIntegrationTest { + private static final long T0 = 1_690_000_000_000_000L; + + @Test + void rejectsFrontiersWithoutExactJournalEvidence() throws Exception { + try (TestEngine engine = TestEngine.create()) { + ExternalOrderKey forged = ExternalOrderKey.of( + List.of(T0 + 999L, "forged-frontier")); + String counter = resource("examples/clean/counter.yaml"); + + assertThrows(IllegalArgumentException.class, () -> engine.start( + "counter-forged", + document(counter, "counter-forged"), + CoordinationEngine.AdmissionPolicy.FROM_FRONTIER, + forged)); + assertThrows(IllegalArgumentException.class, + () -> engine.configureEmbeddedAdmission( + "child-forged", + ActivationMode.IMPORT_FROM_FRONTIER, + forged)); + } + } + + @Test + void topLevelHistoryPoliciesUseExclusiveVerifiedFrontiers() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline alice = engine.timeline( + "examples/clean-counter/alice", "alice"); + var one = engine.appendAt(alice, counterIncrement(1), T0 + 100L); + engine.appendAt(alice, counterIncrement(2), T0 + 200L); + engine.appendAt(alice, counterIncrement(3), T0 + 300L); + String counter = resource("examples/clean/counter.yaml"); + + engine.start( + "counter-full", + document(counter, "counter-full"), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + engine.start( + "counter-frontier", + document(counter, "counter-frontier"), + CoordinationEngine.AdmissionPolicy.FROM_FRONTIER, + one.sourceOrderKey()); + engine.start( + "counter-now", + document(counter, "counter-now"), + CoordinationEngine.AdmissionPolicy.FROM_NOW, + null); + + assertEquals(6L, integer(engine, "counter-full", "/counter")); + assertEquals(5L, integer( + engine, "counter-frontier", "/counter")); + assertEquals(0L, integer(engine, "counter-now", "/counter")); + assertEquals(3L, engine.session("counter-full").epoch()); + assertEquals(2L, engine.session("counter-frontier").epoch()); + assertEquals(0L, engine.session("counter-now").epoch()); + } + } + + @Test + void embeddedBirthFrontierFullAndPassivePoliciesAreHostMetadata() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline feed = engine.timeline("examples/embedded/A", "alice"); + var one = engine.appendAt(feed, increment(1), T0 + 100L); + engine.appendAt(feed, increment(2), T0 + 200L); + engine.appendAt(feed, increment(3), T0 + 300L); + + engine.configureEmbeddedAdmission( + "child-birth", ActivationMode.BIRTH_AT_ATTACHMENT, null); + attachVariant(engine, "birth", "child-birth", 0L, + T0 + 1_000L); + + attachVariant(engine, "full", "child-full", 0L, + T0 + 1_100L); + + engine.configureEmbeddedAdmission( + "child-frontier", + ActivationMode.IMPORT_FROM_FRONTIER, + one.sourceOrderKey()); + attachVariant(engine, "frontier", "child-frontier", 1L, + T0 + 1_200L); + + engine.configureEmbeddedAdmission( + "child-passive", ActivationMode.PASSIVE_SNAPSHOT, null); + attachVariant(engine, "passive", "child-passive", 0L, + T0 + 1_300L); + + assertEquals(0L, integer( + engine, "parent-birth", "/child/counter")); + assertEquals(6L, integer( + engine, "parent-full", "/child/counter")); + assertEquals(6L, integer( + engine, "parent-frontier", "/child/counter")); + assertEquals(0L, integer( + engine, "parent-passive", "/child/counter")); + assertEquals(1, engine.history("child-birth").size()); + assertEquals(4, engine.history("child-full").size()); + assertEquals(3, engine.history("child-frontier").size()); + assertFalse(engine.embeddedDocuments("parent-passive") + .containsKey("/child")); + assertThrows(CoordinationException.class, + () -> engine.session("child-passive")); + } + } + + @Test + void attachCurrentRequiresExistingCurrentStateAndCompletenessThroughT() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline feed = engine.timeline("examples/embedded/A", "alice"); + engine.appendAt(feed, increment(1), T0 + 100L); + engine.appendAt(feed, increment(2), T0 + 200L); + String child = child("child-current", 0L); + engine.start( + "child-current", + child, + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + + String parentId = "parent-current"; + Timeline parentTimeline = engine.timeline( + "examples/embedded/parent-current", "bob-current"); + engine.start(parentId, parent( + parentId, + "examples/embedded/parent-current", + "bob-current")); + var attachment = engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest( + engine.session("child-current").current())), + T0 + 1_000L); + engine.configureEmbeddedAdmission( + "child-current", + ActivationMode.ATTACH_CURRENT_STATE, + attachment.sourceOrderKey()); + engine.dispatch(attachment); + + assertEquals(3L, integer( + engine, parentId, "/child/counter")); + assertEquals(1L, engine.session(parentId).epoch()); + assertEquals(2L, engine.session("child-current").epoch()); + } + } + + @Test + void exactOccurrencePlansSelectIndependentEpochs() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline feed = engine.timeline("examples/embedded/A", "alice"); + engine.appendAt(feed, increment(1), T0 + 100L); + engine.appendAt(feed, increment(-1), T0 + 200L); + engine.appendAt(feed, increment(1), T0 + 300L); + String childId = "child-recurring"; + engine.start(childId, child(childId, 0L), + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, null); + ExactValue first = engine.history(childId).get(1).after(); + ExactValue latest = engine.history(childId).get(3).after(); + + attachAtEpoch(engine, "first", childId, first, 1L, + T0 + 1_000L, true); + attachAtEpoch(engine, "latest", childId, latest, 3L, + T0 + 1_100L, true); + + assertEquals(3L, engine.session("parent-first").epoch()); + assertEquals(1L, engine.session("parent-latest").epoch()); + assertEquals(1L, integer(engine, "parent-first", "/child/counter")); + assertEquals(1L, integer(engine, "parent-latest", "/child/counter")); + } + } + + @Test + void failedPublicationRetainsExactOccurrencePlan() throws Exception { + try (TestEngine engine = TestEngine.create()) { + String childId = "child-retry-plan"; + ExactValue child = engine.registerType(child(childId, 0L)); + TimelineEntry attachment = attachAtEpoch( + engine, "retry-plan", childId, child, null, + T0 + 2_000L, false); + engine.failOnceAt(TestEngine.FailurePoint.AFTER_STAGING_CHILD_SESSION); + assertThrows(TestEngine.InjectedFailureException.class, + () -> engine.dispatch(attachment)); + assertEquals(SessionStatus.CATCHING_UP, + engine.session("parent-retry-plan").status()); + CoordinationException notReady = assertThrows( + CoordinationException.class, + () -> engine.readyDocument("parent-retry-plan")); + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_READY, + notReady.code()); + engine.clearFailureInjection(); + + engine.dispatch(attachment); + assertEquals(SessionStatus.READY, + engine.session("parent-retry-plan").status()); + + assertEquals(2L, engine.session("parent-retry-plan").epoch()); + assertEquals(0L, integer( + engine, "parent-retry-plan", "/child/counter")); + assertEquals(1L, engine.metricsSnapshot().counters().getOrDefault( + "embedding.exactAdmissionPlansConsumed", 0L)); + } + } + + private static TimelineEntry attachAtEpoch( + TestEngine engine, + String suffix, + String childId, + ExactValue childState, + Long admittedEpoch, + long timestamp, + boolean dispatch) throws Exception { + String parentId = "parent-" + suffix; + Timeline timeline = engine.timeline( + "examples/embedded/" + parentId, "bob-" + suffix); + engine.start(parentId, parent(parentId, + "examples/embedded/" + parentId, "bob-" + suffix)); + TimelineEntry attachment = engine.appendAt(timeline, + Operation.exact("attachChild", "ownerChannel", + engine.embeddedDocumentRequest(childState)), timestamp); + engine.configureEmbeddedAdmission( + parentId, "/child", childId, childState.blueId(), + admittedEpoch, ActivationMode.IMPORT_FULL_HISTORY, null, + "test-proof|" + parentId, attachment.blueId()); + if (dispatch) { + engine.dispatch(attachment); + } + return attachment; + } + + private static void attachVariant( + TestEngine engine, + String suffix, + String childId, + long initialCounter, + long timestamp) throws Exception { + String parentId = "parent-" + suffix; + String timelineId = "examples/embedded/parent-" + suffix; + String actorId = "bob-" + suffix; + Timeline parentTimeline = engine.timeline(timelineId, actorId); + engine.start(parentId, parent(parentId, timelineId, actorId)); + var attachment = engine.appendAt( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest( + child(childId, initialCounter))), + timestamp); + engine.dispatch(attachment); + } + + private static Operation increment(long amount) { + return Operation.yaml( + "increment", "ownerChannel", "amount: " + amount); + } + + private static Operation counterIncrement(long amount) { + return Operation.yaml( + "increment", "aliceChannel", "amount: " + amount); + } + + private static String document(String yaml, String documentId) { + return yaml.replace("documentId: counter", + "documentId: " + documentId); + } + + private static String child(String documentId, long counter) + throws Exception { + return resource("examples/clean/embedded-counter.yaml") + .replace("documentId: embedded-counter-A", + "documentId: " + documentId) + .replace("counter: 0", "counter: " + counter); + } + + private static String parent( + String documentId, + String timelineId, + String actorId) throws Exception { + return resource("examples/clean/embedded-state-parent.yaml") + .replace("documentId: embedded-state-parent", + "documentId: " + documentId) + .replace("coordination/internal/embedded-state-parent", + "coordination/internal/" + documentId) + .replace("timelineId: examples/embedded/state-parent", + "timelineId: " + timelineId) + .replace("accountId: bob", "accountId: " + actorId); + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/TestEngine.java b/src/integrationTest/java/blue/coordination/integration/TestEngine.java new file mode 100644 index 0000000..15be27c --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/TestEngine.java @@ -0,0 +1,338 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.DocumentSnapshot; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.coordination.api.ActivationMode; +import blue.coordination.internal.CoordinationTestControl; +import blue.language.api.BlueCacheStats; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Compact acceptance DSL over the published production API. It contains no + * Coordination processing implementation; only String-id conveniences and + * immutable diagnostic projections used by the migrated tests. + */ +final class TestEngine implements AutoCloseable { + private final CoordinationEngine engine; + private final CoordinationTestControl control; + + private TestEngine(CoordinationEngine engine) { + this.engine = engine; + this.control = CoordinationTestControl.attach(engine); + } + + static TestEngine create() { + return new TestEngine(CoordinationEngine.inMemory()); + } + + Timeline timeline(String timelineId, String actorId) { + return engine.registerTimeline(timelineId, actorId); + } + + Timeline registerTimeline(String timelineId, String actorId) { + return timeline(timelineId, actorId); + } + + DocumentView start(String documentId, String sourceYaml) { + try { + return new DocumentView(engine.startDocument( + DocumentId.of(documentId), sourceYaml)); + } catch (RuntimeException failure) { + throw original(failure); + } + } + + DocumentView start( + String documentId, + String sourceYaml, + CoordinationEngine.AdmissionPolicy policy, + ExternalOrderKey verifiedFrontier) { + try { + return new DocumentView(engine.startDocument( + DocumentId.of(documentId), + sourceYaml, + policy, + verifiedFrontier)); + } catch (RuntimeException failure) { + throw original(failure); + } + } + + void configureEmbeddedAdmission( + String documentId, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough) { + engine.configureEmbeddedAdmission( + DocumentId.of(documentId), mode, verifiedCompleteThrough); + } + + void configureEmbeddedAdmission( + String parentDocumentId, + String absoluteChildPath, + String childDocumentId, + String admittedStateBlueId, + Long admittedEpoch, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough, + String proofIdentity, + String expectedAttachmentEntryBlueId) { + engine.configureEmbeddedAdmission( + DocumentId.of(parentDocumentId), absoluteChildPath, + DocumentId.of(childDocumentId), admittedStateBlueId, + admittedEpoch, mode, verifiedCompleteThrough, proofIdentity, + expectedAttachmentEntryBlueId); + } + + ExactValue registerType(String sourceYaml) { + return engine.exactValue(sourceYaml); + } + + ExactValue exactRequest(String sourceYaml) { + return engine.exactValue(sourceYaml); + } + + ExactValue exactValue(String sourceYaml) { + return engine.exactValue(sourceYaml); + } + + ExactValue embeddedDocumentRequest(String exactDocumentYaml) { + return embeddedDocumentRequest(engine.exactValue(exactDocumentYaml)); + } + + ExactValue embeddedDocumentRequest(ExactValue exactDocument) { + return engine.referenceRequest("document", exactDocument); + } + + ExactValue referencedValueRequest(String field, String exactValueYaml) { + return engine.referenceRequest( + field, engine.exactValue(exactValueYaml)); + } + + TimelineEntry append(Timeline timeline, Operation operation) { + return engine.append(timeline, operation); + } + + TimelineEntry appendAt( + Timeline timeline, + Operation operation, + long timestampMicros) { + return engine.appendAt(timeline, operation, timestampMicros); + } + + ProcessingDrainReceipt appendAndDispatch( + Timeline timeline, + Operation operation) { + return dispatch(append(timeline, operation)); + } + + ProcessingDrainReceipt dispatch(TimelineEntry entry) { + try { + return engine.drainThrough(entry.sourceOrderKey()); + } catch (RuntimeException failure) { + if (control.isInjectedFailure(failure)) { + throw new InjectedFailureException(); + } + throw original(failure); + } + } + + ProcessingDrainReceipt drain() { + return engine.drain(); + } + + ProcessingDrainReceipt drain(CoordinationEngine.DrainBudget budget) { + return engine.drain(budget); + } + + int routeTargetCount(TimelineEntry entry) { + return engine.routeTargetCount(entry); + } + + DocumentView session(String documentId) { + return new DocumentView(engine.auditDocument( + DocumentId.of(documentId))); + } + + DocumentView readyDocument(String documentId) { + return new DocumentView(engine.document(DocumentId.of(documentId))); + } + + Node value(String documentId, String pointer) { + return session(documentId).snapshot().valueAt(pointer).copyNode(); + } + + List history(String documentId) { + return engine.history(DocumentId.of(documentId)); + } + + Set effectiveTimelineIds(String documentId) { + return engine.effectiveTimelineIds(DocumentId.of(documentId)); + } + + Map embeddedDocuments(String documentId) { + Map result = new LinkedHashMap<>(); + session(documentId).snapshot().embeddedChildren().forEach( + (path, id) -> result.put(path, id.value())); + return Collections.unmodifiableMap(result); + } + + EngineMetrics.MetricsSnapshot metricsSnapshot() { + CoordinationTestControl.MetricsSnapshot metrics = + control.metricsSnapshot(); + return new EngineMetrics.MetricsSnapshot( + metrics.counters(), metrics.phaseNanos()); + } + + void beginTransitionTrace() { + control.beginTransitionTrace(); + } + + List transitionTrace() { + return control.transitionTrace(); + } + + int journalSize() { + return engine.metrics().journalEntryCount(); + } + + int wholeObjectCount() { + return engine.metrics().wholeObjectCount(); + } + + int documentCount() { + return engine.metrics().documentCount(); + } + + int routeRowCount() { + return engine.metrics().routeRowCount(); + } + + long logicalClockMicros() { + return engine.metrics().logicalClockMicros(); + } + + BlueCacheStats languageCacheStats() { + return control.languageCacheStats(); + } + + List catchUpPlans() { + return control.catchUpEvidence().stream() + .map(evidence -> new CatchUpPlan( + new CatchUpPlan.Link( + DocumentId.of(evidence.parentDocumentId()), + DocumentId.of(evidence.childDocumentId()), + evidence.occurrencePath(), + evidence.appliedChildEpoch(), + evidence.activationGeneration()), + catchUpStatus(evidence.status()))) + .toList(); + } + + List + embeddedOccurrenceEvidence() { + return control.embeddedOccurrenceEvidence(); + } + + private static CatchUpPlan.Status catchUpStatus(String status) { + return switch (status) { + case "OPEN", "DEFERRED" -> CatchUpPlan.Status.REPLAYING; + case "COMPLETE" -> CatchUpPlan.Status.COMPLETE; + case "BLOCKED" -> CatchUpPlan.Status.BLOCKED; + default -> throw new IllegalArgumentException( + "Unknown catch-up status " + status); + }; + } + + void failOnceAt(FailurePoint point) { + control.failOnceAt(CoordinationTestControl.FailurePoint.valueOf( + point.name())); + } + + void clearFailureInjection() { + control.clearFailureInjection(); + } + + void restartFromStores() { + control.restartFromStores(); + } + + void forceLegacyReadyMarker(String documentId) { + control.forceLegacyReadyMarker(documentId); + } + + void makeHistoricalUnavailable(String diagnostic) { + control.makeHistoricalUnavailable(diagnostic); + } + + void makeHistoricalAvailable() { + control.makeHistoricalAvailable(); + } + + void invalidateHistoricalEvidence(String diagnostic) { + control.invalidateHistoricalEvidence(diagnostic); + } + + @Override + public void close() { + engine.close(); + } + + private static RuntimeException original(RuntimeException failure) { + if (failure instanceof CoordinationException + && failure.getCause() instanceof RuntimeException cause) { + return cause; + } + return failure; + } + + enum FailurePoint { + BEFORE_FROZEN_PROCESS, + AFTER_FROZEN_BEFORE_STAGE, + AFTER_STAGING_CHILD_SESSION, + AFTER_APPLYING_CHILD_REVISION, + BEFORE_COMMIT_VALIDATION, + AFTER_STATE_SWAP_BEFORE_RETURN + } + + static final class InjectedFailureException extends RuntimeException { + private static final long serialVersionUID = 1L; + } + + record DocumentView(DocumentSnapshot snapshot) { + long epoch() { + return snapshot.epoch(); + } + + SessionStatus status() { + return snapshot.status(); + } + + String authoredInitialBlueId() { + return snapshot.authoredInitialBlueId(); + } + + ExactValue current() { + return snapshot.current(); + } + + EmbeddedOnlyLayout layout() { + return new EmbeddedOnlyLayout(snapshot); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/TestResources.java b/src/integrationTest/java/blue/coordination/integration/TestResources.java new file mode 100644 index 0000000..b915a03 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/TestResources.java @@ -0,0 +1,20 @@ +package blue.coordination.integration; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +/** UTF-8 resource loading for executable basic-test documents. */ +final class TestResources { + private TestResources() { + } + + static String read(String name) throws IOException { + try (var input = TestResources.class.getClassLoader() + .getResourceAsStream(name)) { + if (input == null) { + throw new IOException("Missing test resource: " + name); + } + return new String(input.readAllBytes(), StandardCharsets.UTF_8); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java b/src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java new file mode 100644 index 0000000..6ace182 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/integration/WholeObjectFailureHygieneTest.java @@ -0,0 +1,84 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Measures immutable whole-object retention across deterministic retries. */ +final class WholeObjectFailureHygieneTest { + private static final int ATTEMPTS = 20; + + @Test + void identicalPrePublicationFailuresReachAStableWholeObjectCount() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline alice = engine.timeline( + "examples/clean-counter/alice", "alice"); + engine.start("counter", resource("examples/clean/counter.yaml")); + var entry = engine.append( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 1")); + int journalBefore = engine.journalSize(); + int objectsBefore = engine.wholeObjectCount(); + EngineMetrics.MetricsSnapshot metricsBefore = + engine.metricsSnapshot(); + List retainedCounts = new ArrayList<>(ATTEMPTS); + + for (int attempt = 0; attempt < ATTEMPTS; attempt++) { + engine.failOnceAt(TestEngine.FailurePoint + .AFTER_FROZEN_BEFORE_STAGE); + assertThrows( + TestEngine.InjectedFailureException.class, + () -> engine.dispatch(entry)); + retainedCounts.add(engine.wholeObjectCount()); + assertEquals(0L, engine.session("counter").epoch()); + assertTrue(engine.embeddedDocuments("counter").isEmpty()); + assertEquals(journalBefore, engine.journalSize()); + } + + int stableCount = retainedCounts.get(0); + assertTrue(retainedCounts.stream().allMatch( + count -> count == stableCount), + () -> "Whole-object count grew across identical retries: " + + retainedCounts); + assertTrue(stableCount >= objectsBefore); + EngineTestSupport.MetricDelta failures = delta( + metricsBefore, engine.metricsSnapshot()); + assertEquals(ATTEMPTS, failures.counter( + "process.frozenContractsInvocations")); + assertEquals(0L, failures.counter("journal.rollbacks"), + "failed processing never rewrites the external journal"); + + engine.clearFailureInjection(); + EngineMetrics.MetricsSnapshot beforeCommit = + engine.metricsSnapshot(); + engine.dispatch(entry); + engine.dispatch(entry); + EngineTestSupport.MetricDelta committed = delta( + beforeCommit, engine.metricsSnapshot()); + assertEquals(1L, committed.counter( + "process.frozenContractsInvocations")); + assertEquals(1L, integer(engine, "counter", "/counter")); + + var next = engine.append( + alice, + Operation.yaml("ignored", "aliceChannel", "{}")); + assertEquals(entry.timestampMicros() + 1L, + next.timestampMicros()); + assertEquals(entry.globalSequence() + 1L, + next.globalSequence()); + + } + } +} diff --git a/src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java b/src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java new file mode 100644 index 0000000..0a78f19 --- /dev/null +++ b/src/integrationTest/java/blue/coordination/internal/ApplicationReadinessProofIntegrationTest.java @@ -0,0 +1,236 @@ +package blue.coordination.internal; + +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.DocumentSnapshot; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Fail-closed application reads for each independent graph proof dimension. */ +final class ApplicationReadinessProofIntegrationTest { + private static final DocumentId PARENT = + DocumentId.of("embedded-state-parent"); + private static final DocumentId CHILD = + DocumentId.of("embedded-counter-A"); + + @Test + void rejectsCurrentReadyMarkerWhileAnEmbeddedBarrierIsOpen() + throws Exception { + try (ReadyFixture fixture = readyFixture()) { + Map openBarriers = mapField( + fixture.coordinator(), "openBarrierByParent"); + openBarriers.put(PARENT, "test-open-barrier"); + + assertRejectedButAuditable( + fixture, "an embedded catch-up barrier remains open"); + } + } + + @Test + void rejectsCurrentReadyMarkerWhenTheCommittedOccurrenceHasNoBinding() + throws Exception { + try (ReadyFixture fixture = readyFixture()) { + ProcessEmbeddedGraphSnapshot withoutBinding = fixture + .coordinator().graphSnapshot().reconcileParent( + PARENT, List.of()); + setField(fixture.coordinator(), "graph", withoutBinding); + + assertRejectedButAuditable( + fixture, "published graph does not match current " + + "Process Embedded occurrence count"); + } + } + + @Test + void rejectsCurrentReadyMarkerWhenTheBindingHasNoCursor() + throws Exception { + try (ReadyFixture fixture = readyFixture()) { + Map cursors = mapField( + fixture.coordinator(), "cursors"); + cursors.remove(fixture.binding().bindingId()); + + assertRejectedButAuditable( + fixture, "missing embedded epoch cursor"); + } + } + + @Test + void rejectsCurrentReadyMarkerWhenTheCursorIsBehindItsChild() + throws Exception { + try (ReadyFixture fixture = readyFixture()) { + Map cursors = mapField( + fixture.coordinator(), "cursors"); + cursors.put( + fixture.binding().bindingId(), + new EmbeddedEpochCursor( + fixture.binding().bindingId(), -1L)); + + assertEquals(0L, fixture.child().epoch()); + assertRejectedButAuditable( + fixture, "parent cursor -1 is behind child epoch 0"); + } + } + + @Test + void rejectsCurrentReadyMarkerWhenParentStateDiffersFromCursorState() + throws Exception { + try (ReadyFixture fixture = readyFixture()) { + replaceCurrentParentStateWithMismatch(fixture.parent()); + + assertRejectedButAuditable( + fixture, "parent state/cursor mismatch at /child"); + } + } + + private static ReadyFixture readyFixture() throws Exception { + DefaultCoordinationEngine engine = DefaultCoordinationEngine.create(); + try { + String childSource = resource( + "examples/clean/embedded-counter.yaml"); + DocumentSession child = engine.start(CHILD, childSource); + DocumentSession parent = engine.start( + PARENT, + resource("examples/clean/embedded-state-parent.yaml")); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + var attachment = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childSource))); + assertTrue(engine.drainThrough( + attachment.sourceOrderKey()).quiescent()); + + SequentialDrainCoordinator coordinator = fieldValue( + engine, "drainCoordinator"); + EmbeddingBinding binding = coordinator.bindingsForParent(PARENT) + .stream().findFirst().orElseThrow(); + assertEquals(SessionStatus.READY, parent.status()); + assertEquals(parent.epoch(), parent.readyEpoch()); + assertEquals(parent.epoch(), parent.graphPublishedEpoch()); + assertEquals(child.epoch(), coordinator.cursor( + binding.bindingId()).appliedChildEpoch()); + assertEquals(parent.epoch(), engine.document(PARENT).epoch()); + return new ReadyFixture( + engine, coordinator, parent, child, binding); + } catch (Exception | Error failure) { + engine.close(); + throw failure; + } + } + + private static void assertRejectedButAuditable( + ReadyFixture fixture, + String expectedDiagnostic) { + DocumentSnapshot committed = fixture.engine().auditDocument(PARENT); + assertEquals(SessionStatus.READY, committed.status(), + "the seam isolates the composite proof from the status flag"); + + CoordinationException failure = assertThrows( + CoordinationException.class, + () -> fixture.engine().document(PARENT)); + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_READY, failure.code()); + assertTrue(failure.getMessage().contains(expectedDiagnostic), + failure::getMessage); + + DocumentSnapshot audited = fixture.engine().auditDocument(PARENT); + assertEquals(committed.epoch(), audited.epoch()); + assertEquals(committed.blueId(), audited.blueId()); + assertEquals(SessionStatus.READY, audited.status(), + "an application-read rejection must not hide audit state"); + assertEquals( + committed.valueAt("/child").blueId(), + audited.valueAt("/child").blueId(), + "the committed child state remains auditable"); + } + + private static void replaceCurrentParentStateWithMismatch( + DocumentSession parent) throws ReflectiveOperationException { + List revisions = fieldValue(parent, "revisions"); + int lastIndex = revisions.size() - 1; + DocumentRevision current = revisions.get(lastIndex); + Node mismatchedRoot = current.after().copyNode(); + Node child = mismatchedRoot.getProperties().get("child"); + child.getProperties().put( + "counter", new Node().value(BigInteger.valueOf(999L))); + ExactValue mismatched = ExactValue.verified(mismatchedRoot); + revisions.set(lastIndex, new DocumentRevision( + current.documentId(), + current.epoch(), + current.rootApplicationOrder(), + current.kind(), + current.before().orElse(null), + mismatched, + current.sourceEntry().orElse(null), + current.sourceOrderKey().orElse(null), + current.causalEntryBlueId().orElse(null), + current.catchUpCause().orElse(null), + current.emittedEvents(), + current.processingGas())); + } + + private static String resource(String name) throws IOException { + try (var input = ApplicationReadinessProofIntegrationTest.class + .getClassLoader().getResourceAsStream(name)) { + if (input == null) { + throw new IOException("Missing test resource: " + name); + } + return new String(input.readAllBytes(), StandardCharsets.UTF_8); + } + } + + @SuppressWarnings("unchecked") + private static Map mapField( + Object target, + String name) throws ReflectiveOperationException { + return (Map) fieldValue(target, name); + } + + @SuppressWarnings("unchecked") + private static T fieldValue( + Object target, + String name) throws ReflectiveOperationException { + Field field = target.getClass().getDeclaredField(name); + field.setAccessible(true); + return (T) field.get(target); + } + + private static void setField( + Object target, + String name, + Object value) throws ReflectiveOperationException { + Field field = target.getClass().getDeclaredField(name); + field.setAccessible(true); + field.set(target, value); + } + + private record ReadyFixture( + DefaultCoordinationEngine engine, + SequentialDrainCoordinator coordinator, + DocumentSession parent, + DocumentSession child, + EmbeddingBinding binding) implements AutoCloseable { + @Override + public void close() { + engine.close(); + } + } +} diff --git a/src/integrationTest/java/blue/coordination/internal/EmbeddedReceiptRetryIdentityIntegrationTest.java b/src/integrationTest/java/blue/coordination/internal/EmbeddedReceiptRetryIdentityIntegrationTest.java new file mode 100644 index 0000000..e40f60b --- /dev/null +++ b/src/integrationTest/java/blue/coordination/internal/EmbeddedReceiptRetryIdentityIntegrationTest.java @@ -0,0 +1,190 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Exact identity parity for a committed embedded transition retry. */ +final class EmbeddedReceiptRetryIdentityIntegrationTest { + private static final String PARENT = "embedded-state-parent"; + private static final String CHILD = "embedded-counter-A"; + + @Test + void committedReceiptRetryDoesNotConsumeClockOrCreatePhantomInput() + throws Exception { + Scenario uninterrupted = run(false); + Scenario retried = run(true); + + assertEquals(uninterrupted.objectsAfterRecovery(), + retried.objectsAfterRecovery(), + "receipt recovery cannot add a whole object"); + assertEquals(uninterrupted.nextEntryTimestamp(), + retried.nextEntryTimestamp(), + "the next external event keeps its exact timestamp"); + assertEquals(uninterrupted.nextEntryBlueId(), + retried.nextEntryBlueId(), + "the next external event keeps its exact BlueId"); + assertEquals(uninterrupted.embeddedInputs(), + retried.embeddedInputs(), + "the next real embedded input keeps its timestamp, event " + + "BlueId, request BlueId, and receipt identity"); + assertEquals(uninterrupted.parentHistory(), retried.parentHistory()); + assertEquals(uninterrupted.childHistory(), retried.childHistory()); + assertEquals(uninterrupted.finalWholeObjectCount(), + retried.finalWholeObjectCount(), + "retry and uninterrupted stores must have exact cardinality"); + } + + private static Scenario run(boolean injectFailure) throws Exception { + try (DefaultCoordinationEngine engine = + DefaultCoordinationEngine.create()) { + String childSource = resource( + "examples/clean/embedded-counter.yaml"); + Timeline childTimeline = engine.timeline( + "examples/embedded/A", "alice"); + Timeline parentTimeline = engine.timeline( + "examples/embedded/state-parent", "bob"); + engine.start(CHILD, childSource); + engine.start(PARENT, resource( + "examples/clean/embedded-state-parent.yaml")); + TimelineEntry attachment = engine.append( + parentTimeline, + Operation.exact( + "attachChild", + "ownerChannel", + engine.embeddedDocumentRequest(childSource))); + + if (injectFailure) { + engine.failOnceAt(DefaultCoordinationEngine.FailurePoint + .AFTER_APPLYING_CHILD_REVISION); + assertThrows( + DefaultCoordinationEngine.InjectedFailureException.class, + () -> engine.drainThrough( + attachment.sourceOrderKey())); + engine.restartFromStores(); + } + engine.drainThrough(attachment.sourceOrderKey()); + int objectsAfterRecovery = engine.wholeObjectCount(); + + TimelineEntry next = engine.append( + childTimeline, + Operation.yaml( + "increment", "ownerChannel", "amount: 7")); + engine.drainThrough(next.sourceOrderKey()); + + return new Scenario( + objectsAfterRecovery, + next.timestampMicros(), + next.blueId(), + embeddedInputs(coordinator(engine)), + revisions(engine.history(PARENT)), + revisions(engine.history(CHILD)), + engine.wholeObjectCount()); + } + } + + private static List embeddedInputs( + SequentialDrainCoordinator coordinator) + throws ReflectiveOperationException { + Map inputs = fieldValue( + coordinator, "committedEmbeddedInputs"); + return inputs.values().stream() + .map(input -> new EmbeddedInputEvidence( + input.inputId(), + input.applicationTimestampMicros(), + input.exactEvent().blueId(), + input.exactRequest().blueId(), + input.toChildEpoch())) + .toList(); + } + + private static List revisions( + List revisions) { + return revisions.stream().map(revision -> new RevisionEvidence( + revision.documentId().value(), + revision.epoch(), + revision.rootApplicationOrder(), + revision.kind(), + revision.before().map(value -> value.blueId()).orElse(null), + revision.after().blueId(), + revision.sourceEntry().map(TimelineEntry::blueId) + .orElse(null), + revision.sourceOrderKey().orElse(null), + revision.causalEntryBlueId().orElse(null), + revision.catchUpCause().orElse(null), + revision.emittedEvents().stream() + .map(DirectBlueIdCalculator::calculateBlueId) + .toList(), + revision.processingGas())).toList(); + } + + private static SequentialDrainCoordinator coordinator( + DefaultCoordinationEngine engine) + throws ReflectiveOperationException { + return fieldValue(engine, "drainCoordinator"); + } + + @SuppressWarnings("unchecked") + private static T fieldValue(Object target, String name) + throws ReflectiveOperationException { + Field field = target.getClass().getDeclaredField(name); + field.setAccessible(true); + return (T) field.get(target); + } + + private static String resource(String name) throws IOException { + try (var input = EmbeddedReceiptRetryIdentityIntegrationTest.class + .getClassLoader().getResourceAsStream(name)) { + if (input == null) { + throw new IOException("Missing test resource: " + name); + } + return new String(input.readAllBytes(), StandardCharsets.UTF_8); + } + } + + private record Scenario( + int objectsAfterRecovery, + long nextEntryTimestamp, + String nextEntryBlueId, + List embeddedInputs, + List parentHistory, + List childHistory, + int finalWholeObjectCount) { + } + + private record EmbeddedInputEvidence( + String inputId, + long applicationTimestampMicros, + String exactEventBlueId, + String exactRequestBlueId, + long childEpoch) { + } + + private record RevisionEvidence( + String documentId, + long epoch, + long rootApplicationOrder, + DocumentRevision.Kind kind, + String beforeBlueId, + String afterBlueId, + String sourceEntryBlueId, + ExternalOrderKey sourceOrder, + String causalEntryBlueId, + DocumentRevision.CatchUpCause catchUpCause, + List eventBlueIds, + long processingGas) { + } +} diff --git a/src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml b/src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml new file mode 100644 index 0000000..5012b0b --- /dev/null +++ b/src/integrationTest/resources/examples/clean/all-timelines-routing-counter.yaml @@ -0,0 +1,38 @@ +documentId: all-timelines-routing-counter +name: All Timelines Routing Counter +counter: 0 +contracts: + aliceChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/routing/alice + actor: + type: MyOS/Principal Actor + accountId: alice + bobChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/routing/bob + actor: + type: MyOS/Principal Actor + accountId: bob + aggregateChannel: + type: Coordination/All Timelines Channel + add: + type: Coordination/Sequential Workflow Operation + channel: aggregateChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: + $add: + - $document: /counter + - $binding: event/message/request/amount + - $return: true diff --git a/src/integrationTest/resources/examples/clean/composite-routing-counter.yaml b/src/integrationTest/resources/examples/clean/composite-routing-counter.yaml new file mode 100644 index 0000000..b1e0942 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/composite-routing-counter.yaml @@ -0,0 +1,41 @@ +documentId: composite-routing-counter +name: Composite Routing Counter +counter: 0 +contracts: + aliceChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/routing/alice + actor: + type: MyOS/Principal Actor + accountId: alice + bobChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/routing/bob + actor: + type: MyOS/Principal Actor + accountId: bob + aggregateChannel: + type: Coordination/Composite Timeline Channel + channels: + - aliceChannel + - bobChannel + add: + type: Coordination/Sequential Workflow Operation + channel: aggregateChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: + $add: + - $document: /counter + - $binding: event/message/request/amount + - $return: true diff --git a/src/integrationTest/resources/examples/clean/counter.yaml b/src/integrationTest/resources/examples/clean/counter.yaml new file mode 100644 index 0000000..7412e48 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/counter.yaml @@ -0,0 +1,62 @@ +documentId: counter +name: Clean Counter +counter: 0 +contracts: + aliceChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/clean-counter/alice + actor: + type: MyOS/Principal Actor + accountId: alice + bobChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/clean-counter/bob + actor: + type: MyOS/Principal Actor + accountId: bob + increment: + type: Coordination/Sequential Workflow Operation + channel: aliceChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: + $add: + - $document: /counter + - $binding: event/message/request/amount + - $appendEvent: + type: Coordination/Event + kind: Basic/Counter Changed + direction: increment + amount: {$binding: event/message/request/amount} + - $return: true + decrement: + type: Coordination/Sequential Workflow Operation + channel: bobChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: + $subtract: + - $document: /counter + - $binding: event/message/request/amount + - $appendEvent: + type: Coordination/Event + kind: Basic/Counter Changed + direction: decrement + amount: {$binding: event/message/request/amount} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml b/src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml new file mode 100644 index 0000000..d782e34 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/deep-same-entry-a1.yaml @@ -0,0 +1,83 @@ +documentId: deep-same-entry-a1 +name: Deep Same-Entry Middle A1 +directCount: 0 +childApplications: 0 +childDirectCountSeenByDirect: -1 +contracts: + setupChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/deep-same-entry/a1-setup + actor: + type: MyOS/Principal Actor + accountId: a1-owner + sharedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/deep-same-entry/shared + actor: + type: MyOS/Principal Actor + accountId: shared-actor + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/deep-same-entry-a1 + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: setupChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /child + val: {$binding: event/message/request/document} + - $return: true + advance: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /childDirectCountSeenByDirect + val: {$document: /child/directCount} + - $appendChange: + op: replace + path: /directCount + val: {$add: [$document: /directCount, $binding: event/message/request/amount]} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /childApplications + val: {$add: [$document: /childApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml b/src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml new file mode 100644 index 0000000..f3c72e2 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/deep-same-entry-a11.yaml @@ -0,0 +1,25 @@ +documentId: deep-same-entry-a11 +name: Deep Same-Entry Leaf A11 +directCount: 0 +contracts: + sharedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/deep-same-entry/shared + actor: + type: MyOS/Principal Actor + accountId: shared-actor + advance: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /directCount + val: {$add: [$document: /directCount, $binding: event/message/request/amount]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml b/src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml new file mode 100644 index 0000000..485cb69 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/deep-same-entry-root.yaml @@ -0,0 +1,93 @@ +documentId: deep-same-entry-root +name: Deep Same-Entry Root +directCount: 0 +childApplications: 0 +a1DirectCountSeenByDirect: -1 +a11DirectCountSeenByDirect: -1 +a1ChildApplicationsSeenByDirect: -1 +contracts: + setupChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/deep-same-entry/root-setup + actor: + type: MyOS/Principal Actor + accountId: root-owner + sharedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/deep-same-entry/shared + actor: + type: MyOS/Principal Actor + accountId: shared-actor + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/deep-same-entry-root + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: setupChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /child + val: {$binding: event/message/request/document} + - $return: true + advance: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /a1DirectCountSeenByDirect + val: {$document: /child/directCount} + - $appendChange: + op: replace + path: /a11DirectCountSeenByDirect + val: {$document: /child/child/directCount} + - $appendChange: + op: replace + path: /a1ChildApplicationsSeenByDirect + val: {$document: /child/childApplications} + - $appendChange: + op: replace + path: /directCount + val: {$add: [$document: /directCount, $binding: event/message/request/amount]} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /childApplications + val: {$add: [$document: /childApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml b/src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml new file mode 100644 index 0000000..75591ee --- /dev/null +++ b/src/integrationTest/resources/examples/clean/duplicate-event-embedded-parent.yaml @@ -0,0 +1,106 @@ +documentId: duplicate-event-parent +name: Duplicate Event Occurrence Parent +oldChildValueSeen: -1 +incomingChildValueSeen: -1 +firstOccurrenceIndexSeen: -1 +secondOccurrenceIndexSeen: -1 +firstEventBlueIdSeen: unset +secondEventBlueIdSeen: unset +firstEventTypeBlueIdSeen: unset +secondEventTypeBlueIdSeen: unset +contracts: + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/duplicate-event-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + counter: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $if: + cond: + $eq: + - $binding: event/message/request/emittedEventCount + - 2 + then: + - $appendChange: + op: replace + path: /oldChildValueSeen + val: {$document: /child/counter} + - $appendChange: + op: replace + path: /incomingChildValueSeen + val: {$binding: event/message/request/after/counter} + - $appendChange: + op: replace + path: /firstOccurrenceIndexSeen + val: {$binding: event/message/request/eventOccurrences/0/occurrenceIndex} + - $appendChange: + op: replace + path: /secondOccurrenceIndexSeen + val: {$binding: event/message/request/eventOccurrences/1/occurrenceIndex} + - $appendChange: + op: replace + path: /firstEventBlueIdSeen + val: {$binding: event/message/request/eventOccurrences/0/eventBlueId} + - $appendChange: + op: replace + path: /secondEventBlueIdSeen + val: {$binding: event/message/request/eventOccurrences/1/eventBlueId} + - $appendChange: + op: replace + path: /firstEventTypeBlueIdSeen + val: {$binding: event/message/request/eventOccurrences/0/eventTypeBlueId} + - $appendChange: + op: replace + path: /secondEventTypeBlueIdSeen + val: {$binding: event/message/request/eventOccurrences/1/eventTypeBlueId} + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $return: true +child: + documentId: duplicate-event-child + name: Duplicate Event Child + counter: 0 + contracts: + childChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/duplicate-events/child + actor: + type: MyOS/Principal Actor + accountId: alice + advance: + type: Coordination/Sequential Workflow Operation + channel: childChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /counter, val: 1} + - $appendEvent: + type: Coordination/Event + kind: Duplicate/Event + payload: identical + - $appendEvent: + type: Coordination/Event + kind: Duplicate/Event + payload: identical + - $return: true diff --git a/src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml b/src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml new file mode 100644 index 0000000..5474577 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/dynamic-source-surface.yaml @@ -0,0 +1,44 @@ +documentId: dynamic-source-surface +name: Dynamic Source Surface +total: 0 +activated: false +retired: false +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/dynamic-source-surface/owner + actor: + type: MyOS/Principal Actor + accountId: owner + activateDynamic: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + dynamicChannel: {} + dynamicHandler: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /contracts/dynamicChannel + val: {$binding: event/message/request/dynamicChannel} + - $appendChange: + op: add + path: /contracts/applyDynamic + val: {$binding: event/message/request/dynamicHandler} + - $appendChange: {op: replace, path: /activated, val: true} + - $return: true + retireDynamic: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: remove, path: /contracts/applyDynamic} + - $appendChange: {op: remove, path: /contracts/dynamicChannel} + - $appendChange: {op: replace, path: /retired, val: true} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml b/src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml new file mode 100644 index 0000000..bebbce3 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-collection-parent.yaml @@ -0,0 +1,79 @@ +documentId: embedded-collection-parent +name: Embedded Collection Parent +ordinaryPayload: + summary: retained inline + nested: + value: 42 +games: {} +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/collection-parent + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/embedded-collection-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + collectionPaths: [/games] + attachGameA: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /games/game-a + val: {$binding: event/message/request/document} + - $return: true + attachEscapedGame: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /games/game~1a~0b + val: {$binding: event/message/request/document} + - $return: true + removeGameA: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: remove, path: /games/game-a} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-counter-B.yaml b/src/integrationTest/resources/examples/clean/embedded-counter-B.yaml new file mode 100644 index 0000000..d2d07a3 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-counter-B.yaml @@ -0,0 +1,25 @@ +documentId: embedded-counter-B +name: Managed Embedded Counter B +counter: 0 +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/B + actor: + type: MyOS/Principal Actor + accountId: beatrice + increment: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: {$add: [$document: /counter, $binding: event/message/request/amount]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-counter.yaml b/src/integrationTest/resources/examples/clean/embedded-counter.yaml new file mode 100644 index 0000000..4db99ef --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-counter.yaml @@ -0,0 +1,29 @@ +documentId: embedded-counter-A +name: Managed Embedded Counter A +counter: 0 +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/A + actor: + type: MyOS/Principal Actor + accountId: alice + increment: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: {$add: [$document: /counter, $binding: event/message/request/amount]} + - $appendEvent: + type: Coordination/Event + kind: Basic/Embedded Counter Changed + amount: {$binding: event/message/request/amount} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-middle.yaml b/src/integrationTest/resources/examples/clean/embedded-middle.yaml new file mode 100644 index 0000000..4afa5d7 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-middle.yaml @@ -0,0 +1,51 @@ +documentId: embedded-middle-A +name: Embedded Middle A +childCounter: 0 +childRevisionApplications: 0 +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/middle + actor: + type: MyOS/Principal Actor + accountId: middle-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/embedded-middle-A + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /child, val: {$binding: event/message/request/document}} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /child, val: {$binding: event/message/request/after}} + - $appendChange: {op: replace, path: /childCounter, val: {$binding: event/message/request/after/counter}} + - $appendChange: + op: replace + path: /childRevisionApplications + val: {$add: [$document: /childRevisionApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-parent.yaml b/src/integrationTest/resources/examples/clean/embedded-parent.yaml new file mode 100644 index 0000000..60c954b --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-parent.yaml @@ -0,0 +1,62 @@ +documentId: embedded-parent-B +name: Embedded Parent B +childCounter: 0 +childRevisionApplications: 0 +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/B + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/embedded-parent-B + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /child + val: {$binding: event/message/request/document} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /child + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /childCounter + val: {$binding: event/message/request/after/counter} + - $appendChange: + op: replace + path: /childRevisionApplications + val: {$add: [$document: /childRevisionApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-root.yaml b/src/integrationTest/resources/examples/clean/embedded-root.yaml new file mode 100644 index 0000000..0208f93 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-root.yaml @@ -0,0 +1,54 @@ +documentId: embedded-root-B +name: Embedded Root B +leafCounter: 0 +childRevisionApplications: 0 +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/root + actor: + type: MyOS/Principal Actor + accountId: root-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/embedded-root-B + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /child, val: {$binding: event/message/request/document}} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /child, val: {$binding: event/message/request/after}} + - $appendChange: + op: replace + path: /leafCounter + val: {$binding: event/message/request/after/childCounter} + - $appendChange: + op: replace + path: /childRevisionApplications + val: {$add: [$document: /childRevisionApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/embedded-state-parent.yaml b/src/integrationTest/resources/examples/clean/embedded-state-parent.yaml new file mode 100644 index 0000000..ad400fc --- /dev/null +++ b/src/integrationTest/resources/examples/clean/embedded-state-parent.yaml @@ -0,0 +1,59 @@ +documentId: embedded-state-parent +name: Embedded State Materialization Parent +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/state-parent + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/embedded-state-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /child, val: {$binding: event/message/request/document}} + - $return: true + detachChild: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: remove, path: /child} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /child + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml b/src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml new file mode 100644 index 0000000..8a7b4ca --- /dev/null +++ b/src/integrationTest/resources/examples/clean/initial-embedded-parent.yaml @@ -0,0 +1,79 @@ +documentId: initial-embedded-parent +name: Parent With Authored Managed Child +rootCounter: 0 +child: + documentId: initial-embedded-child + name: Authored Managed Child + counter: 0 + contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/initial + actor: + type: MyOS/Principal Actor + accountId: alice + increment: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: {$add: [$document: /counter, $binding: event/message/request/amount]} + - $return: true +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/initial-parent + actor: + type: MyOS/Principal Actor + accountId: bob + incrementRoot: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /rootCounter + val: {$add: [$document: /rootCounter, $binding: event/message/request/amount]} + - $return: true + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/initial-embedded-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /child + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/large-order-host.yaml b/src/integrationTest/resources/examples/clean/large-order-host.yaml new file mode 100644 index 0000000..03fe1f1 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/large-order-host.yaml @@ -0,0 +1,1682 @@ +documentId: large-order-host +name: Large Wadowice-like Order Host +hostStatus: Draft +hostRevision: 0 +hostOperationCount: 0 +payNoteRevisionCount: 0 +observedPayNoteStatus: Not Attached +observedAuthorizationCount: 0 +catalog: + item001: + sku: LARGE-001 + name: Large ordinary catalog item 001 + description: This is ordinary host data 001; it is deliberately retained inline and is never a process boundary. + priceMinor: 1001 + active: true + tags: [travel, wadowice, benchmark, item-001] + item002: + sku: LARGE-002 + name: Large ordinary catalog item 002 + description: This is ordinary host data 002; it is deliberately retained inline and is never a process boundary. + priceMinor: 1002 + active: true + tags: [travel, wadowice, benchmark, item-002] + item003: + sku: LARGE-003 + name: Large ordinary catalog item 003 + description: This is ordinary host data 003; it is deliberately retained inline and is never a process boundary. + priceMinor: 1003 + active: true + tags: [travel, wadowice, benchmark, item-003] + item004: + sku: LARGE-004 + name: Large ordinary catalog item 004 + description: This is ordinary host data 004; it is deliberately retained inline and is never a process boundary. + priceMinor: 1004 + active: true + tags: [travel, wadowice, benchmark, item-004] + item005: + sku: LARGE-005 + name: Large ordinary catalog item 005 + description: This is ordinary host data 005; it is deliberately retained inline and is never a process boundary. + priceMinor: 1005 + active: true + tags: [travel, wadowice, benchmark, item-005] + item006: + sku: LARGE-006 + name: Large ordinary catalog item 006 + description: This is ordinary host data 006; it is deliberately retained inline and is never a process boundary. + priceMinor: 1006 + active: true + tags: [travel, wadowice, benchmark, item-006] + item007: + sku: LARGE-007 + name: Large ordinary catalog item 007 + description: This is ordinary host data 007; it is deliberately retained inline and is never a process boundary. + priceMinor: 1007 + active: true + tags: [travel, wadowice, benchmark, item-007] + item008: + sku: LARGE-008 + name: Large ordinary catalog item 008 + description: This is ordinary host data 008; it is deliberately retained inline and is never a process boundary. + priceMinor: 1008 + active: true + tags: [travel, wadowice, benchmark, item-008] + item009: + sku: LARGE-009 + name: Large ordinary catalog item 009 + description: This is ordinary host data 009; it is deliberately retained inline and is never a process boundary. + priceMinor: 1009 + active: true + tags: [travel, wadowice, benchmark, item-009] + item010: + sku: LARGE-010 + name: Large ordinary catalog item 010 + description: This is ordinary host data 010; it is deliberately retained inline and is never a process boundary. + priceMinor: 1010 + active: true + tags: [travel, wadowice, benchmark, item-010] + item011: + sku: LARGE-011 + name: Large ordinary catalog item 011 + description: This is ordinary host data 011; it is deliberately retained inline and is never a process boundary. + priceMinor: 1011 + active: true + tags: [travel, wadowice, benchmark, item-011] + item012: + sku: LARGE-012 + name: Large ordinary catalog item 012 + description: This is ordinary host data 012; it is deliberately retained inline and is never a process boundary. + priceMinor: 1012 + active: true + tags: [travel, wadowice, benchmark, item-012] + item013: + sku: LARGE-013 + name: Large ordinary catalog item 013 + description: This is ordinary host data 013; it is deliberately retained inline and is never a process boundary. + priceMinor: 1013 + active: true + tags: [travel, wadowice, benchmark, item-013] + item014: + sku: LARGE-014 + name: Large ordinary catalog item 014 + description: This is ordinary host data 014; it is deliberately retained inline and is never a process boundary. + priceMinor: 1014 + active: true + tags: [travel, wadowice, benchmark, item-014] + item015: + sku: LARGE-015 + name: Large ordinary catalog item 015 + description: This is ordinary host data 015; it is deliberately retained inline and is never a process boundary. + priceMinor: 1015 + active: true + tags: [travel, wadowice, benchmark, item-015] + item016: + sku: LARGE-016 + name: Large ordinary catalog item 016 + description: This is ordinary host data 016; it is deliberately retained inline and is never a process boundary. + priceMinor: 1016 + active: true + tags: [travel, wadowice, benchmark, item-016] + item017: + sku: LARGE-017 + name: Large ordinary catalog item 017 + description: This is ordinary host data 017; it is deliberately retained inline and is never a process boundary. + priceMinor: 1017 + active: true + tags: [travel, wadowice, benchmark, item-017] + item018: + sku: LARGE-018 + name: Large ordinary catalog item 018 + description: This is ordinary host data 018; it is deliberately retained inline and is never a process boundary. + priceMinor: 1018 + active: true + tags: [travel, wadowice, benchmark, item-018] + item019: + sku: LARGE-019 + name: Large ordinary catalog item 019 + description: This is ordinary host data 019; it is deliberately retained inline and is never a process boundary. + priceMinor: 1019 + active: true + tags: [travel, wadowice, benchmark, item-019] + item020: + sku: LARGE-020 + name: Large ordinary catalog item 020 + description: This is ordinary host data 020; it is deliberately retained inline and is never a process boundary. + priceMinor: 1020 + active: true + tags: [travel, wadowice, benchmark, item-020] + item021: + sku: LARGE-021 + name: Large ordinary catalog item 021 + description: This is ordinary host data 021; it is deliberately retained inline and is never a process boundary. + priceMinor: 1021 + active: true + tags: [travel, wadowice, benchmark, item-021] + item022: + sku: LARGE-022 + name: Large ordinary catalog item 022 + description: This is ordinary host data 022; it is deliberately retained inline and is never a process boundary. + priceMinor: 1022 + active: true + tags: [travel, wadowice, benchmark, item-022] + item023: + sku: LARGE-023 + name: Large ordinary catalog item 023 + description: This is ordinary host data 023; it is deliberately retained inline and is never a process boundary. + priceMinor: 1023 + active: true + tags: [travel, wadowice, benchmark, item-023] + item024: + sku: LARGE-024 + name: Large ordinary catalog item 024 + description: This is ordinary host data 024; it is deliberately retained inline and is never a process boundary. + priceMinor: 1024 + active: true + tags: [travel, wadowice, benchmark, item-024] + item025: + sku: LARGE-025 + name: Large ordinary catalog item 025 + description: This is ordinary host data 025; it is deliberately retained inline and is never a process boundary. + priceMinor: 1025 + active: true + tags: [travel, wadowice, benchmark, item-025] + item026: + sku: LARGE-026 + name: Large ordinary catalog item 026 + description: This is ordinary host data 026; it is deliberately retained inline and is never a process boundary. + priceMinor: 1026 + active: true + tags: [travel, wadowice, benchmark, item-026] + item027: + sku: LARGE-027 + name: Large ordinary catalog item 027 + description: This is ordinary host data 027; it is deliberately retained inline and is never a process boundary. + priceMinor: 1027 + active: true + tags: [travel, wadowice, benchmark, item-027] + item028: + sku: LARGE-028 + name: Large ordinary catalog item 028 + description: This is ordinary host data 028; it is deliberately retained inline and is never a process boundary. + priceMinor: 1028 + active: true + tags: [travel, wadowice, benchmark, item-028] + item029: + sku: LARGE-029 + name: Large ordinary catalog item 029 + description: This is ordinary host data 029; it is deliberately retained inline and is never a process boundary. + priceMinor: 1029 + active: true + tags: [travel, wadowice, benchmark, item-029] + item030: + sku: LARGE-030 + name: Large ordinary catalog item 030 + description: This is ordinary host data 030; it is deliberately retained inline and is never a process boundary. + priceMinor: 1030 + active: true + tags: [travel, wadowice, benchmark, item-030] + item031: + sku: LARGE-031 + name: Large ordinary catalog item 031 + description: This is ordinary host data 031; it is deliberately retained inline and is never a process boundary. + priceMinor: 1031 + active: true + tags: [travel, wadowice, benchmark, item-031] + item032: + sku: LARGE-032 + name: Large ordinary catalog item 032 + description: This is ordinary host data 032; it is deliberately retained inline and is never a process boundary. + priceMinor: 1032 + active: true + tags: [travel, wadowice, benchmark, item-032] + item033: + sku: LARGE-033 + name: Large ordinary catalog item 033 + description: This is ordinary host data 033; it is deliberately retained inline and is never a process boundary. + priceMinor: 1033 + active: true + tags: [travel, wadowice, benchmark, item-033] + item034: + sku: LARGE-034 + name: Large ordinary catalog item 034 + description: This is ordinary host data 034; it is deliberately retained inline and is never a process boundary. + priceMinor: 1034 + active: true + tags: [travel, wadowice, benchmark, item-034] + item035: + sku: LARGE-035 + name: Large ordinary catalog item 035 + description: This is ordinary host data 035; it is deliberately retained inline and is never a process boundary. + priceMinor: 1035 + active: true + tags: [travel, wadowice, benchmark, item-035] + item036: + sku: LARGE-036 + name: Large ordinary catalog item 036 + description: This is ordinary host data 036; it is deliberately retained inline and is never a process boundary. + priceMinor: 1036 + active: true + tags: [travel, wadowice, benchmark, item-036] + item037: + sku: LARGE-037 + name: Large ordinary catalog item 037 + description: This is ordinary host data 037; it is deliberately retained inline and is never a process boundary. + priceMinor: 1037 + active: true + tags: [travel, wadowice, benchmark, item-037] + item038: + sku: LARGE-038 + name: Large ordinary catalog item 038 + description: This is ordinary host data 038; it is deliberately retained inline and is never a process boundary. + priceMinor: 1038 + active: true + tags: [travel, wadowice, benchmark, item-038] + item039: + sku: LARGE-039 + name: Large ordinary catalog item 039 + description: This is ordinary host data 039; it is deliberately retained inline and is never a process boundary. + priceMinor: 1039 + active: true + tags: [travel, wadowice, benchmark, item-039] + item040: + sku: LARGE-040 + name: Large ordinary catalog item 040 + description: This is ordinary host data 040; it is deliberately retained inline and is never a process boundary. + priceMinor: 1040 + active: true + tags: [travel, wadowice, benchmark, item-040] + item041: + sku: LARGE-041 + name: Large ordinary catalog item 041 + description: This is ordinary host data 041; it is deliberately retained inline and is never a process boundary. + priceMinor: 1041 + active: true + tags: [travel, wadowice, benchmark, item-041] + item042: + sku: LARGE-042 + name: Large ordinary catalog item 042 + description: This is ordinary host data 042; it is deliberately retained inline and is never a process boundary. + priceMinor: 1042 + active: true + tags: [travel, wadowice, benchmark, item-042] + item043: + sku: LARGE-043 + name: Large ordinary catalog item 043 + description: This is ordinary host data 043; it is deliberately retained inline and is never a process boundary. + priceMinor: 1043 + active: true + tags: [travel, wadowice, benchmark, item-043] + item044: + sku: LARGE-044 + name: Large ordinary catalog item 044 + description: This is ordinary host data 044; it is deliberately retained inline and is never a process boundary. + priceMinor: 1044 + active: true + tags: [travel, wadowice, benchmark, item-044] + item045: + sku: LARGE-045 + name: Large ordinary catalog item 045 + description: This is ordinary host data 045; it is deliberately retained inline and is never a process boundary. + priceMinor: 1045 + active: true + tags: [travel, wadowice, benchmark, item-045] + item046: + sku: LARGE-046 + name: Large ordinary catalog item 046 + description: This is ordinary host data 046; it is deliberately retained inline and is never a process boundary. + priceMinor: 1046 + active: true + tags: [travel, wadowice, benchmark, item-046] + item047: + sku: LARGE-047 + name: Large ordinary catalog item 047 + description: This is ordinary host data 047; it is deliberately retained inline and is never a process boundary. + priceMinor: 1047 + active: true + tags: [travel, wadowice, benchmark, item-047] + item048: + sku: LARGE-048 + name: Large ordinary catalog item 048 + description: This is ordinary host data 048; it is deliberately retained inline and is never a process boundary. + priceMinor: 1048 + active: true + tags: [travel, wadowice, benchmark, item-048] + item049: + sku: LARGE-049 + name: Large ordinary catalog item 049 + description: This is ordinary host data 049; it is deliberately retained inline and is never a process boundary. + priceMinor: 1049 + active: true + tags: [travel, wadowice, benchmark, item-049] + item050: + sku: LARGE-050 + name: Large ordinary catalog item 050 + description: This is ordinary host data 050; it is deliberately retained inline and is never a process boundary. + priceMinor: 1050 + active: true + tags: [travel, wadowice, benchmark, item-050] + item051: + sku: LARGE-051 + name: Large ordinary catalog item 051 + description: This is ordinary host data 051; it is deliberately retained inline and is never a process boundary. + priceMinor: 1051 + active: true + tags: [travel, wadowice, benchmark, item-051] + item052: + sku: LARGE-052 + name: Large ordinary catalog item 052 + description: This is ordinary host data 052; it is deliberately retained inline and is never a process boundary. + priceMinor: 1052 + active: true + tags: [travel, wadowice, benchmark, item-052] + item053: + sku: LARGE-053 + name: Large ordinary catalog item 053 + description: This is ordinary host data 053; it is deliberately retained inline and is never a process boundary. + priceMinor: 1053 + active: true + tags: [travel, wadowice, benchmark, item-053] + item054: + sku: LARGE-054 + name: Large ordinary catalog item 054 + description: This is ordinary host data 054; it is deliberately retained inline and is never a process boundary. + priceMinor: 1054 + active: true + tags: [travel, wadowice, benchmark, item-054] + item055: + sku: LARGE-055 + name: Large ordinary catalog item 055 + description: This is ordinary host data 055; it is deliberately retained inline and is never a process boundary. + priceMinor: 1055 + active: true + tags: [travel, wadowice, benchmark, item-055] + item056: + sku: LARGE-056 + name: Large ordinary catalog item 056 + description: This is ordinary host data 056; it is deliberately retained inline and is never a process boundary. + priceMinor: 1056 + active: true + tags: [travel, wadowice, benchmark, item-056] + item057: + sku: LARGE-057 + name: Large ordinary catalog item 057 + description: This is ordinary host data 057; it is deliberately retained inline and is never a process boundary. + priceMinor: 1057 + active: true + tags: [travel, wadowice, benchmark, item-057] + item058: + sku: LARGE-058 + name: Large ordinary catalog item 058 + description: This is ordinary host data 058; it is deliberately retained inline and is never a process boundary. + priceMinor: 1058 + active: true + tags: [travel, wadowice, benchmark, item-058] + item059: + sku: LARGE-059 + name: Large ordinary catalog item 059 + description: This is ordinary host data 059; it is deliberately retained inline and is never a process boundary. + priceMinor: 1059 + active: true + tags: [travel, wadowice, benchmark, item-059] + item060: + sku: LARGE-060 + name: Large ordinary catalog item 060 + description: This is ordinary host data 060; it is deliberately retained inline and is never a process boundary. + priceMinor: 1060 + active: true + tags: [travel, wadowice, benchmark, item-060] + item061: + sku: LARGE-061 + name: Large ordinary catalog item 061 + description: This is ordinary host data 061; it is deliberately retained inline and is never a process boundary. + priceMinor: 1061 + active: true + tags: [travel, wadowice, benchmark, item-061] + item062: + sku: LARGE-062 + name: Large ordinary catalog item 062 + description: This is ordinary host data 062; it is deliberately retained inline and is never a process boundary. + priceMinor: 1062 + active: true + tags: [travel, wadowice, benchmark, item-062] + item063: + sku: LARGE-063 + name: Large ordinary catalog item 063 + description: This is ordinary host data 063; it is deliberately retained inline and is never a process boundary. + priceMinor: 1063 + active: true + tags: [travel, wadowice, benchmark, item-063] + item064: + sku: LARGE-064 + name: Large ordinary catalog item 064 + description: This is ordinary host data 064; it is deliberately retained inline and is never a process boundary. + priceMinor: 1064 + active: true + tags: [travel, wadowice, benchmark, item-064] + item065: + sku: LARGE-065 + name: Large ordinary catalog item 065 + description: This is ordinary host data 065; it is deliberately retained inline and is never a process boundary. + priceMinor: 1065 + active: true + tags: [travel, wadowice, benchmark, item-065] + item066: + sku: LARGE-066 + name: Large ordinary catalog item 066 + description: This is ordinary host data 066; it is deliberately retained inline and is never a process boundary. + priceMinor: 1066 + active: true + tags: [travel, wadowice, benchmark, item-066] + item067: + sku: LARGE-067 + name: Large ordinary catalog item 067 + description: This is ordinary host data 067; it is deliberately retained inline and is never a process boundary. + priceMinor: 1067 + active: true + tags: [travel, wadowice, benchmark, item-067] + item068: + sku: LARGE-068 + name: Large ordinary catalog item 068 + description: This is ordinary host data 068; it is deliberately retained inline and is never a process boundary. + priceMinor: 1068 + active: true + tags: [travel, wadowice, benchmark, item-068] + item069: + sku: LARGE-069 + name: Large ordinary catalog item 069 + description: This is ordinary host data 069; it is deliberately retained inline and is never a process boundary. + priceMinor: 1069 + active: true + tags: [travel, wadowice, benchmark, item-069] + item070: + sku: LARGE-070 + name: Large ordinary catalog item 070 + description: This is ordinary host data 070; it is deliberately retained inline and is never a process boundary. + priceMinor: 1070 + active: true + tags: [travel, wadowice, benchmark, item-070] + item071: + sku: LARGE-071 + name: Large ordinary catalog item 071 + description: This is ordinary host data 071; it is deliberately retained inline and is never a process boundary. + priceMinor: 1071 + active: true + tags: [travel, wadowice, benchmark, item-071] + item072: + sku: LARGE-072 + name: Large ordinary catalog item 072 + description: This is ordinary host data 072; it is deliberately retained inline and is never a process boundary. + priceMinor: 1072 + active: true + tags: [travel, wadowice, benchmark, item-072] + item073: + sku: LARGE-073 + name: Large ordinary catalog item 073 + description: This is ordinary host data 073; it is deliberately retained inline and is never a process boundary. + priceMinor: 1073 + active: true + tags: [travel, wadowice, benchmark, item-073] + item074: + sku: LARGE-074 + name: Large ordinary catalog item 074 + description: This is ordinary host data 074; it is deliberately retained inline and is never a process boundary. + priceMinor: 1074 + active: true + tags: [travel, wadowice, benchmark, item-074] + item075: + sku: LARGE-075 + name: Large ordinary catalog item 075 + description: This is ordinary host data 075; it is deliberately retained inline and is never a process boundary. + priceMinor: 1075 + active: true + tags: [travel, wadowice, benchmark, item-075] + item076: + sku: LARGE-076 + name: Large ordinary catalog item 076 + description: This is ordinary host data 076; it is deliberately retained inline and is never a process boundary. + priceMinor: 1076 + active: true + tags: [travel, wadowice, benchmark, item-076] + item077: + sku: LARGE-077 + name: Large ordinary catalog item 077 + description: This is ordinary host data 077; it is deliberately retained inline and is never a process boundary. + priceMinor: 1077 + active: true + tags: [travel, wadowice, benchmark, item-077] + item078: + sku: LARGE-078 + name: Large ordinary catalog item 078 + description: This is ordinary host data 078; it is deliberately retained inline and is never a process boundary. + priceMinor: 1078 + active: true + tags: [travel, wadowice, benchmark, item-078] + item079: + sku: LARGE-079 + name: Large ordinary catalog item 079 + description: This is ordinary host data 079; it is deliberately retained inline and is never a process boundary. + priceMinor: 1079 + active: true + tags: [travel, wadowice, benchmark, item-079] + item080: + sku: LARGE-080 + name: Large ordinary catalog item 080 + description: This is ordinary host data 080; it is deliberately retained inline and is never a process boundary. + priceMinor: 1080 + active: true + tags: [travel, wadowice, benchmark, item-080] + item081: + sku: LARGE-081 + name: Large ordinary catalog item 081 + description: This is ordinary host data 081; it is deliberately retained inline and is never a process boundary. + priceMinor: 1081 + active: true + tags: [travel, wadowice, benchmark, item-081] + item082: + sku: LARGE-082 + name: Large ordinary catalog item 082 + description: This is ordinary host data 082; it is deliberately retained inline and is never a process boundary. + priceMinor: 1082 + active: true + tags: [travel, wadowice, benchmark, item-082] + item083: + sku: LARGE-083 + name: Large ordinary catalog item 083 + description: This is ordinary host data 083; it is deliberately retained inline and is never a process boundary. + priceMinor: 1083 + active: true + tags: [travel, wadowice, benchmark, item-083] + item084: + sku: LARGE-084 + name: Large ordinary catalog item 084 + description: This is ordinary host data 084; it is deliberately retained inline and is never a process boundary. + priceMinor: 1084 + active: true + tags: [travel, wadowice, benchmark, item-084] + item085: + sku: LARGE-085 + name: Large ordinary catalog item 085 + description: This is ordinary host data 085; it is deliberately retained inline and is never a process boundary. + priceMinor: 1085 + active: true + tags: [travel, wadowice, benchmark, item-085] + item086: + sku: LARGE-086 + name: Large ordinary catalog item 086 + description: This is ordinary host data 086; it is deliberately retained inline and is never a process boundary. + priceMinor: 1086 + active: true + tags: [travel, wadowice, benchmark, item-086] + item087: + sku: LARGE-087 + name: Large ordinary catalog item 087 + description: This is ordinary host data 087; it is deliberately retained inline and is never a process boundary. + priceMinor: 1087 + active: true + tags: [travel, wadowice, benchmark, item-087] + item088: + sku: LARGE-088 + name: Large ordinary catalog item 088 + description: This is ordinary host data 088; it is deliberately retained inline and is never a process boundary. + priceMinor: 1088 + active: true + tags: [travel, wadowice, benchmark, item-088] + item089: + sku: LARGE-089 + name: Large ordinary catalog item 089 + description: This is ordinary host data 089; it is deliberately retained inline and is never a process boundary. + priceMinor: 1089 + active: true + tags: [travel, wadowice, benchmark, item-089] + item090: + sku: LARGE-090 + name: Large ordinary catalog item 090 + description: This is ordinary host data 090; it is deliberately retained inline and is never a process boundary. + priceMinor: 1090 + active: true + tags: [travel, wadowice, benchmark, item-090] + item091: + sku: LARGE-091 + name: Large ordinary catalog item 091 + description: This is ordinary host data 091; it is deliberately retained inline and is never a process boundary. + priceMinor: 1091 + active: true + tags: [travel, wadowice, benchmark, item-091] + item092: + sku: LARGE-092 + name: Large ordinary catalog item 092 + description: This is ordinary host data 092; it is deliberately retained inline and is never a process boundary. + priceMinor: 1092 + active: true + tags: [travel, wadowice, benchmark, item-092] + item093: + sku: LARGE-093 + name: Large ordinary catalog item 093 + description: This is ordinary host data 093; it is deliberately retained inline and is never a process boundary. + priceMinor: 1093 + active: true + tags: [travel, wadowice, benchmark, item-093] + item094: + sku: LARGE-094 + name: Large ordinary catalog item 094 + description: This is ordinary host data 094; it is deliberately retained inline and is never a process boundary. + priceMinor: 1094 + active: true + tags: [travel, wadowice, benchmark, item-094] + item095: + sku: LARGE-095 + name: Large ordinary catalog item 095 + description: This is ordinary host data 095; it is deliberately retained inline and is never a process boundary. + priceMinor: 1095 + active: true + tags: [travel, wadowice, benchmark, item-095] + item096: + sku: LARGE-096 + name: Large ordinary catalog item 096 + description: This is ordinary host data 096; it is deliberately retained inline and is never a process boundary. + priceMinor: 1096 + active: true + tags: [travel, wadowice, benchmark, item-096] + item097: + sku: LARGE-097 + name: Large ordinary catalog item 097 + description: This is ordinary host data 097; it is deliberately retained inline and is never a process boundary. + priceMinor: 1097 + active: true + tags: [travel, wadowice, benchmark, item-097] + item098: + sku: LARGE-098 + name: Large ordinary catalog item 098 + description: This is ordinary host data 098; it is deliberately retained inline and is never a process boundary. + priceMinor: 1098 + active: true + tags: [travel, wadowice, benchmark, item-098] + item099: + sku: LARGE-099 + name: Large ordinary catalog item 099 + description: This is ordinary host data 099; it is deliberately retained inline and is never a process boundary. + priceMinor: 1099 + active: true + tags: [travel, wadowice, benchmark, item-099] + item100: + sku: LARGE-100 + name: Large ordinary catalog item 100 + description: This is ordinary host data 100; it is deliberately retained inline and is never a process boundary. + priceMinor: 1100 + active: true + tags: [travel, wadowice, benchmark, item-100] + item101: + sku: LARGE-101 + name: Large ordinary catalog item 101 + description: This is ordinary host data 101; it is deliberately retained inline and is never a process boundary. + priceMinor: 1101 + active: true + tags: [travel, wadowice, benchmark, item-101] + item102: + sku: LARGE-102 + name: Large ordinary catalog item 102 + description: This is ordinary host data 102; it is deliberately retained inline and is never a process boundary. + priceMinor: 1102 + active: true + tags: [travel, wadowice, benchmark, item-102] + item103: + sku: LARGE-103 + name: Large ordinary catalog item 103 + description: This is ordinary host data 103; it is deliberately retained inline and is never a process boundary. + priceMinor: 1103 + active: true + tags: [travel, wadowice, benchmark, item-103] + item104: + sku: LARGE-104 + name: Large ordinary catalog item 104 + description: This is ordinary host data 104; it is deliberately retained inline and is never a process boundary. + priceMinor: 1104 + active: true + tags: [travel, wadowice, benchmark, item-104] + item105: + sku: LARGE-105 + name: Large ordinary catalog item 105 + description: This is ordinary host data 105; it is deliberately retained inline and is never a process boundary. + priceMinor: 1105 + active: true + tags: [travel, wadowice, benchmark, item-105] + item106: + sku: LARGE-106 + name: Large ordinary catalog item 106 + description: This is ordinary host data 106; it is deliberately retained inline and is never a process boundary. + priceMinor: 1106 + active: true + tags: [travel, wadowice, benchmark, item-106] + item107: + sku: LARGE-107 + name: Large ordinary catalog item 107 + description: This is ordinary host data 107; it is deliberately retained inline and is never a process boundary. + priceMinor: 1107 + active: true + tags: [travel, wadowice, benchmark, item-107] + item108: + sku: LARGE-108 + name: Large ordinary catalog item 108 + description: This is ordinary host data 108; it is deliberately retained inline and is never a process boundary. + priceMinor: 1108 + active: true + tags: [travel, wadowice, benchmark, item-108] + item109: + sku: LARGE-109 + name: Large ordinary catalog item 109 + description: This is ordinary host data 109; it is deliberately retained inline and is never a process boundary. + priceMinor: 1109 + active: true + tags: [travel, wadowice, benchmark, item-109] + item110: + sku: LARGE-110 + name: Large ordinary catalog item 110 + description: This is ordinary host data 110; it is deliberately retained inline and is never a process boundary. + priceMinor: 1110 + active: true + tags: [travel, wadowice, benchmark, item-110] + item111: + sku: LARGE-111 + name: Large ordinary catalog item 111 + description: This is ordinary host data 111; it is deliberately retained inline and is never a process boundary. + priceMinor: 1111 + active: true + tags: [travel, wadowice, benchmark, item-111] + item112: + sku: LARGE-112 + name: Large ordinary catalog item 112 + description: This is ordinary host data 112; it is deliberately retained inline and is never a process boundary. + priceMinor: 1112 + active: true + tags: [travel, wadowice, benchmark, item-112] + item113: + sku: LARGE-113 + name: Large ordinary catalog item 113 + description: This is ordinary host data 113; it is deliberately retained inline and is never a process boundary. + priceMinor: 1113 + active: true + tags: [travel, wadowice, benchmark, item-113] + item114: + sku: LARGE-114 + name: Large ordinary catalog item 114 + description: This is ordinary host data 114; it is deliberately retained inline and is never a process boundary. + priceMinor: 1114 + active: true + tags: [travel, wadowice, benchmark, item-114] + item115: + sku: LARGE-115 + name: Large ordinary catalog item 115 + description: This is ordinary host data 115; it is deliberately retained inline and is never a process boundary. + priceMinor: 1115 + active: true + tags: [travel, wadowice, benchmark, item-115] + item116: + sku: LARGE-116 + name: Large ordinary catalog item 116 + description: This is ordinary host data 116; it is deliberately retained inline and is never a process boundary. + priceMinor: 1116 + active: true + tags: [travel, wadowice, benchmark, item-116] + item117: + sku: LARGE-117 + name: Large ordinary catalog item 117 + description: This is ordinary host data 117; it is deliberately retained inline and is never a process boundary. + priceMinor: 1117 + active: true + tags: [travel, wadowice, benchmark, item-117] + item118: + sku: LARGE-118 + name: Large ordinary catalog item 118 + description: This is ordinary host data 118; it is deliberately retained inline and is never a process boundary. + priceMinor: 1118 + active: true + tags: [travel, wadowice, benchmark, item-118] + item119: + sku: LARGE-119 + name: Large ordinary catalog item 119 + description: This is ordinary host data 119; it is deliberately retained inline and is never a process boundary. + priceMinor: 1119 + active: true + tags: [travel, wadowice, benchmark, item-119] + item120: + sku: LARGE-120 + name: Large ordinary catalog item 120 + description: This is ordinary host data 120; it is deliberately retained inline and is never a process boundary. + priceMinor: 1120 + active: true + tags: [travel, wadowice, benchmark, item-120] + item121: + sku: LARGE-121 + name: Large ordinary catalog item 121 + description: This is ordinary host data 121; it is deliberately retained inline and is never a process boundary. + priceMinor: 1121 + active: true + tags: [travel, wadowice, benchmark, item-121] + item122: + sku: LARGE-122 + name: Large ordinary catalog item 122 + description: This is ordinary host data 122; it is deliberately retained inline and is never a process boundary. + priceMinor: 1122 + active: true + tags: [travel, wadowice, benchmark, item-122] + item123: + sku: LARGE-123 + name: Large ordinary catalog item 123 + description: This is ordinary host data 123; it is deliberately retained inline and is never a process boundary. + priceMinor: 1123 + active: true + tags: [travel, wadowice, benchmark, item-123] + item124: + sku: LARGE-124 + name: Large ordinary catalog item 124 + description: This is ordinary host data 124; it is deliberately retained inline and is never a process boundary. + priceMinor: 1124 + active: true + tags: [travel, wadowice, benchmark, item-124] + item125: + sku: LARGE-125 + name: Large ordinary catalog item 125 + description: This is ordinary host data 125; it is deliberately retained inline and is never a process boundary. + priceMinor: 1125 + active: true + tags: [travel, wadowice, benchmark, item-125] + item126: + sku: LARGE-126 + name: Large ordinary catalog item 126 + description: This is ordinary host data 126; it is deliberately retained inline and is never a process boundary. + priceMinor: 1126 + active: true + tags: [travel, wadowice, benchmark, item-126] + item127: + sku: LARGE-127 + name: Large ordinary catalog item 127 + description: This is ordinary host data 127; it is deliberately retained inline and is never a process boundary. + priceMinor: 1127 + active: true + tags: [travel, wadowice, benchmark, item-127] + item128: + sku: LARGE-128 + name: Large ordinary catalog item 128 + description: This is ordinary host data 128; it is deliberately retained inline and is never a process boundary. + priceMinor: 1128 + active: true + tags: [travel, wadowice, benchmark, item-128] + item129: + sku: LARGE-129 + name: Large ordinary catalog item 129 + description: This is ordinary host data 129; it is deliberately retained inline and is never a process boundary. + priceMinor: 1129 + active: true + tags: [travel, wadowice, benchmark, item-129] + item130: + sku: LARGE-130 + name: Large ordinary catalog item 130 + description: This is ordinary host data 130; it is deliberately retained inline and is never a process boundary. + priceMinor: 1130 + active: true + tags: [travel, wadowice, benchmark, item-130] + item131: + sku: LARGE-131 + name: Large ordinary catalog item 131 + description: This is ordinary host data 131; it is deliberately retained inline and is never a process boundary. + priceMinor: 1131 + active: true + tags: [travel, wadowice, benchmark, item-131] + item132: + sku: LARGE-132 + name: Large ordinary catalog item 132 + description: This is ordinary host data 132; it is deliberately retained inline and is never a process boundary. + priceMinor: 1132 + active: true + tags: [travel, wadowice, benchmark, item-132] + item133: + sku: LARGE-133 + name: Large ordinary catalog item 133 + description: This is ordinary host data 133; it is deliberately retained inline and is never a process boundary. + priceMinor: 1133 + active: true + tags: [travel, wadowice, benchmark, item-133] + item134: + sku: LARGE-134 + name: Large ordinary catalog item 134 + description: This is ordinary host data 134; it is deliberately retained inline and is never a process boundary. + priceMinor: 1134 + active: true + tags: [travel, wadowice, benchmark, item-134] + item135: + sku: LARGE-135 + name: Large ordinary catalog item 135 + description: This is ordinary host data 135; it is deliberately retained inline and is never a process boundary. + priceMinor: 1135 + active: true + tags: [travel, wadowice, benchmark, item-135] + item136: + sku: LARGE-136 + name: Large ordinary catalog item 136 + description: This is ordinary host data 136; it is deliberately retained inline and is never a process boundary. + priceMinor: 1136 + active: true + tags: [travel, wadowice, benchmark, item-136] + item137: + sku: LARGE-137 + name: Large ordinary catalog item 137 + description: This is ordinary host data 137; it is deliberately retained inline and is never a process boundary. + priceMinor: 1137 + active: true + tags: [travel, wadowice, benchmark, item-137] + item138: + sku: LARGE-138 + name: Large ordinary catalog item 138 + description: This is ordinary host data 138; it is deliberately retained inline and is never a process boundary. + priceMinor: 1138 + active: true + tags: [travel, wadowice, benchmark, item-138] + item139: + sku: LARGE-139 + name: Large ordinary catalog item 139 + description: This is ordinary host data 139; it is deliberately retained inline and is never a process boundary. + priceMinor: 1139 + active: true + tags: [travel, wadowice, benchmark, item-139] + item140: + sku: LARGE-140 + name: Large ordinary catalog item 140 + description: This is ordinary host data 140; it is deliberately retained inline and is never a process boundary. + priceMinor: 1140 + active: true + tags: [travel, wadowice, benchmark, item-140] + item141: + sku: LARGE-141 + name: Large ordinary catalog item 141 + description: This is ordinary host data 141; it is deliberately retained inline and is never a process boundary. + priceMinor: 1141 + active: true + tags: [travel, wadowice, benchmark, item-141] + item142: + sku: LARGE-142 + name: Large ordinary catalog item 142 + description: This is ordinary host data 142; it is deliberately retained inline and is never a process boundary. + priceMinor: 1142 + active: true + tags: [travel, wadowice, benchmark, item-142] + item143: + sku: LARGE-143 + name: Large ordinary catalog item 143 + description: This is ordinary host data 143; it is deliberately retained inline and is never a process boundary. + priceMinor: 1143 + active: true + tags: [travel, wadowice, benchmark, item-143] + item144: + sku: LARGE-144 + name: Large ordinary catalog item 144 + description: This is ordinary host data 144; it is deliberately retained inline and is never a process boundary. + priceMinor: 1144 + active: true + tags: [travel, wadowice, benchmark, item-144] + item145: + sku: LARGE-145 + name: Large ordinary catalog item 145 + description: This is ordinary host data 145; it is deliberately retained inline and is never a process boundary. + priceMinor: 1145 + active: true + tags: [travel, wadowice, benchmark, item-145] + item146: + sku: LARGE-146 + name: Large ordinary catalog item 146 + description: This is ordinary host data 146; it is deliberately retained inline and is never a process boundary. + priceMinor: 1146 + active: true + tags: [travel, wadowice, benchmark, item-146] + item147: + sku: LARGE-147 + name: Large ordinary catalog item 147 + description: This is ordinary host data 147; it is deliberately retained inline and is never a process boundary. + priceMinor: 1147 + active: true + tags: [travel, wadowice, benchmark, item-147] + item148: + sku: LARGE-148 + name: Large ordinary catalog item 148 + description: This is ordinary host data 148; it is deliberately retained inline and is never a process boundary. + priceMinor: 1148 + active: true + tags: [travel, wadowice, benchmark, item-148] + item149: + sku: LARGE-149 + name: Large ordinary catalog item 149 + description: This is ordinary host data 149; it is deliberately retained inline and is never a process boundary. + priceMinor: 1149 + active: true + tags: [travel, wadowice, benchmark, item-149] + item150: + sku: LARGE-150 + name: Large ordinary catalog item 150 + description: This is ordinary host data 150; it is deliberately retained inline and is never a process boundary. + priceMinor: 1150 + active: true + tags: [travel, wadowice, benchmark, item-150] + item151: + sku: LARGE-151 + name: Large ordinary catalog item 151 + description: This is ordinary host data 151; it is deliberately retained inline and is never a process boundary. + priceMinor: 1151 + active: true + tags: [travel, wadowice, benchmark, item-151] + item152: + sku: LARGE-152 + name: Large ordinary catalog item 152 + description: This is ordinary host data 152; it is deliberately retained inline and is never a process boundary. + priceMinor: 1152 + active: true + tags: [travel, wadowice, benchmark, item-152] + item153: + sku: LARGE-153 + name: Large ordinary catalog item 153 + description: This is ordinary host data 153; it is deliberately retained inline and is never a process boundary. + priceMinor: 1153 + active: true + tags: [travel, wadowice, benchmark, item-153] + item154: + sku: LARGE-154 + name: Large ordinary catalog item 154 + description: This is ordinary host data 154; it is deliberately retained inline and is never a process boundary. + priceMinor: 1154 + active: true + tags: [travel, wadowice, benchmark, item-154] + item155: + sku: LARGE-155 + name: Large ordinary catalog item 155 + description: This is ordinary host data 155; it is deliberately retained inline and is never a process boundary. + priceMinor: 1155 + active: true + tags: [travel, wadowice, benchmark, item-155] + item156: + sku: LARGE-156 + name: Large ordinary catalog item 156 + description: This is ordinary host data 156; it is deliberately retained inline and is never a process boundary. + priceMinor: 1156 + active: true + tags: [travel, wadowice, benchmark, item-156] + item157: + sku: LARGE-157 + name: Large ordinary catalog item 157 + description: This is ordinary host data 157; it is deliberately retained inline and is never a process boundary. + priceMinor: 1157 + active: true + tags: [travel, wadowice, benchmark, item-157] + item158: + sku: LARGE-158 + name: Large ordinary catalog item 158 + description: This is ordinary host data 158; it is deliberately retained inline and is never a process boundary. + priceMinor: 1158 + active: true + tags: [travel, wadowice, benchmark, item-158] + item159: + sku: LARGE-159 + name: Large ordinary catalog item 159 + description: This is ordinary host data 159; it is deliberately retained inline and is never a process boundary. + priceMinor: 1159 + active: true + tags: [travel, wadowice, benchmark, item-159] + item160: + sku: LARGE-160 + name: Large ordinary catalog item 160 + description: This is ordinary host data 160; it is deliberately retained inline and is never a process boundary. + priceMinor: 1160 + active: true + tags: [travel, wadowice, benchmark, item-160] + item161: + sku: LARGE-161 + name: Large ordinary catalog item 161 + description: This is ordinary host data 161; it is deliberately retained inline and is never a process boundary. + priceMinor: 1161 + active: true + tags: [travel, wadowice, benchmark, item-161] + item162: + sku: LARGE-162 + name: Large ordinary catalog item 162 + description: This is ordinary host data 162; it is deliberately retained inline and is never a process boundary. + priceMinor: 1162 + active: true + tags: [travel, wadowice, benchmark, item-162] + item163: + sku: LARGE-163 + name: Large ordinary catalog item 163 + description: This is ordinary host data 163; it is deliberately retained inline and is never a process boundary. + priceMinor: 1163 + active: true + tags: [travel, wadowice, benchmark, item-163] + item164: + sku: LARGE-164 + name: Large ordinary catalog item 164 + description: This is ordinary host data 164; it is deliberately retained inline and is never a process boundary. + priceMinor: 1164 + active: true + tags: [travel, wadowice, benchmark, item-164] + item165: + sku: LARGE-165 + name: Large ordinary catalog item 165 + description: This is ordinary host data 165; it is deliberately retained inline and is never a process boundary. + priceMinor: 1165 + active: true + tags: [travel, wadowice, benchmark, item-165] + item166: + sku: LARGE-166 + name: Large ordinary catalog item 166 + description: This is ordinary host data 166; it is deliberately retained inline and is never a process boundary. + priceMinor: 1166 + active: true + tags: [travel, wadowice, benchmark, item-166] + item167: + sku: LARGE-167 + name: Large ordinary catalog item 167 + description: This is ordinary host data 167; it is deliberately retained inline and is never a process boundary. + priceMinor: 1167 + active: true + tags: [travel, wadowice, benchmark, item-167] + item168: + sku: LARGE-168 + name: Large ordinary catalog item 168 + description: This is ordinary host data 168; it is deliberately retained inline and is never a process boundary. + priceMinor: 1168 + active: true + tags: [travel, wadowice, benchmark, item-168] + item169: + sku: LARGE-169 + name: Large ordinary catalog item 169 + description: This is ordinary host data 169; it is deliberately retained inline and is never a process boundary. + priceMinor: 1169 + active: true + tags: [travel, wadowice, benchmark, item-169] + item170: + sku: LARGE-170 + name: Large ordinary catalog item 170 + description: This is ordinary host data 170; it is deliberately retained inline and is never a process boundary. + priceMinor: 1170 + active: true + tags: [travel, wadowice, benchmark, item-170] + item171: + sku: LARGE-171 + name: Large ordinary catalog item 171 + description: This is ordinary host data 171; it is deliberately retained inline and is never a process boundary. + priceMinor: 1171 + active: true + tags: [travel, wadowice, benchmark, item-171] + item172: + sku: LARGE-172 + name: Large ordinary catalog item 172 + description: This is ordinary host data 172; it is deliberately retained inline and is never a process boundary. + priceMinor: 1172 + active: true + tags: [travel, wadowice, benchmark, item-172] + item173: + sku: LARGE-173 + name: Large ordinary catalog item 173 + description: This is ordinary host data 173; it is deliberately retained inline and is never a process boundary. + priceMinor: 1173 + active: true + tags: [travel, wadowice, benchmark, item-173] + item174: + sku: LARGE-174 + name: Large ordinary catalog item 174 + description: This is ordinary host data 174; it is deliberately retained inline and is never a process boundary. + priceMinor: 1174 + active: true + tags: [travel, wadowice, benchmark, item-174] + item175: + sku: LARGE-175 + name: Large ordinary catalog item 175 + description: This is ordinary host data 175; it is deliberately retained inline and is never a process boundary. + priceMinor: 1175 + active: true + tags: [travel, wadowice, benchmark, item-175] + item176: + sku: LARGE-176 + name: Large ordinary catalog item 176 + description: This is ordinary host data 176; it is deliberately retained inline and is never a process boundary. + priceMinor: 1176 + active: true + tags: [travel, wadowice, benchmark, item-176] + item177: + sku: LARGE-177 + name: Large ordinary catalog item 177 + description: This is ordinary host data 177; it is deliberately retained inline and is never a process boundary. + priceMinor: 1177 + active: true + tags: [travel, wadowice, benchmark, item-177] + item178: + sku: LARGE-178 + name: Large ordinary catalog item 178 + description: This is ordinary host data 178; it is deliberately retained inline and is never a process boundary. + priceMinor: 1178 + active: true + tags: [travel, wadowice, benchmark, item-178] + item179: + sku: LARGE-179 + name: Large ordinary catalog item 179 + description: This is ordinary host data 179; it is deliberately retained inline and is never a process boundary. + priceMinor: 1179 + active: true + tags: [travel, wadowice, benchmark, item-179] + item180: + sku: LARGE-180 + name: Large ordinary catalog item 180 + description: This is ordinary host data 180; it is deliberately retained inline and is never a process boundary. + priceMinor: 1180 + active: true + tags: [travel, wadowice, benchmark, item-180] +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/large-order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + merchantChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/large-order/bob + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/large-order-host + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/payNote] + attachPayNote: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /payNote + val: {$binding: event/message/request/document} + - $appendChange: {op: replace, path: /hostStatus, val: PayNote Attached} + - $appendChange: + op: replace + path: /hostOperationCount + val: {$add: [$document: /hostOperationCount, 1]} + - $return: true + touchHost: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: + note: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /hostRevision + val: {$add: [$document: /hostRevision, 1]} + - $appendChange: + op: replace + path: /hostOperationCount + val: {$add: [$document: /hostOperationCount, 1]} + - $appendChange: {op: replace, path: /hostStatus, val: Host Updated} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /payNote + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /observedPayNoteStatus + val: {$binding: event/message/request/after/status} + - $appendChange: + op: replace + path: /observedAuthorizationCount + val: {$binding: event/message/request/after/authorizationCountState} + - $appendChange: + op: replace + path: /payNoteRevisionCount + val: {$add: [$document: /payNoteRevisionCount, 1]} + - $return: true + unrelatedWorkflow01: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow02: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow03: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow04: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow05: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow06: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow07: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow08: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow09: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow10: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow11: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow12: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow13: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow14: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow15: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow16: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow17: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow18: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow19: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow20: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow21: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow22: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow23: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow24: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow25: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow26: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow27: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow28: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow29: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow30: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow31: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow32: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow33: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow34: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow35: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow36: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow37: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow38: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow39: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true + unrelatedWorkflow40: + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $return: true diff --git a/src/integrationTest/resources/examples/clean/large-paynote.yaml b/src/integrationTest/resources/examples/clean/large-paynote.yaml new file mode 100644 index 0000000..0d89aa3 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/large-paynote.yaml @@ -0,0 +1,1037 @@ +documentId: large-paynote +name: ACME Hotel & Dinner PayNote +status: Awaiting Product Conditions +attachedBy: Alice +validationMethod: "Order policy: exact amount, PLN, ACME guarantor" +payer: {actorId: alice, name: Alice} +payee: {actorId: bob, name: Travel Agency} +guarantor: {actorId: myos-admin, name: Acme Bank} +currency: PLN +authorizationAuthorizedAmountMinorState: 0 +authorizationCountState: 0 +hotelConditionAttachedState: false +restaurantConditionAttachedState: false +hotelConfirmedState: false +restaurantConfirmedState: false +captureReadinessConfirmedState: 0 +captureRequestedState: false +captureRequestedAtState: 0 +captureCompletedState: false +refundRequestedState: false +refundCompletedState: false +refundRequestIdState: none +refundAmountMinorState: 0 +refundReasonState: none +capturedAmountMinorState: 0 +amount: + expectedTotal: 130000 + expected: 130000 + captured: 0 + currency: PLN +authorization: + state: Not Authorized + authorizationId: + authorizedAmountMinor: 0 + currency: PLN + authorizedAt: + authorizationCount: 0 +attachedConditions: {hotel: false, restaurant: false} +captureReadiness: {confirmed: 0, required: 2} +capture: + requested: false + requestCount: 0 + requestId: + requestedAt: + completed: false + completedAt: + capturedBy: +refund: + requested: false + requestId: + amountMinor: 0 + reason: + completed: false + completedAt: +productConditions: + hotel: + sourceProductPath: /product/products/hotel + expectedProductKey: hotel + expectedProductName: Hotel Mlyn Jacka Stay + expectedProductIdentity: wadowice-order-2026-v1:hotel:v1 + sourceOrderId: wadowice-order-2026-v1 + status: Listening + deliveryStatus: Awaiting live confirmation + confirmed: false + done: false + captureConditionSatisfied: false + lastProcessedSourceTimestamp: + product: + documentId: large-paynote-hotel-condition-product + name: Hotel Mlyn Jacka Stay Condition Listener + productKey: hotel + sourceOrderId: wadowice-order-2026-v1 + confirmed: false + confirmedAt: 0 + done: false + contracts: + providerChannel: + description: Live Wadowice Hotel Product Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/celine + actor: + type: MyOS/Principal Actor + accountId: celine + confirmProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationReference: {type: Text} + steps: + - name: Apply Live Hotel Confirmation + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /confirmed, val: true} + - $appendChange: + op: replace + path: /confirmedAt + val: {$binding: event/timestamp} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Confirmed + productKey: hotel + sourcePath: /product/products/hotel + sourceActorId: celine + sourceTimestamp: {$binding: event/timestamp} + - $return: true + completeProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationCode: {type: Text} + note: {type: Text} + steps: + - name: Apply Live Hotel Completion + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$binding: event/message/request/confirmationCode, WAD-7429]} + then: + - $appendChange: {op: replace, path: /done, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Done + productKey: hotel + sourcePath: /product/products/hotel + sourceActorId: celine + sourceTimestamp: {$binding: event/timestamp} + - $return: true + restaurant: + sourceProductPath: /product/products/restaurant + expectedProductKey: restaurant + expectedProductName: Old Town Restaurant Dinner + expectedProductIdentity: wadowice-order-2026-v1:restaurant:v1 + sourceOrderId: wadowice-order-2026-v1 + status: Listening + deliveryStatus: Awaiting live confirmation + confirmed: false + done: false + cancelled: false + discountApplied: false + captureConditionSatisfied: false + lastProcessedSourceTimestamp: + product: + documentId: large-paynote-restaurant-condition-product + name: Old Town Restaurant Condition Listener + productKey: restaurant + sourceOrderId: wadowice-order-2026-v1 + confirmed: false + confirmedAt: 0 + done: false + cancelled: false + discountApplied: false + contracts: + providerChannel: + description: Live Old Town Restaurant Product Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/david + actor: + type: MyOS/Principal Actor + accountId: david + customerChannel: + description: Live Alice Restaurant cancellation Timeline + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + type: Coordination/Timeline Channel + confirmProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationReference: {type: Text} + steps: + - name: Apply Live Restaurant Confirmation + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /confirmed, val: true} + - $appendChange: + op: replace + path: /confirmedAt + val: {$binding: event/timestamp} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Confirmed + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + - $return: true + completeProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationCode: {type: Text} + note: {type: Text} + steps: + - name: Apply Live Restaurant Completion + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$binding: event/message/request/confirmationCode, WAD-7429]} + then: + - $appendChange: {op: replace, path: /done, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Done + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + - $return: true + completeWithDiscount: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationCode: {type: Text} + note: {type: Text} + steps: + - name: Apply Live Restaurant Discount Completion + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$binding: event/message/request/confirmationCode, WAD-7429]} + then: + - $appendChange: {op: replace, path: /done, val: true} + - $appendChange: {op: replace, path: /discountApplied, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Done + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Discount Applied + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + discountPercent: 10 + amountMinor: 3800 + - $return: true + cancelWithinRange: + type: Coordination/Sequential Workflow Operation + channel: customerChannel + request: + reason: {type: Text} + steps: + - name: Apply Live Restaurant Cancellation + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /cancelled, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Cancelled + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: alice + sourceTimestamp: {$binding: event/timestamp} + refundable: true + amountMinor: 38000 + reason: {$binding: event/message/request/reason} + - $return: true + cancelOutsideRange: + type: Coordination/Sequential Workflow Operation + channel: customerChannel + request: + reason: {type: Text} + steps: + - name: Refuse Late Restaurant Cancellation + type: Coordination/Compute + do: + - $appendEvent: + type: Coordination/Event + kind: Commerce/Change Declined + productKey: restaurant + reason: {$binding: event/message/request/reason} + - $return: true +contracts: + payerChannel: + description: Alice PayNote Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + payeeChannel: + description: Travel Agency PayNote Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/bob + actor: + type: MyOS/Principal Actor + accountId: bob + customerChannel: + description: Alice Order payment Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + merchantChannel: + description: Travel Agency payment Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/bob + actor: + type: MyOS/Principal Actor + accountId: bob + guarantorChannel: + description: ACME guarantor Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/myos-admin + actor: + type: MyOS/MyOS Admin Actor + accountId: myos-admin + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/large-paynote + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: + - /productConditions/hotel/product + - /productConditions/restaurant/product + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - name: Apply Exact Product Epoch + type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $if: + cond: + $and: + - $eq: [$binding: event/message/request/childDocumentId, large-paynote-hotel-condition-product] + - $eq: [$binding: event/message/request/after/confirmed, true] + - $eq: [$document: /hotelConfirmedState, false] + then: + - $appendChange: {op: replace, path: /productConditions/hotel/confirmed, val: true} + - $appendChange: {op: replace, path: /hotelConfirmedState, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/captureConditionSatisfied, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/status, val: Confirmed} + - $appendChange: {op: replace, path: /productConditions/hotel/deliveryStatus, val: Live confirmation received} + - $appendChange: + op: replace + path: /productConditions/hotel/lastProcessedSourceTimestamp + val: {$binding: event/message/request/after/confirmedAt} + - $appendChange: + op: replace + path: /captureReadiness + val: + confirmed: {$add: [$document: /captureReadinessConfirmedState, 1]} + required: 2 + - $appendChange: + op: replace + path: /captureReadinessConfirmedState + val: {$add: [$document: /captureReadinessConfirmedState, 1]} + - $if: + cond: + $and: + - $eq: [$binding: event/message/request/childDocumentId, large-paynote-restaurant-condition-product] + - $eq: [$binding: event/message/request/after/confirmed, true] + - $eq: [$document: /restaurantConfirmedState, false] + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/confirmed, val: true} + - $appendChange: {op: replace, path: /restaurantConfirmedState, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/captureConditionSatisfied, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Confirmed} + - $appendChange: {op: replace, path: /productConditions/restaurant/deliveryStatus, val: Live confirmation received} + - $appendChange: + op: replace + path: /productConditions/restaurant/lastProcessedSourceTimestamp + val: {$binding: event/message/request/after/confirmedAt} + - $appendChange: + op: replace + path: /captureReadiness + val: + confirmed: {$add: [$document: /captureReadinessConfirmedState, 1]} + required: 2 + - $appendChange: + op: replace + path: /captureReadinessConfirmedState + val: {$add: [$document: /captureReadinessConfirmedState, 1]} + - $if: + cond: + $and: + - $eq: [$binding: event/message/request/childDocumentId, large-paynote-hotel-condition-product] + - $eq: [$binding: event/message/request/after/done, true] + then: + - $appendChange: {op: replace, path: /productConditions/hotel/done, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/status, val: Done} + - $if: + cond: + $and: + - $eq: [$binding: event/message/request/childDocumentId, large-paynote-restaurant-condition-product] + - $eq: [$binding: event/message/request/after/done, true] + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/done, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Done} + - $if: + cond: + $and: + - $eq: [$binding: event/message/request/childDocumentId, large-paynote-restaurant-condition-product] + - $eq: [$binding: event/message/request/after/cancelled, true] + - $eq: [$document: /refundRequestedState, false] + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/cancelled, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Cancelled - Refund Requested} + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: restaurant-refund-001 + amountMinor: 38000 + reason: Restaurant cancelled within refund window + completed: false + completedAt: + - $appendChange: {op: replace, path: /refundRequestedState, val: true} + - $appendChange: {op: replace, path: /refundRequestIdState, val: restaurant-refund-001} + - $appendChange: {op: replace, path: /refundAmountMinorState, val: 38000} + - $appendChange: {op: replace, path: /refundReasonState, val: Restaurant cancelled within refund window} + - $appendChange: {op: replace, path: /status, val: Restaurant Refund Requested} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Requested + requestId: restaurant-refund-001 + amount: {amountMinor: 38000, currency: PLN} + - $if: + cond: + $and: + - $eq: [$binding: event/message/request/childDocumentId, large-paynote-restaurant-condition-product] + - $eq: [$binding: event/message/request/after/discountApplied, true] + - $eq: [$document: /refundRequestedState, false] + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/discountApplied, val: true} + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: restaurant-discount-001 + amountMinor: 3800 + reason: Restaurant 10% service discount + completed: false + completedAt: + - $appendChange: {op: replace, path: /refundRequestedState, val: true} + - $appendChange: {op: replace, path: /refundRequestIdState, val: restaurant-discount-001} + - $appendChange: {op: replace, path: /refundAmountMinorState, val: 3800} + - $appendChange: {op: replace, path: /refundReasonState, val: Restaurant 10% service discount} + - $appendChange: {op: replace, path: /status, val: Restaurant Discount Refund Requested} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Requested + requestId: restaurant-discount-001 + amount: {amountMinor: 3800, currency: PLN} + - $return: true + - name: Request Capture Once after Both Conditions + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$document: /captureRequestedState, false] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$binding: event/message/request/after/confirmedAt} + completed: false + completedAt: + capturedBy: + - $appendChange: {op: replace, path: /captureRequestedState, val: true} + - $appendChange: + op: replace + path: /captureRequestedAtState + val: {$binding: event/message/request/after/confirmedAt} + - $appendChange: {op: replace, path: /status, val: Awaiting ACME Capture} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Capture Funds Requested + requestId: package-capture-001 + recipientActorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + authorizeAmount: + name: Authorize PayNote Amount + description: Record one immutable ACME authorization decision from the guarantor Timeline. + type: Coordination/Sequential Workflow Operation + channel: guarantorChannel + request: + authorizationId: {type: Text} + amountMinor: {type: Integer} + currency: {type: Text} + steps: + - name: Apply Amount Authorization + type: Coordination/Compute + do: + - $let: + order: + - authorizationId + - amountMinor + - requestedCurrency + vars: + authorizationId: {$binding: event/message/request/authorizationId} + amountMinor: {$binding: event/message/request/amountMinor} + requestedCurrency: {$binding: event/message/request/currency} + - $if: + cond: + $or: + - $not: + $truthy: {$var: authorizationId} + - $lte: [$var: amountMinor, 0] + - $ne: [$var: requestedCurrency, $document: /currency] + then: + - $appendEvent: + type: Coordination/Event + kind: Validation Error + message: Amount authorization requires a non-empty id, a positive amount, and the PayNote currency. + - $if: + cond: + $and: + - $truthy: {$var: authorizationId} + - $not: + $lte: [$var: amountMinor, 0] + - $eq: [$var: requestedCurrency, $document: /currency] + then: + - $if: + cond: {$eq: [$document: /authorizationCountState, 1]} + then: + - $appendChange: + op: replace + path: /authorization + val: + state: Authorized + authorizationId: {$var: authorizationId} + authorizedAmountMinor: + $add: + - $document: /authorizationAuthorizedAmountMinorState + - $var: amountMinor + currency: {$var: requestedCurrency} + authorizedAt: {$binding: event/timestamp} + authorizationCount: {$add: [$document: /authorizationCountState, 1]} + - $appendChange: + op: replace + path: /authorizationAuthorizedAmountMinorState + val: + $add: + - $document: /authorizationAuthorizedAmountMinorState + - $var: amountMinor + - $appendChange: + op: replace + path: /authorizationCountState + val: {$add: [$document: /authorizationCountState, 1]} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Amount Authorized + authorizationId: {$var: authorizationId} + amountMinor: {$var: amountMinor} + currency: {$var: requestedCurrency} + authorizedBy: myos-admin + authorizedAt: {$binding: event/timestamp} + - $return: true + hotelConditionEvents: + type: Embedded Node Channel + sourcePath: /productConditions/hotel/product + restaurantConditionEvents: + type: Embedded Node Channel + sourcePath: /productConditions/restaurant/product + attachHotelCondition: + name: Attach Wadowice Hotel as Capture Condition + description: Attach the trusted Hotel view for later provider entries. + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: + productKey: {type: Text} + sourceProductPath: {type: Text} + expectedProductName: {type: Text} + expectedProductIdentity: {type: Text} + sourceOrderId: {type: Text} + steps: + - name: Attach Hotel Product Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConditionAttachedState, false] + - $eq: [$binding: event/message/request/productKey, hotel] + - $eq: [$binding: event/message/request/sourceProductPath, /product/products/hotel] + - $eq: [$binding: event/message/request/expectedProductName, Hotel Mlyn Jacka Stay] + - $eq: [$binding: event/message/request/expectedProductIdentity, "wadowice-order-2026-v1:hotel:v1"] + - $eq: [$binding: event/message/request/sourceOrderId, wadowice-order-2026-v1] + then: + - $appendChange: + op: replace + path: /attachedConditions + val: + hotel: true + restaurant: {$document: /restaurantConditionAttachedState} + - $appendChange: {op: replace, path: /hotelConditionAttachedState, val: true} + - $appendChange: {op: replace, path: /status, val: Awaiting Product Confirmations} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Attached + productKey: hotel + sourcePath: /product/products/hotel + - $return: true + attachRestaurantCondition: + name: Attach Old Town Restaurant as Capture Condition + description: Attach the trusted Restaurant view for later provider entries. + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: + productKey: {type: Text} + sourceProductPath: {type: Text} + expectedProductName: {type: Text} + expectedProductIdentity: {type: Text} + sourceOrderId: {type: Text} + steps: + - name: Attach Restaurant Product Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /restaurantConditionAttachedState, false] + - $eq: [$binding: event/message/request/productKey, restaurant] + - $eq: [$binding: event/message/request/sourceProductPath, /product/products/restaurant] + - $eq: [$binding: event/message/request/expectedProductName, Old Town Restaurant Dinner] + - $eq: [$binding: event/message/request/expectedProductIdentity, "wadowice-order-2026-v1:restaurant:v1"] + - $eq: [$binding: event/message/request/sourceOrderId, wadowice-order-2026-v1] + then: + - $appendChange: + op: replace + path: /attachedConditions + val: + hotel: {$document: /hotelConditionAttachedState} + restaurant: true + - $appendChange: {op: replace, path: /restaurantConditionAttachedState, val: true} + - $appendChange: {op: replace, path: /status, val: Awaiting Product Confirmations} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Attached + productKey: restaurant + sourcePath: /product/products/restaurant + - $return: true + observeHotelConfirmed: + type: Coordination/Sequential Workflow + channel: hotelConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Confirmed} + steps: + - name: Apply Hotel Confirmation Condition + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /hotelConfirmedState, false]} + then: + # Keep leaf patches here: this condition object owns an active + # Process Embedded `product`, so replacing the parent from a + # frozen $document view can rewind the child's live state. + - $appendChange: {op: replace, path: /productConditions/hotel/confirmed, val: true} + - $appendChange: {op: replace, path: /hotelConfirmedState, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/captureConditionSatisfied, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/status, val: Confirmed} + - $appendChange: {op: replace, path: /productConditions/hotel/deliveryStatus, val: Live confirmation + received} + - $appendChange: + op: replace + path: /productConditions/hotel/lastProcessedSourceTimestamp + val: {$binding: event/sourceTimestamp} + - $appendChange: + op: replace + path: /captureReadiness + val: + confirmed: {$add: [$document: /captureReadinessConfirmedState, 1]} + required: 2 + - $appendChange: + op: replace + path: /captureReadinessConfirmedState + val: {$add: [$document: /captureReadinessConfirmedState, 1]} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Satisfied + productKey: hotel + sourcePath: /product/products/hotel + - $return: true + - name: Request Capture after Hotel Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$document: /captureRequestedState, false] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$binding: event/sourceTimestamp} + completed: false + completedAt: + capturedBy: + - $appendChange: {op: replace, path: /captureRequestedState, val: true} + - $appendChange: + op: replace + path: /captureRequestedAtState + val: {$binding: event/sourceTimestamp} + - $appendChange: {op: replace, path: /status, val: Awaiting ACME Capture} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Capture Funds Requested + requestId: package-capture-001 + requestedOperation: capturePayment + requestedOperationScopedKey: /payNotes/packagePayment::capturePayment + sourceDocumentPath: /payNotes/packagePayment/productConditions/hotel/product + targetDocumentPath: /payNotes/packagePayment + recipientActorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + observeRestaurantConfirmed: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Confirmed} + steps: + - name: Apply Restaurant Confirmation Condition + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /restaurantConfirmedState, false]} + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/confirmed, val: true} + - $appendChange: {op: replace, path: /restaurantConfirmedState, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/captureConditionSatisfied, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Confirmed} + - $appendChange: {op: replace, path: /productConditions/restaurant/deliveryStatus, val: Live + confirmation received} + - $appendChange: + op: replace + path: /productConditions/restaurant/lastProcessedSourceTimestamp + val: {$binding: event/sourceTimestamp} + - $appendChange: + op: replace + path: /captureReadiness + val: + confirmed: {$add: [$document: /captureReadinessConfirmedState, 1]} + required: 2 + - $appendChange: + op: replace + path: /captureReadinessConfirmedState + val: {$add: [$document: /captureReadinessConfirmedState, 1]} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Satisfied + productKey: restaurant + sourcePath: /product/products/restaurant + - $return: true + - name: Request Capture after Restaurant Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$document: /captureRequestedState, false] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$binding: event/sourceTimestamp} + completed: false + completedAt: + capturedBy: + - $appendChange: {op: replace, path: /captureRequestedState, val: true} + - $appendChange: + op: replace + path: /captureRequestedAtState + val: {$binding: event/sourceTimestamp} + - $appendChange: {op: replace, path: /status, val: Awaiting ACME Capture} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Capture Funds Requested + requestId: package-capture-001 + requestedOperation: capturePayment + requestedOperationScopedKey: /payNotes/packagePayment::capturePayment + sourceDocumentPath: /payNotes/packagePayment/productConditions/restaurant/product + targetDocumentPath: /payNotes/packagePayment + recipientActorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + observeHotelDone: + type: Coordination/Sequential Workflow + channel: hotelConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Done} + steps: + - name: Apply Hotel Completion + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /productConditions/hotel/done, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/status, val: Done} + - $return: true + observeRestaurantDone: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Done} + steps: + - name: Apply Restaurant Completion + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /productConditions/restaurant/done, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Done} + - $return: true + observeRestaurantCancellation: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Cancelled} + steps: + - name: Request Refund for Restaurant Cancellation + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /refundRequestedState, false]} + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/cancelled, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Cancelled - Refund + Requested} + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: restaurant-refund-001 + amountMinor: 38000 + reason: Restaurant cancelled within refund window + completed: false + completedAt: + - $appendChange: {op: replace, path: /refundRequestedState, val: true} + - $appendChange: {op: replace, path: /refundRequestIdState, val: restaurant-refund-001} + - $appendChange: {op: replace, path: /refundAmountMinorState, val: 38000} + - $appendChange: {op: replace, path: /refundReasonState, val: Restaurant cancelled within refund + window} + - $appendChange: {op: replace, path: /status, val: Restaurant Refund Requested} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Requested + requestId: restaurant-refund-001 + requestedOperation: refundPayment + requestedOperationScopedKey: /payNotes/packagePayment::refundPayment + recipientActorId: myos-admin + amount: {amountMinor: 38000, currency: PLN} + reason: Restaurant cancelled within refund window + - $return: true + observeRestaurantDiscount: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Discount Applied} + steps: + - name: Request Restaurant Discount Refund + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /refundRequestedState, false]} + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/discountApplied, val: true} + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: restaurant-discount-001 + amountMinor: 3800 + reason: Restaurant 10% service discount + completed: false + completedAt: + - $appendChange: {op: replace, path: /refundRequestedState, val: true} + - $appendChange: {op: replace, path: /refundRequestIdState, val: restaurant-discount-001} + - $appendChange: {op: replace, path: /refundAmountMinorState, val: 3800} + - $appendChange: {op: replace, path: /refundReasonState, val: Restaurant 10% service discount} + - $appendChange: {op: replace, path: /status, val: Restaurant Discount Refund Requested} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Requested + requestId: restaurant-discount-001 + requestedOperation: refundPayment + requestedOperationScopedKey: /payNotes/packagePayment::refundPayment + recipientActorId: myos-admin + amount: {amountMinor: 3800, currency: PLN} + reason: Restaurant 10% service discount + - $return: true + capturePayment: + name: Confirm Payment Guarantee + description: Acme Bank confirms the Hotel and Restaurant payment guarantee. + type: Coordination/Sequential Workflow Operation + channel: guarantorChannel + request: + requestId: {type: Text} + amountMinor: {type: Integer} + currency: {type: Text} + steps: + - name: Capture Package Payment + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /captureRequestedState, true] + - $eq: [$document: /captureCompletedState, false] + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$binding: event/message/request/requestId, package-capture-001] + - $eq: [$binding: event/message/request/amountMinor, 130000] + - $eq: [$binding: event/message/request/currency, PLN] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$document: /captureRequestedAtState} + completed: true + completedAt: {$binding: event/timestamp} + capturedBy: Acme Bank + - $appendChange: {op: replace, path: /captureCompletedState, val: true} + - $appendChange: + op: replace + path: /amount + val: {expectedTotal: 130000, expected: 130000, captured: 130000, currency: PLN} + - $appendChange: {op: replace, path: /capturedAmountMinorState, val: 130000} + - $appendChange: {op: replace, path: /status, val: Completed} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Payment Completed + requestId: package-capture-001 + actorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + refundPayment: + name: Confirm Partial Refund + description: Acme Bank returns the requested Restaurant adjustment to Alice. + type: Coordination/Sequential Workflow Operation + channel: guarantorChannel + request: + requestId: {type: Text} + amountMinor: {type: Integer} + currency: {type: Text} + steps: + - name: Refund Restaurant Adjustment + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /refundRequestedState, true] + - $eq: [$document: /refundCompletedState, false] + - $eq: [$binding: event/message/request/requestId, $document: /refundRequestIdState] + - $eq: [$binding: event/message/request/amountMinor, $document: /refundAmountMinorState] + - $eq: [$binding: event/message/request/currency, PLN] + then: + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: {$document: /refundRequestIdState} + amountMinor: {$document: /refundAmountMinorState} + reason: {$document: /refundReasonState} + completed: true + completedAt: {$binding: event/timestamp} + - $appendChange: {op: replace, path: /refundCompletedState, val: true} + - $appendChange: + op: replace + path: /amount + val: + expectedTotal: 130000 + expected: 130000 + captured: {$subtract: [$document: /capturedAmountMinorState, $document: /refundAmountMinorState]} + currency: PLN + - $appendChange: + op: replace + path: /capturedAmountMinorState + val: {$subtract: [$document: /capturedAmountMinorState, $document: /refundAmountMinorState]} + - $appendChange: {op: replace, path: /status, val: Partial Refund Completed} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Completed + requestId: {$binding: event/message/request/requestId} + amount: + amountMinor: {$binding: event/message/request/amountMinor} + currency: PLN + - $return: true diff --git a/src/integrationTest/resources/examples/clean/nba-game-host.yaml b/src/integrationTest/resources/examples/clean/nba-game-host.yaml new file mode 100644 index 0000000..2c42d8b --- /dev/null +++ b/src/integrationTest/resources/examples/clean/nba-game-host.yaml @@ -0,0 +1,89 @@ +documentId: nba-game-host +name: NBA Game Host +hostOperationCount: 0 +gameEnded: false +gameEndedEventCount: 0 +observedHomeScore: 0 +observedAwayScore: 0 +observedPlayCount: 0 +observedStatus: None +revisionApplications: 0 +contracts: + hostChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nba/host + actor: + type: MyOS/Principal Actor + accountId: host-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nba-game-host + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/game] + touchHost: + type: Coordination/Sequential Workflow Operation + channel: hostChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /hostOperationCount + val: {$add: [$document: /hostOperationCount, 1]} + - $return: true + attachGame: + type: Coordination/Sequential Workflow Operation + channel: hostChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /game, val: {$binding: event/message/request/document}} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /game, val: {$binding: event/message/request/after}} + - $appendChange: {op: replace, path: /observedHomeScore, val: {$binding: event/message/request/after/homeScore}} + - $appendChange: {op: replace, path: /observedAwayScore, val: {$binding: event/message/request/after/awayScore}} + - $appendChange: {op: replace, path: /observedPlayCount, val: {$binding: event/message/request/after/playCount}} + - $appendChange: {op: replace, path: /observedStatus, val: {$binding: event/message/request/after/status}} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: + name: emittedEvent + path: /kind + - NBA/Game Ended + then: + - $appendChange: {op: replace, path: /gameEnded, val: true} + - $appendChange: + op: replace + path: /gameEndedEventCount + val: {$add: [$document: /gameEndedEventCount, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/nba-game.yaml b/src/integrationTest/resources/examples/clean/nba-game.yaml new file mode 100644 index 0000000..6ebb6ac --- /dev/null +++ b/src/integrationTest/resources/examples/clean/nba-game.yaml @@ -0,0 +1,93 @@ +documentId: nba-game-2016-lal-min +name: Lakers at Timberwolves 2016 Historical Game +status: Scheduled +homeTeam: MIN +awayTeam: LAL +homeScore: 0 +awayScore: 0 +playCount: 0 +contracts: + gameFeed: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nba/game-2016-lal-min + actor: + type: MyOS/Principal Actor + accountId: nba-feed + startGame: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /status, val: Live} + - $appendEvent: + type: Coordination/Event + kind: NBA/Game Started + - $return: true + homeScores: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: + points: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /homeScore + val: + $add: + - $document: /homeScore + - $binding: event/message/request/points + - $appendChange: + op: replace + path: /playCount + val: {$add: [$document: /playCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: NBA/Scoring Play + team: MIN + points: {$binding: event/message/request/points} + - $return: true + awayScores: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: + points: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /awayScore + val: + $add: + - $document: /awayScore + - $binding: event/message/request/points + - $appendChange: + op: replace + path: /playCount + val: {$add: [$document: /playCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: NBA/Scoring Play + team: LAL + points: {$binding: event/message/request/points} + - $return: true + endGame: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /status, val: Final} + - $appendEvent: + type: Coordination/Event + kind: NBA/Game Ended + homeScore: {$document: /homeScore} + awayScore: {$document: /awayScore} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/nba-round10-slate.yaml b/src/integrationTest/resources/examples/clean/nba-round10-slate.yaml new file mode 100644 index 0000000..d243ada --- /dev/null +++ b/src/integrationTest/resources/examples/clean/nba-round10-slate.yaml @@ -0,0 +1,140 @@ +documentId: nba-round10-slate +name: NBA Round 10 Three-Game Slate +games: {} +revisionApplications: 0 +endedGameEventCount: 0 +snapshotCount: 0 +applicationsSeenBySnapshot: 0 +allGamesFinal: false +observedHomeScoreTotal: 0 +observedAwayScoreTotal: 0 +observedGameAStatus: None +observedGameBStatus: None +observedGameCStatus: None +contracts: + slateChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nba/round10/slate + actor: + type: MyOS/Principal Actor + accountId: slate-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nba-round10-slate + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + collectionPaths: [/games] + attachGames: + type: Coordination/Sequential Workflow Operation + channel: slateChannel + request: + a: {documentId: {type: Text}} + b: {documentId: {type: Text}} + c: {documentId: {type: Text}} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /games/a + val: {$binding: event/message/request/a} + - $appendChange: + op: add + path: /games/b + val: {$binding: event/message/request/b} + - $appendChange: + op: add + path: /games/c + val: {$binding: event/message/request/c} + - $return: true + snapshotSlate: + type: Coordination/Sequential Workflow Operation + channel: slateChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /observedGameAStatus + val: {$document: /games/a/status} + - $appendChange: + op: replace + path: /observedGameBStatus + val: {$document: /games/b/status} + - $appendChange: + op: replace + path: /observedGameCStatus + val: {$document: /games/c/status} + - $appendChange: + op: replace + path: /observedHomeScoreTotal + val: + $add: + - $document: /games/a/homeScore + - $document: /games/b/homeScore + - $document: /games/c/homeScore + - $appendChange: + op: replace + path: /observedAwayScoreTotal + val: + $add: + - $document: /games/a/awayScore + - $document: /games/b/awayScore + - $document: /games/c/awayScore + - $appendChange: + op: replace + path: /allGamesFinal + val: + $and: + - $eq: [$document: /games/a/status, Final] + - $eq: [$document: /games/b/status, Final] + - $eq: [$document: /games/c/status, Final] + - $appendChange: + op: replace + path: /applicationsSeenBySnapshot + val: {$document: /revisionApplications} + - $appendChange: + op: replace + path: /snapshotCount + val: {$add: [$document: /snapshotCount, 1]} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: {documentId: {type: Text}} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Ended + then: + - $appendChange: + op: replace + path: /endedGameEventCount + val: {$add: [$document: /endedGameEventCount, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/nba-statistics.yaml b/src/integrationTest/resources/examples/clean/nba-statistics.yaml new file mode 100644 index 0000000..e76d7a8 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/nba-statistics.yaml @@ -0,0 +1,57 @@ +documentId: nba-statistics +name: NBA Historical Statistics Root +observedHomeScore: 0 +observedAwayScore: 0 +observedPlayCount: 0 +observedStatus: None +revisionApplications: 0 +contracts: + commissionerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nba/statistics + actor: + type: MyOS/Principal Actor + accountId: commissioner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nba-statistics + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/game] + attachGame: + type: Coordination/Sequential Workflow Operation + channel: commissionerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /game, val: {$binding: event/message/request/document}} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /game, val: {$binding: event/message/request/after}} + - $appendChange: {op: replace, path: /observedHomeScore, val: {$binding: event/message/request/after/homeScore}} + - $appendChange: {op: replace, path: /observedAwayScore, val: {$binding: event/message/request/after/awayScore}} + - $appendChange: {op: replace, path: /observedPlayCount, val: {$binding: event/message/request/after/playCount}} + - $appendChange: {op: replace, path: /observedStatus, val: {$binding: event/message/request/after/status}} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml b/src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml new file mode 100644 index 0000000..d0105f6 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/nested-owned-dynamic-surface.yaml @@ -0,0 +1,64 @@ +documentId: nested-owned-surface-root +name: Nested Owned Surface Root +child: + documentId: nested-owned-surface-child + name: Nested Owned Surface Child + total: 0 + activated: false + contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nested-owned-surface/owner + actor: + type: MyOS/Principal Actor + accountId: nested-owner + activateDynamic: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + dynamicChannel: {} + dynamicHandler: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /contracts/dynamicChannel + val: {$binding: event/message/request/dynamicChannel} + - $appendChange: + op: add + path: /contracts/applyDynamic + val: {$binding: event/message/request/dynamicHandler} + - $appendChange: {op: replace, path: /activated, val: true} + - $return: true +contracts: + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nested-owned-surface-root + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /child + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml b/src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml new file mode 100644 index 0000000..5a4ed63 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/nested-sibling-history-root.yaml @@ -0,0 +1,55 @@ +documentId: nested-sibling-history-root +name: Nested And Sibling Historical Ordering Root +children: {} +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/nested-sibling/root + actor: + type: MyOS/Principal Actor + accountId: root-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nested-sibling-history-root + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + collectionPaths: [/children] + attachBoth: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + a1: {documentId: {type: Text}} + a2: {documentId: {type: Text}} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /children/a1 + val: {$binding: event/message/request/a1} + - $appendChange: + op: add + path: /children/a2 + val: {$binding: event/message/request/a2} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: {documentId: {type: Text}} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/ownership-parent.yaml b/src/integrationTest/resources/examples/clean/ownership-parent.yaml new file mode 100644 index 0000000..ee240bc --- /dev/null +++ b/src/integrationTest/resources/examples/clean/ownership-parent.yaml @@ -0,0 +1,71 @@ +documentId: ownership-parent +name: Managed Document Ownership Parent +rootCounter: 0 +childRevisionApplications: 0 +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/A + actor: + type: MyOS/Principal Actor + accountId: alice + attachChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/ownership/parent + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/ownership-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: attachChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /child, val: {$binding: event/message/request/document}} + - $return: true + increment: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /rootCounter + val: {$add: [$document: /rootCounter, $binding: event/message/request/amount]} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /child, val: {$binding: event/message/request/after}} + - $appendChange: + op: replace + path: /childRevisionApplications + val: {$add: [$document: /childRevisionApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/package-paynote.yaml b/src/integrationTest/resources/examples/clean/package-paynote.yaml new file mode 100644 index 0000000..4fef1d4 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/package-paynote.yaml @@ -0,0 +1,819 @@ +name: ACME Hotel & Dinner PayNote +status: Awaiting Product Conditions +attachedBy: Alice +validationMethod: "Order policy: exact amount, PLN, ACME guarantor" +payer: {actorId: alice, name: Alice} +payee: {actorId: bob, name: Travel Agency} +guarantor: {actorId: myos-admin, name: Acme Bank} +currency: PLN +authorizationAuthorizedAmountMinorState: 0 +authorizationCountState: 0 +hotelConditionAttachedState: false +restaurantConditionAttachedState: false +hotelConfirmedState: false +restaurantConfirmedState: false +captureReadinessConfirmedState: 0 +captureRequestedState: false +captureRequestedAtState: 0 +captureCompletedState: false +refundRequestedState: false +refundCompletedState: false +refundRequestIdState: none +refundAmountMinorState: 0 +refundReasonState: none +capturedAmountMinorState: 0 +amount: + expectedTotal: 130000 + expected: 130000 + captured: 0 + currency: PLN +authorization: + state: Not Authorized + authorizationId: + authorizedAmountMinor: 0 + currency: PLN + authorizedAt: + authorizationCount: 0 +attachedConditions: {hotel: false, restaurant: false} +captureReadiness: {confirmed: 0, required: 2} +capture: + requested: false + requestCount: 0 + requestId: + requestedAt: + completed: false + completedAt: + capturedBy: +refund: + requested: false + requestId: + amountMinor: 0 + reason: + completed: false + completedAt: +productConditions: + hotel: + sourceProductPath: /product/products/hotel + expectedProductKey: hotel + expectedProductName: Hotel Mlyn Jacka Stay + expectedProductIdentity: wadowice-order-2026-v1:hotel:v1 + sourceOrderId: wadowice-order-2026-v1 + status: Listening + deliveryStatus: Awaiting live confirmation + confirmed: false + done: false + captureConditionSatisfied: false + lastProcessedSourceTimestamp: + product: + name: Hotel Mlyn Jacka Stay Condition Listener + productKey: hotel + sourceOrderId: wadowice-order-2026-v1 + confirmed: false + done: false + contracts: + providerChannel: + description: Live Wadowice Hotel Product Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/celine + actor: + type: MyOS/Principal Actor + accountId: celine + confirmProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationReference: {type: Text} + steps: + - name: Apply Live Hotel Confirmation + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /confirmed, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Confirmed + productKey: hotel + sourcePath: /product/products/hotel + sourceActorId: celine + sourceTimestamp: {$binding: event/timestamp} + - $return: true + completeProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationCode: {type: Text} + note: {type: Text} + steps: + - name: Apply Live Hotel Completion + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$binding: event/message/request/confirmationCode, WAD-7429]} + then: + - $appendChange: {op: replace, path: /done, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Done + productKey: hotel + sourcePath: /product/products/hotel + sourceActorId: celine + sourceTimestamp: {$binding: event/timestamp} + - $return: true + restaurant: + sourceProductPath: /product/products/restaurant + expectedProductKey: restaurant + expectedProductName: Old Town Restaurant Dinner + expectedProductIdentity: wadowice-order-2026-v1:restaurant:v1 + sourceOrderId: wadowice-order-2026-v1 + status: Listening + deliveryStatus: Awaiting live confirmation + confirmed: false + done: false + cancelled: false + discountApplied: false + captureConditionSatisfied: false + lastProcessedSourceTimestamp: + product: + name: Old Town Restaurant Condition Listener + productKey: restaurant + sourceOrderId: wadowice-order-2026-v1 + confirmed: false + done: false + cancelled: false + discountApplied: false + contracts: + providerChannel: + description: Live Old Town Restaurant Product Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/david + actor: + type: MyOS/Principal Actor + accountId: david + customerChannel: + description: Live Alice Restaurant cancellation Timeline + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + type: Coordination/Timeline Channel + confirmProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationReference: {type: Text} + steps: + - name: Apply Live Restaurant Confirmation + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /confirmed, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Confirmed + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + - $return: true + completeProduct: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationCode: {type: Text} + note: {type: Text} + steps: + - name: Apply Live Restaurant Completion + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$binding: event/message/request/confirmationCode, WAD-7429]} + then: + - $appendChange: {op: replace, path: /done, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Done + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + - $return: true + completeWithDiscount: + type: Coordination/Sequential Workflow Operation + channel: providerChannel + request: + confirmationCode: {type: Text} + note: {type: Text} + steps: + - name: Apply Live Restaurant Discount Completion + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$binding: event/message/request/confirmationCode, WAD-7429]} + then: + - $appendChange: {op: replace, path: /done, val: true} + - $appendChange: {op: replace, path: /discountApplied, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Done + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Discount Applied + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: david + sourceTimestamp: {$binding: event/timestamp} + discountPercent: 10 + amountMinor: 3800 + - $return: true + cancelWithinRange: + type: Coordination/Sequential Workflow Operation + channel: customerChannel + request: + reason: {type: Text} + steps: + - name: Apply Live Restaurant Cancellation + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /cancelled, val: true} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Condition Product Cancelled + productKey: restaurant + sourcePath: /product/products/restaurant + sourceActorId: alice + sourceTimestamp: {$binding: event/timestamp} + refundable: true + amountMinor: 38000 + reason: {$binding: event/message/request/reason} + - $return: true +contracts: + payerChannel: + description: Alice PayNote Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + payeeChannel: + description: Travel Agency PayNote Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/bob + actor: + type: MyOS/Principal Actor + accountId: bob + customerChannel: + description: Alice Order payment Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/alice + actor: + type: MyOS/Principal Actor + accountId: alice + merchantChannel: + description: Travel Agency payment Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/bob + actor: + type: MyOS/Principal Actor + accountId: bob + guarantorChannel: + description: ACME guarantor Timeline + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/order/myos-admin + actor: + type: MyOS/MyOS Admin Actor + accountId: myos-admin + authorizeAmount: + name: Authorize PayNote Amount + description: Record one immutable ACME authorization decision from the guarantor Timeline. + type: Coordination/Sequential Workflow Operation + channel: guarantorChannel + request: + authorizationId: {type: Text} + amountMinor: {type: Integer} + currency: {type: Text} + steps: + - name: Apply Amount Authorization + type: Coordination/Compute + do: + - $let: + order: + - authorizationId + - amountMinor + - requestedCurrency + vars: + authorizationId: {$binding: event/message/request/authorizationId} + amountMinor: {$binding: event/message/request/amountMinor} + requestedCurrency: {$binding: event/message/request/currency} + - $if: + cond: + $or: + - $not: + $truthy: {$var: authorizationId} + - $lte: [$var: amountMinor, 0] + - $ne: [$var: requestedCurrency, $document: /currency] + then: + - $appendEvent: + type: Coordination/Event + kind: Validation Error + message: Amount authorization requires a non-empty id, a positive amount, and the PayNote currency. + - $if: + cond: + $and: + - $truthy: {$var: authorizationId} + - $not: + $lte: [$var: amountMinor, 0] + - $eq: [$var: requestedCurrency, $document: /currency] + then: + - $if: + cond: {$eq: [$document: /authorizationCountState, 1]} + then: + - $appendChange: + op: replace + path: /authorization + val: + state: Authorized + authorizationId: {$var: authorizationId} + authorizedAmountMinor: + $add: + - $document: /authorizationAuthorizedAmountMinorState + - $var: amountMinor + currency: {$var: requestedCurrency} + authorizedAt: {$binding: event/timestamp} + authorizationCount: {$add: [$document: /authorizationCountState, 1]} + - $appendChange: + op: replace + path: /authorizationAuthorizedAmountMinorState + val: + $add: + - $document: /authorizationAuthorizedAmountMinorState + - $var: amountMinor + - $appendChange: + op: replace + path: /authorizationCountState + val: {$add: [$document: /authorizationCountState, 1]} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Amount Authorized + authorizationId: {$var: authorizationId} + amountMinor: {$var: amountMinor} + currency: {$var: requestedCurrency} + authorizedBy: myos-admin + authorizedAt: {$binding: event/timestamp} + - $return: true + hotelConditionEvents: + type: Embedded Node Channel + sourcePath: /productConditions/hotel/product + restaurantConditionEvents: + type: Embedded Node Channel + sourcePath: /productConditions/restaurant/product + attachHotelCondition: + name: Attach Wadowice Hotel as Capture Condition + description: Attach the trusted Hotel view for later provider entries. + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: + productKey: {type: Text} + sourceProductPath: {type: Text} + expectedProductName: {type: Text} + expectedProductIdentity: {type: Text} + sourceOrderId: {type: Text} + steps: + - name: Attach Hotel Product Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConditionAttachedState, false] + - $eq: [$binding: event/message/request/productKey, hotel] + - $eq: [$binding: event/message/request/sourceProductPath, /product/products/hotel] + - $eq: [$binding: event/message/request/expectedProductName, Hotel Mlyn Jacka Stay] + - $eq: [$binding: event/message/request/expectedProductIdentity, "wadowice-order-2026-v1:hotel:v1"] + - $eq: [$binding: event/message/request/sourceOrderId, wadowice-order-2026-v1] + then: + - $appendChange: + op: replace + path: /attachedConditions + val: + hotel: true + restaurant: {$document: /restaurantConditionAttachedState} + - $appendChange: {op: replace, path: /hotelConditionAttachedState, val: true} + - $appendChange: {op: replace, path: /status, val: Awaiting Product Confirmations} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Attached + productKey: hotel + sourcePath: /product/products/hotel + - $return: true + attachRestaurantCondition: + name: Attach Old Town Restaurant as Capture Condition + description: Attach the trusted Restaurant view for later provider entries. + type: Coordination/Sequential Workflow Operation + channel: merchantChannel + request: + productKey: {type: Text} + sourceProductPath: {type: Text} + expectedProductName: {type: Text} + expectedProductIdentity: {type: Text} + sourceOrderId: {type: Text} + steps: + - name: Attach Restaurant Product Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /restaurantConditionAttachedState, false] + - $eq: [$binding: event/message/request/productKey, restaurant] + - $eq: [$binding: event/message/request/sourceProductPath, /product/products/restaurant] + - $eq: [$binding: event/message/request/expectedProductName, Old Town Restaurant Dinner] + - $eq: [$binding: event/message/request/expectedProductIdentity, "wadowice-order-2026-v1:restaurant:v1"] + - $eq: [$binding: event/message/request/sourceOrderId, wadowice-order-2026-v1] + then: + - $appendChange: + op: replace + path: /attachedConditions + val: + hotel: {$document: /hotelConditionAttachedState} + restaurant: true + - $appendChange: {op: replace, path: /restaurantConditionAttachedState, val: true} + - $appendChange: {op: replace, path: /status, val: Awaiting Product Confirmations} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Attached + productKey: restaurant + sourcePath: /product/products/restaurant + - $return: true + observeHotelConfirmed: + type: Coordination/Sequential Workflow + channel: hotelConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Confirmed} + steps: + - name: Apply Hotel Confirmation Condition + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /hotelConfirmedState, false]} + then: + # Keep leaf patches here: this condition object owns an active + # Process Embedded `product`, so replacing the parent from a + # frozen $document view can rewind the child's live state. + - $appendChange: {op: replace, path: /productConditions/hotel/confirmed, val: true} + - $appendChange: {op: replace, path: /hotelConfirmedState, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/captureConditionSatisfied, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/status, val: Confirmed} + - $appendChange: {op: replace, path: /productConditions/hotel/deliveryStatus, val: Live confirmation + received} + - $appendChange: + op: replace + path: /productConditions/hotel/lastProcessedSourceTimestamp + val: {$binding: event/sourceTimestamp} + - $appendChange: + op: replace + path: /captureReadiness + val: + confirmed: {$add: [$document: /captureReadinessConfirmedState, 1]} + required: 2 + - $appendChange: + op: replace + path: /captureReadinessConfirmedState + val: {$add: [$document: /captureReadinessConfirmedState, 1]} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Satisfied + productKey: hotel + sourcePath: /product/products/hotel + - $return: true + - name: Request Capture after Hotel Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$document: /captureRequestedState, false] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$binding: event/sourceTimestamp} + completed: false + completedAt: + capturedBy: + - $appendChange: {op: replace, path: /captureRequestedState, val: true} + - $appendChange: + op: replace + path: /captureRequestedAtState + val: {$binding: event/sourceTimestamp} + - $appendChange: {op: replace, path: /status, val: Awaiting ACME Capture} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Capture Funds Requested + requestId: package-capture-001 + requestedOperation: capturePayment + requestedOperationScopedKey: /payNotes/packagePayment::capturePayment + sourceDocumentPath: /payNotes/packagePayment/productConditions/hotel/product + targetDocumentPath: /payNotes/packagePayment + recipientActorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + observeRestaurantConfirmed: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Confirmed} + steps: + - name: Apply Restaurant Confirmation Condition + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /restaurantConfirmedState, false]} + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/confirmed, val: true} + - $appendChange: {op: replace, path: /restaurantConfirmedState, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/captureConditionSatisfied, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Confirmed} + - $appendChange: {op: replace, path: /productConditions/restaurant/deliveryStatus, val: Live + confirmation received} + - $appendChange: + op: replace + path: /productConditions/restaurant/lastProcessedSourceTimestamp + val: {$binding: event/sourceTimestamp} + - $appendChange: + op: replace + path: /captureReadiness + val: + confirmed: {$add: [$document: /captureReadinessConfirmedState, 1]} + required: 2 + - $appendChange: + op: replace + path: /captureReadinessConfirmedState + val: {$add: [$document: /captureReadinessConfirmedState, 1]} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Product Condition Satisfied + productKey: restaurant + sourcePath: /product/products/restaurant + - $return: true + - name: Request Capture after Restaurant Condition + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$document: /captureRequestedState, false] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$binding: event/sourceTimestamp} + completed: false + completedAt: + capturedBy: + - $appendChange: {op: replace, path: /captureRequestedState, val: true} + - $appendChange: + op: replace + path: /captureRequestedAtState + val: {$binding: event/sourceTimestamp} + - $appendChange: {op: replace, path: /status, val: Awaiting ACME Capture} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Capture Funds Requested + requestId: package-capture-001 + requestedOperation: capturePayment + requestedOperationScopedKey: /payNotes/packagePayment::capturePayment + sourceDocumentPath: /payNotes/packagePayment/productConditions/restaurant/product + targetDocumentPath: /payNotes/packagePayment + recipientActorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + observeHotelDone: + type: Coordination/Sequential Workflow + channel: hotelConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Done} + steps: + - name: Apply Hotel Completion + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /productConditions/hotel/done, val: true} + - $appendChange: {op: replace, path: /productConditions/hotel/status, val: Done} + - $return: true + observeRestaurantDone: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Done} + steps: + - name: Apply Restaurant Completion + type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /productConditions/restaurant/done, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Done} + - $return: true + observeRestaurantCancellation: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Cancelled} + steps: + - name: Request Refund for Restaurant Cancellation + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /refundRequestedState, false]} + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/cancelled, val: true} + - $appendChange: {op: replace, path: /productConditions/restaurant/status, val: Cancelled - Refund + Requested} + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: restaurant-refund-001 + amountMinor: 38000 + reason: Restaurant cancelled within refund window + completed: false + completedAt: + - $appendChange: {op: replace, path: /refundRequestedState, val: true} + - $appendChange: {op: replace, path: /refundRequestIdState, val: restaurant-refund-001} + - $appendChange: {op: replace, path: /refundAmountMinorState, val: 38000} + - $appendChange: {op: replace, path: /refundReasonState, val: Restaurant cancelled within refund + window} + - $appendChange: {op: replace, path: /status, val: Restaurant Refund Requested} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Requested + requestId: restaurant-refund-001 + requestedOperation: refundPayment + requestedOperationScopedKey: /payNotes/packagePayment::refundPayment + recipientActorId: myos-admin + amount: {amountMinor: 38000, currency: PLN} + reason: Restaurant cancelled within refund window + - $return: true + observeRestaurantDiscount: + type: Coordination/Sequential Workflow + channel: restaurantConditionEvents + event: {type: Coordination/Event, kind: PayNote/Condition Product Discount Applied} + steps: + - name: Request Restaurant Discount Refund + type: Coordination/Compute + do: + - $if: + cond: {$eq: [$document: /refundRequestedState, false]} + then: + - $appendChange: {op: replace, path: /productConditions/restaurant/discountApplied, val: true} + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: restaurant-discount-001 + amountMinor: 3800 + reason: Restaurant 10% service discount + completed: false + completedAt: + - $appendChange: {op: replace, path: /refundRequestedState, val: true} + - $appendChange: {op: replace, path: /refundRequestIdState, val: restaurant-discount-001} + - $appendChange: {op: replace, path: /refundAmountMinorState, val: 3800} + - $appendChange: {op: replace, path: /refundReasonState, val: Restaurant 10% service discount} + - $appendChange: {op: replace, path: /status, val: Restaurant Discount Refund Requested} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Requested + requestId: restaurant-discount-001 + requestedOperation: refundPayment + requestedOperationScopedKey: /payNotes/packagePayment::refundPayment + recipientActorId: myos-admin + amount: {amountMinor: 3800, currency: PLN} + reason: Restaurant 10% service discount + - $return: true + capturePayment: + name: Confirm Payment Guarantee + description: Acme Bank confirms the Hotel and Restaurant payment guarantee. + type: Coordination/Sequential Workflow Operation + channel: guarantorChannel + request: + requestId: {type: Text} + amountMinor: {type: Integer} + currency: {type: Text} + steps: + - name: Capture Package Payment + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /captureRequestedState, true] + - $eq: [$document: /captureCompletedState, false] + - $eq: [$document: /hotelConfirmedState, true] + - $eq: [$document: /restaurantConfirmedState, true] + - $eq: [$binding: event/message/request/requestId, package-capture-001] + - $eq: [$binding: event/message/request/amountMinor, 130000] + - $eq: [$binding: event/message/request/currency, PLN] + then: + - $appendChange: + op: replace + path: /capture + val: + requested: true + requestCount: 1 + requestId: package-capture-001 + requestedAt: {$document: /captureRequestedAtState} + completed: true + completedAt: {$binding: event/timestamp} + capturedBy: Acme Bank + - $appendChange: {op: replace, path: /captureCompletedState, val: true} + - $appendChange: + op: replace + path: /amount + val: {expectedTotal: 130000, expected: 130000, captured: 130000, currency: PLN} + - $appendChange: {op: replace, path: /capturedAmountMinorState, val: 130000} + - $appendChange: {op: replace, path: /status, val: Completed} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Payment Completed + requestId: package-capture-001 + actorId: myos-admin + amount: {amountMinor: 130000, currency: PLN} + - $return: true + refundPayment: + name: Confirm Partial Refund + description: Acme Bank returns the requested Restaurant adjustment to Alice. + type: Coordination/Sequential Workflow Operation + channel: guarantorChannel + request: + requestId: {type: Text} + amountMinor: {type: Integer} + currency: {type: Text} + steps: + - name: Refund Restaurant Adjustment + type: Coordination/Compute + do: + - $if: + cond: + $and: + - $eq: [$document: /refundRequestedState, true] + - $eq: [$document: /refundCompletedState, false] + - $eq: [$binding: event/message/request/requestId, $document: /refundRequestIdState] + - $eq: [$binding: event/message/request/amountMinor, $document: /refundAmountMinorState] + - $eq: [$binding: event/message/request/currency, PLN] + then: + - $appendChange: + op: replace + path: /refund + val: + requested: true + requestId: {$document: /refundRequestIdState} + amountMinor: {$document: /refundAmountMinorState} + reason: {$document: /refundReasonState} + completed: true + completedAt: {$binding: event/timestamp} + - $appendChange: {op: replace, path: /refundCompletedState, val: true} + - $appendChange: + op: replace + path: /amount + val: + expectedTotal: 130000 + expected: 130000 + captured: {$subtract: [$document: /capturedAmountMinorState, $document: /refundAmountMinorState]} + currency: PLN + - $appendChange: + op: replace + path: /capturedAmountMinorState + val: {$subtract: [$document: /capturedAmountMinorState, $document: /refundAmountMinorState]} + - $appendChange: {op: replace, path: /status, val: Partial Refund Completed} + - $appendEvent: + type: Coordination/Event + kind: PayNote/Refund Completed + requestId: {$binding: event/message/request/requestId} + amount: + amountMinor: {$binding: event/message/request/amountMinor} + currency: PLN + - $return: true diff --git a/src/integrationTest/resources/examples/clean/root-isolation-child.yaml b/src/integrationTest/resources/examples/clean/root-isolation-child.yaml new file mode 100644 index 0000000..8c437c1 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/root-isolation-child.yaml @@ -0,0 +1,24 @@ +documentId: root-isolation-child +name: Root Isolation Child +childCount: 0 +contracts: + sharedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/root-isolation/shared + actor: + type: MyOS/Principal Actor + accountId: alice + collide: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /childCount + val: {$add: [$document: /childCount, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/root-isolation-parent.yaml b/src/integrationTest/resources/examples/clean/root-isolation-parent.yaml new file mode 100644 index 0000000..fdb6bf8 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/root-isolation-parent.yaml @@ -0,0 +1,83 @@ +documentId: root-isolation-parent +name: Root Isolation Parent +rootCount: 0 +childRevisionApplications: 0 +contracts: + sharedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/root-isolation/shared + actor: + type: MyOS/Principal Actor + accountId: alice + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/root-isolation-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /child + val: {$binding: event/message/request/document} + - $return: true + collide: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /rootCount + val: {$add: [$document: /rootCount, 1]} + - $return: true + mutateChildIllegally: + type: Coordination/Sequential Workflow Operation + channel: sharedChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /child/childCount + val: {$add: [$document: /child/childCount, $binding: event/message/request/amount]} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + childDocumentId: {type: Text} + childEpoch: {type: Integer} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /child + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /childRevisionApplications + val: {$add: [$document: /childRevisionApplications, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml b/src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml new file mode 100644 index 0000000..57733f2 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/shared-child-two-occurrences-parent.yaml @@ -0,0 +1,55 @@ +documentId: shared-child-two-occurrences-parent +name: Shared Child Two Occurrences Parent +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/two-occurrences-parent + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/shared-child-two-occurrences-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/left, /right] + attachTwice: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /left + val: {$binding: event/message/request/document} + - $appendChange: + op: add + path: /right + val: {$binding: event/message/request/document} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/three-child-history-parent.yaml b/src/integrationTest/resources/examples/clean/three-child-history-parent.yaml new file mode 100644 index 0000000..1ae02a2 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/three-child-history-parent.yaml @@ -0,0 +1,60 @@ +documentId: three-child-history-parent +name: Three Child History Parent +children: {} +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/embedded/three-child-parent + actor: + type: MyOS/Principal Actor + accountId: bob + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/three-child-history-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + collectionPaths: [/children] + attachAll: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + a: {documentId: {type: Text}} + b: {documentId: {type: Text}} + c: {documentId: {type: Text}} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /children/a + val: {$binding: event/message/request/a} + - $appendChange: + op: add + path: /children/b + val: {$binding: event/message/request/b} + - $appendChange: + op: add + path: /children/c + val: {$binding: event/message/request/c} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: {documentId: {type: Text}} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/clean/whole-request-sink.yaml b/src/integrationTest/resources/examples/clean/whole-request-sink.yaml new file mode 100644 index 0000000..0c46824 --- /dev/null +++ b/src/integrationTest/resources/examples/clean/whole-request-sink.yaml @@ -0,0 +1,43 @@ +documentId: whole-request-sink +name: Whole Request Sink +payload: +touchCount: 0 +storeCount: 0 +contracts: + aliceChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/whole-request/alice + actor: + type: MyOS/Principal Actor + accountId: alice + touch: + type: Coordination/Sequential Workflow Operation + channel: aliceChannel + request: {} + steps: + - type: Coordination/Compute + do: + # Deliberately do not dereference /message/request/payload. + - $appendChange: + op: replace + path: /touchCount + val: {$add: [$document: /touchCount, 1]} + - $return: true + storePayload: + type: Coordination/Sequential Workflow Operation + channel: aliceChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /payload + val: {$binding: event/message/request/payload} + - $appendChange: + op: replace + path: /storeCount + val: {$add: [$document: /storeCount, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml b/src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml new file mode 100644 index 0000000..3a1e8ef --- /dev/null +++ b/src/integrationTest/resources/examples/playground/five-occurrence-initialization-host.yaml @@ -0,0 +1,184 @@ +documentId: playground-five-occurrence-host +name: Playground Five Occurrence Initialization Host +hostInitializationCount: 0 +initializationEventCount: 0 +alphaInitializationEventCount: 0 +betaInitializationEventCount: 0 +gammaInitializationEventCount: 0 +alphaFirstInitializationEventBlueId: unset +alphaSecondInitializationEventBlueId: unset +revisionApplications: 0 +children: {} +alphaReattachment: None +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /hostInitializationCount + val: {$add: [$document: /hostInitializationCount, 1]} + - $return: true + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/playground/five-occurrence/host + actor: + type: MyOS/Principal Actor + accountId: playground-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/playground-five-occurrence-host + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + collectionPaths: [/children] + attachFiveDocuments: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: + documents: + description: Exact collection of processable child documents. + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /children + val: {$binding: event/message/request/documents} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + childDocumentId: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $if: + cond: + $and: + - $eq: + - $binding: event/message/request/occurrencePath + - /children/gamma + - $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Started + then: + - $appendChange: + op: remove + path: /children/alphaSecond + - $if: + cond: + $and: + - $eq: + - $binding: event/message/request/occurrencePath + - /children/gamma + - $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Scoring Play + then: + - $appendChange: + op: add + path: /children/alphaSecond + val: {$document: /alphaReattachment} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Initialized + then: + - $appendChange: + op: replace + path: /initializationEventCount + val: {$add: [$document: /initializationEventCount, 1]} + - $if: + cond: + $eq: + - $binding: event/message/request/occurrencePath + - /children/alphaFirst + then: + - $appendChange: + op: replace + path: /alphaFirstInitializationEventBlueId + val: {$binding: event/message/request/eventOccurrences/0/eventBlueId} + - $if: + cond: + $eq: + - $binding: event/message/request/occurrencePath + - /children/alphaSecond + then: + - $appendChange: + op: replace + path: /alphaSecondInitializationEventBlueId + val: {$binding: event/message/request/eventOccurrences/0/eventBlueId} + - $if: + cond: + $eq: + - $binding: event/message/request/after/documentId + - playground-game-alpha + then: + - $appendChange: + op: replace + path: /alphaInitializationEventCount + val: {$add: [$document: /alphaInitializationEventCount, 1]} + - $if: + cond: + $eq: + - $binding: event/message/request/after/documentId + - playground-game-beta + then: + - $appendChange: + op: replace + path: /betaInitializationEventCount + val: {$add: [$document: /betaInitializationEventCount, 1]} + - $if: + cond: + $eq: + - $binding: event/message/request/after/documentId + - playground-game-gamma + then: + - $appendChange: + op: replace + path: /gammaInitializationEventCount + val: {$add: [$document: /gammaInitializationEventCount, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml b/src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml new file mode 100644 index 0000000..23a8639 --- /dev/null +++ b/src/integrationTest/resources/examples/round12/dynamic-collection-host.yaml @@ -0,0 +1,119 @@ +documentId: dynamic-collection-host +name: Dynamic Process Embedded Collection Host +hostInitializationCount: 0 +initializationEventCount: 0 +nextInitializationOrdinal: 0 +alphaInitializationOrdinal: 0 +middleInitializationOrdinal: 0 +zuluInitializationOrdinal: 0 +revisionApplications: 0 +games: __GAME_COLLECTION__ +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /hostInitializationCount + val: {$add: [$document: /hostInitializationCount, 1]} + - $return: true + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/round12/dynamic/collection/host + actor: + type: MyOS/Principal Actor + accountId: collection-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/dynamic-collection-host + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + collectionPaths: [/_round12Inactive] + activateGameCollection: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /contracts/embedded/collectionPaths/0 + val: /games + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Initialized + then: + - $appendChange: + op: replace + path: /initializationEventCount + val: {$add: [$document: /initializationEventCount, 1]} + - $appendChange: + op: replace + path: /nextInitializationOrdinal + val: {$add: [$document: /nextInitializationOrdinal, 1]} + - $if: + cond: {$eq: [$binding: event/message/request/after/documentId, round12-game-alpha]} + then: + - $appendChange: + op: replace + path: /alphaInitializationOrdinal + val: {$add: [$document: /nextInitializationOrdinal, 1]} + - $if: + cond: {$eq: [$binding: event/message/request/after/documentId, round12-game-middle]} + then: + - $appendChange: + op: replace + path: /middleInitializationOrdinal + val: {$add: [$document: /nextInitializationOrdinal, 1]} + - $if: + cond: {$eq: [$binding: event/message/request/after/documentId, round12-game-zulu]} + then: + - $appendChange: + op: replace + path: /zuluInitializationOrdinal + val: {$add: [$document: /nextInitializationOrdinal, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/dynamic-path-host.yaml b/src/integrationTest/resources/examples/round12/dynamic-path-host.yaml new file mode 100644 index 0000000..abe45ef --- /dev/null +++ b/src/integrationTest/resources/examples/round12/dynamic-path-host.yaml @@ -0,0 +1,92 @@ +documentId: dynamic-path-host +name: Dynamic Process Embedded Path Host +hostInitializationCount: 0 +gameInitialized: false +gameInitializationEventCount: 0 +revisionApplications: 0 +game: __GAME_DOCUMENT__ +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /hostInitializationCount + val: {$add: [$document: /hostInitializationCount, 1]} + - $return: true + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/round12/dynamic/path/host + actor: + type: MyOS/Principal Actor + accountId: path-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/dynamic-path-host + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/_round12Inactive] + activateGameProcessing: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /contracts/embedded/paths/0 + val: /game + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Initialized + then: + - $appendChange: {op: replace, path: /gameInitialized, val: true} + - $appendChange: + op: replace + path: /gameInitializationEventCount + val: {$add: [$document: /gameInitializationEventCount, 1]} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml b/src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml new file mode 100644 index 0000000..8221534 --- /dev/null +++ b/src/integrationTest/resources/examples/round12/initialization-duplicate-events-child.yaml @@ -0,0 +1,31 @@ +documentId: round12-duplicate-initialization-events +name: Round 12 Duplicate Initialization Events +initializationCount: 0 +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /initializationCount + val: {$add: [$document: /initializationCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: Round12/Identical Initialization Event + evidence: exact-duplicate + - $appendEvent: + type: Coordination/Event + kind: Round12/Identical Initialization Event + evidence: exact-duplicate + - $return: true diff --git a/src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml b/src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml new file mode 100644 index 0000000..b00f4fd --- /dev/null +++ b/src/integrationTest/resources/examples/round12/initialization-event-observer-parent.yaml @@ -0,0 +1,96 @@ +documentId: r12-initialization-event-parent +name: Round 12 Initialization Event Observer +initializationApplications: 0 +observedEventCount: -1 +firstOccurrenceIndex: -1 +secondOccurrenceIndex: -1 +firstEventBlueId: unset +secondEventBlueId: unset +firstEventKind: unset +secondEventKind: unset +contracts: + parentChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/round12/initialization-events/parent + actor: + type: MyOS/Principal Actor + accountId: round12-initialization-event-observer + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/r12-initialization-event-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/child] + attachChild: + type: Coordination/Sequential Workflow Operation + channel: parentChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: add + path: /child + val: {$binding: event/message/request/document} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /initializationApplications + val: {$add: [$document: /initializationApplications, 1]} + - $appendChange: + op: replace + path: /observedEventCount + val: {$binding: event/message/request/emittedEventCount} + - $if: + cond: + $eq: + - $binding: event/message/request/emittedEventCount + - 2 + then: + - $appendChange: + op: replace + path: /firstOccurrenceIndex + val: {$binding: event/message/request/eventOccurrences/0/occurrenceIndex} + - $appendChange: + op: replace + path: /secondOccurrenceIndex + val: {$binding: event/message/request/eventOccurrences/1/occurrenceIndex} + - $appendChange: + op: replace + path: /firstEventBlueId + val: {$binding: event/message/request/eventOccurrences/0/eventBlueId} + - $appendChange: + op: replace + path: /secondEventBlueId + val: {$binding: event/message/request/eventOccurrences/1/eventBlueId} + - $appendChange: + op: replace + path: /firstEventKind + val: {$binding: event/message/request/emittedEvents/0/kind} + - $appendChange: + op: replace + path: /secondEventKind + val: {$binding: event/message/request/emittedEvents/1/kind} + - $appendChange: + op: replace + path: /child + val: {$binding: event/message/request/after} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml b/src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml new file mode 100644 index 0000000..978a42c --- /dev/null +++ b/src/integrationTest/resources/examples/round12/initialization-ordered-events-child.yaml @@ -0,0 +1,29 @@ +documentId: round12-ordered-initialization-events +name: Round 12 Ordered Initialization Events +initializationCount: 0 +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /initializationCount + val: {$add: [$document: /initializationCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: Round12/Initialization Event A + - $appendEvent: + type: Coordination/Event + kind: Round12/Initialization Event B + - $return: true diff --git a/src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml b/src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml new file mode 100644 index 0000000..2975e62 --- /dev/null +++ b/src/integrationTest/resources/examples/round12/managed-child-collection-membership-parent.yaml @@ -0,0 +1,77 @@ +documentId: managed-child-membership-parent +name: Managed Child Membership Parent +games: + alpha: __ALPHA_DOCUMENT__ +overflow: {} +overflowCandidate: + blueId: __OVERFLOW_BLUE_ID__ +contracts: + embedded: + type: Process Embedded + collectionPaths: [/games, /overflow] + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/managed-child-membership-parent + actor: + type: MyOS/Principal Actor + accountId: coordination + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + counter: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $if: + cond: + $and: + - $eq: + - {$binding: event/message/request/occurrencePath} + - /games/alpha + - $eq: + - {$binding: event/message/request/after/counter} + - 0 + then: + - $appendChange: + op: add + path: /games/beta + val: + blueId: __BETA_BLUE_ID__ + - $if: + cond: + $and: + - $eq: + - {$binding: event/message/request/occurrencePath} + - /games/alpha + - $eq: + - {$binding: event/message/request/after/counter} + - 1 + then: + - $appendChange: + op: remove + path: /games/beta + - $if: + cond: + $and: + - $eq: + - {$binding: event/message/request/occurrencePath} + - /games/alpha + - $eq: + - {$binding: event/message/request/after/counter} + - 2 + then: + - $appendChange: + op: replace + path: /overflow + val: {$document: /overflowCandidate} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml b/src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml new file mode 100644 index 0000000..a810e8e --- /dev/null +++ b/src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml @@ -0,0 +1,112 @@ +documentId: nba-lifecycle-game +name: NBA Lifecycle Game +status: Scheduled +homeTeam: MIN +awayTeam: LAL +homeScore: 0 +awayScore: 0 +playCount: 0 +initializationCount: 0 +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /initializationCount + val: {$add: [$document: /initializationCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: NBA/Game Initialized + gameDocumentId: {$document: /documentId} + - $return: true + gameFeed: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/round12/nba/game + actor: + type: MyOS/Principal Actor + accountId: nba-feed + startGame: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /status, val: Live} + - $appendEvent: + type: Coordination/Event + kind: NBA/Game Started + - $return: true + homeScores: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: + points: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /homeScore + val: {$add: [$document: /homeScore, $binding: event/message/request/points]} + - $appendChange: + op: replace + path: /playCount + val: {$add: [$document: /playCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: NBA/Scoring Play + team: MIN + points: {$binding: event/message/request/points} + - $return: true + awayScores: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: + points: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /awayScore + val: {$add: [$document: /awayScore, $binding: event/message/request/points]} + - $appendChange: + op: replace + path: /playCount + val: {$add: [$document: /playCount, 1]} + - $appendEvent: + type: Coordination/Event + kind: NBA/Scoring Play + team: LAL + points: {$binding: event/message/request/points} + - $return: true + endGame: + type: Coordination/Sequential Workflow Operation + channel: gameFeed + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /status, val: Final} + - $appendEvent: + type: Coordination/Event + kind: NBA/Game Ended + gameDocumentId: {$document: /documentId} + homeScore: {$document: /homeScore} + awayScore: {$document: /awayScore} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml b/src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml new file mode 100644 index 0000000..26bf1fc --- /dev/null +++ b/src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml @@ -0,0 +1,115 @@ +documentId: nba-lifecycle-host +name: NBA Lifecycle Host +hostInitializationCount: 0 +gameInitialized: false +gameInitializationEventCount: 0 +gameInitializationEventBlueId: None +gameEnded: false +gameEndedEventCount: 0 +gameEndedEventBlueId: None +observedHomeScore: 0 +observedAwayScore: 0 +observedPlayCount: 0 +observedStatus: None +revisionApplications: 0 +contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /hostInitializationCount + val: {$add: [$document: /hostInitializationCount, 1]} + - $return: true + hostChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/round12/nba/host + actor: + type: MyOS/Principal Actor + accountId: host-owner + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/round12/nba-host + actor: + type: MyOS/Principal Actor + accountId: coordination + embedded: + type: Process Embedded + paths: [/game] + attachGame: + type: Coordination/Sequential Workflow Operation + channel: hostChannel + request: + document: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: add, path: /game, val: {$binding: event/message/request/document}} + - $return: true + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: {op: replace, path: /game, val: {$binding: event/message/request/after}} + - $appendChange: {op: replace, path: /observedHomeScore, val: {$binding: event/message/request/after/homeScore}} + - $appendChange: {op: replace, path: /observedAwayScore, val: {$binding: event/message/request/after/awayScore}} + - $appendChange: {op: replace, path: /observedPlayCount, val: {$binding: event/message/request/after/playCount}} + - $appendChange: {op: replace, path: /observedStatus, val: {$binding: event/message/request/after/status}} + - $appendChange: + op: replace + path: /revisionApplications + val: {$add: [$document: /revisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Initialized + then: + - $appendChange: {op: replace, path: /gameInitialized, val: true} + - $appendChange: + op: replace + path: /gameInitializationEventCount + val: {$add: [$document: /gameInitializationEventCount, 1]} + - $appendChange: {op: replace, path: /gameInitializationEventBlueId, val: {$binding: event/message/request/eventOccurrences/0/eventBlueId}} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Ended + then: + - $appendChange: {op: replace, path: /gameEnded, val: true} + - $appendChange: + op: replace + path: /gameEndedEventCount + val: {$add: [$document: /gameEndedEventCount, 1]} + - $appendChange: {op: replace, path: /gameEndedEventBlueId, val: {$binding: event/message/request/eventOccurrences/0/eventBlueId}} + - $return: true diff --git a/src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml b/src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml new file mode 100644 index 0000000..b2032b5 --- /dev/null +++ b/src/integrationTest/resources/examples/round12/nested-dynamic-collection-host.yaml @@ -0,0 +1,148 @@ +documentId: nested-dynamic-collection-host +name: Nested Dynamic Collection Host +childRevisionApplications: 0 +childInitializationEventCount: 0 +children: + alpha: + documentId: nested-dynamic-collection-child + name: Nested Dynamic Collection Child + childInitializationCount: 0 + grandchildRevisionApplications: 0 + grandchildInitializationEventCount: 0 + game: __GAME_DOCUMENT__ + contracts: + lifecycleChannel: + type: + blueId: 2ukJitzzDKQWHJ5EVUtn3t4FXieGmNA1NdwFSqG8qcfo + order: 0 + event: + type: + blueId: Gck5z8qnbcUvJNkawzKPghj14dJBw8GxkC9mh6cL5e5C + embedded: + type: Process Embedded + paths: [/_round12Inactive] + onProcessingInitiated: + type: Coordination/Sequential Workflow + channel: lifecycleChannel + order: 0 + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /childInitializationCount + val: {$add: [$document: /childInitializationCount, 1]} + - $appendChange: + op: replace + path: /contracts/embedded/paths/0 + val: /game + - $appendEvent: + type: Coordination/Event + kind: Round12/Nested Child Initialized + - $return: true + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nested-dynamic-collection-child + actor: + type: MyOS/Principal Actor + accountId: coordination + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /grandchildRevisionApplications + val: {$add: [$document: /grandchildRevisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - NBA/Game Initialized + then: + - $appendChange: + op: replace + path: /grandchildInitializationEventCount + val: {$add: [$document: /grandchildInitializationEventCount, 1]} + - $return: true +contracts: + ownerChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: examples/round12/dynamic/nested/host + actor: + type: MyOS/Principal Actor + accountId: nested-host-owner + embedded: + type: Process Embedded + collectionPaths: [/_round12Inactive] + activateChildren: + type: Coordination/Sequential Workflow Operation + channel: ownerChannel + request: {} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /contracts/embedded/collectionPaths/0 + val: /children + - $return: true + coordinationEmbeddedChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: coordination/internal/nested-dynamic-collection-host + actor: + type: MyOS/Principal Actor + accountId: coordination + coordinationApplyEmbeddedRevision: + type: Coordination/Sequential Workflow Operation + channel: coordinationEmbeddedChannel + request: + occurrencePath: {type: Text} + after: + documentId: {type: Text} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: {$binding: event/message/request/occurrencePath} + val: {$binding: event/message/request/after} + - $appendChange: + op: replace + path: /childRevisionApplications + val: {$add: [$document: /childRevisionApplications, 1]} + - $if: + cond: + $some: + in: {$binding: event/message/request/emittedEvents} + item: emittedEvent + where: + $eq: + - $var: {name: emittedEvent, path: /kind} + - Round12/Nested Child Initialized + then: + - $appendChange: + op: replace + path: /childInitializationEventCount + val: {$add: [$document: /childInitializationEventCount, 1]} + - $return: true diff --git a/src/jmh/java/blue/coordination/processor/ComputeEffectPlanBenchmark.java b/src/jmh/java/blue/coordination/processor/ComputeEffectPlanBenchmark.java deleted file mode 100644 index c81566d..0000000 --- a/src/jmh/java/blue/coordination/processor/ComputeEffectPlanBenchmark.java +++ /dev/null @@ -1,178 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import blue.repo.coordination.Event; -import blue.repo.coordination.PrincipalActor; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineEntry; - -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.TearDown; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -/** Measures the Coordination boundary for each active Compute-effect combination. */ -@State(Scope.Thread) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.MICROSECONDS) -public class ComputeEffectPlanBenchmark { - @Param({"changeset", "events", "changesetEvents", "changesetEventsTermination"}) - public String effects; - - private Blue blue; - private BlueRepository repository; - private ResolvedSnapshot initializedSnapshot; - private Node event; - private DocumentProcessingResult lastResult; - - @Setup(Level.Trial) - public void setUp() { - repository = BlueRepository.latest(); - blue = repository.configure(new Blue()); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder().build()); - - Node source = sourceDocument(effects).blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(source); - ResolvedSnapshot selected = blue.resolveToSnapshot(blue.preprocess(aliasesResolved)); - DocumentProcessingResult initialized = blue.initializeDocument(selected); - requireSuccess(initialized); - initializedSnapshot = initialized.snapshot(); - event = operationEvent(); - } - - @Benchmark - public DocumentProcessingResult processComputeEffects() { - lastResult = blue.processDocument(initializedSnapshot, event); - return lastResult; - } - - @TearDown(Level.Iteration) - public void verify() { - requireSuccess(lastResult); - boolean changeset = effects.contains("changeset"); - boolean events = effects.contains("Events") || "events".equals(effects); - boolean termination = effects.contains("Termination"); - Object expectedStatus = changeset ? "changed" : "idle"; - if (!expectedStatus.equals(lastResult.document().get("/status"))) { - throw new IllegalStateException("Compute changeset was not applied"); - } - Object cause = valueAt(lastResult.document(), "/contracts/terminated/cause"); - if (termination != "graceful".equals(cause)) { - throw new IllegalStateException("Unexpected termination result: " + cause); - } - int expectedTriggeredEvents = (events ? 1 : 0) + (termination ? 1 : 0); - if (lastResult.triggeredEvents().size() != expectedTriggeredEvents) { - throw new IllegalStateException("Unexpected triggered event count: " - + lastResult.triggeredEvents().size()); - } - int benchmarkEvents = 0; - for (Node emitted : lastResult.triggeredEvents()) { - Node type = emitted.getType(); - boolean expectedType = type != null - && (Event.qualifiedName().equals(type.getValue()) - || Event.blueId().equals(type.getBlueId())); - if (expectedType && "benchmark".equals(valueAt(emitted, "/kind"))) { - benchmarkEvents++; - } - } - if (benchmarkEvents != (events ? 1 : 0)) { - throw new IllegalStateException("Unexpected benchmark event count: " + benchmarkEvents); - } - } - - private static Node sourceDocument(String effects) { - boolean changeset = effects.contains("changeset"); - boolean events = effects.contains("Events") || "events".equals(effects); - boolean termination = effects.contains("Termination"); - Node result = new Node(); - List statements = new ArrayList(); - if (changeset) { - statements.add(new Node().properties("$appendChange", new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value("/status")) - .properties("val", new Node().value("changed")))); - result.properties("changeset", new Node().properties("$changeset", new Node().value(true))); - } - if (events) { - statements.add(new Node().properties("$appendEvent", new Node() - .type("Coordination/Event") - .properties("kind", new Node().value("benchmark")))); - result.properties("events", new Node().properties("$events", new Node().value(true))); - } - if (termination) { - result.properties("termination", new Node() - .properties("reason", new Node().value("benchmark-complete"))); - } - statements.add(new Node().properties("$return", result)); - Node program = new Node().items(statements); - - Node channel = new Node() - .type("Coordination/Timeline Channel") - .properties("timeline", new Node() - .type("Coordination/Timeline") - .properties("providerId", new Node().value("test-provider")) - .properties("timelineId", new Node().value("owner"))) - .properties("actor", new Node() - .type("Coordination/Principal Actor")); - Node operation = new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value("ownerChannel")) - .properties("request", new Node().type("Text")) - .properties("steps", new Node().items(new Node() - .type("Coordination/Compute") - .properties("do", program))); - return new Node() - .name("Compute Effect Plan Benchmark") - .properties("status", new Node().value("idle")) - .properties("contracts", new Node() - .properties("ownerChannel", channel) - .properties("run", operation)); - } - - private static Object valueAt(Node document, String path) { - try { - return document.get(path); - } catch (IllegalArgumentException ex) { - return null; - } - } - - private Node operationEvent() { - TimelineEntry entry = new TimelineEntry() - .timeline(new Timeline().timelineId("owner")) - .actor(new PrincipalActor()) - .timestamp(BigInteger.ONE); - Node request = new Node() - .type("Coordination/Operation Request") - .properties("operation", new Node().value("run")) - .properties("channel", new Node().value("ownerChannel")) - .properties("request", new Node().value("request")); - Node source = blue.objectToNode(entry) - .properties("timestamp", new Node().value(BigInteger.ONE)) - .properties("message", request) - .blue(repository.typeAliasBlue()); - return blue.preprocess(new RepositoryTypeAliasPreprocessor(repository).preprocess(source)).blue(null); - } - - private static void requireSuccess(DocumentProcessingResult result) { - if (result == null || result.status() != ProcessorStatus.SUCCESS) { - throw new IllegalStateException(result != null ? result.failureReason() : "missing result"); - } - } -} diff --git a/src/jmh/java/blue/coordination/processor/ResolvedProcessingHostStoryBenchmark.java b/src/jmh/java/blue/coordination/processor/ResolvedProcessingHostStoryBenchmark.java deleted file mode 100644 index 4ddbfa3..0000000 --- a/src/jmh/java/blue/coordination/processor/ResolvedProcessingHostStoryBenchmark.java +++ /dev/null @@ -1,237 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.PrincipalActor; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineEntry; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.TearDown; - -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * One host session over a large document: resolve and initialize once, then - * resolve and process five timeline entries through three BEX workflows. - */ -@State(Scope.Thread) -@BenchmarkMode(Mode.SingleShotTime) -@OutputTimeUnit(TimeUnit.MILLISECONDS) -public class ResolvedProcessingHostStoryBenchmark { - private static final int PAYLOAD_FIELDS = 32; - private static final int EVENTS = 5; - private static final int WORKFLOWS = 3; - private static final int COMPUTE_STEPS_PER_WORKFLOW = 2; - private static final int EXPECTED_COUNTER = EVENTS * COMPUTE_STEPS_PER_WORKFLOW; - - private Blue blue; - private Node sourceDocument; - private Node[] events; - private DocumentProcessingResult lastResult; - private int sourceJsonBytes; - - @Setup(Level.Trial) - public void setUp() { - BlueRepository repository = BlueRepository.latest(); - blue = repository.configure(new Blue()); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder().build()); - - sourceDocument = preprocess(repository, document()); - sourceJsonBytes = blue.nodeToJson(sourceDocument).getBytes(StandardCharsets.UTF_8).length; - events = new Node[EVENTS]; - for (int index = 0; index < EVENTS; index++) { - events[index] = timelineEntry(blue, repository, index + 1); - } - - } - - @Benchmark - public DocumentProcessingResult resolveInitializeAndProcessFiveEvents() { - lastResult = runHostStory(); - return lastResult; - } - - @TearDown(Level.Iteration) - public void verifyIteration() { - assertExpectedResult(lastResult); - } - - @TearDown(Level.Trial) - public void reportFixture() { - System.out.println("Resolved processing host fixture: sourceJsonBytes=" + sourceJsonBytes - + ", payloadFields=" + PAYLOAD_FIELDS - + ", events=" + EVENTS - + ", workflowsPerEvent=" + WORKFLOWS - + ", computeStepsPerWorkflow=" + COMPUTE_STEPS_PER_WORKFLOW); - } - - private DocumentProcessingResult runHostStory() { - long phaseStarted = System.nanoTime(); - ResolvedSnapshot selected = blue.resolveToSnapshot(sourceDocument.clone()); - trace("initial resolve", phaseStarted, selected.resolvedRoot()); - phaseStarted = System.nanoTime(); - DocumentProcessingResult result = blue.initializeDocument(selected); - requireSuccess(result, "initialization"); - trace("initial process", phaseStarted, result.document()); - - phaseStarted = System.nanoTime(); - Node epoch = storedEpoch(result, "initialization"); - trace("epoch 0 store", phaseStarted, epoch); - for (int index = 0; index < EVENTS; index++) { - phaseStarted = System.nanoTime(); - ResolvedSnapshot resolvedEpoch = blue.resolveToSnapshot(epoch.clone()); - trace("epoch " + index + " resolve", phaseStarted, resolvedEpoch.resolvedRoot()); - phaseStarted = System.nanoTime(); - result = blue.processDocument(resolvedEpoch, events[index].clone()); - requireSuccess(result, "event " + (index + 1)); - trace("event " + (index + 1) + " process", phaseStarted, result.document()); - phaseStarted = System.nanoTime(); - epoch = storedEpoch(result, "event " + (index + 1)); - trace("epoch " + (index + 1) + " store", phaseStarted, epoch); - } - return result; - } - - private void trace(String phase, long started, Node node) { - if (!Boolean.getBoolean("blue.benchmark.trace")) { - return; - } - int bytes = node != null - ? blue.nodeToJson(node).getBytes(StandardCharsets.UTF_8).length - : 0; - double millis = (System.nanoTime() - started) / 1_000_000.0d; - System.out.println(phase + ": ms=" + millis + ", jsonBytes=" + bytes); - } - - private void assertExpectedResult(DocumentProcessingResult result) { - requireSuccess(result, "verification"); - Node resolved = result.resolvedDocument(); - for (int workflow = 1; workflow <= WORKFLOWS; workflow++) { - Integer actual = resolved.getAsInteger("/workflow" + workflow + "Counter"); - if (!Integer.valueOf(EXPECTED_COUNTER).equals(actual)) { - throw new IllegalStateException("workflow " + workflow + " executed incorrectly: " + actual); - } - } - } - - private static Node storedEpoch(DocumentProcessingResult result, String phase) { - Node canonical = result.canonicalDocument(); - if (canonical == null) { - throw new IllegalStateException(phase + " did not produce a canonical epoch"); - } - return canonical; - } - - private static void requireSuccess(DocumentProcessingResult result, String phase) { - if (result == null || result.status() != ProcessorStatus.SUCCESS) { - throw new IllegalStateException(phase + " failed: " - + (result != null ? result.failureReason() : "missing result")); - } - } - - private Node preprocess(BlueRepository repository, Node document) { - document.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(document); - return blue.preprocess(aliasesResolved); - } - - private static Node document() { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", timelineChannel()); - for (int workflow = 1; workflow <= WORKFLOWS; workflow++) { - String counterPath = "/workflow" + workflow + "Counter"; - contracts.put("workflow" + workflow, workflow(counterPath)); - } - - Node payload = new Node(); - String value = payloadValue(); - for (int index = 0; index < PAYLOAD_FIELDS; index++) { - payload.properties("field" + index, new Node().value(value)); - } - - Node document = new Node() - .name("Resolved Processing Host Story") - .properties("payload", payload) - .properties("contracts", new Node().properties(contracts)); - for (int workflow = 1; workflow <= WORKFLOWS; workflow++) { - document.properties("workflow" + workflow + "Counter", new Node().value(0)); - } - return document; - } - - private static String payloadValue() { - String unit = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; - StringBuilder result = new StringBuilder(4_096); - for (int index = 0; index < 64; index++) { - result.append(unit); - } - return result.toString(); - } - - private static Node timelineChannel() { - return new Node() - .type("Coordination/Timeline Channel") - .properties("timeline", new Node() - .type("Coordination/Timeline") - .properties("providerId", new Node().value("test-provider")) - .properties("timelineId", new Node().value("owner"))) - .properties("actor", new Node() - .type("Coordination/Principal Actor")); - } - - private static Node workflow(String counterPath) { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items( - incrementStep(counterPath), - incrementStep(counterPath))); - } - - private static Node incrementStep(String counterPath) { - Node incrementedValue = new Node().properties("$add", new Node().items( - new Node().properties("$document", new Node().value(counterPath)), - new Node().value(1))); - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendChange", new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value(counterPath)) - .properties("val", incrementedValue)), - new Node().properties("$return", new Node() - .properties("changeset", new Node() - .properties("$changeset", new Node().value(true)))))); - } - - private static Node timelineEntry(Blue blue, BlueRepository repository, int entryNumber) { - TimelineEntry entry = new TimelineEntry() - .timeline(new Timeline().timelineId("owner")) - .actor(new PrincipalActor()) - .timestamp(BigInteger.valueOf(7_000_000L + entryNumber)); - Node message = new Node() - .type(ChatMessage.qualifiedName()) - .properties("message", new Node().value("entry-" + entryNumber)); - Node event = blue.objectToNode(entry) - .properties("timestamp", new Node().value(7_000_000L + entryNumber)) - .properties("message", message) - .blue(repository.typeAliasBlue()); - return blue.preprocess(event).blue(null); - } -} diff --git a/src/jmh/java/blue/coordination/processor/workflow/WorkflowExecutionStateBenchmark.java b/src/jmh/java/blue/coordination/processor/workflow/WorkflowExecutionStateBenchmark.java deleted file mode 100644 index 20db362..0000000 --- a/src/jmh/java/blue/coordination/processor/workflow/WorkflowExecutionStateBenchmark.java +++ /dev/null @@ -1,48 +0,0 @@ -package blue.coordination.processor.workflow; - -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.infra.Blackhole; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** Allocation/scaling comparison for the per-step result-state boundary. */ -@State(Scope.Thread) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.MICROSECONDS) -public class WorkflowExecutionStateBenchmark { - - @Param({"100", "500", "1000"}) - public int steps; - - @Benchmark - public void revisionedReadOnlyViews(Blackhole blackhole) { - WorkflowExecutionState state = new WorkflowExecutionState(); - for (int index = 0; index < steps; index++) { - WorkflowExecutionState.Snapshot view = state.snapshotView(); - blackhole.consume(view.size()); - state.record("Step" + index, Integer.valueOf(index), (index & 1) == 0); - } - blackhole.consume(state.snapshotView()); - } - - @Benchmark - public void legacyWholeMapCopies(Blackhole blackhole) { - Map results = new LinkedHashMap(); - for (int index = 0; index < steps; index++) { - Map snapshot = Collections.unmodifiableMap( - new LinkedHashMap(results)); - blackhole.consume(snapshot.size()); - results.put("Step" + index, Integer.valueOf(index)); - } - blackhole.consume(results); - } -} diff --git a/src/jmh/java/blue/language/processor/DeclaredTypeEventMatcherBenchmark.java b/src/jmh/java/blue/language/processor/DeclaredTypeEventMatcherBenchmark.java deleted file mode 100644 index 5302450..0000000 --- a/src/jmh/java/blue/language/processor/DeclaredTypeEventMatcherBenchmark.java +++ /dev/null @@ -1,377 +0,0 @@ -package blue.language.processor; - -import blue.coordination.processor.SequentialWorkflowProcessor; -import blue.language.Blue; -import blue.language.NodeProvider; -import blue.language.model.Node; -import blue.language.model.Schema; -import blue.language.processor.model.MarkerContract; -import blue.language.utils.BlueIdCalculator; -import blue.repo.coordination.SequentialWorkflow; - -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.Threads; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import static blue.language.utils.Properties.TEXT_TYPE_BLUE_ID; - -/** Measures Coordination's declared-lineage gate and its direct-edge cache. */ -@State(Scope.Benchmark) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.NANOSECONDS) -public class DeclaredTypeEventMatcherBenchmark { - private static final int FAN_OUT = 32; - private static final int REPOSITORY_SCALE_EDGES = 2_212; - - @Param({"exact", "childWarm", "unrelatedPure", "unrelatedMaterialized", "untyped"}) - public String relation; - - private SequentialWorkflowProcessor processor; - private SequentialWorkflow workflow; - private HandlerMatchContext context; - private CountingMapProvider provider; - - private Map definitions; - private String expectedId; - private String childId; - private String grandchildId; - private String siblingId; - private String unrelatedId; - - private List fanOutWorkflows; - private HandlerMatchContext fanOutContext; - private ContractMatchingService fanOutMatchingService; - private CountingMapProvider fanOutProvider; - - private List repositoryScaleContexts; - private Node repositoryScaleExpected; - private ContractMatchingService repositoryScaleMatchingService; - private CountingMapProvider repositoryScaleProvider; - - @Setup(Level.Trial) - public void setUp() { - processor = new SequentialWorkflowProcessor(); - buildTypeGraph(); - setUpParameterizedPath(); - setUpFanOut(); - setUpRepositoryScale(); - } - - @Setup(Level.Iteration) - public void verifyFixtures() { - boolean expectedCoordination = !relation.startsWith("unrelated"); - if (processor.matches(workflow, context) != expectedCoordination) { - throw new IllegalStateException("Unexpected Coordination result for " + relation); - } - if (!context.matchesEventPattern(workflow.getEvent())) { - throw new IllegalStateException("Structural baseline changed for " + relation); - } - provider.resetLookupCount(); - if (processor.matches(workflow, context) != expectedCoordination - || provider.lookupCount() != 0) { - throw new IllegalStateException("Warm path performed provider work for " + relation); - } - provider.resetLookupCount(); - - if (runFanOut(fanOutContext) != 24 - || fanOutProvider.lookupCount() != 0 - || fanOutMatchingService.declaredTypeLineageCacheSize() != 3) { - throw new IllegalStateException("Warm fan-out fixture lost direct-edge reuse"); - } - fanOutProvider.resetLookupCount(); - - if (DeclaredTypeLineageMatcher.CACHE_INITIAL_CAPACITY > 64 - || repositoryScaleMatchingService.declaredTypeLineageCacheSize() - != REPOSITORY_SCALE_EDGES + 1 - || repositoryScaleProvider.lookupCount() != 0) { - throw new IllegalStateException("Repository-scale direct-edge fixture is invalid"); - } - } - - @Benchmark - public boolean coordinationDeclaredTypeFilter() { - return processor.matches(workflow, context); - } - - @Benchmark - public boolean genericStructuralMatcherBaseline() { - return context.matchesEventPattern(workflow.getEvent()); - } - - @Benchmark - public boolean childCold() { - CountingMapProvider coldProvider = new CountingMapProvider(definitions); - ContractMatchingService coldMatching = new ContractMatchingService(new Blue(coldProvider)); - HandlerMatchContext coldContext = context(event(childId), coldMatching); - return processor.matches(workflow(expectedId), coldContext); - } - - @Benchmark - public boolean providerRecovery() { - MutableMapProvider recoveringProvider = new MutableMapProvider(); - ContractMatchingService recoveringMatching = new ContractMatchingService( - new Blue(recoveringProvider)); - HandlerMatchContext recoveringContext = context(event(childId), recoveringMatching); - SequentialWorkflow expected = workflow(expectedId); - - boolean unavailable = processor.matches(expected, recoveringContext); - recoveringProvider.put(childId, definitions.get(childId)); - recoveringProvider.put(expectedId, definitions.get(expectedId)); - boolean recovered = processor.matches(expected, recoveringContext); - return !unavailable && recovered; - } - - @Benchmark - public int fanOutCold() { - CountingMapProvider coldProvider = new CountingMapProvider(definitions); - ContractMatchingService coldMatching = new ContractMatchingService(new Blue(coldProvider)); - return runFanOut(context(event(grandchildId), coldMatching)); - } - - @Benchmark - public int fanOutWarmSingleThread() { - return runFanOut(fanOutContext); - } - - @Benchmark - @Threads(8) - public int fanOutWarmEightThreads() { - return runFanOut(fanOutContext); - } - - @Benchmark - public int repositoryScaleWarmLineage() { - int matches = 0; - for (HandlerMatchContext scaleContext : repositoryScaleContexts) { - if (scaleContext.eventDeclaredTypeIsSameOrDescendantOf(repositoryScaleExpected)) { - matches++; - } - } - return matches; - } - - private void buildTypeGraph() { - Node expected = definition("Expected Event"); - expectedId = BlueIdCalculator.calculateBlueId(expected); - Node child = definition("Child Event").type(reference(expectedId)); - childId = BlueIdCalculator.calculateBlueId(child); - Node grandchild = definition("Grandchild Event").type(reference(childId)); - grandchildId = BlueIdCalculator.calculateBlueId(grandchild); - Node common = definition("Common Event"); - String commonId = BlueIdCalculator.calculateBlueId(common); - Node sibling = definition("Sibling Event").type(reference(commonId)); - siblingId = BlueIdCalculator.calculateBlueId(sibling); - Node unrelated = definition("Unrelated Same Shape Event"); - unrelatedId = BlueIdCalculator.calculateBlueId(unrelated); - - definitions = new LinkedHashMap(); - definitions.put(expectedId, expected); - definitions.put(childId, child); - definitions.put(grandchildId, grandchild); - definitions.put(commonId, common); - definitions.put(siblingId, sibling); - definitions.put(unrelatedId, unrelated); - } - - private void setUpParameterizedPath() { - provider = new CountingMapProvider(definitions); - Blue blue = new Blue(provider); - ContractMatchingService matchingService = new ContractMatchingService(blue); - Node benchmarkEvent = eventForRelation(blue); - workflow = workflow(expectedId); - context = context(benchmarkEvent, matchingService); - } - - private Node eventForRelation(Blue blue) { - if ("exact".equals(relation)) { - return event(expectedId); - } - if ("childWarm".equals(relation)) { - return event(childId); - } - if ("unrelatedPure".equals(relation)) { - return event(unrelatedId); - } - if ("unrelatedMaterialized".equals(relation)) { - return blue.resolveToSnapshot(event(unrelatedId)).resolvedRoot(); - } - return new Node().properties("kind", new Node().value("accepted")); - } - - private void setUpFanOut() { - fanOutProvider = new CountingMapProvider(definitions); - fanOutMatchingService = new ContractMatchingService(new Blue(fanOutProvider)); - fanOutContext = context(event(grandchildId), fanOutMatchingService); - fanOutWorkflows = new ArrayList(FAN_OUT); - for (int index = 0; index < FAN_OUT; index++) { - fanOutWorkflows.add(workflow(fanOutExpectedType(index))); - } - if (runFanOut(fanOutContext) != 24) { - throw new IllegalStateException("Fan-out fixture has unexpected handler count"); - } - fanOutProvider.resetLookupCount(); - } - - private String fanOutExpectedType(int index) { - switch (index % 4) { - case 0: - return grandchildId; - case 1: - return childId; - case 2: - return expectedId; - default: - return index % 8 == 3 ? siblingId : unrelatedId; - } - } - - private int runFanOut(HandlerMatchContext matchContext) { - int matches = 0; - for (SequentialWorkflow handler : fanOutWorkflows) { - if (processor.matches(handler, matchContext)) { - matches++; - } - } - return matches; - } - - private void setUpRepositoryScale() { - Node root = new Node().name("Repository-scale root"); - String rootId = BlueIdCalculator.calculateBlueId(root); - Map scaleDefinitions = new LinkedHashMap(); - scaleDefinitions.put(rootId, root); - List childIds = new ArrayList(REPOSITORY_SCALE_EDGES); - for (int index = 0; index < REPOSITORY_SCALE_EDGES; index++) { - Node child = new Node() - .name("Repository-scale child " + index) - .type(reference(rootId)); - String childTypeId = BlueIdCalculator.calculateBlueId(child); - scaleDefinitions.put(childTypeId, child); - childIds.add(childTypeId); - } - - repositoryScaleProvider = new CountingMapProvider(scaleDefinitions); - repositoryScaleMatchingService = new ContractMatchingService( - new Blue(repositoryScaleProvider)); - repositoryScaleExpected = reference(rootId); - repositoryScaleContexts = new ArrayList(REPOSITORY_SCALE_EDGES); - for (String childTypeId : childIds) { - HandlerMatchContext scaleContext = context( - new Node().type(reference(childTypeId)), repositoryScaleMatchingService); - if (!scaleContext.eventDeclaredTypeIsSameOrDescendantOf(repositoryScaleExpected)) { - throw new IllegalStateException("Repository-scale ancestry fixture failed"); - } - repositoryScaleContexts.add(scaleContext); - } - if (repositoryScaleMatchingService.declaredTypeLineageCacheSize() - != REPOSITORY_SCALE_EDGES + 1) { - throw new IllegalStateException("Repository-scale cache evicted below its limit"); - } - repositoryScaleProvider.resetLookupCount(); - } - - private static SequentialWorkflow workflow(String expectedTypeId) { - SequentialWorkflow workflow = new SequentialWorkflow(); - workflow.setEvent(new Node().type(reference(expectedTypeId))); - return workflow; - } - - private static HandlerMatchContext context(Node event, - ContractMatchingService matchingService) { - return new HandlerMatchContext( - "/", - "handler", - "channel", - event, - Collections.emptyMap(), - matchingService); - } - - private static Node event(String typeId) { - return new Node() - .type(reference(typeId)) - .properties("kind", new Node().value("accepted")); - } - - private static Node definition(String name) { - return new Node() - .name(name) - .properties("kind", new Node() - .type(reference(TEXT_TYPE_BLUE_ID)) - .schema(new Schema().required(true))); - } - - private static Node reference(String blueId) { - return new Node().blueId(blueId); - } - - private static class MapProvider implements NodeProvider { - private final Map definitions; - - private MapProvider(Map definitions) { - this.definitions = definitions; - } - - @Override - public List fetchByBlueId(String blueId) { - Node definition = definitions.get(blueId); - return definition != null - ? Collections.singletonList(definition.clone()) - : null; - } - } - - private static final class CountingMapProvider extends MapProvider { - private final AtomicInteger lookupCount = new AtomicInteger(); - - private CountingMapProvider(Map definitions) { - super(definitions); - } - - @Override - public List fetchByBlueId(String blueId) { - lookupCount.incrementAndGet(); - return super.fetchByBlueId(blueId); - } - - private int lookupCount() { - return lookupCount.get(); - } - - private void resetLookupCount() { - lookupCount.set(0); - } - } - - private static final class MutableMapProvider implements NodeProvider { - private final Map definitions = new ConcurrentHashMap(); - - private void put(String blueId, Node definition) { - definitions.put(blueId, definition.clone()); - } - - @Override - public List fetchByBlueId(String blueId) { - Node definition = definitions.get(blueId); - return definition != null - ? Collections.singletonList(definition.clone()) - : null; - } - } -} diff --git a/src/main/java/blue/coordination/api/ActivationMode.java b/src/main/java/blue/coordination/api/ActivationMode.java new file mode 100644 index 0000000..e3302ec --- /dev/null +++ b/src/main/java/blue/coordination/api/ActivationMode.java @@ -0,0 +1,19 @@ +package blue.coordination.api; + +/** Temporal semantics for a newly discovered Process Embedded occurrence. */ +public enum ActivationMode { + /** A new subprocess born at attachment time; no earlier history exists. */ + BIRTH_AT_ATTACHMENT, + + /** An existing process whose complete source history must be caught up. */ + IMPORT_FULL_HISTORY, + + /** Existing process starting after an explicitly persisted frontier. */ + IMPORT_FROM_FRONTIER, + + /** Existing managed child proven current through the attachment cutoff. */ + ATTACH_CURRENT_STATE, + + /** Ordinary immutable evidence; no initialization, replay, or live link. */ + PASSIVE_SNAPSHOT +} diff --git a/src/main/java/blue/coordination/api/CoordinationEngine.java b/src/main/java/blue/coordination/api/CoordinationEngine.java new file mode 100644 index 0000000..e21490c --- /dev/null +++ b/src/main/java/blue/coordination/api/CoordinationEngine.java @@ -0,0 +1,173 @@ +package blue.coordination.api; + +import blue.coordination.internal.DefaultCoordinationEngine; + +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; + +import java.util.List; +import java.util.Set; + +/** + * Deterministic single-process Coordination environment. + * + *

The first production implementation is deliberately in-memory. Closing + * the engine releases its borrowed Language, Contracts, and BEX runtimes.

+ */ +public interface CoordinationEngine extends AutoCloseable { + /** Creates the supported single-process in-memory engine. */ + static CoordinationEngine inMemory() { + return builder().inMemory().build(); + } + + /** Starts configuration of a Coordination engine. */ + static Builder builder() { + return new Builder(); + } + + /** Registers one authenticated append-only Timeline. */ + Timeline registerTimeline(String timelineId, String actorId); + + /** Admits one authored document atomically and returns its initial state. */ + DocumentSnapshot startDocument(DocumentId documentId, String authoredYaml); + + /** + * Admits one authored document under an explicit temporal history policy. + * A verified frontier is required only for {@link AdmissionPolicy#FROM_FRONTIER}. + */ + DocumentSnapshot startDocument( + DocumentId documentId, + String authoredYaml, + AdmissionPolicy policy, + ExternalOrderKey verifiedFrontier); + + /** + * Registers host-owned temporal admission evidence for future occurrences + * of one embedded DocumentId. Process Embedded itself remains limited to + * paths and collectionPaths. + */ + void configureEmbeddedAdmission( + DocumentId documentId, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough); + + /** + * Registers one attachment-specific admission plan. The plan must match + * the exact parent occurrence, child state, and retained attachment entry; + * it is consumed only when that occurrence is published successfully. + * A null epoch permits resolution only when the state identifies one epoch. + */ + void configureEmbeddedAdmission( + DocumentId parentDocumentId, + String absoluteChildPath, + DocumentId childDocumentId, + String admittedStateBlueId, + Long admittedEpoch, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough, + String completenessProofIdentity, + String expectedAttachmentEntryBlueId); + + /** Resolves and retains one complete exact YAML value. */ + ExactValue exactValue(String sourceYaml); + + /** Builds a structurally shared request that refers to an exact value. */ + ExactValue referenceRequest(String field, ExactValue exactValue); + + /** Atomically appends one operation without dispatching it. */ + TimelineEntry append(Timeline timeline, Operation operation); + + /** Appends one operation at an explicit positive logical timestamp. */ + TimelineEntry appendAt( + Timeline timeline, + Operation operation, + long timestampMicros); + + /** + * Validates and appends one exact external Timeline Entry without routing + * it or invoking any document processor. + */ + TimelineAppendReceipt appendTimelineEntry(Node exactEntry); + + /** Selects and processes canonical external work until quiescent. */ + ProcessingDrainReceipt drain(); + + /** Processes deterministic work without exceeding the supplied limits. */ + ProcessingDrainReceipt drain(DrainBudget budget); + + /** + * Drains every eligible entry through the inclusive canonical cutoff. + * The cutoff cannot force a named entry to overtake earlier work. + */ + ProcessingDrainReceipt drainThrough(ExternalOrderKey inclusiveCutoff); + + /** Returns the number of managed documents selected by the route index. */ + int routeTargetCount(TimelineEntry entry); + + /** Reads a coherent READY document; intermediate state fails closed. */ + DocumentSnapshot document(DocumentId documentId); + + /** Reads the latest committed state for audit and recovery tooling. */ + DocumentSnapshot auditDocument(DocumentId documentId); + + /** Reads the immutable ordered revision stream of one document. */ + List history(DocumentId documentId); + + /** Returns source Timeline IDs reachable by a document and its children. */ + Set effectiveTimelineIds(DocumentId documentId); + + /** Captures immutable counters, phase timers, and in-memory gauges. */ + CoordinationMetrics metrics(); + + /** Releases runtime resources; repeated close calls are harmless. */ + @Override + void close(); + + /** Builder kept intentionally small until a durable host boundary exists. */ + final class Builder { + private boolean inMemory; + + /** Selects the supported in-memory implementation. */ + public Builder inMemory() { + inMemory = true; + return this; + } + + /** Validates the configuration and creates the engine. */ + public CoordinationEngine build() { + if (!inMemory) { + throw new CoordinationException( + CoordinationErrorCode.ATOMIC_COMMIT_FAILED, + "Select the supported in-memory engine"); + } + return DefaultCoordinationEngine.create(); + } + } + + /** Temporal policy for admitting a top-level managed document. */ + enum AdmissionPolicy { + /** Replay every eligible source fact already present in the journal. */ + FULL_HISTORY, + /** Replay entries strictly after a verified persisted frontier. */ + FROM_FRONTIER, + /** The document is born at the current environment frontier. */ + FROM_NOW + } + + /** Deterministic limits enforced between entries and PROCESS commits. */ + record DrainBudget( + long maxCommittedProcessTransitions, + long maxSelectedEntries) { + public DrainBudget { + if (maxCommittedProcessTransitions <= 0L + || maxSelectedEntries <= 0L) { + throw new IllegalArgumentException( + "Drain limits must be positive"); + } + } + + public static DrainBudget unlimited() { + return new DrainBudget(Long.MAX_VALUE, Long.MAX_VALUE); + } + } +} diff --git a/src/main/java/blue/coordination/api/CoordinationErrorCode.java b/src/main/java/blue/coordination/api/CoordinationErrorCode.java new file mode 100644 index 0000000..aaa001a --- /dev/null +++ b/src/main/java/blue/coordination/api/CoordinationErrorCode.java @@ -0,0 +1,29 @@ +package blue.coordination.api; + +/** Stable machine-readable failures from the supported in-memory engine. */ +public enum CoordinationErrorCode { + /** A stable document identity is already managed with different content. */ + DUPLICATE_DOCUMENT, + /** The requested document identity is not managed. */ + DOCUMENT_NOT_FOUND, + /** A transition requires a document whose catch-up is incomplete. */ + DOCUMENT_NOT_READY, + /** Authored or referenced content violates exact identity rules. */ + INVALID_DOCUMENT_IDENTITY, + /** Host-supplied temporal policy evidence is missing or inconsistent. */ + INVALID_ACTIVATION_EVIDENCE, + /** Frozen subscription evidence is inconsistent with the committed state. */ + INVALID_SUBSCRIPTION_EVIDENCE, + /** A Process Embedded topology change would publish a cycle. */ + PROCESS_EMBEDDED_CYCLE, + /** No managed document matches the supplied entry when one is required. */ + ROUTE_NOT_FOUND, + /** Exact Timeline Entry validation or publication failed. */ + INVALID_TIMELINE_ENTRY, + /** Language, Contracts, or BEX rejected frozen semantic processing. */ + FROZEN_PROCESSING_FAILED, + /** The in-memory atomic publication boundary could not commit. */ + ATOMIC_COMMIT_FAILED, + /** A parent attempted to mutate state owned by a managed child. */ + MANAGED_CHILD_OWNERSHIP_VIOLATION +} diff --git a/src/main/java/blue/coordination/api/CoordinationException.java b/src/main/java/blue/coordination/api/CoordinationException.java new file mode 100644 index 0000000..e94ff6c --- /dev/null +++ b/src/main/java/blue/coordination/api/CoordinationException.java @@ -0,0 +1,43 @@ +package blue.coordination.api; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +/** Typed Coordination failure that preserves its semantic cause. */ +public final class CoordinationException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private final CoordinationErrorCode code; + private final Map details; + + /** Creates a typed failure without a nested cause or detail fields. */ + public CoordinationException( + CoordinationErrorCode code, + String message) { + this(code, message, null, Map.of()); + } + + /** Creates a typed failure while preserving cause and immutable details. */ + public CoordinationException( + CoordinationErrorCode code, + String message, + Throwable cause, + Map details) { + super(Objects.requireNonNull(message, "message"), cause); + this.code = Objects.requireNonNull(code, "code"); + this.details = Collections.unmodifiableMap(new LinkedHashMap<>( + Objects.requireNonNull(details, "details"))); + } + + /** Returns the stable machine-readable failure category. */ + public CoordinationErrorCode code() { + return code; + } + + /** Returns immutable diagnostic fields suitable for structured logging. */ + public Map details() { + return details; + } +} diff --git a/src/main/java/blue/coordination/api/CoordinationMetrics.java b/src/main/java/blue/coordination/api/CoordinationMetrics.java new file mode 100644 index 0000000..9114e95 --- /dev/null +++ b/src/main/java/blue/coordination/api/CoordinationMetrics.java @@ -0,0 +1,166 @@ +package blue.coordination.api; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +/** Immutable work counters, phase timers, and in-memory engine gauges. */ +public record CoordinationMetrics( + Map counters, + Map phaseNanos, + int documentCount, + int routeRowCount, + int journalEntryCount, + int wholeObjectCount, + long logicalClockMicros) { + /** Closed, release-gated structural counter vocabulary. */ + public enum Counter { + ENTRIES_STORED_WHOLE, + ROUTE_INDEX_LOOKUPS, + GRAPH_SNAPSHOTS_REUSED, + GRAPH_RECONCILIATIONS, + DOCUMENT_INITIALIZATIONS, + EXTERNAL_PROCESS_CALLS, + EMBEDDED_EPOCH_PROCESS_CALLS, + CHILD_EPOCHS_COMMITTED, + PARENT_EPOCH_APPLICATIONS, + HISTORICAL_WINDOWS_OPENED, + HISTORICAL_ENTRIES_REPLAYED, + CATCH_UP_BARRIERS_CREATED, + CATCH_UP_BARRIERS_COMPLETED, + UNRELATED_DOCUMENT_READS, + REQUEST_FRAGMENTS, + TIMELINE_ENTRY_FRAGMENTS, + ORDINARY_NODE_FRAGMENTS, + FULL_ENVIRONMENT_SCANS, + SOURCE_REPLAYS_PER_PARENT, + POST_PROCESS_FULL_PROJECTIONS, + PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY, + CHILD_PROCESS_RERUNS_ON_PARENT_RETRY + } + + /** Closed, documented phase-timer vocabulary. */ + public enum Phase { + APPEND_TOTAL("append.total"), + TEMPORAL_DRAIN("temporal.drain"), + PROCESS_ROUTE_LOOKUP("process.routeLookup"), + PROCESS_HOST_BEFORE_FROZEN("process.hostBeforeFrozen"), + PROCESS_FROZEN_CONTRACTS_ONCE("process.frozenContractsOnce"), + PROCESS_FROZEN("process.frozen"), + PROCESS_EMBEDDED_FROZEN("process.embeddedFrozen"), + PROCESS_HOST_AFTER_FROZEN("process.hostAfterFrozen"), + LAYOUT_COMPILE_FROZEN_CATALOG("layout.compileFrozenCatalog"), + LAYOUT_RETAIN_EMBEDDED_ONLY("layout.retainEmbeddedOnly"); + + private final String metricName; + + Phase(String metricName) { + this.metricName = metricName; + } + + /** Stable public metric name. */ + public String metricName() { + return metricName; + } + + private static Phase fromMetricName(String name) { + for (Phase phase : values()) { + if (phase.metricName.equals(name)) { + return phase; + } + } + throw new IllegalArgumentException( + "Unknown Coordination phase " + name); + } + } + + /** Defensively copies measurements and validates non-negative gauges. */ + public CoordinationMetrics { + Map counterCopy = new LinkedHashMap<>(); + for (Counter counter : Counter.values()) { + counterCopy.put(counter.name(), 0L); + } + Objects.requireNonNull(counters, "counters").forEach( + (name, value) -> counterCopy.put(requireCounter(name).name(), + requireNonNegative(value, "counter " + name))); + counters = Collections.unmodifiableMap(counterCopy); + Map phaseCopy = new LinkedHashMap<>(); + for (Phase phase : Phase.values()) { + phaseCopy.put(phase.metricName(), 0L); + } + Objects.requireNonNull(phaseNanos, "phaseNanos").forEach( + (name, value) -> phaseCopy.put(requirePhase(name).metricName(), + requireNonNegative(value, "phase " + name))); + phaseNanos = Collections.unmodifiableMap(phaseCopy); + if (documentCount < 0 || routeRowCount < 0 || journalEntryCount < 0 + || wholeObjectCount < 0 || logicalClockMicros <= 0L) { + throw new IllegalArgumentException( + "Coordination metric gauges must be non-negative"); + } + } + + /** Returns a known work counter and rejects misspelled/unknown names. */ + public long counter(String name) { + return counter(requireCounter(name)); + } + + /** Type-safe lookup for one canonical structural counter. */ + public long counter(Counter counter) { + return counters.get(Objects.requireNonNull( + counter, "counter").name()); + } + + /** Returns accumulated nanoseconds for a named measured phase. */ + public long nanos(String phase) { + return nanos(requirePhase(phase)); + } + + /** Type-safe lookup for one documented phase timer. */ + public long nanos(Phase phase) { + return phaseNanos.get(Objects.requireNonNull( + phase, "phase").metricName()); + } + + /** Returns accumulated milliseconds for a named measured phase. */ + public double millis(String phase) { + return nanos(phase) / 1_000_000.0; + } + + /** Type-safe millisecond conversion for one documented phase timer. */ + public double millis(Phase phase) { + return nanos(phase) / 1_000_000.0; + } + + private static Counter requireCounter(String name) { + String checked = requireMetricName(name, "counter"); + try { + return Counter.valueOf(checked); + } catch (IllegalArgumentException failure) { + throw new IllegalArgumentException( + "Unknown Coordination counter " + checked, + failure); + } + } + + private static Phase requirePhase(String name) { + return Phase.fromMetricName(requireMetricName(name, "phase")); + } + + private static String requireMetricName(String name, String kind) { + String checked = Objects.requireNonNull(name, kind + " name"); + if (checked.isBlank()) { + throw new IllegalArgumentException( + kind + " name must not be blank"); + } + return checked; + } + + private static long requireNonNegative(Long value, String label) { + long checked = Objects.requireNonNull(value, label); + if (checked < 0L) { + throw new IllegalArgumentException(label + " must be non-negative"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/DocumentDispatchOutcome.java b/src/main/java/blue/coordination/api/DocumentDispatchOutcome.java new file mode 100644 index 0000000..c309ff0 --- /dev/null +++ b/src/main/java/blue/coordination/api/DocumentDispatchOutcome.java @@ -0,0 +1,19 @@ +package blue.coordination.api; + +import java.util.Objects; + +/** One managed document result selected by an external Timeline Entry. */ +public record DocumentDispatchOutcome( + DocumentId documentId, + DocumentRevision revision, + long totalNanos) { + /** Validates the committed revision and non-negative duration. */ + public DocumentDispatchOutcome { + documentId = Objects.requireNonNull(documentId, "documentId"); + revision = Objects.requireNonNull(revision, "revision"); + if (totalNanos < 0L) { + throw new IllegalArgumentException( + "totalNanos must be non-negative"); + } + } +} diff --git a/src/main/java/blue/coordination/api/DocumentId.java b/src/main/java/blue/coordination/api/DocumentId.java new file mode 100644 index 0000000..c96da1c --- /dev/null +++ b/src/main/java/blue/coordination/api/DocumentId.java @@ -0,0 +1,37 @@ +package blue.coordination.api; + +import blue.language.processor.ExternalOrderKey; + +import java.util.Objects; + +/** Stable identity of one independently managed document process. */ +public record DocumentId(String value) implements Comparable { + /** Validates a non-blank stable identity. */ + public DocumentId { + value = requireText(value, "value"); + } + + /** Creates a validated document identity. */ + public static DocumentId of(String value) { + return new DocumentId(value); + } + + @Override + public int compareTo(DocumentId other) { + return ExternalOrderKey.compareTextCodePoints(value, + Objects.requireNonNull(other, "other").value); + } + + @Override + public String toString() { + return value; + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/DocumentRevision.java b/src/main/java/blue/coordination/api/DocumentRevision.java new file mode 100644 index 0000000..3fb91ec --- /dev/null +++ b/src/main/java/blue/coordination/api/DocumentRevision.java @@ -0,0 +1,216 @@ +package blue.coordination.api; + +import blue.language.identity.BlueIds; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +/** Exact auditable history record for one committed document transition. */ +public final class DocumentRevision { + private final DocumentId documentId; + private final long epoch; + private final long rootApplicationOrder; + private final DocumentRevision.Kind kind; + private final ExactValue before; + private final ExactValue after; + private final TimelineEntry sourceEntry; + private final ExternalOrderKey causalOrder; + private final String causalEntryBlueId; + private final CatchUpCause catchUpCause; + private final List emittedEvents; + private final long processingGas; + + /** Creates one immutable committed transition record. */ + public DocumentRevision( + DocumentId documentId, + long epoch, + long rootApplicationOrder, + DocumentRevision.Kind kind, + ExactValue before, + ExactValue after, + TimelineEntry sourceEntry, + CatchUpCause catchUpCause, + List emittedEvents, + long processingGas) { + this( + documentId, + epoch, + rootApplicationOrder, + kind, + before, + after, + sourceEntry, + sourceEntry == null ? null : sourceEntry.sourceOrderKey(), + sourceEntry == null ? null : sourceEntry.blueId(), + catchUpCause, + emittedEvents, + processingGas); + } + + /** Creates one revision with explicit causal order for processor-owned work. */ + public DocumentRevision( + DocumentId documentId, + long epoch, + long rootApplicationOrder, + DocumentRevision.Kind kind, + ExactValue before, + ExactValue after, + TimelineEntry sourceEntry, + ExternalOrderKey causalOrder, + String causalEntryBlueId, + CatchUpCause catchUpCause, + List emittedEvents, + long processingGas) { + this.documentId = Objects.requireNonNull(documentId, "documentId"); + if (epoch < 0L) { + throw new IllegalArgumentException("epoch must be non-negative"); + } + if (rootApplicationOrder < 0L) { + throw new IllegalArgumentException( + "rootApplicationOrder must be non-negative"); + } + if (processingGas < 0L) { + throw new IllegalArgumentException("processingGas must be non-negative"); + } + this.epoch = epoch; + this.rootApplicationOrder = rootApplicationOrder; + this.kind = Objects.requireNonNull(kind, "kind"); + this.before = before; + this.after = Objects.requireNonNull(after, "after"); + this.sourceEntry = sourceEntry; + this.causalOrder = causalOrder; + if (sourceEntry != null && causalEntryBlueId != null + && !sourceEntry.blueId().equals(causalEntryBlueId)) { + throw new IllegalArgumentException( + "Timeline source and causal BlueId must match"); + } + this.causalEntryBlueId = sourceEntry != null ? sourceEntry.blueId() + : causalEntryBlueId == null ? null + : BlueIds.requirePlainBlueId( + causalEntryBlueId, "/causalEntryBlueId"); + this.catchUpCause = catchUpCause; + List events = new ArrayList<>(); + for (Node event : Objects.requireNonNull(emittedEvents, "emittedEvents")) { + events.add(Objects.requireNonNull(event, "event").clone()); + } + this.emittedEvents = Collections.unmodifiableList(events); + this.processingGas = processingGas; + if (kind == DocumentRevision.Kind.INITIALIZATION + && (sourceEntry != null || causalOrder == null + || causalEntryBlueId == null)) { + throw new IllegalArgumentException( + "Initialization requires no Timeline Entry and exact cause"); + } + if (kind == DocumentRevision.Kind.TIMELINE_ENTRY && sourceEntry == null) { + throw new IllegalArgumentException( + "Timeline revision requires a source entry"); + } + } + + /** Returns the document whose state was committed. */ + public DocumentId documentId() { + return documentId; + } + + /** Returns the document-local committed transition number. */ + public long epoch() { + return epoch; + } + + /** Returns the deterministic order in which the Root applied this fact. */ + public long rootApplicationOrder() { + return rootApplicationOrder; + } + + /** Returns the semantic kind of committed transition. */ + public DocumentRevision.Kind kind() { + return kind; + } + + /** Returns the exact state before the transition, absent at initialization. */ + public Optional before() { + return Optional.ofNullable(before); + } + + /** Returns the exact state after the transition. */ + public ExactValue after() { + return after; + } + + /** Returns the source entry when this revision originated from a Timeline. */ + public Optional sourceEntry() { + return Optional.ofNullable(sourceEntry); + } + + /** Returns the deterministic causal/source order for this revision. */ + public Optional sourceOrderKey() { + return Optional.ofNullable(causalOrder); + } + + /** Exact cause BlueId that owns this epoch segment. */ + public Optional causalEntryBlueId() { + return Optional.ofNullable(causalEntryBlueId); + } + + /** Returns attachment evidence for a historical catch-up transition. */ + public Optional catchUpCause() { + return Optional.ofNullable(catchUpCause); + } + + /** Returns detached copies of semantic events emitted by the transition. */ + public List emittedEvents() { + List copy = new ArrayList<>(emittedEvents.size()); + emittedEvents.forEach(event -> copy.add(event.clone())); + return Collections.unmodifiableList(copy); + } + + /** Returns frozen semantic processing gas charged to this transition. */ + public long processingGas() { + return processingGas; + } + + /** Semantic cause of one exact committed document state. */ + public enum Kind { + /** Initial exact authored state. */ + INITIALIZATION, + /** State produced from an external exact Timeline Entry. */ + TIMELINE_ENTRY, + /** Parent state advanced through one managed child epoch. */ + EMBEDDED_REVISION_APPLICATION, + /** Readiness marker after historical work reaches its frontier. */ + CATCH_UP_COMPLETED + } + + /** Exact attachment transition that made historical work relevant. */ + public record CatchUpCause( + DocumentId parentDocumentId, + String attachmentEntryBlueId, + String occurrencePath, + long attachmentTimestampMicros) { + /** Validates stable parent, entry, occurrence, and time evidence. */ + public CatchUpCause { + parentDocumentId = Objects.requireNonNull( + parentDocumentId, "parentDocumentId"); + attachmentEntryBlueId = requireText( + attachmentEntryBlueId, "attachmentEntryBlueId"); + occurrencePath = requireText(occurrencePath, "occurrencePath"); + if (attachmentTimestampMicros <= 0L) { + throw new IllegalArgumentException( + "attachmentTimestampMicros must be positive"); + } + } + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/DocumentSnapshot.java b/src/main/java/blue/coordination/api/DocumentSnapshot.java new file mode 100644 index 0000000..8569525 --- /dev/null +++ b/src/main/java/blue/coordination/api/DocumentSnapshot.java @@ -0,0 +1,94 @@ +package blue.coordination.api; + +import blue.language.model.Node; +import blue.language.model.NodePathEditor; +import blue.language.processor.ExternalOrderKey; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** Stable immutable read model for one managed document. */ +public record DocumentSnapshot( + DocumentId documentId, + long epoch, + SessionStatus status, + ExternalOrderKey readyThrough, + String authoredInitialBlueId, + ExactValue current, + Map physicalObjects, + Map embeddedChildren, + List processEmbeddedBoundaries, + List routingDefinitions, + int physicalObjectCount, + String processingRootBlueId) { + /** Defensively copies the read model and validates exact identity fields. */ + public DocumentSnapshot { + documentId = Objects.requireNonNull(documentId, "documentId"); + status = Objects.requireNonNull(status, "status"); + authoredInitialBlueId = requireText( + authoredInitialBlueId, "authoredInitialBlueId"); + current = Objects.requireNonNull(current, "current"); + physicalObjects = Collections.unmodifiableMap(new LinkedHashMap<>( + Objects.requireNonNull( + physicalObjects, "physicalObjects"))); + embeddedChildren = Collections.unmodifiableMap(new LinkedHashMap<>( + Objects.requireNonNull( + embeddedChildren, "embeddedChildren"))); + processEmbeddedBoundaries = List.copyOf(Objects.requireNonNull( + processEmbeddedBoundaries, "processEmbeddedBoundaries")); + routingDefinitions = List.copyOf(Objects.requireNonNull( + routingDefinitions, "routingDefinitions")); + processingRootBlueId = requireText( + processingRootBlueId, "processingRootBlueId"); + if (epoch < 0L || physicalObjectCount <= 0) { + throw new IllegalArgumentException( + "Snapshot epoch and physical object count are invalid"); + } + } + + /** Returns the BlueId of the current exact document state. */ + public String blueId() { + return current.blueId(); + } + + /** Returns evidence of the complete journal frontier when available. */ + public Optional readyThroughEvidence() { + return Optional.ofNullable(readyThrough); + } + + /** Selects and verifies one exact value by canonical JSON Pointer. */ + public ExactValue valueAt(String pointer) { + Node selected = NodePathEditor.getOrNull( + current.copyNode(), Objects.requireNonNull(pointer, "pointer")); + if (selected == null) { + throw new CoordinationException( + CoordinationErrorCode.INVALID_DOCUMENT_IDENTITY, + "No value at " + documentId + pointer); + } + return ExactValue.verified(selected); + } + + /** Returns one retained physical whole object by its canonical scope. */ + public ExactValue physicalObject(String scopePath) { + ExactValue selected = physicalObjects.get(Objects.requireNonNull( + scopePath, "scopePath")); + if (selected == null) { + throw new CoordinationException( + CoordinationErrorCode.INVALID_DOCUMENT_IDENTITY, + "No physical object at " + documentId + scopePath); + } + return selected; + } + + private static String requireText(String value, String label) { + String exact = Objects.requireNonNull(value, label); + if (exact.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return exact; + } +} diff --git a/src/main/java/blue/coordination/api/ExactValue.java b/src/main/java/blue/coordination/api/ExactValue.java new file mode 100644 index 0000000..ed1d39c --- /dev/null +++ b/src/main/java/blue/coordination/api/ExactValue.java @@ -0,0 +1,130 @@ +package blue.coordination.api; + +import blue.language.merge.ResolvedSnapshot; +import blue.language.model.Node; +import blue.language.model.wire.JsonPointer; +import blue.language.snapshot.FrozenNode; + +import java.util.Objects; +import java.util.Optional; + +/** + * One immutable whole exact Blue object. + * + *

The value keeps Language's shareable {@link FrozenNode}; when it originated + * from a complete resolver run it also keeps that {@link ResolvedSnapshot} so + * canonical/resolved roots, path indexes, provenance, and memoized BlueIds are + * not discarded at the Coordination boundary.

+ */ +public final class ExactValue { + private final String blueId; + private final FrozenNode frozen; + private final ResolvedSnapshot snapshot; + + private ExactValue( + String blueId, + FrozenNode frozen, + ResolvedSnapshot snapshot) { + this.blueId = requireText(blueId, "blueId"); + this.frozen = Objects.requireNonNull(frozen, "frozen"); + this.snapshot = snapshot; + if (!this.blueId.equals(this.frozen.blueId())) { + throw new IllegalArgumentException( + "Frozen value does not match supplied BlueId"); + } + if (snapshot != null && !this.blueId.equals(snapshot.blueId())) { + throw new IllegalArgumentException( + "Snapshot does not match supplied BlueId"); + } + } + + /** Freezes a detached mutable Node and verifies its exact BlueId. */ + public static ExactValue verified(Node exact) { + FrozenNode frozen = FrozenNode.fromNode( + Objects.requireNonNull(exact, "exact")); + return new ExactValue(frozen.blueId(), frozen, null); + } + + /** Freezes a Node and checks it against an expected exact BlueId. */ + public static ExactValue verified(String expectedBlueId, Node exact) { + String expected = requireText(expectedBlueId, "expectedBlueId"); + FrozenNode frozen = FrozenNode.fromNode( + Objects.requireNonNull(exact, "exact")); + String actual = frozen.blueId(); + if (!expected.equals(actual)) { + throw new IllegalArgumentException( + "Exact value identity mismatch: expected " + expected + + ", actual " + actual); + } + return new ExactValue(expected, frozen, null); + } + + /** Retains an existing immutable Language snapshot without re-freezing it. */ + public static ExactValue fromSnapshot(ResolvedSnapshot snapshot) { + ResolvedSnapshot exact = Objects.requireNonNull(snapshot, "snapshot"); + return new ExactValue( + exact.blueId(), exact.frozenCanonicalRoot(), exact); + } + + /** Retains an already strict canonical frozen value without materializing. */ + public static ExactValue fromFrozen(FrozenNode frozen) { + FrozenNode exact = Objects.requireNonNull(frozen, "frozen"); + return new ExactValue(exact.blueId(), exact, null); + } + + /** Returns the content-addressed identity of the whole exact value. */ + public String blueId() { + return blueId; + } + + /** Returns a detached mutable boundary copy for a frozen public API call. */ + public Node copyNode() { + return frozen.toNode(); + } + + /** Returns a semantic pure reference to this whole exact object. */ + public Node referenceNode() { + return new Node().blueId(blueId); + } + + /** Returns the shareable immutable frozen representation. */ + public FrozenNode frozen() { + return frozen; + } + + /** Returns the retained resolver snapshot when one was available. */ + public Optional snapshot() { + return Optional.ofNullable(snapshot); + } + + /** Selects an immutable canonical value by JSON Pointer. */ + public FrozenNode canonicalAt(String pointer) { + String canonical = JsonPointer.canonicalize( + Objects.requireNonNull(pointer, "pointer")); + return snapshot != null + ? snapshot.canonicalAt(canonical) + : frozen.pathIndex().get(canonical); + } + + /** Returns the selected canonical BlueId, or null when the path is absent. */ + public String canonicalBlueIdAt(String pointer) { + FrozenNode selected = canonicalAt(pointer); + return selected == null ? null : selected.blueId(); + } + + /** Compares exact identity and resolved immutable structure. */ + public boolean sameExactValue(ExactValue other) { + return other != null + && blueId.equals(other.blueId) + && (frozen == other.frozen + || frozen.sameResolvedStructure(other.frozen)); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/Operation.java b/src/main/java/blue/coordination/api/Operation.java new file mode 100644 index 0000000..702fe4e --- /dev/null +++ b/src/main/java/blue/coordination/api/Operation.java @@ -0,0 +1,78 @@ +package blue.coordination.api; + +import java.util.Objects; +import java.util.Optional; + +/** One operation request before exact Timeline Entry construction. */ +public final class Operation { + private final String operation; + private final String channel; + private final String requestYaml; + private final ExactValue exactRequest; + + private Operation( + String operation, + String channel, + String requestYaml, + ExactValue exactRequest) { + this.operation = requireText(operation, "operation"); + this.channel = requireText(channel, "channel"); + if ((requestYaml == null) == (exactRequest == null)) { + throw new IllegalArgumentException( + "Exactly one request representation is required"); + } + this.requestYaml = requestYaml == null + ? null + : normalizeYaml(requestYaml); + this.exactRequest = exactRequest; + } + + /** Creates an operation whose request is resolved from source YAML. */ + public static Operation yaml( + String operation, + String channel, + String requestYaml) { + return new Operation(operation, channel, requestYaml, null); + } + + /** Creates an operation that reuses an already retained exact request. */ + public static Operation exact( + String operation, + String channel, + ExactValue request) { + return new Operation( + operation, + channel, + null, + Objects.requireNonNull(request, "request")); + } + + /** Returns the authored operation name used by exact route matching. */ + public String operation() { return operation; } + + /** Returns the authored channel name used by exact route matching. */ + public String channel() { return channel; } + + /** Returns unresolved YAML when this operation uses the source path. */ + public Optional requestYaml() { + return Optional.ofNullable(requestYaml); + } + + /** Returns the retained exact request when this operation uses reuse. */ + public Optional exactRequest() { + return Optional.ofNullable(exactRequest); + } + + private static String normalizeYaml(String value) { + String checked = Objects.requireNonNull(value, "requestYaml").strip(); + return checked.isEmpty() ? "{}" : checked; + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/ProcessingDrainReceipt.java b/src/main/java/blue/coordination/api/ProcessingDrainReceipt.java new file mode 100644 index 0000000..22e7fe0 --- /dev/null +++ b/src/main/java/blue/coordination/api/ProcessingDrainReceipt.java @@ -0,0 +1,128 @@ +package blue.coordination.api; + +import blue.language.processor.ExternalOrderKey; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** Immutable result of one environment-selected drain to a safe frontier. */ +public final class ProcessingDrainReceipt { + private final List processedEntries; + private final Map> outcomesByEntry; + private final ExternalOrderKey processedThrough; + private final boolean quiescent; + private final boolean paused; + private final long committedProcessTransitions; + private final long elapsedNanos; + + /** Creates bounded-drain evidence, including exact committed work. */ + public ProcessingDrainReceipt( + List processedEntries, + Map> outcomesByEntry, + ExternalOrderKey processedThrough, + boolean quiescent, + boolean paused, + long committedProcessTransitions, + long elapsedNanos) { + this.processedEntries = List.copyOf(Objects.requireNonNull( + processedEntries, "processedEntries")); + Map> copied = + new LinkedHashMap<>(); + Objects.requireNonNull(outcomesByEntry, "outcomesByEntry") + .forEach((entryBlueId, outcomes) -> copied.put( + requireText(entryBlueId, "entryBlueId"), + List.copyOf(Objects.requireNonNull( + outcomes, "outcomes")))); + this.outcomesByEntry = Collections.unmodifiableMap(copied); + this.processedThrough = processedThrough; + this.quiescent = quiescent; + this.paused = paused; + if (quiescent && paused) { + throw new IllegalArgumentException( + "A drain cannot be quiescent and paused"); + } + if (committedProcessTransitions < 0L || elapsedNanos < 0L) { + throw new IllegalArgumentException( + "Drain measurements must be non-negative"); + } + this.committedProcessTransitions = committedProcessTransitions; + this.elapsedNanos = elapsedNanos; + } + + /** Entries selected by the environment in exact canonical order. */ + public List processedEntries() { + return processedEntries; + } + + /** Document transitions committed during this drain call. */ + public List outcomes() { + List result = new ArrayList<>(); + outcomesByEntry.values().forEach(result::addAll); + return Collections.unmodifiableList(result); + } + + /** Returns the only committed document outcome or fails explicitly. */ + public DocumentDispatchOutcome onlyOutcome() { + List all = outcomes(); + if (all.size() != 1) { + throw new CoordinationException( + CoordinationErrorCode.ATOMIC_COMMIT_FAILED, + "Expected one outcome but got " + all.size()); + } + return all.get(0); + } + + /** Exact document transitions committed for one entry identity. */ + public List outcomesFor(String entryBlueId) { + return outcomesByEntry.getOrDefault( + requireText(entryBlueId, "entryBlueId"), List.of()); + } + + /** Immutable outcomes indexed by exact Timeline Entry BlueId. */ + public Map> outcomesByEntry() { + return outcomesByEntry; + } + + /** Highest canonical external order completed by this environment. */ + public Optional processedThrough() { + return Optional.ofNullable(processedThrough); + } + + /** Whether no eligible work remains at the requested cutoff. */ + public boolean quiescent() { + return quiescent; + } + + /** Whether deterministic work remains because this call hit its budget. */ + public boolean paused() { + return paused; + } + + /** Whether required work is waiting on unavailable prerequisite evidence. */ + public boolean blocked() { + return !quiescent && !paused; + } + + /** Frozen PROCESS revisions committed during this call. */ + public long committedProcessTransitions() { + return committedProcessTransitions; + } + + /** Total host and frozen elapsed time observed by this drain call. */ + public long elapsedNanos() { + return elapsedNanos; + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/SessionStatus.java b/src/main/java/blue/coordination/api/SessionStatus.java new file mode 100644 index 0000000..912b3bc --- /dev/null +++ b/src/main/java/blue/coordination/api/SessionStatus.java @@ -0,0 +1,15 @@ +package blue.coordination.api; + +/** Readiness of one managed document session. */ +public enum SessionStatus { + /** Authored state exists but initialization has not committed. */ + PENDING_INITIALIZATION, + /** Historical child work is being integrated to a captured frontier. */ + CATCHING_UP, + /** The document and active children are complete through their frontier. */ + READY, + /** A required transition failed closed and needs explicit recovery. */ + BLOCKED, + /** The document process has ended and accepts no further transitions. */ + TERMINATED +} diff --git a/src/main/java/blue/coordination/api/Timeline.java b/src/main/java/blue/coordination/api/Timeline.java new file mode 100644 index 0000000..5978067 --- /dev/null +++ b/src/main/java/blue/coordination/api/Timeline.java @@ -0,0 +1,20 @@ +package blue.coordination.api; + +import java.util.Objects; + +/** One append-only Timeline and the actor whose entries it authenticates. */ +public record Timeline(String timelineId, String actorId) { + /** Validates the Timeline and actor identities. */ + public Timeline { + timelineId = requireText(timelineId, "timelineId"); + actorId = requireText(actorId, "actorId"); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/api/TimelineAppendReceipt.java b/src/main/java/blue/coordination/api/TimelineAppendReceipt.java new file mode 100644 index 0000000..c40231d --- /dev/null +++ b/src/main/java/blue/coordination/api/TimelineAppendReceipt.java @@ -0,0 +1,23 @@ +package blue.coordination.api; + +import java.util.Objects; + +/** Result of admitting one exact Timeline Entry to the environment journal. */ +public record TimelineAppendReceipt( + TimelineEntry entry, + boolean stored, + int journalEntryCount, + long elapsedNanos) { + /** Validates the immutable append evidence. */ + public TimelineAppendReceipt { + entry = Objects.requireNonNull(entry, "entry"); + if (journalEntryCount < 1) { + throw new IllegalArgumentException( + "journalEntryCount must be positive"); + } + if (elapsedNanos < 0L) { + throw new IllegalArgumentException( + "elapsedNanos must be non-negative"); + } + } +} diff --git a/src/main/java/blue/coordination/api/TimelineEntry.java b/src/main/java/blue/coordination/api/TimelineEntry.java new file mode 100644 index 0000000..cb14fb3 --- /dev/null +++ b/src/main/java/blue/coordination/api/TimelineEntry.java @@ -0,0 +1,50 @@ +package blue.coordination.api; + +import blue.language.processor.ExternalOrderKey; + +import java.util.Objects; + +/** One whole exact Timeline Entry retained once in the journal. */ +public record TimelineEntry( + ExactValue exactEvent, + ExactValue exactRequest, + ExternalOrderKey journalOrderKey, + ExternalOrderKey sourceOrderKey, + Timeline timeline, + String operation, + String channel, + long timestampMicros, + long globalSequence, + long timelineSequence) { + /** Validates exact values and deterministic journal/source coordinates. */ + public TimelineEntry { + exactEvent = Objects.requireNonNull(exactEvent, "exactEvent"); + exactRequest = Objects.requireNonNull(exactRequest, "exactRequest"); + journalOrderKey = Objects.requireNonNull(journalOrderKey, "journalOrderKey"); + sourceOrderKey = Objects.requireNonNull(sourceOrderKey, "sourceOrderKey"); + timeline = Objects.requireNonNull(timeline, "timeline"); + operation = requireText(operation, "operation"); + channel = requireText(channel, "channel"); + if (timestampMicros <= 0L) { + throw new IllegalArgumentException("timestampMicros must be positive"); + } + if (globalSequence <= 0L || timelineSequence <= 0L) { + throw new IllegalArgumentException( + "journal sequences must be positive"); + } + } + + /** Returns the exact content identity of the retained event. */ + public String blueId() { + return exactEvent.blueId(); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } + +} diff --git a/src/main/java/blue/coordination/internal/BlueRuntime.java b/src/main/java/blue/coordination/internal/BlueRuntime.java new file mode 100644 index 0000000..66d4be3 --- /dev/null +++ b/src/main/java/blue/coordination/internal/BlueRuntime.java @@ -0,0 +1,408 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; +import blue.coordination.processor.CoordinationProcessorOptions; +import blue.coordination.processor.CoordinationProcessors; +import blue.language.api.BlueCachePolicy; +import blue.language.api.BlueCacheStats; +import blue.language.codec.BlueFormat; +import blue.language.codec.jackson.UncheckedObjectMapper; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.merge.ResolvedSnapshot; +import blue.language.model.Node; +import blue.language.model.NodeWireForm; +import blue.language.processor.BlueContracts; +import blue.language.processor.DocumentProcessingResult; +import blue.language.processor.DocumentProcessor; +import blue.language.processor.EffectiveFragmentationCatalog; +import blue.language.processor.ExternalDeliveryPlan; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.PlatformProcessInvocation; +import blue.language.processor.PlatformProcessingResult; +import blue.language.processor.SubscriptionDelta; +import blue.language.processor.registry.BlueRuntimeTypeRegistry; +import blue.language.processor.registry.RuntimeTypeAliases; +import blue.language.provider.NodeProvider; +import blue.language.provider.SequentialNodeProvider; +import blue.language.runtime.BlueLanguage; +import blue.language.snapshot.FrozenNode; +import blue.repo.BlueRepository; +import blue.repo.RepositoryDefinition; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * One immutable production composition of Language, Contracts, BEX, and the + * current generated Repository. + */ +final class BlueRuntime implements AutoCloseable { + private final NodeProvider nodeProvider; + private final BlueLanguage language; + private final BlueContracts contracts; + private final DocumentProcessor processor; + private final EngineMetrics metrics; + private boolean closed; + + private BlueRuntime( + NodeProvider nodeProvider, + BlueLanguage language, + BlueContracts contracts, + DocumentProcessor processor, + EngineMetrics metrics) { + this.nodeProvider = Objects.requireNonNull( + nodeProvider, "nodeProvider"); + this.language = Objects.requireNonNull(language, "language"); + this.contracts = Objects.requireNonNull(contracts, "contracts"); + this.processor = Objects.requireNonNull(processor, "processor"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + } + + static BlueRuntime create(WholeObjectStore wholeObjects) { + return create(wholeObjects, new EngineMetrics()); + } + + static BlueRuntime create( + WholeObjectStore wholeObjects, + EngineMetrics metrics) { + BlueRepository repository = BlueRepository.current(); + List providers = new ArrayList<>(); + providers.add(Objects.requireNonNull(wholeObjects, "wholeObjects")); + providers.add(BlueRuntimeTypeRegistry.getDefault() + .asProcessorSnapshotProvider()); + providers.add(repository.nodeProvider()); + providers.add(new RepositoryExactNodeProvider(repository)); + NodeProvider nodeProvider = new SequentialNodeProvider(providers); + + Map imports = new LinkedHashMap<>(); + imports.putAll(RuntimeTypeAliases.AGGREGATE_NAME_TO_BLUE_ID); + imports.putAll(repository.preprocessingAliases()); + BlueLanguage language = BlueLanguage.builder() + .nodeProvider(nodeProvider) + .preprocessingAliases(imports) + .environmentImports(imports) + .cachePolicy(BlueCachePolicy.highThroughputDefaults()) + .build(); + CoordinationProcessorOptions options = + CoordinationProcessorOptions.builder() + .language(language) + .build(); + BlueContracts contracts = CoordinationProcessors.contracts( + language, options); + DocumentProcessor processor = CoordinationProcessors.configure( + DocumentProcessor.builder() + .runtimeAccess(contracts.runtimeAccess()), + options) + .runtimeRegistryIdentity( + "blue.coordination/in-memory-runtime/3.0") + .build(); + return new BlueRuntime( + nodeProvider, language, contracts, processor, metrics); + } + + Node parseSourceYaml(String yaml) { + ensureOpen(); + return language.codec().parseSource(yaml, BlueFormat.YAML); + } + + Node preprocess(Node source) { + ensureOpen(); + return language.preprocessing().preprocess(source); + } + + String nodeToYaml(Node node) { + ensureOpen(); + return language.codec().write(node, BlueFormat.YAML); + } + + ResolvedSnapshot resolveToSnapshot(Node source) { + ensureOpen(); + return language.snapshots().resolve(source); + } + + ResolvedSnapshot resolveToSnapshotPreservingPaths( + Node source, + Collection paths) { + ensureOpen(); + return language.snapshots().resolvePreservingPaths(source, paths); + } + + ResolvedSnapshot loadExactSnapshot(String blueId) { + ensureOpen(); + FrozenNode reference = FrozenNode.fromNode(new Node().blueId( + Objects.requireNonNull(blueId, "blueId"))); + FrozenNode materialized = contracts.runtimeAccess() + .materializeVerifiedExactReference(reference) + .requireEstablished(); + return contracts.runtimeAccess().resolveTransient( + materialized.toNode()); + } + + ResolvedSnapshot cache(ResolvedSnapshot snapshot) { + ensureOpen(); + return language.snapshots().cache( + Objects.requireNonNull(snapshot, "snapshot")); + } + + BlueCacheStats cacheStats() { + ensureOpen(); + return language.snapshots().stats(); + } + + DocumentProcessingResult initialize(ResolvedSnapshot snapshot) { + ensureOpen(); + return processor.initializeDocument(snapshot); + } + + List projectInitialOwnedSubscriptions( + FrozenNode processingRoot, + long rootRevision, + ExternalOrderKey activationOrderKey) { + ensureOpen(); + SubscriptionDelta delta = contracts.subscriptionSurfaceProjection() + .projectInitial( + Objects.requireNonNull( + processingRoot, "processingRoot").toNode(), + rootRevision, + Objects.requireNonNull( + activationOrderKey, "activationOrderKey")); + if (!delta.removed().isEmpty()) { + throw new IllegalStateException( + "Initial subscription projection retired an occurrence"); + } + return delta.added(); + } + + PlatformProcessingResult process( + Node currentRootRepresentation, + String exactEventBlueId, + long rootRevision, + ExternalOrderKey eventOrderKey, + List rootSubscriptions) { + ensureOpen(); + Node root = Objects.requireNonNull( + currentRootRepresentation, "currentRootRepresentation"); + Node eventReference = new Node().blueId(Objects.requireNonNull( + exactEventBlueId, "exactEventBlueId")); + long planStarted = System.nanoTime(); + ExternalDeliveryPlan deliveryPlan = contracts + .currentRootDeliveryPlanDeriver( + rootRevision, + Objects.requireNonNull(eventOrderKey, "eventOrderKey"), + Objects.requireNonNull( + rootSubscriptions, "rootSubscriptions")) + .derive(root, eventReference); + metrics.addNanos("process.deliveryPlanDerivation", + System.nanoTime() - planStarted); + PlatformProcessInvocation invocation = + PlatformProcessInvocation.builder() + .deliveryPlan(deliveryPlan) + .nodeProvider(nodeProvider) + .build(); + return metrics.timed("process.platformCommit", () -> + contracts.processForPlatformCommit( + root, eventReference, invocation)); + } + + SubscriptionDelta projectSubscriptionUpdate( + FrozenNode processingRoot, + List priorActiveIntervals, + Set changedRuntimePointers, + long resultingRootRevision, + ExternalOrderKey transitionOrderKey) { + ensureOpen(); + return contracts.subscriptionSurfaceProjection().projectUpdate( + Objects.requireNonNull( + processingRoot, "processingRoot").toNode(), + Objects.requireNonNull( + priorActiveIntervals, "priorActiveIntervals"), + Objects.requireNonNull( + changedRuntimePointers, "changedRuntimePointers"), + resultingRootRevision, + Objects.requireNonNull( + transitionOrderKey, "transitionOrderKey")); + } + + EffectiveFragmentationCatalog effectiveFragmentationCatalog( + String exactRootBlueId) { + ensureOpen(); + return contracts.effectiveFragmentationCatalog( + new Node().blueId(Objects.requireNonNull( + exactRootBlueId, "exactRootBlueId"))); + } + + ExactValue exactSource( + String yaml, + WholeObjectStore objects, + String purpose) { + Node source = parseSourceYaml(yaml); + Node preprocessed = preprocess(source); + return objects.put( + cache(resolveToSnapshot(preprocessed)), purpose); + } + + NodeProvider nodeProvider() { + ensureOpen(); + return nodeProvider; + } + + @Override + public void close() { + if (closed) { + return; + } + closed = true; + close(contracts); + close(processor); + close(language); + } + + private void ensureOpen() { + if (closed) { + throw new IllegalStateException("Blue runtime is closed"); + } + } + + private static void close(AutoCloseable resource) { + try { + resource.close(); + } catch (RuntimeException failure) { + throw failure; + } catch (Exception failure) { + throw new IllegalStateException( + "Could not close Blue runtime component", failure); + } + } + + /** Lazy exact index for inherited inline Repository contributions. */ + private static final class RepositoryExactNodeProvider + implements NodeProvider { + private final BlueRepository repository; + private final ClassLoader classLoader; + private volatile Map exactNodes; + + private RepositoryExactNodeProvider(BlueRepository repository) { + this.repository = Objects.requireNonNull(repository, "repository"); + ClassLoader context = Thread.currentThread() + .getContextClassLoader(); + classLoader = context == null + ? BlueRuntime.class.getClassLoader() + : context; + } + + @Override + public List fetchByBlueId(String blueId) { + Node found = exactNodes().get(Objects.requireNonNull( + blueId, "blueId")); + return found == null + ? null + : Collections.singletonList(found.clone()); + } + + private Map exactNodes() { + Map current = exactNodes; + if (current != null) { + return current; + } + synchronized (this) { + current = exactNodes; + if (current == null) { + current = buildIndex(); + exactNodes = current; + } + return current; + } + } + + private Map buildIndex() { + List names = new ArrayList<>(repository.qualifiedNames()); + names.sort(ExternalOrderKey::compareTextCodePoints); + Map indexed = new LinkedHashMap<>(); + IdentityHashMap visited = new IdentityHashMap<>(); + for (String name : names) { + RepositoryDefinition definition = repository.definition(name) + .orElseThrow(() -> new IllegalStateException( + "Repository manifest has no " + name)); + Node node = definition.blueId().indexOf('#') >= 0 + ? repository.nodeByName(name).orElseThrow(() -> + new IllegalStateException( + "Repository provider has no " + name)) + : readDefinition(definition); + index(node, indexed, visited); + } + return Collections.unmodifiableMap(indexed); + } + + private Node readDefinition(RepositoryDefinition definition) { + try (InputStream input = classLoader.getResourceAsStream( + definition.resourcePath())) { + if (input == null) { + throw new IllegalStateException( + "Repository resource not found: " + + definition.resourcePath()); + } + return UncheckedObjectMapper.JSON_MAPPER.readValue( + input, Node.class); + } catch (IOException failure) { + throw new IllegalStateException( + "Could not read Repository resource: " + + definition.resourcePath(), + failure); + } + } + + private static void index( + Node node, + Map indexed, + IdentityHashMap visited) { + if (node == null || node.isReferenceOnly() + || visited.put(node, Boolean.TRUE) != null) { + return; + } + Node exact = node.clone(); + String declared = exact.getBlueId(); + boolean addressable = declared == null + || declared.indexOf('#') < 0; + if (declared != null && addressable) { + exact.blueId(null); + } + if (addressable) { + String blueId = DirectBlueIdCalculator.calculateBlueId(exact); + if (declared != null && !declared.equals(blueId)) { + throw new IllegalStateException( + "Repository subtree " + declared + + " calculates to " + blueId); + } + Node prior = indexed.putIfAbsent(blueId, exact); + if (prior != null && !NodeWireForm.get(prior).equals( + NodeWireForm.get(exact))) { + throw new IllegalStateException( + "Conflicting Repository content for " + blueId); + } + } + index(node.getType(), indexed, visited); + index(node.getItemType(), indexed, visited); + index(node.getKeyType(), indexed, visited); + index(node.getValueType(), indexed, visited); + index(node.getBlue(), indexed, visited); + index(node.getContracts(), indexed, visited); + if (node.getProperties() != null) { + node.getProperties().values().forEach( + child -> index(child, indexed, visited)); + } + if (node.getItems() != null) { + node.getItems().forEach( + child -> index(child, indexed, visited)); + } + } + } +} diff --git a/src/main/java/blue/coordination/internal/CatchUpBarrier.java b/src/main/java/blue/coordination/internal/CatchUpBarrier.java new file mode 100644 index 0000000..8009ac7 --- /dev/null +++ b/src/main/java/blue/coordination/internal/CatchUpBarrier.java @@ -0,0 +1,203 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; +import blue.language.processor.ExternalOrderKey; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** Durable synchronized catch-up state for one parent attachment transition. */ +final class CatchUpBarrier { + enum Status { + OPEN, + DEFERRED, + COMPLETE, + BLOCKED + } + + private final String barrierId; + private final DocumentId parentDocumentId; + private final String attachmentEntryBlueId; + private final ExternalOrderKey cutoffExclusive; + private final LinkedHashSet bindingIds = new LinkedHashSet<>(); + private final LinkedHashSet nestedBarrierIds = new LinkedHashSet<>(); + private final Map historicalProgress = + new LinkedHashMap<>(); + private final Map completenessByBinding = + new LinkedHashMap<>(); + private Status status = Status.OPEN; + private String diagnostic; + + CatchUpBarrier( + String barrierId, + DocumentId parentDocumentId, + String attachmentEntryBlueId, + ExternalOrderKey cutoffExclusive) { + this.barrierId = requireText(barrierId, "barrierId"); + this.parentDocumentId = Objects.requireNonNull( + parentDocumentId, "parentDocumentId"); + this.attachmentEntryBlueId = requireText( + attachmentEntryBlueId, "attachmentEntryBlueId"); + this.cutoffExclusive = Objects.requireNonNull( + cutoffExclusive, "cutoffExclusive"); + } + + private CatchUpBarrier(CatchUpBarrier source) { + barrierId = source.barrierId; + parentDocumentId = source.parentDocumentId; + attachmentEntryBlueId = source.attachmentEntryBlueId; + cutoffExclusive = source.cutoffExclusive; + bindingIds.addAll(source.bindingIds); + nestedBarrierIds.addAll(source.nestedBarrierIds); + historicalProgress.putAll(source.historicalProgress); + completenessByBinding.putAll(source.completenessByBinding); + status = source.status; + diagnostic = source.diagnostic; + } + + String barrierId() { + return barrierId; + } + + DocumentId parentDocumentId() { + return parentDocumentId; + } + + String attachmentEntryBlueId() { + return attachmentEntryBlueId; + } + + ExternalOrderKey cutoffExclusive() { + return cutoffExclusive; + } + + synchronized Set bindingIds() { + return Collections.unmodifiableSet(new LinkedHashSet<>(bindingIds)); + } + + synchronized Set nestedBarrierIds() { + return Collections.unmodifiableSet( + new LinkedHashSet<>(nestedBarrierIds)); + } + + synchronized Status status() { + return status; + } + + synchronized String diagnostic() { + return diagnostic; + } + + synchronized void extend(String bindingId) { + if (status == Status.COMPLETE || status == Status.BLOCKED) { + throw new IllegalStateException( + "Cannot extend barrier in state " + status); + } + bindingIds.add(requireText(bindingId, "bindingId")); + status = Status.OPEN; + } + + synchronized void addNestedBarrier(String nestedBarrierId) { + if (status == Status.COMPLETE || status == Status.BLOCKED) { + throw new IllegalStateException( + "Cannot extend barrier in state " + status); + } + nestedBarrierIds.add(requireText( + nestedBarrierId, "nestedBarrierId")); + } + + synchronized ExternalOrderKey progress(String bindingId) { + return historicalProgress.get(requireText(bindingId, "bindingId")); + } + + synchronized void recordProgress( + String bindingId, + ExternalOrderKey sourceOrder) { + String id = requireText(bindingId, "bindingId"); + ExternalOrderKey order = Objects.requireNonNull( + sourceOrder, "sourceOrder"); + ExternalOrderKey previous = historicalProgress.get(id); + if (previous != null && order.compareTo(previous) <= 0) { + throw new IllegalStateException( + "Historical progress must increase for " + id); + } + historicalProgress.put(id, order); + completenessByBinding.remove(id); + } + + synchronized Map historicalProgress() { + return Collections.unmodifiableMap( + new LinkedHashMap<>(historicalProgress)); + } + + synchronized void recordCompletenessEvidence( + String bindingId, + CompletenessEvidence evidence) { + String id = requireText(bindingId, "bindingId"); + if (!bindingIds.contains(id)) { + throw new IllegalArgumentException( + "Completeness evidence has no barrier binding " + id); + } + CompletenessEvidence checked = Objects.requireNonNull( + evidence, "evidence"); + if (!cutoffExclusive.equals(checked.cutoffExclusive())) { + throw new IllegalArgumentException( + "Completeness evidence cutoff does not match barrier"); + } + completenessByBinding.put(id, checked); + } + + synchronized CompletenessEvidence completenessEvidence( + String bindingId) { + return completenessByBinding.get(requireText( + bindingId, "bindingId")); + } + + synchronized Map completenessEvidence() { + return Collections.unmodifiableMap( + new LinkedHashMap<>(completenessByBinding)); + } + + synchronized void defer(String reason) { + diagnostic = requireText(reason, "reason"); + status = Status.DEFERRED; + } + + synchronized void reopen() { + if (status == Status.BLOCKED || status == Status.COMPLETE) { + throw new IllegalStateException( + "Cannot reopen barrier in state " + status); + } + status = Status.OPEN; + diagnostic = null; + } + + synchronized void complete() { + if (status == Status.BLOCKED) { + throw new IllegalStateException("Blocked barrier cannot complete"); + } + status = Status.COMPLETE; + diagnostic = null; + } + + synchronized void block(String reason) { + diagnostic = requireText(reason, "reason"); + status = Status.BLOCKED; + } + + synchronized CatchUpBarrier copy() { + return new CatchUpBarrier(this); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/CheckpointDomainEvidence.java b/src/main/java/blue/coordination/internal/CheckpointDomainEvidence.java new file mode 100644 index 0000000..643f6ce --- /dev/null +++ b/src/main/java/blue/coordination/internal/CheckpointDomainEvidence.java @@ -0,0 +1,79 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; +import blue.coordination.processor.TimelineProviderSupport; +import blue.language.model.Node; +import blue.language.processor.SubscriptionDelta; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** Retains exact processor-owned checkpoint descriptors needed by Compute. */ +final class CheckpointDomainEvidence { + private static final String CONTRACTS_VERSION = "1.0"; + + private CheckpointDomainEvidence() { + } + + static void retainAll( + List subscriptions, + WholeObjectStore objects) { + Objects.requireNonNull(subscriptions, "subscriptions"); + Objects.requireNonNull(objects, "objects"); + for (SubscriptionDelta.Entry subscription : subscriptions) { + if (objects.contains(subscription.checkpointDomainBlueId())) { + continue; + } + Node descriptor = timelineDescriptor(subscription); + ExactValue exact = objects.put( + descriptor, "checkpoint-domain"); + if (!subscription.checkpointDomainBlueId().equals( + exact.blueId())) { + throw new IllegalStateException( + "Unsupported external checkpoint domain at " + + subscription.scopePath() + "/" + + subscription.channelKey() + ": projected " + + subscription.checkpointDomainBlueId() + + " but Timeline descriptor calculated " + + exact.blueId()); + } + } + } + + private static Node timelineDescriptor( + SubscriptionDelta.Entry subscription) { + Node descriptor = new Node() + .properties( + "contractsVersion", + new Node().value(CONTRACTS_VERSION)) + .properties( + "effectiveTypeBlueId", + new Node().value( + subscription.effectiveTypeBlueId())) + .properties( + "sourceContributionNodeBlueIds", + textList(subscription + .sourceContributionNodeBlueIds())); + List dependencies = subscription.dependencies() + .deterministicDependencyNodeBlueIds(); + if (!dependencies.isEmpty()) { + descriptor.properties( + "deterministicDependencyNodeBlueIds", + textList(dependencies)); + } + return descriptor.properties( + "runtimeDiscriminator", + new Node().value(TimelineProviderSupport + .checkpointDomainRuntimeDiscriminator( + subscription.effectiveTypeBlueId()))); + } + + private static Node textList(List values) { + List items = new ArrayList<>(values.size()); + for (String value : values) { + items.add(new Node().value(value)); + } + return new Node().items(items); + } +} diff --git a/src/main/java/blue/coordination/internal/CompletenessEvidence.java b/src/main/java/blue/coordination/internal/CompletenessEvidence.java new file mode 100644 index 0000000..0689612 --- /dev/null +++ b/src/main/java/blue/coordination/internal/CompletenessEvidence.java @@ -0,0 +1,50 @@ +package blue.coordination.internal; + +import blue.language.processor.ExternalOrderKey; + +import java.util.Objects; + +/** Immutable proof identity for one exact, complete historical query. */ +record CompletenessEvidence( + long journalRevision, + long routeIndexGeneration, + long graphGeneration, + ExternalOrderKey cutoffExclusive, + String sourceSurfaceIdentity) { + CompletenessEvidence { + if (journalRevision < 0L || routeIndexGeneration < 0L + || graphGeneration < 0L) { + throw new IllegalArgumentException( + "completeness generations must be non-negative"); + } + cutoffExclusive = Objects.requireNonNull( + cutoffExclusive, "cutoffExclusive"); + sourceSurfaceIdentity = requireText( + sourceSurfaceIdentity, "sourceSurfaceIdentity"); + } + + /** True only for the exact journal, route, graph, cutoff, and surface. */ + boolean isCurrentFor( + long expectedJournalRevision, + long expectedRouteIndexGeneration, + long expectedGraphGeneration, + ExternalOrderKey expectedCutoffExclusive, + String expectedSourceSurfaceIdentity) { + return journalRevision == expectedJournalRevision + && routeIndexGeneration == expectedRouteIndexGeneration + && graphGeneration == expectedGraphGeneration + && cutoffExclusive.equals(Objects.requireNonNull( + expectedCutoffExclusive, "expectedCutoffExclusive")) + && sourceSurfaceIdentity.equals(requireText( + expectedSourceSurfaceIdentity, + "expectedSourceSurfaceIdentity")); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java b/src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java new file mode 100644 index 0000000..bbc81c5 --- /dev/null +++ b/src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java @@ -0,0 +1,855 @@ +package blue.coordination.internal; + +import blue.coordination.api.TimelineEntry; + +import blue.coordination.api.Timeline; + +import blue.coordination.api.SessionStatus; + +import blue.coordination.api.Operation; + +import blue.coordination.api.ExactValue; + +import blue.coordination.api.DocumentRevision; + +import blue.coordination.api.DocumentId; +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.CoordinationMetrics; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.TimelineAppendReceipt; +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentDispatchOutcome; +import blue.coordination.api.DocumentSnapshot; +import blue.coordination.processor.TimelineProviderSupport; + +import blue.language.api.BlueCacheStats; +import blue.language.model.Node; +import blue.language.model.NodePathEditor; +import blue.language.processor.ExternalOrderKey; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; + +/** Sequential in-memory Process Embedded temporal-profile engine. */ +public final class DefaultCoordinationEngine + implements CoordinationEngine { + enum FailurePoint { + BEFORE_FROZEN_PROCESS, + AFTER_FROZEN_BEFORE_STAGE, + AFTER_STAGING_CHILD_SESSION, + AFTER_APPLYING_CHILD_REVISION, + BEFORE_COMMIT_VALIDATION, + AFTER_STATE_SWAP_BEFORE_RETURN + } + + static final class InjectedFailureException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private InjectedFailureException(FailurePoint point) { + super("Injected coordination failure at " + point); + } + } + + private static final long BASE_TIMESTAMP_MICROS = + 1_800_000_000_000_000L; + + private final EngineMetrics metrics; + private final WholeObjectStore objects; + private final BlueRuntime runtime; + private final WholeRequestEntryFactory entryFactory; + private final InMemoryTimelineJournal journal; + private final OperationRouteIndex routeIndex; + private final EmbeddedOnlyLayoutBuilder layoutBuilder; + private final DocumentTransitionProcessor processor; + private final InMemoryDocumentStore documents; + private SequentialDrainCoordinator drainCoordinator; + private final Map timelines = new LinkedHashMap<>(); + private Consumer failureInjector = ignored -> { }; + private long logicalClockMicros = BASE_TIMESTAMP_MICROS; + private long applicationClockMicros = BASE_TIMESTAMP_MICROS; + private boolean closed; + + private DefaultCoordinationEngine() { + metrics = new EngineMetrics(); + objects = new WholeObjectStore(metrics); + runtime = BlueRuntime.create(objects, metrics); + entryFactory = new WholeRequestEntryFactory(runtime, objects, metrics); + journal = new InMemoryTimelineJournal(entryFactory, metrics); + documents = new InMemoryDocumentStore(); + routeIndex = new OperationRouteIndex( + metrics, documentId -> documents.find(documentId).orElse(null)); + layoutBuilder = new EmbeddedOnlyLayoutBuilder( + runtime, objects, metrics); + processor = new DocumentTransitionProcessor( + runtime, objects, layoutBuilder, metrics, + this::inject); + drainCoordinator = new SequentialDrainCoordinator( + runtime, + objects, + entryFactory, + journal, + routeIndex, + processor, + documents, + metrics, + this::nextApplicationTimestamp, + this::inject); + } + + public static DefaultCoordinationEngine create() { + return new DefaultCoordinationEngine(); + } + + @Override + public synchronized Timeline registerTimeline( + String timelineId, + String actorId) { + ensureOpen(); + Timeline proposed = new Timeline(timelineId, actorId); + Timeline existing = timelines.putIfAbsent(timelineId, proposed); + if (existing != null && !existing.equals(proposed)) { + throw new IllegalArgumentException( + "Timeline " + timelineId + " already belongs to actor " + + existing.actorId()); + } + return existing == null ? proposed : existing; + } + + synchronized Timeline timeline(String timelineId, String actorId) { + return registerTimeline(timelineId, actorId); + } + + synchronized DocumentSession start( + String documentId, + String authoredYaml) { + return start(DocumentId.of(documentId), authoredYaml); + } + + synchronized DocumentSession start( + DocumentId documentId, + String authoredYaml) { + return start( + documentId, + authoredYaml, + CoordinationEngine.AdmissionPolicy.FROM_NOW, + null); + } + + private synchronized DocumentSession start( + DocumentId documentId, + String authoredYaml, + CoordinationEngine.AdmissionPolicy policy, + ExternalOrderKey verifiedFrontier) { + ensureOpen(); + if (documents.find(documentId).isPresent()) { + throw new IllegalArgumentException( + "Duplicate document session " + documentId); + } + WholeObjectStore.Mark objectMark = objects.mark(); + try { + ExternalOrderKey admissionFrontier = switch (policy) { + case FULL_HISTORY -> + DocumentTransitionProcessor.fullHistoryFrontier( + documentId); + case FROM_FRONTIER -> requireRetainedFrontier( + verifiedFrontier); + case FROM_NOW -> currentAdmissionFrontier(documentId); + }; + DocumentSession candidate = processor.admit( + documentId, + authoredYaml, + admissionFrontier, + policy); + documents.insert(candidate); + routeIndex.replace( + candidate.documentId(), + candidate.layout().routingSurface(), + candidate.activeSubscriptions()); + drainCoordinator.admitTopLevel( + candidate, + Objects.requireNonNull(policy, "policy"), + verifiedFrontier); + metrics.increment("sessionsCreated"); + metrics.timed("process.commitReadinessPublication", + () -> objects.commit(objectMark)); + return candidate; + } catch (RuntimeException failure) { + boolean retainAdmission = documents.find(documentId).isPresent() + && drainCoordinator.retainFailedAdmission(documentId); + if (retainAdmission) { + objects.commit(objectMark); + metrics.increment("temporal.failedAdmissionsRetained"); + } else { + documents.remove(documentId); + routeIndex.remove(documentId); + objects.rollbackTo(objectMark); + } + throw failure; + } + } + + @Override + public synchronized DocumentSnapshot startDocument( + DocumentId documentId, + String authoredYaml) { + try { + return snapshot(start(documentId, authoredYaml)); + } catch (RuntimeException failure) { + throw translateStartFailure(documentId, failure); + } + } + + @Override + public synchronized void configureEmbeddedAdmission( + DocumentId documentId, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough) { + ensureOpen(); + drainCoordinator.configureEmbeddedAdmission( + documentId, mode, verifiedCompleteThrough); + } + + @Override + public synchronized void configureEmbeddedAdmission( + DocumentId parentDocumentId, + String absoluteChildPath, + DocumentId childDocumentId, + String admittedStateBlueId, + Long admittedEpoch, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough, + String completenessProofIdentity, + String expectedAttachmentEntryBlueId) { + ensureOpen(); + drainCoordinator.configureEmbeddedAdmission( + parentDocumentId, absoluteChildPath, childDocumentId, + admittedStateBlueId, admittedEpoch, mode, + verifiedCompleteThrough, completenessProofIdentity, + expectedAttachmentEntryBlueId); + } + + @Override + public synchronized DocumentSnapshot startDocument( + DocumentId documentId, + String authoredYaml, + CoordinationEngine.AdmissionPolicy policy, + ExternalOrderKey verifiedFrontier) { + try { + return snapshot(start( + documentId, + authoredYaml, + policy, + verifiedFrontier)); + } catch (RuntimeException failure) { + throw translateStartFailure(documentId, failure); + } + } + + + synchronized ExactValue registerType(String sourceYaml) { + ensureOpen(); + return runtime.exactSource(sourceYaml, objects, "test-type"); + } + + synchronized ExactValue exactRequest(String requestYaml) { + ensureOpen(); + return entryFactory.parseExactRequest(requestYaml); + } + + @Override + public synchronized ExactValue exactValue(String sourceYaml) { + ensureOpen(); + return runtime.exactSource( + sourceYaml, objects, "external-exact-value"); + } + + synchronized ExactValue embeddedDocumentRequest( + String exactDocumentYaml) { + return referencedValueRequest("document", exactDocumentYaml); + } + + synchronized ExactValue referencedValueRequest( + String field, + String exactValueYaml) { + ensureOpen(); + if (field == null || field.isBlank()) { + throw new IllegalArgumentException("field must not be blank"); + } + ExactValue value = runtime.exactSource( + exactValueYaml, + objects, + "referenced-request-value"); + return objects.put( + new Node().properties( + field, value.referenceNode()), + "timeline-request"); + } + + @Override + public synchronized ExactValue referenceRequest( + String field, + ExactValue exactValue) { + ensureOpen(); + if (field == null || field.isBlank()) { + throw new IllegalArgumentException("field must not be blank"); + } + ExactValue retained = objects.put( + Objects.requireNonNull(exactValue, "exactValue"), + "referenced-request-value"); + return objects.put( + new Node().properties(field, retained.referenceNode()), + "timeline-request"); + } + + @Override + public synchronized TimelineEntry append( + Timeline timeline, + Operation operation) { + ensureOpen(); + Timeline canonicalTimeline = requireRegisteredTimeline(timeline); + long candidateTimestamp = Math.addExact(logicalClockMicros, 1L); + InMemoryTimelineJournal.Mark mark = journal.mark(); + WholeObjectStore.Mark objectMark = objects.mark(); + try { + TimelineEntry entry = metrics.timed( + "append.total", + () -> journal.append( + canonicalTimeline, + operation, + candidateTimestamp)); + requireAfterProcessedFrontier(entry); + logicalClockMicros = candidateTimestamp; + objects.commit(objectMark); + return entry; + } catch (RuntimeException failure) { + journal.rollbackTo(mark); + objects.rollbackTo(objectMark); + throw failure; + } + } + + @Override + public synchronized TimelineEntry appendAt( + Timeline timeline, + Operation operation, + long timestampMicros) { + ensureOpen(); + Timeline canonicalTimeline = requireRegisteredTimeline(timeline); + long nextClock = Math.max(logicalClockMicros, timestampMicros); + InMemoryTimelineJournal.Mark mark = journal.mark(); + WholeObjectStore.Mark objectMark = objects.mark(); + try { + TimelineEntry entry = metrics.timed("append.total", + () -> journal.append( + canonicalTimeline, operation, timestampMicros)); + requireAfterProcessedFrontier(entry); + logicalClockMicros = nextClock; + objects.commit(objectMark); + return entry; + } catch (RuntimeException failure) { + journal.rollbackTo(mark); + objects.rollbackTo(objectMark); + throw failure; + } + } + + @Override + public synchronized TimelineAppendReceipt appendTimelineEntry( + Node exactEntry) { + ensureOpen(); + long started = System.nanoTime(); + WholeObjectStore.Mark objectMark = objects.mark(); + InMemoryTimelineJournal.Mark journalMark = journal.mark(); + try { + ExactValue supplied = ExactValue.verified( + Objects.requireNonNull(exactEntry, "exactEntry")); + Node canonical = supplied.copyNode(); + TimelineProviderSupport.validateExactEnvelope(canonical); + String timelineId = requiredTextAt( + canonical, "/timeline/timelineId"); + String actorId = requiredTextAt( + canonical, "/actor/accountId"); + long timestamp = requiredLongAt(canonical, "/timestamp"); + Timeline timeline = requireRegisteredTimeline( + new Timeline(timelineId, actorId)); + boolean stored = journal.byBlueId(supplied.blueId()).isEmpty(); + TimelineEntry admitted = journal.appendExact(timeline, supplied); + if (stored) { + requireAfterProcessedFrontier(admitted); + } + logicalClockMicros = Math.max(logicalClockMicros, timestamp); + objects.commit(objectMark); + return new TimelineAppendReceipt( + admitted, + stored, + journal.size(), + System.nanoTime() - started); + } catch (RuntimeException failure) { + journal.rollbackTo(journalMark); + objects.rollbackTo(objectMark); + throw failure; + } finally { + metrics.addNanos("append.total", System.nanoTime() - started); + } + } + + @Override + public synchronized int routeTargetCount(TimelineEntry entry) { + ensureOpen(); + return routeIndex.route(journal.requireCanonical( + Objects.requireNonNull(entry, "entry"))).size(); + } + + @Override + public synchronized ProcessingDrainReceipt drain() { + return drain(CoordinationEngine.DrainBudget.unlimited()); + } + + @Override + public synchronized ProcessingDrainReceipt drain( + CoordinationEngine.DrainBudget budget) { + try { + ensureOpen(); + return drainCoordinator.drain(null, Objects.requireNonNull( + budget, "budget")); + } catch (RuntimeException failure) { + throw translateDispatchFailure(failure); + } + } + + @Override + public synchronized ProcessingDrainReceipt drainThrough( + ExternalOrderKey inclusiveCutoff) { + try { + ensureOpen(); + return drainCoordinator.drain(Objects.requireNonNull( + inclusiveCutoff, "inclusiveCutoff"), + CoordinationEngine.DrainBudget.unlimited()); + } catch (RuntimeException failure) { + throw translateDispatchFailure(failure); + } + } + + synchronized void failOnceAt(FailurePoint point) { + Objects.requireNonNull(point, "point"); + failureInjector = new Consumer<>() { + private boolean pending = true; + + @Override + public void accept(FailurePoint observed) { + if (pending && observed == point) { + pending = false; + throw new InjectedFailureException(point); + } + } + }; + } + + synchronized void clearFailureInjection() { + failureInjector = ignored -> { }; + } + + synchronized void restartFromStores() { + ensureOpen(); + clearFailureInjection(); + routeIndex.clear(); + documents.sessions().stream() + .sorted(Comparator.comparing(DocumentSession::documentId, + EmbeddingBinding.DOCUMENT_ORDER)) + .forEach(session -> routeIndex.replace( + session.documentId(), + session.layout().routingSurface(), + session.activeSubscriptions())); + drainCoordinator = drainCoordinator.restartFromStores(this::inject); + } + + synchronized void makeHistoricalUnavailable(String diagnostic) { + ensureOpen(); + journal.makeHistoricalUnavailable(Objects.requireNonNull( + diagnostic, "diagnostic")); + } + + synchronized void makeHistoricalAvailable() { + ensureOpen(); + journal.makeHistoricalAvailable(); + } + + synchronized void invalidateHistoricalEvidence(String diagnostic) { + ensureOpen(); + journal.invalidateHistoricalEvidence(Objects.requireNonNull( + diagnostic, "diagnostic")); + } + + synchronized DocumentSession session(String documentId) { + ensureOpen(); + return documents.require(DocumentId.of(documentId)); + } + + synchronized Node currentRoot(String documentId) { + ensureOpen(); + return session(documentId).layout().reconstructRoot(); + } + + synchronized Node value(String documentId, String path) { + Node selected = NodePathEditor.getOrNull( + currentRoot(documentId), path); + if (selected == null) { + throw new IllegalArgumentException( + "No value at " + documentId + path); + } + return selected.clone(); + } + + synchronized List history(String documentId) { + return session(documentId).revisions(); + } + + synchronized List catchUpEvidence() { + Map statusByBinding = + new LinkedHashMap<>(); + drainCoordinator.barrierEvidence().forEach(barrier -> + barrier.bindingIds().forEach(bindingId -> + statusByBinding.put(bindingId, barrier.status()))); + return drainCoordinator.graphSnapshot().bindings().stream() + .map(binding -> new TemporalCatchUpEvidence( + binding.parentDocumentId(), + binding.childDocumentId(), + binding.absolutePath(), + drainCoordinator.cursor(binding.bindingId()) + .appliedChildEpoch(), + statusByBinding.getOrDefault( + binding.bindingId(), + CatchUpBarrier.Status.COMPLETE).name(), + binding.activationGeneration())) + .toList(); + } + + synchronized Set effectiveTimelineIds(String documentId) { + ensureOpen(); + LinkedHashSet result = new LinkedHashSet<>(); + result.addAll(drainCoordinator.effectiveTimelineIds( + DocumentId.of(documentId))); + return Collections.unmodifiableSet(result); + } + + synchronized Map embeddedDocuments( + String documentId) { + ensureOpen(); + Map result = new LinkedHashMap<>(); + drainCoordinator.bindingsForParent(DocumentId.of(documentId)) + .forEach(binding -> result.put( + binding.absolutePath(), + binding.childDocumentId().value())); + return Collections.unmodifiableMap(result); + } + + synchronized EngineMetrics.MetricsSnapshot metricsSnapshot() { + return metrics.snapshot(); + } + synchronized void observeTransitions( + Consumer observer) { + drainCoordinator.observeTransitions(observer); + } + synchronized BlueCacheStats languageCacheStats() { + ensureOpen(); + return runtime.cacheStats(); + } + + synchronized int journalSize() { + return journal.size(); + } + + synchronized int wholeObjectCount() { + return objects.size(); + } + + synchronized int documentCount() { + return documents.size(); + } + + synchronized int routeRowCount() { + return routeIndex.rowCount(); + } + + synchronized long logicalClockMicros() { + return logicalClockMicros; + } + + synchronized InMemoryDocumentStore documents() { + return documents; + } + + synchronized WholeObjectStore objects() { return objects; } + + synchronized void inject(FailurePoint point) { + failureInjector.accept(Objects.requireNonNull(point, "point")); + } + + EngineMetrics engineMetrics() { + return metrics; + } + + @Override + public synchronized DocumentSnapshot document(DocumentId documentId) { + DocumentSession session = requireDocument(documentId); + String readinessFailure = drainCoordinator.applicationReadinessFailure( + session); + if (readinessFailure != null) { + metrics.increment("temporal.applicationReadsRejected"); + throw new CoordinationException( + CoordinationErrorCode.DOCUMENT_NOT_READY, + "Document " + documentId + " is not application-ready: " + + readinessFailure, + null, + Map.of("documentId", documentId.value(), + "status", session.status().name(), + "epoch", Long.toString(session.epoch()), + "readyEpoch", Long.toString(session.readyEpoch()), + "graphPublishedEpoch", Long.toString( + session.graphPublishedEpoch()))); + } + return snapshot(session); + } + + @Override + public synchronized DocumentSnapshot auditDocument( + DocumentId documentId) { + return snapshot(requireDocument(documentId)); + } + + private DocumentSession requireDocument(DocumentId documentId) { + ensureOpen(); + try { + return documents.require(Objects.requireNonNull( + documentId, "documentId")); + } catch (RuntimeException failure) { + throw new CoordinationException( + CoordinationErrorCode.DOCUMENT_NOT_FOUND, + "Unknown document " + documentId, + failure, + Map.of("documentId", documentId.value())); + } + } + + @Override + public synchronized List history(DocumentId documentId) { + return requireDocument(documentId).revisions(); + } + + @Override + public synchronized Set effectiveTimelineIds( + DocumentId documentId) { + requireDocument(documentId); + return effectiveTimelineIds(documentId.value()); + } + + @Override + public synchronized CoordinationMetrics metrics() { + EngineMetrics.MetricsSnapshot current = metrics.publicSnapshot(); + return new CoordinationMetrics( + current.counters(), + current.phaseNanos(), + documents.size(), + routeIndex.rowCount(), + journal.size(), + objects.size(), + logicalClockMicros); + } + + private DocumentSnapshot snapshot(DocumentSession session) { + Map children = new LinkedHashMap<>(); + drainCoordinator.bindingsForParent(session.documentId()) + .forEach(binding -> children.put( + binding.absolutePath(), + binding.childDocumentId())); + EmbeddedOnlyLayout layout = session.layout(); + Map physicalObjects = new LinkedHashMap<>(); + layout.scopePaths().forEach(path -> physicalObjects.put( + path, layout.stored(path))); + return new DocumentSnapshot( + session.documentId(), + session.epoch(), + session.status(), + session.readyThrough(), + session.authoredInitialBlueId(), + session.currentRevision().after(), + physicalObjects, + children, + layout.boundaries().stream() + .map(EmbeddedBoundary::childScopePath) + .toList(), + layout.routingSurface().definitions().stream() + .map(definition -> definition.operation() + "|" + + definition.channelKey() + "|" + + definition.sources()) + .toList(), + layout.physicalObjectCount(), + layout.processingFrozen().blueId()); + } + + private static CoordinationException translateStartFailure( + DocumentId documentId, + RuntimeException failure) { + String message = failure.getMessage() == null + ? "Document admission failed" + : failure.getMessage(); + CoordinationErrorCode code = message.startsWith( + "Duplicate document session") + ? CoordinationErrorCode.DUPLICATE_DOCUMENT + : message.contains("cycle") + ? CoordinationErrorCode.PROCESS_EMBEDDED_CYCLE + : message.contains("DocumentId") + || message.contains("document identity") + ? CoordinationErrorCode.INVALID_DOCUMENT_IDENTITY + : CoordinationErrorCode.ATOMIC_COMMIT_FAILED; + return new CoordinationException( + code, + message, + failure, + Map.of("documentId", documentId.value())); + } + + private static RuntimeException translateDispatchFailure( + RuntimeException failure) { + if (failure instanceof InjectedFailureException) { + return failure; + } + String message = failure.getMessage() == null + ? "Frozen document processing failed" + : failure.getMessage(); + CoordinationErrorCode code = message.contains( + "cannot accept live work") + ? CoordinationErrorCode.DOCUMENT_NOT_READY + : message.contains("admission evidence") + || message.contains("Ambiguous historical state") + ? CoordinationErrorCode.INVALID_ACTIVATION_EVIDENCE + : message.contains("managed child") + ? CoordinationErrorCode.MANAGED_CHILD_OWNERSHIP_VIOLATION + : message.contains("subscription") + ? CoordinationErrorCode.INVALID_SUBSCRIPTION_EVIDENCE + : CoordinationErrorCode.FROZEN_PROCESSING_FAILED; + return new CoordinationException( + code, message, failure, Map.of()); + } + + @Override + public synchronized void close() { + if (closed) { + return; + } + closed = true; + runtime.close(); + } + + private long nextApplicationTimestamp() { + applicationClockMicros = Math.addExact( + Math.max(applicationClockMicros, logicalClockMicros), 1L); + return applicationClockMicros; + } + + private ExternalOrderKey currentAdmissionFrontier(DocumentId documentId) { + ExternalOrderKey latest = journal.latestExternalOrder(); + if (latest == null) { + return ExternalOrderKey.of(List.of( + BigInteger.ZERO, + "admission", + documentId.value())); + } + return latest; + } + + private ExternalOrderKey requireRetainedFrontier( + ExternalOrderKey frontier) { + ExternalOrderKey checked = Objects.requireNonNull( + frontier, "verifiedFrontier is required for FROM_FRONTIER"); + if (!journal.containsExternalOrder(checked)) { + throw new IllegalArgumentException( + "Frontier has no exact retained journal evidence"); + } + return checked; + } + + private Timeline requireRegisteredTimeline(Timeline supplied) { + Timeline checked = Objects.requireNonNull(supplied, "timeline"); + Timeline canonical = timelines.get(checked.timelineId()); + if (canonical == null) { + throw new IllegalArgumentException( + "Timeline must be registered before append: " + + checked.timelineId()); + } + if (!canonical.equals(checked)) { + throw new IllegalArgumentException( + "Timeline actor/provider evidence does not match registered " + + "Timeline " + checked.timelineId()); + } + return canonical; + } + + private void requireAfterProcessedFrontier(TimelineEntry entry) { + ExternalOrderKey processed = drainCoordinator.processedThrough(); + if (processed != null + && entry.sourceOrderKey().compareTo(processed) <= 0) { + throw new IllegalArgumentException( + "Timeline Entry order " + entry.sourceOrderKey() + + " is not after completed environment frontier " + + processed); + } + } + + private static String requiredTextAt(Node root, String pointer) { + Node selected = NodePathEditor.getOrNull( + Objects.requireNonNull(root, "root"), pointer); + Object value = selected == null ? null : selected.getValue(); + if (!(value instanceof String text) || text.isBlank()) { + throw new IllegalArgumentException( + "Timeline Entry requires non-blank Text at " + pointer); + } + return text; + } + + private static long requiredLongAt(Node root, String pointer) { + Node selected = NodePathEditor.getOrNull( + Objects.requireNonNull(root, "root"), pointer); + Object value = selected == null ? null : selected.getValue(); + long result; + if (value instanceof BigInteger integer) { + result = integer.longValueExact(); + } else if (value instanceof Number number) { + result = number.longValue(); + } else { + throw new IllegalArgumentException( + "Timeline Entry requires Integer at " + pointer); + } + if (result <= 0L) { + throw new IllegalArgumentException( + "Timeline Entry timestamp must be positive"); + } + return result; + } + + private void ensureOpen() { + if (closed) { + throw new IllegalStateException("DefaultCoordinationEngine is closed"); + } + } + + record TemporalCatchUpEvidence( + DocumentId parentDocumentId, + DocumentId childDocumentId, + String occurrencePath, + long appliedChildEpoch, + String status, + long activationGeneration) { + } +} diff --git a/src/main/java/blue/coordination/internal/DocumentIdentityReader.java b/src/main/java/blue/coordination/internal/DocumentIdentityReader.java new file mode 100644 index 0000000..17988f0 --- /dev/null +++ b/src/main/java/blue/coordination/internal/DocumentIdentityReader.java @@ -0,0 +1,51 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; + +import blue.coordination.api.DocumentId; + +import blue.language.snapshot.FrozenNode; + +import java.util.Objects; + +/** Reads stable process identity and activation policy through immutable indexes. */ +final class DocumentIdentityReader { + private static final String DOCUMENT_ID = "/documentId"; + + private DocumentIdentityReader() { + } + + public static DocumentId requireDocumentId(ExactValue document) { + Object value = valueAt(document, DOCUMENT_ID); + if (!(value instanceof String text) || text.isBlank()) { + throw new IllegalArgumentException( + "Every managed Root and Process Embedded document must carry " + + "a stable non-blank /documentId"); + } + return DocumentId.of(text); + } + + public static void verifyOptionalDocumentId( + ExactValue document, + DocumentId expected) { + Object value = valueAt(document, DOCUMENT_ID); + if (value == null) { + return; + } + if (!(value instanceof String text) || text.isBlank()) { + throw new IllegalArgumentException( + "/documentId must be non-blank Text when present"); + } + if (!Objects.requireNonNull(expected, "expected").value().equals(text)) { + throw new IllegalArgumentException( + "Managed DocumentId " + expected + + " does not match authored /documentId " + text); + } + } + + private static Object valueAt(ExactValue document, String path) { + FrozenNode selected = Objects.requireNonNull(document, "document") + .canonicalAt(path); + return selected == null ? null : selected.getValue(); + } +} diff --git a/src/main/java/blue/coordination/internal/DocumentSession.java b/src/main/java/blue/coordination/internal/DocumentSession.java new file mode 100644 index 0000000..e457216 --- /dev/null +++ b/src/main/java/blue/coordination/internal/DocumentSession.java @@ -0,0 +1,334 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.SessionStatus; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.SubscriptionDelta; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.OptionalLong; +import java.util.Set; + +final class DocumentSession { + private final DocumentId documentId; + private final String authoredInitialBlueId; + private List activeSubscriptions; + private final List revisions = new ArrayList<>(); + private final Set terminalEntryBlueIds = new LinkedHashSet<>(); + private final Set transitionReceipts = new LinkedHashSet<>(); + private final StateEpochs stateEpochs = new StateEpochs(); + private EmbeddedOnlyLayout layout; + private SessionStatus status; + private ExternalOrderKey readyThrough; + private long epoch; + private long readyEpoch; + private long graphPublishedEpoch; + private long applicationSequence; + + public DocumentSession( + DocumentId documentId, + ExactValue authoredInitialState, + EmbeddedOnlyLayout initializedLayout, + List activeSubscriptions, + ExternalOrderKey admissionFrontier, + DocumentRevision initializationRevision) { + this.documentId = Objects.requireNonNull(documentId, "documentId"); + this.authoredInitialBlueId = Objects.requireNonNull( + authoredInitialState, "authoredInitialState").blueId(); + this.layout = Objects.requireNonNull( + initializedLayout, "initializedLayout"); + this.activeSubscriptions = List.copyOf(Objects.requireNonNull( + activeSubscriptions, "activeSubscriptions")); + this.status = SessionStatus.READY; + this.readyThrough = Objects.requireNonNull( + admissionFrontier, "admissionFrontier"); + this.epoch = 0L; + this.readyEpoch = 0L; + this.graphPublishedEpoch = -1L; + this.applicationSequence = 0L; + this.revisions.add(Objects.requireNonNull( + initializationRevision, "initializationRevision")); + if (!initializationRevision.documentId().equals(documentId) + || initializationRevision.epoch() != 0L + || initializationRevision.kind() != DocumentRevision.Kind.INITIALIZATION + || !initializationRevision.after().blueId() + .equals(initializedLayout.rootBlueId())) { + throw new IllegalArgumentException( + "Initialization revision does not belong to session"); + } + stateEpochs.record(initializationRevision); + this.transitionReceipts.add( + "initialization|" + documentId.value()); + } + + public DocumentId documentId() { + return documentId; + } + + public String authoredInitialBlueId() { + return authoredInitialBlueId; + } + + public synchronized long epoch() { + return epoch; + } + + public synchronized long readyEpoch() { + return readyEpoch; + } + + public synchronized long graphPublishedEpoch() { + return graphPublishedEpoch; + } + + public synchronized boolean isLocallyReady() { + return status == SessionStatus.READY + && readyEpoch == epoch + && graphPublishedEpoch == epoch; + } + + public synchronized long nextApplicationOrder() { + return Math.addExact(applicationSequence, 1L); + } + + public synchronized EmbeddedOnlyLayout layout() { + return layout; + } + + public synchronized List activeSubscriptions() { + return activeSubscriptions; + } + + public synchronized SessionStatus status() { + return status; + } + + public synchronized ExternalOrderKey readyThrough() { + return readyThrough; + } + + public synchronized DocumentRevision currentRevision() { + return revisions.get(revisions.size() - 1); + } + + public synchronized List revisions() { + return Collections.unmodifiableList(new ArrayList<>(revisions)); + } + + public synchronized DocumentRevision revision(long childEpoch) { + if (childEpoch < 0L || childEpoch >= revisions.size()) { + throw new IllegalArgumentException( + "Unknown revision epoch " + childEpoch); + } + DocumentRevision revision = revisions.get(Math.toIntExact(childEpoch)); + if (revision.epoch() != childEpoch) { + throw new IllegalStateException("Revision history is not contiguous"); + } + return revision; + } + + public synchronized List revisionsAfter( + long epochExclusive) { + long firstEpoch = Math.max(0L, Math.addExact(epochExclusive, 1L)); + if (firstEpoch >= revisions.size()) { + return List.of(); + } + return Collections.unmodifiableList(new ArrayList<>( + revisions.subList(Math.toIntExact(firstEpoch), revisions.size()))); + } + + public synchronized boolean hasTerminalEntry(String entryBlueId) { + return terminalEntryBlueIds.contains(entryBlueId); + } + + public synchronized Optional revisionForEntry( + String entryBlueId) { + String identity = Objects.requireNonNull(entryBlueId, "entryBlueId"); + return revisions.stream() + .filter(revision -> revision.sourceEntry() + .map(entry -> entry.blueId().equals(identity)) + .orElse(false)) + .findFirst(); + } + + public synchronized boolean hasTransitionReceipt(String receiptId) { + return transitionReceipts.contains(Objects.requireNonNull( + receiptId, "receiptId")); + } + + public synchronized OptionalLong epochForState(String exactBlueId) { + return stateEpochs.first(exactBlueId); + } + + synchronized long resolveAdmissionEpoch( + String stateBlueId, + Long exactEpoch) { + String state = Objects.requireNonNull(stateBlueId, "stateBlueId"); + if (exactEpoch == null) { + return stateEpochs.resolve(documentId, authoredInitialBlueId, state); + } + if (exactEpoch > epoch) { + throw invalidAdmission("unknown epoch " + exactEpoch); + } + if (!revision(exactEpoch).after().blueId().equals(state)) { + throw invalidAdmission("epoch does not match state " + state); + } + return exactEpoch; + } + + public synchronized void markCatchingUp() { + if (status == SessionStatus.BLOCKED + || status == SessionStatus.TERMINATED) { + throw new IllegalStateException("Cannot catch up from " + status); + } + status = SessionStatus.CATCHING_UP; + } + + public synchronized void markBlocked() { + status = SessionStatus.BLOCKED; + } + + public synchronized void markGraphPublished() { + graphPublishedEpoch = epoch; + } + + public synchronized void markReady(ExternalOrderKey frontier) { + if (status == SessionStatus.BLOCKED + || status == SessionStatus.TERMINATED) { + throw new IllegalStateException( + "Cannot become ready from " + status); + } + if (graphPublishedEpoch != epoch) { + throw new IllegalStateException( + "Cannot publish READY before graph epoch " + epoch + + " is published for " + documentId); + } + status = SessionStatus.READY; + readyEpoch = epoch; + if (readyThrough == null || frontier.compareTo(readyThrough) > 0) { + readyThrough = frontier; + } + } + + synchronized void restoreCoordinationState( + SessionStatus restoredStatus, + ExternalOrderKey restoredReadyThrough, + long restoredReadyEpoch, + long restoredGraphPublishedEpoch) { + if (restoredReadyEpoch < 0L || restoredReadyEpoch > epoch + || restoredGraphPublishedEpoch < -1L + || restoredGraphPublishedEpoch > epoch) { + throw new IllegalArgumentException( + "Invalid restored readiness evidence for " + documentId); + } + this.status = Objects.requireNonNull( + restoredStatus, "restoredStatus"); + this.readyThrough = Objects.requireNonNull( + restoredReadyThrough, "restoredReadyThrough"); + this.readyEpoch = restoredReadyEpoch; + this.graphPublishedEpoch = restoredGraphPublishedEpoch; + } + + public synchronized void commit( + DocumentRevision revision, + EmbeddedOnlyLayout nextLayout, + ExternalOrderKey committedFrontier, + List nextSubscriptions, + String transitionReceipt) { + Objects.requireNonNull(revision, "revision"); + if (!revision.documentId().equals(documentId)) { + throw new IllegalArgumentException( + "Revision belongs to another session"); + } + long expectedEpoch = Math.addExact(epoch, 1L); + if (revision.epoch() != expectedEpoch) { + throw new IllegalStateException( + "Expected epoch " + expectedEpoch + + " but got " + revision.epoch()); + } + if (revision.rootApplicationOrder() + != Math.addExact(applicationSequence, 1L)) { + throw new IllegalStateException( + "Application order is not contiguous"); + } + String receipt = Objects.requireNonNull( + transitionReceipt, "transitionReceipt"); + if (receipt.isBlank() || transitionReceipts.contains(receipt)) { + throw new IllegalStateException( + "Duplicate or blank transition receipt " + receipt); + } + List subscriptions = List.copyOf( + Objects.requireNonNull( + nextSubscriptions, "nextSubscriptions")); + this.layout = Objects.requireNonNull(nextLayout, "nextLayout"); + this.activeSubscriptions = subscriptions; + this.epoch = expectedEpoch; + this.applicationSequence = revision.rootApplicationOrder(); + this.status = SessionStatus.CATCHING_UP; + this.revisions.add(revision); + transitionReceipts.add(receipt); + stateEpochs.record(revision); + revision.sourceEntry().ifPresent(entry -> + terminalEntryBlueIds.add(entry.blueId())); + if (committedFrontier != null + && (readyThrough == null + || committedFrontier.compareTo(readyThrough) > 0)) { + readyThrough = committedFrontier; + } + } + + static final class StateEpochs { + private final Map first = new LinkedHashMap<>(); + private final Set ambiguous = new LinkedHashSet<>(); + + void record(DocumentRevision revision) { + String state = revision.after().blueId(); + Long prior = first.putIfAbsent(state, revision.epoch()); + if (prior != null && prior != revision.epoch()) { + ambiguous.add(state); + } + } + + OptionalLong first(String stateBlueId) { + Long epoch = first.get(Objects.requireNonNull( + stateBlueId, "stateBlueId")); + return epoch == null ? OptionalLong.empty() : OptionalLong.of(epoch); + } + + long resolve( + DocumentId documentId, + String authoredInitialBlueId, + String stateBlueId) { + OptionalLong known = first(stateBlueId); + boolean authored = authoredInitialBlueId.equals(stateBlueId); + if (ambiguous.contains(stateBlueId) + || authored && known.isPresent() && known.getAsLong() > 0L) { + throw new IllegalStateException( + "Ambiguous historical state " + stateBlueId + + "; exact admitted epoch is required"); + } + if (authored) { + return -1L; + } + if (known.isEmpty()) { + throw invalidAdmission("unknown state " + stateBlueId + + " for " + documentId); + } + return known.getAsLong(); + } + } + + private static InvalidAdmissionEvidenceException invalidAdmission( + String diagnostic) { + return new InvalidAdmissionEvidenceException(diagnostic); + } +} diff --git a/src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java b/src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java new file mode 100644 index 0000000..9c2e037 --- /dev/null +++ b/src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java @@ -0,0 +1,1049 @@ +package blue.coordination.internal; + +import blue.coordination.api.TimelineEntry; +import blue.coordination.api.ExactValue; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.DocumentId; +import blue.coordination.api.CoordinationEngine; +import blue.language.merge.ResolvedSnapshot; +import blue.language.model.Node; +import blue.language.model.wire.JsonPointer; +import blue.language.processor.DocumentProcessingResult; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.InvalidExecutionEvidenceException; +import blue.language.processor.PlatformCommitCompanion; +import blue.language.processor.PlatformProcessingResult; +import blue.language.processor.ProcessorStatus; +import blue.language.processor.SubscriptionDelta; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Consumer; + +final class DocumentTransitionProcessor { + private final BlueRuntime runtime; + private final WholeObjectStore objects; + private final EmbeddedOnlyLayoutBuilder layoutBuilder; + private final EngineMetrics metrics; + private final Consumer failureInjector; + public DocumentTransitionProcessor( + BlueRuntime runtime, + WholeObjectStore objects, + EmbeddedOnlyLayoutBuilder layoutBuilder, + EngineMetrics metrics, + Consumer failureInjector) { + this.runtime = Objects.requireNonNull(runtime, "runtime"); + this.objects = Objects.requireNonNull(objects, "objects"); + this.layoutBuilder = Objects.requireNonNull( + layoutBuilder, "layoutBuilder"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + this.failureInjector = Objects.requireNonNull( + failureInjector, "failureInjector"); + } + public DocumentSession admit( + DocumentId documentId, + String authoredYaml, + ExternalOrderKey admissionFrontier, + CoordinationEngine.AdmissionPolicy admissionPolicy) { + Objects.requireNonNull(authoredYaml, "authoredYaml"); + Node source = metrics.timed( + "documentStart.parseSource", + () -> runtime.parseSourceYaml(authoredYaml)); + Node preprocessed = metrics.timed( + "documentStart.preprocess", + () -> runtime.preprocess(source)); + ResolvedSnapshot snapshot = metrics.timed( + "documentStart.resolve", + () -> runtime.cache(runtime.resolveToSnapshot(preprocessed))); + return admitSnapshot( + Objects.requireNonNull(documentId, "documentId"), + snapshot, + admissionFrontier, + null, + Objects.requireNonNull(admissionPolicy, "admissionPolicy")); + } + public DocumentSession admitExact( + DocumentId documentId, + ExactValue authoredExact, + ExternalOrderKey admissionFrontier, + DocumentRevision.CatchUpCause cause) { + Objects.requireNonNull(authoredExact, "authoredExact"); + ResolvedSnapshot snapshot = authoredExact.snapshot().orElseGet(() -> + metrics.timed( + "documentStart.loadExactSnapshot", + () -> { + metrics.increment( + "documentStart.referenceOnlySnapshotLoads"); + return runtime.cache(runtime.loadExactSnapshot( + authoredExact.blueId())); + })); + return admitSnapshot( + Objects.requireNonNull(documentId, "documentId"), + snapshot, + admissionFrontier, + cause, + null); + } + private DocumentSession admitSnapshot( + DocumentId documentId, + ResolvedSnapshot snapshot, + ExternalOrderKey admissionFrontier, + DocumentRevision.CatchUpCause cause, + CoordinationEngine.AdmissionPolicy admissionPolicy) { + long started = System.nanoTime(); + Objects.requireNonNull(snapshot, "snapshot"); + Objects.requireNonNull(admissionFrontier, "admissionFrontier"); + ExactValue authoredExact = objects.put( + runtime.cache(snapshot), "authored-document"); + DocumentIdentityReader.verifyOptionalDocumentId( + authoredExact, documentId); + EmbeddedOnlyLayout authoredLayout = layoutBuilder.build(authoredExact); + ResolvedSnapshot initializationInput; + if (authoredLayout.directOccurrences().isEmpty()) { + initializationInput = snapshot; + } else { + ResolvedSnapshot ownership = + runtime.resolveToSnapshotPreservingPaths( + authoredLayout.processingFrozen().toNode(), + authoredLayout.directOccurrences().stream() + .map(EmbeddedOccurrence::scopePath) + .toList()); + initializationInput = + layoutBuilder.isolateManagedInitializationScopes( + ownership, authoredLayout); + } + objects.put(initializationInput, "initialization-input"); + long frozenStarted = System.nanoTime(); + metrics.addNanos("documentStart.hostBeforeFrozen", frozenStarted - started); + DocumentProcessingResult initialized = metrics.timed( + "documentStart.contractsInitialize", + () -> runtime.initialize(initializationInput)); + long hostAfterStarted = System.nanoTime(); + requireSuccess("initialize " + documentId, initialized); + ExactValue initializedExact = authoredLayout.directOccurrences() + .isEmpty() + ? objects.put( + initialized.document(), "initialized-document") + : layoutBuilder.restoreAuthoredChildrenAfterInitialization( + initialized.document(), authoredLayout); + EmbeddedOnlyLayout layout = layoutBuilder.rebuild( + initializedExact, authoredLayout); + metrics.increment("documentStart.initialSubscriptionProjections"); + List ownedSubscriptions = metrics.timed( + "documentStart.projectInitialOwnedSubscriptions", + () -> runtime.projectInitialOwnedSubscriptions( + layout.processingFrozen(), + 0L, + admissionFrontier)); + requireOwnedSubscriptionSurface(ownedSubscriptions, layout); + CheckpointDomainEvidence.retainAll(ownedSubscriptions, objects); + DocumentRevision initializationRevision = new DocumentRevision( + documentId, + 0L, + 0L, + DocumentRevision.Kind.INITIALIZATION, + authoredExact, + initializedExact, + null, + admissionFrontier, + cause == null + ? retainAdmissionCause( + objects, documentId, authoredExact, + admissionPolicy, admissionFrontier) + : cause.attachmentEntryBlueId(), + cause, + initialized.events(), + initialized.totalGas()); + DocumentSession session = new DocumentSession( + documentId, + authoredExact, + layout, + ownedSubscriptions, + admissionFrontier, + initializationRevision); + metrics.increment("documentStart.sessionsInitialized"); + metrics.increment("preparedRuntimeCompilations"); + metrics.addNanos("documentStart.hostAfterFrozen", + System.nanoTime() - hostAfterStarted); + return session; + } + static String retainAdmissionCause( + WholeObjectStore objects, DocumentId documentId, + ExactValue authoredExact, + CoordinationEngine.AdmissionPolicy policy, + ExternalOrderKey frontier) { + Node cause = new Node().properties(new LinkedHashMap<>(Map.of( + "causeType", new Node().value( + "Coordination/Document Admission Cause/v1"), + "documentId", new Node().value(documentId.value()), + "authoredState", authoredExact.referenceNode(), + "admissionPolicy", new Node().value(policy.name()), + "admissionFrontier", new Node().items( + Objects.requireNonNull(frontier, "frontier") + .components().stream().map(value -> + new Node().value(value)) + .toList())))); + return objects.put(cause, "document-admission-cause").blueId(); + } + public Prepared prepare( + DocumentSession session, + TimelineEntry entry) { + long started = System.nanoTime(); + Objects.requireNonNull(session, "session"); + Objects.requireNonNull(entry, "entry"); + if (session.hasTerminalEntry(entry.blueId())) { + metrics.increment("process.duplicateEntriesSkipped"); + throw new IllegalStateException( + "Entry already processed by " + session.documentId()); + } + + long expectedEpoch = session.epoch(); + EmbeddedOnlyLayout beforeLayout = session.layout(); + ExactValue before = session.currentRevision().after(); + failureInjector.accept( + DefaultCoordinationEngine.FailurePoint.BEFORE_FROZEN_PROCESS); + metrics.increment("process.concreteOwnershipRootInputs"); + metrics.increment("process.referenceOnlyEventInputs"); + long frozenStarted = System.nanoTime(); + metrics.addNanos("process.hostBeforeFrozen", frozenStarted - started); + metrics.increment("process.externalInvocationsStarted"); + PlatformProcessingResult platform = runtime.process( + beforeLayout.processingFrozen().toNode(), + entry.blueId(), + expectedEpoch, + entry.journalOrderKey(), + session.activeSubscriptions()); + long frozenNanos = System.nanoTime() - frozenStarted; + metrics.addNanos("process.frozenContractsOnce", frozenNanos); + metrics.addNanos("process.frozen", frozenNanos); + metrics.increment("process.frozenContractsInvocations"); + metrics.increment("frozenProcessCalls"); + DocumentProcessingResult processed = platform.processResult(); + if (processed.diagnostic() != null + && processed.diagnostic().message().contains( + "enters embedded scope")) { + metrics.increment( + "layout.externalManagedChildMutationsRejected"); + throw new IllegalStateException( + "External parent operation attempted to mutate managed " + + "child: " + + processed.diagnostic().message()); + } + requireSuccess("process " + session.documentId(), processed); + failureInjector.accept(DefaultCoordinationEngine.FailurePoint + .AFTER_FROZEN_BEFORE_STAGE); + + long hostAfterFrozenStarted = System.nanoTime(); + ExactValue processedAfter = layoutBuilder.restoreManagedChildren( + processed.document(), beforeLayout, false); + EmbeddedOnlyLayout afterLayout = layoutBuilder.rebuild( + processedAfter, beforeLayout); + ExactValue after = afterLayout.semanticRoot(); + + PlatformCommitCompanion companion = platform.commitCompanion(); + verifyCommitCompanion( + companion, + beforeLayout.processingFrozen().blueId(), + entry, + expectedEpoch, + processed); + List activeSubscriptionsAfter = metrics.timed( + "process.applyCommitCompanionDelta", + () -> applySubscriptionTransition( + session.activeSubscriptions(), + companion.subscriptionDelta(), + beforeLayout, + afterLayout, + Math.addExact(expectedEpoch, 1L), + entry.journalOrderKey(), + metrics)); + CheckpointDomainEvidence.retainAll(activeSubscriptionsAfter, objects); + metrics.addNanos("process.hostAfterFrozen", + System.nanoTime() - hostAfterFrozenStarted); + return new Prepared( + session, + expectedEpoch, + entry, + before, + after, + beforeLayout, + afterLayout, + activeSubscriptionsAfter, + processed.events(), + processed.totalGas(), + System.nanoTime() - started); + } + + public InternalProcessOutcome commit(Prepared prepared) { + Objects.requireNonNull(prepared, "prepared"); + DocumentSession session = prepared.session(); + if (session.epoch() != prepared.expectedEpoch()) { + throw new IllegalStateException( + "Session changed after preparation: " + + session.documentId()); + } + TimelineEntry entry = prepared.entry(); + DocumentRevision revision = new DocumentRevision( + session.documentId(), + Math.addExact(session.epoch(), 1L), + session.nextApplicationOrder(), + DocumentRevision.Kind.TIMELINE_ENTRY, + prepared.before(), + prepared.after(), + entry, + null, + prepared.emittedEvents(), + prepared.processingGas()); + session.commit( + revision, + prepared.afterLayout(), + null, + prepared.activeSubscriptionsAfter(), + "external|" + entry.blueId()); + metrics.increment("process.routingSurfaceReused"); + metrics.increment("process.documentRevisionsCommitted"); + return new InternalProcessOutcome( + session, + revision, + prepared.beforeLayout(), + prepared.afterLayout(), + prepared.preparationNanos()); + } + private static void verifyCommitCompanion( + PlatformCommitCompanion companion, + String expectedProcessingRootBlueId, + TimelineEntry entry, + long expectedEpoch, + DocumentProcessingResult processed) { + verifyCommitCompanion( + companion, + expectedProcessingRootBlueId, + entry.blueId(), + entry.journalOrderKey(), + expectedEpoch, + processed); + } + + private static void verifyCommitCompanion( + PlatformCommitCompanion companion, + String expectedProcessingRootBlueId, + String expectedEventBlueId, + ExternalOrderKey expectedEventOrder, + long expectedEpoch, + DocumentProcessingResult processed) { + Objects.requireNonNull(companion, "companion"); + if (!expectedProcessingRootBlueId.equals( + companion.expectedRootBlueId())) { + throw new IllegalStateException( + "Frozen PROCESS companion is bound to " + + companion.expectedRootBlueId() + + " instead of PROCESS ownership Root " + + expectedProcessingRootBlueId); + } + if (!expectedEventBlueId.equals(companion.eventBlueId()) + || expectedEpoch != companion.expectedRootRevision() + || !expectedEventOrder.equals( + companion.eventOrderKey())) { + throw new IllegalStateException( + "Frozen PROCESS companion does not match the selected " + + "Root/event/revision tuple"); + } + long expectedResultingRevision = processed.commits() + ? Math.addExact(expectedEpoch, 1L) + : expectedEpoch; + if (companion.resultingRootRevision() + != expectedResultingRevision + || companion.commitsRootAndOutbox() != processed.commits()) { + throw new IllegalStateException( + "Frozen PROCESS companion has invalid commit metadata"); + } + } + + private static void requireOwnedSubscriptionSurface( + List entries, + EmbeddedOnlyLayout layout) { + List boundaries = managedBoundaries(layout); + for (SubscriptionDelta.Entry entry : entries) { + if (!owned(entry.scopePath(), boundaries)) { + throw new IllegalStateException( + "PROCESS ownership projection leaked managed scope " + + entry.scopePath() + "/" + entry.channelKey()); + } + } + } + + static List applyCommitCompanionDelta( + List previous, + SubscriptionDelta delta, + EmbeddedOnlyLayout beforeLayout, + EmbeddedOnlyLayout afterLayout, + long resultingRootRevision, + ExternalOrderKey transitionOrder, + EngineMetrics metrics) { + Objects.requireNonNull(previous, "previous"); + Objects.requireNonNull(delta, "delta"); + Objects.requireNonNull(beforeLayout, "beforeLayout"); + Objects.requireNonNull(afterLayout, "afterLayout"); + if (resultingRootRevision <= 0L) { + throw new IllegalArgumentException( + "resultingRootRevision must be positive"); + } + Objects.requireNonNull(transitionOrder, "transitionOrder"); + Objects.requireNonNull(metrics, "metrics"); + return applyActiveSubscriptionDelta( + previous, + delta, + managedBoundaries(beforeLayout), + managedBoundaries(afterLayout), + resultingRootRevision, + transitionOrder, + metrics); + } + + private List applySubscriptionTransition( + List previous, + SubscriptionDelta companionDelta, + EmbeddedOnlyLayout beforeLayout, + EmbeddedOnlyLayout afterLayout, + long resultingRootRevision, + ExternalOrderKey transitionOrder, + EngineMetrics targetMetrics) { + SubscriptionDelta effective = companionDelta; + if (beforeLayout.plan() != afterLayout.plan()) { + effective = runtime.projectSubscriptionUpdate( + afterLayout.processingFrozen(), + previous, + changedSurfacePointers(companionDelta), + resultingRootRevision, + transitionOrder); + requireSameOwnedTransition( + companionDelta, effective, + managedBoundaries(beforeLayout), + managedBoundaries(afterLayout)); + targetMetrics.increment( + "process.incrementalSubscriptionReprojections"); + return applyActiveSubscriptionDelta( + previous, + effective, + managedBoundaries(beforeLayout), + managedBoundaries(afterLayout), + resultingRootRevision, + transitionOrder, + targetMetrics, + true); + } + return applyCommitCompanionDelta( + previous, effective, beforeLayout, afterLayout, + resultingRootRevision, transitionOrder, targetMetrics); + } + + private static Set changedSurfacePointers( + SubscriptionDelta delta) { + Set result = new LinkedHashSet<>(); + result.add(JsonPointer.append(JsonPointer.ROOT, "type")); + delta.added().forEach(entry -> result.add(contractPointer(entry))); + delta.removed().forEach(entry -> result.add(contractPointer(entry))); + if (result.size() == 1) { + result.add(JsonPointer.append(JsonPointer.ROOT, "contracts")); + } + return result; + } + + private static String contractPointer(SubscriptionDelta.Entry entry) { + return JsonPointer.append( + JsonPointer.append(entry.scopePath(), "contracts"), + entry.channelKey()); + } + + static void requireSameOwnedTransition( + SubscriptionDelta companion, + SubscriptionDelta projected, + List prior, + List next) { + Set companionAdded = ownedSubscriptions(companion.added(), next); + Set companionRemoved = ownedSubscriptions(companion.removed(), prior); + Set projectedAdded = ownedSubscriptions(projected.added(), next); + Set projectedRemoved = ownedSubscriptions(projected.removed(), prior); + cancelReplacements(companionAdded, companionRemoved); + cancelReplacements(projectedAdded, projectedRemoved); + if (!companionAdded.equals(projectedAdded) + || !companionRemoved.equals(projectedRemoved)) { + throw new InvalidExecutionEvidenceException( + "Incremental subscription projection disagrees with " + + "the frozen commit companion"); + } + } + + private static void cancelReplacements( + Set added, + Set removed) { + Set paired = new LinkedHashSet<>(added); + paired.retainAll(removed); + added.removeAll(paired); + removed.removeAll(paired); + } + + private static Set ownedSubscriptions( + List entries, + List boundaries) { + Set result = new LinkedHashSet<>(); + entries.stream().filter(entry -> owned(entry.scopePath(), boundaries)) + .map(SubscriptionIdentity::new) + .forEach(result::add); + return result; + } + + private record SubscriptionIdentity( + OccurrenceKey occurrence, String effectiveTypeBlueId, + List sourceContributionNodeBlueIds, int order, + List subscriptionKeys) { + private SubscriptionIdentity(SubscriptionDelta.Entry entry) { + this(occurrenceKey(entry), entry.effectiveTypeBlueId(), + entry.sourceContributionNodeBlueIds(), entry.order(), + entry.subscriptionKeys()); + } + } + + static List applyActiveSubscriptionDelta( + List previous, + SubscriptionDelta delta, + List beforeBoundaries, + List afterBoundaries, + long resultingRootRevision, + ExternalOrderKey transitionOrder, + EngineMetrics metrics) { + return applyActiveSubscriptionDelta( + previous, delta, beforeBoundaries, afterBoundaries, + resultingRootRevision, transitionOrder, metrics, false); + } + + private static List applyActiveSubscriptionDelta( + List previous, + SubscriptionDelta delta, + List beforeBoundaries, + List afterBoundaries, + long resultingRootRevision, + ExternalOrderKey transitionOrder, + EngineMetrics metrics, + boolean refreshStableHeaders) { + Objects.requireNonNull(previous, "previous"); + Objects.requireNonNull(delta, "delta"); + Objects.requireNonNull(beforeBoundaries, "beforeBoundaries"); + Objects.requireNonNull(afterBoundaries, "afterBoundaries"); + if (resultingRootRevision <= 0L) { + throw new IllegalArgumentException( + "resultingRootRevision must be positive"); + } + Objects.requireNonNull(transitionOrder, "transitionOrder"); + Objects.requireNonNull(metrics, "metrics"); + + Map active = indexByOccurrence( + previous, "active"); + for (SubscriptionDelta.Entry entry : active.values()) { + if (!entry.isActiveInterval()) { + throw new IllegalStateException( + "Retained subscription is not active at " + + describe(entry)); + } + if (!owned(entry.scopePath(), beforeBoundaries)) { + throw new IllegalStateException( + "Retained subscription escaped the prior PROCESS " + + "ownership surface at " + describe(entry)); + } + } + + long ignoredEmbedded = 0L; + long removed = 0L; + Set validRemovals = new LinkedHashSet<>(); + Map removedEstablished = + new LinkedHashMap<>(); + for (SubscriptionDelta.Entry entry : delta.removed()) { + if (!owned(entry.scopePath(), beforeBoundaries)) { + ignoredEmbedded++; + continue; + } + OccurrenceKey key = occurrenceKey(entry); + SubscriptionDelta.Entry established = active.get(key); + if (established == null) { + throw new InvalidExecutionEvidenceException( + "Commit companion retired an inactive subscription at " + + describe(entry)); + } + requireRetirementEvidence( + established, entry, resultingRootRevision); + active.remove(key); + validRemovals.add(key); + removedEstablished.put(key, established); + removed++; + } + + long added = 0L; + long retainedReplacements = 0L; + for (SubscriptionDelta.Entry entry : delta.added()) { + if (!owned(entry.scopePath(), afterBoundaries)) { + ignoredEmbedded++; + continue; + } + requireActivationEvidence( + entry, resultingRootRevision, transitionOrder); + OccurrenceKey key = occurrenceKey(entry); + SubscriptionDelta.Entry established = removedEstablished.get(key); + boolean stable = established != null + && sameStableSubscriptionIdentity(established, entry); + SubscriptionDelta.Entry activated = entry; + if (stable) { + activated = refreshStableHeaders + ? refreshHeaderPreservingInterval(established, entry) + : established; + } + if (active.putIfAbsent(key, activated) != null) { + throw new InvalidExecutionEvidenceException( + "Commit companion activated an already active " + + "subscription at " + describe(entry)); + } + if (stable) { + removed--; + retainedReplacements++; + } else { + added++; + } + } + + for (Map.Entry retained + : new ArrayList<>(active.entrySet())) { + if (!owned(retained.getValue().scopePath(), afterBoundaries)) { + if (!validRemovals.contains(retained.getKey())) { + throw new InvalidExecutionEvidenceException( + "Commit companion did not retire subscription that " + + "left the PROCESS ownership surface at " + + describe(retained.getValue())); + } + active.remove(retained.getKey()); + } + } + + List result = new SubscriptionDelta( + new ArrayList<>(active.values()), List.of()).added(); + metrics.increment("process.commitCompanionDeltasApplied"); + metrics.add("process.dynamicSubscriptionsAdded", added); + metrics.add("process.dynamicSubscriptionsRemoved", removed); + metrics.add("process.dynamicSubscriptionsReplaced", + dynamicReplacementCount( + delta.added(), validRemovals, retainedReplacements)); + metrics.add("process.companionReplacementsRetained", + retainedReplacements); + metrics.add("process.managedSubscriptionDeltaEntriesIgnored", + ignoredEmbedded); + metrics.add("process.subscriptionIntervalsReused", + result.size() - added); + return result; + } + + private static void requireRetirementEvidence( + SubscriptionDelta.Entry established, + SubscriptionDelta.Entry retired, + long resultingRootRevision) { + if (!sameSubscriptionSnapshot(established, retired) + || !Objects.equals( + established.activationRootRevision(), + retired.activationRootRevision()) + || !Objects.equals( + established.startAfterExternalOrderKey(), + retired.startAfterExternalOrderKey()) + || !Objects.equals( + retired.endAtRootRevision(), resultingRootRevision)) { + throw new InvalidExecutionEvidenceException( + "Commit companion supplied invalid retirement evidence at " + + describe(retired)); + } + } + + private static void requireActivationEvidence( + SubscriptionDelta.Entry activated, + long resultingRootRevision, + ExternalOrderKey transitionOrder) { + if (!activated.isActiveInterval() + || !Objects.equals( + activated.activationRootRevision(), resultingRootRevision) + || !Objects.equals( + activated.startAfterExternalOrderKey(), transitionOrder)) { + throw new InvalidExecutionEvidenceException( + "Commit companion supplied invalid activation evidence at " + + describe(activated)); + } + } + + private static long dynamicReplacementCount( + List additions, + Set removals, + long retainedReplacements) { + long paired = additions.stream() + .map(DocumentTransitionProcessor::occurrenceKey) + .filter(removals::contains) + .count(); + return Math.subtractExact(paired, retainedReplacements); + } + + private static String describe(SubscriptionDelta.Entry entry) { + return entry.scopePath() + "/" + entry.channelKey(); + } + + private static boolean owned( + String scopePath, + List managedBoundaries) { + for (String boundary : managedBoundaries) { + if (scopePath.equals(boundary) + || scopePath.startsWith(boundary + "/")) { + return false; + } + } + return true; + } + + private static Map indexByOccurrence( + List entries, + String label) { + Map result = new LinkedHashMap<>(); + for (SubscriptionDelta.Entry entry : entries) { + if (result.put(occurrenceKey(entry), entry) != null) { + throw new IllegalStateException( + "Duplicate " + label + " subscription occurrence at " + + entry.scopePath() + "/" + entry.channelKey()); + } + } + return result; + } + + private static boolean sameSubscriptionSnapshot( + SubscriptionDelta.Entry left, + SubscriptionDelta.Entry right) { + return left.scopePath().equals(right.scopePath()) + && left.channelKey().equals(right.channelKey()) + && left.effectiveTypeBlueId().equals( + right.effectiveTypeBlueId()) + && left.sourceContributionNodeBlueIds().equals( + right.sourceContributionNodeBlueIds()) + && left.order() == right.order() + && left.subscriptionKeys().equals(right.subscriptionKeys()) + && left.checkpointDomainBlueId().equals( + right.checkpointDomainBlueId()) + && left.dependencies().equals(right.dependencies()); + } + + private static boolean sameStableSubscriptionIdentity( + SubscriptionDelta.Entry left, + SubscriptionDelta.Entry right) { + return left.scopePath().equals(right.scopePath()) + && left.channelKey().equals(right.channelKey()) + && left.effectiveTypeBlueId().equals( + right.effectiveTypeBlueId()) + && left.sourceContributionNodeBlueIds().equals( + right.sourceContributionNodeBlueIds()) + && left.order() == right.order() + && left.subscriptionKeys().equals(right.subscriptionKeys()); + } + + private static SubscriptionDelta.Entry refreshHeaderPreservingInterval( + SubscriptionDelta.Entry established, + SubscriptionDelta.Entry refreshed) { + return new SubscriptionDelta.Entry( + refreshed.scopePath(), + refreshed.channelKey(), + refreshed.effectiveTypeBlueId(), + refreshed.sourceContributionNodeBlueIds(), + refreshed.order(), + refreshed.subscriptionKeys(), + refreshed.checkpointDomainBlueId(), + refreshed.dependencies(), + established.activationRootRevision(), + established.startAfterExternalOrderKey(), + null); + } + + private static OccurrenceKey occurrenceKey( + SubscriptionDelta.Entry entry) { + return new OccurrenceKey(entry.scopePath(), entry.channelKey()); + } + + private record OccurrenceKey(String scopePath, String channelKey) { + private OccurrenceKey { + scopePath = Objects.requireNonNull(scopePath, "scopePath"); + channelKey = Objects.requireNonNull(channelKey, "channelKey"); + } + } + + public static ExternalOrderKey fullHistoryFrontier(DocumentId documentId) { + return ExternalOrderKey.of(List.of( + BigInteger.valueOf(Long.MIN_VALUE), + "full-history", + documentId.value())); + } + + public PreparedEmbedded prepareEmbedded( + DocumentSession parent, + EmbeddedEpochInput input) { + long started = System.nanoTime(); + Objects.requireNonNull(parent, "parent"); + Objects.requireNonNull(input, "input"); + if (!input.binding().parentDocumentId().equals(parent.documentId())) { + throw new IllegalArgumentException( + "Embedded input belongs to another parent"); + } + if (parent.hasTransitionReceipt(input.inputId())) { + throw new IllegalStateException( + "Embedded epoch is already committed: " + + input.inputId()); + } + EmbeddedOnlyLayout beforeLayout = parent.layout(); + ExactValue before = parent.currentRevision().after(); + String actualBefore = before.canonicalBlueIdAt( + input.binding().absolutePath()); + if (!input.beforeChildBlueId().equals(actualBefore)) { + throw new IllegalStateException( + "Parent " + parent.documentId() + " contains child " + + actualBefore + " at " + + input.binding().absolutePath() + + " instead of expected " + + input.beforeChildBlueId()); + } + + long expectedEpoch = parent.epoch(); + failureInjector.accept( + DefaultCoordinationEngine.FailurePoint.BEFORE_FROZEN_PROCESS); + metrics.increment("process.concreteOwnershipRootInputs"); + metrics.increment("process.referenceOnlyEventInputs"); + long frozenStarted = System.nanoTime(); + metrics.addNanos("process.hostBeforeFrozen", frozenStarted - started); + PlatformProcessingResult platform = runtime.process( + beforeLayout.processingFrozen().toNode(), + input.exactEvent().blueId(), + expectedEpoch, + input.applicationOrder(), + parent.activeSubscriptions()); + long frozenNanos = System.nanoTime() - frozenStarted; + metrics.addNanos("process.embeddedFrozen", frozenNanos); + metrics.addNanos("process.frozen", frozenNanos); + metrics.increment("process.embeddedEpochProcessCalls"); + metrics.increment("process.frozenContractsInvocations"); + metrics.increment("frozenProcessCalls"); + DocumentProcessingResult processed = platform.processResult(); + requireSuccess("apply embedded epoch to " + parent.documentId(), + processed); + failureInjector.accept(DefaultCoordinationEngine.FailurePoint + .AFTER_FROZEN_BEFORE_STAGE); + + long hostAfterFrozenStarted = System.nanoTime(); + ExactValue processedAfter = layoutBuilder.restoreManagedChildren( + processed.document(), beforeLayout, true); + EmbeddedOnlyLayout afterLayout = layoutBuilder + .rebuildAfterManagedChildRevision( + processedAfter, beforeLayout); + ExactValue after = afterLayout.semanticRoot(); + String actualAfter = after.canonicalBlueIdAt( + input.binding().absolutePath()); + if (!input.afterChildBlueId().equals(actualAfter)) { + throw new IllegalStateException( + "Embedded epoch processor did not replace " + + input.binding().absolutePath() + " with " + + input.afterChildBlueId()); + } + + PlatformCommitCompanion companion = platform.commitCompanion(); + verifyCommitCompanion( + companion, + beforeLayout.processingFrozen().blueId(), + input.exactEvent().blueId(), + input.applicationOrder(), + expectedEpoch, + processed); + List activeSubscriptionsAfter = metrics.timed( + "process.applyCommitCompanionDelta", () -> + applySubscriptionTransition( + parent.activeSubscriptions(), + companion.subscriptionDelta(), + beforeLayout, + afterLayout, + Math.addExact(expectedEpoch, 1L), + input.applicationOrder(), + metrics)); + CheckpointDomainEvidence.retainAll( + activeSubscriptionsAfter, objects); + metrics.addNanos("process.hostAfterFrozen", + System.nanoTime() - hostAfterFrozenStarted); + return new PreparedEmbedded( + parent, + expectedEpoch, + input, + before, + after, + beforeLayout, + afterLayout, + activeSubscriptionsAfter, + processed.events(), + processed.totalGas(), + System.nanoTime() - started); + } + + public InternalProcessOutcome commitEmbedded(PreparedEmbedded prepared) { + Objects.requireNonNull(prepared, "prepared"); + DocumentSession parent = prepared.parent(); + if (parent.epoch() != prepared.expectedEpoch()) { + throw new IllegalStateException( + "Parent changed after embedded preparation: " + + parent.documentId()); + } + DocumentRevision revision = new DocumentRevision( + parent.documentId(), + Math.addExact(parent.epoch(), 1L), + parent.nextApplicationOrder(), + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + prepared.before(), + prepared.after(), + null, + prepared.input().sourceOrder(), + prepared.input().originalEntryBlueId() == null + ? prepared.input().binding().attachmentEntryBlueId() + : prepared.input().originalEntryBlueId(), + new DocumentRevision.CatchUpCause( + parent.documentId(), + prepared.input().binding().attachmentEntryBlueId(), + prepared.input().binding().absolutePath(), + prepared.input().binding() + .attachmentTimestampMicros()), + prepared.emittedEvents(), + prepared.processingGas()); + parent.commit( + revision, + prepared.afterLayout(), + null, + prepared.activeSubscriptionsAfter(), + prepared.input().inputId()); + metrics.increment("process.documentRevisionsCommitted"); + metrics.increment("embedding.parentEpochApplications"); + return new InternalProcessOutcome( + parent, + revision, + prepared.beforeLayout(), + prepared.afterLayout(), + prepared.preparationNanos()); + } + + public static ExternalOrderKey admissionFrontier(DocumentId documentId) { + return ExternalOrderKey.of(List.of( + BigInteger.ZERO, + "admission", + documentId.value())); + } + + public record Prepared( + DocumentSession session, + long expectedEpoch, + TimelineEntry entry, + ExactValue before, + ExactValue after, + EmbeddedOnlyLayout beforeLayout, + EmbeddedOnlyLayout afterLayout, + List activeSubscriptionsAfter, + List emittedEvents, + long processingGas, + long preparationNanos) { + public Prepared { + session = Objects.requireNonNull(session, "session"); + entry = Objects.requireNonNull(entry, "entry"); + before = Objects.requireNonNull(before, "before"); + after = Objects.requireNonNull(after, "after"); + beforeLayout = Objects.requireNonNull(beforeLayout, "beforeLayout"); + afterLayout = Objects.requireNonNull(afterLayout, "afterLayout"); + activeSubscriptionsAfter = List.copyOf(Objects.requireNonNull( + activeSubscriptionsAfter, "activeSubscriptionsAfter")); + if (processingGas < 0L || preparationNanos < 0L) { + throw new IllegalArgumentException( + "processing metrics must be non-negative"); + } + List copy = new ArrayList<>(); + for (Node event : Objects.requireNonNull( + emittedEvents, "emittedEvents")) { + copy.add(Objects.requireNonNull(event, "event").clone()); + } + emittedEvents = Collections.unmodifiableList(copy); + } + + @Override + public List emittedEvents() { + List copy = new ArrayList<>(emittedEvents.size()); + emittedEvents.forEach(event -> copy.add(event.clone())); + return Collections.unmodifiableList(copy); + } + } + + public record PreparedEmbedded( + DocumentSession parent, + long expectedEpoch, + EmbeddedEpochInput input, + ExactValue before, + ExactValue after, + EmbeddedOnlyLayout beforeLayout, + EmbeddedOnlyLayout afterLayout, + List activeSubscriptionsAfter, + List emittedEvents, + long processingGas, + long preparationNanos) { + public PreparedEmbedded { + parent = Objects.requireNonNull(parent, "parent"); + input = Objects.requireNonNull(input, "input"); + before = Objects.requireNonNull(before, "before"); + after = Objects.requireNonNull(after, "after"); + beforeLayout = Objects.requireNonNull( + beforeLayout, "beforeLayout"); + afterLayout = Objects.requireNonNull(afterLayout, "afterLayout"); + activeSubscriptionsAfter = List.copyOf(Objects.requireNonNull( + activeSubscriptionsAfter, "activeSubscriptionsAfter")); + emittedEvents = copyEvents(emittedEvents); + if (processingGas < 0L || preparationNanos < 0L) { + throw new IllegalArgumentException( + "processing metrics must be non-negative"); + } + } + + @Override + public List emittedEvents() { + return copyEvents(emittedEvents); + } + } + + private static List copyEvents(List source) { + List result = new ArrayList<>(); + for (Node event : Objects.requireNonNull(source, "source")) { + result.add(Objects.requireNonNull(event, "event").clone()); + } + return Collections.unmodifiableList(result); + } + + private static List managedBoundaries( + EmbeddedOnlyLayout layout) { + return layout.boundaries().stream() + .map(EmbeddedBoundary::childScopePath) + .distinct() + .sorted(EmbeddingBinding.TEXT_ORDER) + .toList(); + } + + private static void requireSuccess( + String operation, + DocumentProcessingResult result) { + if (result.status() == ProcessorStatus.SUCCESS && result.commits()) { + return; + } + String diagnostic = result.diagnostic() == null + ? "" + : ": " + result.diagnostic().message(); + throw new IllegalStateException( + operation + " failed with " + result.status() + diagnostic); + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedBoundary.java b/src/main/java/blue/coordination/internal/EmbeddedBoundary.java new file mode 100644 index 0000000..67450ed --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedBoundary.java @@ -0,0 +1,28 @@ +package blue.coordination.internal; + +import blue.language.processor.EmbeddedScopePlanView; + +import java.util.Objects; + +/** One physical boundary created only for an effective Process Embedded path. */ +record EmbeddedBoundary( + String parentScopePath, + String childScopePath, + String childBlueId, + EmbeddedScopePlanView.Origin origin, + boolean physicalCutCreated) { + public EmbeddedBoundary { + parentScopePath = requireText(parentScopePath, "parentScopePath"); + childScopePath = requireText(childScopePath, "childScopePath"); + childBlueId = requireText(childBlueId, "childBlueId"); + origin = Objects.requireNonNull(origin, "origin"); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank() && !"/".equals(checked)) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedEpochCursor.java b/src/main/java/blue/coordination/internal/EmbeddedEpochCursor.java new file mode 100644 index 0000000..cf877dd --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedEpochCursor.java @@ -0,0 +1,26 @@ +package blue.coordination.internal; + +import java.util.Objects; + +/** Durable parent-occurrence progress kept separately from graph topology. */ +record EmbeddedEpochCursor(String bindingId, long appliedChildEpoch) { + EmbeddedEpochCursor { + bindingId = Objects.requireNonNull(bindingId, "bindingId"); + if (bindingId.isBlank()) { + throw new IllegalArgumentException("bindingId must not be blank"); + } + if (appliedChildEpoch < -1L) { + throw new IllegalArgumentException( + "appliedChildEpoch must be at least -1"); + } + } + + EmbeddedEpochCursor advanceTo(long childEpoch) { + if (childEpoch != appliedChildEpoch + 1L) { + throw new IllegalStateException( + "Child epochs must be applied contiguously: current=" + + appliedChildEpoch + ", next=" + childEpoch); + } + return new EmbeddedEpochCursor(bindingId, childEpoch); + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedEpochInput.java b/src/main/java/blue/coordination/internal/EmbeddedEpochInput.java new file mode 100644 index 0000000..2b605dd --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedEpochInput.java @@ -0,0 +1,230 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Timeline; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import blue.language.snapshot.FrozenNode; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.math.BigInteger; + +/** Exact processor-owned child epoch input; it is never appended to a Timeline. */ +record EmbeddedEpochInput( + String inputId, + EmbeddingBinding binding, + long fromChildEpoch, + long toChildEpoch, + String beforeChildBlueId, + String afterChildBlueId, + ExternalOrderKey sourceOrder, + ExternalOrderKey applicationOrder, + String originalEntryBlueId, + List eventOccurrences, + ExactValue exactEvent, + ExactValue exactRequest, + Timeline transportTimeline, + String operation, + String channel, + long applicationTimestampMicros) { + static final String INTERNAL_OPERATION = + "coordinationApplyEmbeddedRevision"; + static final String INTERNAL_CHANNEL = "coordinationEmbeddedChannel"; + + EmbeddedEpochInput { + inputId = requireText(inputId, "inputId"); + binding = Objects.requireNonNull(binding, "binding"); + if (fromChildEpoch < -1L || toChildEpoch != fromChildEpoch + 1L) { + throw new IllegalArgumentException( + "Embedded child epoch interval must be contiguous"); + } + beforeChildBlueId = requireText( + beforeChildBlueId, "beforeChildBlueId"); + afterChildBlueId = requireText( + afterChildBlueId, "afterChildBlueId"); + sourceOrder = Objects.requireNonNull(sourceOrder, "sourceOrder"); + applicationOrder = Objects.requireNonNull( + applicationOrder, "applicationOrder"); + eventOccurrences = List.copyOf(Objects.requireNonNull( + eventOccurrences, "eventOccurrences")); + exactEvent = Objects.requireNonNull(exactEvent, "exactEvent"); + exactRequest = Objects.requireNonNull(exactRequest, "exactRequest"); + transportTimeline = Objects.requireNonNull( + transportTimeline, "transportTimeline"); + operation = requireText(operation, "operation"); + channel = requireText(channel, "channel"); + if (applicationTimestampMicros <= 0L) { + throw new IllegalArgumentException( + "applicationTimestampMicros must be positive"); + } + } + + static EmbeddedEpochInput create( + WholeRequestEntryFactory entryFactory, + WholeObjectStore objects, + EmbeddingBinding binding, + DocumentRevision childRevision, + long applicationTimestampMicros, + String previousInputBlueId) { + Objects.requireNonNull(entryFactory, "entryFactory"); + Objects.requireNonNull(objects, "objects"); + Objects.requireNonNull(binding, "binding"); + Objects.requireNonNull(childRevision, "childRevision"); + String beforeBlueId = childRevision.before() + .map(ExactValue::blueId) + .orElse(binding.admittedChildBlueId()); + List occurrences = eventOccurrences( + objects, childRevision.emittedEvents()); + ExactValue request = request( + objects, + binding, + childRevision, + beforeBlueId, + occurrences); + Timeline timeline = new Timeline( + "coordination/internal/" + + binding.parentDocumentId().value(), + "coordination"); + ExactValue event = entryFactory.createProcessorOwnedEvent( + timeline, + previousInputBlueId, + applicationTimestampMicros, + request); + ExternalOrderKey applicationOrder = ExternalOrderKey.of(List.of( + BigInteger.valueOf(applicationTimestampMicros), + timeline.timelineId(), + event.blueId())); + String inputId = "embedded|" + binding.bindingId() + "|" + + childRevision.epoch(); + return new EmbeddedEpochInput( + inputId, + binding, + childRevision.epoch() - 1L, + childRevision.epoch(), + beforeBlueId, + childRevision.after().blueId(), + childRevision.sourceOrderKey().orElse( + binding.attachmentOrder()), + applicationOrder, + childRevision.causalEntryBlueId().orElse(null), + occurrences, + event, + request, + timeline, + INTERNAL_OPERATION, + INTERNAL_CHANNEL, + applicationTimestampMicros); + } + + private static ExactValue request( + WholeObjectStore objects, + EmbeddingBinding binding, + DocumentRevision revision, + String beforeBlueId, + List occurrences) { + List occurrenceNodes = new ArrayList<>(); + for (EventOccurrence occurrence : occurrences) { + occurrenceNodes.add(new Node().properties(new LinkedHashMap<>(Map.of( + "occurrenceIndex", new Node().value( + occurrence.occurrenceIndex()), + "eventBlueId", scalar(occurrence.eventBlueId()), + "eventTypeBlueId", scalar( + occurrence.eventTypeBlueId()))))); + } + ExactValue exactOccurrences = objects.put( + new Node().items(occurrenceNodes), + "embedded-event-occurrences"); + Map fields = new LinkedHashMap<>(); + fields.put("parentDocumentId", scalar( + binding.parentDocumentId().value())); + fields.put("occurrencePath", scalar(binding.absolutePath())); + fields.put("activationGeneration", new Node().value( + binding.activationGeneration())); + fields.put("childDocumentId", scalar( + binding.childDocumentId().value())); + fields.put("fromChildEpoch", new Node().value(revision.epoch() - 1L)); + fields.put("childEpoch", new Node().value(revision.epoch())); + fields.put("beforeChildBlueId", scalar(beforeBlueId)); + fields.put("afterChildBlueId", scalar(revision.after().blueId())); + revision.before().ifPresent(before -> + fields.put("before", before.referenceNode())); + fields.put("after", revision.after().referenceNode()); + fields.put("emittedEventCount", new Node().value(occurrences.size())); + fields.put("eventOccurrences", exactOccurrences.referenceNode()); + // Retain the legacy ordered event value for frozen workflows while the + // exact indexed occurrence list remains the normative identity proof. + List eventReferences = occurrences.stream() + .map(occurrence -> new Node().blueId( + occurrence.eventBlueId())) + .toList(); + ExactValue exactEvents = objects.put( + new Node().items(eventReferences), "embedded-events"); + fields.put("emittedEvents", exactEvents.referenceNode()); + if (revision.causalEntryBlueId().isPresent()) { + fields.put("originalEntryBlueId", scalar( + revision.causalEntryBlueId().orElseThrow())); + } + fields.put("attachmentEntryBlueId", scalar( + binding.attachmentEntryBlueId())); + return objects.put( + new Node().properties(fields), "embedded-epoch-request"); + } + + private static List eventOccurrences( + WholeObjectStore objects, + List events) { + List result = new ArrayList<>(); + for (int index = 0; index < events.size(); index++) { + ExactValue event = objects.put( + Objects.requireNonNull(events.get(index), "event"), + "emitted-event"); + FrozenNode type = event.frozen().getType(); + if (type == null || type.isEmptyNode()) { + throw new IllegalStateException( + "Child event occurrence " + index + + " has no exact effective type"); + } + String typeBlueId = type.blueId(); + if (typeBlueId == null || typeBlueId.isBlank()) { + throw new IllegalStateException( + "Child event occurrence " + index + + " has no established type BlueId"); + } + result.add(new EventOccurrence( + index, event.blueId(), typeBlueId)); + } + return List.copyOf(result); + } + + record EventOccurrence( + int occurrenceIndex, + String eventBlueId, + String eventTypeBlueId) { + EventOccurrence { + if (occurrenceIndex < 0) { + throw new IllegalArgumentException( + "occurrenceIndex must be non-negative"); + } + eventBlueId = requireText(eventBlueId, "eventBlueId"); + eventTypeBlueId = requireText( + eventTypeBlueId, "eventTypeBlueId"); + } + } + + private static Node scalar(String value) { + return new Node().value(requireText(value, "value")).inlineValue(true); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedLayoutPlan.java b/src/main/java/blue/coordination/internal/EmbeddedLayoutPlan.java new file mode 100644 index 0000000..0ae9415 --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedLayoutPlan.java @@ -0,0 +1,201 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; + +import blue.language.processor.EmbeddedScopePlanView; +import blue.language.processor.EffectiveFragmentationCatalog; +import blue.language.processor.util.ProcessorContractConstants; +import blue.language.processor.util.PointerUtils; +import blue.language.snapshot.FrozenNode; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Function; + +/** Reusable embedded-only cut and route plan keyed by exact contract identity. */ +final class EmbeddedLayoutPlan { + private static final String ABSENT = ""; + + public record ScopeRule( + String scopePath, + List explicitAbsolutePaths, + List collectionAbsolutePaths) { + public ScopeRule { + scopePath = requireText(scopePath, "scopePath"); + explicitAbsolutePaths = immutable(explicitAbsolutePaths); + collectionAbsolutePaths = immutable(collectionAbsolutePaths); + } + + public boolean hasCollections() { + return !collectionAbsolutePaths.isEmpty(); + } + } + + private final Map identitiesByScope; + private final RoutingSurface routingSurface; + private final Map rulesByScope; + + private EmbeddedLayoutPlan( + Map identitiesByScope, + RoutingSurface routingSurface, + Map rulesByScope) { + this.identitiesByScope = Collections.unmodifiableMap( + new LinkedHashMap<>(Objects.requireNonNull( + identitiesByScope, "identitiesByScope"))); + this.routingSurface = Objects.requireNonNull( + routingSurface, "routingSurface"); + this.rulesByScope = Collections.unmodifiableMap( + new LinkedHashMap<>(Objects.requireNonNull( + rulesByScope, "rulesByScope"))); + } + + public static EmbeddedLayoutPlan compile( + ExactValue exactRoot, + EffectiveFragmentationCatalog catalog, + Function exactScopeAt) { + Objects.requireNonNull(exactRoot, "exactRoot"); + Objects.requireNonNull(catalog, "catalog"); + Objects.requireNonNull(exactScopeAt, "exactScopeAt"); + if (!exactRoot.blueId().equals(catalog.rootBlueId())) { + throw new IllegalArgumentException( + "Fragmentation catalog belongs to another Root"); + } + Map rules = new LinkedHashMap<>(); + for (Map.Entry entry + : catalog.scopePlansByScope().entrySet()) { + String scopePath = entry.getKey(); + EmbeddedScopePlanView view = entry.getValue(); + List explicit = view.explicitDeclarationPaths().stream() + .map(path -> PointerUtils.resolvePointer(scopePath, path)) + .sorted(EmbeddingBinding.TEXT_ORDER) + .toList(); + List collections = view.collectionDeclarationPaths().stream() + .map(path -> PointerUtils.resolvePointer(scopePath, path)) + .sorted(EmbeddingBinding.TEXT_ORDER) + .toList(); + rules.put(scopePath, new ScopeRule( + scopePath, explicit, collections)); + } + List managed = managedBoundaries(catalog); + Map identities = new LinkedHashMap<>(); + for (String scopePath : catalog.scopePlansByScope().keySet()) { + if (!owned(scopePath, managed)) { + continue; + } + FrozenNode scope = exactScopeAt.apply(scopePath); + if (scope == null) { + throw new IllegalStateException( + "Missing exact active scope " + scopePath); + } + identities.put(scopePath, AuthoredScopeIdentity.from(scope)); + } + return new EmbeddedLayoutPlan( + identities, + RoutingSurface.from(catalog, managedBoundaries(catalog)), + rules); + } + + public RoutingSurface routingSurface() { + return routingSurface; + } + + public Map rulesByScope() { + return rulesByScope; + } + + /** Checks only authored scopes owned by this processing Root. */ + public boolean reusableFor(Function exactScopeAt) { + Objects.requireNonNull(exactScopeAt, "exactScopeAt"); + for (Map.Entry entry + : identitiesByScope.entrySet()) { + FrozenNode current = exactScopeAt.apply(entry.getKey()); + if (current == null || !entry.getValue().equals( + AuthoredScopeIdentity.from(current))) { + return false; + } + } + return true; + } + + public boolean hasCollections() { + return rulesByScope.values().stream().anyMatch(ScopeRule::hasCollections); + } + + private static List managedBoundaries( + EffectiveFragmentationCatalog catalog) { + return catalog.scopePlansByScope().values().stream() + .flatMap(view -> view.concreteChildPaths().stream()) + .distinct() + .sorted(EmbeddingBinding.TEXT_ORDER) + .toList(); + } + + private static String identity(FrozenNode node) { + return node == null ? ABSENT : node.blueId(); + } + + private static boolean owned( + String scopePath, + List managedBoundaries) { + for (String boundary : managedBoundaries) { + if (PointerUtils.descendantOrEqual(scopePath, boundary)) { + return false; + } + } + return true; + } + + /** Excludes processor-owned lifecycle/checkpoint fields from plan identity. */ + private static String authoredContractsIdentity(FrozenNode contracts) { + if (contracts == null) { + return ABSENT; + } + return contracts + .withProperty(ProcessorContractConstants.KEY_INITIALIZED, null) + .withProperty(ProcessorContractConstants.KEY_CHECKPOINT, null) + .withProperty(ProcessorContractConstants.KEY_TERMINATED, null) + .blueId(); + } + + private static String requireIdentity(String value) { + String checked = Objects.requireNonNull(value, "identity"); + if (checked.isBlank()) { + throw new IllegalArgumentException("identity must not be blank"); + } + return checked; + } + + private static List immutable(List source) { + List copy = new ArrayList<>(Objects.requireNonNull( + source, "source")); + copy.sort(EmbeddingBinding.TEXT_ORDER); + return Collections.unmodifiableList(copy); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } + + private record AuthoredScopeIdentity( + String typeBlueId, + String contractsBlueId) { + private AuthoredScopeIdentity { + typeBlueId = requireIdentity(typeBlueId); + contractsBlueId = requireIdentity(contractsBlueId); + } + + private static AuthoredScopeIdentity from(FrozenNode scope) { + return new AuthoredScopeIdentity( + identity(scope.getType()), + authoredContractsIdentity(scope.getContracts())); + } + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedOccurrence.java b/src/main/java/blue/coordination/internal/EmbeddedOccurrence.java new file mode 100644 index 0000000..bf9b390 --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedOccurrence.java @@ -0,0 +1,28 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; + +import blue.coordination.api.DocumentId; + +import java.util.Objects; + +/** One active processable child occurrence discovered from the frozen catalog. */ +record EmbeddedOccurrence( + String scopePath, + DocumentId childDocumentId, + ExactValue suppliedState) { + public EmbeddedOccurrence { + scopePath = requireText(scopePath, "scopePath"); + childDocumentId = Objects.requireNonNull( + childDocumentId, "childDocumentId"); + suppliedState = Objects.requireNonNull(suppliedState, "suppliedState"); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedOnlyLayout.java b/src/main/java/blue/coordination/internal/EmbeddedOnlyLayout.java new file mode 100644 index 0000000..8a1525f --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedOnlyLayout.java @@ -0,0 +1,112 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; + +import blue.language.model.Node; +import blue.language.model.wire.JsonPointer; +import blue.language.snapshot.FrozenNode; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** Semantic Root, ownership view, and one shell per embedded scope. */ +final class EmbeddedOnlyLayout { + private final ExactValue semanticRoot; + private final FrozenNode processingRoot; + private final Map shellsByScope; + private final List boundaries; + private final List directOccurrences; + private final EmbeddedLayoutPlan plan; + + EmbeddedOnlyLayout( + ExactValue semanticRoot, + FrozenNode processingRoot, + Map shellsByScope, + List boundaries, + List directOccurrences, + EmbeddedLayoutPlan plan) { + this.semanticRoot = Objects.requireNonNull( + semanticRoot, "semanticRoot"); + this.processingRoot = Objects.requireNonNull( + processingRoot, "processingRoot"); + this.shellsByScope = Collections.unmodifiableMap( + new LinkedHashMap<>(Objects.requireNonNull( + shellsByScope, "shellsByScope"))); + this.boundaries = Collections.unmodifiableList( + new ArrayList<>(Objects.requireNonNull( + boundaries, "boundaries"))); + this.directOccurrences = Collections.unmodifiableList( + new ArrayList<>(Objects.requireNonNull( + directOccurrences, "directOccurrences"))); + this.plan = Objects.requireNonNull(plan, "plan"); + ExactValue rootShell = this.shellsByScope.get(JsonPointer.ROOT); + if (rootShell == null) { + throw new IllegalArgumentException("Layout must contain Root scope"); + } + if (!semanticRoot.blueId().equals(rootShell.blueId())) { + throw new IllegalArgumentException( + "Root shell must preserve semantic Root identity"); + } + } + + public String rootBlueId() { + return semanticRoot.blueId(); + } + + public ExactValue semanticRoot() { + return semanticRoot; + } + + public EmbeddedLayoutPlan plan() { + return plan; + } + + public RoutingSurface routingSurface() { + return plan.routingSurface(); + } + + public Set scopePaths() { + return Collections.unmodifiableSet( + new LinkedHashSet<>(shellsByScope.keySet())); + } + + public List boundaries() { + return boundaries; + } + + public int physicalObjectCount() { + return shellsByScope.size(); + } + + FrozenNode processingFrozen() { + return processingRoot; + } + + /** Fully materialized semantic Root, used only at API/assertion boundaries. */ + public Node reconstructRoot() { + return semanticRoot.copyNode(); + } + + public ExactValue stored(String scopePath) { + ExactValue value = shellsByScope.get( + Objects.requireNonNull(scopePath, "scopePath")); + if (value == null) { + throw new IllegalArgumentException("Unknown scope " + scopePath); + } + return value; + } + + /** + * Direct managed children were compiled once with this layout. Reading + * them does not reconstruct child graphs or recalculate BlueIds. + */ + public List directOccurrences() { + return directOccurrences; + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddedOnlyLayoutBuilder.java b/src/main/java/blue/coordination/internal/EmbeddedOnlyLayoutBuilder.java new file mode 100644 index 0000000..75bd706 --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddedOnlyLayoutBuilder.java @@ -0,0 +1,584 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; +import blue.coordination.api.DocumentId; +import blue.language.model.Node; +import blue.language.model.wire.JsonPointer; +import blue.language.merge.ResolvedSnapshot; +import blue.language.processor.EffectiveFragmentationCatalog; +import blue.language.processor.EmbeddedScopePlanView; +import blue.language.processor.util.PointerUtils; +import blue.language.processor.registry.RuntimeBlueIds; +import blue.language.snapshot.FrozenNode; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +/** Cuts only effective Process Embedded paths from whole exact values. */ +final class EmbeddedOnlyLayoutBuilder { + private final BlueRuntime runtime; + private final WholeObjectStore objects; + private final EngineMetrics metrics; + public EmbeddedOnlyLayoutBuilder( + BlueRuntime runtime, + WholeObjectStore objects, + EngineMetrics metrics) { + this.runtime = Objects.requireNonNull(runtime, "runtime"); + this.objects = Objects.requireNonNull(objects, "objects"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + } + public EmbeddedOnlyLayout build(ExactValue exactRoot) { + Objects.requireNonNull(exactRoot, "exactRoot"); + return metrics.timed("layout.compileFrozenCatalog", () -> { + metrics.increment("layout.referenceOnlyCatalogInputs"); + EffectiveFragmentationCatalog catalog = + runtime.effectiveFragmentationCatalog(exactRoot.blueId()); + EmbeddedLayoutPlan plan = EmbeddedLayoutPlan.compile( + exactRoot, + catalog, + path -> exactScopeAt(exactRoot, path)); + metrics.increment("layout.catalogCompilations"); + return buildWithPlan( + exactRoot, + plan, + concreteFromCatalog(catalog)); + }); + } + public EmbeddedOnlyLayout rebuild( + ExactValue exactRoot, + EmbeddedOnlyLayout previous) { + return rebuild(exactRoot, previous, false); + } + public EmbeddedOnlyLayout rebuildAfterManagedChildRevision( + ExactValue exactRoot, + EmbeddedOnlyLayout previous) { + return rebuild(exactRoot, previous, true); + } + private EmbeddedOnlyLayout rebuild( + ExactValue exactRoot, + EmbeddedOnlyLayout previous, + boolean managedChildRevision) { + Objects.requireNonNull(exactRoot, "exactRoot"); + Objects.requireNonNull(previous, "previous"); + if (!previous.plan().reusableFor( + path -> exactScopeAt(exactRoot, path))) { + metrics.increment("layout.plansRecompiledAfterContractChange"); + return build(exactRoot); + } + metrics.increment("layout.plansReused"); + List concreteBoundaries = managedChildRevision + && previous.plan().hasCollections() + ? concreteFromOwnedCatalog(exactRoot, previous) + : previous.plan() + .hasCollections() + ? concreteFromCurrentCatalog(exactRoot) + : concreteFromFixedDeclarations(exactRoot, previous.plan(), + managedChildRevision ? previous.directOccurrences() : List.of()); + return buildWithPlan(exactRoot, previous.plan(), concreteBoundaries); + } + private List concreteFromOwnedCatalog( + ExactValue exactRoot, + EmbeddedOnlyLayout previous) { + return metrics.timed("layout.refreshOwnedCatalog", () -> { + FrozenNode opaque = exactRoot.frozen(); + for (EmbeddedOccurrence occurrence : previous.directOccurrences()) { + List path = JsonPointer.split(occurrence.scopePath()); + FrozenNode child = resolveThroughReferences(opaque, path); + if (child != null) { + opaque = replaceAt(opaque, path, + managedOwnershipProjection(child.toNode())); + } + } + ExactValue validationRoot = objects.put( + opaque, "owned-membership-validation-root"); + metrics.increment("layout.referenceOnlyCatalogInputs"); + metrics.increment("layout.ownedMembershipRefreshes"); + EffectiveFragmentationCatalog catalog = + runtime.effectiveFragmentationCatalog( + validationRoot.blueId()); + metrics.increment("layout.catalogCompilations"); + return concreteFromCatalog(catalog); + }); + } + private List concreteFromCurrentCatalog( + ExactValue exactRoot) { + return metrics.timed("layout.refreshCollectionCatalog", () -> { + metrics.increment("layout.referenceOnlyCatalogInputs"); + EffectiveFragmentationCatalog catalog = + runtime.effectiveFragmentationCatalog(exactRoot.blueId()); + metrics.increment("layout.catalogCompilations"); + metrics.increment("layout.collectionCatalogRefreshes"); + return concreteFromCatalog(catalog); + }); + } + public ExactValue restoreManagedChildren( + Node processedRoot, + EmbeddedOnlyLayout previous, + boolean processorManagedRevision) { + FrozenNode restored = FrozenNode.fromNode(Objects.requireNonNull( + processedRoot, "processedRoot")); + for (EmbeddedOccurrence occurrence : previous.directOccurrences()) { + List path = JsonPointer.split(occurrence.scopePath()); + FrozenNode processedChild = restored.at(occurrence.scopePath()); + FrozenNode executionChild = previous.processingFrozen() + .at(occurrence.scopePath()); + if (executionChild == null) { + throw new IllegalStateException( + "Missing managed PROCESS boundary at " + + occurrence.scopePath()); + } + if (processedChild == null) { + metrics.increment("layout.managedChildrenRemoved"); + continue; + } + if (processedChild.blueId().equals(executionChild.blueId())) { + restored = replaceAt(restored, path, + occurrence.suppliedState().frozen()); + metrics.increment("layout.managedChildrenRestored"); + continue; + } + if (processorManagedRevision) { + metrics.increment( + "layout.processorManagedChildUpdatesAccepted"); + continue; + } + ExactValue proposed = ExactValue.fromFrozen( + materializeReference(processedChild)); + DocumentId proposedId = DocumentIdentityReader.requireDocumentId( + proposed); + if (occurrence.childDocumentId().equals(proposedId)) { + metrics.increment( + "layout.externalManagedChildMutationsRejected"); + throw new IllegalStateException( + "External parent operation attempted to mutate managed " + + "child " + proposedId + " at " + + occurrence.scopePath()); + } + metrics.increment("layout.managedChildrenReplaced"); + } + return objects.put(restored, "document-revision"); + } + public ExactValue restoreAuthoredChildrenAfterInitialization( + Node initializedRoot, + EmbeddedOnlyLayout authoredLayout) { + FrozenNode restored = FrozenNode.fromNode(Objects.requireNonNull( + initializedRoot, "initializedRoot")); + for (EmbeddedOccurrence occurrence + : authoredLayout.directOccurrences()) { + List path = JsonPointer.split(occurrence.scopePath()); + if (restored.at(occurrence.scopePath()) == null) { + throw new IllegalStateException( + "Initialization removed Process Embedded child at " + + occurrence.scopePath()); + } + restored = replaceAt( + restored, path, occurrence.suppliedState().frozen()); + metrics.increment("layout.initializationOwnershipRestorations"); + } + return objects.put(restored, "initialized-document"); + } + public ResolvedSnapshot isolateManagedInitializationScopes( + ResolvedSnapshot snapshot, + EmbeddedOnlyLayout authoredLayout) { + Objects.requireNonNull(snapshot, "snapshot"); + Node resolvedNode = snapshot.resolvedRoot(); + for (String scopePath : authoredLayout.plan() + .rulesByScope().keySet()) { + Node scope = nodeAt(resolvedNode, scopePath); + Node contracts = scope != null ? scope.getContracts() : null; + if (contracts == null || contracts.getProperties() == null) { + continue; + } + contracts.getProperties().entrySet().removeIf(entry -> { + FrozenNode contract = FrozenNode.fromResolvedNode( + entry.getValue()); + FrozenNode type = contract.getType(); + return type != null + && (RuntimeBlueIds.PROCESS_EMBEDDED.equals( + type.getReferenceBlueId()) + || RuntimeBlueIds.PROCESS_EMBEDDED.equals( + type.blueId())); + }); + } + FrozenNode resolved = FrozenNode.fromResolvedNode(resolvedNode); + for (EmbeddedOccurrence occurrence + : authoredLayout.directOccurrences()) { + FrozenNode opaque = authoredLayout.processingFrozen().at( + occurrence.scopePath()); + if (opaque == null) { + throw new IllegalStateException( + "Missing managed initialization scope at " + + occurrence.scopePath()); + } + resolved = replaceAt( + resolved, + JsonPointer.split(occurrence.scopePath()), + opaque); + } + return new ResolvedSnapshot( + snapshot.frozenCanonicalRoot(), + resolved, + snapshot.blueId()); + } + private static Node nodeAt(Node root, String pointer) { + Node current = root; + for (String segment : JsonPointer.split(pointer)) { + Map properties = current != null + ? current.getProperties() : null; + current = properties != null ? properties.get(segment) : null; + } + return current; + } + private EmbeddedOnlyLayout buildWithPlan( + ExactValue suppliedRoot, + EmbeddedLayoutPlan plan, + List concreteBoundaries) { + return metrics.timed("layout.retainEmbeddedOnly", () -> { + FrozenNode materializedRoot = materializeDeclaredChildren( + suppliedRoot.frozen(), concreteBoundaries); + ExactValue semanticRoot = objects.put( + materializedRoot, "document-semantic-root"); + if (!suppliedRoot.blueId().equals(semanticRoot.blueId())) { + throw new IllegalStateException( + "Process Embedded materialization changed Root identity"); + } + Set scopePaths = new LinkedHashSet<>(); + scopePaths.add(JsonPointer.ROOT); + for (ConcreteBoundary boundary : concreteBoundaries) { + scopePaths.add(boundary.childPath()); + } + Map exactByScope = new LinkedHashMap<>(); + for (String scopePath : depthOrdered(scopePaths, false)) { + FrozenNode selected = selectMaterialized( + materializedRoot, scopePath); + exactByScope.put( + scopePath, + objects.put(selected, "managed-document-exact")); + } + Map shellsByScope = new LinkedHashMap<>(); + List boundaries = new ArrayList<>(); + for (String scopePath : depthOrdered(scopePaths, true)) { + FrozenNode exactScope = exactByScope.get(scopePath).frozen(); + FrozenNode shell = exactScope; + for (ConcreteBoundary boundary : concreteBoundaries) { + if (!boundary.parentPath().equals(scopePath)) { + continue; + } + ExactValue child = exactByScope.get( + boundary.childPath()); + if (child == null) { + throw new IllegalStateException( + "No exact Process Embedded child at " + + boundary.childPath()); + } + String relative = PointerUtils.relativizePointer( + scopePath, boundary.childPath()); + FrozenNode authoredChild = exactScope.at(relative); + if (authoredChild == null) { + throw new IllegalStateException( + "Process Embedded child disappeared at " + + boundary.childPath()); + } + boolean cutCreated = !authoredChild.isReferenceOnly(); + shell = replaceAt( + shell, + JsonPointer.split(relative), + pureReference(child.blueId())); + boundaries.add(new EmbeddedBoundary( + scopePath, + boundary.childPath(), + child.blueId(), + boundary.origin(), + cutCreated)); + } + ExactValue stored = objects.put( + shell, "managed-document-shell"); + objects.preferProviderRepresentation( + shell, "managed-document-shell"); + if (!exactByScope.get(scopePath).blueId() + .equals(stored.blueId())) { + throw new IllegalStateException( + "Embedded-only cut changed semantic identity at " + + scopePath); + } + shellsByScope.put(scopePath, stored); + } + Map rootFirst = new LinkedHashMap<>(); + depthOrdered(shellsByScope.keySet(), false).forEach(path -> + rootFirst.put(path, shellsByScope.get(path))); + boundaries.sort(Comparator.comparing( + EmbeddedBoundary::parentScopePath, + EmbeddingBinding.TEXT_ORDER).thenComparing( + EmbeddedBoundary::childScopePath, + EmbeddingBinding.TEXT_ORDER)); + List directOccurrences = directOccurrences( + exactByScope, boundaries); + FrozenNode processingRoot = materializedRoot; + for (EmbeddedOccurrence occurrence : directOccurrences) { + processingRoot = replaceAt( + processingRoot, + JsonPointer.split(occurrence.scopePath()), + managedOwnershipProjection( + occurrence.suppliedState().copyNode())); + } + objects.put(processingRoot, "processing-ownership-view"); + metrics.increment("layout.managedOwnershipViewsBuilt"); + + metrics.add("layout.embeddedDocuments", + Math.max(0L, rootFirst.size() - 1L)); + metrics.add("layout.processEmbeddedCuts", boundaries.stream() + .filter(EmbeddedBoundary::physicalCutCreated).count()); + metrics.increment("layout.semanticRootsRetained"); + return new EmbeddedOnlyLayout( + semanticRoot, + processingRoot, + rootFirst, + boundaries, + directOccurrences, + plan); + }); + } + private FrozenNode materializeDeclaredChildren( + FrozenNode suppliedRoot, + List boundaries) { + FrozenNode result = suppliedRoot; + for (ConcreteBoundary boundary : boundaries.stream() + .sorted(Comparator.comparingInt( + value -> JsonPointer.split(value.childPath()).size())) + .toList()) { + FrozenNode child = resolveThroughReferences( + result, JsonPointer.split(boundary.childPath())); + if (child == null) { + throw new IllegalStateException( + "Process Embedded scope is absent at " + + boundary.childPath()); + } + result = replaceAt( + result, + JsonPointer.split(boundary.childPath()), + child); + } + return result; + } + private FrozenNode resolveThroughReferences( + FrozenNode root, + List segments) { + FrozenNode current = root; + for (String segment : segments) { + current = materializeReference(current); + if (current == null) { + return null; + } + if (current.getProperties() != null) { + current = current.getProperties().get(segment); + } else if (current.getItems() != null) { + int index; + try { + index = Integer.parseInt(segment); + } catch (NumberFormatException failure) { + return null; + } + current = index >= 0 && index < current.getItems().size() + ? current.getItems().get(index) + : null; + } else { + return null; + } + } + return materializeReference(current); + } + private FrozenNode exactScopeAt(ExactValue root, String path) { + return resolveThroughReferences( + root.frozen(), JsonPointer.split(path)); + } + private FrozenNode materializeReference(FrozenNode value) { + if (value == null || !value.isReferenceOnly()) { + return value; + } + return objects.require(value.getReferenceBlueId()).frozen(); + } + private List concreteFromFixedDeclarations( + ExactValue exactRoot, + EmbeddedLayoutPlan plan, + List opaqueScopes) { + List result = new ArrayList<>(); + for (EmbeddedLayoutPlan.ScopeRule rule + : plan.rulesByScope().values()) { + if (opaqueScopes.stream().anyMatch(occurrence -> + PointerUtils.descendantOrEqual( + rule.scopePath(), occurrence.scopePath()))) { + continue; + } + for (String childPath : rule.explicitAbsolutePaths()) { + FrozenNode selected = resolveThroughReferences( + exactRoot.frozen(), JsonPointer.split(childPath)); + if (selected != null && !selected.isEmptyNode()) { + result.add(new ConcreteBoundary( + rule.scopePath(), + childPath, + EmbeddedScopePlanView.Origin.EXPLICIT)); + } + } + } + return canonicalBoundaries(result); + } + private static List concreteFromCatalog( + EffectiveFragmentationCatalog catalog) { + List result = new ArrayList<>(); + for (Map.Entry entry + : catalog.scopePlansByScope().entrySet()) { + String parent = entry.getKey(); + EmbeddedScopePlanView view = entry.getValue(); + for (String child : view.concreteChildPaths()) { + result.add(new ConcreteBoundary( + parent, + child, + Objects.requireNonNull( + view.originsByConcretePath().get(child), + "embedded origin for " + child))); + } + } + return canonicalBoundaries(result); + } + private static List canonicalBoundaries( + Collection source) { + Map unique = new LinkedHashMap<>(); + source.stream() + .sorted(Comparator.comparing( + ConcreteBoundary::parentPath, + EmbeddingBinding.TEXT_ORDER).thenComparing( + ConcreteBoundary::childPath, + EmbeddingBinding.TEXT_ORDER)) + .forEach(boundary -> unique.putIfAbsent( + boundary.parentPath() + "|" + boundary.childPath(), + boundary)); + return List.copyOf(unique.values()); + } + private static List depthOrdered( + Collection paths, + boolean deepestFirst) { + Comparator order = Comparator + .comparingInt((String path) -> JsonPointer.split(path).size()) + .thenComparing(EmbeddingBinding.TEXT_ORDER); + if (deepestFirst) { + order = order.reversed(); + } + return paths.stream().sorted(order).toList(); + } + private static FrozenNode selectMaterialized( + FrozenNode materializedRoot, + String path) { + FrozenNode selected = JsonPointer.ROOT.equals(path) + ? materializedRoot + : materializedRoot.at(path); + if (selected == null) { + throw new IllegalStateException("Missing exact scope " + path); + } + return selected; + } + private static FrozenNode replaceAt( + FrozenNode root, + List segments, + FrozenNode replacement) { + if (segments.isEmpty()) { + return Objects.requireNonNull(replacement, "replacement"); + } + String head = segments.get(0); + List tail = segments.subList(1, segments.size()); + if (root.getProperties() != null) { + FrozenNode child = root.getProperties().get(head); + if (child == null) { + throw new IllegalStateException( + "Cannot replace absent property " + head); + } + return root.withProperty( + head, replaceAt(child, tail, replacement)); + } + if (root.getItems() != null) { + int index; + try { + index = Integer.parseInt(head); + } catch (NumberFormatException failure) { + throw new IllegalStateException( + "List path segment is not an index: " + head, + failure); + } + if (index < 0 || index >= root.getItems().size()) { + throw new IllegalStateException( + "List index out of range: " + index); + } + List items = new ArrayList<>(root.getItems()); + items.set(index, replaceAt(items.get(index), tail, replacement)); + return root.withItems(items); + } + throw new IllegalStateException( + "Cannot descend through scalar path segment " + head); + } + + private static FrozenNode pureReference(String blueId) { + return FrozenNode.fromNode(new Node().blueId( + Objects.requireNonNull(blueId, "blueId"))); + } + + private static FrozenNode managedOwnershipProjection(Node source) { + Node result = new Node() + .name(source.getName()) + .description(source.getDescription()) + .value(source.getRawValue()) + .inlineValue(source.isInlineValue()); + if (source.getItems() != null) { + List items = new ArrayList<>(source.getItems().size()); + source.getItems().forEach(item -> + items.add(managedOwnershipProjection(item).toNode())); + result.items(items); + } + if (source.getProperties() != null) { + Map properties = new LinkedHashMap<>(); + source.getProperties().forEach((key, value) -> + properties.put( + key, + managedOwnershipProjection(value).toNode())); + result.properties(properties); + } + return FrozenNode.fromNode(result); + } + + private static List directOccurrences( + Map exactByScope, + List boundaries) { + List result = new ArrayList<>(); + Set seen = new LinkedHashSet<>(); + for (EmbeddedBoundary boundary : boundaries) { + if (!JsonPointer.ROOT.equals(boundary.parentScopePath()) + || !seen.add(boundary.childScopePath())) { + continue; + } + ExactValue child = exactByScope.get( + boundary.childScopePath()); + result.add(new EmbeddedOccurrence( + boundary.childScopePath(), + DocumentIdentityReader.requireDocumentId(child), + child)); + } + result.sort(Comparator.comparing( + EmbeddedOccurrence::scopePath, EmbeddingBinding.TEXT_ORDER)); + return List.copyOf(result); + } + + private record ConcreteBoundary( + String parentPath, + String childPath, + EmbeddedScopePlanView.Origin origin) { + private ConcreteBoundary { + parentPath = Objects.requireNonNull(parentPath, "parentPath"); + childPath = Objects.requireNonNull(childPath, "childPath"); + origin = Objects.requireNonNull(origin, "origin"); + } + } +} diff --git a/src/main/java/blue/coordination/internal/EmbeddingBinding.java b/src/main/java/blue/coordination/internal/EmbeddingBinding.java new file mode 100644 index 0000000..28e22e1 --- /dev/null +++ b/src/main/java/blue/coordination/internal/EmbeddingBinding.java @@ -0,0 +1,105 @@ +package blue.coordination.internal; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentId; +import blue.language.processor.ExternalOrderKey; + +import java.math.BigInteger; +import java.util.Comparator; +import java.util.Objects; + +/** Immutable topology and activation identity for one Process Embedded occurrence. */ +record EmbeddingBinding( + String bindingId, + DocumentId parentDocumentId, + String absolutePath, + DocumentId childDocumentId, + long activationGeneration, + ActivationMode activationMode, + ExternalOrderKey establishedFrontier, + String admittedChildBlueId, + Long admittedChildEpoch, + String admissionProofIdentity, + String attachmentEntryBlueId, + ExternalOrderKey attachmentOrder) { + static final Comparator TEXT_ORDER = + ExternalOrderKey::compareTextCodePoints; + static final Comparator DOCUMENT_ORDER = + Comparator.comparing(DocumentId::value, TEXT_ORDER); + static final Comparator WITHIN_PARENT_ORDER = Comparator + .comparing(EmbeddingBinding::absolutePath, TEXT_ORDER) + .thenComparing(b -> b.childDocumentId().value(), TEXT_ORDER) + .thenComparingLong(EmbeddingBinding::activationGeneration); + static final Comparator GLOBAL_ORDER = Comparator + .comparing((EmbeddingBinding b) -> b.parentDocumentId().value(), + TEXT_ORDER) + .thenComparing(WITHIN_PARENT_ORDER); + EmbeddingBinding { + bindingId = requireText(bindingId, "bindingId"); + parentDocumentId = Objects.requireNonNull( + parentDocumentId, "parentDocumentId"); + absolutePath = requirePath(absolutePath); + childDocumentId = Objects.requireNonNull( + childDocumentId, "childDocumentId"); + if (activationGeneration < 1L) { + throw new IllegalArgumentException( + "activationGeneration must be positive"); + } + activationMode = Objects.requireNonNull( + activationMode, "activationMode"); + if ((activationMode == ActivationMode.IMPORT_FROM_FRONTIER + || activationMode == ActivationMode.ATTACH_CURRENT_STATE) + && establishedFrontier == null) { + throw new IllegalArgumentException( + activationMode + " requires establishedFrontier"); + } + if (activationMode != ActivationMode.IMPORT_FROM_FRONTIER + && activationMode != ActivationMode.ATTACH_CURRENT_STATE + && establishedFrontier != null) { + throw new IllegalArgumentException( + "This activation mode cannot carry establishedFrontier"); + } + admittedChildBlueId = requireText( + admittedChildBlueId, "admittedChildBlueId"); + if (admittedChildEpoch != null && admittedChildEpoch < 0L) { + throw new IllegalArgumentException( + "admittedChildEpoch must be non-negative"); + } + admissionProofIdentity = requireText( + admissionProofIdentity, "admissionProofIdentity"); + attachmentEntryBlueId = requireText( + attachmentEntryBlueId, "attachmentEntryBlueId"); + attachmentOrder = Objects.requireNonNull( + attachmentOrder, "attachmentOrder"); + } + + long attachmentTimestampMicros() { + if (!attachmentOrder.components().isEmpty() + && attachmentOrder.components().get(0) + instanceof BigInteger timestamp) { + try { + return Math.max(1L, timestamp.longValueExact()); + } catch (ArithmeticException ignored) { + return 1L; + } + } + return 1L; + } + + private static String requirePath(String value) { + String checked = requireText(value, "absolutePath"); + if (!checked.startsWith("/")) { + throw new IllegalArgumentException( + "absolutePath must be a JSON Pointer"); + } + return checked; + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/EngineMetrics.java b/src/main/java/blue/coordination/internal/EngineMetrics.java new file mode 100644 index 0000000..4e1d83f --- /dev/null +++ b/src/main/java/blue/coordination/internal/EngineMetrics.java @@ -0,0 +1,186 @@ +package blue.coordination.internal; + +import blue.coordination.api.CoordinationMetrics; + +import java.util.Collections; +import java.util.EnumMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.atomic.LongAdder; +import java.util.function.Supplier; + +/** Honest work counters and phase timers for the temporal engine. */ +final class EngineMetrics { + private static final Map> + CANONICAL_SOURCES = canonicalSources(); + + private final Map counters = new LinkedHashMap<>(); + private final Map phaseNanos = new LinkedHashMap<>(); + + public T timed(String phase, Supplier work) { + Objects.requireNonNull(work, "work"); + long started = System.nanoTime(); + try { + return work.get(); + } finally { + addNanos(phase, System.nanoTime() - started); + } + } + + public void timed(String phase, Runnable work) { + timed(phase, () -> { + work.run(); + return null; + }); + } + + public synchronized void increment(String counter) { + add(counter, 1L); + } + + public synchronized void add(String counter, long value) { + if (value < 0L) { + throw new IllegalArgumentException("counter delta must be non-negative"); + } + counters.computeIfAbsent(requireText(counter), ignored -> new LongAdder()) + .add(value); + } + + public synchronized void addNanos(String phase, long nanos) { + if (nanos < 0L) { + throw new IllegalArgumentException("nanos must be non-negative"); + } + phaseNanos.computeIfAbsent(requireText(phase), ignored -> new LongAdder()) + .add(nanos); + } + + public synchronized long counter(String name) { + LongAdder value = counters.get(name); + return value == null ? 0L : value.sum(); + } + + public synchronized long phaseNanos(String name) { + LongAdder value = phaseNanos.get(name); + return value == null ? 0L : value.sum(); + } + + public synchronized MetricsSnapshot snapshot() { + Map counterCopy = new LinkedHashMap<>(); + counters.forEach((name, value) -> counterCopy.put(name, value.sum())); + addCanonicalCounters(counterCopy); + Map phaseCopy = new LinkedHashMap<>(); + phaseNanos.forEach((name, value) -> phaseCopy.put(name, value.sum())); + return new MetricsSnapshot(counterCopy, phaseCopy); + } + + /** Closed public projection; raw diagnostics remain test-fixture-only. */ + public synchronized MetricsSnapshot publicSnapshot() { + MetricsSnapshot diagnostic = snapshot(); + Map publicCounters = new LinkedHashMap<>(); + for (CoordinationMetrics.Counter counter + : CoordinationMetrics.Counter.values()) { + publicCounters.put( + counter.name(), diagnostic.counters().get(counter.name())); + } + Map publicPhases = new LinkedHashMap<>(); + for (CoordinationMetrics.Phase phase + : CoordinationMetrics.Phase.values()) { + publicPhases.put( + phase.metricName(), + diagnostic.phaseNanos().getOrDefault( + phase.metricName(), 0L)); + } + return new MetricsSnapshot(publicCounters, publicPhases); + } + + private static void addCanonicalCounters(Map snapshot) { + for (CoordinationMetrics.Counter counter + : CoordinationMetrics.Counter.values()) { + long value = 0L; + for (String source : CANONICAL_SOURCES.getOrDefault( + counter, List.of())) { + value = Math.addExact( + value, snapshot.getOrDefault(source, 0L)); + } + snapshot.put(counter.name(), value); + } + } + + private static Map> + canonicalSources() { + Map> result = + new EnumMap<>(CoordinationMetrics.Counter.class); + result.put(CoordinationMetrics.Counter.ENTRIES_STORED_WHOLE, + List.of("journal.entriesStoredWhole")); + result.put(CoordinationMetrics.Counter.ROUTE_INDEX_LOOKUPS, + List.of("routing.lookups")); + result.put(CoordinationMetrics.Counter.GRAPH_SNAPSHOTS_REUSED, + List.of("temporal.graphSnapshotsReused")); + result.put(CoordinationMetrics.Counter.GRAPH_RECONCILIATIONS, + List.of("temporal.graphReconciliations")); + result.put(CoordinationMetrics.Counter.DOCUMENT_INITIALIZATIONS, + List.of("documentStart.sessionsInitialized")); + result.put(CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS, + List.of("deliveryReceiptsCommitted")); + result.put(CoordinationMetrics.Counter.EMBEDDED_EPOCH_PROCESS_CALLS, + List.of("process.embeddedEpochProcessCalls")); + result.put(CoordinationMetrics.Counter.CHILD_EPOCHS_COMMITTED, + List.of("temporal.childEpochsCommitted")); + result.put(CoordinationMetrics.Counter.PARENT_EPOCH_APPLICATIONS, + List.of("embedding.parentEpochApplications")); + result.put(CoordinationMetrics.Counter.HISTORICAL_WINDOWS_OPENED, + List.of("journal.historicalWindowsOpened")); + result.put(CoordinationMetrics.Counter.HISTORICAL_ENTRIES_REPLAYED, + List.of("temporal.historicalEntriesReplayed")); + result.put(CoordinationMetrics.Counter.CATCH_UP_BARRIERS_CREATED, + List.of("temporal.catchUpBarriersCreated")); + result.put(CoordinationMetrics.Counter.CATCH_UP_BARRIERS_COMPLETED, + List.of("temporal.catchUpBarriersCompleted")); + result.put(CoordinationMetrics.Counter.UNRELATED_DOCUMENT_READS, + List.of("temporal.unrelatedDocumentReads")); + result.put(CoordinationMetrics.Counter.REQUEST_FRAGMENTS, + List.of("append.requestFragments")); + result.put(CoordinationMetrics.Counter.TIMELINE_ENTRY_FRAGMENTS, + List.of("append.eventFragments")); + result.put(CoordinationMetrics.Counter.ORDINARY_NODE_FRAGMENTS, + List.of("layout.ordinaryNodeFragments")); + result.put(CoordinationMetrics.Counter.FULL_ENVIRONMENT_SCANS, + List.of("temporal.fullEnvironmentScans")); + result.put(CoordinationMetrics.Counter.SOURCE_REPLAYS_PER_PARENT, + List.of("temporal.sourceReplaysPerParent")); + result.put(CoordinationMetrics.Counter.POST_PROCESS_FULL_PROJECTIONS, + List.of("process.postProcessFullProjections")); + result.put(CoordinationMetrics.Counter + .PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY, + List.of("temporal.parentProcessRerunsOnGraphRetry")); + result.put(CoordinationMetrics.Counter + .CHILD_PROCESS_RERUNS_ON_PARENT_RETRY, + List.of("temporal.childProcessRerunsOnParentRetry")); + if (result.size() != CoordinationMetrics.Counter.values().length) { + throw new IllegalStateException( + "Every public counter requires an explicit work source"); + } + return Collections.unmodifiableMap(result); + } + + private static String requireText(String value) { + String checked = Objects.requireNonNull(value, "name"); + if (checked.isBlank()) { + throw new IllegalArgumentException("metric name must not be blank"); + } + return checked; + } + + public record MetricsSnapshot( + Map counters, + Map phaseNanos) { + public MetricsSnapshot { + counters = Collections.unmodifiableMap( + new LinkedHashMap<>(Objects.requireNonNull(counters, "counters"))); + phaseNanos = Collections.unmodifiableMap( + new LinkedHashMap<>(Objects.requireNonNull(phaseNanos, "phaseNanos"))); + } + } +} diff --git a/src/main/java/blue/coordination/internal/HistoricalAvailabilityControl.java b/src/main/java/blue/coordination/internal/HistoricalAvailabilityControl.java new file mode 100644 index 0000000..103af12 --- /dev/null +++ b/src/main/java/blue/coordination/internal/HistoricalAvailabilityControl.java @@ -0,0 +1,24 @@ +package blue.coordination.internal; + +import java.util.Optional; + +/** Deterministic fail-closed availability seam for in-memory tests. */ +final class HistoricalAvailabilityControl { + private HistoricalStep blockedStep; + + synchronized void makeAvailable() { + blockedStep = null; + } + + synchronized void makeUnavailable(String diagnostic) { + blockedStep = new HistoricalStep.Unavailable(diagnostic); + } + + synchronized void invalidateEvidence(String diagnostic) { + blockedStep = new HistoricalStep.InvalidEvidence(diagnostic); + } + + synchronized Optional blockedStep() { + return Optional.ofNullable(blockedStep); + } +} diff --git a/src/main/java/blue/coordination/internal/HistoricalStep.java b/src/main/java/blue/coordination/internal/HistoricalStep.java new file mode 100644 index 0000000..dee5124 --- /dev/null +++ b/src/main/java/blue/coordination/internal/HistoricalStep.java @@ -0,0 +1,64 @@ +package blue.coordination.internal; + +import blue.coordination.api.TimelineEntry; +import blue.language.processor.ExternalOrderKey; + +import java.util.Objects; + +/** Closed result of one incremental historical-source probe. */ +sealed interface HistoricalStep permits HistoricalStep.EligibleEntry, + HistoricalStep.Complete, HistoricalStep.CompleteEmpty, + HistoricalStep.Unavailable, HistoricalStep.InvalidEvidence { + /** One canonical entry and the exact exclusive cursor after consuming it. */ + record EligibleEntry( + TimelineEntry entry, + ExternalOrderKey nextExclusive) implements HistoricalStep { + public EligibleEntry { + entry = Objects.requireNonNull(entry, "entry"); + nextExclusive = Objects.requireNonNull( + nextExclusive, "nextExclusive"); + if (!nextExclusive.equals(entry.sourceOrderKey())) { + throw new IllegalArgumentException( + "nextExclusive must identify the eligible entry"); + } + } + } + + /** The queried interval is complete but contained ineligible evidence. */ + record Complete(CompletenessEvidence evidence) + implements HistoricalStep { + public Complete { + evidence = Objects.requireNonNull(evidence, "evidence"); + } + } + + /** The queried interval is proven complete and contained no entries. */ + record CompleteEmpty(CompletenessEvidence evidence) + implements HistoricalStep { + public CompleteEmpty { + evidence = Objects.requireNonNull(evidence, "evidence"); + } + } + + /** The source cannot currently prove or produce the next result. */ + record Unavailable(String diagnostic) implements HistoricalStep { + public Unavailable { + diagnostic = requireText(diagnostic, "diagnostic"); + } + } + + /** Supplied source/progress evidence is invalid, not absent. */ + record InvalidEvidence(String diagnostic) implements HistoricalStep { + public InvalidEvidence { + diagnostic = requireText(diagnostic, "diagnostic"); + } + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/InMemoryDocumentStore.java b/src/main/java/blue/coordination/internal/InMemoryDocumentStore.java new file mode 100644 index 0000000..6cc50bd --- /dev/null +++ b/src/main/java/blue/coordination/internal/InMemoryDocumentStore.java @@ -0,0 +1,50 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +/** Deterministic in-memory document store. */ +final class InMemoryDocumentStore { + private final Map sessions = + new LinkedHashMap<>(); + + public synchronized Optional find(DocumentId documentId) { + return Optional.ofNullable(sessions.get( + Objects.requireNonNull(documentId, "documentId"))); + } + + public synchronized DocumentSession require(DocumentId documentId) { + return find(documentId).orElseThrow(() -> + new IllegalArgumentException("Unknown document " + documentId)); + } + + public synchronized void insert(DocumentSession session) { + Objects.requireNonNull(session, "session"); + DocumentSession previous = sessions.putIfAbsent( + session.documentId(), session); + if (previous != null) { + throw new IllegalArgumentException( + "Duplicate document session " + session.documentId()); + } + } + + public synchronized void remove(DocumentId documentId) { + sessions.remove(Objects.requireNonNull(documentId, "documentId")); + } + + public synchronized Collection sessions() { + return Collections.unmodifiableList(new ArrayList<>(sessions.values())); + } + + public synchronized int size() { + return sessions.size(); + } + +} diff --git a/src/main/java/blue/coordination/internal/InMemoryTimelineJournal.java b/src/main/java/blue/coordination/internal/InMemoryTimelineJournal.java new file mode 100644 index 0000000..56fb6ba --- /dev/null +++ b/src/main/java/blue/coordination/internal/InMemoryTimelineJournal.java @@ -0,0 +1,358 @@ +package blue.coordination.internal; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.processor.ExternalOrderKey; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.NavigableMap; +import java.util.TreeMap; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** Deterministic in-memory journal; each exact entry is retained once. */ +final class InMemoryTimelineJournal { + private final WholeRequestEntryFactory entryFactory; + private final EngineMetrics metrics; + private final Map byBlueId = new LinkedHashMap<>(); + private final Map> byTimeline = + new LinkedHashMap<>(); + private final Map previousByTimeline = new LinkedHashMap<>(); + private final Map sequenceByTimeline = new LinkedHashMap<>(); + private final NavigableMap externalByOrder = + new TreeMap<>(); + private final List appendOrder = new ArrayList<>(); + private final HistoricalAvailabilityControl historicalAvailability; + private long globalSequence; + private long revision; + + public InMemoryTimelineJournal( + WholeRequestEntryFactory entryFactory, + EngineMetrics metrics) { + this(entryFactory, metrics, new HistoricalAvailabilityControl()); + } + + InMemoryTimelineJournal( + WholeRequestEntryFactory entryFactory, + EngineMetrics metrics, + HistoricalAvailabilityControl historicalAvailability) { + this.entryFactory = Objects.requireNonNull(entryFactory, "entryFactory"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + this.historicalAvailability = Objects.requireNonNull( + historicalAvailability, "historicalAvailability"); + } + + public synchronized TimelineEntry append( + Timeline timeline, + Operation operation, + long timestampMicros) { + return appendInternal(timeline, operation, timestampMicros); + } + + /** Admits one lossless exact Timeline Entry under provider ordering. */ + public synchronized TimelineEntry appendExact( + Timeline timeline, + blue.coordination.api.ExactValue exactEvent) { + Objects.requireNonNull(timeline, "timeline"); + Objects.requireNonNull(exactEvent, "exactEvent"); + TimelineEntry duplicate = byBlueId.get(exactEvent.blueId()); + if (duplicate != null) { + if (!duplicate.exactEvent().sameExactValue(exactEvent)) { + throw new IllegalStateException( + "Conflicting exact Timeline Entry " + + exactEvent.blueId()); + } + metrics.increment("journal.duplicateEntries"); + return duplicate; + } + long nextGlobalSequence = Math.addExact(globalSequence, 1L); + long nextTimelineSequence = Math.addExact( + sequenceByTimeline.getOrDefault( + timeline.timelineId(), 0L), 1L); + TimelineEntry entry = entryFactory.createExact( + timeline, + exactEvent, + nextGlobalSequence, + nextTimelineSequence); + return publish(entry, previousIdentity(exactEvent)); + } + + private TimelineEntry appendInternal( + Timeline timeline, + Operation operation, + long timestampMicros) { + Objects.requireNonNull(timeline, "timeline"); + long nextGlobalSequence = Math.addExact(globalSequence, 1L); + long nextTimelineSequence = Math.addExact( + sequenceByTimeline.getOrDefault(timeline.timelineId(), 0L), 1L); + TimelineEntry entry = entryFactory.create( + timeline, + previousByTimeline.get(timeline.timelineId()), + operation, + timestampMicros, + nextGlobalSequence, + nextTimelineSequence); + return publish(entry, previousByTimeline.get(timeline.timelineId())); + } + + private TimelineEntry publish( + TimelineEntry entry, + String declaredPreviousBlueId) { + TimelineEntry existing = byBlueId.get(entry.blueId()); + if (existing != null) { + if (!existing.exactEvent().sameExactValue(entry.exactEvent())) { + throw new IllegalStateException( + "Conflicting exact Timeline Entry " + entry.blueId()); + } + metrics.increment("journal.duplicateEntries"); + return existing; + } + String timelineId = entry.timeline().timelineId(); + if (!Objects.equals( + previousByTimeline.get(timelineId), + declaredPreviousBlueId)) { + throw new IllegalArgumentException( + "Timeline Entry predecessor does not match the accepted " + + "Timeline head"); + } + List timelineEntries = byTimeline.getOrDefault( + timelineId, List.of()); + if (!timelineEntries.isEmpty()) { + TimelineEntry last = timelineEntries.get(timelineEntries.size() - 1); + if (entry.timestampMicros() <= last.timestampMicros()) { + throw new IllegalArgumentException( + "Timeline timestamps must increase monotonically"); + } + } + if (externalByOrder.containsKey(entry.sourceOrderKey())) { + throw new IllegalStateException( + "Duplicate external source order " + + entry.sourceOrderKey()); + } + long nextRevision = Math.addExact(revision, 1L); + timelineEntries = byTimeline.computeIfAbsent( + timelineId, ignored -> new ArrayList<>()); + timelineEntries.add(entry); + byBlueId.put(entry.blueId(), entry); + externalByOrder.put(entry.sourceOrderKey(), entry); + previousByTimeline.put(timelineId, entry.blueId()); + globalSequence = entry.globalSequence(); + sequenceByTimeline.put(timelineId, entry.timelineSequence()); + appendOrder.add(entry); + revision = nextRevision; + metrics.increment("journal.entriesStoredWhole"); + metrics.increment("append.journalOperations"); + metrics.increment("requestsStoredWhole"); + return entry; + } + + private static String previousIdentity( + blue.coordination.api.ExactValue exactEvent) { + blue.language.snapshot.FrozenNode previous = + exactEvent.canonicalAt("/prevEntry"); + return previous == null + ? null + : previous.isReferenceOnly() + ? previous.getReferenceBlueId() + : previous.blueId(); + } + + public synchronized Optional byBlueId(String blueId) { + return Optional.ofNullable(byBlueId.get( + Objects.requireNonNull(blueId, "blueId"))); + } + + /** + * Returns the canonical journal object and rejects caller-forged metadata + * even when the supplied value reuses a known BlueId. + */ + public synchronized TimelineEntry requireCanonical(TimelineEntry supplied) { + TimelineEntry canonical = byBlueId.get(Objects.requireNonNull( + supplied, "supplied").blueId()); + if (canonical == null) { + throw new IllegalArgumentException( + "Timeline Entry is not journaled: " + supplied.blueId()); + } + if (!canonical.equals(supplied) + || !canonical.exactEvent().sameExactValue( + supplied.exactEvent())) { + throw new IllegalArgumentException( + "Timeline Entry metadata does not match canonical journal " + + "evidence: " + supplied.blueId()); + } + return canonical; + } + + /** Canonical next external entry after a completed source-order cursor. */ + public synchronized Optional nextExternal( + ExternalOrderKey afterExclusive, + ExternalOrderKey throughInclusive) { + Map.Entry candidate = + afterExclusive == null + ? externalByOrder.firstEntry() + : externalByOrder.higherEntry(afterExclusive); + if (candidate == null || throughInclusive != null + && candidate.getKey().compareTo(throughInclusive) > 0) { + return Optional.empty(); + } + metrics.increment("journal.orderedCursorReads"); + return Optional.of(candidate.getValue()); + } + + /** True only for a canonical frontier retained by this journal. */ + synchronized boolean containsExternalOrder(ExternalOrderKey frontier) { + return externalByOrder.containsKey(Objects.requireNonNull( + frontier, "frontier")); + } + + /** + * Returns a closed result for one dynamically evaluated historical probe. + * Completion is bound to the exact journal, route, graph, cutoff, and + * active source-surface identities used for this probe. + */ + synchronized HistoricalStep nextHistoricalStep( + ExternalOrderKey afterExclusive, + ExternalOrderKey cutoffExclusive, + String excludedEntryBlueId, + Predicate eligible, + long routeIndexGeneration, + long graphGeneration, + Supplier sourceSurfaceIdentity) { + Objects.requireNonNull(cutoffExclusive, "cutoffExclusive"); + Objects.requireNonNull(eligible, "eligible"); + Objects.requireNonNull(sourceSurfaceIdentity, "sourceSurfaceIdentity"); + if (routeIndexGeneration < 0L || graphGeneration < 0L) { + throw new IllegalArgumentException( + "historical generations must be non-negative"); + } + metrics.increment("journal.historicalWindowsOpened"); + Optional blocked = historicalAvailability.blockedStep(); + if (blocked.isPresent()) { + return blocked.orElseThrow(); + } + NavigableMap tail = + afterExclusive == null + ? externalByOrder + : externalByOrder.tailMap(afterExclusive, false); + boolean sawEntryInWindow = false; + for (Map.Entry item + : tail.entrySet()) { + metrics.increment("journal.historicalCursorProbes"); + if (item.getKey().compareTo(cutoffExclusive) >= 0) { + break; + } + sawEntryInWindow = true; + TimelineEntry entry = item.getValue(); + if (entry.blueId().equals(excludedEntryBlueId) + || !eligible.test(entry)) { + continue; + } + return new HistoricalStep.EligibleEntry( + entry, entry.sourceOrderKey()); + } + metrics.increment("journal.sourceSurfaceIdentitiesResolved"); + CompletenessEvidence evidence = new CompletenessEvidence( + revision, + routeIndexGeneration, + graphGeneration, + cutoffExclusive, + requireText(sourceSurfaceIdentity.get(), + "sourceSurfaceIdentity")); + return sawEntryInWindow + ? new HistoricalStep.Complete(evidence) + : new HistoricalStep.CompleteEmpty(evidence); + } + + public synchronized ExternalOrderKey latestExternalOrder() { + return externalByOrder.isEmpty() ? null : externalByOrder.lastKey(); + } + + public synchronized int size() { return byBlueId.size(); } + + /** Monotonic identity of the exact currently published journal content. */ + synchronized long revision() { return revision; } + + synchronized void makeHistoricalUnavailable(String diagnostic) { + historicalAvailability.makeUnavailable(diagnostic); + } + + synchronized void makeHistoricalAvailable() { + historicalAvailability.makeAvailable(); + } + + synchronized void invalidateHistoricalEvidence(String diagnostic) { + historicalAvailability.invalidateEvidence(diagnostic); + } + + /** Opens an O(1) append savepoint without copying Timeline indexes. */ + public synchronized Mark mark() { + return new Mark(globalSequence, appendOrder.size()); + } + /** Removes only entries appended after the exact savepoint. */ + public synchronized void rollbackTo(Mark mark) { + Objects.requireNonNull(mark, "mark"); + if (mark.appendOrderSize() > appendOrder.size() + || mark.globalSequence() > globalSequence) { + throw new IllegalStateException( + "Journal mark is ahead of the append frontier"); + } + long removedCount = 0L; + while (appendOrder.size() > mark.appendOrderSize()) { + TimelineEntry removed = appendOrder.remove( + appendOrder.size() - 1); + String timelineId = removed.timeline().timelineId(); + List entries = byTimeline.get(timelineId); + if (entries == null || entries.isEmpty() + || entries.get(entries.size() - 1) != removed) { + throw new IllegalStateException( + "Timeline append index is inconsistent for " + + timelineId); + } + entries.remove(entries.size() - 1); + byBlueId.remove(removed.blueId()); + externalByOrder.remove(removed.sourceOrderKey()); + if (entries.isEmpty()) { + byTimeline.remove(timelineId); + sequenceByTimeline.remove(timelineId); + previousByTimeline.remove(timelineId); + } else { + TimelineEntry previous = entries.get(entries.size() - 1); + sequenceByTimeline.put( + timelineId, previous.timelineSequence()); + previousByTimeline.put(timelineId, previous.blueId()); + } + removedCount++; + } + globalSequence = mark.globalSequence(); + if (removedCount > 0L) { + revision = Math.addExact(revision, 1L); + } + metrics.increment("journal.rollbacks"); + metrics.add("journal.rollbackEntries", removedCount); + } + /** Compact append frontier; no Timeline index or body is copied. */ + public record Mark( + long globalSequence, + int appendOrderSize) { + public Mark { + if (globalSequence < 0L || appendOrderSize < 0) { + throw new IllegalArgumentException( + "journal frontier must be non-negative"); + } + } + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/InternalProcessOutcome.java b/src/main/java/blue/coordination/internal/InternalProcessOutcome.java new file mode 100644 index 0000000..c3f56e0 --- /dev/null +++ b/src/main/java/blue/coordination/internal/InternalProcessOutcome.java @@ -0,0 +1,24 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentRevision; + +import java.util.Objects; + +/** One exact committed PROCESS result before embedded follow-up drains. */ +record InternalProcessOutcome( + DocumentSession session, + DocumentRevision revision, + EmbeddedOnlyLayout beforeLayout, + EmbeddedOnlyLayout afterLayout, + long totalNanos) { + public InternalProcessOutcome { + session = Objects.requireNonNull(session, "session"); + revision = Objects.requireNonNull(revision, "revision"); + beforeLayout = Objects.requireNonNull(beforeLayout, "beforeLayout"); + afterLayout = Objects.requireNonNull(afterLayout, "afterLayout"); + if (totalNanos < 0L) { + throw new IllegalArgumentException( + "totalNanos must be non-negative"); + } + } +} diff --git a/src/main/java/blue/coordination/internal/InvalidAdmissionEvidenceException.java b/src/main/java/blue/coordination/internal/InvalidAdmissionEvidenceException.java new file mode 100644 index 0000000..5a65089 --- /dev/null +++ b/src/main/java/blue/coordination/internal/InvalidAdmissionEvidenceException.java @@ -0,0 +1,10 @@ +package blue.coordination.internal; + +/** Deterministic supplied-state evidence that cannot identify one child epoch. */ +final class InvalidAdmissionEvidenceException extends IllegalStateException { + private static final long serialVersionUID = 1L; + + InvalidAdmissionEvidenceException(String diagnostic) { + super("Invalid admission evidence: " + diagnostic); + } +} diff --git a/src/main/java/blue/coordination/internal/OperationRouteIndex.java b/src/main/java/blue/coordination/internal/OperationRouteIndex.java new file mode 100644 index 0000000..788cdc4 --- /dev/null +++ b/src/main/java/blue/coordination/internal/OperationRouteIndex.java @@ -0,0 +1,330 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; +import blue.coordination.api.TimelineEntry; + +import blue.coordination.processor.TimelineProviderSupport; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.SubscriptionDelta; +import blue.language.snapshot.FrozenNode; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; + +/** + * Direct operation-aware index from exact external headers to managed documents. + * Large request content is not part of the lookup key. + */ +final class OperationRouteIndex { + private final Map> rows = new LinkedHashMap<>(); + private final Map> keysByDocument = + new LinkedHashMap<>(); + private final EngineMetrics metrics; + private final Function sessionResolver; + private long generation; + + public OperationRouteIndex(EngineMetrics metrics) { + this(metrics, ignored -> null); + } + + public OperationRouteIndex( + EngineMetrics metrics, + Function sessionResolver) { + this.metrics = Objects.requireNonNull(metrics, "metrics"); + this.sessionResolver = Objects.requireNonNull( + sessionResolver, "sessionResolver"); + } + + /** Replaces only one document's rows from its exact active intervals. */ + public synchronized void replace( + DocumentId documentId, + RoutingSurface surface, + List activeSubscriptions) { + Objects.requireNonNull(documentId, "documentId"); + Objects.requireNonNull(surface, "surface"); + Objects.requireNonNull(activeSubscriptions, "activeSubscriptions"); + Map subscriptions = + new LinkedHashMap<>(); + for (SubscriptionDelta.Entry subscription : activeSubscriptions) { + Objects.requireNonNull(subscription, "active subscription"); + if (!subscription.isActiveInterval()) { + throw new IllegalStateException( + "Cannot index retired subscription at " + + subscription.scopePath() + "/" + + subscription.channelKey()); + } + OccurrenceKey occurrence = new OccurrenceKey( + subscription.scopePath(), subscription.channelKey()); + if (subscriptions.putIfAbsent( + occurrence, subscription) != null) { + throw new IllegalStateException( + "Duplicate active route occurrence at " + + subscription.scopePath() + "/" + + subscription.channelKey()); + } + } + Map> inserted = new LinkedHashMap<>(); + for (RoutingSurface.Definition definition : surface.definitions()) { + SubscriptionDelta.Entry subscription = subscriptions.get( + new OccurrenceKey( + definition.scopePath(), + definition.channelKey())); + if (subscription == null) { + continue; + } + for (String subscriptionKey : subscription.subscriptionKeys()) { + RouteKey key = new RouteKey( + definition.operation(), + definition.channelKey(), + subscriptionKey); + RouteRow row = new RouteRow( + documentId, + subscription.startAfterExternalOrderKey(), + definition.sources()); + inserted.computeIfAbsent( + key, ignored -> new ArrayList<>()).add(row); + } + } + inserted.values().forEach(value -> value.sort(RouteRow.ORDER)); + // Validate and stage every exact row before replacing the currently + // published route generation. Invalid evidence cannot partially + // remove or publish one document's index rows. + Set candidates = new LinkedHashSet<>( + keysByDocument.getOrDefault(documentId, Set.of())); + candidates.addAll(inserted.keySet()); + List changed = new ArrayList<>(); + for (RouteKey key : candidates) { + List current = rows.getOrDefault(key, List.of()).stream() + .filter(row -> row.documentId().equals(documentId)) + .toList(); + if (current.equals(inserted.getOrDefault(key, List.of()))) { + metrics.increment("routing.routeKeysRetained"); + } else { + changed.add(key); + } + } + if (changed.isEmpty()) { + metrics.increment("routing.surfacePublicationsSkipped"); + return; + } + long nextGeneration = Math.addExact(generation, 1L); + for (RouteKey key : changed) { + List targets = rows.get(key); + if (targets != null) { + targets.removeIf(row -> row.documentId().equals(documentId)); + if (targets.isEmpty()) { + rows.remove(key); + } + } + targets = rows.computeIfAbsent(key, ignored -> new ArrayList<>()); + targets.addAll(inserted.getOrDefault(key, List.of())); + targets.sort(RouteRow.ORDER); + if (targets.isEmpty()) { + rows.remove(key); + } + } + if (inserted.isEmpty()) { + keysByDocument.remove(documentId); + } else { + keysByDocument.put( + documentId, new LinkedHashSet<>(inserted.keySet())); + } + generation = nextGeneration; + metrics.increment("routing.surfaceCompilations"); + metrics.add("routing.routeKeysUpdated", changed.size()); + metrics.add("routing.rowsCompiled", changed.stream() + .mapToLong(key -> inserted.getOrDefault(key, List.of()).size()) + .sum()); + } + + public synchronized List route(TimelineEntry entry) { + Objects.requireNonNull(entry, "entry"); + long started = System.nanoTime(); + metrics.increment("routing.lookups"); + DocumentTarget target = DocumentTarget.from(entry); + Set selected = new LinkedHashSet<>(); + for (String eventKey + : TimelineProviderSupport.exactTimelineEntryEventKeys( + entry.timeline().timelineId(), entry.timeline().actorId())) { + for (RouteRow row : rows.getOrDefault(new RouteKey( + entry.operation(), entry.channel(), eventKey), List.of())) { + metrics.increment("routing.rowsInspected"); + if (row.accepts(entry) + && target.accepts( + row.documentId(), sessionResolver)) { + selected.add(row.documentId()); + } + } + } + List targets = selected.stream().sorted( + EmbeddingBinding.DOCUMENT_ORDER).toList(); + metrics.add("routing.targetsSelected", targets.size()); + metrics.addNanos("process.routeLookup", System.nanoTime() - started); + return Collections.unmodifiableList(new ArrayList<>(targets)); + } + + public synchronized boolean routesTo( + DocumentId documentId, + TimelineEntry entry) { + return route(entry).contains(documentId); + } + + public synchronized void remove(DocumentId documentId) { + Objects.requireNonNull(documentId, "documentId"); + if (!keysByDocument.containsKey(documentId)) { + return; + } + long nextGeneration = Math.addExact(generation, 1L); + removeRows(documentId); + generation = nextGeneration; + } + + private void removeRows(DocumentId documentId) { + Set existing = keysByDocument.remove(documentId); + if (existing == null) { + return; + } + for (RouteKey key : existing) { + List targets = rows.get(key); + if (targets == null) { + continue; + } + targets.removeIf(row -> row.documentId().equals(documentId)); + if (targets.isEmpty()) { + rows.remove(key); + } + } + } + + public synchronized int rowCount() { + return rows.size(); + } + + /** Monotonic identity of the currently published routing surface. */ + public synchronized long generation() { + return generation; + } + + public synchronized void clear() { + if (rows.isEmpty() && keysByDocument.isEmpty()) { + return; + } + long nextGeneration = Math.addExact(generation, 1L); + rows.clear(); + keysByDocument.clear(); + generation = nextGeneration; + } + + private record RouteKey( + String operation, + String channel, + String subscriptionKey) { + private RouteKey { + operation = requireText(operation, "operation"); + channel = requireText(channel, "channel"); + subscriptionKey = requireText( + subscriptionKey, "subscriptionKey"); + } + } + + private record OccurrenceKey(String scopePath, String channelKey) { + private OccurrenceKey { + scopePath = requireText(scopePath, "scopePath"); + channelKey = requireText(channelKey, "channelKey"); + } + } + + private record RouteRow( + DocumentId documentId, + ExternalOrderKey startAfter, + List sources) { + private static final Comparator ORDER = Comparator + .comparing(RouteRow::documentId, EmbeddingBinding.DOCUMENT_ORDER) + .thenComparing(RouteRow::startAfter, + Comparator.nullsFirst(Comparator.naturalOrder())) + .thenComparing(RouteRow::sources, RoutingSurface::compareSources); + + private RouteRow { + documentId = Objects.requireNonNull(documentId, "documentId"); + sources = List.copyOf(Objects.requireNonNull(sources, "sources")); + } + + private boolean accepts(TimelineEntry entry) { + if (startAfter != null + && entry.sourceOrderKey().compareTo(startAfter) <= 0) { + return false; + } + return sources.stream().anyMatch(source -> + source.timelineId().equals(entry.timeline().timelineId()) + && source.actorId().equals( + entry.timeline().actorId())); + } + } + + private record DocumentTarget( + String stateBlueId, boolean exact, boolean supported) { + private static DocumentTarget from(TimelineEntry entry) { + if (hasRuntimeValue(entry.exactEvent() + .canonicalAt("/onBehalfOf"), false)) { + return new DocumentTarget(null, false, false); + } + FrozenNode document = entry.exactEvent() + .canonicalAt("/message/document"); + if (!hasRuntimeValue(document, true)) { + return new DocumentTarget(null, false, true); + } + FrozenNode exactVersion = entry.exactEvent().canonicalAt( + "/message/requireExactDocumentVersion"); + boolean exact = exactVersion != null + && Boolean.TRUE.equals(exactVersion.getValue()); + return new DocumentTarget( + document.isReferenceOnly() + ? document.getReferenceBlueId() + : document.blueId(), + exact, + true); + } + + private static boolean hasRuntimeValue( + FrozenNode node, boolean typeCounts) { + return node != null && (node.isReferenceOnly() + || node.getValue() != null + || node.getItems() != null && !node.getItems().isEmpty() + || node.getProperties() != null + && !node.getProperties().isEmpty() + || typeCounts && node.getType() != null); + } + + private boolean accepts( + DocumentId documentId, + Function resolver) { + if (!supported) { + return false; + } + if (stateBlueId == null) { + return true; + } + DocumentSession session = resolver.apply(documentId); + return session != null && (exact + ? session.currentRevision().after().blueId() + .equals(stateBlueId) + : session.epochForState(stateBlueId).isPresent()); + } + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshot.java b/src/main/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshot.java new file mode 100644 index 0000000..2ae298a --- /dev/null +++ b/src/main/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshot.java @@ -0,0 +1,312 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Deque; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** Immutable indexed snapshot derived only from effective Process Embedded occurrences. */ +final class ProcessEmbeddedGraphSnapshot { + private final long generation; + private final Map> childrenByParent; + private final Map> parentsByChild; + private final Map byId; + + private ProcessEmbeddedGraphSnapshot( + long generation, + List bindings) { + if (generation < 0L) { + throw new IllegalArgumentException( + "generation must be non-negative"); + } + this.generation = generation; + Map> children = + new LinkedHashMap<>(); + Map> parents = + new LinkedHashMap<>(); + Map identities = new LinkedHashMap<>(); + bindings.stream().sorted(EmbeddingBinding.GLOBAL_ORDER).forEach(binding -> { + EmbeddingBinding duplicate = identities.putIfAbsent( + binding.bindingId(), binding); + if (duplicate != null) { + throw new IllegalStateException( + "Duplicate Process Embedded binding " + + binding.bindingId()); + } + children.computeIfAbsent( + binding.parentDocumentId(), ignored -> new ArrayList<>()) + .add(binding); + parents.computeIfAbsent( + binding.childDocumentId(), ignored -> new ArrayList<>()) + .add(binding); + }); + children.values().forEach(list -> list.sort(EmbeddingBinding.GLOBAL_ORDER)); + parents.values().forEach(list -> list.sort(EmbeddingBinding.GLOBAL_ORDER)); + this.childrenByParent = immutableIndex(children); + this.parentsByChild = immutableIndex(parents); + this.byId = Collections.unmodifiableMap(identities); + validateAcyclic(); + } + + private ProcessEmbeddedGraphSnapshot( + long generation, + Map> childrenByParent, + Map> parentsByChild, + Map byId) { + this.generation = generation; + this.childrenByParent = Collections.unmodifiableMap(childrenByParent); + this.parentsByChild = Collections.unmodifiableMap(parentsByChild); + this.byId = Collections.unmodifiableMap(byId); + } + + static ProcessEmbeddedGraphSnapshot empty() { + return new ProcessEmbeddedGraphSnapshot(0L, List.of()); + } + + long generation() { + return generation; + } + + List children(DocumentId parent) { + return childrenByParent.getOrDefault( + Objects.requireNonNull(parent, "parent"), List.of()); + } + + List parents(DocumentId child) { + return parentsByChild.getOrDefault( + Objects.requireNonNull(child, "child"), List.of()); + } + + EmbeddingBinding binding(String bindingId) { + EmbeddingBinding binding = byId.get(Objects.requireNonNull( + bindingId, "bindingId")); + if (binding == null) { + throw new IllegalArgumentException( + "Unknown Process Embedded binding " + bindingId); + } + return binding; + } + + boolean containsBinding(String bindingId) { + return byId.containsKey(Objects.requireNonNull( + bindingId, "bindingId")); + } + + List bindings() { + return byId.values().stream().sorted(EmbeddingBinding.GLOBAL_ORDER).toList(); + } + + ProcessEmbeddedGraphSnapshot reconcileParent( + DocumentId parent, + List replacement) { + return reconcileParent(parent, replacement, null); + } + + ProcessEmbeddedGraphSnapshot reconcileParent( + DocumentId parent, + List replacement, + EngineMetrics metrics) { + Objects.requireNonNull(parent, "parent"); + List canonical = replacement.stream() + .peek(binding -> { + if (!binding.parentDocumentId().equals(parent)) { + throw new IllegalArgumentException( + "Replacement binding belongs to another parent"); + } + }) + .sorted(EmbeddingBinding.GLOBAL_ORDER) + .toList(); + if (children(parent).equals(canonical)) { + return this; + } + List current = children(parent); + Map> children = + new LinkedHashMap<>(childrenByParent); + if (canonical.isEmpty()) { + children.remove(parent); + } else { + children.put(parent, canonical); + } + + Map> oldByChild = byChild(current); + Map> newByChild = byChild(canonical); + Set affectedChildren = new LinkedHashSet<>(); + affectedChildren.addAll(oldByChild.keySet()); + affectedChildren.addAll(newByChild.keySet()); + affectedChildren.removeIf(child -> Objects.equals( + oldByChild.get(child), newByChild.get(child))); + Map> parents = + new LinkedHashMap<>(parentsByChild); + for (DocumentId child : affectedChildren) { + List updated = new ArrayList<>( + parents.getOrDefault(child, List.of())); + updated.removeIf(binding -> + binding.parentDocumentId().equals(parent)); + updated.addAll(newByChild.getOrDefault(child, List.of())); + updated.sort(EmbeddingBinding.GLOBAL_ORDER); + if (updated.isEmpty()) { + parents.remove(child); + } else { + parents.put(child, List.copyOf(updated)); + } + } + + Map identities = + new LinkedHashMap<>(byId); + for (EmbeddingBinding binding : current) { + identities.remove(binding.bindingId()); + } + int added = 0; + for (EmbeddingBinding binding : canonical) { + if (identities.putIfAbsent( + binding.bindingId(), binding) != null) { + throw new IllegalStateException( + "Duplicate Process Embedded binding " + + binding.bindingId()); + } + if (!current.contains(binding)) { + added++; + } + } + validateNewEdges(parent, current, canonical, children); + if (metrics != null) { + metrics.increment("temporal.graphForwardBucketsUpdated"); + metrics.add("temporal.graphReverseBucketsUpdated", + affectedChildren.size()); + metrics.add("temporal.graphBindingRecordsAdded", added); + metrics.add("temporal.graphBindingRecordsRemoved", + current.size() - canonical.size() + added); + metrics.add("temporal.graphBindingRecordsRetained", + canonical.size() - added); + } + return new ProcessEmbeddedGraphSnapshot( + Math.addExact(generation, 1L), + children, parents, identities); + } + + private static Map> byChild( + List bindings) { + Map> result = new LinkedHashMap<>(); + for (EmbeddingBinding binding : bindings) { + result.computeIfAbsent(binding.childDocumentId(), ignored -> + new ArrayList<>()).add(binding); + } + result.replaceAll((ignored, grouped) -> grouped.stream() + .sorted(EmbeddingBinding.GLOBAL_ORDER).toList()); + return result; + } + + private static void validateNewEdges( + DocumentId parent, + List current, + List replacement, + Map> children) { + for (EmbeddingBinding binding : replacement) { + if (!current.contains(binding) && reaches( + binding.childDocumentId(), parent, children, + new LinkedHashSet<>())) { + throw new IllegalStateException( + "Process Embedded cycle reaches " + parent); + } + } + } + + private static boolean reaches( + DocumentId current, + DocumentId target, + Map> children, + Set visited) { + if (current.equals(target)) { + return true; + } + return visited.add(current) && children.getOrDefault( + current, List.of()).stream().anyMatch(binding -> reaches( + binding.childDocumentId(), target, children, visited)); + } + + /** Direct targets plus every active ancestor, ordered child before parent. */ + List childFirstClosure(Set directTargets) { + LinkedHashSet closure = new LinkedHashSet<>( + Objects.requireNonNull(directTargets, "directTargets")); + Deque pending = new ArrayDeque<>(closure); + while (!pending.isEmpty()) { + DocumentId child = pending.removeFirst(); + for (EmbeddingBinding parent : parents(child)) { + if (closure.add(parent.parentDocumentId())) { + pending.addLast(parent.parentDocumentId()); + } + } + } + List result = new ArrayList<>(); + Set emitted = new LinkedHashSet<>(); + closure.stream().sorted(EmbeddingBinding.DOCUMENT_ORDER) + .forEach(document -> appendChildFirst( + document, closure, emitted, result)); + return List.copyOf(result); + } + + private void appendChildFirst( + DocumentId document, + Set closure, + Set emitted, + List result) { + if (emitted.contains(document)) { + return; + } + for (EmbeddingBinding child : children(document)) { + if (closure.contains(child.childDocumentId())) { + appendChildFirst( + child.childDocumentId(), closure, emitted, result); + } + } + if (emitted.add(document)) { + result.add(document); + } + } + + private void validateAcyclic() { + Set visited = new LinkedHashSet<>(); + Set active = new LinkedHashSet<>(); + LinkedHashSet nodes = new LinkedHashSet<>(); + byId.values().forEach(binding -> { + nodes.add(binding.parentDocumentId()); + nodes.add(binding.childDocumentId()); + }); + for (DocumentId node : nodes) { + validateAcyclic(node, visited, active); + } + } + + private void validateAcyclic( + DocumentId node, + Set visited, + Set active) { + if (visited.contains(node)) { + return; + } + if (!active.add(node)) { + throw new IllegalStateException( + "Process Embedded cycle reaches " + node); + } + for (EmbeddingBinding child : children(node)) { + validateAcyclic(child.childDocumentId(), visited, active); + } + active.remove(node); + visited.add(node); + } + + private static Map> immutableIndex( + Map> source) { + Map> result = new LinkedHashMap<>(); + source.forEach((key, value) -> result.put(key, List.copyOf(value))); + return Collections.unmodifiableMap(result); + } +} diff --git a/src/main/java/blue/coordination/internal/RoutingSurface.java b/src/main/java/blue/coordination/internal/RoutingSurface.java new file mode 100644 index 0000000..3e46ad3 --- /dev/null +++ b/src/main/java/blue/coordination/internal/RoutingSurface.java @@ -0,0 +1,310 @@ +package blue.coordination.internal; + +import blue.language.processor.EffectiveContractSnapshot; +import blue.language.processor.EffectiveContractSnapshotConstants; +import blue.language.processor.EffectiveFragmentationCatalog; +import blue.language.snapshot.FrozenNode; +import blue.repo.coordination.AllTimelinesChannel; +import blue.repo.coordination.CompositeTimelineChannel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * Immutable operation index compiled once from the authoritative effective + * contract catalog. All scopes owned by this managed document are included; + * scopes at or below Process Embedded boundaries are excluded because their + * sessions compile their own routing surfaces. + */ +final class RoutingSurface { + private static final Comparator SOURCE_ORDER = Comparator + .comparing(SourceAddress::timelineId, EmbeddingBinding.TEXT_ORDER) + .thenComparing(SourceAddress::actorId, EmbeddingBinding.TEXT_ORDER); + + public record SourceAddress(String timelineId, String actorId) { + public SourceAddress { + timelineId = requireText(timelineId, "timelineId"); + actorId = requireText(actorId, "actorId"); + } + } + + public record Definition( + String scopePath, + String operation, + String channelKey, + List sources) { + public Definition { + scopePath = requireText(scopePath, "scopePath"); + operation = requireText(operation, "operation"); + channelKey = requireText(channelKey, "channelKey"); + Set unique = new LinkedHashSet<>( + Objects.requireNonNull(sources, "sources")); + if (unique.contains(null)) { + throw new NullPointerException("source address"); + } + sources = unique.stream() + .sorted(SOURCE_ORDER) + .toList(); + } + + public Definition( + String scopePath, + String operation, + String channelKey, + String timelineId, + String actorId) { + this(scopePath, operation, channelKey, + List.of(new SourceAddress(timelineId, actorId))); + } + } + + private final List definitions; + private final boolean embeddedRevisionHandler; + + RoutingSurface( + Collection definitions, + boolean embeddedRevisionHandler) { + List ordered = new ArrayList<>(Objects.requireNonNull( + definitions, "definitions")); + ordered.sort(Comparator + .comparing(Definition::scopePath, EmbeddingBinding.TEXT_ORDER) + .thenComparing(Definition::operation, EmbeddingBinding.TEXT_ORDER) + .thenComparing(Definition::channelKey, EmbeddingBinding.TEXT_ORDER) + .thenComparing(Definition::sources, + RoutingSurface::compareSources)); + this.definitions = Collections.unmodifiableList(ordered); + this.embeddedRevisionHandler = embeddedRevisionHandler; + } + + static int compareSources( + List left, + List right) { + int shared = Math.min(left.size(), right.size()); + for (int index = 0; index < shared; index++) { + int comparison = SOURCE_ORDER.compare( + left.get(index), right.get(index)); + if (comparison != 0) return comparison; + } + return Integer.compare(left.size(), right.size()); + } + + public static RoutingSurface from( + EffectiveFragmentationCatalog catalog, + Collection managedBoundaries) { + Objects.requireNonNull(catalog, "catalog"); + Map unique = new LinkedHashMap<>(); + catalog.effectiveContractsByScope().entrySet().stream() + .sorted(Map.Entry.comparingByKey(EmbeddingBinding.TEXT_ORDER)) + .filter(entry -> owned( + entry.getKey(), managedBoundaries)) + .forEach(entry -> collect( + entry.getKey(), entry.getValue(), unique)); + boolean embeddedHandler = catalog.effectiveContractsByScope().entrySet() + .stream() + .filter(entry -> owned(entry.getKey(), managedBoundaries)) + .flatMap(entry -> entry.getValue().stream()) + .anyMatch(contract -> + EffectiveContractSnapshotConstants.Role.HANDLER.equals( + contract.role()) + && EmbeddedEpochInput.INTERNAL_OPERATION + .equals(contract.key())); + return new RoutingSurface(unique.values(), embeddedHandler); + } + + public List definitions() { + return definitions; + } + + public List externalTimelineIds() { + return definitions.stream() + .flatMap(definition -> definition.sources().stream()) + .map(SourceAddress::timelineId) + .distinct() + .sorted(EmbeddingBinding.TEXT_ORDER) + .toList(); + } + + public boolean deliversEmbeddedRevisionEvents() { + return embeddedRevisionHandler; + } + + private static void collect( + String scopePath, + List contracts, + Map unique) { + Map channels = + new LinkedHashMap<>(); + for (EffectiveContractSnapshot contract : contracts) { + if (!EffectiveContractSnapshotConstants.Role.EXTERNAL_CHANNEL + .equals(contract.role())) { + continue; + } + channels.put(contract.key(), contract); + } + for (EffectiveContractSnapshot contract : contracts) { + if (!EffectiveContractSnapshotConstants.Role.HANDLER + .equals(contract.role())) { + continue; + } + String channelKey = contract.dispatchFields().get( + EffectiveContractSnapshotConstants.DispatchField.CHANNEL); + if (channelKey == null || channelKey.isBlank()) { + continue; + } + EffectiveContractSnapshot channel = channels.get(channelKey); + if (channel == null || contract.key().equals( + EmbeddedEpochInput.INTERNAL_OPERATION)) { + continue; + } + List sources = sourcesFor(channel, channels) + .stream() + .filter(source -> !source.timelineId().startsWith( + "coordination/internal/")) + .filter(source -> !source.actorId().equals( + "coordination")) + .toList(); + Definition definition = new Definition( + scopePath, + contract.key(), + channelKey, + sources); + unique.putIfAbsent(definition, definition); + } + } + + private static List sourcesFor( + EffectiveContractSnapshot channel, + Map channels) { + FrozenNode timeline = channel.headerFields().get("timeline"); + FrozenNode actor = channel.headerFields().get("actor"); + if (timeline != null || actor != null) { + return List.of(new SourceAddress( + scalarProperty(timeline, "timelineId", channel.key()), + scalarProperty(actor, "accountId", channel.key()))); + } + if (CompositeTimelineChannel.blueId().equals( + channel.effectiveTypeBlueId())) { + List result = new ArrayList<>(); + for (String memberKey : textItems( + channel.headerFields().get("channels"), channel.key())) { + EffectiveContractSnapshot member = channels.get(memberKey); + if (member == null) { + throw new IllegalStateException( + "Composite Timeline Channel " + channel.key() + + " has no external member " + memberKey); + } + result.addAll(requireDirectTimelineSources( + member, channel.key())); + } + return result; + } + if (AllTimelinesChannel.blueId().equals( + channel.effectiveTypeBlueId())) { + List result = new ArrayList<>(); + channels.values().stream() + .filter(candidate -> candidate != channel) + .forEach(candidate -> result.addAll( + directTimelineSources(candidate))); + return result; + } + throw new IllegalStateException( + "Unsupported external Channel routing type " + + channel.effectiveTypeBlueId() + " at " + + channel.scopePath() + "/" + channel.key()); + } + + private static List requireDirectTimelineSources( + EffectiveContractSnapshot member, + String compositeKey) { + List result = directTimelineSources(member); + if (result.isEmpty()) { + throw new IllegalStateException( + "Composite Timeline Channel " + compositeKey + + " member " + member.key() + + " has no direct Timeline/Actor binding"); + } + return result; + } + + private static List directTimelineSources( + EffectiveContractSnapshot channel) { + FrozenNode timeline = channel.headerFields().get("timeline"); + FrozenNode actor = channel.headerFields().get("actor"); + if (timeline == null && actor == null) { + return List.of(); + } + return List.of(new SourceAddress( + scalarProperty(timeline, "timelineId", channel.key()), + scalarProperty(actor, "accountId", channel.key()))); + } + + private static List textItems( + FrozenNode value, + String channelKey) { + if (value == null || value.getItems() == null + || value.getItems().isEmpty()) { + throw new IllegalStateException( + "Composite Timeline Channel " + channelKey + + " requires member keys"); + } + List result = new ArrayList<>(); + for (FrozenNode item : value.getItems()) { + Object scalar = item.getValue(); + if (!(scalar instanceof String text) || text.isBlank()) { + throw new IllegalStateException( + "Composite Timeline Channel " + channelKey + + " has a non-Text member key"); + } + result.add(text); + } + return result; + } + + private static boolean owned( + String scopePath, + Collection managedBoundaries) { + for (String boundary : Objects.requireNonNull( + managedBoundaries, "managedBoundaries")) { + if (scopePath.equals(boundary) + || scopePath.startsWith(boundary + "/")) { + return false; + } + } + return true; + } + + private static String scalarProperty( + FrozenNode owner, + String property, + String channelKey) { + if (owner == null) { + throw new IllegalStateException( + "External channel " + channelKey + " has no " + property + + " owner"); + } + FrozenNode selected = owner.property(property); + Object value = selected == null ? null : selected.getValue(); + if (!(value instanceof String text) || text.isBlank()) { + throw new IllegalStateException( + "External channel " + channelKey + " has no Text " + + property); + } + return text; + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java b/src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java new file mode 100644 index 0000000..b78bc56 --- /dev/null +++ b/src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java @@ -0,0 +1,2805 @@ +package blue.coordination.internal; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationEngine.DrainBudget; +import blue.coordination.api.DocumentDispatchOutcome; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.TimelineEntry; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.SubscriptionDelta; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.LongSupplier; +import java.util.function.Consumer; + +final class SequentialDrainCoordinator { + private final BlueRuntime runtime; + private final WholeObjectStore objects; + private final WholeRequestEntryFactory entryFactory; + private final InMemoryTimelineJournal journal; + private final OperationRouteIndex routes; + private final DocumentTransitionProcessor processor; + private final InMemoryDocumentStore documents; + private final EngineMetrics metrics; + private final LongSupplier applicationTimestamp; + private final Consumer + failureInjector; + private Consumer transitionObserver; + private final RecoveryState recoveryState; + private final Map cursors; + private final Map + embeddedAdmissions; + private final Map + exactEmbeddedAdmissions; + private final Map barriers; + private final Map openBarrierByParent; + private final Map activationGenerations; + private final Map openFrames; + private final Set rejectedExternalEntryIds; + private final Map + pendingTopLevelAdmissions; + private final Map> outcomesByEntry = + new LinkedHashMap<>(); + private final Map embeddedInputHeadByParent; + private final Map committedEmbeddedInputs; + private final List publicationCheckpoints = + new ArrayList<>(); + private ProcessEmbeddedGraphSnapshot graph = + ProcessEmbeddedGraphSnapshot.empty(); + private ExternalOrderKey processedThrough; + private long committedTransitionSequence; + private boolean settlingBarrierTree; + private DrainBudget activeBudget; + private long drainSequenceBefore; + private final Set drainSelectedEntries = new LinkedHashSet<>(); + private Map> drainOutcomes; + + SequentialDrainCoordinator( + BlueRuntime runtime, + WholeObjectStore objects, + WholeRequestEntryFactory entryFactory, + InMemoryTimelineJournal journal, + OperationRouteIndex routes, + DocumentTransitionProcessor processor, + InMemoryDocumentStore documents, + EngineMetrics metrics, + LongSupplier applicationTimestamp, + Consumer failureInjector) { + this( + runtime, + objects, + entryFactory, + journal, + routes, + processor, + documents, + metrics, + applicationTimestamp, + failureInjector, + new RecoveryState()); + } + + private SequentialDrainCoordinator( + BlueRuntime runtime, + WholeObjectStore objects, + WholeRequestEntryFactory entryFactory, + InMemoryTimelineJournal journal, + OperationRouteIndex routes, + DocumentTransitionProcessor processor, + InMemoryDocumentStore documents, + EngineMetrics metrics, + LongSupplier applicationTimestamp, + Consumer failureInjector, + RecoveryState recoveryState) { + this.runtime = Objects.requireNonNull(runtime, "runtime"); + this.objects = Objects.requireNonNull(objects, "objects"); + this.entryFactory = Objects.requireNonNull( + entryFactory, "entryFactory"); + this.journal = Objects.requireNonNull(journal, "journal"); + this.routes = Objects.requireNonNull(routes, "routes"); + this.processor = Objects.requireNonNull(processor, "processor"); + this.documents = Objects.requireNonNull(documents, "documents"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + this.applicationTimestamp = Objects.requireNonNull( + applicationTimestamp, "applicationTimestamp"); + this.failureInjector = Objects.requireNonNull( + failureInjector, "failureInjector"); + this.recoveryState = Objects.requireNonNull( + recoveryState, "recoveryState"); + this.cursors = recoveryState.cursors; + this.embeddedAdmissions = recoveryState.embeddedAdmissions; + this.exactEmbeddedAdmissions = recoveryState.exactEmbeddedAdmissions; + this.barriers = recoveryState.barriers; + this.openBarrierByParent = recoveryState.openBarrierByParent; + this.activationGenerations = recoveryState.activationGenerations; + this.openFrames = recoveryState.openFrames; + this.rejectedExternalEntryIds = + recoveryState.rejectedExternalEntryIds; + this.pendingTopLevelAdmissions = + recoveryState.pendingTopLevelAdmissions; + this.embeddedInputHeadByParent = + recoveryState.embeddedInputHeadByParent; + this.committedEmbeddedInputs = recoveryState.committedEmbeddedInputs; + this.graph = recoveryState.graph; + this.processedThrough = recoveryState.processedThrough; + this.committedTransitionSequence = + recoveryState.committedTransitionSequence; + validateRecoveredState(); + } + + synchronized SequentialDrainCoordinator restartFromStores( + Consumer + restartedFailureInjector) { + if (!publicationCheckpoints.isEmpty()) { + throw new IllegalStateException( + "Cannot restart inside a publication savepoint"); + } + metrics.increment("temporal.coordinatorRestarts"); + return new SequentialDrainCoordinator( + runtime, + objects, + entryFactory, + journal, + routes, + processor, + documents, + metrics, + applicationTimestamp, + restartedFailureInjector, + recoveryState); + } + + synchronized void observeTransitions(Consumer observer) { + transitionObserver = Objects.requireNonNull(observer, "observer"); + } + synchronized ProcessingDrainReceipt drain( + ExternalOrderKey inclusiveCutoff, DrainBudget budget) { + long started = System.nanoTime(); + long sequenceBefore = committedTransitionSequence; + List processed = new ArrayList<>(); + Map> publicOutcomes = + new LinkedHashMap<>(); + boolean prerequisitesReady = false; + boolean paused = false; + if (activeBudget != null) { + throw new IllegalStateException("A drain is already active"); + } + DrainBudget checkedBudget = Objects.requireNonNull(budget, "budget"); + activeBudget = checkedBudget.maxCommittedProcessTransitions() + == Long.MAX_VALUE && checkedBudget.maxSelectedEntries() + == Long.MAX_VALUE ? null : checkedBudget; + drainSequenceBefore = sequenceBefore; + drainOutcomes = publicOutcomes; + try { + completePendingAdmissionInitializations(); + prerequisitesReady = settleOpenBarriers() + && resumeTopLevelAdmissions(); + while (prerequisitesReady) { + Optional next = journal.nextExternal( + processedThrough, inclusiveCutoff); + if (next.isEmpty()) { + break; + } + TimelineEntry entry = next.orElseThrow(); + List outcomes; + try { + outcomes = processEntry(entry); + } catch (DeferredWorkException deferred) { + prerequisitesReady = false; + break; + } catch (RejectableExternalEntryException rejected) { + rejectExternalEntry(entry, rejected); + throw rejected.failure(); + } + outcomesByEntry.put(entry.blueId(), List.copyOf(outcomes)); + processedThrough = entry.sourceOrderKey(); + recoveryState.processedThrough = processedThrough; + openFrames.remove(entry.blueId()); + processed.add(entry); + metrics.increment("temporal.externalEntriesCompleted"); + completePendingAdmissionInitializations(); + prerequisitesReady = settleOpenBarriers() + && resumeTopLevelAdmissions(); + } + } catch (DrainPausedException ignored) { + paused = true; + metrics.increment("temporal.drainsPaused"); + } finally { + activeBudget = null; + drainOutcomes = null; + drainSelectedEntries.clear(); + } + long elapsed = System.nanoTime() - started; + metrics.addNanos("temporal.drain", elapsed); + boolean quiescent = !paused + && journal.nextExternal(processedThrough, inclusiveCutoff) + .isEmpty() && openBarrierByParent.isEmpty() + && pendingTopLevelAdmissions.isEmpty() + && prerequisitesReady; + return new ProcessingDrainReceipt( + processed, + publicOutcomes, + processedThrough, + quiescent, + paused, + committedTransitionSequence - sequenceBefore, + elapsed); + } + + private void rejectExternalEntry( + TimelineEntry entry, + RejectableExternalEntryException rejected) { + if (!entry.blueId().equals(rejected.entryBlueId())) { + throw new IllegalStateException( + "Rejected-entry identity does not match selected entry"); + } + EntryFrame frame = openFrames.get(entry.blueId()); + if (frame == null || frame.directTargets().size() != 1) { + return; + } + if (!rejectedExternalEntryIds.add(entry.blueId())) { + throw new IllegalStateException( + "External entry was already rejected " + entry.blueId()); + } + processedThrough = entry.sourceOrderKey(); + recoveryState.processedThrough = processedThrough; + openFrames.remove(entry.blueId()); + outcomesByEntry.remove(entry.blueId()); + metrics.increment("temporal.externalEntriesRejected"); + } + + synchronized void admitTopLevel( + DocumentSession session, + CoordinationEngine.AdmissionPolicy policy, + ExternalOrderKey verifiedFrontier) { + Objects.requireNonNull(session, "session"); + Objects.requireNonNull(policy, "policy"); + ExternalOrderKey cutoff = journal.latestExternalOrder(); + if (cutoff == null) { + cutoff = session.readyThrough(); + } + ExternalOrderKey after = switch (policy) { + case FULL_HISTORY -> null; + case FROM_FRONTIER -> Objects.requireNonNull( + verifiedFrontier, + "verifiedFrontier is required for FROM_FRONTIER"); + case FROM_NOW -> cutoff; + }; + if (policy != CoordinationEngine.AdmissionPolicy.FROM_NOW) { + pendingTopLevelAdmissions.put(session.documentId(), + new PendingTopLevelAdmission(after, cutoff)); + session.markCatchingUp(); + } + if (!session.layout().directOccurrences().isEmpty()) { + TransitionCause cause = TransitionCause.admission(session, cutoff); + GraphDelta delta = previewGraphDelta( + session, + session.layout().directOccurrences(), + cause); + publishGraph(session, delta, cause); + if (policy == CoordinationEngine.AdmissionPolicy.FROM_NOW) { + if (!settleBarrierFor(session.documentId())) { + return; + } + } else { + completeAdmissionInitializationBarrier( + session.documentId()); + } + } else { + metrics.timed("temporal.graphPublication", + session::markGraphPublished); + } + if (policy != CoordinationEngine.AdmissionPolicy.FROM_NOW + && !resumeTopLevelAdmissions()) { + return; + } + publishReadyIfSynchronized(session, cutoff); + } + + synchronized boolean retainFailedAdmission(DocumentId documentId) { + DocumentId id = Objects.requireNonNull(documentId, "documentId"); + DocumentSession session = documents.find(id).orElse(null); + boolean recoverable = session != null + && (session.status() == SessionStatus.BLOCKED + || session.epoch() > 0L + || openBarrierByParent.containsKey(id) + || !graph.children(id).isEmpty()); + if (!recoverable) { + pendingTopLevelAdmissions.remove(id); + } + return recoverable; + } + + synchronized void configureEmbeddedAdmission( + DocumentId documentId, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough) { + Objects.requireNonNull(documentId, "documentId"); + validateAdmission(mode, verifiedCompleteThrough); + if (!graph.parents(documentId).isEmpty()) { + throw new IllegalStateException( + "Cannot change admission evidence for an active child " + + documentId); + } + embeddedAdmissions.put(documentId, new EmbeddedAdmissionEvidence( + documentId, null, null, mode, verifiedCompleteThrough, + "local-journal-complete|" + documentId + "|" + + verifiedCompleteThrough, null)); + } + + synchronized void configureEmbeddedAdmission( + DocumentId parentDocumentId, + String absoluteChildPath, + DocumentId childDocumentId, + String admittedStateBlueId, + Long admittedEpoch, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough, + String completenessProofIdentity, + String expectedAttachmentEntryBlueId) { + OccurrenceKey key = new OccurrenceKey( + Objects.requireNonNull(parentDocumentId, "parentDocumentId"), + requireAbsolutePath(absoluteChildPath)); + DocumentId child = Objects.requireNonNull( + childDocumentId, "childDocumentId"); + String state = requireText(admittedStateBlueId, "admittedStateBlueId"); + String proof = requireText( + completenessProofIdentity, "completenessProofIdentity"); + String entry = requireText(expectedAttachmentEntryBlueId, + "expectedAttachmentEntryBlueId"); + if (admittedEpoch != null && admittedEpoch < 0L) { + throw new IllegalArgumentException( + "admittedEpoch must be non-negative"); + } + validateAdmission(mode, verifiedCompleteThrough); + if (journal.byBlueId(entry).isEmpty()) { + throw new IllegalArgumentException( + "Attachment entry has no exact retained journal evidence"); + } + if (graph.children(parentDocumentId).stream().anyMatch(binding -> + binding.absolutePath().equals(absoluteChildPath))) { + throw new IllegalStateException( + "Cannot configure admission for an active occurrence " + key); + } + EmbeddedAdmissionEvidence plan = new EmbeddedAdmissionEvidence( + child, state, admittedEpoch, mode, verifiedCompleteThrough, + proof, entry); + if (exactEmbeddedAdmissions.putIfAbsent(key, plan) != null) { + throw new IllegalStateException( + "Admission plan already exists for " + key); + } + } + + private void validateAdmission( + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough) { + Objects.requireNonNull(mode, "mode"); + boolean requiresFrontier = mode == ActivationMode.IMPORT_FROM_FRONTIER + || mode == ActivationMode.ATTACH_CURRENT_STATE; + if (requiresFrontier != (verifiedCompleteThrough != null)) { + throw new IllegalArgumentException(mode + (requiresFrontier + ? " requires verified completeness evidence" + : " does not accept a completeness frontier")); + } + if (verifiedCompleteThrough != null + && !journal.containsExternalOrder(verifiedCompleteThrough)) { + throw new IllegalArgumentException( + "Completeness frontier has no exact retained journal evidence"); + } + } + + private static String requireAbsolutePath(String value) { + String path = requireText(value, "absoluteChildPath"); + if (!path.startsWith("/")) { + throw new IllegalArgumentException( + "absoluteChildPath must be a JSON Pointer"); + } + return path; + } + + private static String requireText(String value, String label) { + String text = Objects.requireNonNull(value, label); + if (text.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return text; + } + + synchronized ExternalOrderKey processedThrough() { + return processedThrough; + } + + synchronized ProcessEmbeddedGraphSnapshot graphSnapshot() { + return graph; + } + + synchronized String applicationReadinessFailure(DocumentSession session) { + Objects.requireNonNull(session, "session"); + if (!session.isLocallyReady()) { + return "session status/epoch publication is incomplete: status=" + + session.status() + ", epoch=" + session.epoch() + + ", readyEpoch=" + session.readyEpoch() + + ", graphPublishedEpoch=" + + session.graphPublishedEpoch(); + } + return synchronizationFailure(session); + } + + private String synchronizationFailure(DocumentSession session) { + DocumentId documentId = session.documentId(); + if (openBarrierByParent.containsKey(documentId)) { + return "an embedded catch-up barrier remains open"; + } + if (pendingTopLevelAdmissions.containsKey(documentId)) { + return "top-level historical admission remains pending"; + } + List bindings = graph.children(documentId); + if (bindings.isEmpty() + && session.layout().directOccurrences().isEmpty()) { + return null; + } + Map occurrences = byPath( + session.layout().directOccurrences()); + if (occurrences.size() != bindings.size()) { + return "published graph does not match current Process Embedded " + + "occurrence count"; + } + for (EmbeddingBinding binding : bindings) { + EmbeddedOccurrence occurrence = occurrences.get( + binding.absolutePath()); + if (occurrence == null || !occurrence.childDocumentId().equals( + binding.childDocumentId())) { + return "published graph does not match current occurrence at " + + binding.absolutePath(); + } + EmbeddedEpochCursor cursor = cursors.get(binding.bindingId()); + if (cursor == null) { + return "missing embedded epoch cursor for " + + binding.bindingId(); + } + DocumentSession child = documents.find( + binding.childDocumentId()).orElse(null); + if (child == null) { + return "missing managed child " + binding.childDocumentId(); + } + if (cursor.appliedChildEpoch() != child.epoch()) { + return "parent cursor " + cursor.appliedChildEpoch() + + " is behind child epoch " + child.epoch() + + " at " + binding.absolutePath(); + } + String expected = child.revision( + cursor.appliedChildEpoch()).after().blueId(); + String actual = session.currentRevision().after() + .canonicalBlueIdAt(binding.absolutePath()); + if (!expected.equals(actual)) { + return "parent state/cursor mismatch at " + + binding.absolutePath(); + } + } + return null; + } + + synchronized List bindingsForParent(DocumentId parent) { + return graph.children(parent); + } + + synchronized EmbeddedEpochCursor cursor(String bindingId) { + EmbeddedEpochCursor cursor = cursors.get(bindingId); + if (cursor == null) { + throw new IllegalArgumentException( + "Unknown embedded cursor " + bindingId); + } + return cursor; + } + + synchronized List barrierEvidence() { + return barriers.values().stream() + .map(CatchUpBarrier::copy) + .toList(); + } + + synchronized Set effectiveTimelineIds(DocumentId documentId) { + LinkedHashSet result = new LinkedHashSet<>(); + collectTimelineIds(documentId, result, new LinkedHashSet<>()); + return Collections.unmodifiableSet(result); + } + + private void selectEntry(TimelineEntry entry) { + String id = entry.blueId(); + if (activeBudget == null) { + return; + } + if (!drainSelectedEntries.contains(id) && drainSelectedEntries.size() + >= activeBudget.maxSelectedEntries()) { + throw DrainPausedException.INSTANCE; + } + drainSelectedEntries.add(id); + } + + private void requireTransitionBudget() { + if (activeBudget != null && committedTransitionSequence + - drainSequenceBefore + >= activeBudget.maxCommittedProcessTransitions()) { + throw DrainPausedException.INSTANCE; + } + } + + private void recordDrainOutcome( + String entryBlueId, InternalProcessOutcome outcome) { + if (drainOutcomes != null) { + drainOutcomes.computeIfAbsent(entryBlueId, + ignored -> new ArrayList<>()).add(publicOutcome(outcome)); + } + } + + private List processEntry(TimelineEntry entry) { + EntryFrame frame = openFrames.computeIfAbsent( + entry.blueId(), ignored -> new EntryFrame( + entry, + graph, + new LinkedHashSet<>(routes.route(entry)))); + return processEntryFrame(frame, null); + } + + private List processEntryFrame( + EntryFrame frame, + Set admittedSubtree) { + selectEntry(frame.entry()); + List outcomes = new ArrayList<>(); + ExternalOrderKey frameCutoff = exclusiveAfter( + frame.entry().sourceOrderKey()); + for (DocumentId documentId : frame.graph() + .childFirstClosure(frame.directTargets())) { + if (admittedSubtree != null + && !admittedSubtree.contains(documentId)) { + continue; + } + applyPendingChildren( + documentId, frame.graph(), outcomes, frameCutoff); + if (frame.directTargets().contains(documentId)) { + processExternalDocument( + documents.require(documentId), + frame.entry(), + outcomes, + null); + } + } + return outcomes; + } + + private long processHistoricalTargets( + TimelineEntry entry, + Set directTargets, + List outcomes, + ExternalOrderKey catchUpCutoff) { + selectEntry(entry); + ProcessEmbeddedGraphSnapshot snapshot = graph; + long processedTargets = 0L; + List childFirst = snapshot + .childFirstClosure(directTargets).stream() + .filter(directTargets::contains) + .toList(); + for (DocumentId documentId : childFirst) { + applyPendingChildren( + documentId, + snapshot, + outcomes, + exclusiveAfter(entry.sourceOrderKey())); + DocumentSession session = documents.require(documentId); + boolean alreadyProcessed = session.hasTerminalEntry( + entry.blueId()); + processExternalDocument( + session, entry, outcomes, catchUpCutoff); + if (!alreadyProcessed) { + processedTargets++; + } + } + return processedTargets; + } + + private void processExternalDocument( + DocumentSession session, + TimelineEntry entry, + List outcomes, + ExternalOrderKey catchUpCutoff) { + TransitionCause externalCause = catchUpCutoff == null + ? TransitionCause.external(entry) + : TransitionCause.external(entry, catchUpCutoff); + if (session.hasTerminalEntry(entry.blueId())) { + metrics.increment("temporal.externalProcessDeduplicated"); + DocumentRevision committed = session.revisionForEntry( + entry.blueId()).orElseThrow(() -> + new IllegalStateException( + "Committed entry receipt has no revision " + + entry.blueId())); + String retryCounter = session.graphPublishedEpoch() + < session.epoch() + ? "temporal.parentProcessRerunsOnGraphRetry" + : graph.parents(session.documentId()).isEmpty() + ? null + : "temporal.childProcessRerunsOnParentRetry"; + long processCallsBefore = metrics.counter( + "process.externalInvocationsStarted"); + try { + reconcileCommittedTransition(session, externalCause); + } finally { + if (retryCounter != null) { + metrics.add(retryCounter, metrics.counter( + "process.externalInvocationsStarted") + - processCallsBefore); + } + } + outcomes.add(new InternalProcessOutcome( + session, + committed, + session.layout(), + session.layout(), + 0L)); + return; + } + if (session.status() == SessionStatus.CATCHING_UP) { + requireBarrierReady(session.documentId()); + } + if (session.status() == SessionStatus.BLOCKED + || session.status() == SessionStatus.TERMINATED) { + throw new IllegalStateException( + "Document " + session.documentId() + + " cannot process external work while " + + session.status()); + } + requireTransitionBudget(); + EngineMetrics.MetricsSnapshot traceBefore = transitionObserver == null + ? null : metrics.snapshot(); + long traceStarted = traceBefore == null ? 0L : System.nanoTime(); + DocumentTransitionProcessor.Prepared prepared = + processor.prepare(session, entry); + TransitionCause cause = externalCause; + GraphDelta delta = graphDelta( + session, + prepared.beforeLayout().directOccurrences(), + prepared.afterLayout().directOccurrences(), + cause); + boolean routePublicationRequired = routesChanged( + prepared.beforeLayout(), session.activeSubscriptions(), + prepared.afterLayout(), prepared.activeSubscriptionsAfter()); + try { + preflightGraphDelta(delta, cause); + } catch (InvalidAdmissionEvidenceException invalid) { + throw RejectableExternalEntryException.forEntry(entry, invalid); + } + failureInjector.accept(DefaultCoordinationEngine.FailurePoint + .BEFORE_COMMIT_VALIDATION); + InternalProcessOutcome outcome = metrics.timed( + "process.commitReadinessPublication", + () -> processor.commit(prepared)); + markContainingDocumentsCatchingUp(session.documentId()); + if (!graph.parents(session.documentId()).isEmpty()) { + metrics.increment("temporal.childEpochsCommitted"); + } + committedTransitionSequence = Math.addExact( + committedTransitionSequence, 1L); + recoveryState.committedTransitionSequence = + committedTransitionSequence; + recordDrainOutcome(entry.blueId(), outcome); + metrics.increment("deliveryReceiptsCommitted"); + publishCommittedTransition( + session, delta, cause, routePublicationRequired); + publishReadyIfSynchronized(session, cause.cutoff()); + failureInjector.accept(DefaultCoordinationEngine.FailurePoint + .AFTER_STATE_SWAP_BEFORE_RETURN); + outcomes.add(outcome); + metrics.increment("temporal.externalProcessCalls"); + requireBarrierReady(session.documentId()); + trace(outcome.session(), outcome.revision(), traceBefore, traceStarted); + } + + private void publishReadyIfSynchronized( + DocumentSession session, + ExternalOrderKey cutoff) { + long started = System.nanoTime(); + String failure = synchronizationFailure(session); + if (failure != null) { + session.markCatchingUp(); + metrics.increment("temporal.readyPublicationDeferred"); + metrics.addNanos("process.commitReadinessPublication", + System.nanoTime() - started); + return; + } + session.markReady(cutoff); + metrics.addNanos("process.commitReadinessPublication", + System.nanoTime() - started); + } + private void markContainingDocumentsCatchingUp(DocumentId childId) { + List parents = graph.parents(childId); + if (parents.isEmpty()) { + return; + } + DocumentSession child = documents.require(childId); + for (EmbeddingBinding binding : parents) { + EmbeddedEpochCursor cursor = cursors.get(binding.bindingId()); + if (cursor == null || cursor.appliedChildEpoch() >= child.epoch()) { + continue; + } + DocumentSession parent = documents.require( + binding.parentDocumentId()); + if (parent.status() == SessionStatus.BLOCKED + || parent.status() == SessionStatus.TERMINATED) { + metrics.increment("temporal.parentLagRetainedWhileNonReady"); + continue; + } + parent.markCatchingUp(); + metrics.increment("temporal.parentsMarkedBehind"); + } + } + private void requireBarrierReady(DocumentId parent) { + if (!settleBarrierFor(parent)) { + throw DeferredWorkException.INSTANCE; + } + } + + private void applyPendingChildren( + DocumentId parentId, + ProcessEmbeddedGraphSnapshot snapshot, + List outcomes) { + applyPendingChildren(parentId, snapshot, outcomes, null); + } + + private void applyPendingChildren( + DocumentId parentId, + ProcessEmbeddedGraphSnapshot snapshot, + List outcomes, + ExternalOrderKey cutoffExclusive) { + for (EmbeddingBinding binding : snapshot.children(parentId)) { + if (!graph.containsBinding(binding.bindingId())) { + continue; + } + applyAllAvailable(binding, outcomes, cutoffExclusive); + } + } + + private void applyAllAvailable( + EmbeddingBinding binding, + List outcomes, + ExternalOrderKey cutoffExclusive) { + DocumentSession child = documents.require( + binding.childDocumentId()); + while (true) { + EmbeddedEpochCursor cursor = cursors.get(binding.bindingId()); + if (cursor == null || cursor.appliedChildEpoch() >= child.epoch()) { + return; + } + DocumentRevision revision = child.revision( + cursor.appliedChildEpoch() + 1L); + if (cutoffExclusive != null + && revision.kind() != DocumentRevision.Kind.INITIALIZATION + && revision.sourceOrderKey().map(order -> + order.compareTo(cutoffExclusive) >= 0) + .orElse(false)) { + return; + } + applyChildRevision(binding, revision, outcomes); + } + } + + private void applyChildRevision( + EmbeddingBinding binding, + DocumentRevision childRevision, + List outcomes) { + DocumentSession parent = documents.require( + binding.parentDocumentId()); + String inputId = embeddedTransitionReceiptId( + binding.bindingId(), childRevision.epoch()); + EmbeddedEpochCursor current = cursors.get(binding.bindingId()); + if (parent.hasTransitionReceipt(inputId)) { + EmbeddedEpochInput committedInput = committedEmbeddedInputs.get( + inputId); + requireCommittedEmbeddedInput( + parent, binding, childRevision, committedInput, inputId); + TransitionCause cause = TransitionCause.embedded(committedInput); + reconcileCommittedTransition(parent, cause); + recordCursor(binding.bindingId()); + cursors.put(binding.bindingId(), + current.advanceTo(childRevision.epoch())); + publishReadyIfSynchronized(parent, cause.cutoff()); + metrics.increment("temporal.embeddedCommitCompanionRecoveries"); + return; + } + requireTransitionBudget(); + EngineMetrics.MetricsSnapshot traceBefore = transitionObserver == null + ? null : metrics.snapshot(); + long traceStarted = traceBefore == null ? 0L : System.nanoTime(); + long inputStarted = System.nanoTime(); + EmbeddedEpochInput input = EmbeddedEpochInput.create( + entryFactory, + objects, + binding, + childRevision, + applicationTimestamp.getAsLong(), + embeddedInputHeadByParent.get( + binding.parentDocumentId())); + if (!inputId.equals(input.inputId())) { + throw new IllegalStateException( + "Embedded input identity does not match its receipt"); + } + long inputNanos = System.nanoTime() - inputStarted; + metrics.addNanos("process.embeddedInputPreparation", inputNanos); + metrics.addNanos("process.hostBeforeFrozen", inputNanos); + DocumentTransitionProcessor.PreparedEmbedded prepared = + processor.prepareEmbedded(parent, input); + TransitionCause cause = TransitionCause.embedded(input); + GraphDelta delta = graphDelta( + parent, + prepared.beforeLayout().directOccurrences(), + prepared.afterLayout().directOccurrences(), + cause); + boolean routePublicationRequired = routesChanged( + prepared.beforeLayout(), parent.activeSubscriptions(), + prepared.afterLayout(), prepared.activeSubscriptionsAfter()); + preflightGraphDelta(delta, cause); + InternalProcessOutcome outcome = metrics.timed( + "process.commitReadinessPublication", + () -> processor.commitEmbedded(prepared)); + EmbeddedEpochInput duplicate = committedEmbeddedInputs.putIfAbsent( + inputId, input); + if (duplicate != null) { + throw new IllegalStateException( + "Duplicate committed embedded input evidence " + inputId); + } + if (childRevision.kind() == DocumentRevision.Kind.INITIALIZATION) { + metrics.increment("temporal.initializationEpochApplications"); + metrics.add("temporal.initializationEventOccurrencesForwarded", + childRevision.emittedEvents().size()); + } + markContainingDocumentsCatchingUp(parent.documentId()); + committedTransitionSequence = Math.addExact( + committedTransitionSequence, 1L); + recoveryState.committedTransitionSequence = + committedTransitionSequence; + recordDrainOutcome(cause.entryBlueId(), outcome); + metrics.increment("revisionApplicationReceiptsCommitted"); + recordEmbeddedInputHead(parent.documentId()); + embeddedInputHeadByParent.put( + parent.documentId(), input.exactEvent().blueId()); + publishCommittedTransition( + parent, delta, cause, routePublicationRequired); + failureInjector.accept(DefaultCoordinationEngine.FailurePoint + .AFTER_APPLYING_CHILD_REVISION); + recordCursor(binding.bindingId()); + cursors.put(binding.bindingId(), + current.advanceTo(childRevision.epoch())); + publishReadyIfSynchronized(parent, cause.cutoff()); + outcomes.add(outcome); + metrics.increment("temporal.parentEpochApplications"); + metrics.increment("catchUp.parentRevisionApplications"); + metrics.increment("childRevisionApplications"); + trace(outcome.session(), outcome.revision(), traceBefore, traceStarted); + } + + private static void requireCommittedEmbeddedInput( + DocumentSession parent, + EmbeddingBinding binding, + DocumentRevision childRevision, + EmbeddedEpochInput committedInput, + String inputId) { + if (committedInput == null) { + throw new IllegalStateException( + "Committed embedded receipt has no retained input evidence " + + inputId); + } + String expectedBefore = childRevision.before() + .map(value -> value.blueId()) + .orElse(binding.admittedChildBlueId()); + ExternalOrderKey expectedOrder = childRevision.sourceOrderKey() + .orElse(binding.attachmentOrder()); + String expectedOriginalEntry = childRevision.causalEntryBlueId() + .orElse(null); + if (!inputId.equals(committedInput.inputId()) + || !binding.equals(committedInput.binding()) + || committedInput.fromChildEpoch() + != childRevision.epoch() - 1L + || committedInput.toChildEpoch() != childRevision.epoch() + || !expectedBefore.equals( + committedInput.beforeChildBlueId()) + || !childRevision.after().blueId().equals( + committedInput.afterChildBlueId()) + || !expectedOrder.equals(committedInput.sourceOrder()) + || !Objects.equals(expectedOriginalEntry, + committedInput.originalEntryBlueId())) { + throw new IllegalStateException( + "Committed embedded input evidence does not match receipt " + + inputId); + } + DocumentRevision committed = parent.currentRevision(); + String expectedCausalEntry = expectedOriginalEntry == null + ? binding.attachmentEntryBlueId() + : expectedOriginalEntry; + DocumentRevision.CatchUpCause catchUpCause = committed.catchUpCause() + .orElseThrow(() -> new IllegalStateException( + "Committed embedded revision has no catch-up cause " + + inputId)); + if (committed.kind() + != DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION + || !expectedOrder.equals( + committed.sourceOrderKey().orElse(null)) + || !expectedCausalEntry.equals( + committed.causalEntryBlueId().orElse(null)) + || !binding.parentDocumentId().equals( + catchUpCause.parentDocumentId()) + || !binding.attachmentEntryBlueId().equals( + catchUpCause.attachmentEntryBlueId()) + || !binding.absolutePath().equals( + catchUpCause.occurrencePath()) + || binding.attachmentTimestampMicros() + != catchUpCause.attachmentTimestampMicros()) { + throw new IllegalStateException( + "Committed parent revision does not match embedded receipt " + + inputId); + } + } + + private GraphDelta previewGraphDelta( + DocumentSession parent, + List afterOccurrences, + TransitionCause cause) { + Map after = byPath(afterOccurrences); + List retained = new ArrayList<>(); + List removed = new ArrayList<>(); + List additions = new ArrayList<>(); + List admissionsToConsume = new ArrayList<>(); + Map currentByPath = new LinkedHashMap<>(); + graph.children(parent.documentId()).forEach(binding -> + currentByPath.put(binding.absolutePath(), binding)); + + for (EmbeddingBinding current : currentByPath.values()) { + EmbeddedOccurrence occurrence = after.get(current.absolutePath()); + if (occurrence != null && occurrence.childDocumentId().equals( + current.childDocumentId())) { + retained.add(current); + after.remove(current.absolutePath()); + } else { + removed.add(current); + } + } + for (EmbeddedOccurrence occurrence : after.values().stream() + .sorted(Comparator.comparing( + EmbeddedOccurrence::scopePath, + EmbeddingBinding.TEXT_ORDER)) + .toList()) { + OccurrenceKey key = new OccurrenceKey( + parent.documentId(), occurrence.scopePath()); + EmbeddedAdmissionEvidence exact = exactEmbeddedAdmissions.get(key); + EmbeddedAdmissionEvidence admission = exact != null + ? exact + : embeddedAdmissions.getOrDefault( + occurrence.childDocumentId(), + EmbeddedAdmissionEvidence.fullHistory( + occurrence.childDocumentId())); + admission.requireMatch(occurrence, cause); + if (exact != null) { + admissionsToConsume.add(key); + } + ActivationMode mode = admission.mode(); + if (mode == ActivationMode.PASSIVE_SNAPSHOT) { + metrics.increment("embedding.passiveSnapshots"); + continue; + } + long generation = Math.addExact( + activationGenerations.getOrDefault(key, 0L), 1L); + String bindingId = bindingId( + parent.documentId(), occurrence.scopePath(), generation); + EmbeddingBinding binding = new EmbeddingBinding( + bindingId, + parent.documentId(), + occurrence.scopePath(), + occurrence.childDocumentId(), + generation, + mode, + admission.verifiedCompleteThrough(), + occurrence.suppliedState().blueId(), + admission.admittedEpoch(), + admission.completenessProofIdentity(), + cause.entryBlueId(), + cause.order()); + retained.add(binding); + additions.add(new ProposedBinding( + binding, occurrence, mode, key)); + } + retained.sort(EmbeddingBinding.WITHIN_PARENT_ORDER); + ProcessEmbeddedGraphSnapshot proposed = graph.reconcileParent( + parent.documentId(), retained, metrics); + return new GraphDelta( + proposed, + List.copyOf(removed), + List.copyOf(additions), + List.copyOf(admissionsToConsume)); + } + + private GraphDelta graphDelta( + DocumentSession parent, + List before, + List after, + TransitionCause cause) { + metrics.increment("temporal.graphIdentityChecks"); + if (sameTopology(before, after)) { + metrics.increment("temporal.graphIdentityMatches"); + return new GraphDelta(graph, List.of(), List.of(), List.of()); + } + metrics.increment("temporal.graphDeltaPreviews"); + return previewGraphDelta(parent, after, cause); + } + + private boolean sameTopology( + List before, + List after) { + if (before.size() != after.size()) { + return false; + } + for (int index = 0; index < before.size(); index++) { + metrics.increment("temporal.graphIdentityOccurrencesCompared"); + EmbeddedOccurrence left = before.get(index); + EmbeddedOccurrence right = after.get(index); + if (!left.scopePath().equals(right.scopePath()) + || !left.childDocumentId().equals( + right.childDocumentId())) { + return false; + } + } + return true; + } + + private static boolean routesChanged( + EmbeddedOnlyLayout before, + List beforeSubscriptions, + EmbeddedOnlyLayout after, + List afterSubscriptions) { + boolean sameSurface = before.plan() == after.plan() + || before.routingSurface().definitions().equals( + after.routingSurface().definitions()) + && before.routingSurface().deliversEmbeddedRevisionEvents() + == after.routingSurface().deliversEmbeddedRevisionEvents(); + return !sameSurface || !beforeSubscriptions.equals(afterSubscriptions); + } + + private void preflightGraphDelta( + GraphDelta delta, + TransitionCause cause) { + Map newChildStates = new LinkedHashMap<>(); + Map existingChildEpochs = new LinkedHashMap<>(); + for (ProposedBinding proposed : delta.additions()) { + EmbeddingBinding binding = proposed.binding(); + DocumentSession child = documents.find( + binding.childDocumentId()).orElse(null); + if (child == null) { + String priorState = newChildStates.putIfAbsent( + binding.childDocumentId(), + binding.admittedChildBlueId()); + if (priorState != null && !priorState.equals( + binding.admittedChildBlueId())) { + throw new InvalidAdmissionEvidenceException( + "conflicting supplied states for new child " + + binding.childDocumentId()); + } + if (binding.activationMode() + == ActivationMode.ATTACH_CURRENT_STATE) { + throw new IllegalStateException( + "ATTACH_CURRENT_STATE requires an existing managed child"); + } + if (binding.admittedChildEpoch() != null) { + throw new IllegalStateException( + "Exact admitted epoch requires an existing child"); + } + continue; + } + if (binding.activationMode() + == ActivationMode.BIRTH_AT_ATTACHMENT) { + throw new IllegalStateException( + "BIRTH_AT_ATTACHMENT requires a new child DocumentId"); + } + long suppliedEpoch = child.resolveAdmissionEpoch( + binding.admittedChildBlueId(), + binding.admittedChildEpoch()); + Long priorEpoch = existingChildEpochs.putIfAbsent( + binding.childDocumentId(), suppliedEpoch); + if (priorEpoch != null && priorEpoch != suppliedEpoch) { + throw new InvalidAdmissionEvidenceException( + "conflicting admitted epochs for child " + + binding.childDocumentId()); + } + if (binding.activationMode() + == ActivationMode.ATTACH_CURRENT_STATE + && suppliedEpoch != child.epoch()) { + throw new IllegalStateException( + "ATTACH_CURRENT_STATE requires the current child epoch"); + } + if (binding.activationMode() + == ActivationMode.ATTACH_CURRENT_STATE + && binding.establishedFrontier().compareTo( + cause.order()) < 0) { + throw new IllegalStateException( + "ATTACH_CURRENT_STATE completeness evidence is behind " + + "the attachment cutoff"); + } + if (suppliedEpoch >= 0L) { + DocumentRevision supplied = child.revision(suppliedEpoch); + if (supplied.sourceOrderKey() + .map(order -> order.compareTo(cause.order()) >= 0) + .orElse(false)) { + throw new IllegalStateException( + "Supplied child state is ahead of attachment cutoff " + + cause.order()); + } + } + } + } + + private void reconcileCommittedTransition( + DocumentSession session, + TransitionCause cause) { + GraphDelta delta = previewGraphDelta( + session, + session.layout().directOccurrences(), + cause); + preflightGraphDelta(delta, cause); + markContainingDocumentsCatchingUp(session.documentId()); + publishCommittedTransition(session, delta, cause, true); + publishReadyIfSynchronized(session, cause.cutoff()); + } + + private void publishCommittedTransition( + DocumentSession session, + GraphDelta delta, + TransitionCause cause, + boolean routesChanged) { + if (routesChanged) { + routes.replace( + session.documentId(), + session.layout().routingSurface(), + session.activeSubscriptions()); + } else { + metrics.increment("routing.surfacePublicationsSkipped"); + } + publishGraph(session, delta, cause); + } + + private void publishGraph( + DocumentSession session, + GraphDelta delta, + TransitionCause cause) { + metrics.timed("temporal.graphPublication", () -> { + publishGraphDeltaAtomically(session, delta, cause); + session.markGraphPublished(); + }); + } + private void publishGraphDeltaAtomically( + DocumentSession parent, + GraphDelta delta, + TransitionCause cause) { + if (delta.proposed() == graph + && delta.admissionsToConsume().isEmpty()) { + metrics.increment("temporal.graphSnapshotsReused"); + return; + } + try { + runPublicationAtomically(() -> + publishGraphDelta(parent, delta, cause)); + } finally { + metrics.add("embedding.exactAdmissionPlansConsumed", + delta.admissionsToConsume().stream().filter(key -> + !exactEmbeddedAdmissions.containsKey(key)).count()); + } + } + + private void runPublicationAtomically(Runnable publication) { + PublicationCheckpoint checkpoint = new PublicationCheckpoint( + committedTransitionSequence, + graph, + objects.mark()); + publicationCheckpoints.add(checkpoint); + try { + publication.run(); + objects.commit(checkpoint.objectMark()); + } catch (RuntimeException failure) { + if (committedTransitionSequence + == checkpoint.committedTransitionSequence()) { + try { + rollbackPublication(checkpoint); + } catch (RuntimeException rollbackFailure) { + failure.addSuppressed(rollbackFailure); + } + } else { + objects.commit(checkpoint.objectMark()); + } + throw failure; + } finally { + PublicationCheckpoint removed = publicationCheckpoints.remove( + publicationCheckpoints.size() - 1); + if (removed != checkpoint) { + throw new IllegalStateException( + "Publication checkpoint stack is corrupted"); + } + } + } + + private void rollbackPublication(PublicationCheckpoint checkpoint) { + for (DocumentId childId : checkpoint.newChildIds()) { + DocumentSession child = documents.find(childId).orElse(null); + if (child != null && child.epoch() != 0L) { + throw new IllegalStateException( + "Cannot roll back committed child " + childId); + } + } + graph = checkpoint.graphBefore(); + recoveryState.graph = graph; + restoreEntries(cursors, checkpoint.cursorsBefore()); + restoreEntries( + activationGenerations, + checkpoint.activationGenerationsBefore()); + exactEmbeddedAdmissions.putAll(checkpoint.consumedAdmissions()); + restoreEntries( + openBarrierByParent, + checkpoint.openBarriersBefore()); + restoreEntries( + embeddedInputHeadByParent, + checkpoint.inputHeadsBefore()); + checkpoint.barriersBefore().forEach((id, prior) -> { + if (prior.present()) { + barriers.put(id, prior.value().copy()); + } else { + barriers.remove(id); + } + }); + checkpoint.sessionProgressBefore().forEach((documentId, progress) -> + documents.find(documentId).ifPresent(session -> + session.restoreCoordinationState( + progress.status(), + progress.readyThrough(), + progress.readyEpoch(), + progress.graphPublishedEpoch()))); + for (DocumentId childId : checkpoint.newChildIds()) { + DocumentSession child = documents.find(childId).orElse(null); + if (child == null) { + continue; + } + routes.remove(childId); + documents.remove(childId); + } + objects.rollbackTo(checkpoint.objectMark()); + } + + private static void restoreEntries( + Map target, + Map> before) { + before.forEach((key, prior) -> { + if (prior.present()) { + target.put(key, prior.value()); + } else { + target.remove(key); + } + }); + } + + private void recordCursor(String bindingId) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordCursor(bindingId, cursors)); + } + + private void recordActivationGeneration(OccurrenceKey occurrence) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordActivationGeneration( + occurrence, activationGenerations)); + } + + private void consumeExactAdmission(OccurrenceKey occurrence) { + EmbeddedAdmissionEvidence plan = Objects.requireNonNull( + exactEmbeddedAdmissions.remove(occurrence), + "exact admission plan"); + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordConsumedAdmission(occurrence, plan)); + } + + private void recordBarrier(String barrierId) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordBarrier(barrierId, barriers)); + } + + private void recordOpenBarrier(DocumentId parent) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordOpenBarrier(parent, openBarrierByParent)); + } + + private void recordEmbeddedInputHead(DocumentId parent) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordInputHead(parent, embeddedInputHeadByParent)); + } + + private void recordSessionProgress(DocumentSession session) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordSessionProgress(session)); + } + + private void recordNewChild(DocumentId childId) { + publicationCheckpoints.forEach(checkpoint -> + checkpoint.recordNewChild(childId)); + } + + private void publishGraphDelta( + DocumentSession parent, + GraphDelta delta, + TransitionCause cause) { + if (delta.requiresSynchronization() + && parent.status() != SessionStatus.CATCHING_UP) { + recordSessionProgress(parent); + parent.markCatchingUp(); + } + for (OccurrenceKey key : delta.admissionsToConsume()) { + consumeExactAdmission(key); + } + if (delta.proposed() == graph) { + metrics.increment("temporal.graphSnapshotsReused"); + return; + } + for (EmbeddingBinding removed : delta.removed()) { + recordCursor(removed.bindingId()); + cursors.remove(removed.bindingId()); + metrics.increment("embedding.bindingsRetired"); + } + graph = delta.proposed(); + recoveryState.graph = graph; + metrics.increment("temporal.graphReconciliations"); + metrics.increment("temporal.graphGenerationsPublished"); + if (delta.additions().isEmpty()) { + return; + } + CatchUpBarrier barrier = createOrExtendBarrier( + parent.documentId(), cause); + List admittedChildren = new ArrayList<>(); + for (ProposedBinding proposed : delta.additions()) { + recordActivationGeneration(proposed.occurrenceKey()); + activationGenerations.put( + proposed.occurrenceKey(), + proposed.binding().activationGeneration()); + recordBarrier(barrier.barrierId()); + barrier.extend(proposed.binding().bindingId()); + admittedChildren.add(admitOrReuseChild( + proposed, cause, barrier)); + } + for (AdmittedChild admitted : admittedChildren) { + publishNestedChild(admitted, cause, barrier); + } + } + + private AdmittedChild admitOrReuseChild( + ProposedBinding proposed, + TransitionCause cause, + CatchUpBarrier parentBarrier) { + EmbeddingBinding binding = proposed.binding(); + DocumentSession child = documents.find( + binding.childDocumentId()).orElse(null); + long suppliedEpoch; + boolean created = false; + if (child == null) { + EngineMetrics.MetricsSnapshot traceBefore = transitionObserver == null + ? null : metrics.snapshot(); + long traceStarted = traceBefore == null ? 0L : System.nanoTime(); + child = processor.admitExact( + binding.childDocumentId(), + proposed.occurrence().suppliedState(), + childAdmissionFrontier(binding), + catchUpCause(binding, cause.timestampMicros())); + long commitStarted = System.nanoTime(); + documents.insert(child); + recordNewChild(child.documentId()); + routes.replace(child.documentId(), + child.layout().routingSurface(), + child.activeSubscriptions()); + suppliedEpoch = -1L; + created = true; + metrics.increment("embedding.childSessionsCreated"); + metrics.increment("sessionsCreated"); + metrics.addNanos("process.commitReadinessPublication", + System.nanoTime() - commitStarted); + if (child.layout().directOccurrences().isEmpty()) { + metrics.timed("temporal.graphPublication", + child::markGraphPublished); + } + failureInjector.accept(DefaultCoordinationEngine.FailurePoint + .AFTER_STAGING_CHILD_SESSION); + trace(child, child.revision(0L), traceBefore, traceStarted); + } else { + try { + suppliedEpoch = child.resolveAdmissionEpoch( + binding.admittedChildBlueId(), + binding.admittedChildEpoch()); + } catch (IllegalStateException invalidAdmission) { + recordBarrier(parentBarrier.barrierId()); + parentBarrier.block(invalidAdmission.getMessage()); + throw invalidAdmission; + } + metrics.increment("embedding.childSessionsReused"); + } + recordCursor(binding.bindingId()); + cursors.put(binding.bindingId(), new EmbeddedEpochCursor( + binding.bindingId(), suppliedEpoch)); + initializeHistoricalProgress(parentBarrier, binding, child, + suppliedEpoch, proposed.mode()); + return new AdmittedChild(proposed, child, created); + } + + private void publishNestedChild( + AdmittedChild admitted, + TransitionCause cause, + CatchUpBarrier parentBarrier) { + DocumentSession child = admitted.child(); + EmbeddingBinding binding = admitted.proposed().binding(); + if (admitted.created() + && !child.layout().directOccurrences().isEmpty()) { + runPublicationAtomically(() -> { + TransitionCause nestedCause = + TransitionCause.nestedAdmission(binding, cause); + GraphDelta nested = previewGraphDelta( + child, + child.layout().directOccurrences(), + nestedCause); + publishGraph(child, nested, nestedCause); + String nestedBarrierId = openBarrierByParent.get( + child.documentId()); + if (nestedBarrierId != null) { + recordBarrier(parentBarrier.barrierId()); + parentBarrier.addNestedBarrier(nestedBarrierId); + } + }); + } + } + + private void initializeHistoricalProgress( + CatchUpBarrier barrier, + EmbeddingBinding binding, + DocumentSession child, + long suppliedEpoch, + ActivationMode mode) { + ExternalOrderKey progress = null; + if (mode == ActivationMode.BIRTH_AT_ATTACHMENT) { + progress = binding.attachmentOrder(); + } else if (mode == ActivationMode.IMPORT_FROM_FRONTIER) { + progress = binding.establishedFrontier(); + } else if (mode == ActivationMode.ATTACH_CURRENT_STATE) { + if (suppliedEpoch != child.epoch()) { + throw new IllegalStateException( + "ATTACH_CURRENT_STATE requires the current child epoch"); + } + progress = barrier.cutoffExclusive(); + } else if (suppliedEpoch >= 0L) { + progress = child.revision(suppliedEpoch) + .sourceOrderKey().orElse(null); + } + if (progress != null) { + recordBarrier(barrier.barrierId()); + barrier.recordProgress(binding.bindingId(), progress); + } + } + + private static ExternalOrderKey childAdmissionFrontier( + EmbeddingBinding binding) { + return switch (binding.activationMode()) { + case BIRTH_AT_ATTACHMENT -> binding.attachmentOrder(); + case IMPORT_FROM_FRONTIER, ATTACH_CURRENT_STATE -> + binding.establishedFrontier(); + case IMPORT_FULL_HISTORY -> + DocumentTransitionProcessor.fullHistoryFrontier( + binding.childDocumentId()); + case PASSIVE_SNAPSHOT -> throw new IllegalStateException( + "Passive snapshots do not create child sessions"); + }; + } + + private CatchUpBarrier createOrExtendBarrier( + DocumentId parent, + TransitionCause cause) { + String existingId = openBarrierByParent.get(parent); + if (existingId != null) { + CatchUpBarrier existing = barriers.get(existingId); + if (existing != null + && existing.status() != CatchUpBarrier.Status.COMPLETE + && existing.status() != CatchUpBarrier.Status.BLOCKED) { + metrics.increment("temporal.catchUpBarriersExtended"); + return existing; + } + } + String id = parent.value() + "|" + cause.entryBlueId(); + CatchUpBarrier barrier = new CatchUpBarrier( + id, parent, cause.entryBlueId(), cause.cutoff()); + recordBarrier(id); + barriers.put(id, barrier); + recordOpenBarrier(parent); + openBarrierByParent.put(parent, id); + registerWithContainingBarriers(barrier); + metrics.increment("temporal.catchUpBarriersCreated"); + return barrier; + } + + private void registerWithContainingBarriers(CatchUpBarrier nested) { + for (String candidateId : List.copyOf( + openBarrierByParent.values())) { + if (candidateId.equals(nested.barrierId())) { + continue; + } + CatchUpBarrier candidate = barriers.get(candidateId); + boolean containsParent = candidate != null + && barrierBindings(candidate).stream().anyMatch(binding -> + binding.childDocumentId().equals( + nested.parentDocumentId())); + if (containsParent) { + recordBarrier(candidateId); + candidate.addNestedBarrier(nested.barrierId()); + } + } + } + + private boolean settleOpenBarriers() { + boolean ready = true; + Set nested = new LinkedHashSet<>(); + barriers.values().forEach(barrier -> + nested.addAll(barrier.nestedBarrierIds())); + for (String barrierId : List.copyOf(openBarrierByParent.values())) { + if (!nested.contains(barrierId)) { + ready &= settleBarrier(barrierId); + } + } + return ready; + } + + private void completePendingAdmissionInitializations() { + for (DocumentId documentId : new ArrayList<>( + pendingTopLevelAdmissions.keySet())) { + completeAdmissionInitializationBarrier(documentId); + } + } + + private void completeAdmissionInitializationBarrier(DocumentId rootId) { + String barrierId = openBarrierByParent.get(rootId); + if (barrierId == null) { + return; + } + CatchUpBarrier rootBarrier = barriers.get(barrierId); + if (rootBarrier == null || !rootBarrier.attachmentEntryBlueId().equals( + documents.require(rootId).revision(0L).causalEntryBlueId() + .orElseThrow())) { + return; + } + List ignoredOutcomes = new ArrayList<>(); + List tree = initializeBarrierTree( + barrierId, ignoredOutcomes); + for (BarrierLevel level : tree) { + CatchUpBarrier barrier = level.barrier(); + if (barrier.status() == CatchUpBarrier.Status.BLOCKED) { + throw new IllegalStateException(barrier.diagnostic()); + } + if (barrier.status() != CatchUpBarrier.Status.COMPLETE) { + recordBarrier(barrier.barrierId()); + barrier.complete(); + metrics.increment("temporal.catchUpBarriersCompleted"); + } + recordOpenBarrier(barrier.parentDocumentId()); + openBarrierByParent.remove( + barrier.parentDocumentId(), barrier.barrierId()); + DocumentSession parent = documents.require( + barrier.parentDocumentId()); + recordSessionProgress(parent); + if (parent.documentId().equals(rootId)) { + parent.markCatchingUp(); + } else { + publishReadyIfSynchronized(parent, parent.readyThrough()); + } + } + } + + private boolean settleBarrierFor(DocumentId parent) { + String barrierId = openBarrierByParent.get(parent); + return barrierId == null + || settlingBarrierTree + || settleBarrier(barrierId); + } + + private boolean settleBarrier(String barrierId) { + CatchUpBarrier barrier = barriers.get(barrierId); + if (barrier == null || barrier.status() == CatchUpBarrier.Status.COMPLETE) { + return true; + } + if (barrier.status() == CatchUpBarrier.Status.BLOCKED) { + throw new IllegalStateException(barrier.diagnostic()); + } + DocumentSession parent = documents.require( + barrier.parentDocumentId()); + List ignoredOutcomes = new ArrayList<>(); + boolean previousSettlement = settlingBarrierTree; + settlingBarrierTree = true; + try { + while (true) { + List tree = initializeBarrierTree( + barrierId, ignoredOutcomes); + List candidates = new ArrayList<>(); + for (BarrierLevel level : tree) { + if (level.barrier().status() + != CatchUpBarrier.Status.COMPLETE) { + candidates.addAll(candidates(level)); + } + } + if (tree.stream().anyMatch(level -> level.barrier().status() + == CatchUpBarrier.Status.DEFERRED)) { + markTreeCatchingUp(tree); + metrics.increment("temporal.catchUpDeferrals"); + return false; + } + Optional next = candidates.stream() + .min(BarrierCandidate.ORDER); + if (next.isEmpty()) { + completeBarrierTree(tree); + return true; + } + BarrierCandidate candidate = next.orElseThrow(); + if (candidate.revision() != null) { + applyChildRevision( + candidate.binding(), + candidate.revision(), + ignoredOutcomes); + } else { + TimelineEntry entry = candidate.entry(); + Set targets = new LinkedHashSet<>(); + List sameEntry = candidates.stream() + .filter(item -> item.entry() != null + && item.entry().blueId().equals( + entry.blueId())) + .toList(); + sameEntry.forEach(item -> targets.add( + item.binding().childDocumentId())); + long processedTargets = processHistoricalTargets( + entry, + targets, + ignoredOutcomes, + barrier.cutoffExclusive()); + metrics.add("catchUp.childEntriesProcessed", + processedTargets); + metrics.add("childHistoricalProcessCalls", + processedTargets); + for (BarrierCandidate item : sameEntry) { + CatchUpBarrier current = barriers.get( + item.barrierId()); + recordBarrier(item.barrierId()); + current.recordProgress( + item.binding().bindingId(), + entry.sourceOrderKey()); + } + metrics.increment("temporal.historicalEntriesReplayed"); + } + } + } catch (RuntimeException failure) { + recordSessionProgress(parent); + if (barrier.status() == CatchUpBarrier.Status.BLOCKED) { + parent.markBlocked(); + } else { + parent.markCatchingUp(); + } + metrics.increment("temporal.catchUpContinuations"); + throw failure; + } finally { + settlingBarrierTree = previousSettlement; + } + } + + private List initializeBarrierTree( + String rootBarrierId, + List outcomes) { + while (true) { + List tree = barrierTree(rootBarrierId); + boolean advanced = false; + for (BarrierLevel level : tree) { + CatchUpBarrier barrier = level.barrier(); + if (barrier.status() == CatchUpBarrier.Status.COMPLETE) { + continue; + } + if (barrier.status() == CatchUpBarrier.Status.BLOCKED) { + throw new IllegalStateException(barrier.diagnostic()); + } + if (barrier.status() == CatchUpBarrier.Status.DEFERRED) { + recordBarrier(barrier.barrierId()); + barrier.reopen(); + } + for (EmbeddingBinding binding : barrierBindings(barrier)) { + EmbeddedEpochCursor cursor = cursors.get( + binding.bindingId()); + if (cursor != null && cursor.appliedChildEpoch() == -1L) { + applyChildRevision( + binding, + documents.require(binding.childDocumentId()) + .revision(0L), + outcomes); + advanced = true; + } + } + } + for (BarrierLevel level : tree) { + CatchUpBarrier barrier = level.barrier(); + if (barrier.status() == CatchUpBarrier.Status.COMPLETE) { + continue; + } + for (EmbeddingBinding binding : barrierBindings(barrier)) { + EmbeddedEpochCursor cursor = cursors.get( + binding.bindingId()); + DocumentSession child = documents.require( + binding.childDocumentId()); + if (cursor != null && cursor.appliedChildEpoch() + < child.epoch()) { + DocumentRevision revision = child.revision( + cursor.appliedChildEpoch() + 1L); + if (revision.causalEntryBlueId().filter( + barrier.attachmentEntryBlueId()::equals) + .isPresent()) { + applyChildRevision(binding, revision, outcomes); + advanced = true; + } + } + } + } + if (!advanced) { + return tree; + } + } + } + + private void trace( + DocumentSession session, + DocumentRevision revision, + EngineMetrics.MetricsSnapshot before, + long started) { + if (before == null) { + return; + } + long totalNanos = System.nanoTime() - started; + transitionObserver.accept(new TransitionTrace( + session.documentId(), revision, before, metrics.snapshot(), + totalNanos)); + } + private List candidates(BarrierLevel level) { + CatchUpBarrier barrier = level.barrier(); + List candidates = new ArrayList<>(); + for (EmbeddingBinding binding : barrierBindings(barrier)) { + EmbeddedEpochCursor cursor = cursors.get(binding.bindingId()); + DocumentSession child = documents.require( + binding.childDocumentId()); + if (cursor.appliedChildEpoch() < child.epoch()) { + DocumentRevision revision = child.revision( + cursor.appliedChildEpoch() + 1L); + ExternalOrderKey order = revision.sourceOrderKey() + .orElse(binding.attachmentOrder()); + if (revision.kind() == DocumentRevision.Kind.INITIALIZATION + || order.compareTo(barrier.cutoffExclusive()) < 0) { + candidates.add(BarrierCandidate.revision( + barrier.barrierId(), level.depth(), binding, + revision, order)); + continue; + } + } + nextHistoricalCandidate( + barrier, level.depth(), binding).ifPresent( + candidates::add); + } + return candidates; + } + + private Optional nextHistoricalCandidate( + CatchUpBarrier barrier, + int depth, + EmbeddingBinding binding) { + ActivationMode mode = binding.activationMode(); + if (mode == ActivationMode.ATTACH_CURRENT_STATE) { + return Optional.empty(); + } + ExternalOrderKey after = barrier.progress(binding.bindingId()); + HistoricalStep step = journal.nextHistoricalStep( + after, + barrier.cutoffExclusive(), + binding.attachmentEntryBlueId(), + candidate -> routes.routesTo( + binding.childDocumentId(), candidate), + routes.generation(), + graph.generation(), + () -> sourceSurfaceIdentity(binding)); + if (step instanceof HistoricalStep.EligibleEntry eligible) { + return Optional.of(BarrierCandidate.history( + barrier.barrierId(), depth, binding, eligible.entry())); + } + if (step instanceof HistoricalStep.Complete complete) { + recordBarrier(barrier.barrierId()); + barrier.recordCompletenessEvidence( + binding.bindingId(), complete.evidence()); + return Optional.empty(); + } + if (step instanceof HistoricalStep.CompleteEmpty empty) { + recordBarrier(barrier.barrierId()); + barrier.recordCompletenessEvidence( + binding.bindingId(), empty.evidence()); + return Optional.empty(); + } + if (step instanceof HistoricalStep.Unavailable unavailable) { + recordBarrier(barrier.barrierId()); + barrier.defer(unavailable.diagnostic()); + return Optional.empty(); + } + HistoricalStep.InvalidEvidence invalid = + (HistoricalStep.InvalidEvidence) step; + recordBarrier(barrier.barrierId()); + barrier.block(invalid.diagnostic()); + throw new IllegalStateException( + "Historical source evidence is invalid: " + + invalid.diagnostic()); + } + + private List barrierTree(String rootBarrierId) { + List result = new ArrayList<>(); + collectBarrierTree( + rootBarrierId, + 0, + new LinkedHashSet<>(), + new LinkedHashSet<>(), + result); + return List.copyOf(result); + } + + private void collectBarrierTree( + String barrierId, + int depth, + Set visited, + Set active, + List result) { + if (visited.contains(barrierId)) { + return; + } + if (!active.add(barrierId)) { + throw new IllegalStateException( + "Nested catch-up barrier cycle " + barrierId); + } + CatchUpBarrier barrier = barriers.get(barrierId); + if (barrier == null) { + throw new IllegalStateException( + "Missing nested catch-up barrier " + barrierId); + } + barrier.nestedBarrierIds().stream() + .sorted(EmbeddingBinding.TEXT_ORDER).forEach(nested -> + collectBarrierTree( + nested, depth + 1, visited, active, result)); + active.remove(barrierId); + visited.add(barrierId); + result.add(new BarrierLevel(barrier, depth)); + } + + private void markTreeCatchingUp(List tree) { + for (BarrierLevel level : tree) { + if (level.barrier().status() == CatchUpBarrier.Status.COMPLETE) { + continue; + } + DocumentSession session = documents.require( + level.barrier().parentDocumentId()); + recordSessionProgress(session); + session.markCatchingUp(); + } + } + + private void completeBarrierTree(List tree) { + for (BarrierLevel level : tree) { + CatchUpBarrier barrier = level.barrier(); + if (barrier.status() == CatchUpBarrier.Status.COMPLETE) { + continue; + } + verifyBarrierComplete(barrier); + recordBarrier(barrier.barrierId()); + barrier.complete(); + recordOpenBarrier(barrier.parentDocumentId()); + openBarrierByParent.remove(barrier.parentDocumentId()); + DocumentSession parent = documents.require( + barrier.parentDocumentId()); + recordSessionProgress(parent); + if (pendingTopLevelAdmissions.containsKey( + parent.documentId())) { + parent.markCatchingUp(); + } else { + publishReadyIfSynchronized(parent, barrier.cutoffExclusive()); + } + metrics.increment("temporal.catchUpBarriersCompleted"); + } + } + + private void verifyBarrierComplete(CatchUpBarrier barrier) { + for (String nested : barrier.nestedBarrierIds()) { + CatchUpBarrier prerequisite = barriers.get(nested); + if (prerequisite == null + || prerequisite.status() != CatchUpBarrier.Status.COMPLETE) { + throw new IllegalStateException( + "Nested barrier remains incomplete: " + nested); + } + } + for (EmbeddingBinding binding : barrierBindings(barrier)) { + EmbeddedEpochCursor cursor = cursors.get(binding.bindingId()); + if (cursor == null) { + throw new IllegalStateException( + "Missing cursor for " + binding.bindingId()); + } + DocumentSession child = documents.require( + binding.childDocumentId()); + for (DocumentRevision revision : child.revisionsAfter( + cursor.appliedChildEpoch())) { + if (revision.sourceOrderKey().map(order -> + order.compareTo(barrier.cutoffExclusive()) < 0) + .orElse(revision.kind() + == DocumentRevision.Kind.INITIALIZATION)) { + throw new IllegalStateException( + "Parent cursor is behind eligible child epoch " + + revision.epoch()); + } + } + if (binding.activationMode() + != ActivationMode.ATTACH_CURRENT_STATE) { + CompletenessEvidence evidence = + barrier.completenessEvidence(binding.bindingId()); + if (evidence == null || !evidence.isCurrentFor( + journal.revision(), + routes.generation(), + graph.generation(), + barrier.cutoffExclusive(), + sourceSurfaceIdentity(binding))) { + throw new IllegalStateException( + "Historical completeness evidence is stale for " + + binding.bindingId()); + } + } + String actualChild = documents.require( + barrier.parentDocumentId()) + .currentRevision().after().canonicalBlueIdAt( + binding.absolutePath()); + String expectedChild = child.revision( + cursor.appliedChildEpoch()).after().blueId(); + if (!expectedChild.equals(actualChild)) { + throw new IllegalStateException( + "Parent child state is behind its persisted cursor at " + + binding.absolutePath()); + } + } + } + + String sourceSurfaceIdentity(EmbeddingBinding binding) { + DocumentSession child = documents.require( + binding.childDocumentId()); + return SourceSurfaceIdentity.calculate( + binding, + child.activeSubscriptions(), + child.layout().routingSurface()); + } + + private boolean resumeTopLevelAdmissions() { + boolean complete = true; + for (Map.Entry item + : new ArrayList<>(pendingTopLevelAdmissions.entrySet())) { + if (openBarrierByParent.containsKey(item.getKey())) { + complete = false; + continue; + } + DocumentSession session = documents.require(item.getKey()); + if (session.status() == SessionStatus.BLOCKED) { + throw new IllegalStateException( + "Top-level historical admission is blocked for " + + session.documentId()); + } + session.markCatchingUp(); + PendingTopLevelAdmission admission = item.getValue(); + try { + advanceTopLevelHistory(session, admission); + } catch (DeferredWorkException deferred) { + complete = false; + continue; + } + pendingTopLevelAdmissions.remove(item.getKey()); + markTopLevelSubtreeReady( + session.documentId(), admission.cutoffInclusive()); + } + return complete; + } + + private void advanceTopLevelHistory( + DocumentSession session, + PendingTopLevelAdmission initialAdmission) { + PendingTopLevelAdmission admission = Objects.requireNonNull( + initialAdmission, "initialAdmission"); + ExternalOrderKey cursor = admission.afterExclusive(); + ExternalOrderKey cutoffExclusive = exclusiveAfter( + admission.cutoffInclusive()); + metrics.increment("temporal.topLevelHistoricalWindowsOpened"); + while (true) { + ProcessEmbeddedGraphSnapshot entryGraph = graph; + Set admittedSubtree = subtree( + entryGraph, session.documentId()); + HistoricalStep step = journal.nextHistoricalStep( + cursor, + cutoffExclusive, + "", + entry -> routes.route(entry).stream() + .anyMatch(admittedSubtree::contains), + routes.generation(), + entryGraph.generation(), + () -> "top-level|" + session.documentId() + "|" + + session.currentRevision().after().blueId()); + if (step instanceof HistoricalStep.Complete + || step instanceof HistoricalStep.CompleteEmpty) { + return; + } + if (step instanceof HistoricalStep.Unavailable) { + metrics.increment("temporal.topLevelHistoryDeferred"); + throw DeferredWorkException.INSTANCE; + } + if (step instanceof HistoricalStep.InvalidEvidence invalid) { + session.markBlocked(); + throw new IllegalStateException( + "Historical source evidence is invalid: " + + invalid.diagnostic()); + } + TimelineEntry entry = ((HistoricalStep.EligibleEntry) step) + .entry(); + LinkedHashSet directTargets = new LinkedHashSet<>(); + routes.route(entry).stream() + .filter(admittedSubtree::contains) + .forEach(directTargets::add); + if (directTargets.isEmpty()) { + throw new IllegalStateException( + "Historical route changed while freezing entry " + + entry.blueId()); + } + processEntryFrame( + new EntryFrame(entry, entryGraph, directTargets), + admittedSubtree); + cursor = entry.sourceOrderKey(); + admission = admission.advanceTo(cursor); + pendingTopLevelAdmissions.put( + session.documentId(), admission); + metrics.increment("temporal.historicalEntriesReplayed"); + } + } + + private void markTopLevelSubtreeReady( + DocumentId rootId, + ExternalOrderKey cutoffInclusive) { + List subtree = new ArrayList<>(subtree(graph, rootId)); + subtree.remove(rootId); + subtree.stream().sorted(EmbeddingBinding.DOCUMENT_ORDER) + .forEach(documentId -> + publishReadyIfSynchronized( + documents.require(documentId), cutoffInclusive)); + publishReadyIfSynchronized( + documents.require(rootId), cutoffInclusive); + } + + private static Set subtree( + ProcessEmbeddedGraphSnapshot snapshot, + DocumentId root) { + LinkedHashSet result = new LinkedHashSet<>(); + collectSubtree(snapshot, root, result); + return Collections.unmodifiableSet(result); + } + + private static void collectSubtree( + ProcessEmbeddedGraphSnapshot snapshot, + DocumentId documentId, + Set result) { + if (!result.add(documentId)) { + return; + } + for (EmbeddingBinding binding : snapshot.children(documentId)) { + collectSubtree(snapshot, binding.childDocumentId(), result); + } + } + + private static ExternalOrderKey exclusiveAfter( + ExternalOrderKey inclusive) { + List components = new ArrayList<>(inclusive.components()); + components.add(""); + return ExternalOrderKey.of(components); + } + + private List barrierBindings(CatchUpBarrier barrier) { + return barrier.bindingIds().stream() + .map(graph::binding) + .sorted(EmbeddingBinding.WITHIN_PARENT_ORDER) + .toList(); + } + + private void collectTimelineIds( + DocumentId documentId, + Set result, + Set visited) { + if (!visited.add(documentId)) { + return; + } + DocumentSession session = documents.require(documentId); + result.addAll(session.layout().routingSurface().externalTimelineIds()); + for (EmbeddingBinding child : graph.children(documentId)) { + collectTimelineIds(child.childDocumentId(), result, visited); + } + } + + private void validateRecoveredState() { + if (committedTransitionSequence < 0L) { + throw new IllegalStateException( + "Committed transition sequence is negative"); + } + for (EmbeddingBinding binding : graph.bindings()) { + DocumentSession parent = documents.require( + binding.parentDocumentId()); + DocumentSession child = documents.require( + binding.childDocumentId()); + EmbeddedEpochCursor cursor = cursors.get(binding.bindingId()); + if (cursor == null + || !cursor.bindingId().equals(binding.bindingId()) + || cursor.appliedChildEpoch() < -1L + || cursor.appliedChildEpoch() > child.epoch()) { + throw new IllegalStateException( + "Invalid recovered cursor for " + + binding.bindingId()); + } + boolean exactOccurrence = parent.layout().directOccurrences() + .stream().anyMatch(occurrence -> + occurrence.scopePath().equals( + binding.absolutePath()) + && occurrence.childDocumentId().equals( + binding.childDocumentId())); + if (!exactOccurrence) { + throw new IllegalStateException( + "Recovered graph is not represented by parent state at " + + binding.absolutePath()); + } + } + openBarrierByParent.forEach((parent, barrierId) -> { + CatchUpBarrier barrier = barriers.get(barrierId); + if (barrier == null + || !barrier.parentDocumentId().equals(parent) + || barrier.status() == CatchUpBarrier.Status.COMPLETE) { + throw new IllegalStateException( + "Invalid recovered open barrier " + barrierId); + } + }); + barriers.values().forEach(barrier -> + barrier.nestedBarrierIds().forEach(nested -> { + if (!barriers.containsKey(nested)) { + throw new IllegalStateException( + "Missing recovered nested barrier " + nested); + } + })); + openFrames.forEach((entryBlueId, frame) -> { + TimelineEntry canonical = journal.requireCanonical(frame.entry()); + if (!entryBlueId.equals(canonical.blueId()) + || processedThrough != null + && canonical.sourceOrderKey().compareTo( + processedThrough) <= 0) { + throw new IllegalStateException( + "Invalid recovered entry frame " + entryBlueId); + } + }); + pendingTopLevelAdmissions.forEach((documentId, admission) -> { + DocumentSession session = documents.find(documentId).orElseThrow( + () -> new IllegalStateException( + "Pending admission has no document " + documentId)); + if (session.status() == SessionStatus.PENDING_INITIALIZATION + || session.status() == SessionStatus.TERMINATED) { + throw new IllegalStateException( + "Pending admission has invalid status " + + session.status() + " for " + documentId); + } + if (admission.afterExclusive() != null + && admission.afterExclusive().compareTo( + admission.cutoffInclusive()) > 0) { + throw new IllegalStateException( + "Pending admission cursor exceeds its cutoff for " + + documentId); + } + if (session.readyThrough().compareTo( + admission.cutoffInclusive()) > 0) { + throw new IllegalStateException( + "Pending admission document is ahead of its cutoff for " + + documentId); + } + }); + for (DocumentSession session : documents.sessions()) { + reconcileRecoveredReadiness(session); + } + } + + private void reconcileRecoveredReadiness(DocumentSession session) { + if (session.status() != SessionStatus.READY) { + return; + } + String failure = applicationReadinessFailure(session); + if (failure == null) { + return; + } + session.markCatchingUp(); + metrics.increment("temporal.recoveredReadinessRepairs"); + } + + private static DocumentRevision.CatchUpCause catchUpCause( + EmbeddingBinding binding, + long timestampMicros) { + return new DocumentRevision.CatchUpCause( + binding.parentDocumentId(), + binding.attachmentEntryBlueId(), + binding.absolutePath(), + Math.max(1L, timestampMicros)); + } + + static String bindingId( + DocumentId parentDocumentId, + String absolutePath, + long activationGeneration) { + String parent = Objects.requireNonNull( + parentDocumentId, "parentDocumentId").value(); + String path = Objects.requireNonNull(absolutePath, "absolutePath"); + if (path.isBlank() || !path.startsWith("/")) { + throw new IllegalArgumentException( + "absolutePath must be a non-blank JSON Pointer"); + } + if (activationGeneration < 1L) { + throw new IllegalArgumentException( + "activationGeneration must be positive"); + } + String generation = Long.toString(activationGeneration); + return "binding:v1:p" + parent.length() + ":" + parent + + "o" + path.length() + ":" + path + + "g" + generation.length() + ":" + generation; + } + + static String embeddedTransitionReceiptId( + String bindingId, + long childEpoch) { + String binding = Objects.requireNonNull(bindingId, "bindingId"); + if (binding.isBlank()) { + throw new IllegalArgumentException("bindingId must not be blank"); + } + if (childEpoch < 0L) { + throw new IllegalArgumentException( + "childEpoch must be non-negative"); + } + return "embedded|" + binding + "|" + childEpoch; + } + + private static Map byPath( + List occurrences) { + Map result = new LinkedHashMap<>(); + for (EmbeddedOccurrence occurrence : occurrences) { + EmbeddedOccurrence duplicate = result.putIfAbsent( + occurrence.scopePath(), occurrence); + if (duplicate != null) { + throw new IllegalStateException( + "Duplicate Process Embedded occurrence " + + occurrence.scopePath()); + } + } + return result; + } + + private static DocumentDispatchOutcome publicOutcome( + InternalProcessOutcome outcome) { + return new DocumentDispatchOutcome( + outcome.session().documentId(), + outcome.revision(), + outcome.totalNanos()); + } + + private record EntryFrame( + TimelineEntry entry, + ProcessEmbeddedGraphSnapshot graph, + Set directTargets) { + private EntryFrame { + entry = Objects.requireNonNull(entry, "entry"); + graph = Objects.requireNonNull(graph, "graph"); + directTargets = Collections.unmodifiableSet( + new LinkedHashSet<>(Objects.requireNonNull( + directTargets, "directTargets"))); + } + } + + private record OccurrenceKey(DocumentId parent, String path) { + private OccurrenceKey { + parent = Objects.requireNonNull(parent, "parent"); + path = Objects.requireNonNull(path, "path"); + } + } + + private record ProposedBinding( + EmbeddingBinding binding, + EmbeddedOccurrence occurrence, + ActivationMode mode, + OccurrenceKey occurrenceKey) { + } + + private record AdmittedChild( + ProposedBinding proposed, + DocumentSession child, + boolean created) { + private AdmittedChild { + proposed = Objects.requireNonNull(proposed, "proposed"); + child = Objects.requireNonNull(child, "child"); + } + } + + private record EmbeddedAdmissionEvidence( + DocumentId childDocumentId, + String admittedStateBlueId, + Long admittedEpoch, + ActivationMode mode, + ExternalOrderKey verifiedCompleteThrough, + String completenessProofIdentity, + String expectedAttachmentEntryBlueId) { + private EmbeddedAdmissionEvidence { + childDocumentId = Objects.requireNonNull( + childDocumentId, "childDocumentId"); + mode = Objects.requireNonNull(mode, "mode"); + completenessProofIdentity = requireText( + completenessProofIdentity, "completenessProofIdentity"); + } + + private void requireMatch( + EmbeddedOccurrence occurrence, + TransitionCause cause) { + if (!childDocumentId.equals(occurrence.childDocumentId()) + || admittedStateBlueId != null + && !admittedStateBlueId.equals( + occurrence.suppliedState().blueId()) + || expectedAttachmentEntryBlueId != null + && !expectedAttachmentEntryBlueId.equals( + cause.entryBlueId())) { + throw new IllegalStateException( + "Attachment does not match exact admission evidence"); + } + } + + private static EmbeddedAdmissionEvidence fullHistory( + DocumentId documentId) { + return new EmbeddedAdmissionEvidence( + documentId, + null, + null, + ActivationMode.IMPORT_FULL_HISTORY, + null, + "local-journal-full-history|" + documentId, + null); + } + } + + private record GraphDelta( + ProcessEmbeddedGraphSnapshot proposed, + List removed, + List additions, + List admissionsToConsume) { + private boolean requiresSynchronization() { + return !additions.isEmpty(); + } + } + + record TransitionTrace( + DocumentId documentId, + DocumentRevision revision, + EngineMetrics.MetricsSnapshot before, + EngineMetrics.MetricsSnapshot after, + long totalNanos) { } + + private record BarrierLevel(CatchUpBarrier barrier, int depth) { + private BarrierLevel { + barrier = Objects.requireNonNull(barrier, "barrier"); + if (depth < 0) { + throw new IllegalArgumentException( + "barrier depth must be non-negative"); + } + } + } + + private record Prior(boolean present, T value) { + } + + private static final class DeferredWorkException + extends RuntimeException { + private static final DeferredWorkException INSTANCE = + new DeferredWorkException(); + + private DeferredWorkException() { + super(null, null, false, false); + } + } + + private static final class RejectableExternalEntryException + extends RuntimeException { + private final String entryBlueId; + private final InvalidAdmissionEvidenceException failure; + + private RejectableExternalEntryException( + String entryBlueId, + InvalidAdmissionEvidenceException failure) { + super(null, failure, false, false); + this.entryBlueId = requireText(entryBlueId, "entryBlueId"); + this.failure = Objects.requireNonNull(failure, "failure"); + } + + private static RejectableExternalEntryException forEntry( + TimelineEntry entry, + InvalidAdmissionEvidenceException failure) { + return new RejectableExternalEntryException( + Objects.requireNonNull(entry, "entry").blueId(), failure); + } + + private String entryBlueId() { + return entryBlueId; + } + + private InvalidAdmissionEvidenceException failure() { + return failure; + } + } + + private static final class DrainPausedException extends RuntimeException { + private static final DrainPausedException INSTANCE = + new DrainPausedException(); + private DrainPausedException() { + super(null, null, false, false); + } + } + + private record SessionProgress( + SessionStatus status, + ExternalOrderKey readyThrough, + long readyEpoch, + long graphPublishedEpoch) { + private SessionProgress { + status = Objects.requireNonNull(status, "status"); + readyThrough = Objects.requireNonNull( + readyThrough, "readyThrough"); + if (readyEpoch < 0L || graphPublishedEpoch < -1L) { + throw new IllegalArgumentException( + "Invalid session publication evidence"); + } + } + } + + private record PendingTopLevelAdmission( + ExternalOrderKey afterExclusive, + ExternalOrderKey cutoffInclusive) { + private PendingTopLevelAdmission { + cutoffInclusive = Objects.requireNonNull( + cutoffInclusive, "cutoffInclusive"); + if (afterExclusive != null + && afterExclusive.compareTo(cutoffInclusive) > 0) { + throw new IllegalArgumentException( + "admission cursor cannot exceed its cutoff"); + } + } + + private PendingTopLevelAdmission advanceTo( + ExternalOrderKey nextAfterExclusive) { + ExternalOrderKey next = Objects.requireNonNull( + nextAfterExclusive, "nextAfterExclusive"); + if (afterExclusive != null + && next.compareTo(afterExclusive) <= 0) { + throw new IllegalStateException( + "top-level admission cursor must increase"); + } + return new PendingTopLevelAdmission(next, cutoffInclusive); + } + } + + private static final class RecoveryState { + private final Map cursors = + new LinkedHashMap<>(); + private final Map + embeddedAdmissions = new LinkedHashMap<>(); + private final Map barriers = + new LinkedHashMap<>(); + private final Map openBarrierByParent = + new LinkedHashMap<>(); + private final Map activationGenerations = + new LinkedHashMap<>(); + private final Map + exactEmbeddedAdmissions = new LinkedHashMap<>(); + private final Map openFrames = + new LinkedHashMap<>(); + private final Set rejectedExternalEntryIds = + new LinkedHashSet<>(); + private final Map + pendingTopLevelAdmissions = new LinkedHashMap<>(); + private final Map embeddedInputHeadByParent = + new LinkedHashMap<>(); + private final Map committedEmbeddedInputs = + new LinkedHashMap<>(); + private ProcessEmbeddedGraphSnapshot graph = + ProcessEmbeddedGraphSnapshot.empty(); + private ExternalOrderKey processedThrough; + private long committedTransitionSequence; + } + + private static final class PublicationCheckpoint { + private final long committedTransitionSequence; + private final ProcessEmbeddedGraphSnapshot graphBefore; + private final WholeObjectStore.Mark objectMark; + private final Map> cursorsBefore = + new LinkedHashMap<>(); + private final Map> + activationGenerationsBefore = new LinkedHashMap<>(); + private final Map + consumedAdmissions = new LinkedHashMap<>(); + private final Map> barriersBefore = + new LinkedHashMap<>(); + private final Map> openBarriersBefore = + new LinkedHashMap<>(); + private final Map> inputHeadsBefore = + new LinkedHashMap<>(); + private final Map + sessionProgressBefore = new LinkedHashMap<>(); + private final Set newChildIds = new LinkedHashSet<>(); + + private PublicationCheckpoint( + long committedTransitionSequence, + ProcessEmbeddedGraphSnapshot graphBefore, + WholeObjectStore.Mark objectMark) { + this.committedTransitionSequence = committedTransitionSequence; + this.graphBefore = Objects.requireNonNull( + graphBefore, "graphBefore"); + this.objectMark = Objects.requireNonNull( + objectMark, "objectMark"); + } + + private long committedTransitionSequence() { + return committedTransitionSequence; + } + + private ProcessEmbeddedGraphSnapshot graphBefore() { + return graphBefore; + } + + private WholeObjectStore.Mark objectMark() { + return objectMark; + } + + private Map> cursorsBefore() { + return cursorsBefore; + } + + private Map> + activationGenerationsBefore() { + return activationGenerationsBefore; + } + + private Map + consumedAdmissions() { + return consumedAdmissions; + } + + private Map> barriersBefore() { + return barriersBefore; + } + + private Map> openBarriersBefore() { + return openBarriersBefore; + } + + private Map> inputHeadsBefore() { + return inputHeadsBefore; + } + + private Map sessionProgressBefore() { + return sessionProgressBefore; + } + + private Set newChildIds() { + return newChildIds; + } + + private void recordCursor( + String bindingId, + Map current) { + recordPrior(cursorsBefore, bindingId, current); + } + + private void recordActivationGeneration( + OccurrenceKey occurrence, + Map current) { + recordPrior( + activationGenerationsBefore, occurrence, current); + } + + private void recordConsumedAdmission( + OccurrenceKey occurrence, + EmbeddedAdmissionEvidence plan) { + consumedAdmissions.putIfAbsent(occurrence, plan); + } + + private void recordBarrier( + String barrierId, + Map current) { + if (barriersBefore.containsKey(barrierId)) { + return; + } + CatchUpBarrier barrier = current.get(barrierId); + barriersBefore.put( + barrierId, + new Prior<>(barrier != null, + barrier == null ? null : barrier.copy())); + } + + private void recordOpenBarrier( + DocumentId parent, + Map current) { + recordPrior(openBarriersBefore, parent, current); + } + + private void recordInputHead( + DocumentId parent, + Map current) { + recordPrior(inputHeadsBefore, parent, current); + } + + private void recordSessionProgress(DocumentSession session) { + sessionProgressBefore.putIfAbsent( + session.documentId(), + new SessionProgress( + session.status(), + session.readyThrough(), + session.readyEpoch(), + session.graphPublishedEpoch())); + } + + private void recordNewChild(DocumentId childId) { + newChildIds.add(Objects.requireNonNull(childId, "childId")); + } + + private static void recordPrior( + Map> recorded, + K key, + Map current) { + if (recorded.containsKey(key)) { + return; + } + boolean present = current.containsKey(key); + recorded.put(key, new Prior<>( + present, present ? current.get(key) : null)); + } + } + + private record TransitionCause( + String entryBlueId, + ExternalOrderKey order, + ExternalOrderKey cutoff, + long timestampMicros) { + private TransitionCause { + entryBlueId = Objects.requireNonNull( + entryBlueId, "entryBlueId"); + order = Objects.requireNonNull(order, "order"); + cutoff = Objects.requireNonNull(cutoff, "cutoff"); + if (timestampMicros <= 0L) { + throw new IllegalArgumentException( + "timestampMicros must be positive"); + } + } + + static TransitionCause external(TimelineEntry entry) { + return external(entry, entry.sourceOrderKey()); + } + + static TransitionCause external( + TimelineEntry entry, + ExternalOrderKey cutoff) { + return new TransitionCause( + entry.blueId(), + entry.sourceOrderKey(), + Objects.requireNonNull(cutoff, "cutoff"), + entry.timestampMicros()); + } + + static TransitionCause embedded(EmbeddedEpochInput input) { + return new TransitionCause( + input.originalEntryBlueId() == null + ? input.inputId() + : input.originalEntryBlueId(), + input.sourceOrder(), + input.sourceOrder(), + input.applicationTimestampMicros()); + } + + static TransitionCause admission( + DocumentSession session, + ExternalOrderKey cutoff) { + return new TransitionCause( + session.revision(0L).causalEntryBlueId().orElseThrow(), + cutoff, + cutoff, + timestamp(cutoff)); + } + + static TransitionCause nestedAdmission( + EmbeddingBinding binding, + TransitionCause outer) { + return new TransitionCause( + binding.attachmentEntryBlueId(), + binding.attachmentOrder(), + outer.cutoff(), + outer.timestampMicros()); + } + + private static long timestamp(ExternalOrderKey key) { + if (!key.components().isEmpty() + && key.components().get(0) instanceof BigInteger integer) { + try { + return Math.max(1L, integer.longValueExact()); + } catch (ArithmeticException ignored) { + return 1L; + } + } + return 1L; + } + } + + record BarrierCandidate( + String barrierId, + int depth, + EmbeddingBinding binding, + DocumentRevision revision, + TimelineEntry entry, + ExternalOrderKey order) { + static final Comparator ORDER = Comparator + .comparing(BarrierCandidate::order) + .thenComparing(Comparator.comparingInt( + BarrierCandidate::depth).reversed()) + .thenComparing(candidate -> + candidate.revision() == null ? 1 : 0) + .thenComparing(c -> c.binding().parentDocumentId().value(), + EmbeddingBinding.TEXT_ORDER) + .thenComparing(c -> c.binding().absolutePath(), + EmbeddingBinding.TEXT_ORDER) + .thenComparing(c -> c.binding().childDocumentId().value(), + EmbeddingBinding.TEXT_ORDER) + .thenComparingLong(c -> c.binding().activationGeneration()) + .thenComparing(candidate -> candidate.revision() == null + ? candidate.entry().blueId() : "", EmbeddingBinding.TEXT_ORDER) + .thenComparingLong(candidate -> candidate.revision() == null + ? 0L : candidate.revision().epoch()); + + static BarrierCandidate revision( + String barrierId, + int depth, + EmbeddingBinding binding, + DocumentRevision revision, + ExternalOrderKey order) { + return new BarrierCandidate( + barrierId, depth, binding, revision, null, order); + } + + static BarrierCandidate history( + String barrierId, + int depth, + EmbeddingBinding binding, + TimelineEntry entry) { + return new BarrierCandidate( + barrierId, + depth, + binding, + null, + entry, + entry.sourceOrderKey()); + } + } +} diff --git a/src/main/java/blue/coordination/internal/SourceSurfaceIdentity.java b/src/main/java/blue/coordination/internal/SourceSurfaceIdentity.java new file mode 100644 index 0000000..c460f0a --- /dev/null +++ b/src/main/java/blue/coordination/internal/SourceSurfaceIdentity.java @@ -0,0 +1,190 @@ +package blue.coordination.internal; + +import blue.language.processor.ExternalChannelDependencySnapshot; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.SubscriptionDelta.Entry; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HexFormat; +import java.util.List; +import java.util.Objects; + +/** Stable identity of the exact external source surface used by catch-up. */ +final class SourceSurfaceIdentity { + private static final String DOMAIN = "blue.coordination/source-surface/1"; + private static final Comparator> TEXT_LIST_ORDER = + SourceSurfaceIdentity::compareTexts; + private static final Comparator + DEPENDENCY_ORDER = Comparator + .comparing(ExternalChannelDependencySnapshot + ::intrinsicNodeBlueIds, TEXT_LIST_ORDER) + .thenComparing(ExternalChannelDependencySnapshot + ::deterministicDependencyNodeBlueIds, + TEXT_LIST_ORDER) + .thenComparingInt(value -> value + .wholeSameScopeExternalSurface() ? 1 : 0) + .thenComparingInt(value -> value + .wholeSameScopeChannelCatalog() ? 1 : 0) + .thenComparing(ExternalChannelDependencySnapshot + ::channelCatalogContractKeys, TEXT_LIST_ORDER); + static final Comparator ENTRY_ORDER = + Comparator.comparing(Entry::scopePath, EmbeddingBinding.TEXT_ORDER) + .thenComparingInt(Entry::order) + .thenComparing(Entry::channelKey, EmbeddingBinding.TEXT_ORDER) + .thenComparing(Entry::effectiveTypeBlueId, EmbeddingBinding.TEXT_ORDER) + .thenComparing(Entry::sourceContributionNodeBlueIds, + TEXT_LIST_ORDER) + .thenComparing(Entry::subscriptionKeys, + TEXT_LIST_ORDER) + .thenComparing(Entry::checkpointDomainBlueId, EmbeddingBinding.TEXT_ORDER) + .thenComparing(Entry::dependencies, DEPENDENCY_ORDER) + .thenComparing(Entry::activationRootRevision, + Comparator.nullsFirst(Comparator.naturalOrder())) + .thenComparing(Entry::startAfterExternalOrderKey, + Comparator.nullsFirst(Comparator.naturalOrder())) + .thenComparing(Entry::endAtRootRevision, + Comparator.nullsFirst(Comparator.naturalOrder())); + + private SourceSurfaceIdentity() { } + + static String calculate( + EmbeddingBinding binding, + List activeSubscriptions, + RoutingSurface routingSurface) { + Objects.requireNonNull(binding, "binding"); + Objects.requireNonNull(activeSubscriptions, "activeSubscriptions"); + Objects.requireNonNull(routingSurface, "routingSurface"); + MessageDigest digest = sha256(); + text(digest, DOMAIN); + text(digest, binding.parentDocumentId().value()); + text(digest, binding.absolutePath()); + number(digest, binding.activationGeneration()); + text(digest, binding.childDocumentId().value()); + List subscriptions = new ArrayList<>(activeSubscriptions); + subscriptions.sort(ENTRY_ORDER); + number(digest, subscriptions.size()); + for (Entry entry : subscriptions) { + subscription(digest, entry); + } + List definitions = routingSurface.definitions(); + number(digest, definitions.size()); + for (RoutingSurface.Definition definition : definitions) { + text(digest, definition.scopePath()); + text(digest, definition.operation()); + text(digest, definition.channelKey()); + number(digest, definition.sources().size()); + for (RoutingSurface.SourceAddress source : definition.sources()) { + text(digest, source.timelineId()); + text(digest, source.actorId()); + } + } + bool(digest, routingSurface.deliversEmbeddedRevisionEvents()); + return "sha256:" + HexFormat.of().formatHex(digest.digest()); + } + + private static int compareTexts(List left, List right) { + int shared = Math.min(left.size(), right.size()); + for (int index = 0; index < shared; index++) { + int compared = EmbeddingBinding.TEXT_ORDER.compare( + left.get(index), right.get(index)); + if (compared != 0) { + return compared; + } + } + return Integer.compare(left.size(), right.size()); + } + + private static void subscription(MessageDigest digest, Entry entry) { + text(digest, entry.scopePath()); + text(digest, entry.channelKey()); + text(digest, entry.effectiveTypeBlueId()); + texts(digest, entry.sourceContributionNodeBlueIds()); + number(digest, entry.order()); + texts(digest, entry.subscriptionKeys()); + text(digest, entry.checkpointDomainBlueId()); + dependencies(digest, entry.dependencies()); + nullableNumber(digest, entry.activationRootRevision()); + orderKey(digest, entry.startAfterExternalOrderKey()); + nullableNumber(digest, entry.endAtRootRevision()); + } + + private static void dependencies(MessageDigest digest, + ExternalChannelDependencySnapshot dependencies) { + texts(digest, dependencies.intrinsicNodeBlueIds()); + texts(digest, dependencies.deterministicDependencyNodeBlueIds()); + bool(digest, dependencies.wholeSameScopeExternalSurface()); + bool(digest, dependencies.wholeSameScopeChannelCatalog()); + texts(digest, dependencies.channelCatalogContractKeys()); + } + + private static void orderKey(MessageDigest digest, + ExternalOrderKey orderKey) { + if (orderKey == null) { + digest.update((byte) 0); + return; + } + digest.update((byte) 1); + List components = orderKey.components(); + number(digest, components.size()); + for (Object component : components) { + if (component instanceof java.math.BigInteger integer) { + digest.update((byte) 1); + text(digest, integer.toString()); + } else if (component instanceof String value) { + digest.update((byte) 2); + text(digest, value); + } else { + throw new IllegalArgumentException( + "Unsupported external-order component " + component); + } + } + } + + private static void texts(MessageDigest digest, List values) { + number(digest, values.size()); + for (String value : values) { + text(digest, value); + } + } + + private static void nullableNumber(MessageDigest digest, Long value) { + digest.update(value == null ? (byte) 0 : (byte) 1); + if (value != null) { + number(digest, value); + } + } + + private static void bool(MessageDigest digest, boolean value) { + digest.update(value ? (byte) 1 : (byte) 0); + } + + private static void number(MessageDigest digest, long value) { + for (int shift = Long.SIZE - Byte.SIZE; shift >= 0; + shift -= Byte.SIZE) { + digest.update((byte) (value >>> shift)); + } + } + + private static void text(MessageDigest digest, String value) { + byte[] encoded = Objects.requireNonNull(value, "value") + .getBytes(StandardCharsets.UTF_8); + int length = encoded.length; + for (int shift = Integer.SIZE - Byte.SIZE; shift >= 0; + shift -= Byte.SIZE) { + digest.update((byte) (length >>> shift)); + } + digest.update(encoded); + } + + private static MessageDigest sha256() { + try { + return MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException impossible) { + throw new IllegalStateException("SHA-256 is unavailable", impossible); + } + } +} diff --git a/src/main/java/blue/coordination/internal/WholeObjectStore.java b/src/main/java/blue/coordination/internal/WholeObjectStore.java new file mode 100644 index 0000000..d1232eb --- /dev/null +++ b/src/main/java/blue/coordination/internal/WholeObjectStore.java @@ -0,0 +1,262 @@ +package blue.coordination.internal; + +import blue.coordination.api.Timeline; + +import blue.coordination.api.ExactValue; + +import blue.language.merge.ResolvedSnapshot; +import blue.language.model.Node; +import blue.language.snapshot.FrozenNode; +import blue.language.provider.NodeProvider; + +import java.util.Collections; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * In-memory whole-object store. + * + *

Requests, Timeline Entries, semantic Roots, and Process Embedded documents + * are retained as whole immutable values. The semantic value retained for API + * reads is intentionally separate from the representation returned through the + * Language provider. A provider representation may replace a managed child + * with a pure reference while preserving the exact same BlueId; this lets the + * frozen runtime use representation invariance without losing the fully + * materialized semantic value held by the document session.

+ */ +final class WholeObjectStore implements NodeProvider { + private final Map canonicalByBlueId = + new LinkedHashMap<>(); + private final Map providerByBlueId = + new LinkedHashMap<>(); + private final Map purposeByBlueId = new LinkedHashMap<>(); + private final List activeMarks = new ArrayList<>(); + private final EngineMetrics metrics; + + public WholeObjectStore(EngineMetrics metrics) { + this.metrics = Objects.requireNonNull(metrics, "metrics"); + } + + public ExactValue put(Node exact, String purpose) { + return put(ExactValue.verified(exact), purpose); + } + + /** Retains a resolver-owned immutable snapshot without re-freezing it. */ + public ExactValue put(ResolvedSnapshot snapshot, String purpose) { + return put(ExactValue.fromSnapshot(snapshot), purpose); + } + + /** Retains an already strict canonical frozen value without materializing. */ + public ExactValue put(FrozenNode frozen, String purpose) { + return put(ExactValue.fromFrozen(frozen), purpose); + } + + public synchronized ExactValue put( + ExactValue value, + String purpose) { + ExactValue checked = Objects.requireNonNull(value, "value"); + ExactValue existing = canonicalByBlueId.get(checked.blueId()); + if (existing != null) { + if (existing.frozen().isReferenceOnly() + && !checked.frozen().isReferenceOnly()) { + recordBeforeMutation(checked.blueId()); + canonicalByBlueId.put(checked.blueId(), checked); + ExactValue provider = providerByBlueId.get(checked.blueId()); + if (provider == null || provider.frozen().isReferenceOnly()) { + providerByBlueId.put(checked.blueId(), checked); + } + purposeByBlueId.put(checked.blueId(), sanitize(purpose)); + metrics.increment("wholeObjectStore.providerBodiesUpgraded"); + return checked; + } + metrics.increment(existing.frozen() == checked.frozen() + ? "wholeObjectStore.duplicates" + : "wholeObjectStore.representationVariants"); + // The canonical map keeps the richest semantic value, while the + // caller keeps the exact representation it supplied. This matters + // for compact Process Embedded shells that intentionally share the + // semantic object's BlueId. + return checked; + } + String normalizedPurpose = sanitize(purpose); + recordBeforeMutation(checked.blueId()); + canonicalByBlueId.put(checked.blueId(), checked); + providerByBlueId.put(checked.blueId(), checked); + purposeByBlueId.put(checked.blueId(), normalizedPurpose); + metrics.increment("wholeObjectStore.insertions"); + metrics.increment("wholeObjectStore.purpose." + normalizedPurpose); + return checked; + } + + /** + * Selects an identity-equivalent representation for provider-backed frozen + * calls without replacing the fully materialized semantic value. + */ + public synchronized void preferProviderRepresentation( + FrozenNode representation, + String purpose) { + ExactValue preferred = ExactValue.fromFrozen( + Objects.requireNonNull(representation, "representation")); + ExactValue canonical = canonicalByBlueId.get(preferred.blueId()); + if (canonical == null) { + throw new IllegalStateException( + "Cannot prefer an unknown exact object " + + preferred.blueId()); + } + if (preferred.frozen().isReferenceOnly()) { + throw new IllegalArgumentException( + "Provider preference must contain an exact object body"); + } + recordBeforeMutation(preferred.blueId()); + providerByBlueId.put(preferred.blueId(), preferred); + purposeByBlueId.put(preferred.blueId(), sanitize(purpose)); + metrics.increment("wholeObjectStore.providerRepresentationsPreferred"); + } + + public synchronized ExactValue require(String blueId) { + ExactValue value = canonicalByBlueId.get(Objects.requireNonNull( + blueId, "blueId")); + if (value == null) { + throw new IllegalArgumentException("Unknown exact object " + blueId); + } + metrics.increment("wholeObjectStore.reads"); + return value; + } + + public synchronized boolean contains(String blueId) { + return canonicalByBlueId.containsKey(Objects.requireNonNull( + blueId, "blueId")); + } + + public synchronized int size() { + return canonicalByBlueId.size(); + } + + /** Opens an O(1) nested savepoint; only later changed keys are journaled. */ + public synchronized Mark mark() { + Mark mark = new Mark(); + activeMarks.add(mark); + metrics.increment("wholeObjectStore.marksOpened"); + return mark; + } + + /** Commits one nested savepoint without copying or rewriting stored bodies. */ + public synchronized void commit(Mark mark) { + requireTopMark(mark); + activeMarks.remove(activeMarks.size() - 1); + mark.close(); + metrics.add("wholeObjectStore.markKeysCommitted", + mark.changedKeyCount()); + } + + /** Restores only keys changed after the supplied nested savepoint. */ + public synchronized void rollbackTo(Mark mark) { + requireTopMark(mark); + List> changes = new ArrayList<>( + mark.priorByBlueId.entrySet()); + for (int index = changes.size() - 1; index >= 0; index--) { + Map.Entry change = changes.get(index); + restore(canonicalByBlueId, change.getKey(), + change.getValue().canonical()); + restore(providerByBlueId, change.getKey(), + change.getValue().provider()); + restore(purposeByBlueId, change.getKey(), + change.getValue().purpose()); + } + activeMarks.remove(activeMarks.size() - 1); + mark.close(); + metrics.add("wholeObjectStore.markKeysRolledBack", changes.size()); + } + + @Override + public synchronized List fetchByBlueId(String blueId) { + ExactValue value = providerByBlueId.get(blueId); + if (value == null) { + return Collections.emptyList(); + } + metrics.increment("wholeObjectStore.providerReads"); + String purpose = purposeByBlueId.getOrDefault(blueId, "unknown"); + metrics.increment("wholeObjectStore.providerReads." + purpose); + return Collections.singletonList(value.copyNode()); + } + + private static String sanitize(String purpose) { + String checked = Objects.requireNonNull(purpose, "purpose").trim(); + if (checked.isEmpty()) { + return "unspecified"; + } + return checked.replaceAll("[^A-Za-z0-9_.-]", "_"); + } + + private void recordBeforeMutation(String blueId) { + if (activeMarks.isEmpty()) { + return; + } + PriorState prior = new PriorState( + prior(canonicalByBlueId, blueId), + prior(providerByBlueId, blueId), + prior(purposeByBlueId, blueId)); + for (Mark mark : activeMarks) { + mark.record(blueId, prior); + } + } + + private void requireTopMark(Mark mark) { + Mark checked = Objects.requireNonNull(mark, "mark"); + if (activeMarks.isEmpty() + || activeMarks.get(activeMarks.size() - 1) != checked + || !checked.active) { + throw new IllegalStateException( + "Whole-object savepoints must close in nested order"); + } + } + + private static Prior prior(Map source, String key) { + return new Prior<>(source.containsKey(key), source.get(key)); + } + + private static void restore( + Map target, + String key, + Prior prior) { + if (prior.present()) { + target.put(key, prior.value()); + } else { + target.remove(key); + } + } + + /** Delta-scoped nested object-store savepoint. */ + static final class Mark { + private final Map priorByBlueId = + new LinkedHashMap<>(); + private boolean active = true; + + private void record(String blueId, PriorState prior) { + if (!active) { + throw new IllegalStateException("Object-store mark is closed"); + } + priorByBlueId.putIfAbsent(blueId, prior); + } + + int changedKeyCount() { + return priorByBlueId.size(); + } + + private void close() { + active = false; + } + } + + private record Prior(boolean present, T value) { + } + + private record PriorState( + Prior canonical, + Prior provider, + Prior purpose) { + } +} diff --git a/src/main/java/blue/coordination/internal/WholeRequestEntryFactory.java b/src/main/java/blue/coordination/internal/WholeRequestEntryFactory.java new file mode 100644 index 0000000..6608a1b --- /dev/null +++ b/src/main/java/blue/coordination/internal/WholeRequestEntryFactory.java @@ -0,0 +1,305 @@ +package blue.coordination.internal; + +import blue.coordination.api.TimelineEntry; + +import blue.coordination.api.Timeline; + +import blue.coordination.api.Operation; + +import blue.coordination.api.ExactValue; + +import blue.language.merge.ResolvedSnapshot; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import blue.language.snapshot.FrozenNode; + +import java.math.BigInteger; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +/** + * Builds one whole request object and one whole Timeline Entry object. + * The entry contains one pure reference to the request; neither value is split. + * + *

Static event shape is resolved once per timeline/actor/operation/channel + * shape. Later entries use {@link FrozenNode} structural sharing to replace + * only timestamp, predecessor, and request reference. This is an exact + * Language-supported canonical edit, not an approximate hand-built event.

+ */ +final class WholeRequestEntryFactory { + private static final Set PRESERVED_EVENT_PATHS = + Set.of("/message/request"); + + private final BlueRuntime runtime; + private final WholeObjectStore objects; + private final EngineMetrics metrics; + private final Map eventTemplates = + new LinkedHashMap<>(); + + public WholeRequestEntryFactory( + BlueRuntime runtime, + WholeObjectStore objects, + EngineMetrics metrics) { + this.runtime = Objects.requireNonNull(runtime, "runtime"); + this.objects = Objects.requireNonNull(objects, "objects"); + this.metrics = Objects.requireNonNull(metrics, "metrics"); + } + + public TimelineEntry create( + Timeline timeline, + String previousEntryBlueId, + Operation operation, + long timestampMicros, + long globalSequence, + long timelineSequence) { + Objects.requireNonNull(timeline, "timeline"); + Objects.requireNonNull(operation, "operation"); + if (timestampMicros <= 0L) { + throw new IllegalArgumentException("timestampMicros must be positive"); + } + + ExactValue request = metrics.timed( + "append.request.retainWhole", + () -> exactRequest(operation)); + ExactValue event = metrics.timed( + "append.event.buildRetainWhole", + () -> exactEvent( + timeline, + previousEntryBlueId, + operation, + timestampMicros, + request, + "append")); + ExternalOrderKey journalOrderKey = ExternalOrderKey.of(List.of( + BigInteger.valueOf(timestampMicros), + timeline.timelineId(), + event.blueId())); + metrics.increment("append.entriesBuilt"); + return new TimelineEntry( + event, + request, + journalOrderKey, + journalOrderKey, + timeline, + operation.operation(), + operation.channel(), + timestampMicros, + globalSequence, + timelineSequence); + } + + /** Retains one already exact external envelope without rebuilding it. */ + public TimelineEntry createExact( + Timeline registeredTimeline, + ExactValue exactEvent, + long globalSequence, + long timelineSequence) { + Objects.requireNonNull(registeredTimeline, "registeredTimeline"); + ExactValue supplied = Objects.requireNonNull( + exactEvent, "exactEvent"); + FrozenNode root = supplied.frozen(); + String timelineId = (String) root.at( + "/timeline/timelineId").getValue(); + String actorId = (String) root.at("/actor/accountId").getValue(); + if (!registeredTimeline.equals(new Timeline(timelineId, actorId))) { + throw new IllegalArgumentException( + "Timeline Entry does not match the registered Timeline"); + } + long timestamp = new BigInteger( + root.at("/timestamp").getValue().toString()).longValueExact(); + String operation = (String) root.at( + "/message/operation").getValue(); + String channel = (String) root.at("/message/channel").getValue(); + FrozenNode requestNode = root.at("/message/request"); + ExactValue request = requestNode.isReferenceOnly() + ? objects.require(requestNode.getReferenceBlueId()) + : objects.put(requestNode, "timeline-request"); + ExactValue retainedEvent = objects.put( + supplied, "timeline-entry"); + ExternalOrderKey order = ExternalOrderKey.of(List.of( + BigInteger.valueOf(timestamp), + timelineId, + retainedEvent.blueId())); + metrics.increment("append.entriesBuilt"); + return new TimelineEntry( + retainedEvent, + request, + order, + order, + registeredTimeline, + operation, + channel, + timestamp, + globalSequence, + timelineSequence); + } + + public ExactValue parseExactRequest(String requestYaml) { + return exactRequest(Operation.yaml( + "requestOnly", "requestOnly", requestYaml)); + } + + ExactValue createProcessorOwnedEvent( + Timeline timeline, + String previousEntryBlueId, + long timestampMicros, + ExactValue request) { + return exactEvent( + timeline, + previousEntryBlueId, + Operation.exact( + EmbeddedEpochInput.INTERNAL_OPERATION, + EmbeddedEpochInput.INTERNAL_CHANNEL, + request), + timestampMicros, + request, + "process.embeddedInput"); + } + + private ExactValue exactRequest(Operation operation) { + if (operation.exactRequest().isPresent()) { + metrics.increment("append.exactRequestsReused"); + return objects.put( + operation.exactRequest().orElseThrow(), + "timeline-request"); + } + Node source = runtime.parseSourceYaml( + operation.requestYaml().orElseThrow()); + Node preprocessed = runtime.preprocess(source); + ResolvedSnapshot snapshot = runtime.cache( + runtime.resolveToSnapshot(preprocessed)); + return objects.put(snapshot, "timeline-request"); + } + + private ExactValue exactEvent( + Timeline timeline, + String previousEntryBlueId, + Operation operation, + long timestampMicros, + ExactValue request, + String metricPrefix) { + EventShapeKey key = new EventShapeKey( + timeline.timelineId(), + timeline.actorId(), + operation.operation(), + operation.channel(), + previousEntryBlueId != null); + FrozenNode template; + synchronized (eventTemplates) { + template = eventTemplates.get(key); + if (template == null) { + template = compileTemplate( + timeline, + previousEntryBlueId, + operation, + timestampMicros, + request); + eventTemplates.put(key, template); + metrics.increment(metricPrefix + ".eventTemplatesCompiled"); + } else { + metrics.increment(metricPrefix + ".eventTemplateHits"); + } + } + + FrozenNode message = requireChild(template, "message") + .withProperty("request", reference(request.blueId())); + FrozenNode event = template + .withProperty("timestamp", scalar(timestampMicros)) + .withProperty("message", message) + .withProperty( + "prevEntry", + previousEntryBlueId == null + ? null + : reference(previousEntryBlueId)); + FrozenNode requestNode = event.at("/message/request"); + if (requestNode == null + || !request.blueId().equals(requestNode.getReferenceBlueId())) { + throw new IllegalStateException( + "Timeline Entry request must remain one whole-object reference"); + } + return objects.put(event, "timeline-entry"); + } + + private FrozenNode compileTemplate( + Timeline timeline, + String previousEntryBlueId, + Operation operation, + long timestampMicros, + ExactValue request) { + Node timelineNode = new Node() + .type("MyOS/MyOS Timeline") + .properties("timelineId", scalarNode(timeline.timelineId())); + Node actorNode = new Node() + .type("MyOS/Principal Actor") + .properties("accountId", scalarNode(timeline.actorId())); + Node messageNode = new Node() + .type("Coordination/Operation Request") + .properties(new LinkedHashMap<>(Map.of( + "operation", scalarNode(operation.operation()), + "channel", scalarNode(operation.channel()), + "request", request.referenceNode()))); + Map properties = new LinkedHashMap<>(); + properties.put("timeline", timelineNode); + if (previousEntryBlueId != null) { + properties.put("prevEntry", new Node().blueId(previousEntryBlueId)); + } + properties.put("timestamp", new Node().value(timestampMicros)); + properties.put("actor", actorNode); + properties.put("message", messageNode); + Node source = new Node() + .type("Coordination/Timeline Entry") + .properties(properties); + Node preprocessed = runtime.preprocess(source); + ResolvedSnapshot snapshot = runtime.resolveToSnapshotPreservingPaths( + preprocessed, PRESERVED_EVENT_PATHS); + return snapshot.frozenCanonicalRoot(); + } + + private static FrozenNode requireChild(FrozenNode parent, String key) { + FrozenNode child = parent.property(key); + if (child == null) { + throw new IllegalStateException("Event template has no " + key); + } + return child; + } + + private static FrozenNode reference(String blueId) { + return FrozenNode.fromNode(new Node().blueId( + Objects.requireNonNull(blueId, "blueId"))); + } + + private static FrozenNode scalar(Object value) { + return FrozenNode.fromNode(new Node().value( + Objects.requireNonNull(value, "value"))); + } + + private static Node scalarNode(String value) { + return new Node().value(Objects.requireNonNull(value, "value")) + .inlineValue(true); + } + + private record EventShapeKey( + String timelineId, + String actorId, + String operation, + String channel, + boolean hasPreviousEntry) { + private EventShapeKey { + timelineId = requireText(timelineId, "timelineId"); + actorId = requireText(actorId, "actorId"); + operation = requireText(operation, "operation"); + channel = requireText(channel, "channel"); + } + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java b/src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java index b280425..35b73d4 100644 --- a/src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java +++ b/src/main/java/blue/coordination/processor/AllTimelinesChannelProcessor.java @@ -5,31 +5,60 @@ import blue.language.processor.ChannelEvaluation; import blue.language.processor.ChannelEvaluationContext; import blue.language.processor.ChannelProcessor; +import blue.language.processor.ExternalChannelSubscriptionFunctions; +import blue.language.processor.ExternalOrderKey; import blue.language.processor.model.ChannelContract; import blue.repo.coordination.AllTimelinesChannel; import blue.repo.coordination.TimelineChannel; import java.util.Map; +/** Evaluates the deterministic union of every same-scope Timeline Channel. */ public final class AllTimelinesChannelProcessor implements ChannelProcessor { + private final CoordinationSemanticTypeIdentities identities; + private final ExternalChannelSubscriptionFunctions< + AllTimelinesChannel> subscriptionFunctions; + + public AllTimelinesChannelProcessor() { + this.identities = CoordinationSemanticTypeIdentities + .publishedDefaults(); + this.subscriptionFunctions = + AllTimelinesExternalSubscriptionFunctions.INSTANCE; + } + + AllTimelinesChannelProcessor( + String timelineChannelTypeBlueId, + CoordinationSemanticTypeIdentities identities) { + this.identities = java.util.Objects.requireNonNull( + identities, "identities"); + this.subscriptionFunctions = + new AllTimelinesExternalSubscriptionFunctions( + timelineChannelTypeBlueId, + identities); + } + @Override public Class contractType() { return AllTimelinesChannel.class; } + @Override + public ExternalChannelSubscriptionFunctions + externalSubscriptionFunctions() { + return subscriptionFunctions; + } + @Override public ChannelEvaluation evaluate(AllTimelinesChannel contract, ChannelEvaluationContext context) { Node event = context.event(); - if (!CoordinationEventNodes.isTimelineEntry(event)) { + if (!CoordinationEventNodes.isTimelineEntry(event, identities)) { return ChannelEvaluation.noMatch(); } MatchingTimeline matching = matchingTimeline(context); if (matching == null) { return ChannelEvaluation.noMatch(); } - return TimelineProviderSupport.preserveUnionDelivery(matching.evaluation, - event, - "allTimelinesSourceChannelKey", - matching.channelKey); + return TimelineProviderSupport.preserveUnionPayload( + matching.evaluation, event); } private MatchingTimeline matchingTimeline(ChannelEvaluationContext context) { @@ -66,29 +95,35 @@ private ChannelEvaluation evaluateChild(ChannelProcessor processor, } @Override - public boolean isNewerEvent(AllTimelinesChannel contract, ChannelCheckpointContext context) { - return TimelineProviderSupport.isNewerOrDifferentTimelineEvent(context); + public boolean isNewerEvent(AllTimelinesChannel contract, + ChannelCheckpointContext context) { + return TimelineProviderSupport.isNewerTimelineSubject( + context, + AllTimelinesExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION); } private int order(ChannelContract contract) { return contract.getOrder() != null ? contract.getOrder() : 0; } - private static final class MatchingTimeline { + static final class MatchingTimeline { private final String channelKey; private final int order; private final ChannelEvaluation evaluation; - private MatchingTimeline(String channelKey, int order, ChannelEvaluation evaluation) { + MatchingTimeline(String channelKey, int order, ChannelEvaluation evaluation) { this.channelKey = channelKey; this.order = order; this.evaluation = evaluation; } - private boolean precedes(MatchingTimeline other) { + boolean precedes(MatchingTimeline other) { int orderComparison = Integer.compare(order, other.order); return orderComparison < 0 - || (orderComparison == 0 && channelKey.compareTo(other.channelKey) < 0); + || (orderComparison == 0 + && ExternalOrderKey.compareTextCodePoints( + channelKey, other.channelKey) < 0); } } } diff --git a/src/main/java/blue/coordination/processor/AllTimelinesExternalSubscriptionFunctions.java b/src/main/java/blue/coordination/processor/AllTimelinesExternalSubscriptionFunctions.java new file mode 100644 index 0000000..5bf7098 --- /dev/null +++ b/src/main/java/blue/coordination/processor/AllTimelinesExternalSubscriptionFunctions.java @@ -0,0 +1,224 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.ExternalChannelMemberSnapshot; +import blue.language.processor.ExternalChannelSubscriptionFunctions; +import blue.language.processor.GasChargeContext; +import blue.repo.coordination.AllTimelinesChannel; +import blue.repo.coordination.TimelineChannel; + +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +/** + * Immutable subscription behavior for the union of every same-scope Timeline + * Channel subtype. + * + *

Membership comes from Language's verified effective-channel catalog. + * The first accepting member owns the derived order subject, while the + * aggregate still represents one logical source delivery.

+ */ +final class AllTimelinesExternalSubscriptionFunctions + implements ExternalChannelSubscriptionFunctions< + AllTimelinesChannel> { + + static final AllTimelinesExternalSubscriptionFunctions INSTANCE = + new AllTimelinesExternalSubscriptionFunctions( + CoordinationCurrentRepositoryIdentities.current() + .timelineChannelBlueId(), + CoordinationSemanticTypeIdentities.publishedDefaults()); + static final String ALL_TIMELINES_KEY = + "blue.coordination/1.0/all-timelines"; + static final String ORDER_SUBJECT_VERSION = + "blue.coordination/1.0/all-timelines-order-subject-v3"; + + private final String timelineChannelTypeBlueId; + private final CoordinationSemanticTypeIdentities identities; + private final TimelineExternalSubscriptionFunctions + timelineFunctions; + + AllTimelinesExternalSubscriptionFunctions( + String timelineChannelTypeBlueId, + CoordinationSemanticTypeIdentities identities) { + this.timelineChannelTypeBlueId = Objects.requireNonNull( + timelineChannelTypeBlueId, + "timelineChannelTypeBlueId"); + this.identities = Objects.requireNonNull( + identities, "identities"); + this.timelineFunctions = + TimelineExternalSubscriptionFunctions.with( + this.identities); + } + + @Override + public List channelKeys( + AllTimelinesChannel immutableContractSnapshot, + ExternalChannelFunctionContext context) { + return CoordinationRuntimeGas.inComponent( + context.runtimeWorkSession(), + () -> { + /* + * Enumerating the exact Timeline type family records the + * membership dependency, including an empty family. Event + * evaluation can select any member, so promote every + * Timeline member header now as well. + */ + List members = + members(context); + chargeMemberVisits( + context, + members.size(), + "project All Timelines member headers"); + for (ExternalChannelMemberSnapshot member + : members) { + member.checkpointDomainBlueId(); + } + return Collections.singletonList( + ALL_TIMELINES_KEY); + }); + } + + @Override + public List eventKeys( + Node exactEvent, + ExternalChannelFunctionContext context) { + return !timelineFunctions.eventKeys( + exactEvent, context).isEmpty() + ? Collections.singletonList(ALL_TIMELINES_KEY) + : Collections.emptyList(); + } + + @Override + public boolean accepts( + AllTimelinesChannel immutableContractSnapshot, + Node exactEvent, + ExternalChannelFunctionContext context) { + return winning(exactEvent, context) != null; + } + + @Override + public Node payload( + AllTimelinesChannel immutableContractSnapshot, + Node exactEvent, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .payload(exactEvent, context, identities); + } + + @Override + public Node checkpointSubject( + AllTimelinesChannel immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + TimelineMemberSubscriptions.WinningMember winner = + requireWinner(exactEvent, context); + return TimelineProviderSupport.memberTimelineOrderSubject( + ORDER_SUBJECT_VERSION, + winner.member(), + winner.evaluation().checkpointSubject()); + } + + @Override + public String handlerChannelKey( + AllTimelinesChannel immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .handlerChannelKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + identities); + } + + @Override + public String logicalDeliveryKey( + AllTimelinesChannel immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .logicalDeliveryKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + identities); + } + + @Override + public String checkpointDomainDiscriminator( + AllTimelinesChannel immutableContractSnapshot, + ExternalChannelFunctionContext context) { + OperationRequestRoutingFunctions + .declareTargetChannelCatalog( + context); + return "coordination.all-timelines:" + + "timeline-type-family-v2" + + semanticProfileSuffix() + + "|subject=" + + ORDER_SUBJECT_VERSION; + } + + private String semanticProfileSuffix() { + return identities.custom() + ? "|semantic-profile=" + identities.profileIdentity() + : ""; + } + + private TimelineMemberSubscriptions.WinningMember winning( + Node exactEvent, + ExternalChannelFunctionContext context) { + return CoordinationRuntimeGas.inComponent( + context.runtimeWorkSession(), + () -> { + List members = + members(context); + return TimelineMemberSubscriptions.winning( + members, + exactEvent, + () -> chargeMemberVisits( + context, + 1, + "evaluate All Timelines member")); + }); + } + + private TimelineMemberSubscriptions.WinningMember requireWinner( + Node exactEvent, + ExternalChannelFunctionContext context) { + TimelineMemberSubscriptions.WinningMember winner = + winning(exactEvent, context); + if (winner == null) { + throw new IllegalStateException( + "All Timelines payload requires an accepting member"); + } + return winner; + } + + private List members( + ExternalChannelFunctionContext context) { + return TimelineMemberSubscriptions.shallowAllTimelineMembers( + context, timelineChannelTypeBlueId); + } + + private static void chargeMemberVisits( + ExternalChannelFunctionContext context, + int quantity, + String reason) { + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "allTimelinesMemberVisited", + quantity, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + reason)); + } +} diff --git a/src/main/java/blue/coordination/processor/BlueSemanticIdentity.java b/src/main/java/blue/coordination/processor/BlueSemanticIdentity.java index 7584a8f..3b6884f 100644 --- a/src/main/java/blue/coordination/processor/BlueSemanticIdentity.java +++ b/src/main/java/blue/coordination/processor/BlueSemanticIdentity.java @@ -1,79 +1,145 @@ package blue.coordination.processor; -import blue.language.Blue; import blue.language.model.Node; -import blue.language.utils.BlueIdCalculator; -import blue.language.utils.BlueIds; -import blue.repo.BlueRepository; -import java.util.LinkedHashMap; -import java.util.Map; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.identity.BlueIds; +import blue.language.mapping.BlueMapper; +/** + * Compares Blue values by semantic identity rather than serialized + * representation. + * + *

Reference-only nodes keep their declared identity. Equality completes + * materialized values through Language's current mapping and identity APIs, + * while exact event/checkpoint identity hashes Language's canonical exact + * representation without recursively opening opaque header references.

+ */ final class BlueSemanticIdentity { - private static final int IDENTITY_CACHE_SIZE = 1024; - private static final ThreadLocal CONTEXT = new ThreadLocal() { - @Override - protected IdentityContext initialValue() { - return new IdentityContext(); - } - }; + private static final BlueMapper REPOSITORY_MAPPER = + BlueMapper.builder() + .scanPackage("blue.repo") + .build(); private BlueSemanticIdentity() { } static boolean equals(Node left, Node right) { - return left != null && right != null && identity(left).equals(identity(right)); - } - - static boolean matchesType(Node node, Node expectedType) { - if (node == null || expectedType == null) { + if (left == null || right == null) { return false; } - if (node.isReferenceOnly()) { - identity(node); - return true; + if (left.isReferenceOnly() + && right.isReferenceOnly()) { + return referenceIdentity(left).equals( + referenceIdentity(right)); + } + if (left.isReferenceOnly()) { + return referenceMatches(referenceIdentity(left), right); } - return CONTEXT.get().blue.nodeMatchesType(node, expectedType); + if (right.isReferenceOnly()) { + return referenceMatches(referenceIdentity(right), left); + } + Node leftExact = exactCopy(left); + Node rightExact = exactCopy(right); + Class leftClass = semanticClass(leftExact); + Class rightClass = semanticClass(rightExact); + /* + * A typed parent can legitimately omit the type on one of its + * authored children. Mapping the two values through the class known + * by either representation preserves that authored semantic shape. + */ + return semanticIdentity( + leftExact, + leftClass != null ? leftClass : rightClass) + .equals(semanticIdentity( + rightExact, + rightClass != null ? rightClass : leftClass)); } - private static String identity(Node node) { + static String identity(Node node) { + if (node == null) { + throw new IllegalArgumentException( + "Semantic identity node must be present"); + } if (node.isReferenceOnly()) { - return BlueIds.requireBlueIdOrCyclicMember(node.getBlueId(), "Semantic identity reference"); + return BlueIds.requireBlueIdOrCyclicMember( + node.getBlueId(), + "Exact identity reference"); } - Blue blue = CONTEXT.get().blue; - Object typedValue = blue.nodeToObject(node, Object.class); - if (typedValue != null && !(typedValue instanceof Node)) { - return identity(blue.objectToNode(typedValue), blue); + return DirectBlueIdCalculator.calculateBlueId( + CoordinationProcessHeaderBridge + .canonicalExactCopy(node)); + } + + private static String semanticIdentity( + Node exact, + Class semanticClass) { + return DirectBlueIdCalculator.calculateBlueId( + normalize(exact, semanticClass)); + } + + private static Node normalize( + Node exact, + Class semanticClass) { + if (semanticClass != null) { + /* + * Repository completion contributes inherited field + * descriptions and schemas to resolved generated values. The + * generated-object round trip projects those values back to + * their authored semantic fields before comparison, while the + * canonical exact copy above prevents a resolved nominal type + * from becoming an illegal mixed BlueId node. + */ + exact = REPOSITORY_MAPPER.toNode( + REPOSITORY_MAPPER.fromNode( + exact, semanticClass)); } - return blue.calculateSemanticBlueId(node); + return exact; } - private static String identity(Node node, Blue blue) { - String representationIdentity = BlueIdCalculator.calculateBlueId(node); - String cached = cachedIdentity(representationIdentity); - if (cached != null) { - return cached; + private static boolean referenceMatches( + String referenceIdentity, + Node materialized) { + Node exact = exactCopy(materialized); + Class semanticClass = semanticClass(exact); + Node normalized = normalize(exact, semanticClass); + if (referenceIdentity.equals( + DirectBlueIdCalculator.calculateBlueId(normalized))) { + return true; + } + if (semanticClass == null) { + return false; } - String calculated = blue.calculateSemanticBlueId(node); - cacheIdentity(representationIdentity, calculated); - return calculated; + /* + * A reference can have been calculated while the value was an + * untyped child of a typed parent. Retain the exact authored fields + * and omit only the inferred root type when checking that legitimate + * representation. Nested field types and all content remain + * identity-bearing. + */ + Node inferredChildProjection = + normalized.clone() + .type((Node) null); + return referenceIdentity.equals( + DirectBlueIdCalculator.calculateBlueId( + inferredChildProjection)); } - private static String cachedIdentity(String representationIdentity) { - return CONTEXT.get().valueIdentities.get(representationIdentity); + private static Class semanticClass(Node exact) { + return REPOSITORY_MAPPER.mappedClass(exact) + .filter(candidate -> + !Object.class.equals(candidate) + && !Node.class.equals(candidate)) + .orElse(null); } - private static void cacheIdentity(String representationIdentity, String valueIdentity) { - CONTEXT.get().valueIdentities.put(representationIdentity, valueIdentity); + private static Node exactCopy(Node node) { + return CoordinationProcessHeaderBridge + .canonicalExactCopy(node); } - private static final class IdentityContext { - private final Blue blue = BlueRepository.latest().configure(new Blue()); - private final Map valueIdentities = - new LinkedHashMap(IDENTITY_CACHE_SIZE, 0.75f, true) { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > IDENTITY_CACHE_SIZE; - } - }; + private static String referenceIdentity(Node node) { + return BlueIds.requireBlueIdOrCyclicMember( + node.getBlueId(), + "Semantic identity reference"); } } diff --git a/src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java b/src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java index a302de2..5f78be0 100644 --- a/src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java +++ b/src/main/java/blue/coordination/processor/ChatWorkflowOperationProcessor.java @@ -7,7 +7,13 @@ import blue.language.processor.ProcessorExecutionContext; import blue.repo.coordination.ChatWorkflowOperation; import blue.repo.coordination.SequentialWorkflow; +import java.util.Collections; +import java.util.List; +/** + * Routes a fixed-repository Chat Workflow Operation and executes its ordered + * workflow steps after the owning Operation Request matches. + */ public final class ChatWorkflowOperationProcessor implements HandlerProcessor { private final SequentialWorkflowRunner runner; private final OperationRequestMatcher matcher = new OperationRequestMatcher(); @@ -28,9 +34,18 @@ public Class contractType() { return ChatWorkflowOperation.class; } + @Override + public List executableBodyFields() { + return Collections.singletonList("steps"); + } + @Override public String deriveChannel(ChatWorkflowOperation contract, HandlerRegistrationContext context) { - String channel = trimToNull(contract.getChannel()); + String channel = HandlerChannelResolver.resolve( + contract != null + ? contract.getChannel() + : null, + context); if (channel != null && !context.hasContract(channel)) { throw new IllegalStateException("Chat workflow operation '" + context.handlerKey() + "' references unknown channel '" + channel + "'"); @@ -48,11 +63,4 @@ public void execute(ChatWorkflowOperation contract, ProcessorExecutionContext co runner.execute(new SequentialWorkflow().steps(contract.getSteps()), context); } - private static String trimToNull(String value) { - if (value == null) { - return null; - } - String trimmed = value.trim(); - return trimmed.isEmpty() ? null : trimmed; - } } diff --git a/src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java b/src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java index 4a6093d..d30cf30 100644 --- a/src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java +++ b/src/main/java/blue/coordination/processor/CompositeTimelineChannelProcessor.java @@ -5,6 +5,8 @@ import blue.language.processor.ChannelEvaluation; import blue.language.processor.ChannelEvaluationContext; import blue.language.processor.ChannelProcessor; +import blue.language.processor.ExternalChannelSubscriptionFunctions; +import blue.language.processor.ExternalOrderKey; import blue.language.processor.model.ChannelContract; import blue.repo.coordination.CompositeTimelineChannel; import blue.repo.coordination.TimelineChannel; @@ -12,12 +14,36 @@ import java.util.List; import java.util.Set; +/** Evaluates the deterministic union of explicitly listed Timeline Channels. */ public final class CompositeTimelineChannelProcessor implements ChannelProcessor { + private final ExternalChannelSubscriptionFunctions< + CompositeTimelineChannel> subscriptionFunctions; + + public CompositeTimelineChannelProcessor() { + this.subscriptionFunctions = + CompositeTimelineExternalSubscriptionFunctions.INSTANCE; + } + + CompositeTimelineChannelProcessor( + String timelineChannelTypeBlueId, + CoordinationSemanticTypeIdentities identities) { + this.subscriptionFunctions = + new CompositeTimelineExternalSubscriptionFunctions( + timelineChannelTypeBlueId, + identities); + } + @Override public Class contractType() { return CompositeTimelineChannel.class; } + @Override + public ExternalChannelSubscriptionFunctions< + CompositeTimelineChannel> externalSubscriptionFunctions() { + return subscriptionFunctions; + } + @Override public ChannelEvaluation evaluate(CompositeTimelineChannel contract, ChannelEvaluationContext context) { List channels = contract.getChannels(); @@ -63,10 +89,8 @@ public ChannelEvaluation evaluate(CompositeTimelineChannel contract, ChannelEval if (matching == null) { return ChannelEvaluation.noMatch(); } - return TimelineProviderSupport.preserveUnionDelivery(matching.evaluation, - context.event(), - "compositeSourceChannelKey", - matching.channelKey); + return TimelineProviderSupport.preserveUnionPayload( + matching.evaluation, context.event()); } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -77,8 +101,12 @@ private ChannelEvaluation evaluateChild(ChannelProcessor processor, } @Override - public boolean isNewerEvent(CompositeTimelineChannel contract, ChannelCheckpointContext context) { - return TimelineProviderSupport.isNewerOrDifferentTimelineEvent(context); + public boolean isNewerEvent(CompositeTimelineChannel contract, + ChannelCheckpointContext context) { + return TimelineProviderSupport.isNewerTimelineSubject( + context, + CompositeTimelineExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION); } private String trimToNull(String value) { @@ -93,21 +121,23 @@ private int order(ChannelContract contract) { return contract.getOrder() != null ? contract.getOrder() : 0; } - private static final class MatchingChild { + static final class MatchingChild { private final String channelKey; private final int order; private final ChannelEvaluation evaluation; - private MatchingChild(String channelKey, int order, ChannelEvaluation evaluation) { + MatchingChild(String channelKey, int order, ChannelEvaluation evaluation) { this.channelKey = channelKey; this.order = order; this.evaluation = evaluation; } - private boolean precedes(MatchingChild other) { + boolean precedes(MatchingChild other) { int orderComparison = Integer.compare(order, other.order); return orderComparison < 0 - || (orderComparison == 0 && channelKey.compareTo(other.channelKey) < 0); + || (orderComparison == 0 + && ExternalOrderKey.compareTextCodePoints( + channelKey, other.channelKey) < 0); } } } diff --git a/src/main/java/blue/coordination/processor/CompositeTimelineExternalSubscriptionFunctions.java b/src/main/java/blue/coordination/processor/CompositeTimelineExternalSubscriptionFunctions.java new file mode 100644 index 0000000..26cb649 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CompositeTimelineExternalSubscriptionFunctions.java @@ -0,0 +1,216 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.ExternalChannelMemberSnapshot; +import blue.language.processor.ExternalChannelSubscriptionFunctions; +import blue.language.processor.GasChargeContext; +import blue.repo.coordination.CompositeTimelineChannel; +import blue.repo.coordination.TimelineChannel; + +import java.util.List; +import java.util.Objects; + +/** + * Immutable subscription behavior for an explicitly declared union of + * Timeline Channel members. + * + *

The member list is resolved through Language's effective-channel + * catalog, so base Timeline Channels and verified subtypes share the same + * matching, checkpoint, and logical-delivery rules.

+ */ +final class CompositeTimelineExternalSubscriptionFunctions + implements ExternalChannelSubscriptionFunctions< + CompositeTimelineChannel> { + + static final CompositeTimelineExternalSubscriptionFunctions INSTANCE = + new CompositeTimelineExternalSubscriptionFunctions( + CoordinationCurrentRepositoryIdentities.current() + .timelineChannelBlueId(), + CoordinationSemanticTypeIdentities.publishedDefaults()); + static final String ORDER_SUBJECT_VERSION = + "blue.coordination/1.0/composite-timeline-order-subject-v3"; + + private final String timelineChannelTypeBlueId; + private final CoordinationSemanticTypeIdentities identities; + private final TimelineExternalSubscriptionFunctions + timelineFunctions; + + CompositeTimelineExternalSubscriptionFunctions( + String timelineChannelTypeBlueId, + CoordinationSemanticTypeIdentities identities) { + this.timelineChannelTypeBlueId = Objects.requireNonNull( + timelineChannelTypeBlueId, + "timelineChannelTypeBlueId"); + this.identities = Objects.requireNonNull( + identities, "identities"); + this.timelineFunctions = + TimelineExternalSubscriptionFunctions.with( + this.identities); + } + + @Override + public List channelKeys( + CompositeTimelineChannel immutableContractSnapshot, + ExternalChannelFunctionContext context) { + return CoordinationRuntimeGas.inComponent( + context.runtimeWorkSession(), + () -> { + List members = + members( + immutableContractSnapshot, + context); + chargeMemberVisits( + context, + members.size(), + "project Composite Timeline member keys"); + return TimelineMemberSubscriptions + .unionChannelKeys(members); + }); + } + + @Override + public List eventKeys( + Node exactEvent, + ExternalChannelFunctionContext context) { + return timelineFunctions.eventKeys(exactEvent, context); + } + + @Override + public boolean accepts( + CompositeTimelineChannel immutableContractSnapshot, + Node exactEvent, + ExternalChannelFunctionContext context) { + return winning(immutableContractSnapshot, + exactEvent, context) != null; + } + + @Override + public Node payload( + CompositeTimelineChannel immutableContractSnapshot, + Node exactEvent, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .payload(exactEvent, context, identities); + } + + @Override + public Node checkpointSubject( + CompositeTimelineChannel immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + TimelineMemberSubscriptions.WinningMember winner = + requireWinner(immutableContractSnapshot, + exactEvent, context); + return TimelineProviderSupport.memberTimelineOrderSubject( + ORDER_SUBJECT_VERSION, + winner.member(), + winner.evaluation().checkpointSubject()); + } + + @Override + public String handlerChannelKey( + CompositeTimelineChannel immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .handlerChannelKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + identities); + } + + @Override + public String logicalDeliveryKey( + CompositeTimelineChannel immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .logicalDeliveryKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + identities); + } + + @Override + public String checkpointDomainDiscriminator( + CompositeTimelineChannel immutableContractSnapshot, + ExternalChannelFunctionContext context) { + OperationRequestRoutingFunctions + .declareTargetChannelCatalog( + context); + return "coordination.composite-timeline:" + + "direct-timeline-members-v2" + + semanticProfileSuffix() + + "|subject=" + + ORDER_SUBJECT_VERSION; + } + + private String semanticProfileSuffix() { + return identities.custom() + ? "|semantic-profile=" + identities.profileIdentity() + : ""; + } + + private TimelineMemberSubscriptions.WinningMember winning( + CompositeTimelineChannel contract, + Node exactEvent, + ExternalChannelFunctionContext context) { + return CoordinationRuntimeGas.inComponent( + context.runtimeWorkSession(), + () -> { + List members = + members(contract, context); + return TimelineMemberSubscriptions.winning( + members, + exactEvent, + () -> chargeMemberVisits( + context, + 1, + "evaluate Composite Timeline member")); + }); + } + + private TimelineMemberSubscriptions.WinningMember requireWinner( + CompositeTimelineChannel contract, + Node exactEvent, + ExternalChannelFunctionContext context) { + TimelineMemberSubscriptions.WinningMember winner = + winning(contract, exactEvent, context); + if (winner == null) { + throw new IllegalStateException( + "Composite Timeline payload requires an accepting " + + "member"); + } + return winner; + } + + private List members( + CompositeTimelineChannel contract, + ExternalChannelFunctionContext context) { + return TimelineMemberSubscriptions.shallowCompositeMembers( + contract, context, timelineChannelTypeBlueId); + } + + private static void chargeMemberVisits( + ExternalChannelFunctionContext context, + int quantity, + String reason) { + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "compositeMemberVisited", + quantity, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + reason)); + } +} diff --git a/src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java b/src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java index e0b4c20..5891056 100644 --- a/src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java +++ b/src/main/java/blue/coordination/processor/CoordinationBexIntrinsics.java @@ -1,95 +1,35 @@ package blue.coordination.processor; -import blue.bex.api.BexIntrinsicInvocation; import blue.bex.api.BexIntrinsicProcessor; import blue.bex.api.BexIntrinsicRegistry; -import blue.bex.value.BexValue; -import blue.bex.value.BexValues; -import blue.repo.common.CryptoEd25519Verify; -import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; -import org.bouncycastle.crypto.signers.Ed25519Signer; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; +import blue.coordination.processor.support.CoordinationBexIntrinsicsSupport; +/** Stable public facade for Coordination's hosted-BEX intrinsic catalog. */ public final class CoordinationBexIntrinsics { - public static final long COMMON_CRYPTO_ED25519_VERIFY_GAS = 500L; + public static final String COMMON_CRYPTO_REGISTRY_IDENTITY = + CoordinationBexIntrinsicsSupport + .COMMON_CRYPTO_REGISTRY_IDENTITY; + public static final String COMMON_CRYPTO_ED25519_VERIFY_COUNTER = + CoordinationBexIntrinsicsSupport + .COMMON_CRYPTO_ED25519_VERIFY_COUNTER; + public static final long COMMON_CRYPTO_ED25519_VERIFY_GAS = + CoordinationBexIntrinsicsSupport + .COMMON_CRYPTO_ED25519_VERIFY_GAS; private CoordinationBexIntrinsics() { } public static BexIntrinsicRegistry common() { - return registerCommon(BexIntrinsicRegistry.empty()); + return CoordinationBexIntrinsicsSupport.common(); } - public static BexIntrinsicRegistry registerCommon(BexIntrinsicRegistry registry) { - BexIntrinsicRegistry base = registry != null ? registry : BexIntrinsicRegistry.empty(); - return base.with(CryptoEd25519Verify.class, commonCryptoEd25519Verify()); + public static BexIntrinsicRegistry registerCommon( + BexIntrinsicRegistry registry) { + return CoordinationBexIntrinsicsSupport.registerCommon(registry); } public static BexIntrinsicProcessor commonCryptoEd25519Verify() { - return invocation -> { - invocation.chargeGas(COMMON_CRYPTO_ED25519_VERIFY_GAS); - return BexValues.scalar(verifyEd25519(invocation)); - }; - } - - private static boolean verifyEd25519(BexIntrinsicInvocation invocation) { - String publicKeyText = textField(invocation.field("publicKey")); - String message = textField(invocation.field("message")); - String signatureText = textField(invocation.field("signature")); - if (publicKeyText == null || message == null || signatureText == null) { - return false; - } - - byte[] publicKey = decodeBase64Url(publicKeyText, 32); - byte[] signature = decodeBase64Url(signatureText, 64); - if (publicKey == null || signature == null) { - return false; - } - - try { - Ed25519Signer verifier = new Ed25519Signer(); - verifier.init(false, new Ed25519PublicKeyParameters(publicKey, 0)); - byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8); - verifier.update(messageBytes, 0, messageBytes.length); - return verifier.verifySignature(signature); - } catch (RuntimeException ex) { - return false; - } - } - - private static String textField(BexValue value) { - if (value == null - || value.isUndefined() - || value.isNull() - || !"text".equals(BexValues.kind(value))) { - return null; - } - return value.asText(); - } - - private static byte[] decodeBase64Url(String value, int expectedLength) { - if (value == null) { - return null; - } - String normalized = value.trim(); - int remainder = normalized.length() % 4; - if (remainder == 1) { - return null; - } - if (remainder != 0) { - StringBuilder builder = new StringBuilder(normalized); - for (int i = remainder; i < 4; i++) { - builder.append('='); - } - normalized = builder.toString(); - } - try { - byte[] decoded = Base64.getUrlDecoder().decode(normalized); - return decoded.length == expectedLength ? decoded : null; - } catch (IllegalArgumentException ex) { - return null; - } + return CoordinationBexIntrinsicsSupport + .commonCryptoEd25519Verify(); } } diff --git a/src/main/java/blue/coordination/processor/CoordinationCurrentRepositoryIdentities.java b/src/main/java/blue/coordination/processor/CoordinationCurrentRepositoryIdentities.java new file mode 100644 index 0000000..00eb561 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CoordinationCurrentRepositoryIdentities.java @@ -0,0 +1,150 @@ +package blue.coordination.processor; + +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.repo.coordination.Actor; +import blue.repo.coordination.AllTimelinesChannel; +import blue.repo.coordination.CompositeTimelineChannel; +import blue.repo.coordination.OperationRequest; +import blue.repo.coordination.Timeline; +import blue.repo.coordination.TimelineChannel; +import blue.repo.coordination.TimelineEntry; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +/** + * Single current generated Repository identity profile used by Coordination. + * + *

The profile is derived directly from the generated current Repository + * classes. It deliberately has no version switch, legacy alias, fallback + * coordinate, or compatibility lookup. Explicitly validated custom semantic + * identities remain a separate isolated-runtime facility in + * {@link CoordinationSemanticTypeIdentities}.

+ */ +public final class CoordinationCurrentRepositoryIdentities { + + private static final CoordinationCurrentRepositoryIdentities CURRENT = + new CoordinationCurrentRepositoryIdentities( + TimelineEntry.blueId(), + OperationRequest.blueId(), + Timeline.blueId(), + Actor.blueId(), + TimelineChannel.blueId(), + AllTimelinesChannel.blueId(), + CompositeTimelineChannel.blueId()); + + private final String timelineEntryBlueId; + private final String operationRequestBlueId; + private final String timelineBlueId; + private final String actorBlueId; + private final String timelineChannelBlueId; + private final String allTimelinesChannelBlueId; + private final String compositeTimelineChannelBlueId; + private final String profileIdentity; + + private CoordinationCurrentRepositoryIdentities( + String timelineEntryBlueId, + String operationRequestBlueId, + String timelineBlueId, + String actorBlueId, + String timelineChannelBlueId, + String allTimelinesChannelBlueId, + String compositeTimelineChannelBlueId) { + this.timelineEntryBlueId = requireText( + timelineEntryBlueId, "timelineEntryBlueId"); + this.operationRequestBlueId = requireText( + operationRequestBlueId, "operationRequestBlueId"); + this.timelineBlueId = requireText(timelineBlueId, "timelineBlueId"); + this.actorBlueId = requireText(actorBlueId, "actorBlueId"); + this.timelineChannelBlueId = requireText( + timelineChannelBlueId, "timelineChannelBlueId"); + this.allTimelinesChannelBlueId = requireText( + allTimelinesChannelBlueId, "allTimelinesChannelBlueId"); + this.compositeTimelineChannelBlueId = requireText( + compositeTimelineChannelBlueId, + "compositeTimelineChannelBlueId"); + this.profileIdentity = DirectBlueIdCalculator.calculateBlueId( + new Node() + .properties("kind", new Node().value( + "blue.coordination/current-repository-ids/1")) + .properties("timelineEntry", new Node().value( + this.timelineEntryBlueId)) + .properties("operationRequest", new Node().value( + this.operationRequestBlueId)) + .properties("timeline", new Node().value( + this.timelineBlueId)) + .properties("actor", new Node().value( + this.actorBlueId)) + .properties("timelineChannel", new Node().value( + this.timelineChannelBlueId)) + .properties("allTimelinesChannel", new Node().value( + this.allTimelinesChannelBlueId)) + .properties( + "compositeTimelineChannel", + new Node().value( + this.compositeTimelineChannelBlueId))); + } + + /** Returns the process-wide immutable current generated profile. */ + public static CoordinationCurrentRepositoryIdentities current() { + return CURRENT; + } + + public String timelineEntryBlueId() { + return timelineEntryBlueId; + } + + public String operationRequestBlueId() { + return operationRequestBlueId; + } + + public String timelineBlueId() { + return timelineBlueId; + } + + public String actorBlueId() { + return actorBlueId; + } + + public String timelineChannelBlueId() { + return timelineChannelBlueId; + } + + public String allTimelinesChannelBlueId() { + return allTimelinesChannelBlueId; + } + + public String compositeTimelineChannelBlueId() { + return compositeTimelineChannelBlueId; + } + + /** Identity of the complete immutable seven-value profile. */ + public String profileIdentity() { + return profileIdentity; + } + + /** Stable diagnostics view; live code should use the typed accessors. */ + public Map asMap() { + Map result = new LinkedHashMap(); + result.put("TimelineEntry", timelineEntryBlueId); + result.put("OperationRequest", operationRequestBlueId); + result.put("Timeline", timelineBlueId); + result.put("Actor", actorBlueId); + result.put("TimelineChannel", timelineChannelBlueId); + result.put("AllTimelinesChannel", allTimelinesChannelBlueId); + result.put("CompositeTimelineChannel", compositeTimelineChannelBlueId); + return Collections.unmodifiableMap(result); + } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isEmpty() || !checked.equals(checked.trim())) { + throw new IllegalArgumentException( + label + " must be exact non-blank text"); + } + return checked; + } +} diff --git a/src/main/java/blue/coordination/processor/CoordinationEventNodes.java b/src/main/java/blue/coordination/processor/CoordinationEventNodes.java index 899e8c8..2cbbf07 100644 --- a/src/main/java/blue/coordination/processor/CoordinationEventNodes.java +++ b/src/main/java/blue/coordination/processor/CoordinationEventNodes.java @@ -1,343 +1,1043 @@ package blue.coordination.processor; -import blue.language.Blue; import blue.language.model.Node; -import blue.repo.BlueRepository; -import blue.repo.coordination.Actor; -import blue.repo.coordination.ChatMessage; +import blue.language.model.Schema; +import blue.language.processor.ContractMatchingService; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.GasChargeContext; +import blue.language.processor.HandlerMatchContext; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.identity.BlueIds; +import blue.language.mapping.BlueMapper; import blue.repo.coordination.OperationRequest; -import blue.repo.coordination.StatusCompleted; -import blue.repo.coordination.Timeline; import blue.repo.coordination.TimelineEntry; -import java.math.BigDecimal; +import blue.repo.coordination.Actor; +import blue.repo.coordination.Timeline; import java.math.BigInteger; -import java.util.List; -import java.util.Map; +/** + * Read-only adapters for the Coordination event headers used by channel + * routing and handler matching. + * + *

The context-aware methods are the production path when a header may + * contain references: they materialize only the fields needed for the routing + * decision and delegate type/pattern evidence to the owning Contracts + * context. The context-free methods are intentionally limited to already + * available nodes and never create processing state or checkpoints.

+ */ final class CoordinationEventNodes { - private static final BlueRepository REPOSITORY = BlueRepository.latest(); - private static final ThreadLocal BINDING_CONVERTER = new ThreadLocal() { - @Override - protected Blue initialValue() { - return REPOSITORY.configure(new Blue()); - } - }; - private static final Node TIMELINE_TYPE = repositoryType(Timeline.qualifiedName()); - private static final Node ACTOR_TYPE = repositoryType(Actor.qualifiedName()); - private static final Node OPERATION_REQUEST_TYPE = new Node() - .type(new Node().blueId(OperationRequest.blueId())); + private static final String TIMELINE_FIELD = "timeline"; + private static final String PREVIOUS_ENTRY_FIELD = "prevEntry"; + private static final String TIMESTAMP_FIELD = "timestamp"; + private static final String ACTOR_FIELD = "actor"; + private static final String SOURCE_FIELD = "source"; + private static final String ON_BEHALF_OF_FIELD = "onBehalfOf"; + private static final String MESSAGE_FIELD = "message"; + private static final String OPERATION_FIELD = "operation"; + private static final String CHANNEL_FIELD = "channel"; + private static final String REQUEST_FIELD = "request"; + + private static final BlueMapper REPOSITORY_MAPPER = + BlueMapper.builder() + .scanPackage("blue.repo") + .build(); + private static final ContractMatchingService INLINE_MATCHER = + new ContractMatchingService(); private CoordinationEventNodes() { } static TimelineEntryView timelineEntry(Node node) { - if (!isTimelineEntry(node)) { + return timelineEntry( + node, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static TimelineEntryView timelineEntry( + Node node, + CoordinationSemanticTypeIdentities identities) { + if (!isTimelineEntry(node, identities)) { return null; } - Node timeline = property(node, "timeline"); - Node actor = property(node, "actor"); - BigInteger timestamp = timestamp(node); - Node message = property(node, "message"); - if (!BlueSemanticIdentity.matchesType(timeline, TIMELINE_TYPE) - || !BlueSemanticIdentity.matchesType(actor, ACTOR_TYPE) - || timestamp == null - || message == null) { + return timelineEntryHeader(node); + } + + static TimelineEntryView timelineEntry( + Node node, + ExternalChannelFunctionContext context) { + return timelineEntry( + node, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static TimelineEntryView timelineEntry( + Node node, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + Node projected = projectTimelineEntry( + node, context); + if (!isTimelineEntry(projected, context, identities)) { return null; } - return new TimelineEntryView(timeline, actor, timestamp); + return timelineEntryHeader(node, projected); } - static boolean isTimelineEntry(Node node) { - return node != null - && node.getType() != null - && TimelineEntry.blueId().equals(node.getType().getBlueId()); + static TimelineEntryView timelineEntryHeader( + Node node, + ExternalChannelFunctionContext context) { + return timelineEntryHeader( + node, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); } - static BigInteger timestamp(Node node) { - return integerProperty(node, "timestamp"); + static TimelineEntryView timelineEntryHeader( + Node node, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + Node projected = projectTimelineEntry(node, context); + if (!isTimelineEntry(projected, context, identities)) { + return null; + } + return timelineEntryHeader( + node, + projected); } - static boolean matchesGeneratedBinding(Node candidate, Object configuredBinding) { - return configuredBinding != null - && matchesPattern(candidate, BINDING_CONVERTER.get().objectToNode(configuredBinding)); + static TimelineEntryView timelineEntryHeader(Node node) { + return timelineEntryHeader(node, node); } - static OperationRequestView operationRequest(Node event) { - if (matchesOperationRequestType(event)) { - return OperationRequestView.from(event, false); - } - if (!isTimelineEntry(event)) { + private static TimelineEntryView timelineEntryHeader( + Node exactEntry, + Node projectedHeader) { + Node timeline = property(projectedHeader, TIMELINE_FIELD); + Node prevEntry = property(projectedHeader, PREVIOUS_ENTRY_FIELD); + Node timestampNode = property(projectedHeader, TIMESTAMP_FIELD); + Node actor = property(projectedHeader, ACTOR_FIELD); + Node source = property(projectedHeader, SOURCE_FIELD); + Node onBehalfOf = property(projectedHeader, ON_BEHALF_OF_FIELD); + Node message = property(projectedHeader, MESSAGE_FIELD); + BigInteger timestamp = timestamp(projectedHeader); + if (timeline == null + || actor == null + || timestamp == null + || message == null) { return null; } - Node message = property(event, "message"); - return matchesOperationRequestType(message) - ? OperationRequestView.from(message, true) - : null; + return new TimelineEntryView( + exactEntry, + timeline, + prevEntry, + timestampNode, + timestamp, + actor, + source, + onBehalfOf, + message); } - static boolean matchesPattern(Node node, Node pattern) { - if (pattern == null) { - return true; - } - if (node == null) { + static boolean isTimelineEntry(Node node) { + return isTimelineEntry( + node, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static boolean isTimelineEntry( + Node node, + CoordinationSemanticTypeIdentities identities) { + if (node == null || node.getType() == null) { return false; } - if (pattern.isReferenceOnly()) { - return pattern.getBlueId().equals(node.getBlueId()); - } - if (!typeMatches(node.getType(), pattern.getType())) { - return false; + Node type = node.getType(); + String timelineEntryBlueId = identities.timelineEntryBlueId(); + if (timelineEntryBlueId.equals(type.getBlueId())) { + return true; } - if (!valueMatches(node.getValue(), pattern.getValue())) { + try { + if (BlueSemanticIdentity.equals( + type, + new Node().blueId(timelineEntryBlueId))) { + return true; + } return false; - } - if (!itemsMatch(node.getItems(), pattern.getItems())) { + } catch (RuntimeException invalidTypeEvidence) { return false; } - return propertiesMatch(node.getProperties(), pattern.getProperties()); } - private static Node property(Node node, String key) { - if (node == null || node.getProperties() == null) { - return null; - } - return node.getProperties().get(key); + static boolean isTimelineEntry( + Node node, + ExternalChannelFunctionContext context) { + return isTimelineEntry( + node, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); } - private static boolean matchesOperationRequestType(Node node) { + static boolean isTimelineEntry( + Node node, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { if (node == null || node.getType() == null) { return false; } - String typeBlueId = node.getType().getBlueId(); - if (OperationRequest.blueId().equals(typeBlueId)) { + String timelineEntryBlueId = identities.timelineEntryBlueId(); + if (timelineEntryBlueId.equals( + node.getType().getBlueId())) { return true; } - if (typeBlueId == null) { + return context.matchesPattern( + node, + new Node().type( + new Node().blueId( + timelineEntryBlueId))); + } + + static BigInteger timestamp(Node node) { + return integerProperty(node, TIMESTAMP_FIELD); + } + + static boolean matchesGeneratedBinding(Node candidate, Object configuredBinding) { + return matchesGeneratedBinding( + candidate, + configuredBinding, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static boolean matchesGeneratedBinding( + Node candidate, + Object configuredBinding, + CoordinationSemanticTypeIdentities identities) { + if (configuredBinding == null || candidate == null) { return false; } - try { - Node resolvedType = node.getType().isReferenceOnly() - ? REPOSITORY.nodeByBlueId(typeBlueId).orElse(null) - : node.getType(); - return resolvedType != null - && BINDING_CONVERTER.get().nodeMatchesType( - new Node().type(resolvedType.clone().blueId(null)), - OPERATION_REQUEST_TYPE); - } catch (RuntimeException ignored) { - return false; + Node pattern = REPOSITORY_MAPPER.toNode(configuredBinding); + if (configuredBinding instanceof Timeline) { + pattern.type(new Node().blueId( + identities.timelineBlueId())); + } else if (configuredBinding instanceof Actor) { + pattern.type(new Node().blueId( + identities.actorBlueId())); + } + if (candidate.isReferenceOnly()) { + return BlueSemanticIdentity.equals(candidate, pattern); } + return INLINE_MATCHER.matches(candidate, pattern); } - private static String nonBlankTextProperty(Node node, String key) { - Node property = property(node, key); - Object value = property != null ? property.getValue() : null; - if (!(value instanceof String)) { + static Node generatedBindingNode(Object configuredBinding) { + if (configuredBinding == null) { return null; } - String text = (String) value; - return text.trim().isEmpty() ? null : text; + return REPOSITORY_MAPPER.toNode(configuredBinding); } - private static BigInteger integerProperty(Node node, String key) { - Node property = property(node, key); - Object value = property != null ? property.getValue() : null; - if (value instanceof BigInteger) { - return (BigInteger) value; + static Node materializeHeaderValue( + Node value, + ExternalChannelFunctionContext context) { + return materializeIfReference(value, context); + } + + static boolean matchesGeneratedBinding( + Node candidate, + Object configuredBinding, + ExternalChannelFunctionContext context) { + return matchesGeneratedBinding( + candidate, + configuredBinding, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static boolean matchesGeneratedBinding( + Node candidate, + Object configuredBinding, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + if (configuredBinding == null || candidate == null) { + return false; } - if (value instanceof Byte || value instanceof Short - || value instanceof Integer || value instanceof Long) { - return BigInteger.valueOf(((Number) value).longValue()); + Node pattern; + pattern = REPOSITORY_MAPPER.toNode(configuredBinding); + if (configuredBinding instanceof Timeline) { + pattern.type(new Node().blueId( + identities.timelineBlueId())); + } else if (configuredBinding instanceof Actor) { + pattern.type(new Node().blueId( + identities.actorBlueId())); } - return null; + return context.matchesPattern( + candidate, + pattern); } - private static boolean typeMatches(Node nodeType, Node patternType) { - if (patternType == null) { - return true; - } - String expected = typeIdentity(patternType); - if (expected == null) { - return true; + static OperationRequestView operationRequest(Node event) { + return operationRequest( + event, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static OperationRequestView operationRequest( + Node event, + CoordinationSemanticTypeIdentities identities) { + if (matchesOperationRequestType(event, identities)) { + return OperationRequestView.from(event); } - if (nodeType == null) { - return true; + if (!isTimelineEntry(event, identities)) { + return null; } - String actual = typeIdentity(nodeType); - return expected.equals(actual); + Node message = property(event, MESSAGE_FIELD); + return matchesOperationRequestType(message, identities) + ? OperationRequestView.from(message) + : null; + } + + static OperationRequestView operationRequest( + Node event, + ExternalChannelFunctionContext context) { + return operationRequest( + event, + context, + true, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static OperationRequestView operationRequest( + Node event, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + return operationRequest( + event, + context, + true, + identities); + } + + /** + * Reads the routing view from the exact payload produced by + * {@link #operationRequestRoutingPayload(Node, + * ExternalChannelFunctionContext)}. + * + *

The payload projection already owns and charged the two semantic + * routing-field reads. Language invokes payload, handler routing, and + * logical-delivery routing as separate functions, so reparsing that exact + * projection must not charge the same reads again.

+ */ + static OperationRequestView operationRequestFromRoutingPayload( + Node exactPayload, + ExternalChannelFunctionContext context) { + return operationRequest( + exactPayload, + context, + false, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static OperationRequestView operationRequestFromRoutingPayload( + Node exactPayload, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + return operationRequest( + exactPayload, + context, + false, + identities); } - private static String typeIdentity(Node type) { - if (type == null) { + private static OperationRequestView operationRequest( + Node event, + ExternalChannelFunctionContext context, + boolean chargeRoutingFields, + CoordinationSemanticTypeIdentities identities) { + if (event == null || context == null) { return null; } - if (type.getBlueId() != null) { - return type.getBlueId(); + Node projectedEvent = + materializeIfReference(event, context); + if (declaresExactType( + projectedEvent, + identities.timelineEntryBlueId())) { + Node message = materializeIfReference( + property(projectedEvent, MESSAGE_FIELD), + context); + return matchesOperationRequestType( + message, context, identities) + ? operationRequestView( + message, + context, + chargeRoutingFields) + : null; } - Object value = type.getValue(); - if (value instanceof String) { - String knownBlueId = knownCoordinationTypeBlueId((String) value); - return knownBlueId != null ? knownBlueId : (String) value; + if (matchesOperationRequestType( + projectedEvent, context, identities)) { + return operationRequestView( + projectedEvent, + context, + chargeRoutingFields); } - return null; + if (!isTimelineEntry( + projectedEvent, context, identities)) { + return null; + } + Node message = materializeIfReference( + property(projectedEvent, MESSAGE_FIELD), + context); + return matchesOperationRequestType( + message, context, identities) + ? operationRequestView( + message, + context, + chargeRoutingFields) + : null; + } + + private static OperationRequestView operationRequestView( + Node request, + ExternalChannelFunctionContext context, + boolean chargeRoutingFields) { + return OperationRequestView.from( + request, + context, + chargeRoutingFields); } - private static String knownCoordinationTypeBlueId(String qualifiedName) { - if (TimelineEntry.qualifiedName().equals(qualifiedName)) { - return TimelineEntry.blueId(); + static Node operationRequestRoutingPayload( + Node event, + ExternalChannelFunctionContext context) { + return operationRequestRoutingPayload( + event, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static Node operationRequestRoutingPayload( + Node event, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + String originalEventBlueId = + exactIdentity(event); + Node projectedEvent = + materializeIfReference(event, context); + if (projectedEvent == null) { + return null; } - if (ChatMessage.qualifiedName().equals(qualifiedName)) { - return ChatMessage.blueId(); + Node payload; + if (declaresExactType( + projectedEvent, + identities.timelineEntryBlueId())) { + payload = projectTimelineOperationRequestPayload( + projectedEvent, context, identities); + } else if (matchesOperationRequestType( + projectedEvent, context, identities)) { + payload = projectOperationRequestFields( + projectedEvent, context); + } else if (!isTimelineEntry( + projectedEvent, context, identities)) { + payload = projectedEvent.clone(); + } else { + payload = projectTimelineOperationRequestPayload( + projectedEvent, context, identities); } - if (OperationRequest.qualifiedName().equals(qualifiedName)) { - return OperationRequest.blueId(); + /* + * A reference-backed event can arrive as exact expanded content with + * provider provenance on any node. Hosted runtime output must be + * canonical exact content (or a pure reference), never that resolved + * hybrid representation. + */ + Node exactPayload = + CoordinationProcessHeaderBridge + .canonicalExactCopy(payload); + if (hasSemanticOutputBoundary(context) + && originalEventBlueId.equals( + DirectBlueIdCalculator.calculateBlueId( + exactPayload))) { + /* + * ChannelRunner carries the exact PROCESS event into the hosted + * output boundary under this identity. Returning that identity + * preserves the original Timeline Entry without recursively + * reopening opaque descendants merely because routing consulted + * a direct fragment. + */ + return new Node().blueId( + originalEventBlueId); } - if (StatusCompleted.qualifiedName().equals(qualifiedName)) { - return StatusCompleted.blueId(); + return exactPayload; + } + + private static Node projectTimelineOperationRequestPayload( + Node projectedEvent, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + Node suppliedMessage = + property(projectedEvent, MESSAGE_FIELD); + Node projectedMessage = + materializeIfReference( + suppliedMessage, context); + if (!matchesOperationRequestType( + projectedMessage, context, identities)) { + return projectedEvent.clone(); } - return null; + Node payload = projectedEvent.clone(); + payload.getProperties().put( + MESSAGE_FIELD, + projectOperationRequestFields( + projectedMessage, context)); + return payload; } - private static boolean valueMatches(Object actual, Object expected) { - if (expected == null) { - return true; + private static String exactIdentity(Node node) { + Node exact = + CoordinationProcessHeaderBridge + .canonicalExactCopy( + java.util.Objects.requireNonNull( + node, "node")); + if (exact.isReferenceOnly()) { + return exact.getBlueId(); } - if (actual == null) { + return DirectBlueIdCalculator.calculateBlueId( + exact); + } + + static boolean matchesOperationRequest( + Node event, + String operation, + String channel, + Node request, + HandlerMatchContext context) { + return matchesOperationRequest( + event, + operation, + channel, + request, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static boolean matchesOperationRequest( + Node event, + String operation, + String channel, + Node request, + HandlerMatchContext context, + CoordinationSemanticTypeIdentities identities) { + if (event == null + || operation == null + || channel == null + || context == null) { return false; } - if (actual instanceof Number && expected instanceof Number) { - return number(actual).compareTo(number(expected)) == 0; + Node requestPattern = new Node() + .type(new Node().blueId( + identities.operationRequestBlueId())) + .properties(OPERATION_FIELD, new Node().value(operation)) + .properties(CHANNEL_FIELD, new Node().value(channel)); + if (request != null) { + Node presencePattern = requestPattern.clone() + .properties(REQUEST_FIELD, new Node() + .schema(new Schema().required(true))); + if (!matchesDirectOrTimelineOperationRequest( + presencePattern, context, identities)) { + return false; + } + requestPattern.properties(REQUEST_FIELD, request.clone()); } - return expected.equals(actual); + return matchesDirectOrTimelineOperationRequest( + requestPattern, context, identities); + } + + static boolean isRoutableOperationRequestForChannel( + Node event, + String channel, + HandlerMatchContext context) { + return isRoutableOperationRequestForChannel( + event, + channel, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); } - private static BigDecimal number(Object value) { - if (value instanceof BigDecimal) { - return (BigDecimal) value; + static boolean isRoutableOperationRequestForChannel( + Node event, + String channel, + HandlerMatchContext context, + CoordinationSemanticTypeIdentities identities) { + if (event == null + || channel == null + || context == null) { + return false; } - if (value instanceof BigInteger) { - return new BigDecimal((BigInteger) value); + OperationRequestView direct = + operationRequest(event, identities); + if (direct != null && direct.routable()) { + return channel.equals( + direct.channel()); + } + OperationRequestView exactReferenced = + handlerOperationRequest( + event, + context, + identities); + if (exactReferenced != null) { + return exactReferenced.routable() + && channel.equals( + exactReferenced.channel()); } - return new BigDecimal(value.toString()); + if (direct != null + && !hasReferencedRoutingFields(event, identities)) { + return false; + } + /* + * An inline event with no declared type cannot be an Operation + * Request or Timeline Entry. Asking the semantic matcher to test an + * Operation Request pattern here would turn an ordinary untyped + * workflow event into a demand for the repository's Operation + * Request definition before the workflow is even entered. Pure + * references and declared (possibly derived) types still use the + * verified matcher path below. + */ + if (!event.isReferenceOnly() + && event.getType() == null) { + return false; + } + Node requestPattern = new Node() + .type(new Node().blueId( + identities.operationRequestBlueId())) + .properties( + OPERATION_FIELD, + new Node().schema( + new Schema() + .required(true) + .minLength(1))) + .properties( + CHANNEL_FIELD, + new Node().value(channel)); + return matchesDirectOrTimelineOperationRequest( + requestPattern, context, identities); } - private static boolean itemsMatch(List actual, List expected) { - if (expected == null) { - return true; + private static OperationRequestView handlerOperationRequest( + Node event, + HandlerMatchContext context, + CoordinationSemanticTypeIdentities identities) { + Node projectedEvent = + materializeIfReference( + event, + context); + if (projectedEvent == null) { + return null; } - if (actual == null) { - return false; + Node request = projectedEvent; + if (declaresExactType( + projectedEvent, + identities.timelineEntryBlueId())) { + request = materializeIfReference( + property( + projectedEvent, + MESSAGE_FIELD), + context); } - for (int i = 0; i < expected.size(); i++) { - Node expectedItem = expected.get(i); - if (i < actual.size()) { - if (!matchesPattern(actual.get(i), expectedItem)) { - return false; + if (!declaresExactType( + request, + identities.operationRequestBlueId())) { + return null; + } + Node projectedRequest = + request.clone(); + if (projectedRequest.getProperties() + != null) { + String[] routingFields = + new String[] { + OPERATION_FIELD, + CHANNEL_FIELD + }; + for (String field : routingFields) { + Node supplied = + property( + request, + field); + if (supplied != null + && supplied.isReferenceOnly()) { + projectedRequest + .getProperties() + .put( + field, + context + .materializeExactReference( + supplied)); } - } else if (requiresPresence(expectedItem)) { - return false; } } - return true; + return OperationRequestView.from( + projectedRequest); } - private static boolean propertiesMatch(Map actual, Map expected) { - if (expected == null) { + private static boolean hasReferencedRoutingFields( + Node event, + CoordinationSemanticTypeIdentities identities) { + Node request = event; + if (isTimelineEntry(event, identities)) { + request = property(event, MESSAGE_FIELD); + } + if (request == null) { + return false; + } + if (request.isReferenceOnly()) { return true; } - if (actual == null) { + Node operation = property( + request, OPERATION_FIELD); + Node channel = property( + request, CHANNEL_FIELD); + return operation != null + && operation.isReferenceOnly() + || channel != null + && channel.isReferenceOnly(); + } + + private static boolean matchesDirectOrTimelineOperationRequest( + Node requestPattern, + HandlerMatchContext context, + CoordinationSemanticTypeIdentities identities) { + if (context.matchesEventPattern(requestPattern)) { + return true; + } + return context.matchesEventPattern(new Node() + .type(new Node().blueId( + identities.timelineEntryBlueId())) + .properties(MESSAGE_FIELD, requestPattern)); + } + + private static Node property(Node node, String key) { + if (node == null || node.getProperties() == null) { + return null; + } + return node.getProperties().get(key); + } + + private static boolean matchesOperationRequestType(Node node) { + return matchesOperationRequestType( + node, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + private static boolean matchesOperationRequestType( + Node node, + CoordinationSemanticTypeIdentities identities) { + if (node == null || node.getType() == null) { return false; } - for (Map.Entry entry : expected.entrySet()) { - Node actualProperty = actual.get(entry.getKey()); - Node expectedProperty = entry.getValue(); - if (actualProperty != null) { - if (!matchesPattern(actualProperty, expectedProperty)) { - return false; - } - } else if (requiresPresence(expectedProperty)) { - return false; + Node exactType = node.getType(); + String operationRequestBlueId = + identities.operationRequestBlueId(); + if (operationRequestBlueId.equals(exactType.getBlueId())) { + return true; + } + try { + if (BlueSemanticIdentity.equals( + exactType, + new Node().blueId( + operationRequestBlueId))) { + return true; } + return false; + } catch (RuntimeException ignored) { + return false; } - return true; } - private static boolean requiresPresence(Node pattern) { - if (pattern == null) { + private static boolean matchesOperationRequestType( + Node node, + ExternalChannelFunctionContext context) { + return matchesOperationRequestType( + node, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + private static boolean matchesOperationRequestType( + Node node, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + if (node == null || node.getType() == null) { return false; } - if (pattern.isReferenceOnly() || pattern.getValue() != null) { + String operationRequestBlueId = + identities.operationRequestBlueId(); + if (operationRequestBlueId.equals( + node.getType().getBlueId())) { return true; } - if (pattern.getItems() != null) { - for (Node item : pattern.getItems()) { - if (requiresPresence(item)) { - return true; - } + return context.matchesPattern( + node, + new Node().type( + new Node().blueId( + operationRequestBlueId))); + } + + private static boolean declaresExactType( + Node node, + String typeBlueId) { + return node != null + && node.getType() != null + && typeBlueId.equals( + node.getType().getBlueId()); + } + + private static boolean hasSemanticOutputBoundary( + ExternalChannelFunctionContext context) { + try { + context.runtimeWorkSession().semanticOutputBoundary(); + return true; + } catch (IllegalStateException unavailable) { + return false; + } + } + + private static Node materializeIfReference( + Node node, + ExternalChannelFunctionContext context) { + return node != null && node.isReferenceOnly() + ? context.materializeExactReference(node) + : node; + } + + private static Node materializeIfReference( + Node node, + HandlerMatchContext context) { + return node != null && node.isReferenceOnly() + ? context.materializeExactReference(node) + : node; + } + + private static Node projectTimelineEntry( + Node node, + ExternalChannelFunctionContext context) { + Node projected = + materializeIfReference(node, context); + if (projected == null + || projected.getProperties() == null) { + return projected; + } + String[] scalarHeaderFields = new String[] { + TIMESTAMP_FIELD + }; + Node mutable = projected; + boolean cloned = false; + for (String field : scalarHeaderFields) { + Node value = property(projected, field); + if (value == null || !value.isReferenceOnly()) { + continue; + } + if (!cloned) { + mutable = projected.clone(); + cloned = true; } + mutable.getProperties().put( + field, + context.materializeExactReference(value)); } - if (pattern.getProperties() != null) { - for (Node property : pattern.getProperties().values()) { - if (requiresPresence(property)) { - return true; - } + return mutable; + } + + private static Node projectOperationRequestFields( + Node request, + ExternalChannelFunctionContext context) { + Node projected = request.clone(); + String[] routingFields = + new String[] { + OPERATION_FIELD, + CHANNEL_FIELD + }; + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "operationRequestFieldRead", + routingFields.length, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + "read Operation Request routing payload fields")); + for (String field : routingFields) { + Node supplied = property( + request, field); + if (supplied != null + && supplied.isReferenceOnly()) { + projected.getProperties().put( + field, + context.materializeExactReference( + supplied)); } } - return false; + return projected; + } + + private static String nonBlankTextProperty(Node node, String key) { + Node property = property(node, key); + Object value = property != null ? property.getValue() : null; + if (!(value instanceof String)) { + return null; + } + String text = (String) value; + return text.trim().isEmpty() ? null : text; } - private static Node repositoryType(String qualifiedName) { - return REPOSITORY.nodeByName(qualifiedName) - .orElseThrow(() -> new IllegalStateException( - "Published repository is missing " + qualifiedName)); + private static String nonBlankTextProperty( + Node node, + String key, + ExternalChannelFunctionContext context) { + Node exactProperty = materializeIfReference( + property(node, key), context); + Object value = + exactProperty != null + ? exactProperty.getValue() + : null; + if (!(value instanceof String)) { + return null; + } + String text = (String) value; + return text.trim().isEmpty() ? null : text; + } + + private static BigInteger integerProperty(Node node, String key) { + Node property = property(node, key); + Object value = property != null ? property.getValue() : null; + if (value instanceof BigInteger) { + return (BigInteger) value; + } + if (value instanceof Byte || value instanceof Short + || value instanceof Integer || value instanceof Long) { + return BigInteger.valueOf(((Number) value).longValue()); + } + return null; } static final class TimelineEntryView { + private final Node exactEntry; private final Node timeline; + private final Node prevEntry; + private final Node timestampNode; private final Node actor; + private final Node source; + private final Node onBehalfOf; + private final Node message; private final BigInteger timestamp; - private TimelineEntryView(Node timeline, + private TimelineEntryView(Node exactEntry, + Node timeline, + Node prevEntry, + Node timestampNode, + BigInteger timestamp, Node actor, - BigInteger timestamp) { - this.timeline = timeline; - this.actor = actor; + Node source, + Node onBehalfOf, + Node message) { + this.exactEntry = exactEntry.clone(); + this.timeline = timeline.clone(); + this.prevEntry = cloneOrNull(prevEntry); + this.timestampNode = timestampNode.clone(); this.timestamp = timestamp; + this.actor = actor.clone(); + this.source = cloneOrNull(source); + this.onBehalfOf = cloneOrNull(onBehalfOf); + this.message = message.clone(); + } + + Node exactEntry() { + return exactEntry.clone(); } Node timeline() { - return timeline; + return timeline.clone(); + } + + Node prevEntry() { + return cloneOrNull(prevEntry); + } + + Node timestampNode() { + return timestampNode.clone(); } Node actor() { - return actor; + return actor.clone(); + } + + Node source() { + return cloneOrNull(source); + } + + Node onBehalfOf() { + return cloneOrNull(onBehalfOf); + } + + Node message() { + return message.clone(); } BigInteger timestamp() { return timestamp; } + + String entryBlueId() { + return TimelineProviderSupport.eventId(exactEntry); + } + + private static Node cloneOrNull(Node node) { + return node != null ? node.clone() : null; + } } static final class OperationRequestView { - private final Node requestNode; - private final boolean timelineMessage; private final String operation; private final String channel; - private OperationRequestView(Node requestNode, - boolean timelineMessage, - String operation, + private OperationRequestView(String operation, String channel) { - this.requestNode = requestNode; - this.timelineMessage = timelineMessage; this.operation = operation; this.channel = channel; } - private static OperationRequestView from(Node requestNode, boolean timelineMessage) { - return new OperationRequestView(requestNode, - timelineMessage, - nonBlankTextProperty(requestNode, "operation"), - nonBlankTextProperty(requestNode, "channel")); + private static OperationRequestView from(Node requestNode) { + return new OperationRequestView( + nonBlankTextProperty(requestNode, OPERATION_FIELD), + nonBlankTextProperty(requestNode, CHANNEL_FIELD)); + } + + private static OperationRequestView from( + Node requestNode, + ExternalChannelFunctionContext context) { + return from( + requestNode, + context, + true); + } + + private static OperationRequestView from( + Node requestNode, + ExternalChannelFunctionContext context, + boolean chargeRoutingFields) { + if (chargeRoutingFields) { + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "operationRequestFieldRead", + 2L, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + "read Operation Request dispatch fields")); + } + return new OperationRequestView( + nonBlankTextProperty( + requestNode, + OPERATION_FIELD, + context), + nonBlankTextProperty( + requestNode, + CHANNEL_FIELD, + context)); } boolean routable() { @@ -352,17 +1052,5 @@ String channel() { return channel; } - Node request() { - return property(requestNode, "request"); - } - - Node patternFor(Node requestPattern) { - Node request = requestPattern.clone(); - if (!timelineMessage) { - return new Node().properties("request", request); - } - return new Node().properties("message", new Node() - .properties("request", request)); - } } } diff --git a/src/main/java/blue/coordination/processor/CoordinationProcessHeaderBridge.java b/src/main/java/blue/coordination/processor/CoordinationProcessHeaderBridge.java new file mode 100644 index 0000000..b477144 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CoordinationProcessHeaderBridge.java @@ -0,0 +1,30 @@ +package blue.coordination.processor; + +import blue.coordination.processor.support.CoordinationProcessHeaderSupport; +import blue.language.model.Node; +import blue.language.provider.NodeProvider; + +/** + * Coordination-owned exact PROCESS-header normalization and materialization. + * + *

The stable public facade and workflow implementation share one + * package-neutral implementation, so exact-header behavior cannot drift while + * package dependencies remain acyclic.

+ */ +public final class CoordinationProcessHeaderBridge { + + private CoordinationProcessHeaderBridge() { + } + + public static Node materializeVerifiedExactReference( + NodeProvider provider, + Node reference) { + return CoordinationProcessHeaderSupport + .materializeVerifiedExactReference(provider, reference); + } + + public static Node canonicalExactCopy(Node resolvedContent) { + return CoordinationProcessHeaderSupport + .canonicalExactCopy(resolvedContent); + } +} diff --git a/src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java b/src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java index 6aba1d2..a91a18a 100644 --- a/src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java +++ b/src/main/java/blue/coordination/processor/CoordinationProcessorOptions.java @@ -2,19 +2,51 @@ import blue.bex.api.BexEngine; import blue.coordination.processor.bex.BexProcessingMetrics; +import blue.coordination.processor.bex.ProcessingEventIdentityObserver; import blue.coordination.processor.workflow.SequentialWorkflowRunner; +import blue.language.runtime.BlueLanguage; +/** + * Optional dependency overrides used while installing Coordination + * processors. + * + *

Absent values select production defaults. Supplying a workflow runner or + * BEX engine transfers lifecycle ownership to the caller; the registration + * facade does not close caller-owned components.

+ */ public final class CoordinationProcessorOptions { private final SequentialWorkflowRunner sequentialWorkflowRunner; private final BexEngine bexEngine; + private final BlueLanguage language; private final long defaultComputeGasLimit; private final BexProcessingMetrics processingMetrics; + private final ProcessingEventIdentityObserver + processingEventIdentityObserver; + private final CoordinationSemanticTypeIdentities + semanticTypeIdentities; private CoordinationProcessorOptions(Builder builder) { this.sequentialWorkflowRunner = builder.sequentialWorkflowRunner; this.bexEngine = builder.bexEngine; + this.language = builder.language; this.defaultComputeGasLimit = builder.defaultComputeGasLimit; this.processingMetrics = builder.processingMetrics; + this.processingEventIdentityObserver = + builder.processingEventIdentityObserver; + CoordinationSemanticTypeIdentities configured = + builder.semanticTypeIdentities; + if (configured.custom()) { + if (builder.language == null) { + throw new IllegalArgumentException( + "Custom Coordination semantic type identities require " + + "the exact Language runtime"); + } + configured.validatedAgainst( + builder.language.processing() + .runtimeAccess() + .getNodeProvider()); + } + this.semanticTypeIdentities = configured; } public SequentialWorkflowRunner sequentialWorkflowRunner() { @@ -25,6 +57,14 @@ public BexEngine bexEngine() { return bexEngine; } + /** + * Returns the exact Language runtime shared with hosted BEX, when the + * caller did not supply a preconfigured engine. + */ + public BlueLanguage language() { + return language; + } + public long defaultComputeGasLimit() { return defaultComputeGasLimit; } @@ -33,15 +73,31 @@ public BexProcessingMetrics processingMetrics() { return processingMetrics; } + ProcessingEventIdentityObserver + processingEventIdentityObserver() { + return processingEventIdentityObserver; + } + + /** Returns the immutable semantic event identities for this generation. */ + public CoordinationSemanticTypeIdentities semanticTypeIdentities() { + return semanticTypeIdentities; + } + public static Builder builder() { return new Builder(); } + /** Builds an immutable set of Coordination processor installation options. */ public static final class Builder { private SequentialWorkflowRunner sequentialWorkflowRunner; private BexEngine bexEngine; + private BlueLanguage language; private long defaultComputeGasLimit = 100_000L; private BexProcessingMetrics processingMetrics; + private ProcessingEventIdentityObserver + processingEventIdentityObserver; + private CoordinationSemanticTypeIdentities semanticTypeIdentities = + CoordinationSemanticTypeIdentities.publishedDefaults(); public Builder sequentialWorkflowRunner(SequentialWorkflowRunner sequentialWorkflowRunner) { this.sequentialWorkflowRunner = sequentialWorkflowRunner; @@ -53,6 +109,15 @@ public Builder bexEngine(BexEngine bexEngine) { return this; } + /** + * Selects the exact Language runtime that a default hosted BEX engine + * must borrow. The options object never closes this borrowed runtime. + */ + public Builder language(BlueLanguage language) { + this.language = language; + return this; + } + public Builder defaultComputeGasLimit(long defaultComputeGasLimit) { if (defaultComputeGasLimit <= 0L) { throw new IllegalArgumentException("defaultComputeGasLimit must be positive"); @@ -66,6 +131,23 @@ public Builder processingMetrics(BexProcessingMetrics processingMetrics) { return this; } + Builder processingEventIdentityObserver( + ProcessingEventIdentityObserver observer) { + this.processingEventIdentityObserver = observer; + return this; + } + + /** + * Selects exact Timeline Entry and Operation Request identities for + * the assembled immutable runtime generation. + */ + public Builder semanticTypeIdentities( + CoordinationSemanticTypeIdentities identities) { + this.semanticTypeIdentities = java.util.Objects.requireNonNull( + identities, "identities"); + return this; + } + public CoordinationProcessorOptions build() { return new CoordinationProcessorOptions(this); } diff --git a/src/main/java/blue/coordination/processor/CoordinationProcessors.java b/src/main/java/blue/coordination/processor/CoordinationProcessors.java index adc2d24..06b2099 100644 --- a/src/main/java/blue/coordination/processor/CoordinationProcessors.java +++ b/src/main/java/blue/coordination/processor/CoordinationProcessors.java @@ -1,208 +1,353 @@ package blue.coordination.processor; import blue.bex.api.BexEngine; -import blue.coordination.processor.merge.CoordinationMerging; import blue.coordination.processor.bex.BexProcessingMetrics; import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.language.Blue; +import blue.language.processor.BlueContracts; +import blue.language.processor.ContractProcessorRegistryBuilder; import blue.language.processor.DocumentProcessor; -import blue.language.processor.ProcessingMetricsSink; -import blue.language.utils.TypeClassResolver; -import blue.repo.BlueRepositoryModels; +import blue.language.processor.ProcessingObserver; +import blue.language.processor.model.MarkerContract; +import blue.language.runtime.BlueLanguage; +import blue.repo.coordination.ActorPolicy; +import blue.repo.coordination.ComputeDefinition; +import blue.repo.coordination.DocumentAnchors; +import blue.repo.coordination.DocumentLinks; +import blue.repo.coordination.TimelineChannel; +import blue.repo.myos.SearchContract; +import blue.repo.workflows.ContractsChangePolicy; +import blue.repo.workflows.DocumentSection; +import java.util.Objects; + +/** + * Registers the fixed-repository Coordination processors with the current + * immutable Contracts configuration APIs. + * + *

The facade does not own or mutate a Language runtime. Applications build + * one {@link BlueLanguage}, supply it through + * {@link CoordinationProcessorOptions.Builder#language(BlueLanguage)}, and + * use the configured registry with {@code BlueContracts}. Standalone + * {@link DocumentProcessor.Builder} composition remains available for focused + * tests and tools.

+ */ public final class CoordinationProcessors { private CoordinationProcessors() { } - public static Blue registerWith(Blue blue) { - return registerWith(blue, null); + /** + * Builds one focused Contracts service containing the Coordination + * processors and borrowing the supplied Language runtime. + * + *

The returned service owns its Contracts processor generation but + * does not own {@code language}. Hosts should close the returned service + * before closing the borrowed Language runtime.

+ * + * @param language exact Language runtime shared with hosted BEX + * @return independently owned Coordination Contracts service + */ + public static BlueContracts contracts(BlueLanguage language) { + return contracts(language, null); } - public static Blue registerWith(Blue blue, CoordinationProcessorOptions options) { - if (blue == null) { - throw new IllegalArgumentException("blue must not be null"); - } - BexProcessingMetrics metrics = processingMetrics(options); + /** + * Builds one focused Contracts service containing the Coordination + * processors and optional hosted-runtime configuration. + * + * @param language exact Language runtime shared with hosted BEX + * @param options optional Coordination processor configuration + * @return independently owned Coordination Contracts service + */ + public static BlueContracts contracts( + BlueLanguage language, + CoordinationProcessorOptions options) { + BlueLanguage exactLanguage = requireLanguage(language); + CoordinationProcessorOptions effective = optionsWithLanguage( + exactLanguage, options); + ContractProcessorRegistryBuilder registry = configure( + ContractProcessorRegistryBuilder.create() + .registerDefaults(), + effective); + BlueContracts.Builder builder = BlueContracts.builder( + exactLanguage.processing()) + .runtimeRegistry(registry.build()); + BexProcessingMetrics metrics = processingMetrics(effective); if (metrics != null) { - installProcessingMetrics(blue.getDocumentProcessor(), metrics); + builder.observer(metrics); } - SequentialWorkflowRunner runner = workflowRunner(options); - BlueRepositoryModels.registerAll(blue.getDocumentProcessor().getContractTypeResolver()); - blue.registerContractProcessor(new TimelineChannelProcessor()); - blue.registerContractProcessor(new AllTimelinesChannelProcessor()); - blue.registerContractProcessor(new CompositeTimelineChannelProcessor()); - blue.registerContractProcessor(new OperationProcessor()); - blue.registerContractProcessor(new ChatWorkflowOperationProcessor(runner)); - blue.registerContractProcessor(new SequentialWorkflowProcessor(runner)); - blue.registerContractProcessor(new SequentialWorkflowOperationProcessor(runner)); - CoordinationMerging.install(blue); - return blue; - } - - public static DocumentProcessor.Builder configure(DocumentProcessor.Builder builder) { + return builder.build(); + } + + /** Adds Coordination processors to a standalone processor builder. */ + public static DocumentProcessor.Builder configure( + DocumentProcessor.Builder builder) { return configure(builder, null); } - public static DocumentProcessor.Builder configure(DocumentProcessor.Builder builder, - CoordinationProcessorOptions options) { + /** + * Adds repository model mappings, processors, and the optional observer to + * a host-owned immutable processor builder. + */ + public static DocumentProcessor.Builder configure( + DocumentProcessor.Builder builder, + CoordinationProcessorOptions options) { if (builder == null) { throw new IllegalArgumentException("builder must not be null"); } BexProcessingMetrics metrics = processingMetrics(options); if (metrics != null) { - builder.withProcessingMetricsSink(metrics); + builder.observer(metrics); } SequentialWorkflowRunner runner = workflowRunner(options); - TypeClassResolver resolver = BlueRepositoryModels.registerAll( - new TypeClassResolver("blue.language.processor.model")); - return builder - .withContractTypeResolver(resolver) - .registerContractProcessor(new TimelineChannelProcessor()) - .registerContractProcessor(new AllTimelinesChannelProcessor()) - .registerContractProcessor(new CompositeTimelineChannelProcessor()) + CoordinationSemanticTypeIdentities identities = + semanticTypeIdentities(options); + CoordinationCurrentRepositoryIdentities current = + CoordinationCurrentRepositoryIdentities.current(); + DocumentProcessor.Builder configured = builder + .scanContractTypes("blue.language.processor.model") + .scanContractTypes("blue.repo") + .registerContractProcessor( + new TimelineChannelProcessor(identities)) + .registerContractProcessor( + new AllTimelinesChannelProcessor( + current.timelineChannelBlueId(), + identities)) + .registerContractProcessor( + new CompositeTimelineChannelProcessor( + current.timelineChannelBlueId(), + identities)) .registerContractProcessor(new OperationProcessor()) .registerContractProcessor(new ChatWorkflowOperationProcessor(runner)) - .registerContractProcessor(new SequentialWorkflowProcessor(runner)) - .registerContractProcessor(new SequentialWorkflowOperationProcessor(runner)); + .registerContractProcessor( + new SequentialWorkflowProcessor( + runner, identities)) + .registerContractProcessor( + new SequentialWorkflowOperationProcessor( + runner, identities)); + return registerCurrentRepositoryMarkers(configured); + } + + /** Adds Coordination processors to the registry used by BlueContracts. */ + public static ContractProcessorRegistryBuilder configure( + ContractProcessorRegistryBuilder registry) { + return configure(registry, null); + } + + /** Adds Coordination processors to the registry used by BlueContracts. */ + public static ContractProcessorRegistryBuilder configure( + ContractProcessorRegistryBuilder registry, + CoordinationProcessorOptions options) { + if (registry == null) { + throw new IllegalArgumentException("registry must not be null"); + } + SequentialWorkflowRunner runner = workflowRunner(options); + CoordinationSemanticTypeIdentities identities = + semanticTypeIdentities(options); + CoordinationCurrentRepositoryIdentities current = + CoordinationCurrentRepositoryIdentities.current(); + ContractProcessorRegistryBuilder configured = registry + .register(new TimelineChannelProcessor(identities)) + .register(new AllTimelinesChannelProcessor( + current.timelineChannelBlueId(), + identities)) + .register(new CompositeTimelineChannelProcessor( + current.timelineChannelBlueId(), + identities)) + .register(new OperationProcessor()) + .register(new ChatWorkflowOperationProcessor(runner)) + .register(new SequentialWorkflowProcessor( + runner, identities)) + .register(new SequentialWorkflowOperationProcessor( + runner, identities)); + return registerCurrentRepositoryMarkers(configured); } - private static BexProcessingMetrics processingMetrics(CoordinationProcessorOptions options) { + /** Registers one exact Timeline Channel subtype on a processor builder. */ + public static + DocumentProcessor.Builder registerTimelineSubtype( + DocumentProcessor.Builder builder, + Class contractType) { + if (builder == null) { + throw new IllegalArgumentException("builder must not be null"); + } + return builder.registerContractProcessor( + new TimelineChannelSubtypeProcessor(contractType)); + } + + /** Registers one exact Timeline Channel subtype in a Contracts registry. */ + public static + ContractProcessorRegistryBuilder registerTimelineSubtype( + ContractProcessorRegistryBuilder registry, + Class contractType) { + if (registry == null) { + throw new IllegalArgumentException("registry must not be null"); + } + return registry.register( + new TimelineChannelSubtypeProcessor(contractType)); + } + + /** + * Returns the immutable identity of the Coordination registrations that + * are actually installed in the supplied processor generation. + * + * @param processor exact processor generation to inspect + * @return deterministic Coordination runtime-registration identity + */ + public static String runtimeRegistrationIdentity( + DocumentProcessor processor) { + return CoordinationRuntimeRegistrations.identity( + Objects.requireNonNull(processor, "processor")); + } + + /** + * Returns a failure-isolated observer fan-out. Observer failures never + * enter semantic execution. + */ + public static ProcessingObserver observers( + final ProcessingObserver first, + final ProcessingObserver second) { + if (first == null) { + return second; + } + if (second == null || first == second) { + return first; + } + return observation -> { + try { + first.record(observation); + } catch (RuntimeException ignored) { + // Operational diagnostics are deliberately failure-isolated. + } + try { + second.record(observation); + } catch (RuntimeException ignored) { + // Operational diagnostics are deliberately failure-isolated. + } + }; + } + + private static BexProcessingMetrics processingMetrics( + CoordinationProcessorOptions options) { return options != null ? options.processingMetrics() : null; } - private static void installProcessingMetrics(DocumentProcessor processor, - BexProcessingMetrics coordinationMetrics) { - ProcessingMetricsSink existing = processor.processingMetricsSink(); - if (existing == coordinationMetrics) { - return; + private static BlueLanguage requireLanguage(BlueLanguage language) { + if (language == null) { + throw new IllegalArgumentException("language must not be null"); + } + return language; + } + + private static CoordinationProcessorOptions optionsWithLanguage( + BlueLanguage language, + CoordinationProcessorOptions options) { + if (options == null) { + return CoordinationProcessorOptions.builder() + .language(language) + .build(); } - if (existing == null || existing == ProcessingMetricsSink.NOOP) { - processor.processingMetricsSink(coordinationMetrics); - return; + if (options.sequentialWorkflowRunner() != null + || options.bexEngine() != null) { + return options; } - processor.processingMetricsSink(new CompositeProcessingMetricsSink( - existing, coordinationMetrics)); + return CoordinationProcessorOptions.builder() + .language(language) + .defaultComputeGasLimit(options.defaultComputeGasLimit()) + .processingMetrics(options.processingMetrics()) + .processingEventIdentityObserver( + options.processingEventIdentityObserver()) + .semanticTypeIdentities( + options.semanticTypeIdentities()) + .build(); } - private static SequentialWorkflowRunner workflowRunner(CoordinationProcessorOptions options) { + private static SequentialWorkflowRunner workflowRunner( + CoordinationProcessorOptions options) { if (options != null && options.sequentialWorkflowRunner() != null) { return options.sequentialWorkflowRunner(); } - BexEngine bexEngine = options != null && options.bexEngine() != null - ? options.bexEngine() - : BexEngine.builder().build(); - return SequentialWorkflowRunner.withBexEngine(bexEngine, + if (options != null && options.bexEngine() != null) { + return SequentialWorkflowRunner.withBexEngine( + options.bexEngine(), + options.defaultComputeGasLimit(), + processingMetrics(options), + options.processingEventIdentityObserver()); + } + if (options != null && options.language() != null) { + return SequentialWorkflowRunner.withLanguage( + options.language(), + options.defaultComputeGasLimit(), + processingMetrics(options), + options.processingEventIdentityObserver()); + } + BexEngine engine = BexEngine.builder() + .intrinsics(CoordinationBexIntrinsics.common()) + .build(); + return SequentialWorkflowRunner.withBexEngine( + engine, options != null ? options.defaultComputeGasLimit() : 100_000L, - processingMetrics(options)); - } - - /** Static, allocation-free-per-sample fan-out for preserving an independently installed sink. */ - private static final class CompositeProcessingMetricsSink implements ProcessingMetricsSink { - private final ProcessingMetricsSink first; - private final ProcessingMetricsSink second; - - private CompositeProcessingMetricsSink(ProcessingMetricsSink first, - ProcessingMetricsSink second) { - this.first = first; - this.second = second; - } - - @Override public void addMetric(String name, long delta) { first.addMetric(name, delta); second.addMetric(name, delta); } - @Override public void setMetric(String name, long value) { first.setMetric(name, value); second.setMetric(name, value); } - @Override public void recordMetricHighWater(String name, long value) { first.recordMetricHighWater(name, value); second.recordMetricHighWater(name, value); } - @Override public void addProcessDocumentNanos(long value) { first.addProcessDocumentNanos(value); second.addProcessDocumentNanos(value); } - @Override public void addBlueProcessDocumentNanos(long value) { first.addBlueProcessDocumentNanos(value); second.addBlueProcessDocumentNanos(value); } - @Override public void addEventPreprocessNanos(long value) { first.addEventPreprocessNanos(value); second.addEventPreprocessNanos(value); } - @Override public void addResultSnapshotAttachNanos(long value) { first.addResultSnapshotAttachNanos(value); second.addResultSnapshotAttachNanos(value); } - @Override public void addBlueIdCalculationNanos(long value) { first.addBlueIdCalculationNanos(value); second.addBlueIdCalculationNanos(value); } - @Override public void addProcessingSnapshotCacheLookupNanos(long value) { first.addProcessingSnapshotCacheLookupNanos(value); second.addProcessingSnapshotCacheLookupNanos(value); } - @Override public void incrementProcessingSnapshotCacheHits() { first.incrementProcessingSnapshotCacheHits(); second.incrementProcessingSnapshotCacheHits(); } - @Override public void incrementProcessingSnapshotCacheMisses() { first.incrementProcessingSnapshotCacheMisses(); second.incrementProcessingSnapshotCacheMisses(); } - @Override public void addProcessingSnapshotFromDocumentNanos(long value) { first.addProcessingSnapshotFromDocumentNanos(value); second.addProcessingSnapshotFromDocumentNanos(value); } - @Override public void incrementProcessingSnapshotFromDocumentBuilds() { first.incrementProcessingSnapshotFromDocumentBuilds(); second.incrementProcessingSnapshotFromDocumentBuilds(); } - @Override public void incrementProcessEventSnapshotAttempts() { first.incrementProcessEventSnapshotAttempts(); second.incrementProcessEventSnapshotAttempts(); } - @Override public void incrementProcessEventSnapshotBuilds() { first.incrementProcessEventSnapshotBuilds(); second.incrementProcessEventSnapshotBuilds(); } - @Override public void incrementProcessEventSnapshotFailures() { first.incrementProcessEventSnapshotFailures(); second.incrementProcessEventSnapshotFailures(); } - @Override public void addProcessEventSnapshotConstructionNanos(long value) { first.addProcessEventSnapshotConstructionNanos(value); second.addProcessEventSnapshotConstructionNanos(value); } - @Override public void addBundleLoadNanos(long value) { first.addBundleLoadNanos(value); second.addBundleLoadNanos(value); } - @Override public void addBundleLoadCacheKeyBuildNanos(long value) { first.addBundleLoadCacheKeyBuildNanos(value); second.addBundleLoadCacheKeyBuildNanos(value); } - @Override public void addBundleLoadActualBuildNanos(long value) { first.addBundleLoadActualBuildNanos(value); second.addBundleLoadActualBuildNanos(value); } - @Override public void addBundleLoadReuseNanos(long value) { first.addBundleLoadReuseNanos(value); second.addBundleLoadReuseNanos(value); } - @Override public void incrementBundleLoadCacheHits() { first.incrementBundleLoadCacheHits(); second.incrementBundleLoadCacheHits(); } - @Override public void incrementBundleLoadCacheMisses() { first.incrementBundleLoadCacheMisses(); second.incrementBundleLoadCacheMisses(); } - @Override public void incrementBundlesBuilt() { first.incrementBundlesBuilt(); second.incrementBundlesBuilt(); } - @Override public void incrementBundlesReused() { first.incrementBundlesReused(); second.incrementBundlesReused(); } - @Override public void incrementBundleScopeLoadAttempts() { first.incrementBundleScopeLoadAttempts(); second.incrementBundleScopeLoadAttempts(); } - @Override public void incrementBundleScopeExecutionCacheHits() { first.incrementBundleScopeExecutionCacheHits(); second.incrementBundleScopeExecutionCacheHits(); } - @Override public void incrementBundleScopeRefreshes() { first.incrementBundleScopeRefreshes(); second.incrementBundleScopeRefreshes(); } - @Override public void addBundleScopeTerminationCheckNanos(long value) { first.addBundleScopeTerminationCheckNanos(value); second.addBundleScopeTerminationCheckNanos(value); } - @Override public void addBundleScopeResolvedLookupNanos(long value) { first.addBundleScopeResolvedLookupNanos(value); second.addBundleScopeResolvedLookupNanos(value); } - @Override public void addBundleScopeContractLoadNanos(long value) { first.addBundleScopeContractLoadNanos(value); second.addBundleScopeContractLoadNanos(value); } - @Override public void addChannelDiscoveryNanos(long value) { first.addChannelDiscoveryNanos(value); second.addChannelDiscoveryNanos(value); } - @Override public void addChannelMatchNanos(long value) { first.addChannelMatchNanos(value); second.addChannelMatchNanos(value); } - @Override public void incrementChannelEvaluations() { first.incrementChannelEvaluations(); second.incrementChannelEvaluations(); } - @Override public void incrementRoutedChannelDeliveries() { first.incrementRoutedChannelDeliveries(); second.incrementRoutedChannelDeliveries(); } - @Override public void incrementDeduplicatedChannelDeliveries() { first.incrementDeduplicatedChannelDeliveries(); second.incrementDeduplicatedChannelDeliveries(); } - @Override public void addHandlerDiscoveryNanos(long value) { first.addHandlerDiscoveryNanos(value); second.addHandlerDiscoveryNanos(value); } - @Override public void addHandlerMatchNanos(long value) { first.addHandlerMatchNanos(value); second.addHandlerMatchNanos(value); } - @Override public void incrementHandlerMatchAttempts() { first.incrementHandlerMatchAttempts(); second.incrementHandlerMatchAttempts(); } - @Override public void addHandlerExecutionNanos(long value) { first.addHandlerExecutionNanos(value); second.addHandlerExecutionNanos(value); } - @Override public void incrementHandlersExecuted() { first.incrementHandlersExecuted(); second.incrementHandlersExecuted(); } - @Override public void addTriggeredEventRoutingNanos(long value) { first.addTriggeredEventRoutingNanos(value); second.addTriggeredEventRoutingNanos(value); } - @Override public void incrementTriggeredEventsRouted() { first.incrementTriggeredEventsRouted(); second.incrementTriggeredEventsRouted(); } - @Override public void addCheckpointUpdateNanos(long value) { first.addCheckpointUpdateNanos(value); second.addCheckpointUpdateNanos(value); } - @Override public void addCheckpointEnsureNanos(long value) { first.addCheckpointEnsureNanos(value); second.addCheckpointEnsureNanos(value); } - @Override public void addCheckpointFindNanos(long value) { first.addCheckpointFindNanos(value); second.addCheckpointFindNanos(value); } - @Override public void addCheckpointCurrentIdentityNanos(long value) { first.addCheckpointCurrentIdentityNanos(value); second.addCheckpointCurrentIdentityNanos(value); } - @Override public void addCheckpointIsNewerNanos(long value) { first.addCheckpointIsNewerNanos(value); second.addCheckpointIsNewerNanos(value); } - @Override public void addCheckpointDuplicateNanos(long value) { first.addCheckpointDuplicateNanos(value); second.addCheckpointDuplicateNanos(value); } - @Override public void addCheckpointPersistNanos(long value) { first.addCheckpointPersistNanos(value); second.addCheckpointPersistNanos(value); } - @Override public void incrementCheckpointIdentityCacheHits() { first.incrementCheckpointIdentityCacheHits(); second.incrementCheckpointIdentityCacheHits(); } - @Override public void incrementCheckpointIdentityCacheMisses() { first.incrementCheckpointIdentityCacheMisses(); second.incrementCheckpointIdentityCacheMisses(); } - @Override public void incrementCheckpointStoredIdentityCacheHits() { first.incrementCheckpointStoredIdentityCacheHits(); second.incrementCheckpointStoredIdentityCacheHits(); } - @Override public void incrementCheckpointStoredIdentityCacheMisses() { first.incrementCheckpointStoredIdentityCacheMisses(); second.incrementCheckpointStoredIdentityCacheMisses(); } - @Override public void addCheckpointDirectBlueIdNanos(long value) { first.addCheckpointDirectBlueIdNanos(value); second.addCheckpointDirectBlueIdNanos(value); } - @Override public void addCheckpointContentBlueIdNanos(long value) { first.addCheckpointContentBlueIdNanos(value); second.addCheckpointContentBlueIdNanos(value); } - @Override public void addCheckpointFallbackNanos(long value) { first.addCheckpointFallbackNanos(value); second.addCheckpointFallbackNanos(value); } - @Override public void addSnapshotCommitNanos(long value) { first.addSnapshotCommitNanos(value); second.addSnapshotCommitNanos(value); } - @Override public void addPostProcessingNanos(long value) { first.addPostProcessingNanos(value); second.addPostProcessingNanos(value); } - @Override public void addPatchBoundaryNanos(long value) { first.addPatchBoundaryNanos(value); second.addPatchBoundaryNanos(value); } - @Override public void addPatchGasNanos(long value) { first.addPatchGasNanos(value); second.addPatchGasNanos(value); } - @Override public void addDocumentUpdateRoutingNanos(long value) { first.addDocumentUpdateRoutingNanos(value); second.addDocumentUpdateRoutingNanos(value); } - @Override public void incrementDocumentUpdateEventsBuilt() { first.incrementDocumentUpdateEventsBuilt(); second.incrementDocumentUpdateEventsBuilt(); } - @Override public void incrementDocumentUpdateEventsSkippedNoChannel() { first.incrementDocumentUpdateEventsSkippedNoChannel(); second.incrementDocumentUpdateEventsSkippedNoChannel(); } - @Override public void addBatchPatchPlanningNanos(long value) { first.addBatchPatchPlanningNanos(value); second.addBatchPatchPlanningNanos(value); } - @Override public void addBatchPatchConformanceNanos(long value) { first.addBatchPatchConformanceNanos(value); second.addBatchPatchConformanceNanos(value); } - @Override public void addBatchPatchBuildUpdatesNanos(long value) { first.addBatchPatchBuildUpdatesNanos(value); second.addBatchPatchBuildUpdatesNanos(value); } - @Override public void addBatchPatchCommitNanos(long value) { first.addBatchPatchCommitNanos(value); second.addBatchPatchCommitNanos(value); } - @Override public void incrementDocumentUpdateBeforeMaterializations() { first.incrementDocumentUpdateBeforeMaterializations(); second.incrementDocumentUpdateBeforeMaterializations(); } - @Override public void incrementDocumentUpdateAfterMaterializations() { first.incrementDocumentUpdateAfterMaterializations(); second.incrementDocumentUpdateAfterMaterializations(); } - @Override public void incrementPatchSequencesPrepared() { first.incrementPatchSequencesPrepared(); second.incrementPatchSequencesPrepared(); } - @Override public void addPatchesPrepared(long value) { first.addPatchesPrepared(value); second.addPatchesPrepared(value); } - @Override public void incrementSingletonPatchTransactions() { first.incrementSingletonPatchTransactions(); second.incrementSingletonPatchTransactions(); } - @Override public void addSequencePlanningNanos(long value) { first.addSequencePlanningNanos(value); second.addSequencePlanningNanos(value); } - @Override public void addSequenceConformanceNanos(long value) { first.addSequenceConformanceNanos(value); second.addSequenceConformanceNanos(value); } - @Override public void addSequenceCommitNanos(long value) { first.addSequenceCommitNanos(value); second.addSequenceCommitNanos(value); } - @Override public void addSequenceFinalCacheCommitNanos(long value) { first.addSequenceFinalCacheCommitNanos(value); second.addSequenceFinalCacheCommitNanos(value); } - @Override public void incrementSequenceIntermediateSnapshotAdvances() { first.incrementSequenceIntermediateSnapshotAdvances(); second.incrementSequenceIntermediateSnapshotAdvances(); } - @Override public void incrementSequenceSharedSnapshotCacheInserts() { first.incrementSequenceSharedSnapshotCacheInserts(); second.incrementSequenceSharedSnapshotCacheInserts(); } - @Override public void incrementSequenceFinalSnapshotCacheInserts() { first.incrementSequenceFinalSnapshotCacheInserts(); second.incrementSequenceFinalSnapshotCacheInserts(); } - @Override public void incrementSequenceSuffixRebases() { first.incrementSequenceSuffixRebases(); second.incrementSequenceSuffixRebases(); } - @Override public void incrementSequenceStalePreviewFallbacks() { first.incrementSequenceStalePreviewFallbacks(); second.incrementSequenceStalePreviewFallbacks(); } - @Override public void incrementSequenceFallbackPatches() { first.incrementSequenceFallbackPatches(); second.incrementSequenceFallbackPatches(); } - @Override public void incrementParsedPointerCacheHits() { first.incrementParsedPointerCacheHits(); second.incrementParsedPointerCacheHits(); } - @Override public void incrementParsedPointerCacheMisses() { first.incrementParsedPointerCacheMisses(); second.incrementParsedPointerCacheMisses(); } - @Override public void incrementFrozenPatchValueHits() { first.incrementFrozenPatchValueHits(); second.incrementFrozenPatchValueHits(); } - @Override public void incrementPatchValueMaterializations() { first.incrementPatchValueMaterializations(); second.incrementPatchValueMaterializations(); } - @Override public void incrementFrozenNodesCreated() { first.incrementFrozenNodesCreated(); second.incrementFrozenNodesCreated(); } - @Override public void incrementFrozenNodesReused() { first.incrementFrozenNodesReused(); second.incrementFrozenNodesReused(); } - @Override public void incrementCanonicalIdentityCalculations() { first.incrementCanonicalIdentityCalculations(); second.incrementCanonicalIdentityCalculations(); } - @Override public void incrementResolvedIdentityCalculations() { first.incrementResolvedIdentityCalculations(); second.incrementResolvedIdentityCalculations(); } - @Override public void addCanonicalBytesWritten(long value) { first.addCanonicalBytesWritten(value); second.addCanonicalBytesWritten(value); } - @Override public void incrementJcsFallbacks() { first.incrementJcsFallbacks(); second.incrementJcsFallbacks(); } - @Override public void addBase58EncodeNanos(long value) { first.addBase58EncodeNanos(value); second.addBase58EncodeNanos(value); } - @Override public void addBase58DecodeNanos(long value) { first.addBase58DecodeNanos(value); second.addBase58DecodeNanos(value); } - @Override public void addBlueIdDigestNanos(long value) { first.addBlueIdDigestNanos(value); second.addBlueIdDigestNanos(value); } - @Override public void incrementResolvedStructuralKeyBuilds() { first.incrementResolvedStructuralKeyBuilds(); second.incrementResolvedStructuralKeyBuilds(); } + processingMetrics(options), + options != null + ? options.processingEventIdentityObserver() + : null); + } + + private static CoordinationSemanticTypeIdentities + semanticTypeIdentities(CoordinationProcessorOptions options) { + return options != null + ? options.semanticTypeIdentities() + : CoordinationSemanticTypeIdentities.publishedDefaults(); + } + + private static DocumentProcessor.Builder registerCurrentRepositoryMarkers( + DocumentProcessor.Builder builder) { + DocumentProcessor.Builder configured = builder; + for (Class marker + : currentRepositoryMarkerTypes()) { + configured = registerMarker(configured, marker); + } + return configured; + } + + private static ContractProcessorRegistryBuilder + registerCurrentRepositoryMarkers( + ContractProcessorRegistryBuilder registry) { + ContractProcessorRegistryBuilder configured = registry; + for (Class marker + : currentRepositoryMarkerTypes()) { + configured = registerMarker(configured, marker); + } + return configured; + } + + private static Class[] + currentRepositoryMarkerTypes() { + @SuppressWarnings({"unchecked", "rawtypes"}) + Class[] result = new Class[] { + ActorPolicy.class, + ComputeDefinition.class, + DocumentAnchors.class, + DocumentLinks.class, + SearchContract.class, + ContractsChangePolicy.class, + DocumentSection.class + }; + return result; + } + + private static + DocumentProcessor.Builder registerMarker( + DocumentProcessor.Builder builder, + Class marker) { + return builder.registerContractProcessor( + new CurrentRepositoryMarkerProcessor(marker)); + } + + private static + ContractProcessorRegistryBuilder registerMarker( + ContractProcessorRegistryBuilder registry, + Class marker) { + return registry.register( + new CurrentRepositoryMarkerProcessor(marker)); } } diff --git a/src/main/java/blue/coordination/processor/CoordinationRepositoryCompatibilityNodeProvider.java b/src/main/java/blue/coordination/processor/CoordinationRepositoryCompatibilityNodeProvider.java deleted file mode 100644 index dbeff07..0000000 --- a/src/main/java/blue/coordination/processor/CoordinationRepositoryCompatibilityNodeProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -package blue.coordination.processor; - -import blue.language.NodeProvider; -import blue.language.model.Node; -import blue.language.provider.SequentialNodeProvider; -import blue.repo.coordination.Compute; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public final class CoordinationRepositoryCompatibilityNodeProvider implements NodeProvider { - private final NodeProvider delegate; - - public CoordinationRepositoryCompatibilityNodeProvider(NodeProvider delegate) { - if (delegate == null) { - throw new IllegalArgumentException("delegate must not be null"); - } - this.delegate = delegate; - } - - public static boolean isInstalled(NodeProvider provider) { - if (provider instanceof CoordinationRepositoryCompatibilityNodeProvider) { - return true; - } - if (provider instanceof SequentialNodeProvider) { - for (NodeProvider child : ((SequentialNodeProvider) provider).getNodeProviders()) { - if (isInstalled(child)) { - return true; - } - } - } - return false; - } - - @Override - public List fetchByBlueId(String blueId) { - List nodes = delegate.fetchByBlueId(blueId); - if (nodes == null || nodes.isEmpty() || !Compute.blueId().equals(baseBlueId(blueId))) { - return nodes; - } - List compatible = new ArrayList(nodes.size()); - for (Node node : nodes) { - compatible.add(sanitizeComputeDefinition(node)); - } - return compatible; - } - - private Node sanitizeComputeDefinition(Node node) { - Node sanitized = node.clone(); - Map properties = sanitized.getProperties(); - if (properties == null || properties.isEmpty()) { - return sanitized; - } - stripRuntimeDefault(properties, "emitEvents"); - stripRuntimeDefault(properties, "returnResult"); - return sanitized; - } - - private void stripRuntimeDefault(Map properties, String key) { - Node field = properties.get(key); - if (field == null || !Boolean.TRUE.equals(field.getValue())) { - return; - } - Node sanitized = field.clone(); - sanitized.value((Object) null); - properties.put(key, sanitized); - } - - private String baseBlueId(String blueId) { - if (blueId == null) { - return null; - } - int fragment = blueId.indexOf('#'); - return fragment >= 0 ? blueId.substring(0, fragment) : blueId; - } -} diff --git a/src/main/java/blue/coordination/processor/CoordinationRuntimeGas.java b/src/main/java/blue/coordination/processor/CoordinationRuntimeGas.java new file mode 100644 index 0000000..1baa97a --- /dev/null +++ b/src/main/java/blue/coordination/processor/CoordinationRuntimeGas.java @@ -0,0 +1,112 @@ +package blue.coordination.processor; + +import blue.coordination.processor.support.CoordinationRuntimeGasSupport; +import blue.language.processor.GasChargeContext; +import blue.language.processor.ProcessorExecutionContext; +import blue.language.processor.RuntimeWorkSession; + +import java.util.Map; +import java.util.Objects; + +/** + * Stable public facade for the manifest-backed Coordination runtime ledger. + * + *

All handles delegate to one package-neutral implementation. Workflow and + * facade callers therefore share physical ledgers and exactly-once submission + * state without a workflow-to-facade package dependency.

+ */ +public final class CoordinationRuntimeGas { + public static final String RESOURCE = + CoordinationRuntimeGasSupport.RESOURCE; + public static final String NAMESPACE = + CoordinationRuntimeGasSupport.NAMESPACE; + + private CoordinationRuntimeGas() { + } + + public static Ledger open(RuntimeWorkSession session) { + return new Ledger(CoordinationRuntimeGasSupport.open(session)); + } + + public static Ledger open(ProcessorExecutionContext context) { + return new Ledger(CoordinationRuntimeGasSupport.open(context)); + } + + static T inComponent( + RuntimeWorkSession session, + final ComponentWork work) { + Objects.requireNonNull(work, "work"); + return CoordinationRuntimeGasSupport.inComponent( + session, + new CoordinationRuntimeGasSupport.ComponentWork() { + @Override + public T run() { + return work.run(); + } + }); + } + + static T inComponent( + ProcessorExecutionContext context, + final ComponentWork work) { + Objects.requireNonNull(work, "work"); + return CoordinationRuntimeGasSupport.inComponent( + context, + new CoordinationRuntimeGasSupport.ComponentWork() { + @Override + public T run() { + return work.run(); + } + }); + } + + public static void charge( + RuntimeWorkSession session, + String counter, + long quantity, + GasChargeContext context) { + CoordinationRuntimeGasSupport.charge( + session, counter, quantity, context); + } + + public static void charge( + ProcessorExecutionContext context, + String counter, + long quantity, + GasChargeContext gasContext) { + CoordinationRuntimeGasSupport.charge( + context, counter, quantity, gasContext); + } + + public static Map counterWeights() { + return CoordinationRuntimeGasSupport.counterWeights(); + } + + /** Public compatibility handle over the shared runtime ledger. */ + public static final class Ledger { + private final CoordinationRuntimeGasSupport.Ledger delegate; + + private Ledger(CoordinationRuntimeGasSupport.Ledger delegate) { + this.delegate = delegate; + } + + public void charge( + String counter, + long quantity, + GasChargeContext context) { + delegate.charge(counter, quantity, context); + } + + public void submit() { + delegate.submit(); + } + + public boolean isSessionOpen() { + return delegate.isSessionOpen(); + } + } + + interface ComponentWork { + T run(); + } +} diff --git a/src/main/java/blue/coordination/processor/CoordinationRuntimeLimits.java b/src/main/java/blue/coordination/processor/CoordinationRuntimeLimits.java new file mode 100644 index 0000000..ae8ed58 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CoordinationRuntimeLimits.java @@ -0,0 +1,29 @@ +package blue.coordination.processor; + +import blue.coordination.processor.support.CoordinationRuntimeLimitsSupport; + +/** + * Frozen Coordination 1.0 portable {@code PROCESS} limits. + * + *

This public compatibility facade delegates to the package-neutral + * runtime catalog used by workflow execution. Keeping the catalog below both + * packages prevents the API facade and workflow implementation from forming + * a package cycle.

+ */ +public final class CoordinationRuntimeLimits { + public static final int MAX_COMPOSITE_MEMBERS = + CoordinationRuntimeLimitsSupport.MAX_COMPOSITE_MEMBERS; + public static final int MAX_ALL_TIMELINES_MEMBERS = + CoordinationRuntimeLimitsSupport.MAX_ALL_TIMELINES_MEMBERS; + public static final int MAX_WORKFLOW_STEPS = + CoordinationRuntimeLimitsSupport.MAX_WORKFLOW_STEPS; + public static final int MAX_OPERATION_CANDIDATES_PER_CHANNEL = + CoordinationRuntimeLimitsSupport + .MAX_OPERATION_CANDIDATES_PER_CHANNEL; + public static final long MAX_COORDINATION_RUNTIME_GAS_PER_PROCESS = + CoordinationRuntimeLimitsSupport + .MAX_COORDINATION_RUNTIME_GAS_PER_PROCESS; + + private CoordinationRuntimeLimits() { + } +} diff --git a/src/main/java/blue/coordination/processor/CoordinationRuntimeRegistrations.java b/src/main/java/blue/coordination/processor/CoordinationRuntimeRegistrations.java new file mode 100644 index 0000000..4b3ad27 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CoordinationRuntimeRegistrations.java @@ -0,0 +1,157 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ContractProcessor; +import blue.language.processor.DocumentProcessor; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.model.Contract; +import blue.language.identity.DirectBlueIdCalculator; +import blue.repo.coordination.TimelineChannel; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Deterministic identity of the Coordination registrations installed in one + * concrete Language processor. + */ +final class CoordinationRuntimeRegistrations { + private static final String IDENTITY_KIND = + "blue.coordination/runtime-registry/1.0"; + + private CoordinationRuntimeRegistrations() { + } + + static String identity( + DocumentProcessor processor) { + return identity(runtimeTypes(processor)); + } + + static List timelineSubtypeBlueIds( + DocumentProcessor processor) { + Objects.requireNonNull(processor, "processor"); + List result = + new ArrayList(); + for (Map.Entry< + String, + ContractProcessor> + registration + : processor.administration() + .contractRegistry() + .processors().entrySet()) { + ContractProcessor + registeredProcessor = + registration.getValue(); + Class contractType = + registeredProcessor + .contractType(); + if (!(registeredProcessor + instanceof TimelineChannelSubtypeProcessor) + || contractType == null + || TimelineChannel.class.equals( + contractType) + || !TimelineChannel.class + .isAssignableFrom( + contractType)) { + continue; + } + result.add(registration.getKey()); + } + result.sort(ExternalOrderKey::compareTextCodePoints); + return Collections.unmodifiableList( + result); + } + + private static List runtimeTypes( + DocumentProcessor processor) { + Objects.requireNonNull(processor, "processor"); + List types = + new ArrayList(); + for (Map.Entry< + String, + ContractProcessor> + registration + : processor.administration() + .contractRegistry() + .processors().entrySet()) { + ContractProcessor + registeredProcessor = + registration.getValue(); + if (!isCoordinationRegistration( + registeredProcessor)) { + continue; + } + Class contractType = + registeredProcessor.contractType(); + types.add( + registration.getKey() + + "\u0000" + + registeredProcessor + .getClass().getName() + + "\u0000" + + (contractType == null + ? "" + : contractType.getName())); + if (registeredProcessor + instanceof TimelineChannelProcessor) { + types.add( + "semantic-profile\u0000" + + ((TimelineChannelProcessor) + registeredProcessor) + .semanticTypeIdentities() + .profileIdentity()); + } + } + types.sort(ExternalOrderKey::compareTextCodePoints); + types.add( + "projection\u0000" + + TimelineSubscriptionProjection.VERSION); + return Collections.unmodifiableList(types); + } + + private static boolean isCoordinationRegistration( + ContractProcessor processor) { + return processor + instanceof TimelineChannelProcessor + || processor + instanceof TimelineChannelSubtypeProcessor + || processor + instanceof AllTimelinesChannelProcessor + || processor + instanceof CompositeTimelineChannelProcessor + || processor + instanceof OperationProcessor + || processor + instanceof ChatWorkflowOperationProcessor + || processor + instanceof SequentialWorkflowProcessor + || processor + instanceof SequentialWorkflowOperationProcessor + || processor + instanceof CurrentRepositoryMarkerProcessor; + } + + private static String identity( + List values) { + List items = + new ArrayList( + values.size()); + for (String value : values) { + items.add( + new Node().value(value)); + } + return DirectBlueIdCalculator.calculateBlueId( + new Node() + .properties( + "kind", + new Node().value( + IDENTITY_KIND)) + .properties( + "values", + new Node().items( + items))); + } +} diff --git a/src/main/java/blue/coordination/processor/CoordinationSemanticTypeIdentities.java b/src/main/java/blue/coordination/processor/CoordinationSemanticTypeIdentities.java new file mode 100644 index 0000000..86fbd95 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CoordinationSemanticTypeIdentities.java @@ -0,0 +1,208 @@ +package blue.coordination.processor; + +import blue.language.api.NodeProviderOutcome; +import blue.language.identity.BlueIds; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.language.provider.NodeProvider; +import blue.language.provider.NodeProviderResult; + +import java.util.List; +import java.util.Objects; + +/** + * Immutable semantic event identities used by Coordination routing. + * + *

Published defaults preserve the Coordination 1.0 wire contract. A host + * may bind independently authored exact types for an isolated runtime, but a + * custom binding is admitted only when the runtime provider returns canonical + * content whose direct identity is exactly the configured BlueId.

+ */ +public final class CoordinationSemanticTypeIdentities { + + private static final CoordinationSemanticTypeIdentities + PUBLISHED_DEFAULTS = + publishedDefaultsFromCurrentRepository(); + + private final String timelineEntryBlueId; + private final String operationRequestBlueId; + private final String timelineBlueId; + private final String actorBlueId; + private final String profileIdentity; + private final boolean custom; + + private static CoordinationSemanticTypeIdentities + publishedDefaultsFromCurrentRepository() { + CoordinationCurrentRepositoryIdentities current = + CoordinationCurrentRepositoryIdentities.current(); + return new CoordinationSemanticTypeIdentities( + current.timelineEntryBlueId(), + current.operationRequestBlueId(), + current.timelineBlueId(), + current.actorBlueId(), + false); + } + + private CoordinationSemanticTypeIdentities( + String timelineEntryBlueId, + String operationRequestBlueId, + String timelineBlueId, + String actorBlueId, + boolean custom) { + this.timelineEntryBlueId = requireBlueId( + timelineEntryBlueId, "timelineEntryBlueId"); + this.operationRequestBlueId = requireBlueId( + operationRequestBlueId, "operationRequestBlueId"); + this.timelineBlueId = requireBlueId( + timelineBlueId, "timelineBlueId"); + this.actorBlueId = requireBlueId( + actorBlueId, "actorBlueId"); + this.custom = custom; + this.profileIdentity = DirectBlueIdCalculator.calculateBlueId( + new Node() + .properties("kind", new Node().value( + "blue.coordination/semantic-type-profile/1")) + .properties("timelineEntry", new Node().value( + this.timelineEntryBlueId)) + .properties("operationRequest", new Node().value( + this.operationRequestBlueId)) + .properties("timeline", new Node().value( + this.timelineBlueId)) + .properties("actor", new Node().value( + this.actorBlueId))); + } + + /** Returns the unchanged fixed-Repository Coordination 1.0 identities. */ + public static CoordinationSemanticTypeIdentities publishedDefaults() { + return PUBLISHED_DEFAULTS; + } + + /** + * Creates custom runtime identities. The result must be validated against + * the exact provider selected for that runtime before processor assembly. + */ + public static CoordinationSemanticTypeIdentities exact( + String timelineEntryBlueId, + String operationRequestBlueId, + String timelineBlueId, + String actorBlueId) { + return new CoordinationSemanticTypeIdentities( + timelineEntryBlueId, + operationRequestBlueId, + timelineBlueId, + actorBlueId, + true); + } + + public String timelineEntryBlueId() { + return timelineEntryBlueId; + } + + public String operationRequestBlueId() { + return operationRequestBlueId; + } + + public String timelineBlueId() { + return timelineBlueId; + } + + public String actorBlueId() { + return actorBlueId; + } + + /** Identity of the complete immutable quartet, for persisted evidence. */ + public String profileIdentity() { + return profileIdentity; + } + + /** Returns whether these identities require provider-evidence admission. */ + public boolean custom() { + return custom; + } + + /** + * Validates every custom identity against exact canonical provider + * content. Published defaults retain their existing release binding. + */ + CoordinationSemanticTypeIdentities validatedAgainst( + NodeProvider provider) { + if (!custom) { + return this; + } + NodeProvider exactProvider = Objects.requireNonNull( + provider, "provider"); + requireExactCanonicalContent( + exactProvider, + timelineEntryBlueId, + "Timeline Entry"); + requireExactCanonicalContent( + exactProvider, + operationRequestBlueId, + "Operation Request"); + requireExactCanonicalContent( + exactProvider, + timelineBlueId, + "Timeline"); + requireExactCanonicalContent( + exactProvider, + actorBlueId, + "Actor"); + return this; + } + + private static void requireExactCanonicalContent( + NodeProvider provider, + String expectedBlueId, + String semanticName) { + NodeProviderResult result = provider.fetchResultByBlueId( + expectedBlueId); + if (result.outcome() != NodeProviderOutcome.FOUND) { + throw new IllegalArgumentException( + semanticName + " semantic identity " + expectedBlueId + + " has no exact canonical provider content: " + + result.outcome()); + } + List nodes = result.nodes(); + if (nodes.size() != 1) { + throw new IllegalArgumentException( + semanticName + " semantic identity " + expectedBlueId + + " requires exactly one canonical node, found " + + nodes.size()); + } + Node canonical = nodes.get(0).clone(); + if (canonical.getBlueId() != null) { + if (!expectedBlueId.equals(canonical.getBlueId())) { + throw new IllegalArgumentException( + semanticName + " provider content declares " + + canonical.getBlueId() + " instead of " + + expectedBlueId); + } + canonical.blueId(null); + } + String calculated; + try { + calculated = DirectBlueIdCalculator.calculateBlueId(canonical); + } catch (RuntimeException invalid) { + throw new IllegalArgumentException( + semanticName + " provider content is not canonical " + + "BlueId input for " + expectedBlueId, + invalid); + } + if (!expectedBlueId.equals(calculated)) { + throw new IllegalArgumentException( + semanticName + " provider content calculated to " + + calculated + " instead of " + expectedBlueId); + } + } + + private static String requireBlueId( + String blueId, + String label) { + String exact = Objects.requireNonNull(blueId, label).trim(); + if (exact.isEmpty() || BlueIds.hasCyclicMemberSeparator(exact)) { + throw new IllegalArgumentException( + label + " must be one non-cyclic exact BlueId"); + } + return exact; + } +} diff --git a/src/main/java/blue/coordination/processor/CurrentRepositoryMarkerProcessor.java b/src/main/java/blue/coordination/processor/CurrentRepositoryMarkerProcessor.java new file mode 100644 index 0000000..cb9e481 --- /dev/null +++ b/src/main/java/blue/coordination/processor/CurrentRepositoryMarkerProcessor.java @@ -0,0 +1,30 @@ +package blue.coordination.processor; + +import blue.language.processor.ContractProcessor; +import blue.language.processor.model.MarkerContract; + +import java.util.Objects; + +/** + * Registers one current generated Repository marker as understood metadata. + * + *

Marker contracts have no executable callback. They still require an + * exact runtime registration so the Contracts capability boundary can + * distinguish a supported current marker from an unknown must-understand + * contract.

+ */ +final class CurrentRepositoryMarkerProcessor + implements ContractProcessor { + + private final Class contractType; + + CurrentRepositoryMarkerProcessor(Class contractType) { + this.contractType = Objects.requireNonNull( + contractType, "contractType"); + } + + @Override + public Class contractType() { + return contractType; + } +} diff --git a/src/main/java/blue/coordination/processor/HandlerChannelResolver.java b/src/main/java/blue/coordination/processor/HandlerChannelResolver.java new file mode 100644 index 0000000..6d43a53 --- /dev/null +++ b/src/main/java/blue/coordination/processor/HandlerChannelResolver.java @@ -0,0 +1,66 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.HandlerRegistrationContext; +import blue.language.identity.DirectBlueIdCalculator; + +/** + * Resolves an immutable Handler channel header without opening an executable + * body. + */ +final class HandlerChannelResolver { + private static final String CHANNEL = "channel"; + + private HandlerChannelResolver() { + } + + static String resolve( + String convertedChannel, + HandlerRegistrationContext context) { + String declared = nonBlank(convertedChannel); + if (declared != null) { + return declared; + } + + Node header = context.contractNode( + context.handlerKey()); + Node channel = header != null + && header.getProperties() != null + ? header.getProperties().get(CHANNEL) + : null; + if (channel == null) { + return null; + } + Object raw = channel.getRawValue(); + if (raw instanceof String) { + return nonBlank((String) raw); + } + if (!channel.isReferenceOnly()) { + return null; + } + + /* + * Canonical direct-node fragments may leave a scalar header as its + * exact BlueId. The same-scope catalog is already immutable, so match + * that identity against its raw channel keys without fetching any + * executable body or inventing provider evidence. + */ + for (String candidate : context.contractKeys()) { + if (channel.getBlueId().equals( + DirectBlueIdCalculator.calculateBlueId( + new Node().value(candidate)))) { + return candidate; + } + } + return null; + } + + private static String nonBlank(String value) { + if (value == null) { + return null; + } + return value.trim().isEmpty() + ? null + : value; + } +} diff --git a/src/main/java/blue/coordination/processor/OperationProcessor.java b/src/main/java/blue/coordination/processor/OperationProcessor.java index 3a9b709..0ca1313 100644 --- a/src/main/java/blue/coordination/processor/OperationProcessor.java +++ b/src/main/java/blue/coordination/processor/OperationProcessor.java @@ -6,6 +6,12 @@ import blue.language.processor.ProcessorExecutionContext; import blue.repo.coordination.Operation; +/** + * Registers the abstract Operation contract shape without making it directly + * executable. + * + *

Concrete operation subtypes supply matching and execution semantics.

+ */ public final class OperationProcessor implements HandlerProcessor { @Override public Class contractType() { @@ -14,7 +20,11 @@ public Class contractType() { @Override public String deriveChannel(Operation contract, HandlerRegistrationContext context) { - return contract != null ? contract.getChannel() : null; + return HandlerChannelResolver.resolve( + contract != null + ? contract.getChannel() + : null, + context); } @Override diff --git a/src/main/java/blue/coordination/processor/OperationRequestMatcher.java b/src/main/java/blue/coordination/processor/OperationRequestMatcher.java index 3c3be3a..40526aa 100644 --- a/src/main/java/blue/coordination/processor/OperationRequestMatcher.java +++ b/src/main/java/blue/coordination/processor/OperationRequestMatcher.java @@ -1,49 +1,78 @@ package blue.coordination.processor; import blue.language.model.Node; +import blue.language.processor.GasChargeContext; import blue.language.processor.HandlerMatchContext; import blue.repo.coordination.SequentialWorkflowOperation; +/** + * Matches one Sequential Workflow Operation against a direct or + * Timeline-wrapped Operation Request. + * + *

The operation key and selected channel are immutable dispatch headers. + * An authored {@code request} is an additional payload pattern; an empty Node + * intentionally means that no payload constraint was declared. All provider + * evidence and event matching remain owned by the supplied Contracts + * context.

+ */ final class OperationRequestMatcher { + private final CoordinationSemanticTypeIdentities identities; + + OperationRequestMatcher() { + this(CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + OperationRequestMatcher( + CoordinationSemanticTypeIdentities identities) { + this.identities = java.util.Objects.requireNonNull( + identities, "identities"); + } boolean matches(SequentialWorkflowOperation contract, HandlerMatchContext context) { if (contract == null || context == null) { return false; } - if (!SequentialWorkflowEventMatcher.matches(contract.getEvent(), context)) { - return false; - } - CoordinationEventNodes.OperationRequestView request = - CoordinationEventNodes.operationRequest(context.event()); - if (request == null || !request.routable()) { + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "operationCandidateTested", + 1L, + GasChargeContext.of( + context.scopePath(), + context.handlerKey(), + null, + "test Operation candidate")); + boolean eventMatches = + SequentialWorkflowEventMatcher.matches( + contract.getEvent(), context); + if (!eventMatches) { return false; } String operationKey = nonBlank(contract.getKey()); - if (operationKey == null || !operationKey.equals(request.operation())) { - return false; - } - if (!request.channel().equals(context.channelKey())) { - return false; - } - return requestMatches(contract.getRequest(), request, context); - } - - private boolean requestMatches(Node requestPattern, - CoordinationEventNodes.OperationRequestView request, - HandlerMatchContext context) { - if (requestPattern == null) { - return true; - } - if (isEmptyRequestPattern(requestPattern)) { - return true; - } - if (request.request() == null) { + String channelKey = nonBlank(context.channelKey()); + if (operationKey == null || channelKey == null) { return false; } - return context.matchesEventPattern(request.patternFor(requestPattern)); + Node requestPattern = contract.getRequest(); + boolean requestMatches = + CoordinationEventNodes.matchesOperationRequest( + context.occurrenceEvent(), + operationKey, + channelKey, + requestPattern == null + || isEmptyRequestPattern(requestPattern) + ? null + : requestPattern, + context, + identities); + return requestMatches; } private boolean isEmptyRequestPattern(Node requestPattern) { + /* + * Repository resolution contributes descriptive metadata from + * Operation.request even when the document authored request: {}. + * Name and description are documentation, not payload constraints. + */ return requestPattern.getType() == null && requestPattern.getItemType() == null && requestPattern.getKeyType() == null @@ -51,8 +80,13 @@ private boolean isEmptyRequestPattern(Node requestPattern) { && requestPattern.getValue() == null && requestPattern.getItems() == null && (requestPattern.getProperties() == null || requestPattern.getProperties().isEmpty()) + && requestPattern.getContracts() == null && requestPattern.getBlueId() == null - && requestPattern.getSchema() == null; + && requestPattern.getSchema() == null + && requestPattern.getMergePolicy() == null + && requestPattern.getPreviousBlueId() == null + && requestPattern.getPosition() == null + && requestPattern.getBlue() == null; } private static String nonBlank(String value) { diff --git a/src/main/java/blue/coordination/processor/OperationRequestRoutingFunctions.java b/src/main/java/blue/coordination/processor/OperationRequestRoutingFunctions.java new file mode 100644 index 0000000..be39a0e --- /dev/null +++ b/src/main/java/blue/coordination/processor/OperationRequestRoutingFunctions.java @@ -0,0 +1,169 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ChannelLookupResult; +import blue.language.processor.ChannelMemberSnapshot; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.GasChargeContext; +import blue.language.processor.model.ChannelContract; +import blue.language.identity.DirectBlueIdCalculator; + +/** + * Shared immutable routing projection for Coordination Operation Requests. + */ +final class OperationRequestRoutingFunctions { + private static final String LOGICAL_DELIVERY_PREFIX = + "blue.coordination/1.0/operation-request:"; + + private OperationRequestRoutingFunctions() { + } + + static void declareTargetChannelCatalog( + ExternalChannelFunctionContext context) { + context.dependOnSameScopeChannelCatalog(); + } + + static String handlerChannelKey( + ChannelContract immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return handlerChannelKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static String handlerChannelKey( + ChannelContract immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + Route route = route( + exactPayload, + context, + true, + identities); + return route != null + ? route.channel + : context.channelKey(); + } + + static Node payload( + Node exactEvent, + ExternalChannelFunctionContext context) { + return payload( + exactEvent, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static Node payload( + Node exactEvent, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + return CoordinationEventNodes + .operationRequestRoutingPayload( + exactEvent, context, identities); + } + + static String logicalDeliveryKey( + ChannelContract immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return logicalDeliveryKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static String logicalDeliveryKey( + ChannelContract immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + Route route = route( + exactPayload, + context, + false, + identities); + if (route == null) { + return context.channelKey(); + } + Node identity = new Node() + .properties( + "operation", + new Node().value( + route.operation)) + .properties( + "channel", + new Node().value( + route.channel)); + return LOGICAL_DELIVERY_PREFIX + + DirectBlueIdCalculator.calculateBlueId(identity); + } + + private static Route route( + Node exactPayload, + ExternalChannelFunctionContext context, + boolean chargeTargetLookup, + CoordinationSemanticTypeIdentities identities) { + CoordinationEventNodes.OperationRequestView request = + CoordinationEventNodes + .operationRequestFromRoutingPayload( + exactPayload, + context, + identities); + if (request == null + || !request.routable()) { + return null; + } + if (chargeTargetLookup) { + /* + * Language invokes handler routing before logical-delivery + * routing. Both functions validate the same immutable declared + * catalog result; the handler function owns the single semantic + * target-lookup charge for that accepted source. + */ + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "operationTargetLookup", + 1L, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + "lookup Operation Request target Channel")); + } + ChannelLookupResult lookup = + context.lookupChannel( + request.channel()); + if (!lookup.isChannel()) { + return null; + } + ChannelMemberSnapshot target = + lookup.channel().get(); + return new Route( + request.operation(), + target.channelKey()); + } + + private static final class Route { + private final String operation; + private final String channel; + + private Route( + String operation, + String channel) { + this.operation = operation; + this.channel = channel; + } + } +} diff --git a/src/main/java/blue/coordination/processor/RepositoryTypeAliasPreprocessor.java b/src/main/java/blue/coordination/processor/RepositoryTypeAliasPreprocessor.java deleted file mode 100644 index 1c5fb45..0000000 --- a/src/main/java/blue/coordination/processor/RepositoryTypeAliasPreprocessor.java +++ /dev/null @@ -1,89 +0,0 @@ -package blue.coordination.processor; - -import blue.language.model.Node; -import blue.repo.BlueRepository; - -import java.util.LinkedHashMap; -import java.util.Map; - -public final class RepositoryTypeAliasPreprocessor { - private final Map aliases; - - public RepositoryTypeAliasPreprocessor() { - this(BlueRepository.latest()); - } - - public RepositoryTypeAliasPreprocessor(BlueRepository repository) { - this(repository != null ? repository.typeAliases() : null); - } - - public RepositoryTypeAliasPreprocessor(Map aliases) { - this.aliases = aliases != null - ? new LinkedHashMap(aliases) - : new LinkedHashMap(); - } - - public Node preprocess(Node node) { - if (node == null) { - return null; - } - Node copy = node.clone(); - resolve(copy); - return copy; - } - - private void resolve(Node node) { - if (node == null) { - return; - } - String blueId = aliasFor(node.getBlueId()); - if (blueId != null) { - node.blueId(blueId); - } - - node.type(resolveTypeNode(node.getType())); - node.itemType(resolveTypeNode(node.getItemType())); - node.keyType(resolveTypeNode(node.getKeyType())); - node.valueType(resolveTypeNode(node.getValueType())); - - if (node.getItems() != null) { - for (Node item : node.getItems()) { - resolve(item); - } - } - if (node.getProperties() != null) { - for (Node value : node.getProperties().values()) { - resolve(value); - } - } - resolve(node.getContracts()); - resolve(node.getBlue()); - } - - private Node resolveTypeNode(Node typeNode) { - if (typeNode == null) { - return null; - } - String blueId = aliasFor(inlineText(typeNode)); - if (blueId != null) { - return new Node().blueId(blueId); - } - resolve(typeNode); - return typeNode; - } - - private String inlineText(Node node) { - if (node == null || !node.isInlineValue() || node.getValue() == null) { - return null; - } - return String.valueOf(node.getValue()); - } - - private String aliasFor(String value) { - if (value == null) { - return null; - } - return aliases.get(value); - } - -} diff --git a/src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java b/src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java index faa788b..e827302 100644 --- a/src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java +++ b/src/main/java/blue/coordination/processor/SequentialWorkflowEventMatcher.java @@ -10,11 +10,13 @@ private SequentialWorkflowEventMatcher() { } static boolean matches(Node pattern, HandlerMatchContext context) { - if (pattern == null) { + if (pattern == null + || isEmptyPattern(pattern)) { return true; } Node expectedType = pattern.getType(); - FrozenNode event = context.eventFrozen(); + FrozenNode event = + context.occurrenceEventFrozen(); if (expectedType != null && expectedType.getBlueId() != null && event != null @@ -25,4 +27,22 @@ static boolean matches(Node pattern, HandlerMatchContext context) { } return context.matchesEventPattern(pattern); } + + private static boolean isEmptyPattern(Node pattern) { + return pattern.getType() == null + && pattern.getItemType() == null + && pattern.getKeyType() == null + && pattern.getValueType() == null + && pattern.getValue() == null + && pattern.getItems() == null + && (pattern.getProperties() == null + || pattern.getProperties().isEmpty()) + && pattern.getContracts() == null + && pattern.getBlueId() == null + && pattern.getSchema() == null + && pattern.getMergePolicy() == null + && pattern.getPreviousBlueId() == null + && pattern.getPosition() == null + && pattern.getBlue() == null; + } } diff --git a/src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java b/src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java index 45739d0..5c5f7c4 100644 --- a/src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java +++ b/src/main/java/blue/coordination/processor/SequentialWorkflowOperationProcessor.java @@ -7,20 +7,35 @@ import blue.language.processor.ProcessorExecutionContext; import blue.repo.coordination.SequentialWorkflow; import blue.repo.coordination.SequentialWorkflowOperation; +import java.util.Collections; +import java.util.List; +/** + * Executes a Sequential Workflow Operation selected through Operation Request + * source-to-target routing. + */ public final class SequentialWorkflowOperationProcessor implements HandlerProcessor { private final SequentialWorkflowRunner runner; - private final OperationRequestMatcher matcher = new OperationRequestMatcher(); + private final OperationRequestMatcher matcher; public SequentialWorkflowOperationProcessor() { - this(new SequentialWorkflowRunner()); + this(new SequentialWorkflowRunner(), + CoordinationSemanticTypeIdentities.publishedDefaults()); } public SequentialWorkflowOperationProcessor(SequentialWorkflowRunner runner) { + this(runner, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + public SequentialWorkflowOperationProcessor( + SequentialWorkflowRunner runner, + CoordinationSemanticTypeIdentities identities) { if (runner == null) { throw new IllegalArgumentException("runner must not be null"); } this.runner = runner; + this.matcher = new OperationRequestMatcher(identities); } @Override @@ -28,9 +43,18 @@ public Class contractType() { return SequentialWorkflowOperation.class; } + @Override + public List executableBodyFields() { + return Collections.singletonList("steps"); + } + @Override public String deriveChannel(SequentialWorkflowOperation contract, HandlerRegistrationContext context) { - String channel = trimToNull(contract.getChannel()); + String channel = HandlerChannelResolver.resolve( + contract != null + ? contract.getChannel() + : null, + context); if (channel != null && !context.hasContract(channel)) { throw new IllegalStateException("Sequential workflow operation '" + context.handlerKey() + "' references unknown channel '" + channel + "'"); @@ -48,11 +72,4 @@ public void execute(SequentialWorkflowOperation contract, ProcessorExecutionCont runner.execute(new SequentialWorkflow().steps(contract.getSteps()), context); } - private static String trimToNull(String value) { - if (value == null) { - return null; - } - String trimmed = value.trim(); - return trimmed.isEmpty() ? null : trimmed; - } } diff --git a/src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java b/src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java index 3033ffe..141807a 100644 --- a/src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java +++ b/src/main/java/blue/coordination/processor/SequentialWorkflowProcessor.java @@ -6,19 +6,36 @@ import blue.language.processor.HandlerRegistrationContext; import blue.language.processor.ProcessorExecutionContext; import blue.repo.coordination.SequentialWorkflow; +import java.util.Collections; +import java.util.List; +/** + * Executes a fixed Sequential Workflow handler against the current immutable + * contract snapshot and shared processing invocation. + */ public final class SequentialWorkflowProcessor implements HandlerProcessor { private final SequentialWorkflowRunner runner; + private final CoordinationSemanticTypeIdentities identities; public SequentialWorkflowProcessor() { - this(new SequentialWorkflowRunner()); + this(new SequentialWorkflowRunner(), + CoordinationSemanticTypeIdentities.publishedDefaults()); } public SequentialWorkflowProcessor(SequentialWorkflowRunner runner) { + this(runner, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + public SequentialWorkflowProcessor( + SequentialWorkflowRunner runner, + CoordinationSemanticTypeIdentities identities) { if (runner == null) { throw new IllegalArgumentException("runner must not be null"); } this.runner = runner; + this.identities = java.util.Objects.requireNonNull( + identities, "identities"); } @Override @@ -26,14 +43,30 @@ public Class contractType() { return SequentialWorkflow.class; } + @Override + public List executableBodyFields() { + return Collections.singletonList("steps"); + } + @Override public String deriveChannel(SequentialWorkflow contract, HandlerRegistrationContext context) { - return contract != null ? contract.getChannel() : null; + return HandlerChannelResolver.resolve( + contract != null + ? contract.getChannel() + : null, + context); } @Override public boolean matches(SequentialWorkflow contract, HandlerMatchContext context) { - return SequentialWorkflowEventMatcher.matches(contract.getEvent(), context); + return !CoordinationEventNodes + .isRoutableOperationRequestForChannel( + context.occurrenceEvent(), + context.channelKey(), + context, + identities) + && SequentialWorkflowEventMatcher.matches( + contract.getEvent(), context); } @Override diff --git a/src/main/java/blue/coordination/processor/TimelineChannelProcessor.java b/src/main/java/blue/coordination/processor/TimelineChannelProcessor.java index 0418ecf..19e8985 100644 --- a/src/main/java/blue/coordination/processor/TimelineChannelProcessor.java +++ b/src/main/java/blue/coordination/processor/TimelineChannelProcessor.java @@ -4,17 +4,51 @@ import blue.language.processor.ChannelEvaluation; import blue.language.processor.ChannelEvaluationContext; import blue.language.processor.ChannelProcessor; +import blue.language.processor.ExternalChannelSubscriptionFunctions; import blue.repo.coordination.TimelineChannel; +/** + * Implements fixed-repository Timeline Channel subscription, acceptance, and + * per-source checkpoint semantics. + */ public final class TimelineChannelProcessor implements ChannelProcessor { + private final CoordinationSemanticTypeIdentities identities; + private final TimelineExternalSubscriptionFunctions + subscriptionFunctions; + + /** Creates the published Coordination 1.0 Timeline processor. */ + public TimelineChannelProcessor() { + this(CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + /** Creates one processor bound to an already validated identity profile. */ + public TimelineChannelProcessor( + CoordinationSemanticTypeIdentities identities) { + this.identities = java.util.Objects.requireNonNull( + identities, "identities"); + this.subscriptionFunctions = + TimelineExternalSubscriptionFunctions.with(identities); + } + + CoordinationSemanticTypeIdentities semanticTypeIdentities() { + return identities; + } + @Override public Class contractType() { return TimelineChannel.class; } + @Override + public ExternalChannelSubscriptionFunctions + externalSubscriptionFunctions() { + return subscriptionFunctions; + } + @Override public ChannelEvaluation evaluate(TimelineChannel contract, ChannelEvaluationContext context) { - return TimelineProviderSupport.evaluateTimelineEntry(contract, context); + return TimelineProviderSupport.evaluateTimelineEntry( + contract, context, identities); } @Override @@ -23,7 +57,11 @@ public String eventId(TimelineChannel contract, ChannelEvaluationContext context } @Override - public boolean isNewerEvent(TimelineChannel contract, ChannelCheckpointContext context) { - return TimelineProviderSupport.isNewerOrSameTimelineEvent(context); + public boolean isNewerEvent(TimelineChannel contract, + ChannelCheckpointContext context) { + return TimelineProviderSupport.isNewerTimelineSubject( + context, + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION); } } diff --git a/src/main/java/blue/coordination/processor/TimelineChannelSubtypeProcessor.java b/src/main/java/blue/coordination/processor/TimelineChannelSubtypeProcessor.java new file mode 100644 index 0000000..5821700 --- /dev/null +++ b/src/main/java/blue/coordination/processor/TimelineChannelSubtypeProcessor.java @@ -0,0 +1,93 @@ +package blue.coordination.processor; + +import blue.language.processor.ChannelCheckpointContext; +import blue.language.processor.ChannelEvaluation; +import blue.language.processor.ChannelEvaluationContext; +import blue.language.processor.ChannelProcessor; +import blue.language.processor.ExternalChannelSubscriptionFunctions; +import blue.repo.coordination.TimelineChannel; + +import java.util.Objects; + +/** + * Generic runtime adapter that gives one explicitly registered + * {@link TimelineChannel} subtype the standard Timeline semantics. + * + *

The Java class selects only the object model used for exact runtime + * dispatch. Language still verifies the subtype's Blue type evidence and + * performs semantic subtype matching. Constructing this adapter therefore + * never creates an identity alias or turns Java inheritance into Blue type + * evidence.

+ * + * @param exact generated or host-provided Timeline Channel subtype + */ +final class TimelineChannelSubtypeProcessor< + T extends TimelineChannel> + implements ChannelProcessor { + private final Class contractType; + + /** + * Creates Timeline semantics for one exact subtype registration. + * + * @param contractType exact subtype model class + */ + TimelineChannelSubtypeProcessor( + Class contractType) { + this.contractType = + Objects.requireNonNull( + contractType, "contractType"); + if (!TimelineChannel.class + .isAssignableFrom( + contractType)) { + throw new IllegalArgumentException( + "contractType must be a Timeline Channel " + + "subtype"); + } + if (TimelineChannel.class.equals( + contractType)) { + throw new IllegalArgumentException( + "Use TimelineChannelProcessor for the base " + + "Timeline Channel type"); + } + } + + @Override + public Class contractType() { + return contractType; + } + + @Override + public ExternalChannelSubscriptionFunctions + externalSubscriptionFunctions() { + return TimelineExternalSubscriptionFunctions + .forSubtype(); + } + + @Override + public ChannelEvaluation evaluate( + T contract, + ChannelEvaluationContext context) { + return TimelineProviderSupport + .evaluateTimelineEntry( + contract, context); + } + + @Override + public String eventId( + T contract, + ChannelEvaluationContext context) { + return TimelineProviderSupport.eventId( + context.event()); + } + + @Override + public boolean isNewerEvent( + T contract, + ChannelCheckpointContext context) { + return TimelineProviderSupport + .isNewerTimelineSubject( + context, + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION); + } +} diff --git a/src/main/java/blue/coordination/processor/TimelineExternalSubscriptionFunctions.java b/src/main/java/blue/coordination/processor/TimelineExternalSubscriptionFunctions.java new file mode 100644 index 0000000..359cda1 --- /dev/null +++ b/src/main/java/blue/coordination/processor/TimelineExternalSubscriptionFunctions.java @@ -0,0 +1,267 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.ExternalChannelSubscriptionFunctions; +import blue.language.processor.GasChargeContext; +import blue.repo.coordination.TimelineChannel; + +import java.util.List; + +/** + * Immutable Contracts 1.0 subscription functions for a Timeline Channel. + * + *

The explicit Timeline Entry key is a conservative finite preselection + * key. Complete immutable Timeline and Actor matching is authoritative and + * uses the processor-owned verified pattern matcher so inline and pure + * reference representations are equivalent.

+ */ +final class TimelineExternalSubscriptionFunctions + implements ExternalChannelSubscriptionFunctions { + + static final TimelineExternalSubscriptionFunctions + INSTANCE = + new TimelineExternalSubscriptionFunctions( + CoordinationSemanticTypeIdentities.publishedDefaults()); + + static final String TIMELINE_ENTRY_KEY = + TimelineSubscriptionProjection.BROAD_KEY; + static final String TIMELINE_ORDER_SUBJECT_VERSION = + "blue.coordination/1.0/timeline-order-subject-v3"; + + private final CoordinationSemanticTypeIdentities identities; + + private TimelineExternalSubscriptionFunctions( + CoordinationSemanticTypeIdentities identities) { + this.identities = java.util.Objects.requireNonNull( + identities, "identities"); + } + + static TimelineExternalSubscriptionFunctions with( + CoordinationSemanticTypeIdentities identities) { + if (identities == CoordinationSemanticTypeIdentities + .publishedDefaults()) { + return INSTANCE; + } + return new TimelineExternalSubscriptionFunctions( + identities); + } + + @SuppressWarnings("unchecked") + static + TimelineExternalSubscriptionFunctions forSubtype() { + return (TimelineExternalSubscriptionFunctions) + (TimelineExternalSubscriptionFunctions) + INSTANCE; + } + + @Override + public List channelKeys(T immutableContractSnapshot) { + /* + * Context-free, out-of-band callers have no verified header + * materializer. Keep that surface sound; PROCESS always uses the + * context-aware selective projection below. + */ + TimelineSubscriptionProjection.channelKeys( + immutableContractSnapshot, + identities); + return java.util.Collections.singletonList( + TimelineSubscriptionProjection.BROAD_KEY); + } + + @Override + public List channelKeys( + T immutableContractSnapshot, + ExternalChannelFunctionContext context) { + return TimelineSubscriptionProjection.channelKeys( + immutableContractSnapshot, + identities); + } + + @Override + public List eventKeys(Node exactEvent) { + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntry( + exactEvent, identities); + if (entry == null) { + return java.util.Collections.emptyList(); + } + /* + * The context-free surface cannot safely materialize header + * references. Keep it sound with the bounded broad key; the processor + * path below supplies the selective verified projection. + */ + return java.util.Collections.singletonList( + TimelineSubscriptionProjection.BROAD_KEY); + } + + @Override + public List eventKeys( + Node exactEvent, + ExternalChannelFunctionContext context) { + return TimelineSubscriptionProjection.eventKeys( + exactEvent, + context, + identities); + } + + @Override + public boolean accepts(T immutableContractSnapshot, + Node exactEvent) { + if (CoordinationEventNodes.timelineEntry( + exactEvent, identities) + == null) { + return false; + } + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntry( + exactEvent, identities); + return TimelineProviderSupport.matchesTimelineAndActor( + immutableContractSnapshot, entry, identities); + } + + @Override + public boolean accepts( + T immutableContractSnapshot, + Node exactEvent, + ExternalChannelFunctionContext context) { + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntry( + exactEvent, context, identities); + if (immutableContractSnapshot == null + || entry == null) { + return false; + } + chargeBindingComparison( + context, + "compare Timeline binding"); + boolean timelineMatches = + CoordinationEventNodes.matchesGeneratedBinding( + entry.timeline(), + immutableContractSnapshot.getTimeline(), + context, + identities); + if (!timelineMatches) { + return false; + } + chargeBindingComparison( + context, + "compare Actor binding"); + return CoordinationEventNodes.matchesGeneratedBinding( + entry.actor(), + immutableContractSnapshot.getActor(), + context, + identities); + } + + @Override + public Node payload( + T immutableContractSnapshot, + Node exactEvent, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .payload(exactEvent, context, identities); + } + + @Override + public Node checkpointSubject(T immutableContractSnapshot, + Node exactEvent, + Node exactPayload) { + if (!accepts( + immutableContractSnapshot, + exactEvent)) { + throw new IllegalArgumentException( + "Timeline checkpoint subject requires an accepted " + + "Timeline Entry"); + } + return TimelineProviderSupport.timelineOrderSubject( + CoordinationEventNodes.timelineEntry( + exactEvent, identities)); + } + + @Override + public Node checkpointSubject( + T immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntryHeader( + exactEvent, context, identities); + if (entry == null) { + throw new IllegalArgumentException( + "Timeline checkpoint subject requires an accepted " + + "Timeline Entry"); + } + return TimelineProviderSupport.timelineOrderSubject(entry); + } + + @Override + public String handlerChannelKey( + T immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .handlerChannelKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + identities); + } + + @Override + public String logicalDeliveryKey( + T immutableContractSnapshot, + Node exactEvent, + Node exactPayload, + ExternalChannelFunctionContext context) { + return OperationRequestRoutingFunctions + .logicalDeliveryKey( + immutableContractSnapshot, + exactEvent, + exactPayload, + context, + identities); + } + + @Override + public String checkpointDomainDiscriminator( + T immutableContractSnapshot) { + channelKeys(immutableContractSnapshot); + return "coordination.timeline-entry:" + + identities.timelineEntryBlueId() + + "|semantic-profile=" + + identities.profileIdentity() + + "|projection=" + + TimelineSubscriptionProjection.VERSION + + "|subject=" + + TIMELINE_ORDER_SUBJECT_VERSION; + } + + @Override + public String checkpointDomainDiscriminator( + T immutableContractSnapshot, + ExternalChannelFunctionContext context) { + OperationRequestRoutingFunctions + .declareTargetChannelCatalog( + context); + return checkpointDomainDiscriminator( + immutableContractSnapshot); + } + + private static void chargeBindingComparison( + ExternalChannelFunctionContext context, + String reason) { + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "timelineBindingCompared", + 1L, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + reason)); + } +} diff --git a/src/main/java/blue/coordination/processor/TimelineMemberSubscriptions.java b/src/main/java/blue/coordination/processor/TimelineMemberSubscriptions.java new file mode 100644 index 0000000..2b52e1b --- /dev/null +++ b/src/main/java/blue/coordination/processor/TimelineMemberSubscriptions.java @@ -0,0 +1,163 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.ExternalChannelMemberEvaluation; +import blue.language.processor.ExternalChannelMemberSnapshot; +import blue.repo.coordination.CompositeTimelineChannel; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** + * Shared, bounded member-catalog operations for Composite and All Timelines + * subscription functions. + * + *

This helper works only with immutable Language snapshots. It never opens + * executable handler bodies and preserves the catalog's canonical member + * order when selecting one logical winner.

+ */ +final class TimelineMemberSubscriptions { + private TimelineMemberSubscriptions() { + } + + static List shallowCompositeMembers( + CompositeTimelineChannel contract, + ExternalChannelFunctionContext context, + String timelineChannelTypeBlueId) { + if (contract == null + || contract.getChannels() == null + || contract.getChannels().isEmpty()) { + throw new IllegalArgumentException( + "Composite Timeline Channel requires at least one member"); + } + Set uniqueKeys = new LinkedHashSet(); + for (String key : contract.getChannels()) { + if (key == null || key.isEmpty()) { + throw new IllegalArgumentException( + "Composite Timeline Channel member key must be " + + "non-empty Text"); + } + if (!uniqueKeys.add(key)) { + continue; + } + if (uniqueKeys.size() + > CoordinationRuntimeLimits + .MAX_COMPOSITE_MEMBERS) { + throw new IllegalArgumentException( + "Composite Timeline Channel exceeds " + + "maxCompositeMembers=" + + CoordinationRuntimeLimits + .MAX_COMPOSITE_MEMBERS); + } + } + + /* + * The assignable selector is deliberately shallow. Unlike + * context.member(key), it does not resolve a selected member's + * subscription header. Filtering these immutable identity headers + * keeps the catalog work at Language's generic boundary; the caller's + * compositeMemberVisited charge therefore precedes channelKeys(), + * checkpointDomainBlueId(), or evaluate(), whichever first resolves + * the selected peer. + */ + Set unresolvedKeys = + new LinkedHashSet(uniqueKeys); + List members = + new ArrayList(); + for (ExternalChannelMemberSnapshot candidate + : context.membersAssignableToType( + timelineChannelTypeBlueId)) { + if (unresolvedKeys.remove( + candidate.channelKey())) { + /* + * Language guarantees this selector's canonical member + * order, so filtering preserves the prior + * (order, key, effectiveTypeBlueId) winner order without + * touching a lazy peer header. + */ + members.add(candidate); + } + } + if (!unresolvedKeys.isEmpty()) { + String key = unresolvedKeys.iterator().next(); + throw new IllegalArgumentException( + "Composite Timeline Channel member '" + key + + "' must have Timeline Channel " + + "runtime semantics"); + } + return Collections.unmodifiableList(members); + } + + static List shallowAllTimelineMembers( + ExternalChannelFunctionContext context, + String timelineChannelTypeBlueId) { + /* + * This generic subtype-family query is Language-owned catalog work + * and returns identity-only snapshots. No selected Timeline peer is + * resolved until a caller accesses a derived header or evaluate(). + */ + List members = + context.membersAssignableToType( + timelineChannelTypeBlueId); + if (members.size() + > CoordinationRuntimeLimits + .MAX_ALL_TIMELINES_MEMBERS) { + throw new IllegalArgumentException( + "All Timelines Channel exceeds " + + "maxAllTimelinesMembers=" + + CoordinationRuntimeLimits + .MAX_ALL_TIMELINES_MEMBERS); + } + return members; + } + + static List unionChannelKeys( + List members) { + Set keys = new LinkedHashSet(); + for (ExternalChannelMemberSnapshot member : members) { + keys.addAll(member.channelKeys()); + } + return Collections.unmodifiableList( + new ArrayList(keys)); + } + + static WinningMember winning( + List members, + Node exactEvent, + Runnable beforeMemberVisit) { + for (ExternalChannelMemberSnapshot member : members) { + beforeMemberVisit.run(); + ExternalChannelMemberEvaluation evaluation = + member.evaluate(exactEvent); + if (evaluation.accepts()) { + return new WinningMember(member, evaluation); + } + } + return null; + } + + static final class WinningMember { + private final ExternalChannelMemberSnapshot member; + private final ExternalChannelMemberEvaluation evaluation; + + private WinningMember( + ExternalChannelMemberSnapshot member, + ExternalChannelMemberEvaluation evaluation) { + this.member = member; + this.evaluation = evaluation; + } + + ExternalChannelMemberSnapshot member() { + return member; + } + + ExternalChannelMemberEvaluation evaluation() { + return evaluation; + } + } + +} diff --git a/src/main/java/blue/coordination/processor/TimelineProviderSupport.java b/src/main/java/blue/coordination/processor/TimelineProviderSupport.java index 83df9b2..ac08cc5 100644 --- a/src/main/java/blue/coordination/processor/TimelineProviderSupport.java +++ b/src/main/java/blue/coordination/processor/TimelineProviderSupport.java @@ -2,115 +2,438 @@ import blue.language.model.Node; import blue.language.processor.ChannelCheckpointContext; -import blue.language.processor.ChannelDelivery; import blue.language.processor.ChannelEvaluation; import blue.language.processor.ChannelEvaluationContext; -import blue.language.utils.BlueIdCalculator; -import blue.repo.coordination.OperationRequest; +import blue.language.processor.ExternalChannelMemberSnapshot; +import blue.repo.coordination.AllTimelinesChannel; +import blue.repo.coordination.CompositeTimelineChannel; import blue.repo.coordination.TimelineChannel; +import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.SortedSet; +import java.util.TreeSet; +/** + * Coordination-owned Timeline validation and checkpoint-subject helpers. + * + *

Cross-Timeline total ordering and completeness admission are supplied by + * the verified feeder boundary. This helper preserves that platform order and + * enforces only the fixed Repository rule that timestamps increase strictly + * within one exact Timeline.

+ */ public final class TimelineProviderSupport { private TimelineProviderSupport() { } + /** + * Returns the bounded exact preselection keys for the scalar Timeline and + * Actor envelope used by Coordination's in-memory provider adapter. + * + *

The returned set includes the exact pair, Timeline-only, Actor-only, + * and broad keys. The document-local frozen delivery-plan verifier remains + * authoritative for acceptance; these keys only prevent whole-document + * route scans.

+ */ + public static List exactScalarEventKeys( + String timelineId, + String actorId) { + return TimelineSubscriptionProjection.exactScalarEventKeys( + timelineId, + actorId, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + /** + * Returns every bounded feeder preselection key emitted by the registered + * Timeline channel family for one exact Timeline Entry header. + */ + public static List exactTimelineEntryEventKeys( + String timelineId, + String actorId) { + LinkedHashSet result = new LinkedHashSet<>( + exactScalarEventKeys(timelineId, actorId)); + result.add(AllTimelinesExternalSubscriptionFunctions + .ALL_TIMELINES_KEY); + return List.copyOf(result); + } + + /** + * Validates the immutable envelope accepted by the compact Timeline + * feeder. The check uses the registered Timeline Entry and Operation + * Request identities; it does not invent document-targeting semantics. + * + * @param exactEntry exact, direct-header Timeline Entry + * @throws IllegalArgumentException when the supported envelope is invalid + */ + public static void validateExactEnvelope(Node exactEntry) { + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntry(exactEntry); + CoordinationEventNodes.OperationRequestView request = + CoordinationEventNodes.operationRequest(exactEntry); + String timelineId = entry == null ? null + : textProperty(entry.timeline(), "timelineId"); + String actorId = entry == null ? null + : textProperty(entry.actor(), "accountId"); + if (entry == null || request == null || !request.routable() + || timelineId == null || timelineId.isBlank() + || actorId == null || actorId.isBlank() + || entry.timestamp().signum() <= 0 + || entry.timestamp().bitLength() > 63) { + throw new IllegalArgumentException( + "Invalid exact Timeline Entry envelope"); + } + Node message = entry.message(); + if (property(message, "request") == null) { + throw new IllegalArgumentException( + "Timeline Entry Operation Request has no request"); + } + Node exactVersion = property( + message, "requireExactDocumentVersion"); + Object exactVersionValue = exactVersion == null + ? null : exactVersion.getValue(); + if (exactVersionValue != null + && !(exactVersionValue instanceof Boolean)) { + throw new IllegalArgumentException( + "requireExactDocumentVersion must be Boolean"); + } + if (Boolean.TRUE.equals(exactVersionValue) + && !hasDocumentValue(property(message, "document"))) { + throw new IllegalArgumentException( + "Exact document version requires a document"); + } + if (hasRuntimeValue(property(exactEntry, "onBehalfOf"))) { + throw new IllegalArgumentException( + "onBehalfOf requires a Mandate resolver"); + } + } + + /** + * Recreates the exact current-runtime checkpoint discriminator retained by + * the host for one processor-owned external subscription occurrence. + */ + public static String checkpointDomainRuntimeDiscriminator( + String effectiveTypeBlueId) { + String typeBlueId = requireText( + effectiveTypeBlueId, "effectiveTypeBlueId"); + if (CompositeTimelineChannel.blueId().equals(typeBlueId)) { + return "coordination.composite-timeline:" + + "direct-timeline-members-v2" + + "|subject=" + + CompositeTimelineExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION; + } + if (AllTimelinesChannel.blueId().equals(typeBlueId)) { + return "coordination.all-timelines:" + + "timeline-type-family-v2" + + "|subject=" + + AllTimelinesExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION; + } + CoordinationSemanticTypeIdentities identities = + CoordinationSemanticTypeIdentities.publishedDefaults(); + return "coordination.timeline-entry:" + + identities.timelineEntryBlueId() + + "|semantic-profile=" + + identities.profileIdentity() + + "|projection=" + + TimelineSubscriptionProjection.VERSION + + "|subject=" + + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION; + } + public static ChannelEvaluation evaluateTimelineEntry(TimelineChannel contract, ChannelEvaluationContext context) { + return evaluateTimelineEntry( + contract, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static ChannelEvaluation evaluateTimelineEntry( + TimelineChannel contract, + ChannelEvaluationContext context, + CoordinationSemanticTypeIdentities identities) { Node eventNode = context.event(); - CoordinationEventNodes.TimelineEntryView entry = CoordinationEventNodes.timelineEntry(eventNode); + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntry( + eventNode, identities); if (entry == null) { return ChannelEvaluation.noMatch(); } - if (!matchesTimelineAndActor(contract, entry) || !matchesEventFilter(contract, eventNode)) { + if (!matchesTimelineAndActor( + contract, entry, identities)) { return ChannelEvaluation.noMatch(); } - return acceptedTimelineEntry(eventNode, context); - } - - private static ChannelEvaluation acceptedTimelineEntry(Node eventNode, - ChannelEvaluationContext context) { - CoordinationEventNodes.OperationRequestView request = - CoordinationEventNodes.operationRequest(eventNode); - if (request == null || !request.routable() || context.channel(request.channel()) == null) { - return ChannelEvaluation.match(eventNode); - } - ChannelDelivery delivery = ChannelDelivery.of(eventNode, - null, - null, - null, - request.channel(), - OperationRequest.blueId() + ":" + request.operation()); - return ChannelEvaluation.matchDeliveries(Collections.singletonList(delivery)); + return ChannelEvaluation.match(eventNode, eventId(eventNode)); } static boolean matchesTimelineAndActor(TimelineChannel contract, CoordinationEventNodes.TimelineEntryView entry) { + return matchesTimelineAndActor( + contract, + entry, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static boolean matchesTimelineAndActor( + TimelineChannel contract, + CoordinationEventNodes.TimelineEntryView entry, + CoordinationSemanticTypeIdentities identities) { return contract != null && entry != null && CoordinationEventNodes.matchesGeneratedBinding( - entry.timeline(), contract.getTimeline()) + entry.timeline(), contract.getTimeline(), identities) && CoordinationEventNodes.matchesGeneratedBinding( - entry.actor(), contract.getActor()); - } - - public static boolean matchesEventFilter(TimelineChannel contract, Node eventNode) { - Node definition = contract.getDefinition(); - return definition == null || CoordinationEventNodes.matchesPattern(eventNode, definition); - } - - static ChannelEvaluation preserveUnionDelivery(ChannelEvaluation childEvaluation, - Node fallbackEvent, - String metadataKey, - String sourceChannelKey) { - List childDeliveries = childEvaluation.deliveries(); - if (!childDeliveries.isEmpty()) { - List unionDeliveries = - new ArrayList(childDeliveries.size()); - for (ChannelDelivery childDelivery : childDeliveries) { - unionDeliveries.add(ChannelDelivery.of( - withSourceMetadata(childDelivery.event(), metadataKey, sourceChannelKey), - childDelivery.eventId(), - null, - childDelivery.shouldProcess(), - childDelivery.handlerChannelKey(), - childDelivery.logicalDeliveryKey())); - } - return ChannelEvaluation.matchDeliveries(unionDeliveries); - } + entry.actor(), contract.getActor(), identities); + } + + static ChannelEvaluation preserveUnionPayload(ChannelEvaluation childEvaluation, + Node fallbackEvent) { Node deliveryEvent = childEvaluation.event() != null ? childEvaluation.event() : fallbackEvent; return deliveryEvent != null - ? ChannelEvaluation.match( - withSourceMetadata(deliveryEvent, metadataKey, sourceChannelKey), - childEvaluation.eventId()) + ? ChannelEvaluation.match(deliveryEvent, childEvaluation.eventId()) : ChannelEvaluation.noMatch(); } public static String eventId(Node eventNode) { - return eventNode != null ? BlueIdCalculator.calculateBlueId(eventNode.clone().blue(null)) : null; + return eventNode != null + ? BlueSemanticIdentity.identity( + eventNode.clone().blue(null)) + : null; } - private static Node withSourceMetadata(Node event, - String metadataKey, - String sourceChannelKey) { - Node copy = event.clone(); - Node meta = property(copy, "meta"); - if (meta == null) { - meta = new Node(); - copy.properties("meta", meta); + /** + * Retains the pre-release context-free filter signature while applying the + * current exact Timeline acceptance predicate. + * + * @param contract exact Timeline Channel contract + * @param event exact event candidate + * @return whether the current Timeline acceptance predicate accepts it + */ + public static boolean matchesEventFilter( + TimelineChannel contract, + Node event) { + return contract != null + && event != null + && TimelineExternalSubscriptionFunctions.INSTANCE + .accepts(contract, event); + } + + /** + * Retains the pre-release signature and applies the current strict direct + * Timeline checkpoint-subject ordering. + * + * @param context exact checkpoint context + * @return whether the direct Timeline subject is strictly newer + */ + public static boolean isNewerOrSameTimelineEvent( + ChannelCheckpointContext context) { + return isNewerTimelineSubject( + context, + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION); + } + + /** + * Retains the pre-release signature. Cross-Timeline ordering now belongs + * to verified feeder evidence, so this method applies the same strict + * direct-subject rule without recreating legacy cross-source ordering. + * + * @param context exact checkpoint context + * @return whether the direct Timeline subject is strictly newer + */ + public static boolean isNewerOrDifferentTimelineEvent( + ChannelCheckpointContext context) { + return isNewerOrSameTimelineEvent(context); + } + + /** + * Validates one platform-ordered feeder window against exact active-source + * completeness evidence. + * + *

Every active Timeline is named by its exact BlueId. A window is ready + * only when each source proves {@code completeBefore > max(timestamp)}. + * Missing or insufficient evidence suspends the window; extra evidence or + * an entry from an undeclared source is inconsistent and fails closed. + * The input is already in the verified total order owned by the feeder and + * is preserved exactly. Coordination validates only that timestamps are + * strictly increasing within each individual Timeline; it neither defines + * nor reconstructs cross-Timeline ordering.

+ * + * @param exactTimelineEntries platform-ordered exact Timeline Entries + * @param exactActiveTimelines exact active Timeline identities + * @param completeBeforeByTimelineBlueId exclusive completeness frontier + * for each active Timeline BlueId + * @return ready window or a suspended window naming incomplete Timelines + */ + public static CompletenessWindow evaluateCompletenessWindow( + List exactTimelineEntries, + List exactActiveTimelines, + Map completeBeforeByTimelineBlueId) { + if (exactTimelineEntries == null + || exactActiveTimelines == null + || completeBeforeByTimelineBlueId == null) { + throw new IllegalArgumentException( + "Timeline completeness inputs must be present"); + } + SortedSet activeTimelineBlueIds = + new TreeSet(); + for (Node activeTimeline : exactActiveTimelines) { + String timelineBlueId = exactNodeBlueId( + activeTimeline, "active Timeline"); + if (!activeTimelineBlueIds.add(timelineBlueId)) { + throw new IllegalArgumentException( + "Duplicate active Timeline evidence: " + + timelineBlueId); + } + } + for (String evidencedTimeline + : completeBeforeByTimelineBlueId.keySet()) { + if (!activeTimelineBlueIds.contains(evidencedTimeline)) { + throw new IllegalArgumentException( + "Completeness evidence names an inactive Timeline: " + + evidencedTimeline); + } + } + + List entries = new ArrayList( + exactTimelineEntries.size()); + Map lastTimestampByTimeline = + new HashMap(); + BigInteger maximumTimestamp = null; + for (Node exactEntry : exactTimelineEntries) { + CoordinationEventNodes.TimelineEntryView entry = + requireTimelineEntry(exactEntry, "entry"); + String timelineBlueId = exactNodeBlueId( + entry.timeline(), "entry Timeline"); + if (!activeTimelineBlueIds.contains(timelineBlueId)) { + throw new IllegalArgumentException( + "Timeline Entry belongs to an inactive Timeline: " + + timelineBlueId); + } + BigInteger lastTimestamp = + lastTimestampByTimeline.get(timelineBlueId); + if (lastTimestamp != null + && entry.timestamp().compareTo( + lastTimestamp) <= 0) { + throw new IllegalArgumentException( + "Timeline Entry timestamps must be strictly " + + "increasing within " + + "Timeline " + timelineBlueId + ": " + + entry.timestamp()); + } + lastTimestampByTimeline.put( + timelineBlueId, entry.timestamp()); + if (maximumTimestamp == null + || entry.timestamp().compareTo( + maximumTimestamp) > 0) { + maximumTimestamp = entry.timestamp(); + } + entries.add(exactEntry.clone()); + } + + List incomplete = + new ArrayList(); + if (maximumTimestamp != null) { + for (String timelineBlueId + : activeTimelineBlueIds) { + BigInteger completeBefore = + completeBeforeByTimelineBlueId.get( + timelineBlueId); + if (completeBefore == null + || completeBefore.compareTo( + maximumTimestamp) <= 0) { + incomplete.add(timelineBlueId); + } + } + } + if (!incomplete.isEmpty()) { + return CompletenessWindow.suspended( + maximumTimestamp, incomplete); } - meta.properties(metadataKey, new Node().value(sourceChannelKey)); - return copy; + return CompletenessWindow.ready( + maximumTimestamp, entries); } - public static boolean isNewerOrSameTimelineEvent(ChannelCheckpointContext context) { - return isNewerTimelineEvent(context, false); + /** + * Tests a provider append against an already binding completeness + * frontier. + * + *

The frontier is exclusive: an entry at the frontier is not + * backdated. Missing or mismatched binding evidence fails closed with an + * exception instead of being interpreted as semantic absence.

+ * + * @param exactTimelineEntry exact Timeline Entry proposed for append + * @param exactTimeline exact Timeline bound to the frontier + * @param completeBefore exclusive committed completeness frontier + * @return whether the entry timestamp is before the committed frontier + */ + public static boolean isBehindCommittedFrontier( + Node exactTimelineEntry, + Node exactTimeline, + BigInteger completeBefore) { + if (exactTimeline == null) { + throw new IllegalArgumentException( + "Binding completeness requires an exact Timeline"); + } + if (completeBefore == null) { + throw new IllegalArgumentException( + "Binding completeness requires an exact frontier"); + } + CoordinationEventNodes.TimelineEntryView entry = + requireTimelineEntry(exactTimelineEntry, "entry"); + String boundTimelineBlueId = exactNodeBlueId( + exactTimeline, "frontier Timeline"); + String entryTimelineBlueId = exactNodeBlueId( + entry.timeline(), "entry Timeline"); + if (!boundTimelineBlueId.equals(entryTimelineBlueId)) { + throw new IllegalArgumentException( + "Binding completeness frontier belongs to a different " + + "Timeline"); + } + return entry.timestamp().compareTo(completeBefore) < 0; } - public static boolean isNewerOrDifferentTimelineEvent(ChannelCheckpointContext context) { - return isNewerTimelineEvent(context, true); + /** + * Verifies one exact predecessor edge and strictly increasing + * same-Timeline timestamp order. + * + * @param exactTimelineEntry exact successor Timeline Entry + * @param exactPredecessor exact proposed predecessor Timeline Entry + * @return whether the successor names the predecessor and has a later + * timestamp on the same Timeline + */ + public static boolean followsExactPredecessor( + Node exactTimelineEntry, + Node exactPredecessor) { + CoordinationEventNodes.TimelineEntryView entry = + requireTimelineEntry(exactTimelineEntry, "entry"); + CoordinationEventNodes.TimelineEntryView predecessor = + requireTimelineEntry(exactPredecessor, "predecessor"); + Node declaredPredecessor = entry.prevEntry(); + if (declaredPredecessor == null) { + return false; + } + if (!exactNodeBlueId(entry.timeline(), "entry Timeline") + .equals(exactNodeBlueId( + predecessor.timeline(), + "predecessor Timeline"))) { + return false; + } + return exactNodeBlueId( + declaredPredecessor, + "declared predecessor") + .equals(predecessor.entryBlueId()) + && entry.timestamp().compareTo( + predecessor.timestamp()) > 0; } public static Node property(Node node, String key) { @@ -120,35 +443,299 @@ public static Node property(Node node, String key) { return node.getProperties().get(key); } + private static boolean hasDocumentValue(Node node) { + return hasRuntimeValue(node) || node != null && node.getType() != null; + } + + private static boolean hasRuntimeValue(Node node) { + return node != null && (node.getBlueId() != null + || node.getValue() != null + || node.getItems() != null && !node.getItems().isEmpty() + || node.getProperties() != null + && !node.getProperties().isEmpty()); + } + public static String textProperty(Node node, String key) { Node property = property(node, key); Object value = property != null ? property.getValue() : null; return value instanceof String ? (String) value : null; } - private static boolean isNewerTimelineEvent(ChannelCheckpointContext context, - boolean acceptDifferentTimeline) { - CoordinationEventNodes.TimelineEntryView current = - CoordinationEventNodes.timelineEntry(context.event()); - if (current == null) { - return false; + static Node timelineOrderSubject( + CoordinationEventNodes.TimelineEntryView entry) { + if (entry == null) { + throw new IllegalArgumentException( + "Timeline order subject requires a Timeline Entry"); } - Node previousEvent = context.lastEvent(); - if (previousEvent == null) { - return true; + return timelineOrderSubject( + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION, + timelinePosition(entry, "checkpoint")); + } + + static Node memberTimelineOrderSubject( + String semantics, + ExternalChannelMemberSnapshot member, + Node exactMemberSubject) { + TimelineOrder memberOrder = timelineOrder( + exactMemberSubject, + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION); + if (memberOrder == null) { + throw new IllegalArgumentException( + "Timeline member order subject requires the selected " + + "member's exact Timeline subject"); + } + return timelineOrderSubject( + semantics, memberOrder.position) + .properties("memberKey", + new Node().value(member.channelKey())) + .properties("memberDomain", + new Node().value( + member.checkpointDomainBlueId())); + } + + static boolean isNewerTimelineSubject( + ChannelCheckpointContext context, + String expectedSemantics) { + TimelineOrder current = timelineOrder( + context.currentSubject(), expectedSemantics); + if (current == null) { + throw new IllegalArgumentException( + "Current Timeline checkpoint has no exact order " + + "subject"); } if (context.eventSignature() != null - && context.eventSignature().equals(context.lastEventSignature())) { + && context.eventSignature().equals( + context.lastEventSignature())) { return false; } - CoordinationEventNodes.TimelineEntryView previous = - CoordinationEventNodes.timelineEntry(previousEvent); + Node previousSubject = context.lastEvent(); + if (previousSubject == null) { + return true; + } + TimelineOrder previous = + timelineOrder(previousSubject, expectedSemantics); if (previous == null) { - return false; + throw new IllegalArgumentException( + "Stored Timeline checkpoint subject is malformed"); + } + if (current.position.timelineBlueId.equals( + previous.position.timelineBlueId)) { + return current.position.timestamp.compareTo( + previous.position.timestamp) > 0; + } + /* + * The managing feeder supplies and verifies the concrete source's + * total order before PROCESS. A Composite or All Timelines checkpoint + * must consume that order, not replace the source-specific + * cross-Timeline rule with a lexical Timeline-BlueId tie-break. + */ + return true; + } + + private static TimelineOrder timelineOrder(Node node, + String expectedSemantics) { + String semantics = textProperty(node, "semantics"); + if (!expectedSemantics.equals(semantics)) { + return null; + } + Node timestampNode = property(node, "timestamp"); + Object rawTimestamp = + timestampNode != null + ? timestampNode.getValue() + : null; + BigInteger timestamp = integer(rawTimestamp); + String timelineBlueId = + textProperty(node, "timelineBlueId"); + String entryBlueId = + textProperty(node, "entryBlueId"); + Node memberKeyNode = property(node, "memberKey"); + Node memberDomainNode = property(node, "memberDomain"); + String memberKey = textProperty(node, "memberKey"); + String memberDomain = textProperty(node, "memberDomain"); + boolean direct = TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION.equals( + expectedSemantics); + if (timestamp == null + || timelineBlueId == null + || timelineBlueId.isEmpty() + || entryBlueId == null + || entryBlueId.isEmpty() + || direct && (memberKeyNode != null + || memberDomainNode != null) + || !direct && (memberKey == null + || memberKey.isEmpty() + || memberDomain == null + || memberDomain.isEmpty())) { + return null; + } + return new TimelineOrder( + new TimelinePosition( + timestamp, + timelineBlueId, + entryBlueId)); + } + + private static Node timelineOrderSubject( + String semantics, + TimelinePosition position) { + return new Node() + .properties("semantics", + new Node().value(semantics)) + .properties("timestamp", + new Node().value(position.timestamp)) + .properties("timelineBlueId", + new Node().value(position.timelineBlueId)) + .properties("entryBlueId", + new Node().value(position.entryBlueId)); + } + + private static BigInteger integer(Object value) { + if (value instanceof BigInteger) { + return (BigInteger) value; + } + if (value instanceof Byte || value instanceof Short + || value instanceof Integer || value instanceof Long) { + return BigInteger.valueOf( + ((Number) value).longValue()); + } + return null; + } + + private static TimelinePosition timelinePosition( + CoordinationEventNodes.TimelineEntryView entry, + String role) { + return new TimelinePosition( + entry.timestamp(), + exactNodeBlueId(entry.timeline(), role + " Timeline"), + entry.entryBlueId()); + } + + private static CoordinationEventNodes.TimelineEntryView + requireTimelineEntry(Node node, String role) { + CoordinationEventNodes.TimelineEntryView entry = + CoordinationEventNodes.timelineEntry(node); + if (entry == null) { + throw new IllegalArgumentException( + "Timeline " + role + + " must be an exact Timeline Entry"); + } + return entry; + } + + private static String exactNodeBlueId(Node node, String role) { + if (node == null) { + throw new IllegalArgumentException( + role + " exact node is required"); } - if (!BlueSemanticIdentity.equals(current.timeline(), previous.timeline())) { - return acceptDifferentTimeline; + String blueId = eventId(node); + if (blueId == null || blueId.isEmpty()) { + throw new IllegalArgumentException( + role + " has no exact identity"); } - return current.timestamp().compareTo(previous.timestamp()) > 0; + return blueId; } + + private static String requireText(String value, String label) { + String checked = Objects.requireNonNull(value, label); + if (checked.isBlank()) { + throw new IllegalArgumentException(label + " must not be blank"); + } + return checked; + } + + private static final class TimelinePosition { + private final BigInteger timestamp; + private final String timelineBlueId; + private final String entryBlueId; + + private TimelinePosition( + BigInteger timestamp, + String timelineBlueId, + String entryBlueId) { + this.timestamp = timestamp; + this.timelineBlueId = timelineBlueId; + this.entryBlueId = entryBlueId; + } + } + + private static final class TimelineOrder { + private final TimelinePosition position; + + private TimelineOrder(TimelinePosition position) { + this.position = position; + } + } + + /** + * Immutable result of deterministic feeder-window completeness. + */ + public static final class CompletenessWindow { + private final boolean ready; + private final BigInteger maximumTimestamp; + private final List orderedEntries; + private final List incompleteTimelineBlueIds; + + private CompletenessWindow( + boolean ready, + BigInteger maximumTimestamp, + List orderedEntries, + List incompleteTimelineBlueIds) { + this.ready = ready; + this.maximumTimestamp = maximumTimestamp; + this.orderedEntries = immutableNodes(orderedEntries); + this.incompleteTimelineBlueIds = + Collections.unmodifiableList( + new ArrayList( + incompleteTimelineBlueIds)); + } + + private static CompletenessWindow ready( + BigInteger maximumTimestamp, + List orderedEntries) { + return new CompletenessWindow( + true, + maximumTimestamp, + orderedEntries, + Collections.emptyList()); + } + + private static CompletenessWindow suspended( + BigInteger maximumTimestamp, + List incompleteTimelineBlueIds) { + return new CompletenessWindow( + false, + maximumTimestamp, + Collections.emptyList(), + incompleteTimelineBlueIds); + } + + public boolean ready() { + return ready; + } + + public BigInteger maximumTimestamp() { + return maximumTimestamp; + } + + public List orderedEntries() { + return immutableNodes(orderedEntries); + } + + public List incompleteTimelineBlueIds() { + return incompleteTimelineBlueIds; + } + + private static List immutableNodes( + List source) { + List copy = new ArrayList( + source.size()); + for (Node node : source) { + copy.add(node.clone()); + } + return Collections.unmodifiableList(copy); + } + } + } diff --git a/src/main/java/blue/coordination/processor/TimelineSubscriptionProjection.java b/src/main/java/blue/coordination/processor/TimelineSubscriptionProjection.java new file mode 100644 index 0000000..e23f3e5 --- /dev/null +++ b/src/main/java/blue/coordination/processor/TimelineSubscriptionProjection.java @@ -0,0 +1,564 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.GasChargeContext; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.mapping.TypeClassResolver; +import blue.repo.coordination.Actor; +import blue.repo.coordination.Timeline; +import blue.repo.coordination.TimelineChannel; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Finite, representation-blind subscription projection for Timeline entries. + * + *

The selective forms are canonical projections of the fixed repository's + * immutable equality bindings. Each discriminator includes the declared + * binding type and the Blue identity of its exact scalar identifier. This + * prevents, for example, Principal and Agent actors that share an account ID + * from colliding. Bindings with additional pattern structure deliberately use + * a bounded broader key; the processor-owned matcher remains authoritative.

+ */ +final class TimelineSubscriptionProjection { + static final String VERSION = + "blue.coordination/1.0/timeline-entry-projection-v3"; + static final String BROAD_KEY = VERSION + ":broad"; + private static final String TIMELINE_FIELD = "timelineId"; + private static final String ACTOR_FIELD = "accountId"; + private static final Map> REGISTERED_TYPES = + registeredTypes(); + private static final List TIMELINE_PROJECTION_TYPES = + registeredProjectionTypes( + Timeline.class, "getTimelineId"); + private static final List ACTOR_PROJECTION_TYPES = + registeredProjectionTypes( + Actor.class, "getAccountId"); + + private TimelineSubscriptionProjection() { + } + + static List channelKeys(TimelineChannel channel) { + return channelKeys( + channel, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static List channelKeys( + TimelineChannel channel, + CoordinationSemanticTypeIdentities identities) { + if (channel == null + || channel.getTimeline() == null + || channel.getActor() == null) { + throw new IllegalArgumentException( + "Timeline Channel requires immutable timeline and actor headers"); + } + Projection timeline = channelDiscriminator( + channel.getTimeline(), + Timeline.class, + projectionTypes( + identities.timelineBlueId(), + TIMELINE_PROJECTION_TYPES, + identities), + identities.timelineBlueId(), + TIMELINE_FIELD); + Projection actor = channelDiscriminator( + channel.getActor(), + Actor.class, + projectionTypes( + identities.actorBlueId(), + ACTOR_PROJECTION_TYPES, + identities), + identities.actorBlueId(), + ACTOR_FIELD); + String selective = mostSelectiveKey( + timeline.discriminator, + actor.discriminator); + if (BROAD_KEY.equals(selective)) { + return Collections.singletonList(BROAD_KEY); + } + LinkedHashSet keys = + new LinkedHashSet(); + keys.add(selective); + if (timeline.requiresBroadFallback + || actor.requiresBroadFallback) { + keys.add(BROAD_KEY); + } + return Collections.unmodifiableList( + new ArrayList(keys)); + } + + static List eventKeys( + Node exactEvent, + ExternalChannelFunctionContext context) { + return eventKeys( + exactEvent, + context, + CoordinationSemanticTypeIdentities.publishedDefaults()); + } + + static String exactScalarPairKey( + String timelineId, + String actorId, + CoordinationSemanticTypeIdentities identities) { + String timelineScalar = scalarIdentity( + new Node().value(requireText(timelineId, "timelineId"))); + String actorScalar = scalarIdentity( + new Node().value(requireText(actorId, "actorId"))); + return pairKey( + canonicalDiscriminator( + identities.timelineBlueId(), + TIMELINE_FIELD, + timelineScalar), + canonicalDiscriminator( + identities.actorBlueId(), + ACTOR_FIELD, + actorScalar)); + } + + static List exactScalarEventKeys( + String timelineId, + String actorId, + CoordinationSemanticTypeIdentities identities) { + String timelineScalar = scalarIdentity( + new Node().value(requireText(timelineId, "timelineId"))); + String actorScalar = scalarIdentity( + new Node().value(requireText(actorId, "actorId"))); + String timeline = canonicalDiscriminator( + identities.timelineBlueId(), + TIMELINE_FIELD, + timelineScalar); + String actor = canonicalDiscriminator( + identities.actorBlueId(), + ACTOR_FIELD, + actorScalar); + LinkedHashSet result = new LinkedHashSet(); + result.add(pairKey(timeline, actor)); + result.add(timelineKey(timeline)); + result.add(actorKey(actor)); + result.add(BROAD_KEY); + return Collections.unmodifiableList( + new ArrayList(result)); + } + + static List eventKeys( + Node exactEvent, + ExternalChannelFunctionContext context, + CoordinationSemanticTypeIdentities identities) { + Node header = CoordinationEventNodes.materializeHeaderValue( + exactEvent, context); + if (!CoordinationEventNodes.isTimelineEntry( + header, context, identities) + || header.getProperties() == null) { + return Collections.emptyList(); + } + CoordinationRuntimeGas.charge( + context.runtimeWorkSession(), + "timelineHeaderRead", + 2L, + GasChargeContext.of( + context.scopePath(), + context.channelKey(), + null, + "read Timeline Entry timeline/actor projection")); + Node suppliedTimeline = + header.getProperties().get("timeline"); + Node suppliedActor = + header.getProperties().get("actor"); + if (suppliedTimeline == null + || suppliedActor == null) { + return Collections.emptyList(); + } + Node timeline = CoordinationEventNodes.materializeHeaderValue( + suppliedTimeline, context); + Node actor = CoordinationEventNodes.materializeHeaderValue( + suppliedActor, context); + if (!matchesType( + timeline, identities.timelineBlueId(), context) + || !matchesType( + actor, identities.actorBlueId(), context)) { + return Collections.emptyList(); + } + + Set timelineKeys = + eventDiscriminators( + timeline, + identities.timelineBlueId(), + projectionTypes( + identities.timelineBlueId(), + TIMELINE_PROJECTION_TYPES, + identities), + TIMELINE_FIELD, + context); + if (timelineKeys.isEmpty()) { + return Collections.emptyList(); + } + Set actorKeys = + eventDiscriminators( + actor, + identities.actorBlueId(), + projectionTypes( + identities.actorBlueId(), + ACTOR_PROJECTION_TYPES, + identities), + ACTOR_FIELD, + context); + + LinkedHashSet keys = + new LinkedHashSet(); + for (String timelineKey : timelineKeys) { + for (String actorKey : actorKeys) { + keys.add(pairKey(timelineKey, actorKey)); + } + } + for (String timelineKey : timelineKeys) { + keys.add(timelineKey(timelineKey)); + } + for (String actorKey : actorKeys) { + keys.add(actorKey(actorKey)); + } + keys.add(BROAD_KEY); + return Collections.unmodifiableList( + new ArrayList(keys)); + } + + private static Projection channelDiscriminator( + Object configuredBinding, + Class baseClass, + List registeredFamily, + String configuredTypeBlueId, + String scalarField) { + if (!baseClass.isInstance(configuredBinding)) { + return Projection.none(); + } + Node binding = + CoordinationEventNodes.generatedBindingNode( + configuredBinding); + String type = configuredTypeBlueId; + String discriminator = exactScalarProjection( + binding, + type, + scalarField, + Collections.singleton(scalarField)); + return discriminator != null + ? Projection.selective( + discriminator, + !registeredFamily.contains(type)) + : Projection.none(); + } + + private static List projectionTypes( + String configuredBlueId, + List publishedTypes, + CoordinationSemanticTypeIdentities identities) { + return identities.custom() + ? Collections.singletonList(configuredBlueId) + : publishedTypes; + } + + /** + * Enumerates the scalar-bearing registered subtype family generically. + * + *

The generated repository registry supplies only candidate type + * identities. The event-scoped Language matcher remains authoritative for + * every same-or-subtype relationship, so the registry cannot turn + * unavailable or inconsistent provider evidence into a match. An exact + * valid subtype that is registered after this fixed catalog was built is + * still projected under its own declared type; the corresponding channel + * carries the broad fallback until that type becomes part of the fixed + * registry.

+ */ + private static Set eventDiscriminators( + Node exact, + String baseTypeBlueId, + List registeredFamily, + String scalarField, + ExternalChannelFunctionContext context) { + Node suppliedScalar = + property(exact, scalarField); + Node exactScalar = suppliedScalar != null + && suppliedScalar.isReferenceOnly() + ? CoordinationEventNodes.materializeHeaderValue( + suppliedScalar, context) + : suppliedScalar; + String scalar = scalarIdentity(exactScalar); + if (scalar == null + || !matchesType( + exact, baseTypeBlueId, context)) { + return Collections.emptySet(); + } + + LinkedHashSet result = + new LinkedHashSet(); + for (String candidateType : registeredFamily) { + if (matchesType( + exact, candidateType, context)) { + result.add(canonicalDiscriminator( + candidateType, + scalarField, + scalar)); + } + } + String exactType = declaredTypeBlueId(exact); + if (exactType != null) { + result.add(canonicalDiscriminator( + exactType, + scalarField, + scalar)); + } + return Collections.unmodifiableSet(result); + } + + private static boolean matchesType( + Node exact, + String typeBlueId, + ExternalChannelFunctionContext context) { + return exact != null + && context.matchesPattern( + exact, + new Node().type( + new Node().blueId( + typeBlueId))); + } + + private static String exactScalarProjection( + Node binding, + String typeBlueId, + String scalarField, + Set allowedProperties) { + if (binding == null + || typeBlueId == null + || binding.isReferenceOnly() + || hasOtherProperties( + binding.getProperties(), + allowedProperties)) { + return null; + } + String scalar = scalarIdentity( + property(binding, scalarField)); + return scalar != null + ? canonicalDiscriminator( + typeBlueId, + scalarField, + scalar) + : null; + } + + private static boolean hasOtherProperties( + Map properties, + Set allowed) { + if (properties == null) { + return false; + } + for (Map.Entry entry + : properties.entrySet()) { + if (entry.getValue() != null + && !allowed.contains( + entry.getKey())) { + return true; + } + } + return false; + } + + private static Node property( + Node node, + String key) { + return node != null + && node.getProperties() != null + ? node.getProperties().get(key) + : null; + } + + private static String declaredTypeBlueId(Node node) { + Node type = node != null + ? node.getType() + : null; + return type != null + ? type.getBlueId() + : null; + } + + private static String scalarIdentity(Node value) { + if (value == null + || value.isReferenceOnly() + || !(value.getValue() + instanceof String)) { + return null; + } + return DirectBlueIdCalculator.calculateBlueId( + new Node().value( + value.getValue())); + } + + private static String requireText(String value, String label) { + if (value == null || value.isEmpty()) { + throw new IllegalArgumentException( + label + " must be non-empty"); + } + return value; + } + + private static String canonicalDiscriminator( + String typeBlueId, + String field, + String scalarBlueId) { + return "type-" + + typeBlueId + + ":" + + field + + "-" + + scalarBlueId; + } + + private static String mostSelectiveKey( + String timeline, + String actor) { + if (timeline != null && actor != null) { + return pairKey(timeline, actor); + } + if (timeline != null) { + return timelineKey(timeline); + } + if (actor != null) { + return actorKey(actor); + } + return BROAD_KEY; + } + + private static String pairKey( + String timeline, + String actor) { + return VERSION + + ":timeline=" + + timeline + + ":actor=" + + actor; + } + + private static String timelineKey(String timeline) { + return VERSION + ":timeline=" + timeline; + } + + private static String actorKey(String actor) { + return VERSION + ":actor=" + actor; + } + + private static Map> registeredTypes() { + TypeClassResolver resolver = + new TypeClassResolver("blue.repo"); + return Collections.unmodifiableMap( + new LinkedHashMap>( + resolver.getBlueIdMap())); + } + + private static List registeredProjectionTypes( + final Class baseClass, + String scalarAccessor) { + List>> candidates = + new ArrayList>>(); + for (Map.Entry> entry + : REGISTERED_TYPES.entrySet()) { + Class candidateClass = entry.getValue(); + if (!baseClass.isAssignableFrom(candidateClass) + || !hasScalarAccessor( + candidateClass, scalarAccessor)) { + continue; + } + candidates.add(entry); + } + Collections.sort( + candidates, + new Comparator>>() { + @Override + public int compare( + Map.Entry> left, + Map.Entry> right) { + int leftDepth = inheritanceDepth( + baseClass, left.getValue()); + int rightDepth = inheritanceDepth( + baseClass, right.getValue()); + if (leftDepth != rightDepth) { + return leftDepth < rightDepth + ? -1 + : 1; + } + return ExternalOrderKey.compareTextCodePoints( + left.getKey(), right.getKey()); + } + }); + List result = + new ArrayList( + candidates.size()); + for (Map.Entry> candidate + : candidates) { + result.add(candidate.getKey()); + } + return Collections.unmodifiableList(result); + } + + private static boolean hasScalarAccessor( + Class candidateClass, + String scalarAccessor) { + try { + return String.class.equals( + candidateClass + .getMethod(scalarAccessor) + .getReturnType()); + } catch (NoSuchMethodException missingScalar) { + return false; + } + } + + private static int inheritanceDepth( + Class baseClass, + Class candidateClass) { + int depth = 0; + Class current = candidateClass; + while (current != null + && !baseClass.equals(current)) { + current = current.getSuperclass(); + depth++; + } + return current != null + ? depth + : Integer.MAX_VALUE; + } + + private static final class Projection { + private static final Projection NONE = + new Projection(null, false); + + private final String discriminator; + private final boolean requiresBroadFallback; + + private Projection( + String discriminator, + boolean requiresBroadFallback) { + this.discriminator = discriminator; + this.requiresBroadFallback = + requiresBroadFallback; + } + + private static Projection none() { + return NONE; + } + + private static Projection selective( + String discriminator, + boolean requiresBroadFallback) { + return new Projection( + discriminator, + requiresBroadFallback); + } + } +} diff --git a/src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java b/src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java index 13e0e6a..5715f24 100644 --- a/src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java +++ b/src/main/java/blue/coordination/processor/bex/BexProcessingMetrics.java @@ -1,7 +1,9 @@ package blue.coordination.processor.bex; -import blue.bex.result.BexMetrics; -import blue.language.processor.ProcessingMetricsSink; +import blue.bex.api.BexMetricsSink; +import blue.bex.result.BexMetricsSnapshot; +import blue.language.processor.ProcessingObservation; +import blue.language.processor.ProcessingObserver; import java.util.Collections; import java.util.Map; @@ -10,7 +12,14 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; -public final class BexProcessingMetrics implements ProcessingMetricsSink { +/** + * Thread-safe Coordination and hosted-BEX metrics sink. + * + *

All metric names are bounded and snapshots are immutable, so optional + * observability cannot alter workflow semantics or portable gas.

+ */ +public final class BexProcessingMetrics + implements ProcessingObserver, BexMetricsSink { /** * Language currently emits a fixed vocabulary, but keep the adapter safe if a future * integration accidentally supplies data-derived names. @@ -383,423 +392,419 @@ public void incrementBexPatchNodeMaterializations() { bexPatchNodeMaterializations.incrementAndGet(); } - public void addBexMetrics(BexMetrics metrics) { + public void addBexMetrics(BexMetricsSnapshot metrics) { if (metrics == null) { return; } - bexCompileCacheHits.addAndGet(metrics.compileCacheHits()); - bexCompileCacheMisses.addAndGet(metrics.compileCacheMisses()); - bexCompiledExecutions.addAndGet(metrics.compiledExecutions()); - bexCompileNanos.addAndGet(metrics.compileNanos()); - bexExecuteNanos.addAndGet(metrics.executeNanos()); + addBexMetricValues( + metrics.compileCacheHits(), + metrics.compileCacheMisses(), + metrics.compiledExecutions(), + metrics.compileNanos(), + metrics.executeNanos()); } + /** + * Aggregates the baseline-stable counters exposed by the former BEX + * metrics compatibility view. + * + * @param metrics compatibility metrics view, or {@code null} + * @deprecated use {@link #addBexMetrics(BexMetricsSnapshot)} + */ + @Deprecated + @SuppressWarnings("deprecation") + public void addBexMetrics( + blue.bex.result.BexMetrics metrics) { + if (metrics == null) { + return; + } + addBexMetricValues( + metrics.compileCacheHits(), + metrics.compileCacheMisses(), + metrics.compiledExecutions(), + metrics.compileNanos(), + metrics.executeNanos()); + } + + private void addBexMetricValues( + long compileCacheHits, + long compileCacheMisses, + long compiledExecutions, + long compileNanos, + long executeNanos) { + bexCompileCacheHits.addAndGet(compileCacheHits); + bexCompileCacheMisses.addAndGet(compileCacheMisses); + bexCompiledExecutions.addAndGet(compiledExecutions); + bexCompileNanos.addAndGet(compileNanos); + bexExecuteNanos.addAndGet(executeNanos); + } + + /** Records one immutable BEX diagnostics snapshot. */ + @Override + public void accept(BexMetricsSnapshot metrics) { + addBexMetrics(metrics); + } + + /** + * Aggregates one typed Language observation without participating in + * semantic execution. The current Language manifest owns metric names and + * aggregation kinds; Coordination only retains an immutable diagnostics + * view of those observations. + * + * @param observation immutable Language observation + */ @Override + public void record(ProcessingObservation observation) { + if (observation == null) { + return; + } + switch (observation.kind()) { + case COUNTER_DELTA: + addMetric( + observation.legacyMetricName(), + observation.value()); + break; + case GAUGE_VALUE: + setMetric( + observation.legacyMetricName(), + observation.value()); + break; + case HIGH_WATER_MARK: + recordMetricHighWater( + observation.legacyMetricName(), + observation.value()); + break; + default: + throw new IllegalStateException( + "Unsupported Language observation kind: " + + observation.kind()); + } + } + public void addProcessDocumentNanos(long nanos) { processDocumentNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBlueProcessDocumentNanos(long nanos) { blueProcessDocumentNanos.addAndGet(nonNegative(nanos)); } - @Override public void addEventPreprocessNanos(long nanos) { eventPreprocessNanos.addAndGet(nonNegative(nanos)); } - @Override public void addResultSnapshotAttachNanos(long nanos) { resultSnapshotAttachNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBlueIdCalculationNanos(long nanos) { blueIdCalculationNanos.addAndGet(nonNegative(nanos)); } - @Override public void addProcessingSnapshotCacheLookupNanos(long nanos) { processingSnapshotCacheLookupNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementProcessingSnapshotCacheHits() { processingSnapshotCacheHits.incrementAndGet(); } - @Override public void incrementProcessingSnapshotCacheMisses() { processingSnapshotCacheMisses.incrementAndGet(); } - @Override public void addProcessingSnapshotFromDocumentNanos(long nanos) { processingSnapshotFromDocumentNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementProcessingSnapshotFromDocumentBuilds() { processingSnapshotFromDocumentBuilds.incrementAndGet(); } - @Override public void incrementProcessEventSnapshotAttempts() { processEventSnapshotAttempts.incrementAndGet(); } - @Override public void incrementProcessEventSnapshotBuilds() { processEventSnapshotBuilds.incrementAndGet(); } - @Override public void incrementProcessEventSnapshotFailures() { processEventSnapshotFailures.incrementAndGet(); } - @Override public void addProcessEventSnapshotConstructionNanos(long nanos) { processEventSnapshotConstructionNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBundleLoadNanos(long nanos) { bundleLoadNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBundleLoadCacheKeyBuildNanos(long nanos) { bundleLoadCacheKeyBuildNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBundleLoadActualBuildNanos(long nanos) { bundleLoadActualBuildNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBundleLoadReuseNanos(long nanos) { bundleLoadReuseNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementBundleLoadCacheHits() { bundleLoadCacheHits.incrementAndGet(); } - @Override public void incrementBundleLoadCacheMisses() { bundleLoadCacheMisses.incrementAndGet(); } - @Override public void incrementBundlesBuilt() { bundlesBuilt.incrementAndGet(); } - @Override public void incrementBundlesReused() { bundlesReused.incrementAndGet(); } - @Override public void incrementBundleScopeLoadAttempts() { bundleScopeLoadAttempts.incrementAndGet(); } - @Override public void incrementBundleScopeExecutionCacheHits() { bundleScopeExecutionCacheHits.incrementAndGet(); } - @Override public void incrementBundleScopeRefreshes() { bundleScopeRefreshes.incrementAndGet(); } - @Override public void addBundleScopeTerminationCheckNanos(long nanos) { bundleScopeTerminationCheckNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBundleScopeResolvedLookupNanos(long nanos) { bundleScopeResolvedLookupNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBundleScopeContractLoadNanos(long nanos) { bundleScopeContractLoadNanos.addAndGet(nonNegative(nanos)); } - @Override public void addChannelDiscoveryNanos(long nanos) { channelDiscoveryNanos.addAndGet(nonNegative(nanos)); } - @Override public void addChannelMatchNanos(long nanos) { channelMatchNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementChannelEvaluations() { channelEvaluations.incrementAndGet(); } - @Override public void addHandlerDiscoveryNanos(long nanos) { handlerDiscoveryNanos.addAndGet(nonNegative(nanos)); } - @Override public void addHandlerMatchNanos(long nanos) { handlerMatchNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementHandlerMatchAttempts() { handlerMatchAttempts.incrementAndGet(); } - @Override public void addHandlerExecutionNanos(long nanos) { handlerExecutionNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementHandlersExecuted() { handlersExecuted.incrementAndGet(); } - @Override public void addTriggeredEventRoutingNanos(long nanos) { triggeredEventRoutingNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementTriggeredEventsRouted() { triggeredEventsRouted.incrementAndGet(); } - @Override public void addCheckpointUpdateNanos(long nanos) { checkpointUpdateNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointEnsureNanos(long nanos) { checkpointEnsureNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointFindNanos(long nanos) { checkpointFindNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointCurrentIdentityNanos(long nanos) { checkpointCurrentIdentityNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointIsNewerNanos(long nanos) { checkpointIsNewerNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointDuplicateNanos(long nanos) { checkpointDuplicateNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointPersistNanos(long nanos) { checkpointPersistNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementCheckpointIdentityCacheHits() { checkpointIdentityCacheHits.incrementAndGet(); } - @Override public void incrementCheckpointIdentityCacheMisses() { checkpointIdentityCacheMisses.incrementAndGet(); } - @Override public void incrementCheckpointStoredIdentityCacheHits() { checkpointStoredIdentityCacheHits.incrementAndGet(); } - @Override public void incrementCheckpointStoredIdentityCacheMisses() { checkpointStoredIdentityCacheMisses.incrementAndGet(); } - @Override public void addCheckpointDirectBlueIdNanos(long nanos) { checkpointDirectBlueIdNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointContentBlueIdNanos(long nanos) { checkpointContentBlueIdNanos.addAndGet(nonNegative(nanos)); } - @Override public void addCheckpointFallbackNanos(long nanos) { checkpointFallbackNanos.addAndGet(nonNegative(nanos)); } - @Override public void addSnapshotCommitNanos(long nanos) { snapshotCommitNanos.addAndGet(nonNegative(nanos)); } - @Override public void addPostProcessingNanos(long nanos) { postProcessingNanos.addAndGet(nonNegative(nanos)); } - @Override public void addPatchBoundaryNanos(long nanos) { patchBoundaryNanos.addAndGet(nonNegative(nanos)); } - @Override public void addPatchGasNanos(long nanos) { patchGasNanos.addAndGet(nonNegative(nanos)); } - @Override public void addDocumentUpdateRoutingNanos(long nanos) { documentUpdateRoutingNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementDocumentUpdateEventsBuilt() { documentUpdateEventsBuilt.incrementAndGet(); } - @Override public void incrementDocumentUpdateEventsSkippedNoChannel() { documentUpdateEventsSkippedNoChannel.incrementAndGet(); } - @Override public void addBatchPatchPlanningNanos(long nanos) { batchPatchPlanningNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBatchPatchConformanceNanos(long nanos) { batchPatchConformanceNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBatchPatchBuildUpdatesNanos(long nanos) { batchPatchBuildUpdatesNanos.addAndGet(nonNegative(nanos)); } - @Override public void addBatchPatchCommitNanos(long nanos) { batchPatchCommitNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementDocumentUpdateBeforeMaterializations() { documentUpdateBeforeMaterializations.incrementAndGet(); } - @Override public void incrementDocumentUpdateAfterMaterializations() { documentUpdateAfterMaterializations.incrementAndGet(); } - @Override public void incrementPatchSequencesPrepared() { patchSequencesPrepared.incrementAndGet(); } - @Override public void addPatchesPrepared(long count) { patchesPrepared.addAndGet(count); } - @Override public void incrementSingletonPatchTransactions() { singletonPatchTransactions.incrementAndGet(); } - @Override public void addSequencePlanningNanos(long nanos) { sequencePlanningNanos.addAndGet(nonNegative(nanos)); } - @Override public void addSequenceConformanceNanos(long nanos) { sequenceConformanceNanos.addAndGet(nonNegative(nanos)); } - @Override public void addSequenceCommitNanos(long nanos) { sequenceCommitNanos.addAndGet(nonNegative(nanos)); } - @Override public void addSequenceFinalCacheCommitNanos(long nanos) { sequenceFinalCacheCommitNanos.addAndGet(nonNegative(nanos)); } - @Override public void incrementSequenceIntermediateSnapshotAdvances() { sequenceIntermediateSnapshotAdvances.incrementAndGet(); } - @Override public void incrementSequenceSharedSnapshotCacheInserts() { sequenceSharedSnapshotCacheInserts.incrementAndGet(); } - @Override public void incrementSequenceFinalSnapshotCacheInserts() { sequenceFinalSnapshotCacheInserts.incrementAndGet(); } - @Override public void incrementSequenceSuffixRebases() { sequenceSuffixRebases.incrementAndGet(); } - @Override public void incrementSequenceStalePreviewFallbacks() { sequenceStalePreviewFallbacks.incrementAndGet(); } - @Override public void incrementSequenceFallbackPatches() { sequenceFallbackPatches.incrementAndGet(); } - @Override public void incrementParsedPointerCacheHits() { parsedPointerCacheHits.incrementAndGet(); } - @Override public void incrementParsedPointerCacheMisses() { parsedPointerCacheMisses.incrementAndGet(); } - @Override public void incrementFrozenPatchValueHits() { frozenPatchValueHits.incrementAndGet(); } - @Override public void incrementPatchValueMaterializations() { patchValueMaterializations.incrementAndGet(); } @@ -1323,12 +1328,18 @@ public long documentUpdateAfterMaterializations() { /** * Number of reusable Language patch-sequence planning sessions. This is the raw value from * {@link #incrementPatchSequencesPrepared()}. + * + * @return number of prepared reusable patch-sequence sessions */ public long preparedPatchSequences() { return patchSequencesPrepared.get(); } - /** Number of patches accepted by Language sequence sessions. */ + /** + * Number of patches accepted by Language sequence sessions. + * + * @return number of accepted sequence-session patches + */ public long preparedPatches() { return patchesPrepared.get(); } @@ -1339,12 +1350,18 @@ public long preparedPatches() { *

The callback identifies a reusable sequential planning session, * not the Language runtime's internal transaction counter, so reports must * retain this qualification.

+ * + * @return number of reusable Language sequence planning sessions */ public long languageSequenceTransactions() { return patchSequencesPrepared.get(); } - /** Number of legacy standalone one-patch Language transactions. */ + /** + * Number of standalone one-patch Language transactions. + * + * @return number of singleton patch transactions + */ public long languageSingletonTransactions() { return singletonPatchTransactions.get(); } @@ -1373,7 +1390,11 @@ public long sequenceSharedSnapshotCacheInserts() { return sequenceSharedSnapshotCacheInserts.get(); } - /** Maps to Language's final sequence snapshot-cache insertion callback. */ + /** + * Maps to Language's final sequence snapshot-cache insertion callback. + * + * @return number of final sequence snapshot-cache insertions + */ public long languageFinalSnapshotPromotions() { return sequenceFinalSnapshotCacheInserts.get(); } @@ -1438,7 +1459,6 @@ public long bexDocumentViewUndefinedHits() { return bexDocumentViewUndefinedHits.get(); } - @Override public void addMetric(String metricName, long delta) { AtomicLong counter = languageMetric(languageCounters, metricName); if (counter != null) { @@ -1446,7 +1466,6 @@ public void addMetric(String metricName, long delta) { } } - @Override public void setMetric(String metricName, long value) { AtomicLong gauge = languageMetric(languageGauges, metricName); if (gauge != null) { @@ -1454,7 +1473,6 @@ public void setMetric(String metricName, long value) { } } - @Override public void recordMetricHighWater(String metricName, long value) { AtomicLong highWater = languageMetric(languageHighWaterMarks, metricName); if (highWater == null) { @@ -1466,22 +1484,40 @@ public void recordMetricHighWater(String metricName, long value) { } } - /** Immutable, name-sorted snapshot of Language's generic additive counters. */ + /** + * Immutable, name-sorted snapshot of Language's generic additive counters. + * + * @return immutable additive-counter values sorted by metric name + */ public Map languageCounters() { return immutableSortedValues(languageCounters); } - /** Immutable, name-sorted snapshot of Language's generic current-value gauges. */ + /** + * Immutable, name-sorted snapshot of Language's generic current-value + * gauges. + * + * @return immutable current-value gauges sorted by metric name + */ public Map languageGauges() { return immutableSortedValues(languageGauges); } - /** Immutable, name-sorted snapshot of Language's generic high-water gauges. */ + /** + * Immutable, name-sorted snapshot of Language's generic high-water gauges. + * + * @return immutable high-water gauges sorted by metric name + */ public Map languageHighWaterMarks() { return immutableSortedValues(languageHighWaterMarks); } - /** Number of generic metric samples dropped because their new name exceeded the cap. */ + /** + * Number of generic metric samples dropped because their new name exceeded + * the cap. + * + * @return number of metric samples dropped due to the metric-name cap + */ public long droppedLanguageMetricNames() { return droppedLanguageMetricNames.get(); } diff --git a/src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java b/src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java index 245cae8..3c43130 100644 --- a/src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java +++ b/src/main/java/blue/coordination/processor/bex/BexWorkflowContextFactory.java @@ -2,47 +2,122 @@ import blue.bex.api.BexExecutionContext; import blue.bex.api.BexStepResults; +import blue.bex.contracts.BexContractsExecutionContext; import blue.bex.result.BexExecutionResult; import blue.bex.value.BexValue; import blue.bex.value.BexValues; -import blue.coordination.processor.workflow.StepExecutionContext; import blue.language.model.Node; import blue.language.processor.ProcessorExecutionContext; +import blue.language.snapshot.FrozenNode; import java.util.Map; +/** + * Adapts the current workflow step and processor-owned semantic boundary into + * a hosted BEX execution context. + * + *

The resulting context exposes the original processing event, current + * contract, prior step results, and the live document view without creating a + * separate document-processing session.

+ */ public final class BexWorkflowContextFactory { private final BexProcessingMetrics metrics; + private final ProcessingEventIdentityObserver + processingEventIdentityObserver; public BexWorkflowContextFactory() { - this(null); + this(null, null); } public BexWorkflowContextFactory(BexProcessingMetrics metrics) { + this(metrics, null); + } + + public BexWorkflowContextFactory( + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver + processingEventIdentityObserver) { this.metrics = metrics; + this.processingEventIdentityObserver = + processingEventIdentityObserver; } BexProcessingMetrics metrics() { return metrics; } - public BexExecutionContext create(StepExecutionContext context, long gasLimit) { - BexValue event = BexValues.nodeCursorTrustedImmutable(context.eventRef()); + public BexExecutionContext create( + BexWorkflowStepContext context, + long gasLimit) { + return create( + context, + gasLimit, + true); + } + + /** + * Compatibility bridge for callers compiled against the concrete + * workflow context signature. + * + * @deprecated use {@link #create(BexWorkflowStepContext, long)} so hosted + * BEX depends on the capability role rather than the workflow + * implementation. + */ + @Deprecated + public BexExecutionContext create( + blue.coordination.processor.workflow.StepExecutionContext context, + long gasLimit) { + return create((BexWorkflowStepContext) context, gasLimit); + } + + /** + * Creates a hosted context without materializing the Root processing + * event when the immutable Compute plan proves the binding is unused. + */ + public BexExecutionContext create( + BexWorkflowStepContext context, + long gasLimit, + boolean processingEventRequired) { + /* + * The channelized event may contain exact pure-reference descendants + * (for example an Operation Request document). A transient Node cursor + * cannot carry that identity through BEX output admission. Snapshot + * the invocation-owned event once so exact descendants remain exact + * while computed event aggregates still cross the hosted semantic + * boundary normally. + */ + BexValue event = + BexValues.nodeSnapshot( + context.eventRef()); BexValue currentContract = currentContractBinding(context); BexStepResults steps = stepResults(context.stepResults()); ProcessorExecutionContext processorContext = context.processorContext(); - return BexExecutionContext.builder() + FrozenNode processingEventSnapshot = + processingEventRequired + && processorContext.hasProcessEvent() + ? processorContext.frozenProcessEvent() + : null; + BexValue processingEvent = processingEventSnapshot != null + ? BexValues.frozen(processingEventSnapshot) + : BexValues.undefined(); + if (processingEventIdentityObserver != null + && processingEventSnapshot != null) { + processingEventIdentityObserver.observe( + processingEventSnapshot, + processingEvent.exactBlueId(), + ProcessingEventIdentityObserver.Boundary + .BEX_BINDING); + } + return BexContractsExecutionContext + .configure( + BexExecutionContext.builder(), + processorContext) .document(new ScopedProcessorExecutionContextBexDocumentView(context, metrics)) .event(event) + .processingEvent(processingEvent) .currentContract(currentContract) .steps(steps) - .binding("event", event) - .binding("steps", steps.asValue()) - .binding("currentContract", currentContract) - .lazyBinding("processingEvent", () -> - processorContext.hasProcessEvent() - ? BexValues.frozen(processorContext.frozenProcessEvent()) - : BexValues.undefined()) + .gasLedgerHost(context.bexGasLedgerHost()) .gasLimit(gasLimit) .build(); } @@ -56,7 +131,20 @@ public BexStepResults stepResults(Map workflowStepResults) { String name = entry.getKey(); Object value = entry.getValue(); if (value instanceof BexExecutionResult) { - builder.put(name, (BexExecutionResult) value); + BexExecutionResult execution = + (BexExecutionResult) value; + /* + * A hosted execution has already crossed BEX's root Blue + * output boundary. Preserve that admitted exact value for the + * next workflow step instead of re-exposing its transient + * pre-admission cursor. + */ + builder.put( + name, + execution.output() != null + ? execution.output() + .semanticValue() + : execution.value()); } else if (value instanceof Node) { builder.put(name, BexValues.nodeCursorTrustedImmutable((Node) value)); } else { @@ -66,18 +154,51 @@ public BexStepResults stepResults(Map workflowStepResults) { return builder.build(); } - public BexValue currentContractBinding(StepExecutionContext context) { - BexValue base = context.currentContractFrozenNode() != null - ? BexValues.frozen(context.currentContractFrozenNode()) - : BexValues.nodeCursorTrustedImmutable(context.currentContractNodeRef()); - String channel = context.workflow().getChannelKey(); - if (channel == null || channel.trim().isEmpty()) { - return base; - } - BexValue existing = base.get("channel"); - if (!existing.isUndefined() && existing.isScalar() && !existing.asText().trim().isEmpty()) { - return base; + public BexValue currentContractBinding( + BexWorkflowStepContext context) { + FrozenNode resolved = + context.currentContractFrozenNode(); + if (resolved == null) { + return BexValues.nodeCursorTrustedImmutable( + context.currentContractNodeRef()); } - return BexValues.overlay(base, "channel", BexValues.scalar(channel.trim())); + String contractKey = + context.processorContext() + .contractKey(); + FrozenNode canonical = + contractKey != null + ? context.processorContext() + .canonicalFrozenAt( + context.processorContext() + .resolvePointer( + "/contracts/" + + escapePointerSegment( + contractKey))) + : null; + return canonical != null + ? BexValues.exact( + canonical, + resolved) + : BexValues.frozen( + resolved); + } + + /** + * Compatibility bridge for callers compiled against the concrete + * workflow context signature. + * + * @deprecated use {@link #currentContractBinding(BexWorkflowStepContext)} + * so hosted BEX depends on the capability role rather than the + * workflow implementation. + */ + @Deprecated + public BexValue currentContractBinding( + blue.coordination.processor.workflow.StepExecutionContext context) { + return currentContractBinding((BexWorkflowStepContext) context); + } + + private String escapePointerSegment(String value) { + return value.replace("~", "~0") + .replace("/", "~1"); } } diff --git a/src/main/java/blue/coordination/processor/bex/BexWorkflowStepContext.java b/src/main/java/blue/coordination/processor/bex/BexWorkflowStepContext.java new file mode 100644 index 0000000..d887f7e --- /dev/null +++ b/src/main/java/blue/coordination/processor/bex/BexWorkflowStepContext.java @@ -0,0 +1,37 @@ +package blue.coordination.processor.bex; + +import blue.bex.api.BexGasLedgerHost; +import blue.language.model.Node; +import blue.language.processor.ProcessorExecutionContext; +import blue.language.processor.WorkingDocument; +import blue.language.snapshot.FrozenNode; + +import java.util.Map; + +/** + * Minimal immutable/live capabilities required to host BEX for one workflow + * step. + * + *

The BEX adapter depends on this role instead of the workflow package's + * concrete context. This keeps the adapter reusable and makes the package + * dependency point from workflow to BEX only.

+ */ +public interface BexWorkflowStepContext { + ProcessorExecutionContext processorContext(); + + BexGasLedgerHost bexGasLedgerHost(); + + Node eventRef(); + + Map stepResults(); + + FrozenNode currentContractFrozenNode(); + + Node currentContractNodeRef(); + + FrozenNode workingCanonicalAt(String absolutePointer); + + FrozenNode workingResolvedAt(String absolutePointer); + + WorkingDocument workingDocument(); +} diff --git a/src/main/java/blue/coordination/processor/bex/ProcessingEventIdentityObserver.java b/src/main/java/blue/coordination/processor/bex/ProcessingEventIdentityObserver.java new file mode 100644 index 0000000..9914d40 --- /dev/null +++ b/src/main/java/blue/coordination/processor/bex/ProcessingEventIdentityObserver.java @@ -0,0 +1,36 @@ +package blue.coordination.processor.bex; + +import blue.language.snapshot.FrozenNode; + +/** + * Optional diagnostic observer for the original Processing Event identity + * exposed by Coordination workflows and hosted BEX Compute programs. + * + *

The observed node is the immutable snapshot returned by Language's + * {@code ProcessorExecutionContext.frozenProcessEvent()} boundary. The + * exposed BlueId is the identity that the Coordination boundary supplies to + * the corresponding consumer. Production execution installs no observer by + * default and therefore performs no diagnostic snapshot or identity work.

+ */ +public interface ProcessingEventIdentityObserver { + + /** + * Records one exact Processing Event exposure. + * + * @param processingEvent immutable Language-owned Processing Event snapshot + * @param exposedBlueId exact identity exposed at the boundary + * @param boundary Coordination boundary that exposed the value + */ + void observe( + FrozenNode processingEvent, + String exposedBlueId, + Boundary boundary); + + /** Coordination boundaries that can expose the original Processing Event. */ + enum Boundary { + /** The selected Sequential Workflow handler invocation. */ + WORKFLOW, + /** The hosted BEX {@code $processingEvent} binding. */ + BEX_BINDING + } +} diff --git a/src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java b/src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java index 3e4986c..6540dce 100644 --- a/src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java +++ b/src/main/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentView.java @@ -3,83 +3,513 @@ import blue.bex.api.BexDocumentView; import blue.bex.value.BexValue; import blue.bex.value.BexValues; -import blue.coordination.processor.workflow.StepExecutionContext; +import blue.language.model.Node; import blue.language.processor.ProcessorExecutionContext; import blue.language.snapshot.FrozenNode; -import blue.language.utils.JsonPointer; +import blue.language.model.wire.JsonPointer; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.List; import java.util.Objects; /** * BEX document view that resolves authored pointers against the active processor scope. */ final class ScopedProcessorExecutionContextBexDocumentView implements BexDocumentView { - private final StepExecutionContext stepContext; - private final ProcessorExecutionContext context; + private final FrozenAccess access; private final BexProcessingMetrics metrics; - ScopedProcessorExecutionContextBexDocumentView(StepExecutionContext context) { + ScopedProcessorExecutionContextBexDocumentView( + BexWorkflowStepContext context) { this(context, null); } - ScopedProcessorExecutionContextBexDocumentView(StepExecutionContext context, - BexProcessingMetrics metrics) { - this.stepContext = Objects.requireNonNull(context, "context"); - this.context = context.processorContext(); + ScopedProcessorExecutionContextBexDocumentView( + BexWorkflowStepContext context, + BexProcessingMetrics metrics) { + this(new StepContextFrozenAccess(context), metrics); + } + + ScopedProcessorExecutionContextBexDocumentView( + FrozenAccess access, + BexProcessingMetrics metrics) { + this.access = + Objects.requireNonNull( + access, "access"); this.metrics = metrics; } @Override public String resolvePointer(String authoredPointer) { - return context.resolvePointer(authoredPointer); + return access.resolvePointer(authoredPointer); } @Override public BexValue canonicalAt(String pointer) { - return frozenAt(context.resolvePointer(pointer), true); + return cursorAt(access.resolvePointer(pointer)); } @Override public BexValue resolvedAt(String pointer) { - return frozenAt(context.resolvePointer(pointer), false); + return cursorAt(access.resolvePointer(pointer)); } @Override public String currentScopePath() { - return context.scopePath(); + return access.currentScopePath(); + } + + private BexValue cursorAt(String absolutePointer) { + BexValue exact = exactAt(absolutePointer); + return cursorFor(absolutePointer, exact); + } + + private BexValue cursorFor( + String absolutePointer, + BexValue value) { + if (value.isUndefined() + || hasTerminalSemanticContent(value)) { + return value; + } + return new ProcessorDocumentCursor( + absolutePointer, + value); + } + + private boolean hasTerminalSemanticContent( + BexValue value) { + try { + return value.isNull() + || value.isScalar(); + } catch (RuntimeException failure) { + if (isUnavailableExactSemantic(failure)) { + return false; + } + throw failure; + } + } + + private boolean isUnavailableExactSemantic( + RuntimeException failure) { + Throwable current = failure; + while (current != null) { + String message = current.getMessage(); + if (message != null + && message.contains( + "Semantic content is unavailable for exact Blue reference")) { + return true; + } + current = current.getCause(); + } + return false; } - private BexValue frozenAt(String absolutePointer, boolean canonical) { - FrozenNode viewed = canonical - ? stepContext.workingCanonicalAt(absolutePointer) - : stepContext.workingResolvedAt(absolutePointer); - if (viewed != null) { + private BexValue exactAt(String absolutePointer) { + FrozenNode workingCanonical = + access.workingCanonicalAt( + absolutePointer); + FrozenNode workingResolved = + access.workingResolvedAt( + absolutePointer); + if (hasResolvedSemantics( + workingResolved)) { if (metrics != null) { metrics.incrementBexDocumentViewFrozenDirectHits(); } - return BexValues.frozen(viewed); + return authoritativeExact( + workingCanonical, + workingResolved); } - FrozenNode selected = canonical - ? context.canonicalFrozenAt(absolutePointer) - : context.resolvedFrozenAt(absolutePointer); - if (selected != null) { + FrozenNode processorCanonical = + access.processorCanonicalAt( + absolutePointer); + FrozenNode processorResolved = + access.processorResolvedAt( + absolutePointer); + if (hasResolvedSemantics( + processorResolved)) { if (metrics != null) { metrics.incrementBexDocumentViewFrozenDirectHits(); } - return BexValues.frozen(selected); + return authoritativeExact( + workingCanonical != null + ? workingCanonical + : processorCanonical, + processorResolved); } - FrozenNode root = canonical - ? stepContext.workingDocument().canonicalRoot() - : stepContext.workingDocument().resolvedRoot(); - if (root != null) { + Node processorDocument = access.processorDocumentAt( + absolutePointer); + if (processorDocument != null + && !processorDocument.isReferenceOnly()) { + if (metrics != null) { + metrics.incrementBexDocumentViewFrozenDirectHits(); + } + FrozenNode demanded = FrozenNode.fromNode(processorDocument); + return authoritativeExact( + workingCanonical != null + ? workingCanonical + : processorCanonical, + demanded); + } + BexValue scoped = resolvedFromCurrentScope( + absolutePointer); + if (scoped != null) { + if (metrics != null) { + metrics.incrementBexDocumentViewFrozenDirectHits(); + } + return scoped; + } + FrozenNode canonicalRoot = + access.workingCanonicalRoot(); + FrozenNode resolvedRoot = + access.workingResolvedRoot(); + if (hasResolvedSemantics( + resolvedRoot)) { if (metrics != null) { metrics.incrementBexDocumentViewFrozenRootFallbackHits(); } - return BexValues.frozen(root).at(JsonPointer.split(absolutePointer)); + return authoritativeExact( + canonicalRoot, + resolvedRoot) + .at(JsonPointer.split( + absolutePointer)); + } + FrozenNode unresolvedCanonical = + workingCanonical != null + ? workingCanonical + : processorCanonical != null + ? processorCanonical + : canonicalRoot; + FrozenNode unresolvedResolved = + workingResolved != null + ? workingResolved + : processorResolved != null + ? processorResolved + : resolvedRoot; + if (unresolvedCanonical != null + || unresolvedResolved != null) { + if (metrics != null) { + metrics.incrementBexDocumentViewFrozenDirectHits(); + } + return authoritativeExact( + unresolvedCanonical, + unresolvedResolved); } if (metrics != null) { metrics.incrementBexDocumentViewUndefinedHits(); } return BexValues.undefined(); } + + private BexValue resolvedFromCurrentScope( + String absolutePointer) { + String scopePath = JsonPointer.canonicalize( + access.currentScopePath()); + if (JsonPointer.ROOT.equals(scopePath)) { + return null; + } + List scopeSegments = JsonPointer.split( + scopePath); + List absoluteSegments = JsonPointer.split( + absolutePointer); + if (absoluteSegments.size() <= scopeSegments.size() + || !absoluteSegments.subList( + 0, scopeSegments.size()).equals(scopeSegments)) { + return null; + } + FrozenNode resolvedScope = access.processorResolvedAt( + scopePath); + if (!hasResolvedSemantics(resolvedScope)) { + return null; + } + FrozenNode canonicalScope = access.processorCanonicalAt( + scopePath); + BexValue descendant = authoritativeExact( + canonicalScope, + resolvedScope).at(absoluteSegments.subList( + scopeSegments.size(), absoluteSegments.size())); + return !descendant.isUndefined() + && hasSemanticContent(descendant) + ? descendant + : null; + } + + private boolean hasSemanticContent( + BexValue value) { + try { + value.isNull(); + return true; + } catch (RuntimeException failure) { + if (isUnavailableExactSemantic(failure)) { + return false; + } + throw failure; + } + } + + private static boolean hasResolvedSemantics( + FrozenNode resolved) { + return resolved != null + && !resolved.isReferenceOnly(); + } + + private static BexValue authoritativeExact( + FrozenNode canonical, + FrozenNode resolved) { + if (resolved == null + || resolved.isReferenceOnly()) { + FrozenNode identity = canonical != null + ? canonical + : resolved; + return BexValues.exact( + canonical, + resolved, + identity != null ? identity.blueId() : null); + } + FrozenNode identity = + canonical != null + ? canonical + : resolved; + /* + * Hosted PROCESS has already established both lanes. Retain the + * canonical identity, but make the authoritative resolved cursor the + * structural value exposed to BEX. Returning an admitted exact value + * also prevents BexRuntime from attaching its standalone default Blue + * as a reference materializer and reopening a persisted scalar or + * object that this snapshot has already resolved. + */ + BexValue semantic = + BexValues.frozen( + resolved); + return BexValues.admittedExact( + resolved, + identity.blueId(), + semantic); + } + + /** + * Keeps BEX pointer traversal on the invocation-owned processor view. + * A fragmented descendant is therefore demanded through the strict + * request-local provider instead of a BEX engine's construction provider. + */ + private final class ProcessorDocumentCursor implements BexValue { + private final String absolutePointer; + private final BexValue delegate; + + private ProcessorDocumentCursor( + String absolutePointer, + BexValue delegate) { + this.absolutePointer = Objects.requireNonNull( + absolutePointer, "absolutePointer"); + this.delegate = Objects.requireNonNull(delegate, "delegate"); + } + + @Override + public boolean isExact() { + return delegate.isExact(); + } + + @Override + public String exactBlueId() { + return delegate.exactBlueId(); + } + + @Override + public boolean isUndefined() { + return delegate.isUndefined(); + } + + @Override + public boolean isNull() { + return delegate.isNull(); + } + + @Override + public boolean isScalar() { + return delegate.isScalar(); + } + + @Override + public boolean isObject() { + return delegate.isObject(); + } + + @Override + public boolean isList() { + return delegate.isList(); + } + + @Override + public BexValue get(String key) { + String childPointer = JsonPointer.append( + absolutePointer, key); + BexValue local = delegate.get(key); + if (local != null + && !local.isUndefined() + && hasSemanticContent(local)) { + return cursorFor(childPointer, local); + } + return cursorAt(childPointer); + } + + private boolean hasSemanticContent( + BexValue value) { + return ScopedProcessorExecutionContextBexDocumentView.this + .hasSemanticContent(value); + } + + @Override + public BexValue at(List pointerSegments) { + BexValue current = this; + for (String segment : pointerSegments) { + current = current.get(segment); + if (current.isUndefined()) { + return current; + } + } + return current; + } + + @Override + public BexValue at(String pointer) { + return at(JsonPointer.split(pointer)); + } + + @Override + public String asText() { + return delegate.asText(); + } + + @Override + public BigInteger asInteger() { + return delegate.asInteger(); + } + + @Override + public BigDecimal asNumber() { + return delegate.asNumber(); + } + + @Override + public boolean asBoolean() { + return delegate.asBoolean(); + } + + @Override + public List keys() { + return delegate.keys(); + } + + @Override + public int size() { + return delegate.size(); + } + + @Override + public Node toNode() { + return delegate.toNode(); + } + + @Override + public Object toSimple() { + return delegate.toSimple(); + } + } + + interface FrozenAccess { + String resolvePointer(String authoredPointer); + + String currentScopePath(); + + FrozenNode workingCanonicalAt(String absolutePointer); + + FrozenNode workingResolvedAt(String absolutePointer); + + FrozenNode processorCanonicalAt(String absolutePointer); + + FrozenNode processorResolvedAt(String absolutePointer); + + default Node processorDocumentAt(String absolutePointer) { + return null; + } + + FrozenNode workingCanonicalRoot(); + + FrozenNode workingResolvedRoot(); + } + + private static final class StepContextFrozenAccess + implements FrozenAccess { + private final BexWorkflowStepContext stepContext; + private final ProcessorExecutionContext processorContext; + + private StepContextFrozenAccess( + BexWorkflowStepContext stepContext) { + this.stepContext = + Objects.requireNonNull( + stepContext, "context"); + this.processorContext = + stepContext.processorContext(); + } + + @Override + public String resolvePointer( + String authoredPointer) { + return processorContext.resolvePointer( + authoredPointer); + } + + @Override + public String currentScopePath() { + return processorContext.scopePath(); + } + + @Override + public FrozenNode workingCanonicalAt( + String absolutePointer) { + return stepContext.workingCanonicalAt( + absolutePointer); + } + + @Override + public FrozenNode workingResolvedAt( + String absolutePointer) { + return stepContext.workingResolvedAt( + absolutePointer); + } + + @Override + public FrozenNode processorCanonicalAt( + String absolutePointer) { + return processorContext.canonicalFrozenAt( + absolutePointer); + } + + @Override + public FrozenNode processorResolvedAt( + String absolutePointer) { + return processorContext.resolvedFrozenAt( + absolutePointer); + } + + @Override + public Node processorDocumentAt( + String absolutePointer) { + return processorContext.documentAt( + absolutePointer); + } + + @Override + public FrozenNode workingCanonicalRoot() { + return stepContext.workingDocument() + .canonicalRoot(); + } + + @Override + public FrozenNode workingResolvedRoot() { + return stepContext.workingDocument() + .resolvedRoot(); + } + } } diff --git a/src/main/java/blue/coordination/processor/merge/ComputeRuntimeDefaultMergingProcessor.java b/src/main/java/blue/coordination/processor/merge/ComputeRuntimeDefaultMergingProcessor.java deleted file mode 100644 index 81cf48e..0000000 --- a/src/main/java/blue/coordination/processor/merge/ComputeRuntimeDefaultMergingProcessor.java +++ /dev/null @@ -1,228 +0,0 @@ -package blue.coordination.processor.merge; - -import blue.language.NodeProvider; -import blue.language.merge.MergingProcessor; -import blue.language.merge.NodeResolver; -import blue.language.model.Node; -import blue.language.utils.NodePathAccessor; -import blue.language.utils.NodePathEditor; -import blue.repo.coordination.Compute; -import blue.repo.coordination.ComputeDefinition; - -import java.util.ArrayList; -import java.util.IdentityHashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -final class ComputeRuntimeDefaultMergingProcessor implements MergingProcessor { - private final MergingProcessor delegate; - private final ThreadLocal>> suppressedComputeFields = - ThreadLocal.withInitial(IdentityHashMap::new); - - ComputeRuntimeDefaultMergingProcessor(MergingProcessor delegate) { - if (delegate == null) { - throw new IllegalArgumentException("delegate must not be null"); - } - this.delegate = delegate; - } - - @Override - public void process(Node target, Node source, NodeProvider nodeProvider, NodeResolver nodeResolver) { - stripComputeRuntimeDefaults(target, source); - List paths = computeProgramFieldPaths(source); - preserveComputeFields(target, source, paths); - delegate.process(target, source, nodeProvider, nodeResolver); - suppressComputeFields(source, paths); - } - - @Override - public void postProcess(Node target, Node source, NodeProvider nodeProvider, NodeResolver nodeResolver) { - stripComputeRuntimeDefaults(target, source); - Map> suppressedByNode = suppressedComputeFields.get(); - Map suppressed = suppressedByNode.remove(source); - try { - delegate.postProcess(target, source, nodeProvider, nodeResolver); - } finally { - restoreComputeFields(source, suppressed); - if (suppressedByNode.isEmpty()) { - suppressedComputeFields.remove(); - } - } - preserveComputeFields(target, source, suppressed); - preserveAuthoredMetadata(target, source); - } - - private List computeProgramFieldPaths(Node source) { - if (!isComputeNode(source)) { - return java.util.Collections.emptyList(); - } - List paths = new ArrayList(4); - addIfContainsBex(source, paths, "expr"); - addIfContainsBex(source, paths, "do"); - addIfContainsBex(source, paths, "constants"); - addIfContainsBex(source, paths, "functions"); - return paths; - } - - private void addIfContainsBex(Node node, List paths, String key) { - Node value = property(node, key); - if (containsBexOperator(value)) { - paths.add("/" + key); - } - } - - private boolean containsBexOperator(Node node) { - if (node == null) { - return false; - } - Map properties = node.getProperties(); - if (properties != null) { - if (properties.size() == 1) { - String key = properties.keySet().iterator().next(); - if (key != null && key.startsWith("$")) { - return true; - } - } - for (Node child : properties.values()) { - if (containsBexOperator(child)) { - return true; - } - } - } - if (node.getItems() != null) { - for (Node item : node.getItems()) { - if (containsBexOperator(item)) { - return true; - } - } - } - return false; - } - - private void preserveComputeFields(Node target, Node source, List paths) { - if (paths == null || paths.isEmpty()) { - return; - } - for (String path : paths) { - Node preserved = NodePathAccessor.getNode(source, path); - if (preserved != null) { - NodePathEditor.put(target, path, preserved.clone()); - } - } - } - - private void preserveComputeFields(Node target, Node source, Map fields) { - if (fields == null || fields.isEmpty()) { - return; - } - for (Map.Entry entry : fields.entrySet()) { - NodePathEditor.put(target, "/" + entry.getKey(), entry.getValue().clone()); - } - } - - private void suppressComputeFields(Node source, List paths) { - if (paths == null || paths.isEmpty() || source.getProperties() == null) { - return; - } - Map suppressed = new LinkedHashMap(); - for (String path : paths) { - String key = topLevelKey(path); - if (key != null && source.getProperties().containsKey(key)) { - suppressed.put(key, source.getProperties().remove(key)); - } - } - if (!suppressed.isEmpty()) { - suppressedComputeFields.get().put(source, suppressed); - } - } - - private void restoreComputeFields(Node source, Map fields) { - if (fields == null || fields.isEmpty()) { - return; - } - if (source.getProperties() == null) { - source.properties(new LinkedHashMap()); - } - source.getProperties().putAll(fields); - } - - private String topLevelKey(String path) { - if (path == null || path.length() < 2 || path.charAt(0) != '/') { - return null; - } - String key = path.substring(1); - return key.indexOf('/') >= 0 ? null : key; - } - - private void preserveAuthoredMetadata(Node target, Node source) { - if (source.getName() != null && target.getName() == null) { - target.name(source.getName()); - } - if (source.getDescription() != null && target.getDescription() == null) { - target.description(source.getDescription()); - } - } - - private void stripComputeRuntimeDefaults(Node target, Node source) { - if (!isComputeMerge(target, source)) { - return; - } - stripRuntimeDefault(target, source, "emitEvents"); - stripRuntimeDefault(target, source, "returnResult"); - } - - private boolean isComputeMerge(Node target, Node source) { - if (target == null || source == null || target.getProperties() == null || source.getProperties() == null) { - return false; - } - if (!source.getProperties().containsKey("emitEvents") && !source.getProperties().containsKey("returnResult")) { - return false; - } - return hasTypeBlueId(source, Compute.blueId()) - || hasTypeBlueId(target, Compute.blueId()) - || ("Compute".equals(target.getName()) - && target.getProperties().containsKey("emitEvents") - && target.getProperties().containsKey("returnResult")); - } - - private boolean isComputeNode(Node node) { - return hasTypeBlueId(node, Compute.blueId()) - || hasTypeBlueId(node, ComputeDefinition.blueId()) - || "Coordination/Compute".equals(typeValue(node)) - || "Coordination/Compute Definition".equals(typeValue(node)); - } - - private String typeValue(Node node) { - if (node == null || node.getType() == null || node.getType().getValue() == null) { - return null; - } - return String.valueOf(node.getType().getValue()); - } - - private Node property(Node node, String key) { - return node != null && node.getProperties() != null ? node.getProperties().get(key) : null; - } - - private void stripRuntimeDefault(Node target, Node source, String key) { - Map targetProperties = target.getProperties(); - Map sourceProperties = source.getProperties(); - Node sourceValue = sourceProperties.get(key); - if (sourceValue == null || sourceValue.getValue() == null) { - return; - } - Node targetValue = targetProperties.get(key); - if (targetValue == null || !Boolean.TRUE.equals(targetValue.getValue())) { - return; - } - Node stripped = targetValue.clone(); - stripped.value((Object) null); - targetProperties.put(key, stripped); - } - - private boolean hasTypeBlueId(Node node, String blueId) { - return node != null - && node.getType() != null - && blueId.equals(node.getType().getBlueId()); - } -} diff --git a/src/main/java/blue/coordination/processor/merge/CoordinationMerging.java b/src/main/java/blue/coordination/processor/merge/CoordinationMerging.java deleted file mode 100644 index 8ba3d74..0000000 --- a/src/main/java/blue/coordination/processor/merge/CoordinationMerging.java +++ /dev/null @@ -1,20 +0,0 @@ -package blue.coordination.processor.merge; - -import blue.language.Blue; -import blue.language.merge.MergingProcessor; - -public final class CoordinationMerging { - private CoordinationMerging() { - } - - public static void install(Blue blue) { - if (blue == null) { - throw new IllegalArgumentException("blue must not be null"); - } - MergingProcessor current = blue.getMergingProcessor(); - if (current instanceof ComputeRuntimeDefaultMergingProcessor) { - return; - } - blue.mergingProcessor(new ComputeRuntimeDefaultMergingProcessor(current)); - } -} diff --git a/src/main/java/blue/coordination/processor/support/CoordinationBexIntrinsicsSupport.java b/src/main/java/blue/coordination/processor/support/CoordinationBexIntrinsicsSupport.java new file mode 100644 index 0000000..8f75bf8 --- /dev/null +++ b/src/main/java/blue/coordination/processor/support/CoordinationBexIntrinsicsSupport.java @@ -0,0 +1,121 @@ +package blue.coordination.processor.support; + +import blue.bex.api.BexIntrinsicInvocation; +import blue.bex.api.BexIntrinsicProcessor; +import blue.bex.api.BexIntrinsicRegistry; +import blue.bex.value.BexValue; +import blue.bex.value.BexValues; +import blue.repo.common.CryptoEd25519Verify; +import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; +import org.bouncycastle.crypto.signers.Ed25519Signer; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Collections; +import java.util.Map; + +/** + * Closed intrinsic registry contributed by Coordination to hosted BEX + * workflows. + * + *

Intrinsic names, gas weights, and semantic identity are stable release + * inputs; callers may extend the returned registry without changing the + * built-in definitions.

+ */ +public final class CoordinationBexIntrinsicsSupport { + public static final String COMMON_CRYPTO_REGISTRY_IDENTITY = + "blue-repository/Common/CryptoEd25519Verify@" + + CryptoEd25519Verify.blueId(); + public static final String COMMON_CRYPTO_ED25519_VERIFY_COUNTER = + "signatureVerification"; + public static final long COMMON_CRYPTO_ED25519_VERIFY_GAS = 500L; + private static final Map COMMON_CRYPTO_ED25519_VERIFY_COUNTERS = + Collections.singletonMap( + COMMON_CRYPTO_ED25519_VERIFY_COUNTER, + COMMON_CRYPTO_ED25519_VERIFY_GAS); + + private CoordinationBexIntrinsicsSupport() { + } + + public static BexIntrinsicRegistry common() { + return registerCommon(BexIntrinsicRegistry.empty()); + } + + public static BexIntrinsicRegistry registerCommon(BexIntrinsicRegistry registry) { + BexIntrinsicRegistry base = registry != null ? registry : BexIntrinsicRegistry.empty(); + return base.with( + CryptoEd25519Verify.class, + COMMON_CRYPTO_REGISTRY_IDENTITY, + COMMON_CRYPTO_ED25519_VERIFY_COUNTERS, + commonCryptoEd25519Verify()); + } + + public static BexIntrinsicProcessor commonCryptoEd25519Verify() { + return invocation -> { + invocation.charge( + COMMON_CRYPTO_ED25519_VERIFY_COUNTER, + 1L, + "ed25519-signature-verification"); + return BexValues.scalar(verifyEd25519(invocation)); + }; + } + + private static boolean verifyEd25519(BexIntrinsicInvocation invocation) { + String publicKeyText = textField(invocation.field("publicKey")); + String message = textField(invocation.field("message")); + String signatureText = textField(invocation.field("signature")); + if (publicKeyText == null || message == null || signatureText == null) { + return false; + } + + byte[] publicKey = decodeBase64Url(publicKeyText, 32); + byte[] signature = decodeBase64Url(signatureText, 64); + if (publicKey == null || signature == null) { + return false; + } + + try { + Ed25519Signer verifier = new Ed25519Signer(); + verifier.init(false, new Ed25519PublicKeyParameters(publicKey, 0)); + byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8); + verifier.update(messageBytes, 0, messageBytes.length); + return verifier.verifySignature(signature); + } catch (RuntimeException ex) { + return false; + } + } + + private static String textField(BexValue value) { + if (value == null + || value.isUndefined() + || value.isNull() + || !"text".equals(BexValues.kind(value))) { + return null; + } + return value.asText(); + } + + private static byte[] decodeBase64Url(String value, int expectedLength) { + if (value == null) { + return null; + } + String normalized = value.trim(); + int remainder = normalized.length() % 4; + if (remainder == 1) { + return null; + } + if (remainder != 0) { + StringBuilder builder = new StringBuilder(normalized); + for (int i = remainder; i < 4; i++) { + builder.append('='); + } + normalized = builder.toString(); + } + try { + byte[] decoded = Base64.getUrlDecoder().decode(normalized); + return decoded.length == expectedLength ? decoded : null; + } catch (IllegalArgumentException ex) { + return null; + } + } +} diff --git a/src/main/java/blue/coordination/processor/support/CoordinationProcessHeaderSupport.java b/src/main/java/blue/coordination/processor/support/CoordinationProcessHeaderSupport.java new file mode 100644 index 0000000..4b95232 --- /dev/null +++ b/src/main/java/blue/coordination/processor/support/CoordinationProcessHeaderSupport.java @@ -0,0 +1,178 @@ +package blue.coordination.processor.support; + +import blue.language.api.NodeProviderOutcome; +import blue.language.identity.BlueIds; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.language.model.Schema; +import blue.language.provider.NodeProvider; +import blue.language.provider.NodeProviderResult; +import blue.language.provider.ProviderUnavailableException; +import blue.language.registry.NodeProviderWrapper; + +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Objects; + +/** + * Coordination-owned exact PROCESS-header normalization and materialization. + * + *

The implementation uses only current public Language APIs. In + * particular, callers provide the exact provider explicitly; this class does + * not reach into a {@code DocumentProcessor}'s private snapshot manager.

+ */ +public final class CoordinationProcessHeaderSupport { + + private CoordinationProcessHeaderSupport() { + } + + /** + * Materializes one exact reference through a strictly verified provider. + * Typed provider outcomes remain distinguishable in the thrown failure. + * + * @param provider exact public provider boundary + * @param reference exact pure reference + * @return owned canonical exact content without a redundant root BlueId + */ + public static Node materializeVerifiedExactReference( + NodeProvider provider, + Node reference) { + Node checked = Objects.requireNonNull(reference, "reference"); + if (!checked.isReferenceOnly()) { + throw new IllegalArgumentException( + "PROCESS header materialization requires a pure reference"); + } + String expected = BlueIds.requirePlainBlueId( + checked.getBlueId(), + "reference.blueId"); + NodeProviderResult result = NodeProviderWrapper.wrap( + Objects.requireNonNull(provider, "provider")) + .fetchResultByBlueId(expected); + if (result.outcome() == NodeProviderOutcome.UNAVAILABLE) { + throw new ProviderUnavailableException( + result.diagnostic().orElse( + "Verified PROCESS header provider is unavailable for " + + expected)); + } + if (result.outcome() == NodeProviderOutcome.INVALID_EVIDENCE) { + throw new IllegalArgumentException( + "Invalid PROCESS header evidence for " + expected + + ": " + + result.diagnostic().orElse("no diagnostic")); + } + if (result.outcome() == NodeProviderOutcome.NOT_FOUND) { + throw new IllegalStateException( + "Verified PROCESS header evidence was not found for " + + expected); + } + List nodes = result.nodes(); + if (nodes.size() != 1) { + throw new IllegalArgumentException( + "Verified PROCESS header provider returned " + + nodes.size() + " values for " + expected); + } + Node exact = canonicalExactCopy(nodes.get(0)); + if (exact.isReferenceOnly()) { + throw new IllegalArgumentException( + "Verified PROCESS header provider returned another pure reference for " + + expected); + } + String actual = DirectBlueIdCalculator.calculateBlueId(exact); + if (!expected.equals(actual)) { + throw new IllegalArgumentException( + "Verified PROCESS header content hashes to " + actual + + ", expected " + expected); + } + return exact; + } + + /** + * Returns an owned exact copy with resolved-provider provenance removed. + * Nominal type definitions are restored to their exact authored + * references, while anonymous type content remains inline. + * + * @param resolvedContent exact or resolved content owned by the caller + * @return canonical exact defensive copy + */ + public static Node canonicalExactCopy(Node resolvedContent) { + Node exact = Objects.requireNonNull( + resolvedContent, + "resolvedContent").clone(); + clearMaterializationProvenance( + exact, + new IdentityHashMap()); + return exact; + } + + private static void clearMaterializationProvenance( + Node node, + IdentityHashMap visited) { + if (node == null || visited.put(node, Boolean.TRUE) != null + || node.isReferenceOnly()) { + return; + } + if (node.getBlueId() != null) { + node.blueId(null); + } + node.type(nominalReference(node.getType())); + node.itemType(nominalReference(node.getItemType())); + node.keyType(nominalReference(node.getKeyType())); + node.valueType(nominalReference(node.getValueType())); + clearMaterializationProvenance(node.getType(), visited); + clearMaterializationProvenance(node.getItemType(), visited); + clearMaterializationProvenance(node.getKeyType(), visited); + clearMaterializationProvenance(node.getValueType(), visited); + clearMaterializationProvenance(node.getContracts(), visited); + clearMaterializationProvenance(node.getBlue(), visited); + if (node.getProperties() != null) { + for (Node child : node.getProperties().values()) { + clearMaterializationProvenance(child, visited); + } + } + if (node.getItems() != null) { + for (Node child : node.getItems()) { + clearMaterializationProvenance(child, visited); + } + } + clearSchema(node.getSchema(), visited); + } + + private static Node nominalReference(Node type) { + return type != null + && type.getBlueId() != null + && !type.isReferenceOnly() + ? new Node().blueId(type.getBlueId()) + : type; + } + + private static void clearSchema( + Schema schema, + IdentityHashMap visited) { + if (schema == null || schema.isReferenceOnly()) { + return; + } + if (schema.getBlueId() != null) { + schema.blueId(null); + } + clearMaterializationProvenance(schema.getRequired(), visited); + clearMaterializationProvenance(schema.getMinLength(), visited); + clearMaterializationProvenance(schema.getMaxLength(), visited); + clearMaterializationProvenance(schema.getMinimum(), visited); + clearMaterializationProvenance(schema.getMaximum(), visited); + clearMaterializationProvenance( + schema.getExclusiveMinimum(), visited); + clearMaterializationProvenance( + schema.getExclusiveMaximum(), visited); + clearMaterializationProvenance(schema.getMultipleOf(), visited); + clearMaterializationProvenance(schema.getMinItems(), visited); + clearMaterializationProvenance(schema.getMaxItems(), visited); + clearMaterializationProvenance(schema.getUniqueItems(), visited); + clearMaterializationProvenance(schema.getMinFields(), visited); + clearMaterializationProvenance(schema.getMaxFields(), visited); + if (schema.getEnum() != null) { + for (Node child : schema.getEnum()) { + clearMaterializationProvenance(child, visited); + } + } + } +} diff --git a/src/main/java/blue/coordination/processor/support/CoordinationRuntimeGasSupport.java b/src/main/java/blue/coordination/processor/support/CoordinationRuntimeGasSupport.java new file mode 100644 index 0000000..76edc2b --- /dev/null +++ b/src/main/java/blue/coordination/processor/support/CoordinationRuntimeGasSupport.java @@ -0,0 +1,500 @@ +package blue.coordination.processor.support; + +import blue.language.processor.GasChargeContext; +import blue.language.processor.GasMeter; +import blue.language.processor.ProcessorExecutionContext; +import blue.language.processor.RuntimeWorkSession; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.ref.WeakReference; +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.WeakHashMap; + +/** + * Manifest-backed Coordination runtime gas ledger. + * + *

The processor owns session lifecycle. This adapter opens deterministic + * one-use physical ledgers and records only counters declared by the bundled + * Coordination gas manifest. Nested Coordination components reuse the + * invocation's active physical ledger. The outermost component submits that + * ledger exactly once, so a member aggregate does not consume one runtime + * namespace for every nested charge.

+ */ +public final class CoordinationRuntimeGasSupport { + public static final String RESOURCE = + "blue/coordination/processor/coordination-gas-1.0.yaml"; + public static final String NAMESPACE = "coordination"; + + private static final Map WEIGHTS = + loadWeights(); + private static final Map NEXT_SEQUENCE = + new WeakHashMap(); + private static final Map> + ACTIVE_LEDGERS = + new WeakHashMap< + Object, + WeakReference>(); + + private CoordinationRuntimeGasSupport() { + } + + /** + * Opens one live Coordination ledger owned by {@code session}. + * + * @param session processor-owned runtime work session + * @return live ledger that must be submitted exactly once + */ + public static Ledger open(RuntimeWorkSession session) { + RuntimeWorkSession exact = + Objects.requireNonNull(session, "session"); + return acquire(exact, exact, null); + } + + /** + * Opens one live Coordination ledger through the public Contracts + * processor capability. + * + *

The raw {@link RuntimeWorkSession} is processor-internal in the + * modular Language API. Hosted Coordination processors therefore use this + * overload so every charge still enters the invocation's canonical work + * session exactly once without reaching through a split package.

+ * + * @param context live processor-owned invocation context + * @return live ledger that must be submitted exactly once + */ + public static Ledger open(ProcessorExecutionContext context) { + ProcessorExecutionContext exact = + Objects.requireNonNull(context, "context"); + return acquire(exact, null, exact); + } + + /** + * Runs one Coordination component against a shared nested ledger. + * + *

A component may synchronously invoke other Coordination components. + * Every nested call writes to the same live-bounded physical ledger; only + * the outermost successful boundary submits it. Gas exhaustion leaves the + * admitted prefix unsubmitted so the processor can propagate and retain + * that exact prefix through its normal session lifecycle.

+ * + * @param session processor-owned runtime work session + * @param work component work performed after the ledger is open + * @param component result type + * @return component result + */ + public static T inComponent( + RuntimeWorkSession session, + ComponentWork work) { + Objects.requireNonNull(work, "work"); + Ledger ledger = open(session); + Throwable failure = null; + try { + return work.run(); + } catch (RuntimeException | Error exception) { + failure = exception; + throw exception; + } finally { + if (failure != null + || !ledger.isSessionOpen()) { + ledger.abandon(); + } else { + ledger.submit(); + } + } + } + + /** Public-context counterpart of {@link #inComponent(RuntimeWorkSession, ComponentWork)}. */ + public static T inComponent( + ProcessorExecutionContext context, + ComponentWork work) { + Objects.requireNonNull(work, "work"); + Ledger ledger = open(context); + Throwable failure = null; + try { + return work.run(); + } catch (RuntimeException | Error exception) { + failure = exception; + throw exception; + } finally { + if (failure != null + || !ledger.isSessionOpen()) { + ledger.abandon(); + } else { + ledger.submit(); + } + } + } + + /** + * Charges and submits one isolated unit of Coordination-owned work. + * + * @param session processor-owned runtime work session + * @param counter Coordination gas counter to charge + * @param quantity number of counter units to charge + * @param context semantic context recorded with the charge + */ + public static void charge( + RuntimeWorkSession session, + String counter, + long quantity, + GasChargeContext context) { + if (quantity == 0L) { + return; + } + Ledger ledger = open(session); + boolean submitted = false; + try { + ledger.charge(counter, quantity, context); + ledger.submit(); + submitted = true; + } finally { + /* + * A rejected charge is already retained by RuntimeWorkSession. + * Do not submit a ledger whose attempted work did not complete. + */ + if (!submitted) { + ledger.abandon(); + } + } + } + + /** + * Charges one isolated unit through the public Contracts processor + * capability. + */ + public static void charge( + ProcessorExecutionContext context, + String counter, + long quantity, + GasChargeContext gasContext) { + if (quantity == 0L) { + return; + } + Ledger ledger = open(context); + boolean submitted = false; + try { + ledger.charge(counter, quantity, gasContext); + ledger.submit(); + submitted = true; + } finally { + if (!submitted) { + ledger.abandon(); + } + } + } + + /** + * Returns the immutable manifest catalog for verification. + * + * @return immutable mapping from counter names to gas weights + */ + public static Map counterWeights() { + return WEIGHTS; + } + + private static synchronized int nextSequence( + Object owner) { + Integer current = NEXT_SEQUENCE.get(owner); + int sequence = current != null + ? current.intValue() + : 0; + if (sequence == Integer.MAX_VALUE) { + throw new IllegalStateException( + "Coordination runtime ledger sequence exhausted"); + } + NEXT_SEQUENCE.put( + owner, + Integer.valueOf(sequence + 1)); + return sequence; + } + + private static synchronized Ledger acquire( + Object invocationOwner, + RuntimeWorkSession session, + ProcessorExecutionContext context) { + WeakReference reference = + ACTIVE_LEDGERS.get(invocationOwner); + ActiveLedger active = reference != null + ? reference.get() + : null; + if (active != null + && (active.submitted + || active.handles == 0)) { + ACTIVE_LEDGERS.remove(invocationOwner); + active = null; + } + if (active != null && active.abandoned) { + throw new IllegalStateException( + "Abandoned Coordination runtime ledger is still closing"); + } + Thread threadOwner = Thread.currentThread(); + if (active != null && active.owner != threadOwner) { + throw new IllegalStateException( + "Concurrent Coordination runtime ledger ownership is not " + + "supported for one work session"); + } + if (active == null) { + int sequence = nextSequence(invocationOwner); + String physicalNamespace = + NAMESPACE + "." + String.format( + java.util.Locale.ROOT, + "%08d", + Integer.valueOf(sequence)); + active = new ActiveLedger( + session != null + ? session.openLedger( + physicalNamespace, + WEIGHTS) + : context.newRuntimeGasLedger( + physicalNamespace, + WEIGHTS), + threadOwner); + ACTIVE_LEDGERS.put( + invocationOwner, + new WeakReference( + active)); + } + active.handles++; + return new Ledger( + invocationOwner, + session, + context, + active); + } + + private static synchronized void submit( + Ledger handle) { + handle.ensureHandleOpen(); + handle.closed = true; + ActiveLedger active = handle.active; + active.handles--; + boolean lastHandle = active.handles == 0; + if (lastHandle) { + removeActive(handle.owner, active); + } + if (active.abandoned) { + throw new IllegalStateException( + "Coordination runtime ledger was abandoned by nested work"); + } + if (!lastHandle) { + return; + } + try { + if (handle.session != null) { + handle.session.submit(active.ledger); + } else { + handle.context.submitRuntimeGasLedger(active.ledger); + } + active.submitted = true; + } catch (RuntimeException | Error failure) { + active.abandoned = true; + throw failure; + } + } + + private static synchronized void abandon( + Ledger handle) { + if (handle.closed) { + return; + } + handle.closed = true; + ActiveLedger active = handle.active; + active.abandoned = true; + active.handles--; + if (active.handles == 0) { + removeActive(handle.owner, active); + } + } + + private static void removeActive( + Object owner, + ActiveLedger expected) { + WeakReference reference = + ACTIVE_LEDGERS.get(owner); + if (reference == null + || reference.get() == expected) { + ACTIVE_LEDGERS.remove(owner); + } + } + + private static Map loadWeights() { + InputStream input = CoordinationRuntimeGasSupport.class + .getClassLoader() + .getResourceAsStream(RESOURCE); + if (input == null) { + throw new ExceptionInInitializerError( + "Missing Coordination gas manifest " + RESOURCE); + } + Map weights = + new LinkedHashMap(); + try (BufferedReader reader = + new BufferedReader( + new InputStreamReader( + input, + StandardCharsets.UTF_8))) { + String pendingName = null; + String line; + while ((line = reader.readLine()) != null) { + String trimmed = line.trim(); + if (trimmed.startsWith("- name:")) { + pendingName = requiredText( + trimmed.substring( + "- name:".length()), + "counter name"); + } else if (pendingName != null + && trimmed.startsWith("weight:")) { + String raw = requiredText( + trimmed.substring( + "weight:".length()), + "counter weight"); + long weight = Long.parseLong(raw); + if (weight < 0L + || weights.put( + pendingName, + Long.valueOf(weight)) != null) { + throw new IllegalArgumentException( + "Invalid or duplicate Coordination gas counter " + + pendingName); + } + pendingName = null; + } + } + } catch (IOException | RuntimeException exception) { + throw new ExceptionInInitializerError(exception); + } + if (weights.isEmpty()) { + throw new ExceptionInInitializerError( + "Coordination gas manifest contains no counters"); + } + return Collections.unmodifiableMap(weights); + } + + private static String requiredText( + String value, + String label) { + String exact = value != null + ? value.trim() + : ""; + if (exact.isEmpty()) { + throw new IllegalArgumentException( + label + " must be non-empty"); + } + return exact; + } + + /** + * One logical handle on an exactly-once-submitted Coordination child + * ledger. + */ + public static final class Ledger { + private final Object owner; + private final RuntimeWorkSession session; + private final ProcessorExecutionContext context; + private final ActiveLedger active; + private boolean closed; + + private Ledger( + Object owner, + RuntimeWorkSession session, + ProcessorExecutionContext context, + ActiveLedger active) { + this.owner = owner; + this.session = session; + this.context = context; + this.active = active; + } + + public void charge( + String counter, + long quantity, + GasChargeContext context) { + ensureOpen(); + if (!WEIGHTS.containsKey(counter)) { + throw new IllegalArgumentException( + "Unknown Coordination gas counter " + counter); + } + synchronized (active) { + ensureOpen(); + active.ledger.charge( + counter, + quantity, + context != null + ? context + : GasChargeContext.empty()); + } + } + + public void submit() { + CoordinationRuntimeGasSupport.submit(this); + } + + public boolean isSessionOpen() { + if (session != null) { + return session.isOpen(); + } + /* + * ProcessorExecutionContext exposes no public liveness probe. + * Requiring its semantic-output capability as a proxy is wrong: + * non-output workflow phases legitimately have no such + * capability. Public-context ledgers are owned and submitted + * synchronously inside the processor callback, before the host + * closes the context; submitRuntimeGasLedger remains the + * authoritative fail-closed liveness check. + */ + return true; + } + + private void abandon() { + CoordinationRuntimeGasSupport.abandon(this); + } + + private void ensureOpen() { + ensureHandleOpen(); + if (active.owner != Thread.currentThread()) { + throw new IllegalStateException( + "Coordination runtime ledger belongs to a different " + + "execution thread"); + } + if (active.submitted + || active.abandoned) { + throw new IllegalStateException( + "Coordination runtime ledger is already closed"); + } + } + + private void ensureHandleOpen() { + if (closed + || active.submitted) { + throw new IllegalStateException( + "Coordination runtime ledger is already closed"); + } + } + } + + /** Work executed inside one reusable Coordination component ledger. */ + public interface ComponentWork { + T run(); + } + + private static final class ActiveLedger { + private final GasMeter.ChildGasLedger ledger; + private int handles; + private boolean submitted; + private boolean abandoned; + private final Thread owner; + + private ActiveLedger( + GasMeter.ChildGasLedger ledger, + Thread owner) { + this.ledger = ledger; + this.owner = owner; + } + } +} diff --git a/src/main/java/blue/coordination/processor/support/CoordinationRuntimeLimitsSupport.java b/src/main/java/blue/coordination/processor/support/CoordinationRuntimeLimitsSupport.java new file mode 100644 index 0000000..84ee7a4 --- /dev/null +++ b/src/main/java/blue/coordination/processor/support/CoordinationRuntimeLimitsSupport.java @@ -0,0 +1,20 @@ +package blue.coordination.processor.support; + +/** + * Frozen Coordination 1.0 portable {@code PROCESS} limits. + * + *

The values are mirrored from the bundled + * {@code coordination-gas-1.0.yaml}. Processing-time limits and counters are + * enforced through the processor-owned Language runtime work session.

+ */ +public final class CoordinationRuntimeLimitsSupport { + public static final int MAX_COMPOSITE_MEMBERS = 1024; + public static final int MAX_ALL_TIMELINES_MEMBERS = 4096; + public static final int MAX_WORKFLOW_STEPS = 4096; + public static final int MAX_OPERATION_CANDIDATES_PER_CHANNEL = 4096; + public static final long MAX_COORDINATION_RUNTIME_GAS_PER_PROCESS = + 100_000L; + + private CoordinationRuntimeLimitsSupport() { + } +} diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java b/src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java index 3f4eeed..51ad4bc 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeDefinitionResolver.java @@ -2,8 +2,20 @@ import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; +import blue.language.processor.SelectedExecutableBody; import blue.language.snapshot.FrozenNode; +/** + * Resolves an inline Compute definition, a working-document pointer, or an + * exact definition reference exposed by the selected workflow body. + * + *

Pointer definitions are looked up for every invocation because an + * earlier workflow step may have changed the target. The resolved frozen + * identity then participates in the Compute plan key, preventing a cached + * program from observing stale definition content. Pure BlueId references + * are opened only through Language's invocation-bound verified selected-body + * capability.

+ */ final class ComputeDefinitionResolver { private final BexProcessingMetrics metrics; @@ -26,6 +38,12 @@ FrozenNode resolve(FrozenNode stepNode, if (definition == null || FrozenNodeUtil.isEmpty(definition)) { return null; } + if (definition.getReferenceBlueId() != null) { + return materializeExactDefinition( + definition, + context, + invocationMetrics); + } String text = FrozenNodeUtil.text(definition); if (text != null && !text.trim().isEmpty()) { String pointer = resolvePointer(text.trim(), context); @@ -35,7 +53,7 @@ FrozenNode resolve(FrozenNode stepNode, // changed by an earlier step can never reuse a stale plan. FrozenNode frozen = context.workingResolvedAt(pointer); if (frozen == null) { - context.processorContext().throwFatal("Compute definition not found: " + text); + context.throwFatal("Compute definition not found: " + text); return null; } incrementFrozenDirectHit(invocationMetrics); @@ -50,12 +68,18 @@ FrozenNode resolve(Node stepNode, StepExecutionContext context) { if (definition == null || NodeUtil.isEmpty(definition)) { return null; } + if (definition.getBlueId() != null) { + return materializeExactDefinition( + FrozenNode.fromNode(definition), + context, + metrics); + } String text = NodeUtil.text(definition); if (text != null && !text.trim().isEmpty()) { String pointer = resolvePointer(text.trim(), context); FrozenNode frozen = context.workingResolvedAt(pointer); if (frozen == null) { - context.processorContext().throwFatal("Compute definition not found: " + text); + context.throwFatal("Compute definition not found: " + text); return null; } incrementFrozenDirectHit(metrics); @@ -67,6 +91,37 @@ FrozenNode resolve(Node stepNode, StepExecutionContext context) { return FrozenNode.fromResolvedNode(definition); } + private FrozenNode materializeExactDefinition( + FrozenNode reference, + StepExecutionContext context, + BexProcessingMetrics invocationMetrics) { + SelectedExecutableBody selectedBody = + context.processorContext() + .selectedExecutableBody("steps"); + if (selectedBody == null) { + context.throwFatal( + "Compute definition reference requires the selected " + + "workflow steps capability"); + return null; + } + /* + * Effective workflow bodies may retain their exact provider BlueId + * beside resolved fields. Reopen that identity through Language's + * selected-body capability instead of giving hosted BEX the expanded + * view: static BEX literals must retain the provider-authored pure + * reference shape for their nested type values. + */ + FrozenNode exactReference = reference.isReferenceOnly() + ? reference + : FrozenNode.fromNode( + new Node().blueId( + reference.getReferenceBlueId())); + FrozenNode materialized = + selectedBody.materializeExactReference(exactReference); + incrementFrozenDirectHit(invocationMetrics); + return materialized; + } + String resolvePointer(String reference, StepExecutionContext context) { if (reference.startsWith("/")) { return reference; diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java b/src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java index 758edd9..4670742 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeEffectPlan.java @@ -1,7 +1,7 @@ package blue.coordination.processor.workflow; import blue.language.model.Node; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.FrozenJsonPatch; import blue.language.snapshot.FrozenNode; import java.util.ArrayList; @@ -19,6 +19,7 @@ final class ComputeEffectPlan { private final List patches; private final List events; private final boolean terminationRequested; + private final String terminationCause; private final String terminationReason; private final boolean changesetHandled; private final AtomicBoolean bufferingClaimed = new AtomicBoolean(); @@ -26,6 +27,7 @@ final class ComputeEffectPlan { ComputeEffectPlan(List patches, List events, boolean terminationRequested, + String terminationCause, String terminationReason, boolean changesetHandled) { List frozenPatches = new ArrayList(patches.size()); @@ -40,13 +42,28 @@ final class ComputeEffectPlan { this.patches = Collections.unmodifiableList(frozenPatches); List frozenEvents = new ArrayList(events.size()); for (Node event : events) { - // Repository-backed BEX values may already be resolved and therefore carry - // expanded type nodes. Preserve that valid resolved shape while taking an - // immutable snapshot of the event planned for later buffering. - frozenEvents.add(FrozenNode.fromResolvedNode(event)); + /* + * ComputeResultEmitter has already rebuilt and provenance-normalized + * the exact event. Freeze that authored exact shape. A resolved-mode + * freeze reattaches the calculated root BlueId beside the event fields + * when converted back to Node, which the hosted semantic boundary must + * reject as mixed reference/content. + */ + frozenEvents.add(FrozenNode.fromNode(event)); } this.events = Collections.unmodifiableList(frozenEvents); + if (terminationRequested + && (terminationCause == null || terminationCause.isEmpty())) { + throw new IllegalArgumentException( + "Compute termination cause must be non-empty Text"); + } + if (!terminationRequested + && (terminationCause != null || terminationReason != null)) { + throw new IllegalArgumentException( + "Absent Compute termination cannot carry cause or reason"); + } this.terminationRequested = terminationRequested; + this.terminationCause = terminationCause; this.terminationReason = terminationReason; this.changesetHandled = changesetHandled; } @@ -63,6 +80,10 @@ boolean terminationRequested() { return terminationRequested; } + String terminationCause() { + return terminationCause; + } + String terminationReason() { return terminationReason; } diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java b/src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java index b8e208e..ae6cd60 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeProgramNormalizer.java @@ -1,38 +1,33 @@ package blue.coordination.processor.workflow; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; import blue.language.snapshot.FrozenNode; +import blue.language.model.Nodes; import java.util.LinkedHashMap; import java.util.Map; +/** + * Produces the minimal authored Compute/definition projection admitted by + * hosted BEX. + * + *

Resolved inheritance and unrelated contract structure are deliberately + * excluded from the reusable plan identity. Registered type identities and + * authored program fields are retained exactly; this layer never rewrites + * repository aliases or performs contract processing.

+ */ final class ComputeProgramNormalizer { private static final String NORMALIZATION_VERSION = - "compute-program-v2|repository-aliases-3.0.0-rc.10"; + "compute-program-v6|exact-definition-identity|canonical-bex-source"; - private final RepositoryTypeAliasPreprocessor typeAliasPreprocessor; private final BexProcessingMetrics metrics; ComputeProgramNormalizer() { - this(new RepositoryTypeAliasPreprocessor(), null); + this(null); } ComputeProgramNormalizer(BexProcessingMetrics metrics) { - this(new RepositoryTypeAliasPreprocessor(), metrics); - } - - ComputeProgramNormalizer(RepositoryTypeAliasPreprocessor typeAliasPreprocessor) { - this(typeAliasPreprocessor, null); - } - - private ComputeProgramNormalizer(RepositoryTypeAliasPreprocessor typeAliasPreprocessor, - BexProcessingMetrics metrics) { - if (typeAliasPreprocessor == null) { - throw new IllegalArgumentException("typeAliasPreprocessor must not be null"); - } - this.typeAliasPreprocessor = typeAliasPreprocessor; this.metrics = metrics; } @@ -42,10 +37,9 @@ String normalizationVersion() { /** * Normalizes only the authored Compute projection of a frozen step. This - * avoids materializing unrelated resolved-contract content. The selected - * subtrees still use the mutable alias preprocessor as a conservative, - * semantics-preserving cold-path fallback; the resulting frozen plan is - * reused on every warm invocation. + * avoids materializing unrelated resolved-contract content. Registered + * type identities are preserved exactly; no runtime alias rewriting is + * applied. The resulting frozen plan is reused on every warm invocation. */ FrozenNode program(FrozenNode stepNode) { if (metrics != null) { @@ -59,7 +53,39 @@ FrozenNode definition(FrozenNode definitionNode) { metrics.incrementComputeDefinitionNormalizations(); metrics.incrementComputeDefinitionMaterializations(); } - return FrozenNode.fromResolvedNode(definition(frozenDefinitionInput(definitionNode))); + if (definitionNode == null) { + throw new IllegalArgumentException( + "definitionNode must not be null"); + } + /* + * A verified provider definition is already immutable exact content. + * Projecting it into a new object would replace the authored BlueId + * with a hash of the projection and discard metadata. BEX reads only + * constants/functions, so retaining the exact source is both safe and + * necessary for exact compiled-plan identity. + */ + return definitionNode; + } + + /** + * Projects the executable fields of an already-verified exact definition. + * + *

The exact provider node remains the plan/cache identity returned by + * {@link #definition(FrozenNode)}. BEX, however, requires its + * {@code constants}, {@code functions}, function arguments, and statement + * lists to be authored containers without inherited Blue metadata. Keep + * those two concerns separate instead of discarding the provider identity + * or asking BEX to interpret resolved contract structure.

+ */ + FrozenNode definitionSource(FrozenNode definitionNode) { + if (definitionNode == null) { + throw new IllegalArgumentException( + "definitionNode must not be null"); + } + return FrozenNode.fromResolvedNode( + definitionSource( + frozenDefinitionInput( + definitionNode))); } Node program(Node stepNode) { @@ -78,19 +104,40 @@ Node program(Node stepNode) { if (!properties.isEmpty()) { program.properties(properties); } - return typeAliasPreprocessor.preprocess(program); + return program; } Node definition(Node definitionNode) { + return definitionSource(definitionNode); + } + + private Node definitionSource(Node definitionNode) { + if (definitionNode == null) { + throw new IllegalArgumentException( + "definitionNode must not be null"); + } Node definition = new Node(); copyMetadata(definition, definitionNode); - Map properties = new LinkedHashMap(); - putIfMeaningful(properties, "constants", authoredMap(NodeUtil.property(definitionNode, "constants"))); - putIfMeaningful(properties, "functions", normalizeFunctions(NodeUtil.property(definitionNode, "functions"))); + Map properties = + new LinkedHashMap(); + putIfMeaningful( + properties, + "constants", + authoredMap( + NodeUtil.property( + definitionNode, + "constants"))); + putIfMeaningful( + properties, + "functions", + normalizeFunctions( + NodeUtil.property( + definitionNode, + "functions"))); if (!properties.isEmpty()) { definition.properties(properties); } - return typeAliasPreprocessor.preprocess(definition); + return definition; } private Node frozenProgramInput(FrozenNode source) { @@ -115,7 +162,8 @@ private Node frozenProgramInput(FrozenNode source) { private Node frozenDefinitionInput(FrozenNode source) { Node input = new Node(); copyMetadata(input, source); - Map properties = new LinkedHashMap(); + Map properties = + new LinkedHashMap(); copyFrozenProperty(properties, source, "constants"); copyFrozenProperty(properties, source, "functions"); if (!properties.isEmpty()) { @@ -131,7 +179,17 @@ private void copyFrozenProperty(Map target, ? source.getProperties().get(key) : null; if (value != null) { - target.put(key, value.toNode()); + Node mutable = value.toNode(); + if ("do".equals(key)) { + mutable = normalizeDo(mutable); + } else if ("functions".equals(key)) { + mutable = normalizeFunctions(mutable); + } else if ("constants".equals(key)) { + mutable = authoredMap(mutable); + } + if (mutable != null) { + target.put(key, mutable); + } } } @@ -169,10 +227,11 @@ private Node normalizeDo(Node doNode) { } private Node normalizeStatement(Node statement) { - if (NodeUtil.isEmpty(statement)) { + if (NodeUtil.isEmpty(statement) + || Nodes.isEmptyPlaceholder(statement)) { return new Node().properties("$return", new Node()); } - return statement.clone(); + return canonicalStaticSource(statement); } private Node authoredMap(Node node) { @@ -181,22 +240,60 @@ private Node authoredMap(Node node) { } Map properties = new LinkedHashMap(); for (Map.Entry entry : node.getProperties().entrySet()) { - properties.put(entry.getKey(), entry.getValue().clone()); + properties.put(entry.getKey(), + canonicalStaticSource(entry.getValue())); } return new Node().properties(properties); } private void putIfMeaningful(Map properties, String key, Node value) { if (hasAuthoredContent(value)) { - properties.put(key, value.clone()); + properties.put(key, canonicalStaticSource(value)); + } + } + + /** + * Restores canonical pure-reference shape inside a resolved executable + * view. Language may retain a provider BlueId beside resolved fields so + * hosts can inspect effective content. Those sibling fields are not part + * of the authored BEX literal and would make a transient Blue output + * invalid if compiled as object members. + */ + private Node canonicalStaticSource(Node source) { + if (source == null) { + return null; + } + if (source.getBlueId() != null) { + return new Node().blueId(source.getBlueId()); + } + Node normalized = source.clone(); + normalized.type(canonicalStaticSource(source.getType())); + normalized.itemType(canonicalStaticSource(source.getItemType())); + normalized.keyType(canonicalStaticSource(source.getKeyType())); + normalized.valueType(canonicalStaticSource(source.getValueType())); + normalized.blue(canonicalStaticSource(source.getBlue())); + normalized.contracts(canonicalStaticSource(source.getContracts())); + if (source.getItems() != null) { + java.util.List items = new java.util.ArrayList(); + for (Node item : source.getItems()) { + items.add(canonicalStaticSource(item)); + } + normalized.items(items); + } + if (source.getProperties() != null) { + Map properties = new LinkedHashMap(); + for (Map.Entry entry + : source.getProperties().entrySet()) { + properties.put(entry.getKey(), + canonicalStaticSource(entry.getValue())); + } + normalized.properties(properties); } + return normalized; } private boolean hasAuthoredContent(Node node) { - return node != null - && (node.getValue() != null - || (node.getItems() != null && !node.getItems().isEmpty()) - || (node.getProperties() != null && !node.getProperties().isEmpty())); + return !NodeUtil.isEmpty(node); } private void copyMetadata(Node target, Node source) { @@ -205,7 +302,7 @@ private void copyMetadata(Node target, Node source) { } target.name(source.getName()); target.description(source.getDescription()); - target.type(source.getType() != null ? source.getType().clone() : null); + target.type(canonicalStaticSource(source.getType())); } private void copyMetadata(Node target, FrozenNode source) { @@ -214,6 +311,8 @@ private void copyMetadata(Node target, FrozenNode source) { } target.name(source.getName()); target.description(source.getDescription()); - target.type(source.getType() != null ? source.getType().toNode() : null); + target.type(source.getType() != null + ? canonicalStaticSource(source.getType().toNode()) + : null); } } diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java b/src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java index 5f01c08..348adb3 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeProgramPlan.java @@ -1,7 +1,6 @@ package blue.coordination.processor.workflow; import blue.bex.api.BexProgramSource; -import blue.bex.compile.BexCompiledProgramKey; import blue.language.snapshot.FrozenNode; import java.util.ArrayDeque; @@ -22,11 +21,11 @@ final class ComputeProgramPlan { private final FrozenNode programNode; private final FrozenNode definitionNode; private final BexProgramSource source; - private final BexCompiledProgramKey sourceIdentity; private final String entry; private final long gasLimit; private final boolean emitEvents; private final boolean returnResult; + private final boolean processingEventRequired; private final long approximateWeightBytes; ComputeProgramPlan(FrozenNode programNode, @@ -50,17 +49,22 @@ final class ComputeProgramPlan { this.programNode = programNode; this.definitionNode = definitionNode; this.source = source; - this.sourceIdentity = BexCompiledProgramKey.from(source); this.entry = entry; this.gasLimit = gasLimit; this.emitEvents = emitEvents; this.returnResult = returnResult; + this.processingEventRequired = + containsProcessingEventReference( + programNode) + || containsProcessingEventReference( + definitionNode); this.approximateWeightBytes = approximateWeight(rawStepNode, rawDefinitionNode, programNode, definitionNode, + source.definitionNode().orElse(null), entry, - sourceIdentity); + source.kind()); } FrozenNode programNode() { @@ -75,10 +79,6 @@ BexProgramSource source() { return source; } - BexCompiledProgramKey sourceIdentity() { - return sourceIdentity; - } - String entry() { return entry; } @@ -95,6 +95,10 @@ boolean returnResult() { return returnResult; } + boolean processingEventRequired() { + return processingEventRequired; + } + long approximateWeightBytes() { return approximateWeightBytes; } @@ -103,8 +107,9 @@ private static long approximateWeight(FrozenNode rawStepNode, FrozenNode rawDefinitionNode, FrozenNode programNode, FrozenNode definitionNode, + FrozenNode sourceDefinitionNode, String entry, - BexCompiledProgramKey sourceIdentity) { + BexProgramSource.Kind sourceKind) { long weight = PLAN_OVERHEAD_BYTES; // Raw nodes approximate the independently retained structural cache // keys, while normalized nodes approximate the plan/source graph. @@ -115,10 +120,11 @@ private static long approximateWeight(FrozenNode rawStepNode, IdentityHashMap planNodes = new IdentityHashMap(); weight = saturatedAdd(weight, nodeWeight(programNode, planNodes)); weight = saturatedAdd(weight, nodeWeight(definitionNode, planNodes)); + weight = saturatedAdd(weight, + nodeWeight(sourceDefinitionNode, planNodes)); weight = saturatedAdd(weight, stringWeight(entry)); - weight = saturatedAdd(weight, stringWeight(sourceIdentity.programIdentity())); - weight = saturatedAdd(weight, stringWeight(sourceIdentity.definitionIdentity())); - weight = saturatedAdd(weight, stringWeight(sourceIdentity.entryName())); + weight = saturatedAdd(weight, + stringWeight(sourceKind.name())); return Math.max(PLAN_OVERHEAD_BYTES, weight); } @@ -174,6 +180,52 @@ private static long nodeWeight(FrozenNode root, return weight; } + private static boolean containsProcessingEventReference( + FrozenNode root) { + if (root == null) { + return false; + } + Deque pending = + new ArrayDeque(); + IdentityHashMap visited = + new IdentityHashMap(); + pending.add(root); + while (!pending.isEmpty()) { + FrozenNode current = + pending.removeFirst(); + if (current == null + || visited.put( + current, Boolean.TRUE) != null) { + continue; + } + Object value = current.getValue(); + if (value instanceof String) { + String text = (String) value; + if ("processingEvent".equals(text) + || text.startsWith( + "processingEvent/")) { + return true; + } + } + Map properties = + current.getProperties(); + if (properties != null) { + if (properties.containsKey( + "$processingEvent")) { + return true; + } + pending.addAll( + properties.values()); + } + List items = + current.getItems(); + if (items != null) { + pending.addAll(items); + } + } + return false; + } + private static void pushIfPresent(Deque pending, FrozenNode node) { if (node != null) { pending.push(node); diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java b/src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java index 433aca1..13833ee 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeResultEmitter.java @@ -3,22 +3,44 @@ import blue.bex.result.BexChangeset; import blue.bex.result.BexExecutionResult; import blue.bex.result.BexPatchEntry; +import blue.bex.value.BexBlueNodeWriter; import blue.bex.value.BexFrozenWriter; -import blue.bex.value.BexNodeWriter; import blue.bex.value.BexValue; import blue.bex.value.BexValues; import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; +import blue.coordination.processor.support.CoordinationProcessHeaderSupport; import blue.language.processor.WorkingDocument; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.FrozenJsonPatch; import blue.language.snapshot.FrozenNode; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; +/** + * Validates hosted-BEX output and translates it into processor-owned effects. + * + *

{@link #plan(BexExecutionResult, StepExecutionContext, boolean)} performs + * every structural conversion before the document is mutated. Only the + * resulting immutable {@link ComputeEffectPlan} may cross into + * {@link #buffer(ComputeEffectPlan, StepExecutionContext)}, where its one-shot + * claim prevents duplicate patch, event, or termination delivery.

+ */ final class ComputeResultEmitter { + private static final String CHANGESET_FIELD = "changeset"; + private static final String EVENTS_FIELD = "events"; + private static final String TERMINATION_FIELD = "termination"; + private static final String CAUSE_FIELD = "cause"; + private static final String REASON_FIELD = "reason"; + private static final String PATCH_OPERATION_FIELD = "op"; + private static final String PATCH_PATH_FIELD = "path"; + private static final String PATCH_VALUE_FIELD = "val"; + private static final String TEXT_KIND = "text"; + private static final String ADD_OPERATION = "add"; + private static final String REPLACE_OPERATION = "replace"; + private static final String REMOVE_OPERATION = "remove"; + private final BexProcessingMetrics metrics; ComputeResultEmitter() { @@ -43,7 +65,7 @@ ComputeEffectPlan plan(BexExecutionResult result, } catch (ComputeResultValidationException ex) { throw ex; } catch (RuntimeException ex) { - throw conversionFailure("changeset", ex); + throw conversionFailure(CHANGESET_FIELD, ex); } List events = emitEvents ? validatedEventNodes(result) @@ -52,11 +74,18 @@ ComputeEffectPlan plan(BexExecutionResult result, return new ComputeEffectPlan(patches, events, termination.requested, + termination.cause, termination.reason, returnedChangeset || !patches.isEmpty()); - } catch (ComputeResultValidationException ex) { - throw ex; } catch (RuntimeException ex) { + RuntimeException classified = + ComputeStepExecutor.classifiedBoundaryFailure(ex); + if (classified != null) { + throw classified; + } + if (ex instanceof ComputeResultValidationException) { + throw ex; + } throw new ComputeResultValidationException( "Compute result effects could not be converted: " + boundedDetail(ex), ex); } @@ -68,7 +97,7 @@ private List validatedEventNodes(BexExecutionResult result) { } catch (ComputeResultValidationException ex) { throw ex; } catch (RuntimeException ex) { - throw conversionFailure("events", ex); + throw conversionFailure(EVENTS_FIELD, ex); } } @@ -88,7 +117,9 @@ void buffer(ComputeEffectPlan plan, StepExecutionContext context) { } } if (plan.terminationRequested()) { - context.processorContext().terminateGracefully(plan.terminationReason()); + context.processorContext().terminate( + plan.terminationCause(), + plan.terminationReason()); if (metrics != null) { metrics.incrementSuccessfulComputeTerminationRequests(); } @@ -96,12 +127,18 @@ void buffer(ComputeEffectPlan plan, StepExecutionContext context) { } private boolean hasReturnedChangeset(BexExecutionResult result) { - BexValue changeset = result.value() != null ? result.value().get("changeset") : BexValues.undefined(); + BexValue value = executionValue(result); + BexValue changeset = value != null + ? value.get(CHANGESET_FIELD) + : BexValues.undefined(); return !changeset.isUndefined() && !changeset.isNull(); } private List eventNodes(BexExecutionResult result) { - BexValue events = result.value() != null ? result.value().get("events") : BexValues.undefined(); + BexValue value = executionValue(result); + BexValue events = value != null + ? value.get(EVENTS_FIELD) + : BexValues.undefined(); if (events.isUndefined() || events.isNull()) { events = result.events().asValue(); } @@ -117,22 +154,21 @@ private List eventNodes(BexExecutionResult result) { if (event == null || event.isUndefined() || event.isNull()) { throw invalid("Compute result events cannot contain undefined/null entries"); } - if (!event.isObject()) { - throw invalid("Compute result events must contain object entries"); - } try { - converted.add(BexNodeWriter.toNode(event)); + converted.add(semanticOutputNode(event)); } catch (RuntimeException ex) { throw new ComputeResultValidationException( - "Compute result event entry could not be converted", ex); + "Compute result event entry could not be converted", + ex); } } return converted; } private Termination termination(BexExecutionResult result) { - BexValue termination = result.value() != null - ? result.value().get("termination") + BexValue value = executionValue(result); + BexValue termination = value != null + ? value.get(TERMINATION_FIELD) : BexValues.undefined(); if (termination == null || termination.isUndefined() || termination.isNull()) { return Termination.absent(); @@ -141,23 +177,34 @@ private Termination termination(BexExecutionResult result) { throw invalid("Compute result termination must be an object"); } for (String key : termination.keys()) { - if (!"reason".equals(key)) { + if (!CAUSE_FIELD.equals(key) + && !REASON_FIELD.equals(key)) { throw invalid("Compute result termination contains unsupported properties"); } } - BexValue reason = termination.get("reason"); + BexValue cause = termination.get(CAUSE_FIELD); + if (cause == null || cause.isUndefined() || cause.isNull() + || !TEXT_KIND.equals(BexValues.kind(cause)) + || cause.asText().isEmpty()) { + throw invalid( + "Compute result termination cause must be non-empty Text"); + } + BexValue reason = termination.get(REASON_FIELD); if (reason == null || reason.isUndefined() || reason.isNull()) { - return Termination.requested(null); + return Termination.requested(cause.asText(), null); } - if (!"text".equals(BexValues.kind(reason))) { + if (!TEXT_KIND.equals(BexValues.kind(reason))) { throw invalid("Compute result termination reason must be Text"); } - return Termination.requested(reason.asText()); + return Termination.requested(cause.asText(), reason.asText()); } private List changesetPatches(BexExecutionResult result, StepExecutionContext context) { - BexValue changeset = result.value() != null ? result.value().get("changeset") : BexValues.undefined(); + BexValue value = executionValue(result); + BexValue changeset = value != null + ? value.get(CHANGESET_FIELD) + : BexValues.undefined(); BexChangeset accumulated = result.changeset(); if (changeset.isUndefined() || changeset.isNull()) { return patchesFromBexChangeset(accumulated, context); @@ -209,18 +256,31 @@ private WorkflowPatchEntry patchEntry(BexValue item, int index) { if (item == null || item.isUndefined() || item.isNull() || !item.isObject()) { throw invalid("Compute result changeset entry " + index + " must be an object"); } - String op = textValue(item.get("op")); - String path = textValue(item.get("path")); - if (!"add".equals(op) && !"replace".equals(op) && !"remove".equals(op)) { + String op = patchTextValue( + item.get(PATCH_OPERATION_FIELD), + index, + PATCH_OPERATION_FIELD); + String path = patchTextValue( + item.get(PATCH_PATH_FIELD), + index, + PATCH_PATH_FIELD); + if (!ADD_OPERATION.equals(op) + && !REPLACE_OPERATION.equals(op) + && !REMOVE_OPERATION.equals(op)) { throw invalid("Invalid patch op in Compute result changeset"); } if (path == null || path.trim().isEmpty()) { throw invalid("Compute result changeset entry " + index + " missing path"); } FrozenNode nodeValue = null; - if (!"remove".equals(op)) { - BexValue val = item.get("val"); - if (val.isUndefined()) { + BexValue val = item.get(PATCH_VALUE_FIELD); + if (REMOVE_OPERATION.equals(op)) { + if (item.keys().contains(PATCH_VALUE_FIELD)) { + throw invalid("Compute result changeset entry " + index + + " val must be absent for remove"); + } + } else { + if (val == null || val.isUndefined()) { throw invalid("Compute result changeset entry " + index + " missing val"); } nodeValue = freezePatchValue(val); @@ -228,14 +288,26 @@ private WorkflowPatchEntry patchEntry(BexValue item, int index) { return new WorkflowPatchEntry(op, path, nodeValue); } + private String patchTextValue(BexValue value, + int index, + String field) { + if (value == null || value.isUndefined() || value.isNull()) { + return null; + } + if (!TEXT_KIND.equals(BexValues.kind(value))) { + throw invalid("Compute result changeset entry " + index + + " field '" + field + "' must be Text"); + } + return value.asText(); + } + private FrozenJsonPatch toPatch(WorkflowPatchEntry entry, StepExecutionContext context) { - String normalizedOp = entry.op().trim().toLowerCase(); String path = resolvedPointer(entry.path(), context); - if ("remove".equals(normalizedOp)) { + if (REMOVE_OPERATION.equals(entry.op())) { return FrozenJsonPatch.remove(path); } - if ("add".equals(normalizedOp)) { + if (ADD_OPERATION.equals(entry.op())) { return FrozenJsonPatch.add(path, entry.val()); } // patchEntry has already restricted this branch to replace. @@ -247,8 +319,16 @@ private FrozenJsonPatch toPatch(BexPatchEntry entry, if (entry == null) { throw invalid("Compute result accumulated patch is incomplete"); } - String normalizedOp = entry.op().trim().toLowerCase(); - boolean remove = "remove".equals(normalizedOp); + String op = entry.op(); + boolean remove = REMOVE_OPERATION.equals(op); + if (!remove + && !ADD_OPERATION.equals(op) + && !REPLACE_OPERATION.equals(op)) { + throw invalid("Invalid accumulated patch op in Compute result"); + } + if (remove && entry.val() != null && !entry.val().isUndefined()) { + throw invalid("Compute result accumulated remove patch val must be absent"); + } if (!remove && (entry.val() == null || entry.val().isUndefined())) { throw invalid("Compute result patch value is required"); } @@ -257,7 +337,7 @@ private FrozenJsonPatch toPatch(BexPatchEntry entry, return FrozenJsonPatch.remove(path); } FrozenNode value = freezePatchValue(entry.val()); - if ("add".equals(normalizedOp)) { + if (ADD_OPERATION.equals(op)) { return FrozenJsonPatch.add(path, value); } // BexPatchEntry has already restricted this branch to replace. @@ -280,20 +360,33 @@ private void applyPatches(List patches, WorkingDocument.Preview preview = null; long frozenValueCount = frozenValueCount(patches); try { - preview = context.advanceWorkingDocumentFrozen(patches); + /* + * Keep provider/evidence exceptions visible to the Compute + * executor. StepExecutionContext's convenience wrapper maps every + * RuntimeException to runtime-fatal, which would erase Language's + * deterministic InvalidExecutionEvidence category. + */ + preview = context.workingDocument() + .previewAndApplyFrozenPatches(patches); if (preview == null) { return; } - if (metrics != null) { - metrics.addMetric("frozenPatchesHandedToLanguage", patches.size()); - metrics.addMetric("frozenPatchValuesHandedToLanguage", frozenValueCount); - } context.processorContext().applyPreviewedFrozenPatches(patches, preview); previewTransferred = true; if (metrics != null) { + metrics.addMetric("frozenPatchesHandedToLanguage", patches.size()); metrics.addMetric("frozenPatchValuesHandedToLanguage", frozenValueCount); } applied = true; + } catch (RuntimeException ex) { + RuntimeException classified = + ComputeStepExecutor.classifiedBoundaryFailure(ex); + if (classified != null) { + throw classified; + } + context.throwFatal( + "Working document preview failed: " + + boundedDetail(ex)); } finally { if (!previewTransferred && preview != null) { preview.close(); @@ -331,62 +424,270 @@ private boolean isAccumulatedChangesetValue(BexValue value, BexChangeset changes if (item == null || !item.isObject()) { return false; } - if (!entry.op().equals(textValue(item.get("op")))) { + if (!entry.op().equals( + textValue(item.get(PATCH_OPERATION_FIELD)))) { return false; } - String path = textValue(item.get("path")); + String path = textValue( + item.get(PATCH_PATH_FIELD)); if (!entry.authoredPath().equals(path) && !entry.absolutePath().equals(path)) { return false; } - BexValue val = item.get("val"); + BexValue val = item.get(PATCH_VALUE_FIELD); if (entry.val() == null || entry.val().isUndefined()) { - if (val != null && !val.isUndefined() && !val.isNull()) { + if (item.keys().contains(PATCH_VALUE_FIELD)) { return false; } } else if (val == null || val.isUndefined()) { return false; - } else if (entry.val() != val - && !Objects.equals(entry.val().toSimple(), val.toSimple())) { - // BEX's accumulated changeset view preserves the exact value object - // held by each BexPatchEntry. The identity branch is therefore the - // normal path; deep conversion remains only for an independently - // authored result that happens to be semantically equivalent. + } else if (!sameAdmittedValue( + entry.val(), + val)) { + /* + * BEX's accumulated changeset view normally preserves the + * exact value object held by each entry. Root output admission + * can replace that cursor with another exact value of the + * same identity. Both lanes are constant-time; never perform + * an unmetered semantic traversal merely to select this fast + * path. + */ return false; } } return true; } + private boolean sameAdmittedValue(BexValue left, + BexValue right) { + if (left == right) { + return true; + } + return left != null + && right != null + && left.isExact() + && right.isExact() + && left.exactBlueId().equals( + right.exactBlueId()); + } + + private BexValue executionValue( + BexExecutionResult result) { + return result != null + ? result.value() + : null; + } + FrozenNode freezePatchValue(BexValue value) { // BEX exposes the exact FrozenNode only through BexFrozenWriter. Avoid - // invoking that writer for ordinary values because rc2's fallback factory - // itself performs Node round trips. A non-null frozen BlueId identifies the + // invoking that writer for ordinary values because its general fallback + // performs Node round trips. A non-null frozen BlueId identifies the // zero-materialization FrozenNode-backed lane. - if (BexValues.frozenBlueId(value) != null) { + String exactBlueId = BexValues.frozenBlueId(value); + if (exactBlueId != null) { FrozenNode frozen = BexFrozenWriter.toFrozen(value); - if (frozen.isStrictCanonical()) { + /* + * A strict canonical reference returned by the frozen writer is + * already an exact, provider-verifiable patch value. Preserve it + * directly: resolving or rehashing that value in Coordination + * would defeat the released zero-materialization handoff. + * + * AdmittedExactBexValue is not FrozenNode-backed, so the writer's + * general fallback produces a pure reference even when admitted + * semantic content remains available. The branch below + * distinguishes that case from a genuinely opaque reference. + */ + if (frozen.isStrictCanonical() + && !frozen.isReferenceOnly()) { if (metrics != null) { metrics.incrementBexPatchFrozenDirectConversions(); } return frozen; } + if (frozen.isReferenceOnly()) { + /* + * BexFrozenWriter's general exact-value fallback is a pure + * reference. That is the correct zero-materialization result + * for an opaque exact value, but AdmittedExactBexValue also + * uses the fallback while retaining complete host-admitted + * semantic content. Preserve the former and materialize the + * latter: copying an exact document template into a patch + * must not turn it into an unopenable reference before later + * entries in the same atomic changeset address its children. + */ + Node semantic = semanticOutputView(value); + if (semantic.isReferenceOnly()) { + if (metrics != null) { + metrics.incrementBexPatchFrozenDirectConversions(); + } + return frozen; + } + return materializeExactPatchValue( + semantic, exactBlueId); + } + return materializeExactPatchValue(value, exactBlueId); } return materializePatchValue(value); } + private FrozenNode materializeExactPatchValue(BexValue value, + String expectedBlueId) { + long writerStart = System.nanoTime(); + try { + FrozenNode materialized = FrozenNode.fromNode( + semanticOutputNode(value)); + return requireExactPatchIdentity( + materialized, expectedBlueId); + } finally { + recordPatchValueMaterialization(writerStart); + } + } + + private FrozenNode materializeExactPatchValue( + Node semantic, + String expectedBlueId) { + long writerStart = System.nanoTime(); + try { + FrozenNode materialized = FrozenNode.fromNode( + CoordinationProcessHeaderSupport + .canonicalExactCopy(semantic)); + return requireExactPatchIdentity( + materialized, expectedBlueId); + } finally { + recordPatchValueMaterialization(writerStart); + } + } + + private FrozenNode requireExactPatchIdentity( + FrozenNode materialized, + String expectedBlueId) { + if (!expectedBlueId.equals(materialized.blueId())) { + throw invalid( + "Compute result exact patch value identity changed " + + "during semantic materialization: expected " + + expectedBlueId + + " but calculated " + + materialized.blueId()); + } + return materialized; + } + private FrozenNode materializePatchValue(BexValue value) { long writerStart = System.nanoTime(); try { - // This is the one unavoidable rc2 boundary for newly computed values: - // take a mutable BEX rendering and immediately freeze it as authored - // canonical content. No mutable value crosses into Language. - return FrozenNode.fromNode(BexNodeWriter.toNode(value)); + /* + * This is the required boundary for newly computed values. Use + * BEX's Blue-aware semantic writer so exact descendants of a + * transient aggregate retain their available content. The generic + * writer intentionally emits such descendants as transport + * references, which would make values read from + * $event/$processingEvent opaque inside a newly authored patch. + */ + return FrozenNode.fromNode( + semanticOutputNode(value)); } finally { - if (metrics != null) { - metrics.addBexNodeWriterNanos(System.nanoTime() - writerStart); - metrics.incrementBexPatchNodeMaterializations(); + recordPatchValueMaterialization(writerStart); + } + } + + private void recordPatchValueMaterialization(long writerStart) { + if (metrics != null) { + metrics.addBexNodeWriterNanos(System.nanoTime() - writerStart); + metrics.incrementBexPatchNodeMaterializations(); + } + } + + /** + * Materializes the semantic cursor retained by an admitted BEX value. + * + *

Local BEX deliberately exposes an admitted exact root as its compact + * canonical transport node. Its cursor still retains the transient + * semantic children that were proved by Language at admission. Rebuilding + * a transient cursor from the simple semantic view lets the Blue-aware + * writer include those children in the processor effect; otherwise a + * newly computed aggregate would escape with invocation-local child + * references that no later provider can open.

+ */ + private Node semanticOutputNode(BexValue value) { + /* + * BEX's semantic writer deliberately inlines locally available exact + * descendants. Those resolved views may carry provider BlueIds beside + * their fields, which is valid evidence internally but is not valid + * authored input to Language's hosted output boundary. Strip that + * provenance once, after rebuilding the complete semantic value. + */ + return CoordinationProcessHeaderSupport + .canonicalExactCopy( + semanticOutputView(value)); + } + + private Node semanticOutputView(BexValue value) { + if (value == null || !value.isExact()) { + return BexBlueNodeWriter.toSemanticNode(value); + } + try { + Node semantic = value.toNode(); + if (semantic.getItems() != null && value.isList()) { + List items = + new ArrayList(semantic.getItems().size()); + for (int index = 0; + index < semantic.getItems().size(); + index++) { + items.add( + semanticOutputView( + value.get( + String.valueOf(index)))); + } + semantic.items(items); + } + if (semantic.getProperties() != null + && value.isObject()) { + for (String key : + new ArrayList( + semantic.getProperties().keySet())) { + BexValue child = value.get(key); + if (child != null && !child.isUndefined()) { + semantic.getProperties().put( + key, + semanticOutputView(child)); + } + } + } + if (semantic.getContracts() != null + && value.isObject()) { + BexValue contracts = value.get("contracts"); + if (contracts != null + && !contracts.isUndefined()) { + semantic.contracts( + semanticOutputView(contracts)); + } + } + return semantic; + } catch (RuntimeException ex) { + if (isUnavailableExactReference(value, ex)) { + return new Node().blueId( + value.exactBlueId()); + } + throw ex; + } + } + + private boolean isUnavailableExactReference( + BexValue value, + RuntimeException failure) { + if (value == null || !value.isExact()) { + return false; + } + Throwable current = failure; + while (current != null) { + String message = current.getMessage(); + if (message != null + && message.contains( + "Semantic content is unavailable for exact Blue reference")) { + return true; } + current = current.getCause(); } + return false; } private String textValue(BexValue value) { @@ -415,13 +716,18 @@ private String boundedDetail(RuntimeException exception) { } private static final class Termination { - private static final Termination ABSENT = new Termination(false, null); + private static final Termination ABSENT = + new Termination(false, null, null); private final boolean requested; + private final String cause; private final String reason; - private Termination(boolean requested, String reason) { + private Termination(boolean requested, + String cause, + String reason) { this.requested = requested; + this.cause = cause; this.reason = reason; } @@ -429,8 +735,9 @@ private static Termination absent() { return ABSENT; } - private static Termination requested(String reason) { - return new Termination(true, reason); + private static Termination requested(String cause, + String reason) { + return new Termination(true, cause, reason); } } } diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java b/src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java index 9aa37eb..90d4753 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeResultValidationException.java @@ -1,5 +1,9 @@ package blue.coordination.processor.workflow; +/** + * Signals that a deterministic Compute result violates the hosted + * Coordination result contract. + */ final class ComputeResultValidationException extends RuntimeException { ComputeResultValidationException(String message) { super(message); diff --git a/src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java b/src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java index 168be75..5339c6e 100644 --- a/src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java +++ b/src/main/java/blue/coordination/processor/workflow/ComputeStepExecutor.java @@ -4,15 +4,36 @@ import blue.bex.api.BexEngine; import blue.bex.api.BexExecutionContext; import blue.bex.api.BexProgramSource; +import blue.bex.gas.BexGasLimitExceededException; +import blue.bex.gas.BexHostGasExhaustion; import blue.bex.result.BexExecutionResult; import blue.coordination.processor.bex.BexProcessingMetrics; import blue.coordination.processor.bex.BexWorkflowContextFactory; import blue.language.model.Node; +import blue.language.processor.ExecutionEvidenceUnavailableException; +import blue.language.processor.GasLimitExceededException; +import blue.language.processor.InvalidExecutionEvidenceException; +import blue.language.processor.PortableLimitExceededException; +import blue.language.processor.ProcessorErrorCategory; +import blue.language.processor.ProcessorFailureException; import blue.language.processor.ProcessorFatalException; import blue.language.snapshot.FrozenNode; +import blue.language.runtime.BlueLanguage; import blue.repo.coordination.Compute; import blue.repo.coordination.SequentialWorkflowStep; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Set; + +/** + * Resolves, compiles, and executes a selected Compute step inside the current + * processor-owned workflow and gas session. + * + *

Immutable plans may be cached by exact identity, but semantic output + * admission, patches, events, and termination remain owned by the parent + * Contracts invocation.

+ */ public final class ComputeStepExecutor implements WorkflowStepExecutor, AutoCloseable { private final BexEngine bexEngine; private final long defaultGasLimit; @@ -27,6 +48,13 @@ public ComputeStepExecutor() { this(BexEngine.builder().build(), 100_000L); } + /** Creates a hosted executor over the exact borrowed Language runtime. */ + public ComputeStepExecutor(BlueLanguage language) { + this(BexEngine.builder() + .language(requireLanguage(language)) + .build(), 100_000L); + } + public ComputeStepExecutor(BexEngine bexEngine, long defaultGasLimit) { this(bexEngine, defaultGasLimit, @@ -86,7 +114,7 @@ public WorkflowStepResult execute(Compute step, StepExecutionContext context) { if (rawStepNode == null) { Node mutableStepNode = context.stepNodeRef(); if (mutableStepNode == null) { - context.processorContext().throwFatal("Compute step must have a raw step node"); + context.throwFatal("Compute step must have a raw step node"); return WorkflowStepResult.none(); } rawStepNode = FrozenNode.fromResolvedNode(mutableStepNode); @@ -116,7 +144,10 @@ public ComputeProgramPlan create() { }); ComputeProgramPlan computePlan = lookup.plan(); long contextStart = System.nanoTime(); - BexExecutionContext bexContext = contextFactory.create(context, computePlan.gasLimit()); + BexExecutionContext bexContext = contextFactory.create( + context, + computePlan.gasLimit(), + computePlan.processingEventRequired()); if (metrics != null) { metrics.addComputeContextBuildNanos(System.nanoTime() - contextStart); } @@ -124,10 +155,7 @@ public ComputeProgramPlan create() { BexExecutionResult result = bexEngine.compileAndExecute(computePlan.source(), bexContext); if (metrics != null) { metrics.addComputeCompileExecuteNanos(System.nanoTime() - executeStart); - metrics.addBexMetrics(result.metrics()); - } - if (result.gasUsed() > 0L) { - context.processorContext().consumeGas(result.gasUsed()); + metrics.addBexMetrics(result.metricsSnapshot()); } ComputeEffectPlan effectPlan = resultEmitter.plan(result, context, @@ -148,18 +176,23 @@ public ComputeProgramPlan create() { planCache.publish(lookup); return stepResult; } catch (ComputeResultValidationException ex) { + RuntimeException classified = classifiedBoundaryFailure(ex); + if (classified != null) { + throw classified; + } if (metrics != null) { metrics.incrementComputeResultValidationFailures(); } - context.processorContext().throwFatal("Invalid Compute result: " + ex.getMessage()); + context.throwFatal("Invalid Compute result: " + ex.getMessage()); return WorkflowStepResult.none(); } catch (ProcessorFatalException ex) { throw ex; - } catch (BexException ex) { - context.processorContext().throwFatal("Compute failed: " + ex.getMessage()); - return WorkflowStepResult.none(); } catch (RuntimeException ex) { - context.processorContext().throwFatal("Compute failed: " + ex.getMessage()); + RuntimeException classified = classifiedBoundaryFailure(ex); + if (classified != null) { + throw classified; + } + context.throwFatal("Compute failed: " + ex.getMessage()); return WorkflowStepResult.none(); } finally { if (metrics != null) { @@ -179,6 +212,57 @@ private long computeGasLimit(FrozenNode stepNode) { return parsed.longValue(); } + /** + * Returns the first authoritative processor/BEX boundary failure in causal + * order. Generic wrappers, including {@link BexException}, are deliberately + * transparent so they cannot change the category of their cause. + */ + static RuntimeException classifiedBoundaryFailure( + Throwable failure) { + Throwable current = failure; + Set visited = Collections.newSetFromMap( + new IdentityHashMap()); + while (current != null && visited.add(current)) { + if (current instanceof ProcessorFailureException + || current + instanceof ExecutionEvidenceUnavailableException + || current + instanceof InvalidExecutionEvidenceException + || current + instanceof PortableLimitExceededException + || current instanceof GasLimitExceededException) { + return (RuntimeException) current; + } + if (current instanceof BexHostGasExhaustion) { + RuntimeException hostFailure = + ((BexHostGasExhaustion) current).hostFailure(); + if (hostFailure instanceof GasLimitExceededException) { + return hostFailure; + } + } + if (current instanceof BexGasLimitExceededException) { + BexGasLimitExceededException exhaustion = + (BexGasLimitExceededException) current; + BexHostGasExhaustion hostExhaustion = + exhaustion.hostGasExhaustion(); + if (hostExhaustion != null + && hostExhaustion.hostFailure() + instanceof GasLimitExceededException) { + return hostExhaustion.hostFailure(); + } + return new ProcessorFailureException( + ProcessorErrorCategory.GasLimitExceeded, + "Compute exhausted its local BEX gas limit before " + + exhaustion.namespace() + + "." + + exhaustion.counterName(), + exhaustion); + } + current = current.getCause(); + } + return null; + } + /** Clears reusable Compute plans while keeping this executor usable. */ public void clearPlanCache() { planCache.clear(); @@ -208,6 +292,11 @@ private ComputeProgramPlan buildPlan(FrozenNode rawStepNode, FrozenNode definitionNode = rawDefinitionNode != null ? normalizer.definition(rawDefinitionNode) : null; + FrozenNode definitionSourceNode = + rawDefinitionNode != null + ? normalizer.definitionSource( + rawDefinitionNode) + : null; String normalizedEntry = FrozenNodeUtil.textProperty(programNode, "entry"); // The key is built from the authored effective entry. Retain the // normalized value in the source to preserve the pre-cache behavior. @@ -215,8 +304,11 @@ private ComputeProgramPlan buildPlan(FrozenNode rawStepNode, throw new BexException("Compute entry changed during normalization"); } long sourceStart = System.nanoTime(); - BexProgramSource source = definitionNode != null - ? BexProgramSource.withDefinition(programNode, definitionNode, normalizedEntry) + BexProgramSource source = definitionSourceNode != null + ? BexProgramSource.withDefinition( + programNode, + definitionSourceNode, + normalizedEntry) : BexProgramSource.inline(programNode); if (metrics != null) { metrics.incrementComputeProgramSourceBuilds(); @@ -233,4 +325,13 @@ private ComputeProgramPlan buildPlan(FrozenNode rawStepNode, rawDefinitionNode); } + private static BlueLanguage requireLanguage( + BlueLanguage language) { + if (language == null) { + throw new IllegalArgumentException( + "language must not be null"); + } + return language; + } + } diff --git a/src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java b/src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java index c26f818..d7bc46f 100644 --- a/src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java +++ b/src/main/java/blue/coordination/processor/workflow/FrozenNodeUtil.java @@ -1,21 +1,55 @@ package blue.coordination.processor.workflow; +import blue.language.model.Node; +import blue.coordination.processor.support.CoordinationProcessHeaderSupport; import blue.language.snapshot.FrozenNode; import java.math.BigInteger; +/** + * Strict scalar and property accessors for immutable workflow snapshots. + * + *

The methods preserve the distinction between absence and the wrong Blue + * scalar kind; callers receive deterministic validation failures instead of + * Java coercions.

+ */ final class FrozenNodeUtil { private FrozenNodeUtil() { } static FrozenNode property(FrozenNode node, String key) { - return node != null && node.getProperties() != null ? node.getProperties().get(key) : null; + return node != null && node.getProperties() != null + ? node.getProperties().get(key) + : null; + } + + static Node authoredOverlay(FrozenNode node) { + if (node == null) { + return null; + } + return CoordinationProcessHeaderSupport + .canonicalExactCopy( + node.toNode()); } static boolean isEmpty(FrozenNode node) { - return node == null || (node.getValue() == null - && (node.getItems() == null || node.getItems().isEmpty()) - && (node.getProperties() == null || node.getProperties().isEmpty())); + return node == null || (node.getName() == null + && node.getDescription() == null + && node.getType() == null + && node.getItemType() == null + && node.getKeyType() == null + && node.getValueType() == null + && node.getValue() == null + && node.getItems() == null + && (node.getProperties() == null + || node.getProperties().isEmpty()) + && node.getContracts() == null + && node.getReferenceBlueId() == null + && node.getSchema() == null + && node.getMergePolicy() == null + && node.getPreviousBlueId() == null + && node.getPosition() == null + && node.getBlue() == null); } static Object rawScalar(FrozenNode node) { @@ -25,7 +59,8 @@ static Object rawScalar(FrozenNode node) { if (node.getValue() != null) { return node.getValue(); } - if (node.getProperties() != null && node.getProperties().containsKey("value")) { + if (node.getProperties() != null + && node.getProperties().containsKey("value")) { return rawScalar(node.getProperties().get("value")); } return null; @@ -33,14 +68,23 @@ static Object rawScalar(FrozenNode node) { static String text(FrozenNode node) { Object raw = rawScalar(node); - return raw != null ? String.valueOf(raw) : null; + if (raw == null) { + return null; + } + if (!(raw instanceof String)) { + throw new IllegalArgumentException("Expected Text scalar"); + } + return (String) raw; } static String textProperty(FrozenNode node, String key) { return text(property(node, key)); } - static boolean booleanProperty(FrozenNode node, String key, boolean defaultValue) { + static boolean booleanProperty( + FrozenNode node, + String key, + boolean defaultValue) { Object raw = rawScalar(property(node, key)); if (raw == null) { return defaultValue; @@ -48,27 +92,21 @@ static boolean booleanProperty(FrozenNode node, String key, boolean defaultValue if (raw instanceof Boolean) { return ((Boolean) raw).booleanValue(); } - if (raw instanceof String) { - return Boolean.parseBoolean((String) raw); - } - return defaultValue; + throw new IllegalArgumentException("Expected Boolean scalar for " + key); } static Long integer(FrozenNode node) { Object raw = rawScalar(node); if (raw instanceof BigInteger) { - return Long.valueOf(((BigInteger) raw).longValue()); + return Long.valueOf(((BigInteger) raw).longValueExact()); } - if (raw instanceof Number) { + if (raw instanceof Byte || raw instanceof Short + || raw instanceof Integer || raw instanceof Long) { return Long.valueOf(((Number) raw).longValue()); } - if (raw instanceof String) { - try { - return Long.valueOf((String) raw); - } catch (NumberFormatException ignored) { - return null; - } + if (raw == null) { + return null; } - return null; + throw new IllegalArgumentException("Expected Integer scalar"); } } diff --git a/src/main/java/blue/coordination/processor/workflow/NodeUtil.java b/src/main/java/blue/coordination/processor/workflow/NodeUtil.java index 1b1a9e2..669ceeb 100644 --- a/src/main/java/blue/coordination/processor/workflow/NodeUtil.java +++ b/src/main/java/blue/coordination/processor/workflow/NodeUtil.java @@ -4,6 +4,12 @@ import java.util.Map; +/** + * Strict scalar and property accessors for mutable workflow input nodes. + * + *

This class mirrors {@link FrozenNodeUtil} at the authored-input boundary + * and intentionally performs no type coercion or reference materialization.

+ */ final class NodeUtil { private NodeUtil() { } @@ -17,9 +23,22 @@ static Node property(Node node, String key) { static boolean isEmpty(Node node) { return node == null - || (node.getValue() == null - && empty(node.getItems()) - && empty(node.getProperties())); + || (node.getName() == null + && node.getDescription() == null + && node.getType() == null + && node.getItemType() == null + && node.getKeyType() == null + && node.getValueType() == null + && node.getValue() == null + && node.getItems() == null + && empty(node.getProperties()) + && node.getContracts() == null + && node.getBlueId() == null + && node.getSchema() == null + && node.getMergePolicy() == null + && node.getPreviousBlueId() == null + && node.getPosition() == null + && node.getBlue() == null); } static Object rawScalar(Node node) { @@ -29,7 +48,8 @@ static Object rawScalar(Node node) { if (node.getValue() != null) { return node.getValue(); } - if (node.getProperties() != null && node.getProperties().containsKey("value")) { + if (node.getProperties() != null + && node.getProperties().containsKey("value")) { return rawScalar(node.getProperties().get("value")); } return null; @@ -37,14 +57,23 @@ static Object rawScalar(Node node) { static String text(Node node) { Object raw = rawScalar(node); - return raw != null ? String.valueOf(raw) : null; + if (raw == null) { + return null; + } + if (!(raw instanceof String)) { + throw new IllegalArgumentException("Expected Text scalar"); + } + return (String) raw; } static String textProperty(Node node, String key) { return text(property(node, key)); } - static boolean booleanProperty(Node node, String key, boolean defaultValue) { + static boolean booleanProperty( + Node node, + String key, + boolean defaultValue) { Object raw = rawScalar(property(node, key)); if (raw == null) { return defaultValue; @@ -52,17 +81,11 @@ static boolean booleanProperty(Node node, String key, boolean defaultValue) { if (raw instanceof Boolean) { return ((Boolean) raw).booleanValue(); } - if (raw instanceof String) { - return Boolean.parseBoolean((String) raw); - } - return defaultValue; + throw new IllegalArgumentException("Expected Boolean scalar for " + key); } private static boolean empty(Map map) { return map == null || map.isEmpty(); } - private static boolean empty(Iterable items) { - return items == null || !items.iterator().hasNext(); - } } diff --git a/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java b/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java index 0295de4..40cd534 100644 --- a/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java +++ b/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlan.java @@ -8,52 +8,256 @@ import blue.repo.coordination.TriggerEvent; import blue.repo.coordination.UpdateDocument; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.IdentityHashMap; import java.util.List; -import java.util.Map; -/** Immutable execution structure for one exact frozen workflow contract. */ +/** + * Lazily populated execution structure for one exact frozen workflow + * contract. + * + *

The shell retains only the contract and one slot per runtime step. An + * executor and any static Update Document template are selected only after the + * runner has admitted that exact step's portable gas charges. Published step + * plans are immutable and may then be reused safely by concurrent + * executions. A slot hit requires both the selected PROCESS representation + * and its materialized exact step representation to match; semantic BlueId + * equivalence alone never transfers an invocation's exact node or static + * changeset into another representation.

+ */ final class SequentialWorkflowPlan { private static final long PLAN_BASE_BYTES = 128L; + private static final long STEP_SLOT_BYTES = 8L; private static final long STEP_PLAN_BYTES = 96L; + private static final long RETAINED_EXACT_CONTRACT_BYTES = 96L; + private static final long RETAINED_EXACT_STEP_BYTES = 96L; + private final FrozenNode contractNode; private final FrozenNode.ResolvedStructuralKey contractIdentity; - private final List steps; - private final long approximateWeightBytes; + private final StepPlan[] steps; + private long approximateWeightBytes; - private SequentialWorkflowPlan(FrozenNode contractNode, List steps) { - this.contractIdentity = contractNode != null ? contractNode.resolvedStructuralKey() : null; - this.steps = Collections.unmodifiableList(new ArrayList(steps)); - this.approximateWeightBytes = estimateWeight(contractNode, this.steps); + private SequentialWorkflowPlan( + FrozenNode contractNode, + int stepCount) { + this.contractNode = contractNode; + this.contractIdentity = contractNode != null + ? contractNode.resolvedStructuralKey() + : null; + this.steps = new StepPlan[stepCount]; + this.approximateWeightBytes = + estimateShellWeight(contractNode, stepCount); } - static SequentialWorkflowPlan build(FrozenNode contractNode, - List workflowSteps, - List> executors, - BexProcessingMetrics metrics) { - List frozenSteps = stepNodes(contractNode); - int plannedStepCount = Math.max(workflowSteps.size(), frozenSteps.size()); - List planned = new ArrayList(plannedStepCount); - for (int i = 0; i < plannedStepCount; i++) { - FrozenNode frozenStep = i < frozenSteps.size() ? frozenSteps.get(i) : null; - SequentialWorkflowStep workflowStep = i < workflowSteps.size() ? workflowSteps.get(i) : null; - planned.add(planStep(workflowStep, frozenStep, i, executors, metrics)); - } - return new SequentialWorkflowPlan(contractNode, planned); + static SequentialWorkflowPlan build( + FrozenNode contractNode, + List workflowSteps) { + if (workflowSteps == null) { + throw new IllegalArgumentException( + "workflowSteps must not be null"); + } + return new SequentialWorkflowPlan( + contractNode, + workflowSteps.size()); + } + + synchronized PlannedStep planAdmittedStep( + SequentialWorkflowStep step, + int index, + List> executors, + BexProcessingMetrics metrics) { + return planAdmittedStep( + step, + frozenStep(index), + index, + executors, + metrics); + } + + synchronized PlannedStep planAdmittedStep( + SequentialWorkflowStep step, + FrozenNode exactStep, + int index, + List> executors, + BexProcessingMetrics metrics) { + return planAdmittedStep( + step, + exactStep, + FrozenNodeUtil.property(exactStep, "changeset"), + index, + executors, + metrics); + } + + synchronized PlannedStep planAdmittedStep( + SequentialWorkflowStep step, + FrozenNode exactStep, + FrozenNode exactChangeset, + int index, + List> executors, + BexProcessingMetrics metrics) { + return planAdmittedStep( + step, + exactStep, + exactStep, + exactChangeset, + index, + executors, + metrics); + } + + PlannedStep planAdmittedStep( + SequentialWorkflowStep step, + FrozenNode exactStep, + FrozenNode selectedStepRepresentation, + int index, + List> executors, + BexProcessingMetrics metrics, + ExactChangesetFactory exactChangesetFactory) { + PlannedStep cached = reuseAdmittedStep( + step, + exactStep, + selectedStepRepresentation, + index); + if (cached != null) { + return cached; + } + FrozenNode exactChangeset = step instanceof UpdateDocument + && exactChangesetFactory != null + ? exactChangesetFactory.materialize() + : null; + return planAdmittedStep( + step, + exactStep, + selectedStepRepresentation, + exactChangeset, + index, + executors, + metrics); + } + + private synchronized PlannedStep planAdmittedStep( + SequentialWorkflowStep step, + FrozenNode exactStep, + FrozenNode selectedStepRepresentation, + FrozenNode exactChangeset, + int index, + List> executors, + BexProcessingMetrics metrics) { + if (index < 0) { + throw new IndexOutOfBoundsException( + "step index must not be negative"); + } + StepPlan cached = index < steps.length + ? steps[index] + : null; + if (cached != null + && cached.matches( + step, + exactStep, + selectedStepRepresentation)) { + return new PlannedStep( + cached, + exactStep, + false); + } + StepPlan planned = planStep( + step, + exactStep, + selectedStepRepresentation, + exactChangeset, + index, + executors, + metrics); + if (cached == null && index < steps.length) { + steps[index] = planned; + approximateWeightBytes = saturatedAdd( + approximateWeightBytes, + estimateStepWeight(planned)); + return new PlannedStep( + planned, + exactStep, + true); + } + /* + * A runtime-class or selected-representation mismatch cannot share an + * exact step/static plan. Execute the invocation-local fallback + * without replacing a plan that may be in use concurrently. + */ + return new PlannedStep( + planned, + exactStep, + false); + } + + private synchronized PlannedStep reuseAdmittedStep( + SequentialWorkflowStep step, + FrozenNode exactStep, + FrozenNode selectedStepRepresentation, + int index) { + if (index < 0) { + throw new IndexOutOfBoundsException( + "step index must not be negative"); + } + StepPlan cached = index < steps.length + ? steps[index] + : null; + if (cached == null + || !cached.matches( + step, + exactStep, + selectedStepRepresentation)) { + return null; + } + return new PlannedStep( + cached, + exactStep, + false); + } + + static StepPlan planStep( + SequentialWorkflowStep step, + FrozenNode frozenStep, + int index, + List> executors, + BexProcessingMetrics metrics) { + return planStep( + step, + frozenStep, + frozenStep, + FrozenNodeUtil.property(frozenStep, "changeset"), + index, + executors, + metrics); + } + + static StepPlan planStep( + SequentialWorkflowStep step, + FrozenNode frozenStep, + FrozenNode exactChangeset, + int index, + List> executors, + BexProcessingMetrics metrics) { + return planStep( + step, + frozenStep, + frozenStep, + exactChangeset, + index, + executors, + metrics); } - static StepPlan planStep(SequentialWorkflowStep step, - FrozenNode frozenStep, - int index, - List> executors, - BexProcessingMetrics metrics) { + private static StepPlan planStep( + SequentialWorkflowStep step, + FrozenNode frozenStep, + FrozenNode selectedStepRepresentation, + FrozenNode exactChangeset, + int index, + List> executors, + BexProcessingMetrics metrics) { WorkflowStepExecutor selected = null; if (step != null) { - for (WorkflowStepExecutor executor : executors) { + for (WorkflowStepExecutor executor + : executors) { if (metrics != null) { metrics.incrementWorkflowExecutorLookups(); } @@ -66,7 +270,8 @@ static StepPlan planStep(SequentialWorkflowStep step, StaticUpdatePlan staticUpdatePlan = null; if (step instanceof UpdateDocument && frozenStep != null) { StaticUpdatePlan candidate = StaticUpdatePlan.compile( - FrozenNodeUtil.property(frozenStep, "changeset"), metrics); + exactChangeset, + metrics); if (candidate.valid()) { staticUpdatePlan = candidate; if (metrics != null) { @@ -74,13 +279,14 @@ static StepPlan planStep(SequentialWorkflowStep step, } } } - return new StepPlan(index, + return new StepPlan( + index, stepKey(frozenStep, index), stepName(step), frozenStep, + selectedStepRepresentation, step != null ? step.getClass() : null, selected, - step instanceof TerminateProcessing, staticUpdatePlan); } @@ -88,37 +294,42 @@ FrozenNode.ResolvedStructuralKey contractIdentity() { return contractIdentity; } - int stepCount() { - return steps.size(); - } - - StepPlan step(int index) { - return steps.get(index); + synchronized StepPlan step(int index) { + return steps[index]; } - long approximateWeightBytes() { + synchronized long approximateWeightBytes() { return approximateWeightBytes; } - private static List stepNodes(FrozenNode contractNode) { - if (contractNode == null || contractNode.getProperties() == null) { - return Collections.emptyList(); + private FrozenNode frozenStep(int index) { + if (contractNode == null + || contractNode.getProperties() == null) { + return null; } - FrozenNode stepsNode = contractNode.getProperties().get("steps"); - if (stepsNode == null || stepsNode.getItems() == null) { - return Collections.emptyList(); + FrozenNode stepsNode = + contractNode.getProperties().get("steps"); + if (stepsNode == null + || stepsNode.getItems() == null + || index >= stepsNode.getItems().size()) { + return null; } - return stepsNode.getItems(); + return stepsNode.getItems().get(index); } - private static String stepKey(FrozenNode stepNode, int index) { - if (stepNode != null && stepNode.getName() != null && !stepNode.getName().trim().isEmpty()) { + private static String stepKey( + FrozenNode stepNode, + int index) { + if (stepNode != null + && stepNode.getName() != null + && !stepNode.getName().trim().isEmpty()) { return stepNode.getName().trim(); } return "Step" + (index + 1); } - private static String stepName(SequentialWorkflowStep step) { + private static String stepName( + SequentialWorkflowStep step) { if (step == null) { return "null sequential workflow step"; } @@ -134,57 +345,123 @@ private static String stepName(SequentialWorkflowStep step) { return step.getClass().getName(); } - private static long estimateWeight(FrozenNode contractNode, List steps) { - WeightEstimator identityEstimator = new WeightEstimator(); - WeightEstimator retainedStepEstimator = new WeightEstimator(); + private static long estimateShellWeight( + FrozenNode contractNode, + int stepCount) { long weight = PLAN_BASE_BYTES; - // The exact structural key retains representation data comparable to - // one traversal of the frozen graph. - weight = saturatedAdd(weight, identityEstimator.node(contractNode)); - for (StepPlan step : steps) { - weight = saturatedAdd(weight, STEP_PLAN_BYTES); - weight = saturatedAdd(weight, retainedStepEstimator.string(step.key)); - weight = saturatedAdd(weight, retainedStepEstimator.string(step.kind)); - weight = saturatedAdd(weight, retainedStepEstimator.node(step.frozenStep)); - if (step.staticUpdatePlan != null) { - weight = saturatedAdd(weight, step.staticUpdatePlan.approximateWeightBytes()); - } + if (contractNode != null) { + weight = saturatedAdd( + weight, + RETAINED_EXACT_CONTRACT_BYTES); + } + for (int index = 0; index < stepCount; index++) { + weight = saturatedAdd( + weight, + STEP_SLOT_BYTES); } return Math.max(1L, weight); } - private static long saturatedAdd(long left, long right) { - if (right > 0L && left > Long.MAX_VALUE - right) { + private static long estimateStepWeight( + StepPlan step) { + long weight = STEP_PLAN_BYTES; + weight = saturatedAdd( + weight, + stringWeight(step.key)); + weight = saturatedAdd( + weight, + stringWeight(step.kind)); + if (step.frozenStep != null) { + weight = saturatedAdd( + weight, + RETAINED_EXACT_STEP_BYTES); + } + if (step.staticUpdatePlan != null) { + weight = saturatedAdd( + weight, + step.staticUpdatePlan + .approximateWeightBytes()); + } + return weight; + } + + private static long saturatedAdd( + long left, + long right) { + if (right > 0L + && left > Long.MAX_VALUE - right) { return Long.MAX_VALUE; } return left + right; } + private static long stringWeight(String value) { + return value == null + ? 0L + : 40L + 2L * value.length(); + } + + static final class PlannedStep { + private final StepPlan step; + private final FrozenNode exactStep; + private final boolean published; + + private PlannedStep( + StepPlan step, + FrozenNode exactStep, + boolean published) { + this.step = step; + this.exactStep = exactStep; + this.published = published; + } + + StepPlan step() { + return step; + } + + FrozenNode exactStep() { + return exactStep; + } + + boolean published() { + return published; + } + } + static final class StepPlan { private final int index; private final String key; private final String kind; private final FrozenNode frozenStep; + private final String frozenStepBlueId; + private final FrozenNode.ResolvedStructuralKey + frozenStepRepresentation; + private final FrozenNode.ResolvedStructuralKey + selectedStepRepresentation; private final Class runtimeStepClass; private final WorkflowStepExecutor executor; - private final boolean declarativelyTerminal; private final StaticUpdatePlan staticUpdatePlan; - private StepPlan(int index, - String key, - String kind, - FrozenNode frozenStep, - Class runtimeStepClass, - WorkflowStepExecutor executor, - boolean declarativelyTerminal, - StaticUpdatePlan staticUpdatePlan) { + private StepPlan( + int index, + String key, + String kind, + FrozenNode frozenStep, + FrozenNode selectedStepRepresentation, + Class runtimeStepClass, + WorkflowStepExecutor executor, + StaticUpdatePlan staticUpdatePlan) { this.index = index; this.key = key; this.kind = kind; this.frozenStep = frozenStep; + this.frozenStepBlueId = exactBlueId(frozenStep); + this.frozenStepRepresentation = representationKey( + frozenStep); + this.selectedStepRepresentation = representationKey( + selectedStepRepresentation); this.runtimeStepClass = runtimeStepClass; this.executor = executor; - this.declarativelyTerminal = declarativelyTerminal; this.staticUpdatePlan = staticUpdatePlan; } @@ -208,76 +485,71 @@ WorkflowStepExecutor executor() { return executor; } - boolean matches(SequentialWorkflowStep step) { - return step == null ? runtimeStepClass == null : step.getClass() == runtimeStepClass; + boolean matches( + SequentialWorkflowStep step, + FrozenNode exactStep) { + return matches( + step, + exactStep, + exactStep); } - boolean declarativelyTerminal() { - return declarativelyTerminal; + boolean matches( + SequentialWorkflowStep step, + FrozenNode exactStep, + FrozenNode selectedRepresentation) { + boolean runtimeClassMatches = step == null + ? runtimeStepClass == null + : step.getClass() == runtimeStepClass; + String candidateBlueId = exactBlueId(exactStep); + return runtimeClassMatches + && (frozenStepBlueId == null + ? candidateBlueId == null + : frozenStepBlueId.equals(candidateBlueId)) + && equalRepresentation( + frozenStepRepresentation, + representationKey(exactStep)) + && equalRepresentation( + selectedStepRepresentation, + representationKey( + selectedRepresentation)); + } + + boolean matches(SequentialWorkflowStep step) { + return matches(step, frozenStep); } StaticUpdatePlan staticUpdatePlan() { return staticUpdatePlan; } - } - private static final class WeightEstimator { - private final IdentityHashMap visited = new IdentityHashMap(); - - private long node(FrozenNode node) { - if (node == null || visited.put(node, Boolean.TRUE) != null) { - return 0L; - } - long weight = 160L; - weight = saturatedAdd(weight, string(node.getName())); - weight = saturatedAdd(weight, string(node.getDescription())); - weight = saturatedAdd(weight, string(node.getReferenceBlueId())); - weight = saturatedAdd(weight, string(node.getMergePolicy())); - weight = saturatedAdd(weight, string(node.getPreviousBlueId())); - weight = saturatedAdd(weight, scalar(node.getValue())); - weight = saturatedAdd(weight, node(node.getType())); - weight = saturatedAdd(weight, node(node.getItemType())); - weight = saturatedAdd(weight, node(node.getKeyType())); - weight = saturatedAdd(weight, node(node.getValueType())); - weight = saturatedAdd(weight, node(node.getContracts())); - weight = saturatedAdd(weight, node(node.getBlue())); - if (node.getSchema() != null) { - weight = saturatedAdd(weight, 256L); - } - if (node.getItems() != null) { - weight = saturatedAdd(weight, 24L + 8L * node.getItems().size()); - for (FrozenNode item : node.getItems()) { - weight = saturatedAdd(weight, node(item)); - } + private static String exactBlueId(FrozenNode exactStep) { + if (exactStep == null) { + return null; } - if (node.getProperties() != null) { - weight = saturatedAdd(weight, 48L + 48L * node.getProperties().size()); - for (Map.Entry entry : node.getProperties().entrySet()) { - weight = saturatedAdd(weight, string(entry.getKey())); - weight = saturatedAdd(weight, node(entry.getValue())); - } - } - return weight; + return exactStep.isReferenceOnly() + ? exactStep.getReferenceBlueId() + : exactStep.blueId(); } - private long string(String value) { - return value == null ? 0L : 40L + 2L * value.length(); + private static FrozenNode.ResolvedStructuralKey representationKey( + FrozenNode node) { + return node != null + ? node.resolvedStructuralKey() + : null; } - private long scalar(Object value) { - if (value == null) { - return 0L; - } - if (value instanceof String) { - return string((String) value); - } - if (value instanceof BigInteger) { - return 48L + ((BigInteger) value).bitLength() / 8L; - } - if (value instanceof BigDecimal) { - return 64L; - } - return 24L; + private static boolean equalRepresentation( + FrozenNode.ResolvedStructuralKey left, + FrozenNode.ResolvedStructuralKey right) { + return left == null + ? right == null + : left.equals(right); } } + + /** Invocation-local expansion used only after an exact slot miss. */ + interface ExactChangesetFactory { + FrozenNode materialize(); + } } diff --git a/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java b/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java index 01c641f..e46ff5f 100644 --- a/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java +++ b/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCache.java @@ -77,6 +77,45 @@ synchronized SequentialWorkflowPlan getOrBuild(FrozenNode.ResolvedStructuralKey return plan; } + /** + * Refreshes retained weight after one admitted step publishes its immutable + * lazy plan. + * + *

The plan may have been evicted or the cache may have been cleared + * while a concurrent execution was compiling the step. In that case the + * caller still owns a valid plan, but there is no retained entry to + * update.

+ */ + synchronized void refreshWeight( + SequentialWorkflowPlan plan) { + if (plan == null + || plan.contractIdentity() == null) { + return; + } + CacheEntry retained = + entries.get(plan.contractIdentity()); + if (retained == null + || retained.plan != plan) { + return; + } + long refreshed = entryWeight(plan); + if (refreshed > maxWeightBytes) { + entries.remove(plan.contractIdentity()); + adjustWeight(-retained.weightBytes); + if (metrics != null) { + metrics.incrementWorkflowPlanCacheEvictions(); + } + return; + } + long delta = refreshed - retained.weightBytes; + if (delta == 0L) { + return; + } + retained.weightBytes = refreshed; + adjustWeight(delta); + evictToBounds(); + } + synchronized int size() { return entries.size(); } @@ -139,7 +178,7 @@ interface PlanFactory { private static final class CacheEntry { private final SequentialWorkflowPlan plan; - private final long weightBytes; + private long weightBytes; private CacheEntry(SequentialWorkflowPlan plan, long weightBytes) { this.plan = plan; diff --git a/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java b/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java index 510259a..d86179d 100644 --- a/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java +++ b/src/main/java/blue/coordination/processor/workflow/SequentialWorkflowRunner.java @@ -1,51 +1,143 @@ package blue.coordination.processor.workflow; import blue.bex.api.BexEngine; +import blue.coordination.processor.support.CoordinationBexIntrinsicsSupport; +import blue.coordination.processor.support.CoordinationRuntimeGasSupport; +import blue.coordination.processor.support.CoordinationRuntimeLimitsSupport; import blue.coordination.processor.bex.BexProcessingMetrics; import blue.coordination.processor.bex.BexWorkflowContextFactory; +import blue.coordination.processor.bex.ProcessingEventIdentityObserver; +import blue.language.processor.ExecutionEvidenceUnavailableException; +import blue.language.processor.GasChargeContext; +import blue.language.processor.GasLimitExceededException; import blue.language.processor.ProcessorExecutionContext; +import blue.language.processor.SelectedExecutableBody; import blue.language.processor.WorkingDocument; +import blue.language.model.Node; +import blue.language.runtime.BlueLanguage; import blue.language.snapshot.FrozenNode; import blue.repo.coordination.Compute; import blue.repo.coordination.SequentialWorkflow; import blue.repo.coordination.SequentialWorkflowStep; import blue.repo.coordination.TerminateProcessing; import blue.repo.coordination.TriggerEvent; +import blue.repo.coordination.UpdateDocument; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +/** + * Runs selected Sequential Workflow steps in declaration order within one + * atomic Contracts processing invocation. + * + *

Each successful step publishes its effects to later steps. Termination + * stops the remaining steps, while any failure is delegated to the parent + * processor so the complete Root transition rolls back.

+ */ public final class SequentialWorkflowRunner implements AutoCloseable { private final List> executors; private final BexProcessingMetrics metrics; + private final ProcessingEventIdentityObserver + processingEventIdentityObserver; private final SequentialWorkflowPlanCache planCache; + private final WorkflowStepTypeProfile stepTypeProfile; public SequentialWorkflowRunner() { this(defaultExecutors()); } + /** + * Creates the default workflow stack over the exact Language runtime + * already owned by the hosting application. + */ + public SequentialWorkflowRunner(BlueLanguage language) { + this(defaultExecutors(language)); + } + public SequentialWorkflowRunner(List> executors) { this(executors, null); } private SequentialWorkflowRunner(List> executors, BexProcessingMetrics metrics) { + this(executors, metrics, null); + } + + private SequentialWorkflowRunner( + List> + executors, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver + processingEventIdentityObserver) { this(executors, metrics, + processingEventIdentityObserver, SequentialWorkflowPlanCache.DEFAULT_MAX_ENTRIES, - SequentialWorkflowPlanCache.DEFAULT_MAX_WEIGHT_BYTES); + SequentialWorkflowPlanCache.DEFAULT_MAX_WEIGHT_BYTES, + WorkflowStepTypeProfile.publishedDefaults()); + } + + private SequentialWorkflowRunner( + List> + executors, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver processingEventIdentityObserver, + WorkflowStepTypeProfile stepTypeProfile) { + this(executors, + metrics, + processingEventIdentityObserver, + SequentialWorkflowPlanCache.DEFAULT_MAX_ENTRIES, + SequentialWorkflowPlanCache.DEFAULT_MAX_WEIGHT_BYTES, + stepTypeProfile); } SequentialWorkflowRunner(List> executors, BexProcessingMetrics metrics, int planCacheMaxEntries, long planCacheMaxWeightBytes) { + this( + executors, + metrics, + null, + planCacheMaxEntries, + planCacheMaxWeightBytes, + WorkflowStepTypeProfile.publishedDefaults()); + } + + SequentialWorkflowRunner( + List> + executors, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver + processingEventIdentityObserver, + int planCacheMaxEntries, + long planCacheMaxWeightBytes) { + this(executors, + metrics, + processingEventIdentityObserver, + planCacheMaxEntries, + planCacheMaxWeightBytes, + WorkflowStepTypeProfile.publishedDefaults()); + } + + private SequentialWorkflowRunner( + List> + executors, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver processingEventIdentityObserver, + int planCacheMaxEntries, + long planCacheMaxWeightBytes, + WorkflowStepTypeProfile stepTypeProfile) { if (executors == null) { throw new IllegalArgumentException("executors must not be null"); } this.executors = Collections.unmodifiableList(new ArrayList>(executors)); this.metrics = metrics; + this.processingEventIdentityObserver = + processingEventIdentityObserver; + this.stepTypeProfile = java.util.Objects.requireNonNull( + stepTypeProfile, "stepTypeProfile"); this.planCache = new SequentialWorkflowPlanCache(planCacheMaxEntries, planCacheMaxWeightBytes, metrics); @@ -53,40 +145,96 @@ private SequentialWorkflowRunner(List steps = workflow.getSteps(); + if (steps == null) { return; } + coordinationGas = CoordinationRuntimeGasSupport.open(context); FrozenNode contractNode = rawContractNode(context); - List steps = workflow.getSteps(); - SequentialWorkflowPlan plan = workflowPlan(contractNode, steps); + SelectedExecutableBody selectedSteps = + context.selectedExecutableBody("steps"); + if (steps.size() + > CoordinationRuntimeLimitsSupport + .MAX_WORKFLOW_STEPS) { + context.throwFatal("Sequential Workflow exceeds the portable " + + "step limit of " + + CoordinationRuntimeLimitsSupport + .MAX_WORKFLOW_STEPS); + return; + } + SequentialWorkflowPlan plan = null; WorkflowExecutionState executionState = new WorkflowExecutionState(); try (WorkingDocument workingDocument = rootWorkingDocument(context)) { for (int i = 0; i < steps.size(); i++) { - SequentialWorkflowStep step = steps.get(i); - SequentialWorkflowPlan.StepPlan stepPlan = i < plan.stepCount() - ? plan.step(i) - : SequentialWorkflowPlan.planStep(step, - null, - i, - executors, - metrics); - if (!stepPlan.matches(step)) { - stepPlan = SequentialWorkflowPlan.planStep(step, - stepPlan.frozenStep(), - i, - executors, - metrics); - } + charge( + coordinationGas, + context, + "workflowStepVisited", + "visit Sequential Workflow step"); + final SelectedStep selectedStep = selectStep( + contractNode, + selectedSteps, + i); + FrozenNode exactStep = selectedStep.exactStep(); + SequentialWorkflowStep mappedStep = steps.get(i); + FrozenNode profileChangeset = stepTypeProfile + .requiresExactChangeset( + mappedStep, + exactStep) + ? selectedStep.exactChangeset() + : null; + SequentialWorkflowStep step = + stepTypeProfile.materialize( + mappedStep, + exactStep, + profileChangeset); + charge( + coordinationGas, + context, + "workflowStepExecuted", + "execute Sequential Workflow step"); + chargeStepKind( + coordinationGas, + context, + step); if (metrics != null) { metrics.incrementWorkflowStepsExecuted(); } + if (plan == null) { + plan = workflowPlanAfterAdmission( + contractNode, + steps); + } + SequentialWorkflowPlan.PlannedStep planned = + plan.planAdmittedStep( + step, + exactStep, + selectedStep + .selectedRepresentation(), + i, + executors, + metrics, + selectedStep); + if (planned.published() + && contractNode != null) { + planCache.refreshWeight(plan); + } + SequentialWorkflowPlan.StepPlan stepPlan = + planned.step(); WorkflowStepResult result = executeStep(workflow, step, stepPlan, + planned.exactStep(), contractNode, executionState, context, + bexGasLedgerHost, workingDocument); if (result != null && result.hasValue()) { executionState.record(stepPlan.key(), result.value(), result.changesetHandled()); @@ -96,27 +244,108 @@ public void execute(SequentialWorkflow workflow, ProcessorExecutionContext conte } } } + } catch (ExecutionEvidenceUnavailableException ex) { + bexGasLedgerHost.discardForUnavailableEvidence(); + failure = ex; + throw ex; + } catch (RuntimeException | Error ex) { + failure = ex; + throw ex; } finally { + if (coordinationGas != null + && coordinationGas.isSessionOpen() + && !(failure + instanceof GasLimitExceededException)) { + try { + coordinationGas.submit(); + } catch (RuntimeException | Error gasFailure) { + if (failure != null + && failure != gasFailure) { + failure.addSuppressed(gasFailure); + } else { + throw gasFailure; + } + } + } + bexGasLedgerHost.submitToParent(failure); if (metrics != null) { metrics.addWorkflowRunnerNanos(System.nanoTime() - start); } } } + private void observeProcessingEvent( + ProcessorExecutionContext context) { + if (processingEventIdentityObserver == null + || !context.hasProcessEvent()) { + return; + } + FrozenNode processingEvent = + context.frozenProcessEvent(); + processingEventIdentityObserver.observe( + processingEvent, + processingEvent.blueId(), + ProcessingEventIdentityObserver.Boundary + .WORKFLOW); + } + + private static void chargeStepKind( + CoordinationRuntimeGasSupport.Ledger gas, + ProcessorExecutionContext context, + SequentialWorkflowStep step) { + if (step instanceof UpdateDocument) { + charge(gas, context, "updateDocumentStep", + "normalize Update Document step"); + } else if (step instanceof TriggerEvent) { + charge(gas, context, "triggerEventStep", + "normalize Trigger Event step"); + } else if (step instanceof TerminateProcessing) { + charge(gas, context, "terminateProcessingStep", + "normalize Terminate Processing step"); + } else if (step instanceof Compute) { + charge(gas, context, "computeStepEntered", + "enter Compute step"); + charge(gas, context, "computeDefinitionResolved", + "resolve Compute definition"); + } + } + + private static void charge( + CoordinationRuntimeGasSupport.Ledger gas, + ProcessorExecutionContext context, + String counter, + String reason) { + gas.charge( + counter, + 1L, + GasChargeContext.of( + context.scopePath(), + context.contractKey(), + null, + reason)); + } + private WorkflowStepResult executeStep(SequentialWorkflow workflow, SequentialWorkflowStep step, SequentialWorkflowPlan.StepPlan stepPlan, + FrozenNode exactStep, FrozenNode contractNode, WorkflowExecutionState executionState, ProcessorExecutionContext context, + WorkflowBexGasLedgerHost bexGasLedgerHost, WorkingDocument workingDocument) { if (step == null) { + bexGasLedgerHost.submitToParent(); context.throwFatal("Unsupported null sequential workflow step"); return WorkflowStepResult.none(); } WorkflowStepExecutor executor = stepPlan.executor(); if (executor == null) { - context.throwFatal("Unsupported sequential workflow step: " + stepPlan.kind()); + bexGasLedgerHost.submitToParent(); + context.throwFatal( + "Unsupported sequential workflow step: " + + stepPlan.kind() + + exactStepTypeSuffix(exactStep)); return WorkflowStepResult.none(); } WorkflowExecutionState.Snapshot stateView = executionState.snapshotView(); @@ -126,15 +355,28 @@ private WorkflowStepResult executeStep(SequentialWorkflow workflow, StepExecutionContext stepContext = new StepExecutionContext(context, workflow, step, - stepPlan.frozenStep(), + exactStep, contractNode, stepPlan.index(), stateView, stepPlan.staticUpdatePlan(), + bexGasLedgerHost, workingDocument); return executeSupported(executor, step, stepContext); } + private static String exactStepTypeSuffix(FrozenNode exactStep) { + if (exactStep == null || exactStep.getType() == null) { + return ""; + } + FrozenNode exactType = exactStep.getType(); + String identity = exactType.getReferenceBlueId(); + if (identity == null) { + identity = exactType.blueId(); + } + return identity == null ? "" : " (exact type " + identity + ")"; + } + @SuppressWarnings({"unchecked", "rawtypes"}) private WorkflowStepResult executeSupported(WorkflowStepExecutor executor, SequentialWorkflowStep step, @@ -143,7 +385,64 @@ private WorkflowStepResult executeSupported(WorkflowStepExecutor executor, } private static List> defaultExecutors() { - return executorsFor(BexEngine.builder().build(), 100_000L); + return executorsFor(BexEngine.builder() + .intrinsics(CoordinationBexIntrinsicsSupport.common()) + .build(), 100_000L); + } + + private static List> + defaultExecutors(BlueLanguage language) { + if (language == null) { + throw new IllegalArgumentException( + "language must not be null"); + } + return executorsFor(BexEngine.builder() + .language(language) + .intrinsics(CoordinationBexIntrinsicsSupport.common()) + .build(), 100_000L); + } + + /** Builds a hosted runner whose BEX engine borrows the exact runtime. */ + public static SequentialWorkflowRunner withLanguage( + BlueLanguage language, + long computeGasLimit, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver + processingEventIdentityObserver) { + return withLanguage( + language, + computeGasLimit, + metrics, + processingEventIdentityObserver, + WorkflowStepTypeProfile.publishedDefaults()); + } + + /** + * Creates the hosted workflow stack with exact alternate step identities. + */ + public static SequentialWorkflowRunner withLanguage( + BlueLanguage language, + long computeGasLimit, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver processingEventIdentityObserver, + WorkflowStepTypeProfile stepTypeProfile) { + if (language == null) { + throw new IllegalArgumentException( + "language must not be null"); + } + BexEngine engine = BexEngine.builder() + .language(language) + .intrinsics(CoordinationBexIntrinsicsSupport.common()) + .build(); + return new SequentialWorkflowRunner( + executorsFor( + engine, + computeGasLimit, + metrics, + processingEventIdentityObserver), + metrics, + processingEventIdentityObserver, + stepTypeProfile); } public static SequentialWorkflowRunner withBexEngine(BexEngine bexEngine) { @@ -161,13 +460,33 @@ public static SequentialWorkflowRunner withBexEngine(BexEngine bexEngine, public static SequentialWorkflowRunner withBexEngine(BexEngine bexEngine, long computeGasLimit, BexProcessingMetrics metrics) { + return withBexEngine( + bexEngine, + computeGasLimit, + metrics, + null); + } + + public static SequentialWorkflowRunner withBexEngine( + BexEngine bexEngine, + long computeGasLimit, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver + processingEventIdentityObserver) { if (bexEngine == null) { throw new IllegalArgumentException("bexEngine must not be null"); } if (computeGasLimit <= 0L) { throw new IllegalArgumentException("computeGasLimit must be positive"); } - return new SequentialWorkflowRunner(executorsFor(bexEngine, computeGasLimit, metrics), metrics); + return new SequentialWorkflowRunner( + executorsFor( + bexEngine, + computeGasLimit, + metrics, + processingEventIdentityObserver), + metrics, + processingEventIdentityObserver); } private static List> executorsFor(BexEngine bexEngine, @@ -178,7 +497,24 @@ private static List> exec private static List> executorsFor(BexEngine bexEngine, long computeGasLimit, BexProcessingMetrics metrics) { - BexWorkflowContextFactory bexContextFactory = new BexWorkflowContextFactory(metrics); + return executorsFor( + bexEngine, + computeGasLimit, + metrics, + null); + } + + private static List> + executorsFor( + BexEngine bexEngine, + long computeGasLimit, + BexProcessingMetrics metrics, + ProcessingEventIdentityObserver + processingEventIdentityObserver) { + BexWorkflowContextFactory bexContextFactory = + new BexWorkflowContextFactory( + metrics, + processingEventIdentityObserver); return Arrays.>asList( new TriggerEventStepExecutor(metrics), new ComputeStepExecutor(bexEngine, @@ -191,13 +527,17 @@ private static List> exec new UpdateDocumentStepExecutor(metrics)); } - private SequentialWorkflowPlan workflowPlan(final FrozenNode contractNode, - final List steps) { + private SequentialWorkflowPlan workflowPlanAfterAdmission( + final FrozenNode contractNode, + final List steps) { if (contractNode == null) { if (metrics != null) { metrics.incrementWorkflowPlanCacheMisses(); } - SequentialWorkflowPlan plan = SequentialWorkflowPlan.build(null, steps, executors, metrics); + SequentialWorkflowPlan plan = + SequentialWorkflowPlan.build( + null, + steps); if (metrics != null) { metrics.incrementWorkflowPlansBuilt(); } @@ -207,7 +547,9 @@ private SequentialWorkflowPlan workflowPlan(final FrozenNode contractNode, new SequentialWorkflowPlanCache.PlanFactory() { @Override public SequentialWorkflowPlan build() { - return SequentialWorkflowPlan.build(contractNode, steps, executors, metrics); + return SequentialWorkflowPlan.build( + contractNode, + steps); } }); } @@ -222,12 +564,20 @@ public void clearCaches() { } } - /** Current number of retained workflow plans. */ + /** + * Current number of retained workflow plans. + * + * @return number of plans retained by the workflow plan cache + */ public int workflowPlanCacheSize() { return planCache.size(); } - /** Current approximate retained workflow-plan weight. */ + /** + * Current approximate retained workflow-plan weight. + * + * @return approximate retained plan weight in bytes + */ public long workflowPlanCacheWeightBytes() { return planCache.weightBytes(); } @@ -243,12 +593,135 @@ public void close() { } private FrozenNode rawContractNode(ProcessorExecutionContext context) { - String pointer = contractPointer(context); - if (pointer == null) { - return context.frozenContractNode(); + return context.frozenContractNode(); + } + + private static SelectedStep selectStep( + FrozenNode contractNode, + SelectedExecutableBody selectedSteps, + int index) { + FrozenNode steps = selectedSteps != null + ? selectedSteps.exactBody() + : null; + FrozenNode selectedRepresentation = steps; + boolean selectedWholeBody = steps != null + && steps.isReferenceOnly(); + if (steps != null && steps.isReferenceOnly()) { + steps = selectedSteps.materializeExactReference(steps); + } + if (steps == null + && contractNode != null + && contractNode.getProperties() != null) { + steps = contractNode.getProperties().get("steps"); + } + if (steps == null + || steps.getItems() == null + || index < 0 + || index >= steps.getItems().size()) { + return new SelectedStep( + null, + selectedRepresentation, + selectedSteps); + } + FrozenNode exactStep = steps.getItems().get(index); + if (!selectedWholeBody) { + selectedRepresentation = exactStep; + } + if (exactStep != null + && exactStep.isReferenceOnly() + && selectedSteps != null) { + exactStep = selectedSteps.materializeExactReference( + exactStep); + } + return new SelectedStep( + exactStep, + selectedRepresentation, + selectedSteps); + } + + private static FrozenNode materializeExactChangeset( + FrozenNode exactStep, + SelectedExecutableBody selectedSteps) { + FrozenNode changeset = FrozenNodeUtil.property( + exactStep, "changeset"); + if (changeset == null || selectedSteps == null) { + return changeset; + } + if (changeset.isReferenceOnly()) { + changeset = selectedSteps.materializeExactReference( + changeset); + } + if (changeset.getItems() == null) { + return changeset; + } + List exactItems = null; + for (int index = 0; + index < changeset.getItems().size(); + index++) { + FrozenNode item = changeset.getItems().get(index); + FrozenNode exactItem = item != null + && item.isReferenceOnly() + ? selectedSteps.materializeExactReference(item) + : item; + if (exactItem != item && exactItems == null) { + exactItems = new ArrayList( + changeset.getItems().size()); + for (int copied = 0; copied < index; copied++) { + FrozenNode prior = changeset.getItems().get(copied); + exactItems.add(prior == null ? null : prior.toNode()); + } + } + if (exactItems != null) { + exactItems.add(exactItem == null + ? null + : exactItem.toNode()); + } + } + return exactItems == null + ? changeset + : FrozenNode.fromNode( + new Node().items(exactItems)); + } + + private static final class SelectedStep + implements SequentialWorkflowPlan.ExactChangesetFactory { + private final FrozenNode exactStep; + private final FrozenNode selectedRepresentation; + private final SelectedExecutableBody selectedSteps; + private FrozenNode exactChangeset; + private boolean exactChangesetMaterialized; + + private SelectedStep( + FrozenNode exactStep, + FrozenNode selectedRepresentation, + SelectedExecutableBody selectedSteps) { + this.exactStep = exactStep; + this.selectedRepresentation = selectedRepresentation; + this.selectedSteps = selectedSteps; + } + + private FrozenNode exactStep() { + return exactStep; + } + + private FrozenNode selectedRepresentation() { + return selectedRepresentation; + } + + private FrozenNode exactChangeset() { + if (!exactChangesetMaterialized) { + exactChangeset = materializeExactChangeset( + exactStep, + selectedSteps); + exactChangesetMaterialized = true; + } + return exactChangeset; + } + + @Override + public FrozenNode materialize() { + return exactChangeset(); } - FrozenNode frozen = context.canonicalFrozenAt(pointer); - return frozen != null ? frozen : context.frozenContractNode(); } private WorkingDocument rootWorkingDocument(ProcessorExecutionContext context) { @@ -263,21 +736,4 @@ private WorkingDocument rootWorkingDocument(ProcessorExecutionContext context) { return workingDocument; } - private String contractPointer(ProcessorExecutionContext context) { - String key = context.contractKey(); - if (key == null || key.trim().isEmpty()) { - return null; - } - String scope = context.scopePath(); - String contracts = appendPointer(scope == null || scope.trim().isEmpty() ? "/" : scope, "contracts"); - return appendPointer(contracts, key.trim()); - } - - private String appendPointer(String parent, String segment) { - String escaped = segment.replace("~", "~0").replace("/", "~1"); - if (parent == null || parent.isEmpty() || "/".equals(parent)) { - return "/" + escaped; - } - return parent + "/" + escaped; - } } diff --git a/src/main/java/blue/coordination/processor/workflow/StaticPayloadValidator.java b/src/main/java/blue/coordination/processor/workflow/StaticPayloadValidator.java deleted file mode 100644 index 31bad7d..0000000 --- a/src/main/java/blue/coordination/processor/workflow/StaticPayloadValidator.java +++ /dev/null @@ -1,49 +0,0 @@ -package blue.coordination.processor.workflow; - -import blue.language.snapshot.FrozenNode; - -import java.util.Map; - -final class StaticPayloadValidator { - private StaticPayloadValidator() { - } - - static boolean rejectBexOperators(FrozenNode node, StepExecutionContext context, String fieldName) { - String path = firstBexOperatorPath(node, ""); - if (path == null) { - return false; - } - context.processorContext().throwFatal(fieldName + " must be static; BEX operator object is not allowed at " + path); - return true; - } - - static String firstBexOperatorPath(FrozenNode node, String path) { - if (node == null) { - return null; - } - Map properties = node.getProperties(); - if (properties != null) { - if (properties.size() == 1) { - String key = properties.keySet().iterator().next(); - if (key != null && key.startsWith("$")) { - return path.isEmpty() ? "/" : path; - } - } - for (Map.Entry entry : properties.entrySet()) { - String found = firstBexOperatorPath(entry.getValue(), path + "/" + entry.getKey()); - if (found != null) { - return found; - } - } - } - if (node.getItems() != null) { - for (int i = 0; i < node.getItems().size(); i++) { - String found = firstBexOperatorPath(node.getItems().get(i), path + "/" + i); - if (found != null) { - return found; - } - } - } - return null; - } -} diff --git a/src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java b/src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java index 002bc63..56216d0 100644 --- a/src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java +++ b/src/main/java/blue/coordination/processor/workflow/StaticUpdatePlan.java @@ -2,14 +2,13 @@ import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.SelectedExecutableBody; +import blue.language.processor.FrozenJsonPatch; import blue.language.processor.model.JsonPatch; import blue.language.snapshot.FrozenNode; -import blue.language.utils.MergeReverser; import java.util.ArrayList; import java.util.Collections; -import java.util.IdentityHashMap; import java.util.List; import java.util.Map; @@ -22,6 +21,8 @@ * execution.

*/ final class StaticUpdatePlan { + private static final long RETAINED_EXACT_VALUE_BYTES = 96L; + private final List patches; private final String validationFailure; private final long approximateWeightBytes; @@ -39,23 +40,21 @@ static StaticUpdatePlan compile(FrozenNode changeset) { } static StaticUpdatePlan compile(FrozenNode changeset, BexProcessingMetrics metrics) { - String bexPath = StaticPayloadValidator.firstBexOperatorPath(changeset, ""); - if (bexPath != null) { - return invalid("Update Document changeset must be static; BEX operator object is not allowed at " - + bexPath); - } if (changeset == null || changeset.getItems() == null) { return invalid("Update Document changeset must be a static patch list"); } List templates = new ArrayList(changeset.getItems().size()); - MergeReverser mergeReverser = new MergeReverser(); long weight = 96L; for (int index = 0; index < changeset.getItems().size(); index++) { FrozenNode item = changeset.getItems().get(index); boolean resolvedConstruction = item != null && !item.isStrictCanonical(); - if (resolvedConstruction) { - Node authoredItem = mergeReverser.reverseToMinimizedOverlay(item.toNode()); - item = authoredItem != null ? FrozenNode.fromNode(authoredItem) : null; + if (item != null) { + Node authoredItem = + FrozenNodeUtil.authoredOverlay(item); + item = authoredItem != null + ? FrozenNode.fromNode( + authoredItem) + : null; } Map properties = item != null ? item.getProperties() : null; if (properties == null) { @@ -72,35 +71,46 @@ static StaticUpdatePlan compile(FrozenNode changeset, BexProcessingMetrics metri return invalid("Update Document changeset entry " + index + " field 'path' must be text"); } - if (op.value == null || op.value.trim().isEmpty()) { + if (op.value == null || op.value.isEmpty()) { return invalid("Update Document patch operation is required"); } - if (path.value == null || path.value.trim().isEmpty()) { + if (path.value == null || path.value.isEmpty()) { return invalid("Update Document patch path is required"); } - String normalizedOp = op.value.trim().toLowerCase(java.util.Locale.ROOT); JsonPatch.Op patchOp; - if ("add".equals(normalizedOp)) { + if ("add".equals(op.value)) { patchOp = JsonPatch.Op.ADD; - } else if ("replace".equals(normalizedOp)) { + } else if ("replace".equals(op.value)) { patchOp = JsonPatch.Op.REPLACE; - } else if ("remove".equals(normalizedOp)) { + } else if ("remove".equals(op.value)) { patchOp = JsonPatch.Op.REMOVE; } else { return invalid("Unsupported Update Document patch operation: " + op.value); } FrozenNode value = null; - if (patchOp != JsonPatch.Op.REMOVE) { + if (patchOp == JsonPatch.Op.REMOVE) { + if (properties.containsKey("val")) { + return invalid( + "Update Document patch value must be absent for remove"); + } + } else { value = properties.get("val"); if (value == null) { return invalid("Update Document patch value is required for operation: " + op.value); } - if (!value.isStrictCanonical()) { - // Compatibility-only boundary for callers that compiled the - // workflow graph in resolved construction mode. Preserve the - // exact visible authored shape and pay this conversion once. - value = FrozenNode.fromNode(value.toNode()); + boolean resolvedValue = + !value.isStrictCanonical(); + /* + * Strip provider provenance even when a resolved construction + * was frozen with a nominal BlueId and therefore reports a + * canonical container. Hosted runtime output may carry either + * a pure reference or exact expanded content, never both. + */ + value = FrozenNode.fromNode( + FrozenNodeUtil.authoredOverlay( + value)); + if (resolvedValue) { resolvedConstruction = true; } if (resolvedConstruction && metrics != null) { @@ -108,7 +118,12 @@ static StaticUpdatePlan compile(FrozenNode changeset, BexProcessingMetrics metri } } templates.add(new PatchTemplate(patchOp, path.value, value)); - weight += 72L + stringWeight(path.value) + frozenWeight(value); + /* + * Exact admitted values are retained by identity. Cache + * bookkeeping must not recursively walk or charge their payload. + */ + weight += 72L + stringWeight(path.value) + + (value != null ? RETAINED_EXACT_VALUE_BYTES : 0L); } return new StaticUpdatePlan(templates, null, weight); } @@ -150,43 +165,6 @@ private static long stringWeight(String value) { return value != null ? 40L + (long) value.length() * 2L : 0L; } - private static long frozenWeight(FrozenNode node) { - return frozenWeight(node, new IdentityHashMap()); - } - - private static long frozenWeight(FrozenNode node, - IdentityHashMap visited) { - if (node == null || visited.put(node, Boolean.TRUE) != null) { - return 0L; - } - long weight = 96L - + stringWeight(node.getName()) - + stringWeight(node.getDescription()) - + stringWeight(node.getReferenceBlueId()); - if (node.getValue() instanceof String) { - weight += stringWeight((String) node.getValue()); - } else if (node.getValue() != null) { - weight += 32L; - } - if (node.getItems() != null) { - weight += 16L + (long) node.getItems().size() * 8L; - for (FrozenNode item : node.getItems()) { - weight += frozenWeight(item, visited); - } - } - if (node.getProperties() != null) { - weight += 32L + (long) node.getProperties().size() * 40L; - for (Map.Entry entry : node.getProperties().entrySet()) { - weight += stringWeight(entry.getKey()) + frozenWeight(entry.getValue(), visited); - } - } - weight += frozenWeight(node.getType(), visited); - weight += frozenWeight(node.getItemType(), visited); - weight += frozenWeight(node.getKeyType(), visited); - weight += frozenWeight(node.getValueType(), visited); - return weight; - } - static final class PatchTemplate { private final JsonPatch.Op op; private final String authoredPath; @@ -199,15 +177,57 @@ private PatchTemplate(JsonPatch.Op op, String authoredPath, FrozenNode value) { } FrozenJsonPatch bind(String absolutePath) { + return bind( + absolutePath, null, null); + } + + FrozenJsonPatch bind( + String absolutePath, + StepExecutionContext context, + FrozenNode resolvedValue) { + FrozenNode boundValue = + resolvedValue != null + ? resolvedValue + : materializeSelectedValue( + context); if (op == JsonPatch.Op.ADD) { - return FrozenJsonPatch.add(absolutePath, value); + return FrozenJsonPatch.add( + absolutePath, boundValue); } if (op == JsonPatch.Op.REPLACE) { - return FrozenJsonPatch.replace(absolutePath, value); + return FrozenJsonPatch.replace( + absolutePath, boundValue); } return FrozenJsonPatch.remove(absolutePath); } + private FrozenNode materializeSelectedValue( + StepExecutionContext context) { + if (value == null + || !value.isReferenceOnly() + || context == null) { + return value; + } + SelectedExecutableBody selectedBody = + context.processorContext() + .selectedExecutableBody( + "steps"); + if (selectedBody == null) { + context.throwFatal( + "Update Document patch value reference requires " + + "the selected workflow steps capability"); + return value; + } + return selectedBody + .materializeExactReference( + value); + } + + boolean hasReferencedValue() { + return value != null + && value.isReferenceOnly(); + } + String authoredPath() { return authoredPath; } diff --git a/src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java b/src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java index 4898624..15492f6 100644 --- a/src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java +++ b/src/main/java/blue/coordination/processor/workflow/StepExecutionContext.java @@ -1,9 +1,12 @@ package blue.coordination.processor.workflow; +import blue.bex.api.BexGasLedgerHost; +import blue.bex.contracts.ProcessorExecutionContextBexGasLedgerHost; +import blue.coordination.processor.bex.BexWorkflowStepContext; import blue.language.model.Node; import blue.language.processor.ProcessorExecutionContext; import blue.language.processor.WorkingDocument; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.FrozenJsonPatch; import blue.language.processor.model.JsonPatch; import blue.language.snapshot.FrozenNode; import blue.repo.coordination.SequentialWorkflow; @@ -12,7 +15,14 @@ import java.util.Map; import java.util.Set; -public final class StepExecutionContext { +/** + * Per-step view of the current workflow, immutable selected bodies, prior + * results, working document, and workflow-scoped hosted-BEX adapter. + * + *

The context is invocation-local and never represents an independent + * embedded-document session.

+ */ +public final class StepExecutionContext implements BexWorkflowStepContext { private final ProcessorExecutionContext processorContext; private final SequentialWorkflow workflow; private final SequentialWorkflowStep step; @@ -24,6 +34,7 @@ public final class StepExecutionContext { private final WorkflowExecutionState.Snapshot workflowStateView; private final StaticUpdatePlan staticUpdatePlan; private final Node eventRef; + private final WorkflowBexGasLedgerHost workflowBexGasLedgerHost; private WorkingDocument workingDocument; public StepExecutionContext(ProcessorExecutionContext processorContext, @@ -43,6 +54,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, stepIndex, stepResults, null, + null, null); } @@ -63,6 +75,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, stepIndex, stepResults, null, + null, null); } @@ -84,6 +97,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, stepIndex, stepResults, null, + null, workingDocument); } @@ -106,6 +120,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, stepIndex, stepResults, handledChangesetSteps, + null, workingDocument); } @@ -128,6 +143,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, workflowStateView, null, true, + null, workingDocument); } @@ -139,6 +155,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, int stepIndex, WorkflowExecutionState.Snapshot workflowStateView, StaticUpdatePlan staticUpdatePlan, + WorkflowBexGasLedgerHost workflowBexGasLedgerHost, WorkingDocument workingDocument) { this(processorContext, workflow, @@ -151,6 +168,7 @@ public StepExecutionContext(ProcessorExecutionContext processorContext, workflowStateView, staticUpdatePlan, true, + workflowBexGasLedgerHost, workingDocument); } @@ -164,6 +182,7 @@ private StepExecutionContext(ProcessorExecutionContext processorContext, int stepIndex, Map stepResults, Set handledChangesetSteps, + WorkflowBexGasLedgerHost workflowBexGasLedgerHost, WorkingDocument workingDocument) { this(processorContext, workflow, @@ -176,6 +195,7 @@ private StepExecutionContext(ProcessorExecutionContext processorContext, WorkflowExecutionState.snapshotOf(stepResults, handledChangesetSteps), null, true, + workflowBexGasLedgerHost, workingDocument); } @@ -190,6 +210,7 @@ private StepExecutionContext(ProcessorExecutionContext processorContext, WorkflowExecutionState.Snapshot workflowStateView, StaticUpdatePlan staticUpdatePlan, boolean useSnapshotView, + WorkflowBexGasLedgerHost workflowBexGasLedgerHost, WorkingDocument workingDocument) { if (processorContext == null) { throw new IllegalArgumentException("processorContext must not be null"); @@ -209,7 +230,9 @@ private StepExecutionContext(ProcessorExecutionContext processorContext, ? workflowStateView : new WorkflowExecutionState().snapshotView(); this.staticUpdatePlan = staticUpdatePlan; - this.eventRef = processorContext.event(); + this.eventRef = + processorContext.occurrenceEvent(); + this.workflowBexGasLedgerHost = workflowBexGasLedgerHost; this.workingDocument = workingDocument; } @@ -217,6 +240,27 @@ public ProcessorExecutionContext processorContext() { return processorContext; } + public BexGasLedgerHost bexGasLedgerHost() { + return workflowBexGasLedgerHost != null + ? workflowBexGasLedgerHost + : new ProcessorExecutionContextBexGasLedgerHost(processorContext); + } + + /** + * Aborts the handler after first finalizing any active workflow-owned BEX + * execution adapter. Custom step executors should use this method instead + * of calling {@link ProcessorExecutionContext#throwFatal(String)} + * directly. + * + * @param reason deterministic fatal diagnostic + */ + public void throwFatal(String reason) { + if (workflowBexGasLedgerHost != null) { + workflowBexGasLedgerHost.submitToParent(); + } + processorContext.throwFatal(reason); + } + public SequentialWorkflow workflow() { return workflow; } @@ -314,7 +358,7 @@ WorkingDocument.Preview advanceWorkingDocument(List patches) { try { return workingDocument().previewAndApplyPatches(patches); } catch (RuntimeException ex) { - processorContext.throwFatal("Working document preview failed: " + ex.getMessage()); + throwFatal("Working document preview failed: " + ex.getMessage()); return null; } } @@ -326,7 +370,7 @@ WorkingDocument.Preview advanceWorkingDocumentFrozen(List patch try { return workingDocument().previewAndApplyFrozenPatches(patches); } catch (RuntimeException ex) { - processorContext.throwFatal("Working document preview failed: " + ex.getMessage()); + throwFatal("Working document preview failed: " + ex.getMessage()); return null; } } diff --git a/src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java b/src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java index e92fade..869ad6f 100644 --- a/src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java +++ b/src/main/java/blue/coordination/processor/workflow/TerminateProcessingStepExecutor.java @@ -1,10 +1,13 @@ package blue.coordination.processor.workflow; import blue.coordination.processor.bex.BexProcessingMetrics; +import blue.language.processor.ProcessorErrorCategory; +import blue.language.processor.ProcessorFailureException; +import blue.language.snapshot.FrozenNode; import blue.repo.coordination.SequentialWorkflowStep; import blue.repo.coordination.TerminateProcessing; -/** Buffers a graceful current-scope termination request. */ +/** Buffers an application-caused successful current-scope termination request. */ public final class TerminateProcessingStepExecutor implements WorkflowStepExecutor { private final BexProcessingMetrics metrics; @@ -23,7 +26,33 @@ public boolean supports(SequentialWorkflowStep step) { @Override public WorkflowStepResult execute(TerminateProcessing step, StepExecutionContext context) { - context.processorContext().terminateGracefully(step.getReason()); + FrozenNode rawStep = context.stepFrozenNode(); + String reason; + try { + FrozenNode reasonNode = + FrozenNodeUtil.property(rawStep, "reason"); + if (reasonNode != null + && FrozenNodeUtil.rawScalar(reasonNode) == null) { + throw new IllegalArgumentException( + "Expected Text scalar"); + } + reason = FrozenNodeUtil.text(reasonNode); + } catch (IllegalArgumentException exception) { + throw new ProcessorFailureException( + ProcessorErrorCategory.InvalidProcessingDocument, + "Terminate Processing reason must be Text", + exception); + } + if (FrozenNodeUtil.property(rawStep, "cause") != null) { + context.throwFatal( + "Terminate Processing does not accept an authored cause"); + return WorkflowStepResult.none(); + } + context.processorContext().terminate( + TerminateProcessing.blueId(), + reason == null || reason.isEmpty() + ? null + : reason); if (metrics != null) { metrics.incrementDeclarativeTerminationSteps(); } diff --git a/src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java b/src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java index 18cc471..083c75f 100644 --- a/src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java +++ b/src/main/java/blue/coordination/processor/workflow/TriggerEventStepExecutor.java @@ -2,12 +2,16 @@ import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; +import blue.coordination.processor.support.CoordinationProcessHeaderSupport; import blue.language.snapshot.FrozenNode; +import blue.language.identity.DirectBlueIdCalculator; import blue.repo.coordination.SequentialWorkflowStep; import blue.repo.coordination.TriggerEvent; -import java.util.Map; - +/** + * Normalizes a fixed Trigger Event step and delegates event emission to the + * parent Contracts processing boundary. + */ public final class TriggerEventStepExecutor implements WorkflowStepExecutor { private final BexProcessingMetrics metrics; @@ -29,29 +33,39 @@ public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext contex long stepStart = System.nanoTime(); try { if (step == null) { - context.processorContext().throwFatal("Trigger Event step payload is invalid"); + context.throwFatal("Trigger Event step payload is invalid"); return WorkflowStepResult.none(); } if (metrics != null) { metrics.incrementTriggerEventStepsExecuted(); } - FrozenNode rawEvent = FrozenNodeUtil.property(context.stepFrozenNode(), "event"); - if (!hasDeclaredEvent(context.stepFrozenNode())) { - context.processorContext().throwFatal("Trigger Event step must declare event payload"); - return WorkflowStepResult.none(); - } - if (StaticPayloadValidator.rejectBexOperators(rawEvent, - context, - "Trigger Event event")) { - return WorkflowStepResult.none(); - } - Node event = step.getEvent(); - if (isEmpty(event)) { - context.processorContext().throwFatal("Trigger Event step must declare event payload"); + FrozenNode rawStep = context.stepFrozenNode(); + Node event; + if (rawStep != null) { + if (rawStep.getProperties() == null + || !rawStep.getProperties().containsKey("event")) { + context.throwFatal( + "Trigger Event step must declare event payload"); + return WorkflowStepResult.none(); + } else { + FrozenNode rawEvent = + rawStep.getProperties().get("event"); + if (rawEvent == null) { + context.throwFatal( + "Trigger Event step must declare event payload"); + return WorkflowStepResult.none(); + } + event = exactEvent( + rawEvent, step, context); + } + } else if (step.getEvent() != null) { + event = step.getEvent().clone(); + } else { + context.throwFatal("Trigger Event step must declare event payload"); return WorkflowStepResult.none(); } long emitStart = System.nanoTime(); - context.processorContext().emitEvent(event.clone()); + context.processorContext().emitEvent(event); if (metrics != null) { metrics.addTriggerEmitEventNanos(System.nanoTime() - emitStart); } @@ -63,50 +77,32 @@ public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext contex } } - private static boolean hasDeclaredEvent(Node stepNode) { - if (stepNode == null) { - return true; + private Node exactEvent( + FrozenNode rawEvent, + TriggerEvent step, + StepExecutionContext context) { + Node authored = + FrozenNodeUtil.authoredOverlay( + rawEvent); + Node resolved = + step.getEvent(); + if (!authored.isReferenceOnly() + || resolved == null + || resolved.isReferenceOnly()) { + return authored; } - if (stepNode.getProperties() == null || !stepNode.getProperties().containsKey("event")) { - return false; + Node exactResolved = + CoordinationProcessHeaderSupport + .canonicalExactCopy(resolved); + String calculated = + DirectBlueIdCalculator.calculateBlueId( + exactResolved); + if (!authored.getBlueId().equals(calculated)) { + context.throwFatal( + "Trigger Event selected payload identity changed"); + return authored; } - return !isEmpty(stepNode.getProperties().get("event")); + return exactResolved; } - private static boolean hasDeclaredEvent(FrozenNode stepNode) { - if (stepNode == null) { - return true; - } - if (stepNode.getProperties() == null || !stepNode.getProperties().containsKey("event")) { - return false; - } - return !FrozenNodeUtil.isEmpty(stepNode.getProperties().get("event")); - } - - private static boolean isEmpty(Node node) { - if (node == null) { - return true; - } - return node.getType() == null - && node.getItemType() == null - && node.getKeyType() == null - && node.getValueType() == null - && node.getValue() == null - && empty(node.getItems()) - && empty(node.getProperties()) - && node.getBlueId() == null - && node.getSchema() == null - && node.getMergePolicy() == null - && node.getPreviousBlueId() == null - && node.getPosition() == null - && node.getBlue() == null; - } - - private static boolean empty(Map map) { - return map == null || map.isEmpty(); - } - - private static boolean empty(Iterable items) { - return items == null || !items.iterator().hasNext(); - } } diff --git a/src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java b/src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java index 976923a..dd9e358 100644 --- a/src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java +++ b/src/main/java/blue/coordination/processor/workflow/UpdateDocumentStepExecutor.java @@ -2,17 +2,19 @@ import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; +import blue.coordination.processor.support.CoordinationProcessHeaderSupport; import blue.language.processor.WorkingDocument; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.FrozenJsonPatch; import blue.language.snapshot.FrozenNode; -import blue.language.utils.MergeReverser; import blue.repo.coordination.SequentialWorkflowStep; import blue.repo.coordination.UpdateDocument; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; -import java.util.Locale; +/** + * Converts a fixed Update Document step into frozen patches and delegates + * patch validation and application to the generic Contracts engine. + */ public final class UpdateDocumentStepExecutor implements WorkflowStepExecutor { private final BexProcessingMetrics metrics; @@ -41,19 +43,15 @@ public WorkflowStepResult execute(UpdateDocument step, StepExecutionContext cont if (metrics != null) { metrics.incrementUpdateStaticTemplateHits(); } - applyStaticPlan(staticPlan, context); + applyStaticPlan( + staticPlan, step, context); return WorkflowStepResult.none(); } FrozenNode rawFrozenChangeset = FrozenNodeUtil.property(context.stepFrozenNode(), "changeset"); - if (StaticPayloadValidator.rejectBexOperators(rawFrozenChangeset, - context, - "Update Document changeset")) { - return WorkflowStepResult.none(); - } if (rawFrozenChangeset != null && rawFrozenChangeset.getItems() == null && step.getChangeset() == null) { - context.processorContext().throwFatal("Update Document changeset must be a static patch list"); + context.throwFatal("Update Document changeset must be a static patch list"); return WorkflowStepResult.none(); } List changeset = literalChangeset(step, context); @@ -82,13 +80,16 @@ private List literalChangeset(UpdateDocument step, StepExecu if (frozenChangeset != null && frozenChangeset.getItems() != null) { List entries = new ArrayList(frozenChangeset.getItems().size()); - MergeReverser mergeReverser = new MergeReverser(); for (int i = 0; i < frozenChangeset.getItems().size(); i++) { FrozenNode item = frozenChangeset.getItems().get(i); - Node literal = item == null ? null : item.toNode(); - if (item != null && !item.isStrictCanonical()) { - literal = mergeReverser.reverseToMinimizedOverlay(literal); - } + Node literal = + FrozenNodeUtil.authoredOverlay(item); + literal = + resolveReferencedLiteralValue( + literal, + step, + i, + context); entries.add(literalPatchEntry(literal, i, context)); } return entries; @@ -96,7 +97,7 @@ private List literalChangeset(UpdateDocument step, StepExecu if (step == null || step.getChangeset() == null) { return java.util.Collections.emptyList(); } - List rawChangeset = step.getChangeset(); + List rawChangeset = step.getChangeset(); List entries = new ArrayList(rawChangeset.size()); for (int i = 0; i < rawChangeset.size(); i++) { entries.add(literalPatchEntry(rawChangeset.get(i), i, context)); @@ -104,55 +105,24 @@ private List literalChangeset(UpdateDocument step, StepExecu return entries; } - private WorkflowPatchEntry literalPatchEntry(Object item, int index, StepExecutionContext context) { + private WorkflowPatchEntry literalPatchEntry(Node item, int index, StepExecutionContext context) { if (item == null) { return null; } - if (item instanceof WorkflowPatchEntry) { - return (WorkflowPatchEntry) item; - } - if (item instanceof Node) { - return literalPatchEntry((Node) item, index, context); - } - try { - if (metrics != null) { - metrics.incrementUpdateReflectionFallbacks(); - } - String op = (String) invokeNoArg(item, "getOp"); - String path = (String) invokeNoArg(item, "getPath"); - if (isRemove(op)) { - return new WorkflowPatchEntry(op, path, (FrozenNode) null); - } - Object val = invokeNoArg(item, "getVal"); - if (val == null || val instanceof Node) { - return new WorkflowPatchEntry(op, path, (Node) val); - } - if (val instanceof FrozenNode) { - return new WorkflowPatchEntry(op, path, (FrozenNode) val); - } - context.processorContext().throwFatal("Update Document changeset entry " + index - + " field 'val' must be a node"); - return null; - } catch (ReflectiveOperationException ex) { - context.processorContext().throwFatal("Update Document changeset entry " + index - + " cannot be read as a patch entry: " + ex.getMessage()); - return null; - } catch (ClassCastException ex) { - context.processorContext().throwFatal("Update Document changeset entry " + index - + " has invalid patch entry field types"); - return null; - } - } - - private WorkflowPatchEntry literalPatchEntry(Node item, int index, StepExecutionContext context) { if (item.getProperties() == null) { - context.processorContext().throwFatal("Update Document changeset entry " + index + context.throwFatal("Update Document changeset entry " + index + " must be a static patch object"); return null; } String op = stringProperty(item, "op", index, context); String path = stringProperty(item, "path", index, context); - Node val = isRemove(op) ? null : item.getProperties().get("val"); + if ("remove".equals(op) + && item.getProperties().containsKey("val")) { + context.throwFatal( + "Update Document patch value must be absent for remove"); + return null; + } + Node val = item.getProperties().get("val"); return new WorkflowPatchEntry(op, path, val); } @@ -163,55 +133,73 @@ private String stringProperty(Node item, String key, int index, StepExecutionCon return null; } if (!(value instanceof String)) { - context.processorContext().throwFatal("Update Document changeset entry " + index + context.throwFatal("Update Document changeset entry " + index + " field '" + key + "' must be text"); return null; } return (String) value; } - private Object invokeNoArg(Object target, String methodName) throws ReflectiveOperationException { - Method method = target.getClass().getMethod(methodName); - return method.invoke(target); - } - private FrozenJsonPatch toPatch(WorkflowPatchEntry entry, StepExecutionContext context) { if (entry == null) { - context.processorContext().throwFatal("Update Document changeset contains a null patch entry"); + context.throwFatal("Update Document changeset contains a null patch entry"); return null; } String op = entry.op(); String path = entry.path(); - if (op == null || op.trim().isEmpty()) { - context.processorContext().throwFatal("Update Document patch operation is required"); + if (op == null || op.isEmpty()) { + context.throwFatal("Update Document patch operation is required"); return null; } - if (path == null || path.trim().isEmpty()) { - context.processorContext().throwFatal("Update Document patch path is required"); + if (path == null || path.isEmpty()) { + context.throwFatal("Update Document patch path is required"); return null; } String absolutePath = context.processorContext().resolvePointer(path); - String normalizedOp = op.trim().toLowerCase(Locale.ROOT); - if ("remove".equals(normalizedOp)) { + if ("remove".equals(op)) { return FrozenJsonPatch.remove(absolutePath); } + if (!"add".equals(op) && !"replace".equals(op)) { + context.throwFatal( + "Unsupported Update Document patch operation: " + op); + return null; + } FrozenNode value = entry.val(); if (value == null) { - context.processorContext().throwFatal("Update Document patch value is required for operation: " + op); + context.throwFatal("Update Document patch value is required for operation: " + op); return null; } - if ("add".equals(normalizedOp)) { + if ("add".equals(op)) { return FrozenJsonPatch.add(absolutePath, value); } - if ("replace".equals(normalizedOp)) { + if ("replace".equals(op)) { return FrozenJsonPatch.replace(absolutePath, value); } - context.processorContext().throwFatal("Unsupported Update Document patch operation: " + op); - return null; + throw new IllegalStateException("Unreachable Update Document patch operation"); } - private static boolean isRemove(String op) { - return op != null && "remove".equals(op.trim().toLowerCase(Locale.ROOT)); + private Node resolveReferencedLiteralValue( + Node literal, + UpdateDocument step, + int index, + StepExecutionContext context) { + Node literalValue = + literal != null + && literal.getProperties() != null + ? literal.getProperties() + .get("val") + : null; + if (literalValue == null + || !literalValue.isReferenceOnly()) { + return literal; + } + FrozenNode resolved = + resolvedStepValue( + step, index, context); + Node completed = literal.clone(); + completed.getProperties().put( + "val", resolved.toNode()); + return completed; } private void applyPatches(List patches, StepExecutionContext context) { @@ -227,9 +215,6 @@ private void applyPatches(List patches, StepExecutionContext co if (preview == null) { return; } - if (metrics != null) { - metrics.addMetric("frozenPatchValuesHandedToLanguage", valuePatchCount(patches)); - } context.processorContext().applyPreviewedFrozenPatches(patches, preview); previewTransferred = true; if (metrics != null) { @@ -261,19 +246,78 @@ private static long valuePatchCount(List patches) { return count; } - private void applyStaticPlan(StaticUpdatePlan plan, StepExecutionContext context) { + private void applyStaticPlan( + StaticUpdatePlan plan, + UpdateDocument step, + StepExecutionContext context) { if (plan.patches().isEmpty()) { return; } long conversionStart = System.nanoTime(); List patches = new ArrayList(plan.patches().size()); - for (StaticUpdatePlan.PatchTemplate template : plan.patches()) { + for (int index = 0; + index < plan.patches().size(); + index++) { + StaticUpdatePlan.PatchTemplate template = + plan.patches().get(index); String absolutePath = context.processorContext().resolvePointer(template.authoredPath()); - patches.add(template.bind(absolutePath)); + patches.add( + template.bind( + absolutePath, + context, + resolvedPatchValue( + template, + step, + index, + context))); } if (metrics != null) { metrics.addUpdatePatchConversionNanos(System.nanoTime() - conversionStart); } applyPatches(patches, context); } + + private FrozenNode resolvedPatchValue( + StaticUpdatePlan.PatchTemplate template, + UpdateDocument step, + int index, + StepExecutionContext context) { + if (!template.hasReferencedValue()) { + return null; + } + return resolvedStepValue( + step, index, context); + } + + private FrozenNode resolvedStepValue( + UpdateDocument step, + int index, + StepExecutionContext context) { + List resolvedChangeset = + step != null + ? step.getChangeset() + : null; + Node resolvedEntry = + resolvedChangeset != null + && index < resolvedChangeset.size() + ? resolvedChangeset.get(index) + : null; + Node resolvedValue = + resolvedEntry != null + && resolvedEntry.getProperties() != null + ? resolvedEntry.getProperties() + .get("val") + : null; + if (resolvedValue == null + || resolvedValue.isReferenceOnly()) { + context.throwFatal( + "Update Document patch value reference has no " + + "resolved selected-body value"); + return null; + } + return FrozenNode.fromNode( + CoordinationProcessHeaderSupport + .canonicalExactCopy( + resolvedValue)); + } } diff --git a/src/main/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHost.java b/src/main/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHost.java new file mode 100644 index 0000000..9248f32 --- /dev/null +++ b/src/main/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHost.java @@ -0,0 +1,399 @@ +package blue.coordination.processor.workflow; + +import blue.bex.api.BexGasLedgerHost; +import blue.bex.contracts.ProcessorExecutionContextBexGasLedgerHost; +import blue.bex.gas.BexGasCounter; +import blue.bex.gas.BexGasLedgerCapability; +import blue.bex.gas.BexGasLimitExceededException; +import blue.bex.gas.BexHostGasExhaustion; +import blue.bex.gas.BexSharedGasBudget; +import blue.language.processor.ProcessorExecutionContext; +import blue.language.processor.ProcessorErrorCategory; +import blue.language.processor.ProcessorFailureException; +import blue.language.processor.RuntimeWorkSession; + +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.WeakHashMap; + +/** + * Allocates one final BEX session adapter per Compute execution in a + * sequential-workflow handler invocation. + * + *

Every execution receives a unique deterministic physical namespace. + * Primary and intrinsic ledgers opened by that execution therefore share the + * final BEX invocation budget without colliding with a later Compute step. + * Successful ledgers are submitted to the generic Language work session + * immediately; the enclosing processor session still owns the single atomic + * merge, deterministic-prefix retention, or transient discard.

+ */ +final class WorkflowBexGasLedgerHost implements BexGasLedgerHost { + private static final Map NEXT_WORKFLOW = + new WeakHashMap(); + + private final ProcessorExecutionContext processorContext; + private final RuntimeWorkSession workSession; + private final String workflowNamespace; + private final Map owners = + new IdentityHashMap(); + private final Set activeLedgers = + Collections.newSetFromMap( + new IdentityHashMap()); + private BexGasLedgerHost activeHost; + private BexSharedGasBudget activeBudget; + private int nextExecution; + private boolean finalized; + + WorkflowBexGasLedgerHost(ProcessorExecutionContext processorContext) { + this.processorContext = Objects.requireNonNull( + processorContext, "processorContext"); + this.workSession = null; + this.workflowNamespace = "bex.workflow." + + sequence(nextWorkflow( + processorContext)); + } + + WorkflowBexGasLedgerHost(RuntimeWorkSession workSession) { + this.processorContext = null; + this.workSession = Objects.requireNonNull( + workSession, "workSession"); + this.workflowNamespace = "bex.workflow." + + sequence(nextWorkflow(workSession)); + } + + @Override + public BexSharedGasBudget openSharedBudget(long maximumGas) { + if (maximumGas < 0L) { + throw new IllegalArgumentException( + "Shared BEX gas budget must be non-negative"); + } + ensureExecutionCanStart(); + if (workSession == null) { + // The public ProcessorExecutionContext boundary exposes live + // parent ledgers but intentionally not its internal shared-budget + // session. BEX retains the one aggregate local precheck in this + // hosted mode and every admitted charge still enters Contracts + // exactly once through the official adapter. + return null; + } + beginExecution(); + try { + activeBudget = + activeHost.openSharedBudget(maximumGas); + return activeBudget; + } catch (RuntimeException | Error failure) { + clearUnopenedExecution(); + throw failure; + } + } + + @Override + public BexGasLedgerCapability open( + String requestedNamespace, + Map requestedWeights) { + if (activeBudget != null) { + throw new IllegalStateException( + "Every ledger in this BEX execution must attach to " + + "its shared runtime work budget"); + } + return openInternal( + requestedNamespace, + requestedWeights, + null); + } + + @Override + public BexGasLedgerCapability open( + String requestedNamespace, + Map requestedWeights, + BexSharedGasBudget sharedBudget) { + BexSharedGasBudget exactBudget = + Objects.requireNonNull( + sharedBudget, "sharedBudget"); + if (activeHost == null + || activeBudget != exactBudget) { + throw new IllegalArgumentException( + "Shared BEX budget must be opened by the active " + + "workflow Compute execution"); + } + return openInternal( + requestedNamespace, + requestedWeights, + exactBudget); + } + + @Override + public void submit(BexGasLedgerCapability submittedLedger) { + finishLedger( + submittedLedger, + new LedgerAction() { + @Override + public void apply( + BexGasLedgerHost owner, + BexGasLedgerCapability ledger) { + owner.submit(ledger); + } + }, + "submitted"); + } + + @Override + public void failedDeterministically( + BexGasLedgerCapability failedLedger) { + finishLedger( + failedLedger, + new LedgerAction() { + @Override + public void apply( + BexGasLedgerHost owner, + BexGasLedgerCapability ledger) { + owner.failedDeterministically(ledger); + } + }, + "failed"); + } + + @Override + public void evidenceUnavailable( + BexGasLedgerCapability unavailableLedger) { + finishLedger( + unavailableLedger, + new LedgerAction() { + @Override + public void apply( + BexGasLedgerHost owner, + BexGasLedgerCapability ledger) { + owner.evidenceUnavailable(ledger); + } + }, + "became unavailable"); + } + + @Override + public RuntimeException localGasLimitExceeded( + BexGasLimitExceededException exhaustion, + RuntimeException originalFailure) { + BexGasLimitExceededException exact = + Objects.requireNonNull(exhaustion, "exhaustion"); + Objects.requireNonNull( + originalFailure, "originalFailure"); + return new ProcessorFailureException( + ProcessorErrorCategory.GasLimitExceeded, + exact.getMessage(), + exact); + } + + @Override + public void propagateGasExhaustion( + BexGasLedgerCapability rejectedLedger, + BexHostGasExhaustion exhaustion) { + BexGasLedgerHost owner = + requireOwner(rejectedLedger); + owner.propagateGasExhaustion( + rejectedLedger, + Objects.requireNonNull( + exhaustion, "exhaustion")); + } + + /** + * Finalizes the workflow adapter. Actual ledger submission is delegated + * to the final BEX session adapter on each successful execution. + */ + void submitToParent() { + if (finalized) { + return; + } + finalized = true; + if (!activeLedgers.isEmpty()) { + throw new IllegalStateException( + "Workflow ended while a BEX execution still owned " + + activeLedgers.size() + + " runtime ledger(s)"); + } + clearUnopenedExecution(); + } + + void discardForUnavailableEvidence() { + ensureNotFinalized(); + } + + void submitToParent(Throwable primaryFailure) { + try { + submitToParent(); + } catch (RuntimeException | Error submitFailure) { + if (primaryFailure != null + && primaryFailure != submitFailure) { + primaryFailure.addSuppressed(submitFailure); + } else { + throw submitFailure; + } + } + } + + private BexGasLedgerCapability openInternal( + String requestedNamespace, + Map requestedWeights, + BexSharedGasBudget sharedBudget) { + ensureNotFinalized(); + String logicalNamespace = + requireNamespace(requestedNamespace); + boolean primary = + BexGasCounter.NAMESPACE.equals(logicalNamespace); + if (activeHost == null) { + if (!primary || sharedBudget != null) { + throw new IllegalStateException( + "Every hosted BEX execution must open its primary " + + "ledger first"); + } + beginExecution(); + } else if (activeLedgers.isEmpty() && !primary) { + throw new IllegalStateException( + "Every hosted BEX execution must open its primary " + + "ledger first"); + } else if (!activeLedgers.isEmpty() && primary) { + throw new IllegalStateException( + "A hosted BEX execution already opened its primary " + + "ledger"); + } + BexGasLedgerCapability ledger; + try { + ledger = sharedBudget == null + ? activeHost.open( + logicalNamespace, + requestedWeights) + : activeHost.open( + logicalNamespace, + requestedWeights, + sharedBudget); + } catch (RuntimeException | Error failure) { + if (activeLedgers.isEmpty()) { + clearUnopenedExecution(); + } + throw failure; + } + if (!activeLedgers.add(ledger)) { + throw new IllegalStateException( + "Final BEX adapter returned a duplicate live ledger"); + } + owners.put(ledger, activeHost); + return ledger; + } + + private void finishLedger( + BexGasLedgerCapability ledger, + LedgerAction action, + String verb) { + ensureNotFinalized(); + BexGasLedgerHost owner = + requireOwner(ledger); + if (owner != activeHost + || !activeLedgers.remove(ledger)) { + throw new IllegalStateException( + "BEX " + verb + + " a workflow ledger it does not currently own"); + } + try { + action.apply(owner, ledger); + } finally { + if (activeLedgers.isEmpty()) { + activeHost = null; + activeBudget = null; + } + } + } + + private BexGasLedgerHost requireOwner( + BexGasLedgerCapability ledger) { + Objects.requireNonNull(ledger, "ledger"); + BexGasLedgerHost owner = owners.get(ledger); + if (owner == null) { + throw new IllegalArgumentException( + "BEX reported a different workflow child ledger"); + } + return owner; + } + + private void beginExecution() { + if (nextExecution == Integer.MAX_VALUE) { + throw new IllegalStateException( + "Workflow BEX execution sequence exhausted"); + } + String runtimeNamespace = workflowNamespace + + ".compute." + + sequence(nextExecution); + activeHost = processorContext != null + ? new ProcessorExecutionContextBexGasLedgerHost( + processorContext, + runtimeNamespace) + : new ProcessorExecutionContextBexGasLedgerHost( + workSession, + runtimeNamespace); + nextExecution++; + } + + private void ensureExecutionCanStart() { + ensureNotFinalized(); + if (activeHost != null + || !activeLedgers.isEmpty()) { + throw new IllegalStateException( + "A hosted BEX execution is already active"); + } + } + + private void clearUnopenedExecution() { + if (activeLedgers.isEmpty()) { + activeHost = null; + activeBudget = null; + } + } + + private void ensureNotFinalized() { + if (finalized) { + throw new IllegalStateException( + "Workflow BEX adapter was already finalized"); + } + } + + private static String requireNamespace(String value) { + String exact = Objects.requireNonNull( + value, "requestedNamespace"); + if (exact.trim().isEmpty() + || exact.indexOf('/') >= 0) { + throw new IllegalArgumentException( + "BEX namespace must be non-empty and must not contain '/'"); + } + return exact; + } + + private static synchronized int nextWorkflow( + Object invocationKey) { + Integer current = NEXT_WORKFLOW.get(invocationKey); + int sequence = current != null + ? current.intValue() + : 0; + if (sequence == Integer.MAX_VALUE) { + throw new IllegalStateException( + "Workflow BEX runtime sequence exhausted"); + } + NEXT_WORKFLOW.put( + invocationKey, + Integer.valueOf(sequence + 1)); + return sequence; + } + + private static String sequence(int value) { + return String.format( + java.util.Locale.ROOT, + "%08d", + Integer.valueOf(value)); + } + + private interface LedgerAction { + void apply( + BexGasLedgerHost owner, + BexGasLedgerCapability ledger); + } +} diff --git a/src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java b/src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java index 4dc9c82..d524600 100644 --- a/src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java +++ b/src/main/java/blue/coordination/processor/workflow/WorkflowPatchEntry.java @@ -3,8 +3,13 @@ import blue.language.model.Node; import blue.language.snapshot.FrozenNode; -import java.util.Locale; - +/** + * Immutable workflow patch value retained between sequential step + * executions. + * + *

Patch values are canonicalized to frozen snapshots at construction so a + * later step cannot observe caller mutation.

+ */ final class WorkflowPatchEntry { private final String op; private final String path; @@ -13,13 +18,13 @@ final class WorkflowPatchEntry { WorkflowPatchEntry(String op, String path, Node val) { this.op = op; this.path = path; - this.val = isRemove(op) || val == null ? null : FrozenNode.fromNode(val); + this.val = val != null ? FrozenNode.fromNode(val) : null; } WorkflowPatchEntry(String op, String path, FrozenNode val) { this.op = op; this.path = path; - this.val = isRemove(op) ? null : canonicalSnapshot(val); + this.val = canonicalSnapshot(val); } String op() { @@ -38,10 +43,8 @@ private static FrozenNode canonicalSnapshot(FrozenNode value) { if (value == null || value.isStrictCanonical()) { return value; } - return FrozenNode.fromNode(value.toNode()); + return FrozenNode.fromNode( + FrozenNodeUtil.authoredOverlay(value)); } - private static boolean isRemove(String op) { - return op != null && "remove".equals(op.trim().toLowerCase(Locale.ROOT)); - } } diff --git a/src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java b/src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java index 576c559..c6b67db 100644 --- a/src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java +++ b/src/main/java/blue/coordination/processor/workflow/WorkflowStepExecutor.java @@ -2,6 +2,11 @@ import blue.repo.coordination.SequentialWorkflowStep; +/** + * Strategy for one supported fixed-repository Sequential Workflow step type. + * + * @param concrete generated step model + */ public interface WorkflowStepExecutor { boolean supports(SequentialWorkflowStep step); diff --git a/src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java b/src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java index 6c7bb1f..d996ce2 100644 --- a/src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java +++ b/src/main/java/blue/coordination/processor/workflow/WorkflowStepResult.java @@ -1,5 +1,9 @@ package blue.coordination.processor.workflow; +/** + * Immutable result of one workflow step, including whether it produced a + * value, already handled a changeset, or terminated the workflow. + */ public final class WorkflowStepResult { private static final WorkflowStepResult NONE = new WorkflowStepResult(false, null, false, false); private static final WorkflowStepResult TERMINAL = new WorkflowStepResult(false, null, false, true); diff --git a/src/main/java/blue/coordination/processor/workflow/WorkflowStepTypeProfile.java b/src/main/java/blue/coordination/processor/workflow/WorkflowStepTypeProfile.java new file mode 100644 index 0000000..b49885e --- /dev/null +++ b/src/main/java/blue/coordination/processor/workflow/WorkflowStepTypeProfile.java @@ -0,0 +1,185 @@ +package blue.coordination.processor.workflow; + +import blue.language.model.Node; +import blue.language.snapshot.FrozenNode; +import blue.repo.coordination.Compute; +import blue.repo.coordination.SequentialWorkflowStep; +import blue.repo.coordination.TerminateProcessing; +import blue.repo.coordination.TriggerEvent; +import blue.repo.coordination.UpdateDocument; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Immutable exact-BlueId dispatch profile for polymorphic workflow steps. + * + *

Language mapping may deliberately expose an unknown subtype as the + * generated {@link SequentialWorkflowStep} base class. Coordination still + * has the selected immutable frozen step, so a host that registered an exact + * alternate type identity can bind it here without names, aliases, or field + * shape heuristics.

+ */ +public final class WorkflowStepTypeProfile { + + private final Map kindsByBlueId; + + private WorkflowStepTypeProfile(Map kindsByBlueId) { + this.kindsByBlueId = Collections.unmodifiableMap( + new LinkedHashMap(kindsByBlueId)); + } + + /** Returns the generated Repository type identities. */ + public static WorkflowStepTypeProfile publishedDefaults() { + return builder() + .updateDocument(UpdateDocument.blueId()) + .triggerEvent(TriggerEvent.blueId()) + .compute(Compute.blueId()) + .terminateProcessing(TerminateProcessing.blueId()) + .build(); + } + + /** Starts an empty exact identity profile. */ + public static Builder builder() { + return new Builder(); + } + + SequentialWorkflowStep materialize( + SequentialWorkflowStep mapped, + FrozenNode exactStep) { + return materialize( + mapped, + exactStep, + property(exactStep, "changeset")); + } + + boolean requiresExactChangeset( + SequentialWorkflowStep mapped, + FrozenNode exactStep) { + if (mapped == null + || mapped.getClass() != SequentialWorkflowStep.class + || exactStep == null) { + return false; + } + return Kind.UPDATE_DOCUMENT.equals( + kindsByBlueId.get( + exactTypeBlueId(exactStep))); + } + + SequentialWorkflowStep materialize( + SequentialWorkflowStep mapped, + FrozenNode exactStep, + FrozenNode exactChangeset) { + if (mapped == null + || mapped.getClass() != SequentialWorkflowStep.class + || exactStep == null) { + return mapped; + } + String typeBlueId = exactTypeBlueId(exactStep); + Kind kind = kindsByBlueId.get(typeBlueId); + if (kind == null) { + return mapped; + } + switch (kind) { + case UPDATE_DOCUMENT: + UpdateDocument update = new UpdateDocument(); + if (exactChangeset != null + && exactChangeset.getItems() != null) { + update.changeset(nodes(exactChangeset.getItems())); + } + return update; + case TRIGGER_EVENT: + TriggerEvent trigger = new TriggerEvent(); + FrozenNode event = property(exactStep, "event"); + if (event != null) { + trigger.event(event.toNode()); + } + return trigger; + case COMPUTE: + return new Compute(); + case TERMINATE_PROCESSING: + return new TerminateProcessing(); + default: + throw new IllegalStateException( + "Unknown workflow step kind " + kind); + } + } + + private static String exactTypeBlueId(FrozenNode step) { + FrozenNode type = step.getType(); + if (type == null) { + return null; + } + String reference = type.getReferenceBlueId(); + return reference != null ? reference : type.blueId(); + } + + private static FrozenNode property(FrozenNode node, String key) { + return node == null || node.getProperties() == null + ? null + : node.getProperties().get(key); + } + + private static List nodes(List source) { + List result = new ArrayList(source.size()); + for (FrozenNode value : source) { + result.add(value == null ? null : value.toNode()); + } + return result; + } + + private enum Kind { + UPDATE_DOCUMENT, + TRIGGER_EVENT, + COMPUTE, + TERMINATE_PROCESSING + } + + /** Mutable construction scope for an immutable profile. */ + public static final class Builder { + private final Map kinds = + new LinkedHashMap(); + + private Builder() { + } + + public Builder updateDocument(String blueId) { + return register(blueId, Kind.UPDATE_DOCUMENT); + } + + public Builder triggerEvent(String blueId) { + return register(blueId, Kind.TRIGGER_EVENT); + } + + public Builder compute(String blueId) { + return register(blueId, Kind.COMPUTE); + } + + public Builder terminateProcessing(String blueId) { + return register(blueId, Kind.TERMINATE_PROCESSING); + } + + public WorkflowStepTypeProfile build() { + return new WorkflowStepTypeProfile(kinds); + } + + private Builder register(String blueId, Kind kind) { + String identity = Objects.requireNonNull(blueId, "blueId"); + if (identity.isEmpty()) { + throw new IllegalArgumentException( + "Workflow step BlueId must not be empty"); + } + Kind previous = kinds.put(identity, kind); + if (previous != null && previous != kind) { + throw new IllegalArgumentException( + "One workflow step BlueId cannot select two kinds: " + + identity); + } + return this; + } + } +} diff --git a/src/main/resources/blue/coordination/processor/coordination-gas-1.0.yaml b/src/main/resources/blue/coordination/processor/coordination-gas-1.0.yaml new file mode 100644 index 0000000..fc123ec --- /dev/null +++ b/src/main/resources/blue/coordination/processor/coordination-gas-1.0.yaml @@ -0,0 +1,62 @@ +schedule: blue-coordination/gas/1.0 +specificationVersion: '1.0' +languageVersion: '1.0' +contractsVersion: '1.0' +bexVersion: '2.0' +status: production +numericWeightsStatus: provisional pending calibration; counter names, ownership, formulas, and trace order are frozen +ownership: + contracts: Generic processor, Language semantic work, patch application, checkpoints, lifecycle, and internal event delivery. + bex: BEX compilation and runtime work under its own exact child ledger. + coordination: Timeline, Operation routing, and selected workflow normalization not already owned by Contracts or BEX. +counters: +- name: timelineHeaderRead + weight: 1 + unit: one immutable Timeline Entry header field read +- name: timelineBindingCompared + weight: 2 + unit: one exact Timeline or Actor binding comparison +- name: compositeMemberVisited + weight: 2 + unit: one referenced member Channel visited +- name: allTimelinesMemberVisited + weight: 2 + unit: one effective same-scope Timeline-derived Channel visited +- name: operationRequestFieldRead + weight: 1 + unit: one required Operation Request dispatch field read +- name: operationTargetLookup + weight: 3 + unit: one exact same-scope target Channel lookup +- name: operationCandidateTested + weight: 4 + unit: one effective Operation candidate tested +- name: workflowStepVisited + weight: 1 + unit: one selected workflow step header visited +- name: workflowStepExecuted + weight: 3 + unit: one selected workflow step executed +- name: updateDocumentStep + weight: 3 + unit: one Update Document step normalized; patch work belongs to Contracts +- name: triggerEventStep + weight: 3 + unit: one Trigger Event step normalized; event routing belongs to Contracts +- name: terminateProcessingStep + weight: 3 + unit: one graceful termination step normalized +- name: computeStepEntered + weight: 3 + unit: one Compute step admitted; BEX work belongs to the BEX child ledger +- name: computeDefinitionResolved + weight: 3 + unit: one exact Compute Definition resolved +limits: + maxCompositeMembers: 1024 + maxAllTimelinesMembers: 4096 + maxWorkflowSteps: 4096 + maxOperationCandidatesPerChannel: 4096 + maxCoordinationRuntimeGasPerProcess: 100000 +identityAlgorithm: sha256 of UTF-8 canonical JSON with packageIdentity set to null +packageIdentity: sha256:45ab8de5985255ba947c5abb6e44cdbd61ca56b5c9fe8ea2617d60e729f26293 diff --git a/src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java b/src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java new file mode 100644 index 0000000..6c8eaa1 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/DynamicProcessEmbeddedCollectionActivationTest.java @@ -0,0 +1,120 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; +import java.util.Comparator; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +/** Dynamically activating collectionPaths initializes every direct member canonically. */ +@Tag("scenario") +final class DynamicProcessEmbeddedCollectionActivationTest { + private static final String HOST_ID = "dynamic-collection-host"; + + @Test + void collectionMembersInitializeByCanonicalPathNotInsertionOrBlueIdOrder() + throws Exception { + Map games = + Round12NbaFixtures.deliberatelyUnorderedGames(); + String hostYaml = Round12NbaFixtures.dynamicCollectionHost(games); + + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/round12/dynamic/collection/host", + "collection-owner"); + engine.timeline( + "examples/round12/nba/game-zulu", "nba-feed-zulu"); + engine.timeline( + "examples/round12/nba/game-alpha", "nba-feed-alpha"); + engine.timeline( + "examples/round12/nba/game-middle", "nba-feed-middle"); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.start(HOST_ID, hostYaml); + assertEquals(1, engine.documentCount()); + assertEquals(Map.of(), engine.embeddedDocuments(HOST_ID)); + + TimelineEntry activation = engine.append( + owner, + Operation.yaml( + "activateGameCollection", "ownerChannel", "{}")); + engine.dispatch(activation); + + assertEquals(4, engine.documentCount()); + List canonicalChildren = List.of( + "round12-game-alpha", + "round12-game-middle", + "round12-game-zulu"); + List blueIdOrder = canonicalChildren.stream() + .sorted(Comparator.comparing(child -> + engine.session(child).current().blueId())) + .toList(); + assertNotEquals(canonicalChildren, blueIdOrder, + "fixture BlueId order must differ from path order"); + assertEquals(Map.of( + "/games/alpha", "round12-game-alpha", + "/games/middle", "round12-game-middle", + "/games/zulu", "round12-game-zulu"), + engine.embeddedDocuments(HOST_ID)); + assertEquals(3L, integer(engine, HOST_ID, + "/initializationEventCount")); + assertEquals(1L, integer(engine, HOST_ID, + "/alphaInitializationOrdinal")); + assertEquals(2L, integer(engine, HOST_ID, + "/middleInitializationOrdinal")); + assertEquals(3L, integer(engine, HOST_ID, + "/zuluInitializationOrdinal")); + assertEquals(3L, integer(engine, HOST_ID, + "/revisionApplications")); + + for (String child : canonicalChildren) { + List history = engine.history(child); + assertEquals(1, history.size(), child); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + history.get(0).kind(), child); + assertEquals(activation.blueId(), + history.get(0).causalEntryBlueId().orElseThrow(), child); + assertFalse(history.stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .anyMatch(entry -> entry.blueId().equals( + activation.blueId())), child); + assertEquals(1L, integer(engine, child, + "/initializationCount")); + } + + List parentKinds = engine.history(HOST_ID) + .stream().map(DocumentRevision::kind).toList(); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION, + DocumentRevision.Kind.TIMELINE_ENTRY, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION), + parentKinds); + + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(3L, work.counter( + "embedding.childSessionsCreated")); + assertEquals(3L, work.counter( + "temporal.initializationEpochApplications")); + assertEquals(3L, work.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(3L, work.counter( + "temporal.parentEpochApplications")); + assertNoGenericSplitting(work); + } + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java b/src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java new file mode 100644 index 0000000..ad5c805 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/LargeHostPayNoteScenarioTest.java @@ -0,0 +1,101 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Full retained processor/BEX closure through a managed PayNote. */ +@Tag("scenario") +final class LargeHostPayNoteScenarioTest { + @Test + void largeHostAndManagedPayNoteCompleteTheWadowiceWorkflow() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline alice = engine.timeline( + "examples/large-order/alice", "alice"); + Timeline bob = engine.timeline( + "examples/large-order/bob", "bob"); + Timeline guarantor = engine.timeline( + "examples/order/myos-admin", "myos-admin"); + Timeline restaurant = engine.timeline( + "examples/order/david", "david"); + engine.start("large-order-host", resource( + "examples/clean/large-order-host.yaml")); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + + engine.appendAndDispatch(alice, Operation.exact( + "attachPayNote", "ownerChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/large-paynote.yaml")))); + engine.appendAndDispatch(bob, Operation.yaml( + "touchHost", "merchantChannel", + "note: first host update")); + engine.appendAndDispatch(guarantor, + authorization("RC-AUTH-1", 65_000L)); + engine.appendAndDispatch(guarantor, + authorization("RC-AUTH-2", 65_000L)); + engine.appendAndDispatch(restaurant, Operation.yaml( + "confirmProduct", "providerChannel", + "confirmationReference: RC-DINNER")); + engine.appendAndDispatch(bob, Operation.yaml( + "touchHost", "merchantChannel", + "note: second host update")); + + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + assertEquals(2L, integer( + engine, "large-paynote", "/authorizationCountState")); + assertEquals("Authorized", text( + engine, "large-paynote", "/authorization/state")); + assertEquals(2L, integer(engine, "large-order-host", + "/observedAuthorizationCount")); + assertEquals("Authorized", text(engine, "large-order-host", + "/payNote/authorization/state")); + assertEquals(Boolean.TRUE, engine.value("large-paynote", + "/productConditions/restaurant/product/confirmed") + .getValue()); + assertEquals(Boolean.TRUE, engine.value("large-order-host", + "/payNote/productConditions/restaurant/product/confirmed") + .getValue()); + assertEquals(2L, integer( + engine, "large-order-host", "/hostRevision")); + assertEquals(engine.session("large-paynote").epoch() + 1L, + integer(engine, "large-order-host", + "/payNoteRevisionCount")); + assertEquals("large-paynote", engine.embeddedDocuments( + "large-order-host").get("/payNote")); + assertEquals(2, engine.session("large-order-host") + .layout().physicalObjectCount()); + assertEquals(3, engine.session("large-paynote") + .layout().physicalObjectCount()); + assertTrue(work.counter( + "process.frozenContractsInvocations") > 10L); + assertEquals(work.counter( + "process.frozenContractsInvocations"), + work.counter("process.commitCompanionDeltasApplied")); + assertTrue(work.counter( + "process.subscriptionIntervalsReused") > 0L); + assertTrue(work.counter( + "catchUp.parentRevisionApplications") >= 4L); + assertNoGenericSplitting(work); + } + } + + private static Operation authorization(String id, long amountMinor) { + return Operation.yaml( + "authorizeAmount", + "guarantorChannel", + "authorizationId: " + id + "\n" + + "amountMinor: " + amountMinor + "\n" + + "currency: PLN\n"); + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java b/src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java new file mode 100644 index 0000000..86db46b --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/NbaHostLifecycleConvergenceTest.java @@ -0,0 +1,269 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Proves that four admission orders converge to one event-driven host state. */ +@Tag("scenario") +final class NbaHostLifecycleConvergenceTest { + private static final long T0 = 1_450_000_000_000_000L; + private static final String GAME_ID = "nba-game-2016-lal-min"; + private static final String REPLAY_GAME_ID = "nba-game-replay"; + + @Test + void allHostAndHistoricalGameAdmissionOrdersConverge() throws Exception { + String gameInitial = resource("examples/clean/nba-game.yaml") + .replace("accountId: nba-feed", "accountId: nba-commissioner"); + String hostInitial = resource("examples/clean/nba-game-host.yaml"); + + List results = new ArrayList<>(4); + results.add(hostFirst(gameInitial, hostInitial)); + results.add(completedGameFirst(gameInitial, hostInitial)); + results.add(partialHistoryFirst(gameInitial, hostInitial)); + results.add(replayGameFirst(gameInitial, hostInitial)); + + HostState expected = results.get(0).host(); + results.forEach(result -> assertEquals( + expected, result.host(), result.name())); + assertEquals(new HostState( + 2L, true, 1L, 2L, 3L, 2L, "Final", 5L), expected); + results.forEach(result -> { + assertEquals(5, result.gameRevisionCount(), result.name()); + assertTrue(result.frozenProcessCalls() > 0L, result.name()); + assertEquals(5L, result.parentRevisionApplications(), + result.name()); + }); + } + + private static VariationResult hostFirst( + String gameInitial, + String hostInitial) throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timelines timelines = timelines(engine); + engine.start("nba-game-host", hostInitial); + touchHost(engine, timelines.host()); + attach(engine, timelines.host(), gameInitial); + dispatchGameRangeLive(engine, timelines.game(), 0, 4); + touchHost(engine, timelines.host()); + return result("host first, game history arrives after attachment", engine, GAME_ID); + } + } + + private static VariationResult completedGameFirst( + String gameInitial, + String hostInitial) throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timelines timelines = timelines(engine); + engine.start(GAME_ID, gameInitial); + dispatchGameRange(engine, timelines.game(), 0, 4); + assertGameFinal(engine, GAME_ID); + engine.start("nba-game-host", hostInitial); + touchHost(engine, timelines.host()); + attach(engine, timelines.host(), gameInitial); + touchHost(engine, timelines.host()); + return result("completed game first, existing session attached", engine, GAME_ID); + } + } + + private static VariationResult partialHistoryFirst( + String gameInitial, + String hostInitial) throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timelines timelines = timelines(engine); + appendGameRange(engine, timelines.game(), 0, 2); + engine.start("nba-game-host", hostInitial); + touchHost(engine, timelines.host()); + attach(engine, timelines.host(), gameInitial); + dispatchGameRangeLive(engine, timelines.game(), 2, 4); + touchHost(engine, timelines.host()); + return result("partial history before late game admission", engine, GAME_ID); + } + } + + private static VariationResult replayGameFirst( + String gameInitial, + String hostInitial) throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timelines timelines = timelines(engine); + engine.start(GAME_ID, gameInitial); + dispatchGameRange(engine, timelines.game(), 0, 4); + GameState completed = gameState(engine, GAME_ID); + + engine.start("nba-game-host", hostInitial); + touchHost(engine, timelines.host()); + String replayInitial = gameInitial.replaceFirst( + "documentId: " + GAME_ID, + "documentId: " + REPLAY_GAME_ID); + attach(engine, timelines.host(), replayInitial); + assertEquals(completed, gameState(engine, REPLAY_GAME_ID), + "A distinct instance of the same game definition must catch up " + + "from the shared commissioner Timeline"); + touchHost(engine, timelines.host()); + return result("second game instance replays shared history", engine, REPLAY_GAME_ID); + } + } + + private static Timelines timelines(TestEngine engine) { + return new Timelines( + engine.timeline("examples/nba/host", "host-owner"), + engine.timeline( + "examples/nba/game-2016-lal-min", + "nba-commissioner")); + } + + private static void touchHost( + TestEngine engine, + Timeline host) { + engine.appendAndDispatch( + host, Operation.yaml("touchHost", "hostChannel", "{}")); + } + + private static void attach( + TestEngine engine, + Timeline host, + String gameInitial) { + engine.appendAndDispatch(host, Operation.exact( + "attachGame", + "hostChannel", + engine.embeddedDocumentRequest(gameInitial))); + } + + private static void appendGameRange( + TestEngine engine, + Timeline game, + int from, + int to) { + for (int index = from; index < to; index++) { + engine.appendAt(game, gameOperation(index), gameTimestamp(index)); + } + } + + private static void dispatchGameRange( + TestEngine engine, + Timeline game, + int from, + int to) { + for (int index = from; index < to; index++) { + dispatch(engine, game, gameTimestamp(index), gameOperation(index)); + } + } + + private static void dispatchGameRangeLive( + TestEngine engine, + Timeline game, + int from, + int to) { + for (int index = from; index < to; index++) { + engine.appendAndDispatch(game, gameOperation(index)); + } + } + + private static Operation gameOperation(int index) { + return switch (index) { + case 0 -> Operation.yaml("startGame", "gameFeed", "{}"); + case 1 -> Operation.yaml("homeScores", "gameFeed", "points: 2"); + case 2 -> Operation.yaml("awayScores", "gameFeed", "points: 3"); + case 3 -> Operation.yaml("endGame", "gameFeed", "{}"); + default -> throw new IllegalArgumentException("Unknown game entry " + index); + }; + } + + private static long gameTimestamp(int index) { + return T0 + (index + 1L) * 100L; + } + + private static void dispatch( + TestEngine engine, + Timeline timeline, + long timestamp, + Operation operation) { + TimelineEntry entry = engine.appendAt(timeline, operation, timestamp); + engine.dispatch(entry); + } + + private static VariationResult result( + String name, + TestEngine engine, + String gameId) { + assertGameFinal(engine, gameId); + EngineMetrics.MetricsSnapshot metrics = engine.metricsSnapshot(); + return new VariationResult( + name, + hostState(engine), + engine.history(gameId).size(), + metrics.counters().getOrDefault( + "process.frozenContractsInvocations", 0L), + metrics.counters().getOrDefault( + "catchUp.childEntriesProcessed", 0L), + metrics.counters().getOrDefault( + "catchUp.parentRevisionApplications", 0L)); + } + + private static HostState hostState(TestEngine engine) { + return new HostState( + integer(engine, "nba-game-host", "/hostOperationCount"), + Boolean.TRUE.equals(engine.value( + "nba-game-host", "/gameEnded").getValue()), + integer(engine, "nba-game-host", "/gameEndedEventCount"), + integer(engine, "nba-game-host", "/observedHomeScore"), + integer(engine, "nba-game-host", "/observedAwayScore"), + integer(engine, "nba-game-host", "/observedPlayCount"), + text(engine, "nba-game-host", "/observedStatus"), + integer(engine, "nba-game-host", "/revisionApplications")); + } + + private static void assertGameFinal( + TestEngine engine, + String gameId) { + assertEquals(new GameState(2L, 3L, 2L, "Final"), + gameState(engine, gameId)); + } + + private static GameState gameState( + TestEngine engine, + String gameId) { + return new GameState( + integer(engine, gameId, "/homeScore"), + integer(engine, gameId, "/awayScore"), + integer(engine, gameId, "/playCount"), + text(engine, gameId, "/status")); + } + + private record Timelines(Timeline host, Timeline game) { } + + private record GameState( + long homeScore, + long awayScore, + long playCount, + String status) { } + + private record HostState( + long hostOperationCount, + boolean gameEnded, + long gameEndedEventCount, + long observedHomeScore, + long observedAwayScore, + long observedPlayCount, + String observedStatus, + long revisionApplications) { } + + private record VariationResult( + String name, + HostState host, + int gameRevisionCount, + long frozenProcessCalls, + long childEntriesProcessed, + long parentRevisionApplications) { } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java b/src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java new file mode 100644 index 0000000..34396a1 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/NbaSharedGameLifecycleAcrossHostsTest.java @@ -0,0 +1,305 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * One managed Game initializes and progresses once while three containing hosts + * consume the same ordered initialization and business epochs. + */ +@Tag("scenario") +final class NbaSharedGameLifecycleAcrossHostsTest { + private static final String GAME_ID = "round12-shared-game"; + private static final String HOST_ONE = "round12-host-one"; + private static final String HOST_TWO = "round12-host-two"; + private static final String HOST_THREE = "round12-host-three"; + + @Test + void laterAndPostFinalHostsReuseGameAndReceiveRetainedLifecycleEvents() + throws Exception { + String gameYaml = Round12NbaFixtures.game( + GAME_ID, + "examples/round12/nba/shared-game", + "round12-nba-feed"); + String hostOneYaml = Round12NbaFixtures.host( + HOST_ONE, + "examples/round12/nba/host-one", + "round12-host-one-owner"); + String hostTwoYaml = Round12NbaFixtures.host( + HOST_TWO, + "examples/round12/nba/host-two", + "round12-host-two-owner"); + String hostThreeYaml = Round12NbaFixtures.host( + HOST_THREE, + "examples/round12/nba/host-three", + "round12-host-three-owner"); + + try (TestEngine engine = TestEngine.create()) { + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + Round12NbaEvidence evidence = Round12NbaEvidence.begin(engine); + Timeline game = engine.timeline( + "examples/round12/nba/shared-game", + "round12-nba-feed"); + Timeline hostOne = engine.timeline( + "examples/round12/nba/host-one", + "round12-host-one-owner"); + Timeline hostTwo = engine.timeline( + "examples/round12/nba/host-two", + "round12-host-two-owner"); + Timeline hostThree = engine.timeline( + "examples/round12/nba/host-three", + "round12-host-three-owner"); + + evidence.admit("Host 1 admission", HOST_ONE, + () -> engine.start(HOST_ONE, hostOneYaml)); + assertEquals(1L, integer(engine, HOST_ONE, + "/hostInitializationCount")); + assertEquals(1, engine.history(HOST_ONE).size()); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + engine.history(HOST_ONE).get(0).kind()); + + TimelineEntry firstAttachment = evidence.dispatch( + "Host 1 attachment", + HOST_ONE, + hostOne, + Round12NbaFixtures.attach(gameYaml, engine)); + + assertGameInitialization(engine, firstAttachment); + String initializationEventBlueId = DirectBlueIdCalculator + .calculateBlueId(engine.history(GAME_ID).get(0) + .emittedEvents().get(0)); + assertHost(engine, HOST_ONE, 1L, false, 0L, + 0L, 0L, 0L, "Scheduled", 1L); + assertEquals(initializationEventBlueId, text( + engine, HOST_ONE, "/gameInitializationEventBlueId")); + + dispatchGameOnce(evidence, "Game start", engine, game, + Round12NbaFixtures.startGame()); + dispatchGameOnce(evidence, "Game first scoring operation", + engine, game, Round12NbaFixtures.homeScores(2)); + assertHost(engine, HOST_ONE, 1L, false, 0L, + 2L, 0L, 1L, "Live", 3L); + + long gameEpochBeforeSecondHost = + engine.session(GAME_ID).epoch(); + int gameHistoryBeforeSecondHost = engine.history(GAME_ID).size(); + EngineMetrics.MetricsSnapshot beforeSecondHost = + engine.metricsSnapshot(); + + evidence.admit("Host 2 admission", HOST_TWO, + () -> engine.start(HOST_TWO, hostTwoYaml)); + TimelineEntry secondAttachment = evidence.dispatch( + "Host 2 attachment/catch-up", + HOST_TWO, + hostTwo, + Round12NbaFixtures.attach(gameYaml, engine)); + + assertEquals(gameEpochBeforeSecondHost, + engine.session(GAME_ID).epoch(), + "attaching another host must not advance the Game"); + assertEquals(gameHistoryBeforeSecondHost, + engine.history(GAME_ID).size(), + "attaching another host must not initialize or replay the Game"); + assertHost(engine, HOST_TWO, 1L, false, 0L, + 2L, 0L, 1L, "Live", 3L); + assertEquals(initializationEventBlueId, text( + engine, HOST_TWO, "/gameInitializationEventBlueId")); + + EngineTestSupport.MetricDelta secondHostDelta = delta( + beforeSecondHost, engine.metricsSnapshot()); + assertEquals(0L, secondHostDelta.counter( + "embedding.childSessionsCreated")); + assertEquals(1L, secondHostDelta.counter( + "embedding.childSessionsReused")); + assertEquals(3L, secondHostDelta.counter( + "temporal.parentEpochApplications")); + + dispatchGameOnce(evidence, "Game second scoring operation", + engine, game, Round12NbaFixtures.awayScores(3)); + dispatchGameOnce(evidence, "Game end", engine, game, + Round12NbaFixtures.endGame()); + String endingEventBlueId = DirectBlueIdCalculator.calculateBlueId( + engine.history(GAME_ID).get(4).emittedEvents().get(0)); + + assertHost(engine, HOST_ONE, 1L, true, 1L, + 2L, 3L, 2L, "Final", 5L); + assertHost(engine, HOST_TWO, 1L, true, 1L, + 2L, 3L, 2L, "Final", 5L); + assertEquals(endingEventBlueId, text( + engine, HOST_ONE, "/gameEndedEventBlueId")); + assertEquals(endingEventBlueId, text( + engine, HOST_TWO, "/gameEndedEventBlueId")); + assertConvergedGameBlueId(engine, HOST_ONE, HOST_TWO); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + assertEquals(5, engine.history(GAME_ID).size()); + assertEquals(1L, engine.history(GAME_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()); + + long finalGameEpoch = engine.session(GAME_ID).epoch(); + int finalGameHistorySize = engine.history(GAME_ID).size(); + EngineMetrics.MetricsSnapshot beforeThirdHost = + engine.metricsSnapshot(); + EngineTestSupport.MetricDelta twoHostTotal = delta( + before, beforeThirdHost); + assertEquals(1L, twoHostTotal.counter( + "embedding.childSessionsCreated")); + assertEquals(1L, twoHostTotal.counter( + "embedding.childSessionsReused")); + assertEquals(2L, twoHostTotal.counter( + "temporal.initializationEpochApplications")); + assertEquals(2L, twoHostTotal.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(10L, twoHostTotal.counter( + "temporal.parentEpochApplications")); + assertNoGenericSplitting(twoHostTotal); + evidence.write( + GAME_ID, HOST_ONE, HOST_TWO, twoHostTotal); + + engine.start(HOST_THREE, hostThreeYaml); + engine.appendAndDispatch( + hostThree, Round12NbaFixtures.attach(gameYaml, engine)); + + assertEquals(finalGameEpoch, engine.session(GAME_ID).epoch(), + "post-Final attachment must not advance the Game"); + assertEquals(finalGameHistorySize, + engine.history(GAME_ID).size(), + "post-Final attachment must reuse retained Game history"); + assertHost(engine, HOST_THREE, 1L, true, 1L, + 2L, 3L, 2L, "Final", 5L); + assertEquals(initializationEventBlueId, text( + engine, HOST_THREE, "/gameInitializationEventBlueId")); + assertEquals(endingEventBlueId, text( + engine, HOST_THREE, "/gameEndedEventBlueId")); + assertConvergedGameBlueId(engine, HOST_ONE, HOST_TWO, HOST_THREE); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + + EngineTestSupport.MetricDelta thirdHostDelta = delta( + beforeThirdHost, engine.metricsSnapshot()); + assertEquals(0L, thirdHostDelta.counter( + "embedding.childSessionsCreated")); + assertEquals(1L, thirdHostDelta.counter( + "embedding.childSessionsReused")); + assertEquals(0L, thirdHostDelta.counter( + "childHistoricalProcessCalls"), + "retained Game source entries must not be replayed"); + assertEquals(5L, thirdHostDelta.counter( + "temporal.parentEpochApplications")); + assertEquals(1L, thirdHostDelta.counter( + "temporal.initializationEpochApplications")); + assertEquals(1L, thirdHostDelta.counter( + "temporal.initializationEventOccurrencesForwarded")); + + EngineTestSupport.MetricDelta total = delta( + before, engine.metricsSnapshot()); + assertEquals(1L, total.counter( + "embedding.childSessionsCreated")); + assertEquals(2L, total.counter( + "embedding.childSessionsReused")); + assertEquals(3L, total.counter( + "temporal.initializationEpochApplications")); + assertEquals(3L, total.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(15L, total.counter( + "temporal.parentEpochApplications")); + assertNoGenericSplitting(total); + } + } + + private static void dispatchGameOnce( + Round12NbaEvidence evidence, + String evidenceName, + TestEngine engine, + Timeline game, + Operation operation) { + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + evidence.dispatch(evidenceName, GAME_ID, game, operation); + assertEquals(1L, delta(before, engine.metricsSnapshot()).counter( + "EXTERNAL_PROCESS_CALLS"), + "each Game source entry must cross Game PROCESS once"); + } + + private static void assertConvergedGameBlueId( + TestEngine engine, + String... hostIds) { + String gameBlueId = engine.session(GAME_ID).current().blueId(); + for (String hostId : hostIds) { + assertEquals(gameBlueId, DirectBlueIdCalculator.calculateBlueId( + engine.value(hostId, "/game")), + hostId); + } + } + + private static void assertGameInitialization( + TestEngine engine, + TimelineEntry attachment) { + List history = engine.history(GAME_ID); + assertEquals(1, history.size()); + DocumentRevision initialization = history.get(0); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + initialization.kind()); + assertTrue(initialization.sourceEntry().isEmpty(), + "initialization is processor-managed, not a Timeline Entry"); + assertEquals(attachment.blueId(), + initialization.causalEntryBlueId().orElseThrow()); + assertTrue(initialization.sourceOrderKey().isPresent(), + "initialization must retain exact causal order evidence"); + assertEquals(1, initialization.emittedEvents().size()); + Node event = initialization.emittedEvents().get(0); + assertEquals("NBA/Game Initialized", + event.getProperties().get("kind").getValue()); + assertFalse(initialization.catchUpCause().isEmpty()); + assertEquals(1L, integer(engine, GAME_ID, + "/initializationCount")); + } + + private static void assertHost( + TestEngine engine, + String hostId, + long initializationEvents, + boolean ended, + long endedEvents, + long homeScore, + long awayScore, + long playCount, + String status, + long revisionApplications) { + assertEquals(initializationEvents, integer( + engine, hostId, "/gameInitializationEventCount")); + assertEquals(initializationEvents > 0L, + Boolean.TRUE.equals(engine.value( + hostId, "/gameInitialized").getValue())); + assertEquals(ended, Boolean.TRUE.equals(engine.value( + hostId, "/gameEnded").getValue())); + assertEquals(endedEvents, integer( + engine, hostId, "/gameEndedEventCount")); + assertEquals(homeScore, integer( + engine, hostId, "/observedHomeScore")); + assertEquals(awayScore, integer( + engine, hostId, "/observedAwayScore")); + assertEquals(playCount, integer( + engine, hostId, "/observedPlayCount")); + assertEquals(status, text(engine, hostId, "/observedStatus")); + assertEquals(revisionApplications, integer( + engine, hostId, "/revisionApplications")); + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java b/src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java new file mode 100644 index 0000000..346b035 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/NestedDynamicProcessEmbeddedActivationTest.java @@ -0,0 +1,199 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.SessionStatus; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.snapshot.FrozenNode; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.indent; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** A dynamic collection member publishes its own dynamic fixed-path graph. */ +@Tag("scenario") +final class NestedDynamicProcessEmbeddedActivationTest { + private static final String HOST_ID = + "nested-dynamic-collection-host"; + private static final String CHILD_ID = + "nested-dynamic-collection-child"; + private static final String GAME_ID = "round12-nested-dynamic-game"; + + @Test + void childInitializationRecursivelySettlesGrandchildBeforeHostReady() + throws Exception { + String gameYaml = Round12NbaFixtures.game( + GAME_ID, + "examples/round12/dynamic/nested/game", + "nested-game-feed"); + String hostYaml = resource( + "examples/round12/nested-dynamic-collection-host.yaml") + .replace( + " game: __GAME_DOCUMENT__", + " game:\n" + indent(gameYaml.strip(), 6)); + + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + "examples/round12/dynamic/nested/host", + "nested-host-owner"); + engine.timeline( + "examples/round12/dynamic/nested/game", + "nested-game-feed"); + + engine.start(HOST_ID, hostYaml); + assertEquals(1, engine.documentCount()); + assertEquals(Map.of(), engine.embeddedDocuments(HOST_ID)); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + TimelineEntry activation = engine.append( + owner, + Operation.yaml( + "activateChildren", "ownerChannel", "{}")); + engine.dispatch(activation); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(3, engine.documentCount()); + assertEquals(Map.of("/children/alpha", CHILD_ID), + engine.embeddedDocuments(HOST_ID)); + assertEquals(Map.of("/game", GAME_ID), + engine.embeddedDocuments(CHILD_ID)); + assertEquals(SessionStatus.READY, + engine.session(HOST_ID).status()); + assertEquals(SessionStatus.READY, + engine.session(CHILD_ID).status()); + assertEquals(SessionStatus.READY, + engine.session(GAME_ID).status()); + assertEquals(SessionStatus.READY, + engine.readyDocument(HOST_ID).status()); + assertEquals(SessionStatus.READY, + engine.readyDocument(CHILD_ID).status()); + assertEquals(SessionStatus.READY, + engine.readyDocument(GAME_ID).status()); + + assertEquals(1L, integer( + engine, CHILD_ID, "/childInitializationCount")); + assertEquals(1L, integer( + engine, GAME_ID, "/initializationCount")); + assertEquals(1L, integer( + engine, CHILD_ID, "/grandchildRevisionApplications")); + assertEquals(1L, integer( + engine, CHILD_ID, + "/grandchildInitializationEventCount")); + assertEquals(2L, integer( + engine, HOST_ID, "/childRevisionApplications")); + assertEquals(1L, integer( + engine, HOST_ID, "/childInitializationEventCount")); + + List gameHistory = engine.history(GAME_ID); + List childHistory = engine.history(CHILD_ID); + List hostHistory = engine.history(HOST_ID); + assertEquals(List.of(DocumentRevision.Kind.INITIALIZATION), + kinds(gameHistory)); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION), + kinds(childHistory)); + assertEquals(List.of( + DocumentRevision.Kind.INITIALIZATION, + DocumentRevision.Kind.TIMELINE_ENTRY, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION, + DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION), + kinds(hostHistory)); + assertTrue(gameHistory.stream() + .allMatch(revision -> activation.blueId().equals( + revision.causalEntryBlueId().orElseThrow()))); + assertTrue(childHistory.stream() + .allMatch(revision -> activation.blueId().equals( + revision.causalEntryBlueId().orElseThrow()))); + assertTrue(hostHistory.subList(1, hostHistory.size()).stream() + .allMatch(revision -> activation.blueId().equals( + revision.causalEntryBlueId().orElseThrow()))); + + List hostApplications = hostHistory.stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .toList(); + assertEquals(List.of(0L, 1L), hostApplications.stream() + .map(revision -> number( + revision.after(), + "/children/alpha/" + + "grandchildRevisionApplications")) + .toList(), + "the Host must retain child initialization before the " + + "child's settled grandchild application"); + assertEquals(List.of(0L, 1L), hostApplications.stream() + .map(revision -> number( + revision.after(), + "/children/alpha/game/initializationCount")) + .toList()); + + Map plans = engine.catchUpPlans().stream() + .collect(Collectors.toMap( + plan -> plan.link().parentDocumentId().value() + + "->" + + plan.link().childDocumentId().value(), + Function.identity())); + assertEquals(2, plans.size()); + assertComplete(plans.get(HOST_ID + "->" + CHILD_ID), 1L); + assertComplete(plans.get(CHILD_ID + "->" + GAME_ID), 0L); + + assertEquals(2L, work.counter( + "embedding.childSessionsCreated")); + assertEquals(2L, work.counter( + "temporal.initializationEpochApplications")); + assertEquals(2L, work.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(3L, work.counter( + "temporal.parentEpochApplications")); + assertNoGenericSplitting(work); + } + } + + private static List kinds( + List revisions) { + return revisions.stream().map(DocumentRevision::kind).toList(); + } + + private static void assertComplete( + CatchUpPlan plan, + long appliedEpoch) { + assertNotNull(plan); + assertEquals(CatchUpPlan.Status.COMPLETE, plan.status()); + assertEquals(appliedEpoch, plan.link().appliedChildEpoch()); + } + + private static long number( + ExactValue state, + String path) { + FrozenNode selected = state.canonicalAt(path); + if (selected == null || selected.getValue() == null) { + throw new AssertionError("Missing Integer at " + path); + } + Object value = selected.getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected Integer at " + path + + " but got " + value); + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceDeterminismScenarioTest.java b/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceDeterminismScenarioTest.java new file mode 100644 index 0000000..fa28555 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceDeterminismScenarioTest.java @@ -0,0 +1,203 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.identity.DirectBlueIdCalculator; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Determinism proofs for request order and resumable bounded draining. */ +@Tag("scenario") +final class PlaygroundFiveOccurrenceDeterminismScenarioTest { + + @Test + void reverseRequestInsertionOrderPreservesBlueIdsHistoriesAndEvents() + throws Exception { + RunResult deliberatelyUnordered = run( + PlaygroundFiveOccurrenceFixtures.DELIBERATELY_UNORDERED_KEYS, + false); + RunResult reversed = run( + PlaygroundFiveOccurrenceFixtures.REVERSE_KEYS, + false); + + assertFalse(PlaygroundFiveOccurrenceFixtures + .DELIBERATELY_UNORDERED_KEYS.equals( + PlaygroundFiveOccurrenceFixtures.REVERSE_KEYS)); + assertEquals(deliberatelyUnordered.outcome(), reversed.outcome(), + "map authoring order cannot affect Host/child exact identity, " + + "application order, history, or event multiplicity"); + } + + @Test + void boundedDrainPauseAndResumeMatchesUnlimitedCommittedHistory() + throws Exception { + RunResult unlimited = run( + PlaygroundFiveOccurrenceFixtures.DELIBERATELY_UNORDERED_KEYS, + false); + RunResult bounded = run( + PlaygroundFiveOccurrenceFixtures.DELIBERATELY_UNORDERED_KEYS, + true); + + assertTrue(bounded.pausedAtLeastOnce(), + "the deterministic one-transition budget must force a pause"); + assertFalse(unlimited.pausedAtLeastOnce()); + assertEquals(unlimited.outcome(), bounded.outcome(), + "resume must not reinitialize a child, duplicate a parent event " + + "occurrence, or alter any committed exact history"); + } + + private static RunResult run( + List requestOrder, + boolean bounded) throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + PlaygroundFiveOccurrenceFixtures.HOST_TIMELINE, + PlaygroundFiveOccurrenceFixtures.HOST_ACTOR); + PlaygroundFiveOccurrenceFixtures.registerChildTimelines(engine); + engine.start( + PlaygroundFiveOccurrenceFixtures.HOST_ID, + resource(PlaygroundFiveOccurrenceFixtures.HOST_RESOURCE)); + TimelineEntry attachment = engine.append(owner, + PlaygroundFiveOccurrenceFixtures.replaceDocuments( + engine, requestOrder)); + + boolean paused = false; + if (bounded) { + int attempts = 0; + while (true) { + ProcessingDrainReceipt receipt = engine.drain( + new CoordinationEngine.DrainBudget(1L, 100L)); + paused |= receipt.paused(); + if (receipt.quiescent()) { + break; + } + assertTrue(receipt.paused(), + "the closed fixture has no unavailable prerequisite"); + assertTrue(++attempts < 32, + "bounded drain failed to make deterministic progress"); + } + } else { + ProcessingDrainReceipt receipt = engine.drain(); + assertTrue(receipt.quiescent()); + } + + return new RunResult( + outcome(engine, attachment.timestampMicros()), paused); + } + } + + private static Outcome outcome( + TestEngine engine, + long attachmentTimestampMicros) { + String host = PlaygroundFiveOccurrenceFixtures.HOST_ID; + List children = List.of( + PlaygroundFiveOccurrenceFixtures.ALPHA_ID, + PlaygroundFiveOccurrenceFixtures.BETA_ID, + PlaygroundFiveOccurrenceFixtures.GAMMA_ID); + Map finalBlueIds = new LinkedHashMap<>(); + finalBlueIds.put(host, engine.readyDocument(host).current().blueId()); + for (String child : children) { + finalBlueIds.put( + child, engine.readyDocument(child).current().blueId()); + } + + Map> histories = new LinkedHashMap<>(); + histories.put(host, trace(engine.history(host))); + for (String child : children) { + histories.put(child, trace(engine.history(child))); + assertEquals(1L, engine.history(child).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count(), child); + } + + List applicationCauses = + engine.history(host).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION) + .map(revision -> revision.catchUpCause() + .orElseThrow()) + .toList(); + assertTrue(applicationCauses.stream().allMatch(cause -> + cause.attachmentTimestampMicros() + == attachmentTimestampMicros), + "each application must retain the attachment timestamp, " + + "not its occurrence-specific application time"); + List applicationPaths = applicationCauses.stream() + .map(DocumentRevision.CatchUpCause::occurrencePath) + .toList(); + assertEquals(PlaygroundFiveOccurrenceFixtures + .expectedApplicationPaths(), applicationPaths); + + return new Outcome( + Map.copyOf(finalBlueIds), + Map.copyOf(histories), + applicationPaths, + integer(engine, host, "/initializationEventCount"), + integer(engine, host, "/alphaInitializationEventCount"), + integer(engine, host, "/betaInitializationEventCount"), + integer(engine, host, "/gammaInitializationEventCount"), + integer(engine, host, "/revisionApplications")); + } + + private static List trace( + List revisions) { + return revisions.stream() + .map(revision -> new RevisionTrace( + revision.epoch(), + revision.rootApplicationOrder(), + revision.kind(), + revision.before().map(value -> value.blueId()) + .orElse(null), + revision.after().blueId(), + revision.causalEntryBlueId().orElse(null), + revision.catchUpCause() + .map(DocumentRevision.CatchUpCause + ::occurrencePath) + .orElse(null), + revision.emittedEvents().stream() + .map(DirectBlueIdCalculator::calculateBlueId) + .toList())) + .toList(); + } + + private record RunResult( + Outcome outcome, + boolean pausedAtLeastOnce) { + } + + private record Outcome( + Map finalBlueIds, + Map> histories, + List parentApplicationPaths, + long initializationEventCount, + long alphaEventCount, + long betaEventCount, + long gammaEventCount, + long parentApplications) { + } + + private record RevisionTrace( + long epoch, + long rootApplicationOrder, + DocumentRevision.Kind kind, + String beforeBlueId, + String afterBlueId, + String causalEntryBlueId, + String occurrencePath, + List emittedEventBlueIds) { + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java b/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java new file mode 100644 index 0000000..5e5d582 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceEvidence.java @@ -0,0 +1,776 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.ToLongFunction; + +/** + * Manual Round 13 sample and candidate-campaign writer. + * + *

This is a scenario-source utility rather than a JUnit test so the repeated + * campaign never enters {@code check}, {@code releaseCheck}, or the default edit + * loop. The corresponding Gradle tasks launch it explicitly.

+ */ +final class PlaygroundFiveOccurrenceEvidence { + private static final String SAMPLE_PROPERTY = + "blue.coordination.round13.sample"; + private static final String CAMPAIGN_PROPERTY = + "blue.coordination.round13.campaign"; + private static final String WARMUPS_PROPERTY = + "blue.coordination.round13.warmups"; + private static final String SAMPLES_PROPERTY = + "blue.coordination.round13.samples"; + private static final int DEFAULT_WARMUPS = 3; + private static final int DEFAULT_SAMPLES = 30; + private static final RuntimeIdentity RUNTIME_IDENTITY = + RuntimeIdentity.current(); + + private PlaygroundFiveOccurrenceEvidence() { + } + + /** Entry point used only by the focused {@code JavaExec} tasks. */ + public static void main(String[] arguments) throws Exception { + if (arguments.length != 1) { + throw new IllegalArgumentException( + "Expected one mode: sample or campaign"); + } + int warmups = integerProperty(WARMUPS_PROPERTY, DEFAULT_WARMUPS, 0); + switch (arguments[0]) { + case "sample" -> writeSample( + requiredPathProperty(SAMPLE_PROPERTY), warmups); + case "campaign" -> writeCampaign( + requiredPathProperty(CAMPAIGN_PROPERTY), + warmups, + integerProperty(SAMPLES_PROPERTY, DEFAULT_SAMPLES, 1)); + default -> throw new IllegalArgumentException( + "Unknown Round 13 evidence mode: " + arguments[0]); + } + } + + private static void writeSample(Path output, int warmups) + throws Exception { + Result result = warmedSample(warmups); + createParent(output); + Files.writeString( + output, + result.toJson(), + StandardCharsets.UTF_8); + System.out.println("ROUND13_PLAYGROUND_SAMPLE=" + + output.toAbsolutePath()); + } + + private static void writeCampaign( + Path outputDirectory, + int warmups, + int sampleCount) throws Exception { + for (int index = 0; index < warmups; index++) { + runOnce(); + } + List results = new ArrayList<>(sampleCount); + for (int index = 0; index < sampleCount; index++) { + results.add(runOnce()); + } + Campaign campaign = Campaign.from(warmups, results); + Files.createDirectories(outputDirectory); + Path json = outputDirectory.resolve( + "five-occurrence-runtime.json"); + Path markdown = outputDirectory.resolve( + "five-occurrence-runtime.md"); + Files.writeString(json, campaign.toJson(), StandardCharsets.UTF_8); + Files.writeString( + markdown, + campaign.toMarkdown(), + StandardCharsets.UTF_8); + System.out.println("ROUND13_PLAYGROUND_CAMPAIGN=" + + outputDirectory.toAbsolutePath()); + } + + private static Result warmedSample(int warmups) throws Exception { + for (int index = 0; index < warmups; index++) { + runOnce(); + } + return runOnce(); + } + + private static Result runOnce() throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + PlaygroundFiveOccurrenceFixtures.HOST_TIMELINE, + PlaygroundFiveOccurrenceFixtures.HOST_ACTOR); + PlaygroundFiveOccurrenceFixtures.registerChildTimelines(engine); + engine.start( + PlaygroundFiveOccurrenceFixtures.HOST_ID, + EngineTestSupport.resource( + PlaygroundFiveOccurrenceFixtures.HOST_RESOURCE)); + + int wholeObjectsBefore = engine.wholeObjectCount(); + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + long totalStarted = System.nanoTime(); + long preparationStarted = System.nanoTime(); + Operation attachFive = + PlaygroundFiveOccurrenceFixtures.attachFive(engine); + long preparationNanos = System.nanoTime() - preparationStarted; + int wholeObjectsAdded = + engine.wholeObjectCount() - wholeObjectsBefore; + + long appendStarted = System.nanoTime(); + TimelineEntry entry = engine.append(owner, attachFive); + long appendNanos = System.nanoTime() - appendStarted; + engine.dispatch(entry); + long totalNanos = System.nanoTime() - totalStarted; + EngineTestSupport.MetricDelta delta = EngineTestSupport.delta( + before, engine.metricsSnapshot()); + long processFrozenNanos = delta.nanos("process.frozen"); + long initializationFrozenNanos = delta.nanos( + "documentStart.contractsInitialize"); + + List paths = applicationPaths(engine); + long initializationRevisions = List.of( + "playground-game-alpha", + "playground-game-beta", + "playground-game-gamma").stream() + .mapToLong(id -> engine.history(id).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.INITIALIZATION) + .count()) + .sum(); + + Result result = new Result( + entry.blueId(), + paths, + RUNTIME_IDENTITY, + preparationNanos, + appendNanos, + totalNanos, + delta.nanos("process.routeLookup"), + delta.nanos("process.embeddedInputPreparation"), + delta.nanos("process.hostBeforeFrozen"), + processFrozenNanos, + initializationFrozenNanos, + Math.addExact( + processFrozenNanos, + initializationFrozenNanos), + delta.nanos("process.hostAfterFrozen"), + delta.nanos("documentStart.hostBeforeFrozen"), + delta.nanos("documentStart.hostAfterFrozen"), + delta.nanos("temporal.graphPublication"), + wholeObjectsAdded, + delta.counter("wholeObjectStore.insertions"), + delta.counter("wholeObjectStore.duplicates"), + engine.journalSize(), + engine.documentCount(), + engine.routeRowCount(), + engine.embeddedDocuments( + PlaygroundFiveOccurrenceFixtures.HOST_ID).size(), + delta.counter("embedding.childSessionsCreated"), + delta.counter("embedding.childSessionsReused"), + delta.counter("DOCUMENT_INITIALIZATIONS"), + initializationRevisions, + delta.counter("EXTERNAL_PROCESS_CALLS"), + delta.counter("EMBEDDED_EPOCH_PROCESS_CALLS"), + delta.counter( + "temporal.initializationEpochApplications"), + delta.counter( + "temporal.initializationEventOccurrencesForwarded"), + delta.counter("PARENT_EPOCH_APPLICATIONS"), + delta.counter("frozenProcessCalls"), + integer(engine, "/initializationEventCount"), + integer(engine, "/alphaInitializationEventCount"), + integer(engine, "/betaInitializationEventCount"), + integer(engine, "/gammaInitializationEventCount"), + integer(engine, "/revisionApplications"), + forbidden(delta)); + result.verify(); + return result; + } + } + + private static long integer(TestEngine engine, String pointer) { + Object value = engine.value( + PlaygroundFiveOccurrenceFixtures.HOST_ID, + pointer).getValue(); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new IllegalStateException( + "Expected integer Host value at " + pointer); + } + + /** + * Uses committed occurrence causes when the candidate exposes them. The + * exact Round 13 baseline predates that audit field, so the measurement + * harness may fall back to the read-only completed catch-up projection. + * This keeps the A/B production trees exact while applying the same + * five-occurrence correctness assertion to both sides. + */ + private static List applicationPaths(TestEngine engine) { + List committedPaths = engine.history( + PlaygroundFiveOccurrenceFixtures.HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .flatMap(revision -> revision.catchUpCause().stream()) + .map(DocumentRevision.CatchUpCause::occurrencePath) + .toList(); + if (committedPaths.size() == 5) { + return committedPaths; + } + return engine.catchUpPlans().stream() + .map(CatchUpPlan::link) + .filter(link -> link.parentDocumentId().value().equals( + PlaygroundFiveOccurrenceFixtures.HOST_ID)) + .map(CatchUpPlan.Link::occurrencePath) + .sorted() + .toList(); + } + + private static Map forbidden( + EngineTestSupport.MetricDelta delta) { + Map result = new LinkedHashMap<>(); + for (String name : List.of( + "UNRELATED_DOCUMENT_READS", + "REQUEST_FRAGMENTS", + "TIMELINE_ENTRY_FRAGMENTS", + "ORDINARY_NODE_FRAGMENTS", + "FULL_ENVIRONMENT_SCANS", + "SOURCE_REPLAYS_PER_PARENT", + "POST_PROCESS_FULL_PROJECTIONS", + "PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY", + "CHILD_PROCESS_RERUNS_ON_PARENT_RETRY")) { + result.put(name, delta.counter(name)); + } + return Collections.unmodifiableMap(result); + } + + private static Path requiredPathProperty(String name) { + String value = System.getProperty(name); + if (value == null || value.isBlank()) { + throw new IllegalArgumentException( + "Missing required system property -D" + name); + } + return Path.of(value).toAbsolutePath().normalize(); + } + + private static int integerProperty( + String name, + int defaultValue, + int minimum) { + String configured = System.getProperty(name); + int value = configured == null + ? defaultValue : Integer.parseInt(configured); + if (value < minimum) { + throw new IllegalArgumentException( + name + " must be at least " + minimum); + } + return value; + } + + private static void createParent(Path output) throws IOException { + Path parent = output.toAbsolutePath().getParent(); + if (parent != null) { + Files.createDirectories(parent); + } + } + + private static String quote(String value) { + Objects.requireNonNull(value, "JSON string"); + StringBuilder quoted = new StringBuilder(value.length() + 2); + quoted.append('"'); + for (int index = 0; index < value.length(); index++) { + char character = value.charAt(index); + switch (character) { + case '"' -> quoted.append("\\\""); + case '\\' -> quoted.append("\\\\"); + case '\b' -> quoted.append("\\b"); + case '\f' -> quoted.append("\\f"); + case '\n' -> quoted.append("\\n"); + case '\r' -> quoted.append("\\r"); + case '\t' -> quoted.append("\\t"); + default -> { + if (character < 0x20 + || character == '\u2028' + || character == '\u2029') { + appendUnicodeEscape(quoted, character); + } else if (Character.isHighSurrogate(character)) { + require(index + 1 < value.length() + && Character.isLowSurrogate( + value.charAt(index + 1)), + "JSON string contains an unpaired " + + "high surrogate"); + quoted.append(character) + .append(value.charAt(++index)); + } else { + require(!Character.isLowSurrogate(character), + "JSON string contains an unpaired " + + "low surrogate"); + quoted.append(character); + } + } + } + } + return quoted.append('"').toString(); + } + + private static void appendUnicodeEscape( + StringBuilder output, + char value) { + final String hex = "0123456789abcdef"; + output.append("\\u") + .append(hex.charAt((value >>> 12) & 0x0f)) + .append(hex.charAt((value >>> 8) & 0x0f)) + .append(hex.charAt((value >>> 4) & 0x0f)) + .append(hex.charAt(value & 0x0f)); + } + + private static String requireNonBlank( + String value, + String name) { + Objects.requireNonNull(value, name + " must be present"); + require(!value.isBlank(), name + " must not be blank"); + return value; + } + + private static void require(boolean condition, String message) { + if (!condition) { + throw new IllegalStateException(message); + } + } + + record RuntimeIdentity( + String javaVersion, + String javaVendor, + String javaHome, + String osName, + String osVersion, + String osArch, + List jvmInputArguments, + int availableProcessors) { + RuntimeIdentity { + javaVersion = requireNonBlank(javaVersion, "java.version"); + javaVendor = requireNonBlank(javaVendor, "java.vendor"); + javaHome = requireNonBlank(javaHome, "java.home"); + osName = requireNonBlank(osName, "os.name"); + osVersion = requireNonBlank(osVersion, "os.version"); + osArch = requireNonBlank(osArch, "os.arch"); + Objects.requireNonNull( + jvmInputArguments, + "JVM input arguments must be present"); + List checkedArguments = new ArrayList<>( + jvmInputArguments.size()); + for (int index = 0; + index < jvmInputArguments.size(); + index++) { + checkedArguments.add(requireNonBlank( + jvmInputArguments.get(index), + "JVM input argument " + index)); + } + jvmInputArguments = List.copyOf(checkedArguments); + require(availableProcessors > 0, + "available processors must be positive"); + } + + static RuntimeIdentity current() { + return new RuntimeIdentity( + System.getProperty("java.version"), + System.getProperty("java.vendor"), + System.getProperty("java.home"), + System.getProperty("os.name"), + System.getProperty("os.version"), + System.getProperty("os.arch"), + ManagementFactory.getRuntimeMXBean() + .getInputArguments().stream() + .filter(argument -> !argument.startsWith( + "-D" + SAMPLE_PROPERTY + "=")) + .toList(), + Runtime.getRuntime().availableProcessors()); + } + + String toJson() { + StringBuilder json = new StringBuilder(512); + json.append("{\"javaVersion\": ") + .append(quote(javaVersion)) + .append(", \"javaVendor\": ") + .append(quote(javaVendor)) + .append(", \"javaHome\": ") + .append(quote(javaHome)) + .append(", \"osName\": ") + .append(quote(osName)) + .append(", \"osVersion\": ") + .append(quote(osVersion)) + .append(", \"osArch\": ") + .append(quote(osArch)) + .append(", \"jvmInputArguments\": ["); + for (int index = 0; + index < jvmInputArguments.size(); + index++) { + if (index > 0) { + json.append(", "); + } + json.append(quote(jvmInputArguments.get(index))); + } + return json.append("], \"availableProcessors\": ") + .append(availableProcessors) + .append('}') + .toString(); + } + } + + record Result( + String entryBlueId, + List applicationPaths, + RuntimeIdentity runtime, + long requestPreparationNanos, + long appendNanos, + long totalNanos, + long routeNanos, + long embeddedInputPreparationNanos, + long hostBeforeFrozenNanos, + long processFrozenNanos, + long initializationFrozenNanos, + long frozenNanos, + long hostAfterFrozenNanos, + long initializationHostBeforeFrozenNanos, + long initializationHostAfterFrozenNanos, + long graphPublicationNanos, + long wholeObjectsAdded, + long wholeObjectInsertions, + long wholeObjectDuplicates, + long journalEntries, + long documentCount, + long routeRows, + long embeddingBindings, + long childSessionsCreated, + long childSessionsReused, + long childInitializationCalls, + long childInitializationRevisions, + long externalProcessCalls, + long embeddedEpochProcessCalls, + long initializationApplications, + long initializationEventsForwarded, + long parentApplications, + long frozenProcessCalls, + long hostInitializationEvents, + long alphaInitializationEvents, + long betaInitializationEvents, + long gammaInitializationEvents, + long hostRevisionApplications, + Map forbiddenCounters) { + Result { + applicationPaths = List.copyOf(applicationPaths); + runtime = Objects.requireNonNull( + runtime, "runtime identity must be present"); + forbiddenCounters = Collections.unmodifiableMap( + new LinkedHashMap<>(forbiddenCounters)); + } + + long coordinationHostNanos() { + // The named host/graph timers overlap in a few nested paths. Use + // the wall-clock remainder so the aggregate never double counts. + return totalNanos - frozenNanos; + } + + void verify() { + require(totalNanos >= frozenNanos, + "frozen processing must be contained in total runtime"); + require(wholeObjectsAdded == 4L, + "request preparation must add four whole objects"); + require(journalEntries == 1L, + "one external Host entry must be journaled"); + require(documentCount == 4L, + "one Host plus three child sessions required"); + require(embeddingBindings == 5L, + "five embedding bindings required"); + require(childSessionsCreated == 3L, + "three child sessions must be created"); + require(childSessionsReused == 2L, + "two child occurrences must reuse sessions"); + require(childInitializationCalls == 3L, + "three child initialization calls required"); + require(childInitializationRevisions == 3L, + "each child must have one initialization revision"); + require(externalProcessCalls == 1L, + "one external Host PROCESS call required"); + require(embeddedEpochProcessCalls == 5L, + "five embedded-epoch PROCESS calls required"); + require(frozenProcessCalls == 6L, + "one external plus five embedded frozen PROCESS calls " + + "required"); + require(initializationApplications == 5L, + "five initialization applications required"); + require(initializationEventsForwarded == 5L, + "five forwarded initialization events required"); + require(parentApplications == 5L, + "five parent applications required"); + require(hostInitializationEvents == 5L + && alphaInitializationEvents == 2L + && betaInitializationEvents == 2L + && gammaInitializationEvents == 1L, + "Host event multiplicity must be 2/2/1"); + require(hostRevisionApplications == 5L, + "Host must commit five embedded revisions"); + require(applicationPaths.equals( + PlaygroundFiveOccurrenceFixtures + .expectedApplicationPaths()), + "parent application paths must be canonical"); + require(forbiddenCounters.values().stream() + .allMatch(value -> value == 0L), + "produced forbidden-work counters must all be zero"); + } + + String toJson() { + StringBuilder json = new StringBuilder(2_048); + json.append("{\n") + .append(" \"schemaVersion\": \"round13-playground-sample-v3\",\n") + .append(" \"runtime\": ") + .append(runtime.toJson()).append(",\n") + .append(" \"entryBlueId\": ") + .append(quote(entryBlueId)).append(",\n") + .append(" \"applicationPaths\": ["); + for (int index = 0; index < applicationPaths.size(); index++) { + if (index > 0) { + json.append(", "); + } + json.append(quote(applicationPaths.get(index))); + } + json.append("],\n"); + appendNumber(json, "requestPreparationNanos", + requestPreparationNanos); + appendNumber(json, "appendNanos", appendNanos); + appendNumber(json, "totalNanos", totalNanos); + appendNumber(json, "routeNanos", routeNanos); + appendNumber(json, "embeddedInputPreparationNanos", + embeddedInputPreparationNanos); + appendNumber(json, "hostBeforeFrozenNanos", + hostBeforeFrozenNanos); + appendNumber(json, "processFrozenNanos", processFrozenNanos); + appendNumber(json, "initializationFrozenNanos", + initializationFrozenNanos); + appendNumber(json, "frozenNanos", frozenNanos); + appendNumber(json, "hostAfterFrozenNanos", + hostAfterFrozenNanos); + appendNumber(json, "initializationHostBeforeFrozenNanos", + initializationHostBeforeFrozenNanos); + appendNumber(json, "initializationHostAfterFrozenNanos", + initializationHostAfterFrozenNanos); + appendNumber(json, "graphPublicationNanos", + graphPublicationNanos); + appendNumber(json, "coordinationHostNanos", + coordinationHostNanos()); + appendNumber(json, "wholeObjectsAdded", wholeObjectsAdded); + appendNumber(json, "wholeObjectInsertions", + wholeObjectInsertions); + appendNumber(json, "wholeObjectDuplicates", + wholeObjectDuplicates); + appendNumber(json, "journalEntries", journalEntries); + appendNumber(json, "documentCount", documentCount); + appendNumber(json, "routeRows", routeRows); + appendNumber(json, "embeddingBindings", embeddingBindings); + appendNumber(json, "childSessionsCreated", + childSessionsCreated); + appendNumber(json, "childSessionsReused", childSessionsReused); + appendNumber(json, "childInitializationCalls", + childInitializationCalls); + appendNumber(json, "childInitializationRevisions", + childInitializationRevisions); + appendNumber(json, "externalProcessCalls", + externalProcessCalls); + appendNumber(json, "embeddedEpochProcessCalls", + embeddedEpochProcessCalls); + appendNumber(json, "initializationApplications", + initializationApplications); + appendNumber(json, "initializationEventsForwarded", + initializationEventsForwarded); + appendNumber(json, "parentApplications", parentApplications); + appendNumber(json, "frozenProcessCalls", frozenProcessCalls); + appendNumber(json, "hostInitializationEvents", + hostInitializationEvents); + appendNumber(json, "alphaInitializationEvents", + alphaInitializationEvents); + appendNumber(json, "betaInitializationEvents", + betaInitializationEvents); + appendNumber(json, "gammaInitializationEvents", + gammaInitializationEvents); + appendNumber(json, "hostRevisionApplications", + hostRevisionApplications); + json.append(" \"forbiddenCounters\": {"); + int index = 0; + for (Map.Entry entry + : forbiddenCounters.entrySet()) { + if (index++ > 0) { + json.append(", "); + } + json.append(quote(entry.getKey())) + .append(": ").append(entry.getValue()); + } + return json.append("}\n}\n").toString(); + } + + private static void appendNumber( + StringBuilder json, + String name, + long value) { + json.append(" ").append(quote(name)).append(": ") + .append(value).append(",\n"); + } + } + + record Distribution(long p50Nanos, long p95Nanos, long maximumNanos) { + static Distribution from( + List results, + ToLongFunction measurement) { + long[] values = results.stream() + .mapToLong(measurement) + .sorted() + .toArray(); + int p50Index = Math.max(0, + (int) Math.ceil(values.length * 0.50) - 1); + int p95Index = Math.max(0, + (int) Math.ceil(values.length * 0.95) - 1); + return new Distribution( + values[p50Index], + values[p95Index], + values[values.length - 1]); + } + } + + record Campaign( + int warmups, + int samples, + Map distributions, + RuntimeIdentity runtime, + Result representative) { + Campaign { + distributions = Collections.unmodifiableMap( + new LinkedHashMap<>(distributions)); + runtime = Objects.requireNonNull( + runtime, "campaign runtime identity must be present"); + } + + static Campaign from(int warmups, List results) { + require(!results.isEmpty(), "campaign requires samples"); + RuntimeIdentity runtime = results.get(0).runtime(); + require(results.stream().allMatch( + result -> result.runtime().equals(runtime)), + "campaign runtime identity must remain stable"); + Map distributions = + new LinkedHashMap<>(); + distributions.put("requestPreparationNanos", + Distribution.from(results, + Result::requestPreparationNanos)); + distributions.put("appendNanos", + Distribution.from(results, Result::appendNanos)); + distributions.put("routeNanos", + Distribution.from(results, Result::routeNanos)); + distributions.put("embeddedInputPreparationNanos", + Distribution.from(results, + Result::embeddedInputPreparationNanos)); + distributions.put("hostBeforeFrozenNanos", + Distribution.from(results, + Result::hostBeforeFrozenNanos)); + distributions.put("processFrozenNanos", + Distribution.from(results, Result::processFrozenNanos)); + distributions.put("initializationFrozenNanos", + Distribution.from(results, + Result::initializationFrozenNanos)); + distributions.put("frozenNanos", + Distribution.from(results, Result::frozenNanos)); + distributions.put("hostAfterFrozenNanos", + Distribution.from(results, + Result::hostAfterFrozenNanos)); + distributions.put("initializationHostBeforeFrozenNanos", + Distribution.from(results, + Result::initializationHostBeforeFrozenNanos)); + distributions.put("initializationHostAfterFrozenNanos", + Distribution.from(results, + Result::initializationHostAfterFrozenNanos)); + distributions.put("graphPublicationNanos", + Distribution.from(results, + Result::graphPublicationNanos)); + distributions.put("coordinationHostNanos", + Distribution.from(results, + Result::coordinationHostNanos)); + distributions.put("totalNanos", + Distribution.from(results, Result::totalNanos)); + return new Campaign( + warmups, + results.size(), + distributions, + runtime, + results.get(results.size() - 1)); + } + + String toJson() { + StringBuilder json = new StringBuilder(4_096); + json.append("{\n") + .append(" \"schemaVersion\": \"round13-playground-campaign-v3\",\n") + .append(" \"generatedAt\": ") + .append(quote(Instant.now().toString())).append(",\n") + .append(" \"runtime\": ") + .append(runtime.toJson()).append(",\n") + .append(" \"warmups\": ").append(warmups) + .append(",\n \"samples\": ").append(samples) + .append(",\n \"distributions\": {\n"); + int index = 0; + for (Map.Entry entry + : distributions.entrySet()) { + if (index++ > 0) { + json.append(",\n"); + } + Distribution value = entry.getValue(); + json.append(" ").append(quote(entry.getKey())) + .append(": {\"p50Nanos\": ") + .append(value.p50Nanos()) + .append(", \"p95Nanos\": ") + .append(value.p95Nanos()) + .append(", \"maximumNanos\": ") + .append(value.maximumNanos()).append('}'); + } + json.append("\n },\n \"structuralSample\": ") + .append(representative.toJson().indent(2).strip()) + .append("\n}\n"); + return json.toString(); + } + + String toMarkdown() { + StringBuilder markdown = new StringBuilder(2_048); + markdown.append("# Round 13 five-occurrence runtime campaign\n\n") + .append("Warm-ups: ").append(warmups) + .append(". Measured samples: ").append(samples) + .append(".\n\n") + .append("| Span | p50 ms | p95 ms | max ms |\n") + .append("|---|---:|---:|---:|\n"); + distributions.forEach((name, value) -> markdown + .append("| ").append(name).append(" | ") + .append(millis(value.p50Nanos())).append(" | ") + .append(millis(value.p95Nanos())).append(" | ") + .append(millis(value.maximumNanos())).append(" |\n")); + return markdown.append("\nAll measured samples passed the exact ") + .append("three-session/five-binding/five-event semantic ") + .append("invariants.\n") + .toString(); + } + + private static String millis(long nanos) { + return "%.6f".formatted(nanos / 1_000_000.0); + } + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceInitializationTest.java b/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceInitializationTest.java new file mode 100644 index 0000000..1ec074b --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/PlaygroundFiveOccurrenceInitializationTest.java @@ -0,0 +1,111 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Playground acceptance for five embedding occurrences backed by three logical + * managed documents. The two repeated Game identities initialize once, while + * the Host observes one initialization-event occurrence for every path. + */ +@Tag("scenario") +final class PlaygroundFiveOccurrenceInitializationTest { + @Test + void fiveOccurrencesReuseThreeSessionsAndForwardFiveInitializationEvents() + throws Exception { + try (TestEngine engine = TestEngine.create()) { + Timeline owner = engine.timeline( + PlaygroundFiveOccurrenceFixtures.HOST_TIMELINE, + PlaygroundFiveOccurrenceFixtures.HOST_ACTOR); + PlaygroundFiveOccurrenceFixtures.registerChildTimelines(engine); + engine.start( + PlaygroundFiveOccurrenceFixtures.HOST_ID, + resource(PlaygroundFiveOccurrenceFixtures.HOST_RESOURCE)); + + int wholeObjectsBeforeRequest = engine.wholeObjectCount(); + var attachFive = PlaygroundFiveOccurrenceFixtures.attachFive(engine); + assertEquals(4, + engine.wholeObjectCount() - wholeObjectsBeforeRequest, + "three unique child bodies plus one whole request"); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + TimelineEntry attachment = engine.append(owner, attachFive); + engine.dispatch(attachment); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(4, engine.documentCount(), + "one Host plus three unique managed Game sessions"); + assertEquals(PlaygroundFiveOccurrenceFixtures.expectedBindings(), + engine.embeddedDocuments( + PlaygroundFiveOccurrenceFixtures.HOST_ID)); + + assertInitializedExactlyOnce(engine, "playground-game-alpha"); + assertInitializedExactlyOnce(engine, "playground-game-beta"); + assertInitializedExactlyOnce(engine, "playground-game-gamma"); + + assertEquals(5L, integer( + engine, PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/initializationEventCount")); + assertEquals(2L, integer( + engine, PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/alphaInitializationEventCount")); + assertEquals(2L, integer( + engine, PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/betaInitializationEventCount")); + assertEquals(1L, integer( + engine, PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/gammaInitializationEventCount")); + assertEquals(5L, integer( + engine, PlaygroundFiveOccurrenceFixtures.HOST_ID, + "/revisionApplications")); + + List applicationPaths = engine.history( + PlaygroundFiveOccurrenceFixtures.HOST_ID).stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind.EMBEDDED_REVISION_APPLICATION) + .map(revision -> revision.catchUpCause() + .orElseThrow().occurrencePath()) + .toList(); + assertEquals( + PlaygroundFiveOccurrenceFixtures.expectedApplicationPaths(), + applicationPaths, + "occurrence delivery is canonical and independent of request insertion order"); + + assertEquals(3L, work.counter( + "embedding.childSessionsCreated")); + assertEquals(2L, work.counter( + "embedding.childSessionsReused")); + assertEquals(5L, work.counter( + "temporal.initializationEpochApplications")); + assertEquals(5L, work.counter( + "temporal.initializationEventOccurrencesForwarded")); + assertEquals(5L, work.counter( + "temporal.parentEpochApplications")); + assertNoGenericSplitting(work); + } + } + + private static void assertInitializedExactlyOnce( + TestEngine engine, + String documentId) { + List history = engine.history(documentId); + assertEquals(1, history.size(), documentId); + assertEquals(DocumentRevision.Kind.INITIALIZATION, + history.get(0).kind(), documentId); + assertEquals(1L, integer(engine, documentId, + "/initializationCount"), documentId); + } + +} diff --git a/src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java b/src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java new file mode 100644 index 0000000..d3cdca3 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/Round101NbaFlagshipScenarioTest.java @@ -0,0 +1,485 @@ +package blue.coordination.integration; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationMetrics; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.DocumentSnapshot; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Round 10.1 flagship: three interleaved Games under two collection Roots. */ +@Tag("scenario") +final class Round101NbaFlagshipScenarioTest { + private static final long T0 = 1_720_000_000_000_000L; + private static final RootSpec PRIMARY = new RootSpec( + DocumentId.of("nba-round10-slate"), + "examples/nba/round10/slate", + "slate-owner", + "coordination/internal/nba-round10-slate"); + private static final RootSpec MIRROR = new RootSpec( + DocumentId.of("nba-round10-slate-mirror"), + "examples/nba/round10/slate-mirror", + "slate-mirror-owner", + "coordination/internal/nba-round10-slate-mirror"); + private static final GameSpec GAME_A = new GameSpec( + "a", + DocumentId.of("nba-round10-game-a"), + "examples/nba/round10/game-a", + 2L, + 3L); + private static final GameSpec GAME_B = new GameSpec( + "b", + DocumentId.of("nba-round10-game-b"), + "examples/nba/round10/game-b", + 4L, + 1L); + private static final GameSpec GAME_C = new GameSpec( + "c", + DocumentId.of("nba-round10-game-c"), + "examples/nba/round10/game-c", + 5L, + 6L); + private static final List GAMES = + List.of(GAME_A, GAME_B, GAME_C); + + @Test + void threeGameCollectionConvergesAcrossAdmissionOrders() + throws Exception { + List outcomes = new ArrayList<>(); + for (AdmissionOrder order : AdmissionOrder.values()) { + outcomes.add(run(order)); + } + + Outcome expected = outcomes.get(0); + SlateState expectedState = new SlateState( + 15L, + 3L, + 1L, + 15L, + true, + 11L, + 10L, + "Final", + "Final", + "Final"); + assertEquals(expectedState, expected.primaryState()); + assertEquals(expectedState, expected.mirrorState()); + for (Outcome outcome : outcomes) { + assertEquals(expected.primaryState(), outcome.primaryState(), + outcome.order().name()); + assertEquals(expected.mirrorState(), outcome.mirrorState(), + outcome.order().name()); + assertEquals(expected.gameStates(), outcome.gameStates(), + outcome.order().name()); + assertEquals(expected.primaryFinalBlueId(), + outcome.primaryFinalBlueId(), outcome.order().name()); + assertEquals(expected.mirrorFinalBlueId(), + outcome.mirrorFinalBlueId(), outcome.order().name()); + } + } + + private static Outcome run(AdmissionOrder order) throws Exception { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Map rootTimelines = registerRootTimelines( + engine); + Map gameTimelines = registerGameTimelines( + engine); + Map gameYaml = gameYaml(); + Map gameValues = exactGames( + engine, gameYaml); + + if (order == AdmissionOrder.ROOTS_FIRST) { + startRoots(engine); + } else if (order == AdmissionOrder.GAMES_MANAGED_FIRST) { + startGames(engine, gameYaml); + } + + List gameEntries = appendInterleavedHistory( + engine, gameTimelines); + + if (order != AdmissionOrder.ROOTS_FIRST) { + startRoots(engine); + } + + ExactValue attachmentRequest = attachmentRequest(gameValues); + TimelineEntry primaryAttachment = engine.appendAt( + rootTimelines.get(PRIMARY), + Operation.exact( + "attachGames", "slateChannel", attachmentRequest), + T0 + 1_000L); + TimelineEntry mirrorAttachment = engine.appendAt( + rootTimelines.get(MIRROR), + Operation.exact( + "attachGames", "slateChannel", attachmentRequest), + T0 + 1_020L); + TimelineEntry primarySnapshot = engine.appendAt( + rootTimelines.get(PRIMARY), + Operation.yaml("snapshotSlate", "slateChannel", "{}"), + T0 + 1_100L); + TimelineEntry mirrorSnapshot = engine.appendAt( + rootTimelines.get(MIRROR), + Operation.yaml("snapshotSlate", "slateChannel", "{}"), + T0 + 1_120L); + + ProcessingDrainReceipt receipt = engine.drain(); + + List expectedDrainOrder = new ArrayList<>( + entryIds(gameEntries)); + expectedDrainOrder.add(primaryAttachment.blueId()); + expectedDrainOrder.add(mirrorAttachment.blueId()); + expectedDrainOrder.add(primarySnapshot.blueId()); + expectedDrainOrder.add(mirrorSnapshot.blueId()); + assertEquals(expectedDrainOrder, + entryIds(receipt.processedEntries()), order.name()); + assertTrue(receipt.quiescent(), order.name()); + + verifyContainingRoot( + engine, + PRIMARY, + primaryAttachment, + primarySnapshot, + gameEntries); + verifyContainingRoot( + engine, + MIRROR, + mirrorAttachment, + mirrorSnapshot, + gameEntries); + assertSharedGames(engine); + assertEquals(30L, engine.metrics().counter( + CoordinationMetrics.Counter.PARENT_EPOCH_APPLICATIONS)); + assertEquals(0L, engine.metrics().counter( + CoordinationMetrics.Counter.SOURCE_REPLAYS_PER_PARENT)); + + return new Outcome( + order, + slateState(engine, PRIMARY.documentId()), + slateState(engine, MIRROR.documentId()), + gameStates(engine), + engine.document(PRIMARY.documentId()).blueId(), + engine.document(MIRROR.documentId()).blueId()); + } + } + + private static void verifyContainingRoot( + CoordinationEngine engine, + RootSpec root, + TimelineEntry attachment, + TimelineEntry snapshot, + List gameEntries) { + DocumentSnapshot current = engine.document(root.documentId()); + assertEquals(17L, current.epoch()); + assertEquals(18, engine.history(root.documentId()).size()); + assertEquals(expectedChildren(), current.embeddedChildren()); + assertEquals( + Set.of( + root.timelineId(), + GAME_A.timelineId(), + GAME_B.timelineId(), + GAME_C.timelineId()), + engine.effectiveTimelineIds(root.documentId())); + + List history = engine.history(root.documentId()); + assertEquals( + List.of(attachment.blueId(), snapshot.blueId()), + history.stream() + .flatMap(revision -> revision.sourceEntry().stream()) + .map(TimelineEntry::blueId) + .toList()); + assertEquals(snapshot.blueId(), history.get(history.size() - 1) + .sourceEntry().orElseThrow().blueId()); + + List embeddedCauses = history.stream() + .filter(revision -> revision.kind() + == DocumentRevision.Kind + .EMBEDDED_REVISION_APPLICATION) + .map(revision -> revision.causalEntryBlueId() + .orElseThrow()) + .toList(); + assertEquals(15, embeddedCauses.size()); + assertEquals( + entryIds(gameEntries), + embeddedCauses.subList(3, embeddedCauses.size())); + assertEquals(15L, number(current, "/applicationsSeenBySnapshot")); + assertEquals(15L, number(current, "/revisionApplications")); + } + + private static void assertSharedGames(CoordinationEngine engine) { + assertEquals( + engine.document(PRIMARY.documentId()).embeddedChildren(), + engine.document(MIRROR.documentId()).embeddedChildren()); + for (GameSpec game : GAMES) { + assertEquals(5, engine.history(game.documentId()).size()); + assertEquals(4L, engine.document(game.documentId()).epoch()); + } + } + + private static Map registerRootTimelines( + CoordinationEngine engine) { + Map result = new LinkedHashMap<>(); + for (RootSpec root : List.of(PRIMARY, MIRROR)) { + result.put(root, engine.registerTimeline( + root.timelineId(), root.actorId())); + } + return result; + } + + private static Map registerGameTimelines( + CoordinationEngine engine) { + Map result = new LinkedHashMap<>(); + for (GameSpec game : GAMES) { + result.put(game, engine.registerTimeline( + game.timelineId(), "nba-commissioner")); + } + return result; + } + + private static Map gameYaml() throws Exception { + String template = resource("examples/clean/nba-game.yaml"); + Map result = new LinkedHashMap<>(); + for (GameSpec game : GAMES) { + result.put(game, template + .replace( + "documentId: nba-game-2016-lal-min", + "documentId: " + game.documentId().value()) + .replace( + "name: Lakers at Timberwolves 2016 Historical Game", + "name: Round 10 Game " + game.key().toUpperCase()) + .replace( + "timelineId: examples/nba/game-2016-lal-min", + "timelineId: " + game.timelineId()) + .replace( + "accountId: nba-feed", + "accountId: nba-commissioner")); + } + return result; + } + + private static Map exactGames( + CoordinationEngine engine, + Map gameYaml) { + Map result = new LinkedHashMap<>(); + gameYaml.forEach((game, yaml) -> result.put( + game, engine.exactValue(yaml))); + return result; + } + + private static void startGames( + CoordinationEngine engine, + Map gameYaml) { + gameYaml.forEach((game, yaml) -> engine.startDocument( + game.documentId(), yaml)); + } + + private static void startRoots(CoordinationEngine engine) + throws Exception { + engine.startDocument(PRIMARY.documentId(), slateYaml(PRIMARY)); + engine.startDocument(MIRROR.documentId(), slateYaml(MIRROR)); + } + + private static String slateYaml(RootSpec root) throws Exception { + return resource("examples/clean/nba-round10-slate.yaml") + .replace( + "documentId: nba-round10-slate", + "documentId: " + root.documentId().value()) + .replace( + "timelineId: examples/nba/round10/slate", + "timelineId: " + root.timelineId()) + .replace( + "accountId: slate-owner", + "accountId: " + root.actorId()) + .replace( + "timelineId: coordination/internal/nba-round10-slate", + "timelineId: " + root.internalTimelineId()); + } + + private static ExactValue attachmentRequest( + Map games) { + Map fields = new LinkedHashMap<>(); + for (GameSpec game : GAMES) { + fields.put(game.key(), games.get(game).referenceNode()); + } + return ExactValue.verified(new Node().properties(fields)); + } + + private static List appendInterleavedHistory( + CoordinationEngine engine, + Map timelines) { + List schedule = List.of( + operation(GAME_A, 100L, "startGame", "{}"), + operation(GAME_B, 150L, "startGame", "{}"), + operation(GAME_C, 200L, "startGame", "{}"), + operation(GAME_C, 300L, "homeScores", "points: 5"), + operation(GAME_B, 350L, "awayScores", "points: 1"), + operation(GAME_A, 400L, "homeScores", "points: 2"), + operation(GAME_C, 600L, "awayScores", "points: 6"), + operation(GAME_B, 650L, "homeScores", "points: 4"), + operation(GAME_A, 700L, "awayScores", "points: 3"), + operation(GAME_C, 800L, "endGame", "{}"), + operation(GAME_B, 850L, "endGame", "{}"), + operation(GAME_A, 900L, "endGame", "{}")); + List result = new ArrayList<>(); + for (ScheduledOperation scheduled : schedule) { + result.add(engine.appendAt( + timelines.get(scheduled.game()), + scheduled.operation(), + T0 + scheduled.offset())); + } + return result; + } + + private static ScheduledOperation operation( + GameSpec game, + long offset, + String operation, + String request) { + return new ScheduledOperation( + game, + offset, + Operation.yaml(operation, "gameFeed", request)); + } + + private static Map expectedChildren() { + return Map.of( + "/games/a", GAME_A.documentId(), + "/games/b", GAME_B.documentId(), + "/games/c", GAME_C.documentId()); + } + + private static SlateState slateState( + CoordinationEngine engine, + DocumentId documentId) { + DocumentSnapshot snapshot = engine.document(documentId); + return new SlateState( + number(snapshot, "/revisionApplications"), + number(snapshot, "/endedGameEventCount"), + number(snapshot, "/snapshotCount"), + number(snapshot, "/applicationsSeenBySnapshot"), + Boolean.TRUE.equals(value(snapshot, "/allGamesFinal")), + number(snapshot, "/observedHomeScoreTotal"), + number(snapshot, "/observedAwayScoreTotal"), + text(snapshot, "/observedGameAStatus"), + text(snapshot, "/observedGameBStatus"), + text(snapshot, "/observedGameCStatus")); + } + + private static Map gameStates( + CoordinationEngine engine) { + Map result = new LinkedHashMap<>(); + for (GameSpec game : GAMES) { + DocumentSnapshot snapshot = engine.document(game.documentId()); + GameState state = new GameState( + number(snapshot, "/homeScore"), + number(snapshot, "/awayScore"), + number(snapshot, "/playCount"), + text(snapshot, "/status")); + assertEquals(new GameState( + game.homeScore(), game.awayScore(), 2L, "Final"), state); + result.put(game.key(), state); + } + return Map.copyOf(result); + } + + private static List entryIds(List entries) { + return entries.stream().map(TimelineEntry::blueId).toList(); + } + + private static long number(DocumentSnapshot snapshot, String path) { + Object value = value(snapshot, path); + if (value instanceof BigInteger integer) { + return integer.longValueExact(); + } + if (value instanceof Number number) { + return number.longValue(); + } + throw new AssertionError("Expected Integer at " + + snapshot.documentId() + path + ", got " + value); + } + + private static String text(DocumentSnapshot snapshot, String path) { + Object value = value(snapshot, path); + if (value instanceof String text) { + return text; + } + throw new AssertionError("Expected Text at " + + snapshot.documentId() + path + ", got " + value); + } + + private static Object value(DocumentSnapshot snapshot, String path) { + return snapshot.valueAt(path).copyNode().getValue(); + } + + private enum AdmissionOrder { + HISTORIES_FIRST, + ROOTS_FIRST, + GAMES_MANAGED_FIRST + } + + private record RootSpec( + DocumentId documentId, + String timelineId, + String actorId, + String internalTimelineId) { + } + + private record GameSpec( + String key, + DocumentId documentId, + String timelineId, + long homeScore, + long awayScore) { + } + + private record ScheduledOperation( + GameSpec game, + long offset, + Operation operation) { + } + + private record SlateState( + long revisionApplications, + long endedGameEventCount, + long snapshotCount, + long applicationsSeenBySnapshot, + boolean allGamesFinal, + long observedHomeScoreTotal, + long observedAwayScoreTotal, + String observedGameAStatus, + String observedGameBStatus, + String observedGameCStatus) { + } + + private record GameState( + long homeScore, + long awayScore, + long playCount, + String status) { + } + + private record Outcome( + AdmissionOrder order, + SlateState primaryState, + SlateState mirrorState, + Map gameStates, + String primaryFinalBlueId, + String mirrorFinalBlueId) { + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java b/src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java new file mode 100644 index 0000000..0d49d42 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java @@ -0,0 +1,545 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.coordination.internal.CoordinationTestControl; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** Writes the exact single-run Round 12 NBA span and structural evidence. */ +final class Round12NbaEvidence { + /** + * These production-backed phases are intentionally sparse across the + * heterogeneous admission, external-entry, and embedded-transition spans + * collected by this historical report. An absent entry means that phase + * did not run for that span; every other timer remains fail-closed through + * {@link EngineTestSupport.MetricDelta#nanos(String)}. + */ + private static final Set OPTIONAL_SPAN_PHASES = Set.of( + "process.routeLookup", + "temporal.graphPublication", + "process.embeddedInputPreparation", + "process.commitReadinessPublication"); + private static final String HOST_ONE_ADMISSION = "Host 1 admission"; + private static final String HOST_ONE_ATTACHMENT = "Host 1 attachment"; + private static final String GAME_START = "Game start"; + private static final String FIRST_SCORE = "Game first scoring operation"; + private static final String HOST_TWO_ADMISSION = "Host 2 admission"; + private static final String HOST_TWO_ATTACHMENT = + "Host 2 attachment/catch-up"; + private static final String SECOND_SCORE = + "Game second scoring operation"; + private static final String GAME_END = "Game end"; + private static final List FORBIDDEN_COUNTERS = List.of( + "REQUEST_FRAGMENTS", + "TIMELINE_ENTRY_FRAGMENTS", + "ORDINARY_NODE_FRAGMENTS", + "FULL_ENVIRONMENT_SCANS", + "SOURCE_REPLAYS_PER_PARENT", + "POST_PROCESS_FULL_PROJECTIONS"); + private static final List CAMPAIGN_SOURCES = List.of( + "src/main/java/blue/coordination/internal/DefaultCoordinationEngine.java", + "src/main/java/blue/coordination/internal/DocumentTransitionProcessor.java", + "src/main/java/blue/coordination/internal/SequentialDrainCoordinator.java", + "src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java", + "src/integrationTest/java/blue/coordination/integration/EngineMetrics.java", + "src/integrationTest/java/blue/coordination/integration/EngineTestSupport.java", + "src/integrationTest/java/blue/coordination/integration/Round12NbaFixtures.java", + "src/integrationTest/java/blue/coordination/integration/TestEngine.java", + "src/integrationTest/resources/examples/round12/nba-lifecycle-game.yaml", + "src/integrationTest/resources/examples/round12/nba-lifecycle-host.yaml", + "src/scenarioTest/java/blue/coordination/integration/" + + "NbaSharedGameLifecycleAcrossHostsTest.java", + "src/scenarioTest/java/blue/coordination/integration/Round12NbaEvidence.java"); + + private final TestEngine engine; + private final Map steps = new LinkedHashMap<>(); + + private Round12NbaEvidence(TestEngine engine) { + this.engine = engine; + engine.beginTransitionTrace(); + } + + static Round12NbaEvidence begin(TestEngine engine) { + return new Round12NbaEvidence(engine); + } + + void admit(String name, String documentId, Runnable admission) { + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + long started = System.nanoTime(); + admission.run(); + steps.put(name, new Step( + documentId, + null, + 0L, + System.nanoTime() - started, + EngineTestSupport.delta(before, engine.metricsSnapshot()))); + } + + TimelineEntry dispatch( + String name, + String documentId, + Timeline timeline, + Operation operation) { + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + long started = System.nanoTime(); + long appendStarted = System.nanoTime(); + TimelineEntry entry = engine.append(timeline, operation); + long appendNanos = System.nanoTime() - appendStarted; + engine.dispatch(entry); + steps.put(name, new Step( + documentId, + entry.blueId(), + appendNanos, + System.nanoTime() - started, + EngineTestSupport.delta(before, engine.metricsSnapshot()))); + return entry; + } + + Path write( + String gameId, + String hostOne, + String hostTwo, + EngineTestSupport.MetricDelta twoHostTotal) throws Exception { + Step firstAttachment = requireStep(HOST_ONE_ATTACHMENT); + Step gameEnd = requireStep(GAME_END); + List spans = List.of( + admissionSpan(HOST_ONE_ADMISSION, hostOne), + stepSpan(HOST_ONE_ATTACHMENT), + transitionSpan("Game initialization", trace( + gameId, "INITIALIZATION", firstAttachment.entryBlueId())), + transitionSpan("Host 1 initialization application", trace( + hostOne, "EMBEDDED_REVISION_APPLICATION", + firstAttachment.entryBlueId())), + stepSpan(GAME_START), + stepSpan(FIRST_SCORE), + admissionSpan(HOST_TWO_ADMISSION, hostTwo), + stepSpan(HOST_TWO_ATTACHMENT), + stepSpan(SECOND_SCORE), + stepSpan(GAME_END), + transitionSpan("Host 1 end application", trace( + hostOne, "EMBEDDED_REVISION_APPLICATION", + gameEnd.entryBlueId())), + transitionSpan("Host 2 end application", trace( + hostTwo, "EMBEDDED_REVISION_APPLICATION", + gameEnd.entryBlueId()))); + Path repository = Path.of("").toAbsolutePath().normalize(); + Manifest main = manifest(repository, productionSources(repository)); + Manifest campaign = manifest(repository, CAMPAIGN_SOURCES.stream() + .map(repository::resolve).toList()); + String json = json( + spans, gameId, hostOne, hostTwo, twoHostTotal, + main, campaign); + Path configured = Path.of(System.getProperty( + "blue.coordination.round12.nbaEvidence", + "build/reports/round12/nba-shared-game-lifecycle.json")); + Path output = configured.isAbsolute() + ? configured : repository.resolve(configured); + Files.createDirectories(output.getParent()); + Files.writeString(output, json, StandardCharsets.UTF_8); + return output; + } + + private Span admissionSpan(String name, String documentId) { + Step step = requireStep(name); + DocumentRevision revision = engine.history(documentId).get(0); + return span( + name, + documentId, + revision.epoch(), + revision.kind().name(), + null, + revision.causalEntryBlueId().orElse(null), + step.appendNanos(), + step.totalNanos(), + step.metrics(), + true); + } + + private Span stepSpan(String name) { + Step step = requireStep(name); + CoordinationTestControl.TransitionTrace trace = trace( + step.documentId(), "TIMELINE_ENTRY", step.entryBlueId()); + return span( + name, + trace.documentId(), + trace.epoch(), + trace.kind(), + trace.sourceEntryBlueId(), + trace.causalEntryBlueId(), + step.appendNanos(), + step.totalNanos(), + step.metrics(), + false); + } + + private Span transitionSpan( + String name, + CoordinationTestControl.TransitionTrace trace) { + boolean initialization = "INITIALIZATION".equals(trace.kind()); + return span( + name, + trace.documentId(), + trace.epoch(), + trace.kind(), + trace.sourceEntryBlueId(), + trace.causalEntryBlueId(), + 0L, + trace.totalNanos(), + new EngineTestSupport.MetricDelta( + Map.of(), trace.phaseNanos()), + initialization); + } + + private static Span span( + String name, + String documentId, + long epoch, + String kind, + String sourceEntryBlueId, + String causalEntryBlueId, + long append, + long total, + EngineTestSupport.MetricDelta metrics, + boolean initialization) { + String prefix = initialization ? "documentStart." : "process."; + return new Span( + name, + documentId, + epoch, + kind, + sourceEntryBlueId, + causalEntryBlueId, + append, + optionalSpanNanos(metrics, "process.routeLookup"), + metrics.nanos(prefix + "hostBeforeFrozen"), + metrics.nanos(initialization + ? "documentStart.contractsInitialize" + : "process.frozen"), + metrics.nanos(prefix + "hostAfterFrozen"), + optionalSpanNanos(metrics, "temporal.graphPublication"), + optionalSpanNanos(metrics, + "process.embeddedInputPreparation"), + optionalSpanNanos(metrics, + "process.commitReadinessPublication"), + total); + } + + private static long optionalSpanNanos( + EngineTestSupport.MetricDelta metrics, + String phase) { + if (!OPTIONAL_SPAN_PHASES.contains(phase)) { + throw new AssertionError( + "Unknown optional Round 12 span phase '" + phase + "'"); + } + return metrics.phaseNanos().getOrDefault(phase, 0L); + } + + private CoordinationTestControl.TransitionTrace trace( + String documentId, + String kind, + String causalOrSourceEntryBlueId) { + return engine.transitionTrace().stream() + .filter(candidate -> documentId.equals(candidate.documentId())) + .filter(candidate -> kind.equals(candidate.kind())) + .filter(candidate -> causalOrSourceEntryBlueId.equals( + "TIMELINE_ENTRY".equals(kind) + ? candidate.sourceEntryBlueId() + : candidate.causalEntryBlueId())) + .findFirst() + .orElseThrow(() -> new IllegalStateException( + "Missing transition trace for " + documentId + + " " + kind + " " + + causalOrSourceEntryBlueId)); + } + + private Step requireStep(String name) { + Step step = steps.get(name); + if (step == null) { + throw new IllegalStateException("Missing NBA evidence step " + name); + } + return step; + } + + private String json( + List spans, + String gameId, + String hostOne, + String hostTwo, + EngineTestSupport.MetricDelta total, + Manifest main, + Manifest campaign) { + StringBuilder out = new StringBuilder(12_000); + out.append("{\n") + .append(" \"schemaVersion\": \"round12-nba-evidence-v1\",\n") + .append(" \"status\": \"MEASURED_SINGLE_SCENARIO\",\n") + .append(" \"spanSemantics\": ") + .append(quote("Logical operation spans are inclusive; nested " + + "initialization and parent-application spans are " + + "reported independently and must not be summed.")) + .append(",\n") + .append(" \"sourceState\": {\n") + .append(" \"mainSourceManifestAlgorithm\": ") + .append(quote("SHA-256 of LF-joined sorted repository path, " + + "ASCII space, file SHA-256; no trailing LF")) + .append(",\n") + .append(" \"mainSourceManifestSha256\": ") + .append(quote(main.sha256())).append(",\n") + .append(" \"mainSourceFiles\": ").append(main.files()) + .append(",\n") + .append(" \"mainSourceLines\": ").append(main.lines()) + .append(",\n") + .append(" \"campaignSourcesSha256\": ") + .append(quote(campaign.sha256())).append(",\n") + .append(" \"campaignSourceFiles\": ") + .append(campaign.files()).append("\n") + .append(" },\n") + .append(" \"runtime\": {\n") + .append(" \"javaVersion\": ") + .append(quote(System.getProperty("java.version"))).append(",\n") + .append(" \"javaVendor\": ") + .append(quote(System.getProperty("java.vendor"))).append(",\n") + .append(" \"osName\": ") + .append(quote(System.getProperty("os.name"))).append(",\n") + .append(" \"osArch\": ") + .append(quote(System.getProperty("os.arch"))).append("\n") + .append(" },\n") + .append(" \"spans\": [\n"); + for (int i = 0; i < spans.size(); i++) { + appendSpan(out, spans.get(i)); + out.append(i + 1 == spans.size() ? "\n" : ",\n"); + } + out.append(" ],\n") + .append(" \"hardEvidence\": {\n") + .append(" \"gameSessionsCreated\": ") + .append(total.counter("embedding.childSessionsCreated")) + .append(",\n") + .append(" \"gameSessionsReused\": ") + .append(total.counter("embedding.childSessionsReused")) + .append(",\n") + .append(" \"gameInitializationRevisions\": ") + .append(engine.history(gameId).stream().filter(revision -> + revision.kind() == DocumentRevision.Kind.INITIALIZATION) + .count()).append(",\n") + .append(" \"gameInitializationCount\": ") + .append(EngineTestSupport.integer( + engine, gameId, "/initializationCount")) + .append(",\n") + .append(" \"host1InitializationEventCount\": ") + .append(EngineTestSupport.integer( + engine, hostOne, "/gameInitializationEventCount")) + .append(",\n") + .append(" \"host2InitializationEventCount\": ") + .append(EngineTestSupport.integer( + engine, hostTwo, "/gameInitializationEventCount")) + .append(",\n") + .append(" \"host1EndingEventCount\": ") + .append(EngineTestSupport.integer( + engine, hostOne, "/gameEndedEventCount")) + .append(",\n") + .append(" \"host2EndingEventCount\": ") + .append(EngineTestSupport.integer( + engine, hostTwo, "/gameEndedEventCount")) + .append(",\n") + .append(" \"gameSourceProcessCalls\": {\n") + .append(" \"start\": ") + .append(requireStep(GAME_START).metrics().counter( + "EXTERNAL_PROCESS_CALLS")).append(",\n") + .append(" \"firstScore\": ") + .append(requireStep(FIRST_SCORE).metrics().counter( + "EXTERNAL_PROCESS_CALLS")).append(",\n") + .append(" \"secondScore\": ") + .append(requireStep(SECOND_SCORE).metrics().counter( + "EXTERNAL_PROCESS_CALLS")).append(",\n") + .append(" \"end\": ") + .append(requireStep(GAME_END).metrics().counter( + "EXTERNAL_PROCESS_CALLS")).append("\n") + .append(" },\n") + .append(" \"initializationEpochApplications\": ") + .append(total.counter( + "temporal.initializationEpochApplications")) + .append(",\n") + .append(" \"initializationEventOccurrencesForwarded\": ") + .append(total.counter( + "temporal.initializationEventOccurrencesForwarded")) + .append(",\n") + .append(" \"parentEpochApplications\": ") + .append(total.counter("temporal.parentEpochApplications")) + .append(",\n") + .append(" \"gameRevisions\": ") + .append(engine.history(gameId).size()).append("\n") + .append(" },\n") + .append(" \"forbiddenCounters\": {\n"); + for (int i = 0; i < FORBIDDEN_COUNTERS.size(); i++) { + String counter = FORBIDDEN_COUNTERS.get(i); + out.append(" ").append(quote(counter)).append(": ") + .append(total.counter(counter)) + .append(i + 1 == FORBIDDEN_COUNTERS.size() + ? "\n" : ",\n"); + } + out.append(" },\n") + .append(" \"repeatedThreeScenarioP95\": {\n") + .append(" \"status\": \"PENDING_VERIFICATION\",\n") + .append(" \"historicalBaselineHostMs\": {\n") + .append(" \"warmOrdinary\": 15.571,\n") + .append(" \"warmPayNotePlusParent\": 46.645,\n") + .append(" \"threeLayerRestaurantProduct\": 54.696\n") + .append(" },\n") + .append(" \"round12CandidateP95Ms\": null,\n") + .append(" \"regressionPercent\": null,\n") + .append(" \"reason\": ") + .append(quote("This artifact is one NBA lifecycle run, not " + + "the required repeated same-source three-scenario " + + "host p95 campaign.")) + .append("\n }\n") + .append("}\n"); + return out.toString(); + } + + private static void appendSpan(StringBuilder out, Span span) { + out.append(" {\n") + .append(" \"name\": ").append(quote(span.name())) + .append(",\n \"documentId\": ") + .append(quote(span.documentId())) + .append(",\n \"epoch\": ").append(span.epoch()) + .append(",\n \"transitionKind\": ") + .append(quote(span.kind())) + .append(",\n \"sourceEntryBlueId\": ") + .append(nullable(span.sourceEntryBlueId())) + .append(",\n \"causalEntryBlueId\": ") + .append(nullable(span.causalEntryBlueId())) + .append(",\n \"nanos\": {\n") + .append(" \"append\": ").append(span.append()) + .append(",\n \"routeLookup\": ") + .append(span.routeLookup()) + .append(",\n \"hostBeforeFrozen\": ") + .append(span.hostBeforeFrozen()) + .append(",\n \"frozenProcess\": ") + .append(span.frozenProcess()) + .append(",\n \"hostAfterFrozen\": ") + .append(span.hostAfterFrozen()) + .append(",\n \"graphPublication\": ") + .append(span.graphPublication()) + .append(",\n \"embeddedInputPreparation\": ") + .append(span.embeddedInputPreparation()) + .append(",\n \"commitReadinessPublication\": ") + .append(span.commitReadinessPublication()) + .append(",\n \"total\": ").append(span.total()) + .append("\n }\n }"); + } + + private static List productionSources(Path repository) + throws IOException { + try (var files = Files.walk(repository.resolve("src/main/java"))) { + return files.filter(Files::isRegularFile) + .filter(path -> path.toString().endsWith(".java")) + .sorted(Comparator.comparing(path -> portable( + repository.relativize(path)))) + .toList(); + } + } + + private static Manifest manifest(Path repository, List paths) + throws IOException, NoSuchAlgorithmException { + MessageDigest manifest = MessageDigest.getInstance("SHA-256"); + long lines = 0L; + List sorted = new ArrayList<>(paths); + sorted.sort(Comparator.comparing(path -> portable( + repository.relativize(path)))); + for (int index = 0; index < sorted.size(); index++) { + Path path = sorted.get(index); + byte[] bytes = Files.readAllBytes(path); + String relative = portable(repository.relativize(path)); + String fileHash = hex(MessageDigest.getInstance("SHA-256") + .digest(bytes)); + if (index > 0) { + manifest.update((byte) '\n'); + } + manifest.update(relative.getBytes(StandardCharsets.UTF_8)); + manifest.update((byte) ' '); + manifest.update(fileHash.getBytes(StandardCharsets.US_ASCII)); + for (byte value : bytes) { + if (value == '\n') { + lines++; + } + } + } + return new Manifest(hex(manifest.digest()), sorted.size(), lines); + } + + private static String portable(Path path) { + return path.toString().replace('\\', '/'); + } + + private static String nullable(String value) { + return value == null ? "null" : quote(value); + } + + private static String quote(String value) { + StringBuilder escaped = new StringBuilder(value.length() + 2) + .append('"'); + for (int i = 0; i < value.length(); i++) { + char character = value.charAt(i); + switch (character) { + case '"' -> escaped.append("\\\""); + case '\\' -> escaped.append("\\\\"); + case '\n' -> escaped.append("\\n"); + case '\r' -> escaped.append("\\r"); + case '\t' -> escaped.append("\\t"); + default -> escaped.append(character); + } + } + return escaped.append('"').toString(); + } + + private static String hex(byte[] bytes) { + StringBuilder result = new StringBuilder(bytes.length * 2); + for (byte value : bytes) { + result.append(Character.forDigit((value >>> 4) & 0xf, 16)); + result.append(Character.forDigit(value & 0xf, 16)); + } + return result.toString(); + } + + private record Step( + String documentId, + String entryBlueId, + long appendNanos, + long totalNanos, + EngineTestSupport.MetricDelta metrics) { + } + + private record Span( + String name, + String documentId, + long epoch, + String kind, + String sourceEntryBlueId, + String causalEntryBlueId, + long append, + long routeLookup, + long hostBeforeFrozen, + long frozenProcess, + long hostAfterFrozen, + long graphPublication, + long embeddedInputPreparation, + long commitReadinessPublication, + long total) { + } + + private record Manifest(String sha256, int files, long lines) { + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java b/src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java new file mode 100644 index 0000000..291ff00 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/ThousandDocumentLocalityScenarioTest.java @@ -0,0 +1,51 @@ +package blue.coordination.integration; + +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** Indexed dispatch remains local with one target among 1,000 managed documents. */ +@Tag("scenario") +final class ThousandDocumentLocalityScenarioTest { + @Test + void oneTargetDoesNotOpenUnrelatedDocumentsOrTimelines() throws Exception { + try (TestEngine engine = TestEngine.create()) { + for (int index = 1; index < 1_000; index++) { + String id = "locality-unrelated-" + index; + engine.timeline("examples/locality/" + index, id); + engine.start(id, "documentId: " + id + "\nmarker: 0\n"); + } + Timeline target = engine.timeline( + "examples/clean-counter/alice", "alice"); + engine.timeline("examples/clean-counter/bob", "bob"); + engine.start("counter", resource("examples/clean/counter.yaml")); + assertEquals(1_000, engine.documentCount()); + + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + ProcessingDrainReceipt receipt = engine.appendAndDispatch( + target, Operation.yaml( + "increment", "aliceChannel", "amount: 1")); + EngineTestSupport.MetricDelta work = delta( + before, engine.metricsSnapshot()); + + assertEquals(1, receipt.outcomes().size()); + assertEquals("counter", receipt.onlyOutcome().documentId().value()); + assertEquals(1L, work.counter("ROUTE_INDEX_LOOKUPS")); + assertEquals(1L, work.counter("routing.rowsInspected")); + assertEquals(1L, work.counter("EXTERNAL_PROCESS_CALLS")); + assertEquals(0L, work.counter("HISTORICAL_WINDOWS_OPENED")); + assertEquals(0L, work.counter("UNRELATED_DOCUMENT_READS")); + assertNoGenericSplitting(work); + assertEquals(1, engine.journalSize()); + assertEquals(1L, integer(engine, "counter", "/counter")); + } + } +} diff --git a/src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java b/src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java new file mode 100644 index 0000000..cad8423 --- /dev/null +++ b/src/scenarioTest/java/blue/coordination/integration/WadowicePayNoteAcceptanceTest.java @@ -0,0 +1,704 @@ +package blue.coordination.integration; + +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.Operation; +import blue.coordination.api.ProcessingDrainReceipt; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestReporter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import static blue.coordination.integration.EngineTestSupport.assertNoGenericSplitting; +import static blue.coordination.integration.EngineTestSupport.delta; +import static blue.coordination.integration.EngineTestSupport.integer; +import static blue.coordination.integration.EngineTestSupport.resource; +import static blue.coordination.integration.EngineTestSupport.text; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Complete Wadowice acceptance campaign supported by the exact Round 10 + * fixture, including the original explicit late-cancellation refusal branch. + */ +@Tag("scenario") +final class WadowicePayNoteAcceptanceTest { + private static final String PAY_NOTE = "large-paynote"; + private static final String HOST = "large-order-host"; + private static final String HOTEL_PRODUCT = + "large-paynote-hotel-condition-product"; + private static final String RESTAURANT_PRODUCT = + "large-paynote-restaurant-condition-product"; + private static final long T0 = 1_720_100_000_000_000L; + private static final List LATE_CANCELLATION_BUSINESS_PATHS = + List.of( + "/status", + "/authorization", + "/amount", + "/capture", + "/refund", + "/productConditions/hotel/confirmed", + "/productConditions/hotel/done", + "/productConditions/hotel/status", + "/productConditions/restaurant/confirmed", + "/productConditions/restaurant/done", + "/productConditions/restaurant/cancelled", + "/productConditions/restaurant/discountApplied", + "/productConditions/restaurant/status", + "/productConditions/restaurant/product/confirmed", + "/productConditions/restaurant/product/confirmedAt", + "/productConditions/restaurant/product/done", + "/productConditions/restaurant/product/cancelled", + "/productConditions/restaurant/product/discountApplied"); + + @Test + void completionHasFullBusinessParityStandaloneAndEmbedded( + TestReporter reporter) throws Exception { + try (Campaign standalone = Campaign.standalone(); + Campaign embedded = Campaign.embedded()) { + standalone.prepareCapturedPayment(); + embedded.prepareCapturedPayment(); + + standalone.completeRestaurant(); + embedded.completeRestaurant(); + + assertCompleted(standalone); + assertCompleted(embedded); + assertBusinessParity(standalone, embedded); + standalone.verifyAccounting(); + embedded.verifyAccounting(); + standalone.publishTimings(reporter, "standalone-completion"); + embedded.publishTimings(reporter, "embedded-completion"); + } + } + + @Test + void embeddedCancellationRequestsAndCompletesOneRestaurantRefund( + TestReporter reporter) throws Exception { + try (Campaign campaign = Campaign.embedded()) { + campaign.prepareCapturedPayment(); + campaign.cancelRestaurant(); + + assertTrue(campaign.bool( + "/productConditions/restaurant/product/cancelled")); + assertTrue(campaign.bool( + "/productConditions/restaurant/cancelled")); + assertFalse(campaign.bool("/productConditions/restaurant/done")); + assertRefund(campaign, "restaurant-refund-001", 38_000L, + 92_000L); + assertEquals(1L, campaign.eventCount( + "PayNote/Refund Requested")); + assertEquals(1L, campaign.eventCount( + "PayNote/Refund Completed")); + campaign.assertParentCurrent(); + campaign.verifyAccounting(); + campaign.publishTimings(reporter, "embedded-cancellation"); + } + } + + @Test + void embeddedTenPercentAdjustmentCompletesOnePartialRefund( + TestReporter reporter) throws Exception { + try (Campaign campaign = Campaign.embedded()) { + campaign.prepareCapturedPayment(); + campaign.discountRestaurant(); + + assertTrue(campaign.bool( + "/productConditions/restaurant/product/done")); + assertTrue(campaign.bool( + "/productConditions/restaurant/product/discountApplied")); + assertTrue(campaign.bool( + "/productConditions/restaurant/done")); + assertTrue(campaign.bool( + "/productConditions/restaurant/discountApplied")); + assertRefund(campaign, "restaurant-discount-001", 3_800L, + 126_200L); + assertEquals(1L, campaign.eventCount( + "PayNote/Condition Product Discount Applied")); + assertEquals(1L, campaign.eventCount( + "PayNote/Refund Requested")); + assertEquals(1L, campaign.eventCount( + "PayNote/Refund Completed")); + campaign.assertParentCurrent(); + campaign.verifyAccounting(); + campaign.publishTimings(reporter, "embedded-adjustment"); + } + } + + @Test + void embeddedLateCancellationIsRefusedWithoutBusinessStateChange( + TestReporter reporter) throws Exception { + try (Campaign campaign = Campaign.embedded()) { + campaign.prepareCapturedPayment(); + List unchangedBusinessState = campaign.businessIdentity( + LATE_CANCELLATION_BUSINESS_PATHS); + int childHistoryBefore = campaign.engine.history( + RESTAURANT_PRODUCT).size(); + + campaign.refuseLateCancellation(); + + assertEquals(unchangedBusinessState, campaign.businessIdentity( + LATE_CANCELLATION_BUSINESS_PATHS)); + assertEquals(childHistoryBefore + 1, + campaign.engine.history(RESTAURANT_PRODUCT).size(), + "the refusal is processed and retained as an exact epoch"); + assertFalse(campaign.bool( + "/productConditions/restaurant/cancelled")); + assertFalse(campaign.bool("/refund/requested")); + assertEquals(1L, campaign.eventCount( + "Commerce/Change Declined")); + assertEquals(0L, campaign.eventCount( + "PayNote/Refund Requested")); + campaign.assertParentCurrent(); + campaign.verifyAccounting(); + campaign.publishTimings(reporter, "embedded-late-refusal"); + } + } + + private static void assertCompleted(Campaign campaign) { + assertTrue(campaign.bool("/productConditions/hotel/done")); + assertTrue(campaign.bool("/productConditions/restaurant/done")); + assertFalse(campaign.bool("/productConditions/restaurant/cancelled")); + assertFalse(campaign.bool( + "/productConditions/restaurant/discountApplied")); + assertEquals(130_000L, campaign.number("/amount/captured")); + assertEquals("Completed", campaign.string("/status")); + assertEquals(2L, campaign.eventCount( + "PayNote/Condition Product Done"), + "hotel and restaurant must each contribute one done event"); + campaign.assertParentCurrent(); + } + + private static void assertRefund( + Campaign campaign, + String requestId, + long refundAmount, + long capturedAmount) { + assertTrue(campaign.bool("/refund/requested")); + assertTrue(campaign.bool("/refund/completed")); + assertEquals(requestId, campaign.string("/refund/requestId")); + assertEquals(refundAmount, campaign.number("/refund/amountMinor")); + assertEquals(capturedAmount, campaign.number("/amount/captured")); + assertEquals("Partial Refund Completed", campaign.string("/status")); + } + + private static void assertBusinessParity( + Campaign standalone, + Campaign embedded) { + List businessPaths = List.of( + "/name", + "/status", + "/attachedBy", + "/validationMethod", + "/payer", + "/payee", + "/guarantor", + "/currency", + "/authorizationAuthorizedAmountMinorState", + "/authorizationCountState", + "/hotelConditionAttachedState", + "/restaurantConditionAttachedState", + "/hotelConfirmedState", + "/restaurantConfirmedState", + "/captureReadinessConfirmedState", + "/captureRequestedState", + "/captureRequestedAtState", + "/captureCompletedState", + "/capturedAmountMinorState", + "/refundRequestedState", + "/refundCompletedState", + "/refundRequestIdState", + "/refundAmountMinorState", + "/refundReasonState", + "/amount", + "/authorization", + "/attachedConditions", + "/captureReadiness", + "/capture", + "/refund", + "/productConditions/hotel/sourceProductPath", + "/productConditions/hotel/expectedProductKey", + "/productConditions/hotel/expectedProductName", + "/productConditions/hotel/expectedProductIdentity", + "/productConditions/hotel/sourceOrderId", + "/productConditions/hotel/status", + "/productConditions/hotel/deliveryStatus", + "/productConditions/hotel/confirmed", + "/productConditions/hotel/done", + "/productConditions/hotel/captureConditionSatisfied", + "/productConditions/hotel/lastProcessedSourceTimestamp", + "/productConditions/hotel/product/documentId", + "/productConditions/hotel/product/name", + "/productConditions/hotel/product/productKey", + "/productConditions/hotel/product/sourceOrderId", + "/productConditions/hotel/product/confirmed", + "/productConditions/hotel/product/confirmedAt", + "/productConditions/hotel/product/done", + "/productConditions/restaurant/sourceProductPath", + "/productConditions/restaurant/expectedProductKey", + "/productConditions/restaurant/expectedProductName", + "/productConditions/restaurant/expectedProductIdentity", + "/productConditions/restaurant/sourceOrderId", + "/productConditions/restaurant/status", + "/productConditions/restaurant/deliveryStatus", + "/productConditions/restaurant/confirmed", + "/productConditions/restaurant/done", + "/productConditions/restaurant/cancelled", + "/productConditions/restaurant/discountApplied", + "/productConditions/restaurant/captureConditionSatisfied", + "/productConditions/restaurant/lastProcessedSourceTimestamp", + "/productConditions/restaurant/product/documentId", + "/productConditions/restaurant/product/name", + "/productConditions/restaurant/product/productKey", + "/productConditions/restaurant/product/sourceOrderId", + "/productConditions/restaurant/product/confirmed", + "/productConditions/restaurant/product/confirmedAt", + "/productConditions/restaurant/product/done", + "/productConditions/restaurant/product/cancelled", + "/productConditions/restaurant/product/discountApplied"); + businessPaths.forEach(path -> assertEquals( + standalone.engine.session(PAY_NOTE).current() + .canonicalBlueIdAt(path), + embedded.engine.session(PAY_NOTE).current() + .canonicalBlueIdAt(path), + path)); + List businessEvents = List.of( + "PayNote/Amount Authorized", + "PayNote/Condition Product Confirmed", + "PayNote/Capture Funds Requested", + "PayNote/Payment Completed", + "PayNote/Condition Product Done"); + businessEvents.forEach(kind -> assertEquals( + standalone.eventCount(kind), + embedded.eventCount(kind), + kind)); + assertNotEquals( + standalone.initializationCause(), + embedded.initializationCause(), + "top-level admission and host attachment retain distinct " + + "temporal provenance"); + embedded.assertParentCurrent(); + } + + private static final class Campaign implements AutoCloseable { + private final TestEngine engine; + private final Timelines timelines; + private final boolean embedded; + private final EngineMetrics.MetricsSnapshot baseline; + private final List timings = new ArrayList<>(); + + private Campaign( + TestEngine engine, + Timelines timelines, + boolean embedded, + EngineMetrics.MetricsSnapshot baseline) { + this.engine = engine; + this.timelines = timelines; + this.embedded = embedded; + this.baseline = baseline; + } + + static Campaign standalone() throws Exception { + TestEngine engine = TestEngine.create(); + try { + Timelines timelines = register(engine); + engine.start(PAY_NOTE, resource( + "examples/clean/large-paynote.yaml")); + return new Campaign(engine, timelines, false, + engine.metricsSnapshot()); + } catch (Exception | Error failure) { + engine.close(); + throw failure; + } + } + + static Campaign embedded() throws Exception { + TestEngine engine = TestEngine.create(); + try { + Timelines timelines = register(engine); + engine.start(HOST, resource( + "examples/clean/large-order-host.yaml")); + Campaign campaign = new Campaign( + engine, timelines, true, engine.metricsSnapshot()); + campaign.invoke( + "attach PayNote", + timelines.hostOwner(), + Operation.exact( + "attachPayNote", + "ownerChannel", + engine.embeddedDocumentRequest(resource( + "examples/clean/large-paynote.yaml"))), + T0 + 1_000L); + assertEquals(PAY_NOTE, engine.embeddedDocuments(HOST) + .get("/payNote")); + campaign.assertParentCurrent(); + return campaign; + } catch (Exception | Error failure) { + engine.close(); + throw failure; + } + } + + void prepareCapturedPayment() { + invoke("authorize 50000", timelines.guarantor(), + authorization("WAD-AUTH-50000", 50_000L), + T0 + 10_000L); + invoke("authorize 80000", timelines.guarantor(), + authorization("WAD-AUTH-80000", 80_000L), + T0 + 20_000L); + invoke("attach hotel condition", timelines.merchant(), + Operation.yaml( + "attachHotelCondition", + "merchantChannel", + """ + productKey: hotel + sourceProductPath: /product/products/hotel + expectedProductName: Hotel Mlyn Jacka Stay + expectedProductIdentity: "wadowice-order-2026-v1:hotel:v1" + sourceOrderId: wadowice-order-2026-v1 + """), + T0 + 30_000L); + invoke("attach restaurant condition", timelines.merchant(), + Operation.yaml( + "attachRestaurantCondition", + "merchantChannel", + """ + productKey: restaurant + sourceProductPath: /product/products/restaurant + expectedProductName: Old Town Restaurant Dinner + expectedProductIdentity: "wadowice-order-2026-v1:restaurant:v1" + sourceOrderId: wadowice-order-2026-v1 + """), + T0 + 40_000L); + invoke("restaurant confirmation", timelines.restaurant(), + Operation.yaml( + "confirmProduct", + "providerChannel", + "confirmationReference: REST-WAD-1930"), + T0 + 50_000L); + assertEquals(1L, number("/captureReadiness/confirmed"), + "restaurant root flag=" + + bool("/restaurantConfirmedState") + + ", condition=" + + bool("/productConditions/restaurant/confirmed") + + ", product=" + bool( + "/productConditions/restaurant/product/confirmed")); + assertFalse(bool("/capture/requested")); + + invoke("hotel confirmation", timelines.hotel(), + Operation.yaml( + "confirmProduct", + "providerChannel", + "confirmationReference: HOTEL-WAD-2207"), + T0 + 60_000L); + assertEquals(2L, number("/captureReadiness/confirmed")); + assertTrue(bool("/capture/requested")); + assertEquals(1L, number("/capture/requestCount")); + assertEquals(1L, eventCount("PayNote/Capture Funds Requested")); + + invoke("duplicate restaurant confirmation", timelines.restaurant(), + Operation.yaml( + "confirmProduct", + "providerChannel", + "confirmationReference: REST-WAD-1930"), + T0 + 70_000L); + invoke("duplicate hotel confirmation", timelines.hotel(), + Operation.yaml( + "confirmProduct", + "providerChannel", + "confirmationReference: HOTEL-WAD-2207"), + T0 + 80_000L); + assertEquals(1L, number("/capture/requestCount")); + assertEquals(1L, eventCount("PayNote/Capture Funds Requested")); + + Operation capture = Operation.yaml( + "capturePayment", + "guarantorChannel", + """ + requestId: package-capture-001 + amountMinor: 130000 + currency: PLN + """); + invoke("capture completion", timelines.guarantor(), capture, + T0 + 90_000L); + invoke("duplicate capture completion", timelines.guarantor(), + capture, T0 + 100_000L); + invoke("hotel completion", timelines.hotel(), Operation.yaml( + "completeProduct", + "providerChannel", + """ + confirmationCode: WAD-7429 + note: Stay completed with customer present. + """), T0 + 110_000L); + + assertEquals(130_000L, number( + "/authorization/authorizedAmountMinor")); + assertEquals(2L, number("/authorization/authorizationCount")); + assertEquals("Authorized", string("/authorization/state")); + assertTrue(bool("/attachedConditions/hotel")); + assertTrue(bool("/attachedConditions/restaurant")); + assertTrue(bool("/productConditions/hotel/product/confirmed")); + assertTrue(bool( + "/productConditions/restaurant/product/confirmed")); + assertTrue(bool("/productConditions/hotel/confirmed")); + assertTrue(bool("/productConditions/restaurant/confirmed")); + assertTrue(bool("/capture/completed")); + assertEquals(130_000L, number("/amount/captured")); + assertEquals(2L, eventCount("PayNote/Amount Authorized")); + assertEquals(1L, eventCount("PayNote/Capture Funds Requested")); + assertEquals(1L, eventCount("PayNote/Payment Completed")); + assertParentCurrent(); + } + + void completeRestaurant() { + invoke("restaurant completion", timelines.restaurant(), + Operation.yaml( + "completeProduct", + "providerChannel", + """ + confirmationCode: WAD-7429 + note: Dinner completed as booked. + """), + T0 + 120_000L); + } + + void cancelRestaurant() { + invoke("restaurant cancellation", timelines.customer(), + Operation.yaml( + "cancelWithinRange", + "customerChannel", + "reason: Plans changed inside refund window."), + T0 + 120_000L); + Operation refund = refund("restaurant-refund-001", 38_000L); + invoke("restaurant refund", timelines.guarantor(), refund, + T0 + 130_000L); + invoke("duplicate restaurant refund", timelines.guarantor(), + refund, T0 + 140_000L); + } + + void discountRestaurant() { + invoke("restaurant 10% adjustment", timelines.restaurant(), + Operation.yaml( + "completeWithDiscount", + "providerChannel", + """ + confirmationCode: WAD-7429 + note: Dinner completed with a service recovery discount. + """), + T0 + 120_000L); + Operation refund = refund("restaurant-discount-001", 3_800L); + invoke("restaurant adjustment refund", timelines.guarantor(), + refund, T0 + 130_000L); + invoke("duplicate adjustment refund", timelines.guarantor(), + refund, T0 + 140_000L); + } + + void refuseLateCancellation() { + invoke("late restaurant cancellation refusal", + timelines.customer(), + Operation.yaml( + "cancelOutsideRange", + "customerChannel", + "reason: Cancellation requested outside window."), + T0 + 120_000L); + } + + long number(String path) { + return integer(engine, PAY_NOTE, path); + } + + String string(String path) { + return text(engine, PAY_NOTE, path); + } + + boolean bool(String path) { + Object value = engine.value(PAY_NOTE, path).getValue(); + if (!(value instanceof Boolean result)) { + throw new AssertionError( + "Expected Boolean at " + PAY_NOTE + path + + " but got " + value); + } + return result; + } + + long eventCount(String kind) { + return List.of(PAY_NOTE, HOTEL_PRODUCT, RESTAURANT_PRODUCT) + .stream() + .flatMap(documentId -> engine.history(documentId).stream()) + .map(DocumentRevision::emittedEvents) + .flatMap(List::stream) + .filter(event -> kind.equals(kind(event))) + .count(); + } + + String initializationCause() { + return engine.history(PAY_NOTE).get(0) + .causalEntryBlueId().orElseThrow(); + } + + List businessIdentity(List paths) { + return paths.stream() + .map(path -> engine.session(PAY_NOTE).current() + .canonicalBlueIdAt(path)) + .toList(); + } + + void assertParentCurrent() { + if (!embedded) { + return; + } + String childBlueId = engine.session(PAY_NOTE) + .layout().rootBlueId(); + assertEquals(childBlueId, engine.session(HOST).current() + .canonicalBlueIdAt("/payNote")); + assertEquals(string("/status"), + text(engine, HOST, "/observedPayNoteStatus")); + assertTrue(integer(engine, HOST, "/payNoteRevisionCount") > 0L); + } + + void verifyAccounting() { + EngineTestSupport.MetricDelta work = delta( + baseline, engine.metricsSnapshot()); + assertNoGenericSplitting(work); + assertTrue(work.counter( + "process.frozenContractsInvocations") > 0L); + assertTrue(work.nanos("process.frozen") > 0L); + assertTrue(work.nanos("process.hostBeforeFrozen") > 0L); + assertTrue(work.nanos("process.hostAfterFrozen") > 0L); + assertFalse(timings.isEmpty()); + timings.forEach(StepTiming::verify); + } + + void publishTimings(TestReporter reporter, String campaignName) { + reporter.publishEntry(campaignName, StepTiming.report(timings)); + } + + private void invoke( + String label, + Timeline timeline, + Operation operation, + long timestampMicros) { + long appendStarted = System.nanoTime(); + TimelineEntry entry = engine.appendAt( + timeline, operation, timestampMicros); + long appendNanos = System.nanoTime() - appendStarted; + EngineMetrics.MetricsSnapshot before = engine.metricsSnapshot(); + long wallStarted = System.nanoTime(); + ProcessingDrainReceipt receipt = engine.dispatch(entry); + long wallNanos = System.nanoTime() - wallStarted; + EngineTestSupport.MetricDelta processing = delta( + before, engine.metricsSnapshot()); + timings.add(new StepTiming( + label, + appendNanos, + receipt.elapsedNanos(), + wallNanos, + processing.nanos("process.frozen"), + processing.nanos("process.hostBeforeFrozen"), + processing.nanos("process.hostAfterFrozen"))); + } + + @Override + public void close() { + engine.close(); + } + + private static Timelines register(TestEngine engine) { + return new Timelines( + engine.timeline("examples/large-order/alice", "alice"), + engine.timeline("examples/order/alice", "alice"), + engine.timeline("examples/order/bob", "bob"), + engine.timeline("examples/order/celine", "celine"), + engine.timeline("examples/order/david", "david"), + engine.timeline( + "examples/order/myos-admin", "myos-admin")); + } + } + + private static Operation authorization(String id, long amountMinor) { + return Operation.yaml( + "authorizeAmount", + "guarantorChannel", + "authorizationId: " + id + "\n" + + "amountMinor: " + amountMinor + "\n" + + "currency: PLN\n"); + } + + private static Operation refund(String id, long amountMinor) { + return Operation.yaml( + "refundPayment", + "guarantorChannel", + "requestId: " + id + "\n" + + "amountMinor: " + amountMinor + "\n" + + "currency: PLN\n"); + } + + private static String kind(Node event) { + Node kind = event.getProperties().get("kind"); + return kind == null ? null : String.valueOf(kind.getValue()); + } + + private record Timelines( + Timeline hostOwner, + Timeline customer, + Timeline merchant, + Timeline hotel, + Timeline restaurant, + Timeline guarantor) { + } + + private record StepTiming( + String label, + long appendNanos, + long receiptNanos, + long wallNanos, + long frozenNanos, + long hostBeforeNanos, + long hostAfterNanos) { + + void verify() { + assertTrue(appendNanos > 0L, label); + assertTrue(receiptNanos > 0L, label); + assertTrue(wallNanos >= receiptNanos, label); + assertTrue(frozenNanos > 0L, label); + assertTrue(hostBeforeNanos > 0L, label); + assertTrue(hostAfterNanos > 0L, label); + assertTrue(receiptNanos >= accountedNanos(), label); + } + + long accountedNanos() { + return frozenNanos + hostBeforeNanos + hostAfterNanos; + } + + long schedulerNanos() { + return Math.max(0L, receiptNanos - accountedNanos()); + } + + static String report(List values) { + StringBuilder result = new StringBuilder(512); + result.append("step | append ms | drain ms | frozen ms | ") + .append("host ms | scheduler/unattributed ms\n"); + for (StepTiming value : values) { + result.append(value.label()).append(" | ") + .append(ms(value.appendNanos())).append(" | ") + .append(ms(value.receiptNanos())).append(" | ") + .append(ms(value.frozenNanos())).append(" | ") + .append(ms(value.hostBeforeNanos() + + value.hostAfterNanos())).append(" | ") + .append(ms(value.schedulerNanos())).append('\n'); + } + return result.toString(); + } + + private static String ms(long nanos) { + return String.format(Locale.ROOT, "%.3f", nanos / 1_000_000.0); + } + } +} diff --git a/src/test/java/blue/coordination/api/CoordinationEngineTest.java b/src/test/java/blue/coordination/api/CoordinationEngineTest.java new file mode 100644 index 0000000..96b59e4 --- /dev/null +++ b/src/test/java/blue/coordination/api/CoordinationEngineTest.java @@ -0,0 +1,132 @@ +package blue.coordination.api; + +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Fast public API smoke and append-publication unit tests. */ +final class CoordinationEngineTest { + private static final String COUNTER = """ + documentId: counter + name: Counter + counter: 0 + contracts: + aliceChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: counter/alice + actor: + type: MyOS/Principal Actor + accountId: alice + bobChannel: + type: Coordination/Timeline Channel + timeline: + type: MyOS/MyOS Timeline + timelineId: counter/bob + actor: + type: MyOS/Principal Actor + accountId: bob + increment: + type: Coordination/Sequential Workflow Operation + channel: aliceChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: + $add: + - $document: /counter + - $binding: event/message/request/amount + - $return: true + decrement: + type: Coordination/Sequential Workflow Operation + channel: bobChannel + request: + amount: {type: Integer} + steps: + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: + $subtract: + - $document: /counter + - $binding: event/message/request/amount + - $return: true + """; + + @Test + void counterQuickstartProducesTwo() { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + "counter/alice", "alice"); + Timeline bob = engine.registerTimeline("counter/bob", "bob"); + DocumentId counter = DocumentId.of("counter"); + engine.startDocument(counter, COUNTER); + + TimelineEntry increment = engine.append(alice, Operation.yaml( + "increment", "aliceChannel", "amount: 3")); + assertEquals(1L, engine.metrics().counter( + CoordinationMetrics.Counter.ENTRIES_STORED_WHOLE)); + assertEquals(0L, engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + engine.drainThrough(increment.sourceOrderKey()); + TimelineEntry decrement = engine.append(bob, Operation.yaml( + "decrement", "bobChannel", "amount: 1")); + engine.drainThrough(decrement.sourceOrderKey()); + + assertEquals(BigInteger.valueOf(2L), engine.document(counter) + .valueAt("/counter").copyNode().getValue()); + assertEquals(2L, engine.document(counter).epoch()); + assertEquals(2, engine.metrics().journalEntryCount()); + assertEquals(2L, engine.metrics().counter( + CoordinationMetrics.Counter.ENTRIES_STORED_WHOLE)); + assertEquals(2L, engine.metrics().counter( + CoordinationMetrics.Counter.ROUTE_INDEX_LOOKUPS)); + assertEquals(1L, engine.metrics().counter( + CoordinationMetrics.Counter.DOCUMENT_INITIALIZATIONS)); + assertEquals(2L, engine.metrics().counter( + CoordinationMetrics.Counter.EXTERNAL_PROCESS_CALLS)); + assertEquals(0L, engine.metrics().counter( + CoordinationMetrics.Counter.CHILD_EPOCHS_COMMITTED)); + assertEquals( + CoordinationMetrics.Counter.values().length, + engine.metrics().counters().size()); + } + } + + @Test + void failedAppendDoesNotConsumeClockOrJournalCoordinates() { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline alice = engine.registerTimeline( + "counter/alice", "alice"); + CoordinationMetrics before = engine.metrics(); + + assertThrows(RuntimeException.class, () -> engine.append( + alice, + Operation.yaml("increment", "aliceChannel", "["))); + + CoordinationMetrics rejected = engine.metrics(); + assertEquals(before.logicalClockMicros(), + rejected.logicalClockMicros()); + assertEquals(0, rejected.journalEntryCount()); + TimelineEntry accepted = engine.append( + alice, + Operation.yaml( + "increment", "aliceChannel", "amount: 1")); + assertEquals(1L, accepted.globalSequence()); + assertEquals(1L, accepted.timelineSequence()); + assertEquals(before.logicalClockMicros() + 1L, + accepted.timestampMicros()); + } + } +} diff --git a/src/test/java/blue/coordination/api/DocumentRevisionInitializationCausalityTest.java b/src/test/java/blue/coordination/api/DocumentRevisionInitializationCausalityTest.java new file mode 100644 index 0000000..9d1f136 --- /dev/null +++ b/src/test/java/blue/coordination/api/DocumentRevisionInitializationCausalityTest.java @@ -0,0 +1,126 @@ +package blue.coordination.api; + +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Initialization has no external Timeline Entry but always has exact causal evidence. */ +final class DocumentRevisionInitializationCausalityTest { + private static final DocumentId DOCUMENT = DocumentId.of("causal-document"); + private static final ExactValue STATE = ExactValue.verified( + new Node().properties("documentId", new Node().value( + DOCUMENT.value()))); + private static final ExternalOrderKey ORDER = + ExternalOrderKey.of(List.of(100L, "admission")); + private static final String CAUSE = ExactValue.verified( + new Node().properties("kind", new Node().value( + "Document Admission"))).blueId(); + + @Test + void initializationRequiresOrderAndIdentityIndependently() { + IllegalArgumentException missingOrder = assertThrows( + IllegalArgumentException.class, + () -> new DocumentRevision( + DOCUMENT, + 0L, + 0L, + DocumentRevision.Kind.INITIALIZATION, + STATE, + STATE, + null, + null, + CAUSE, + null, + List.of(), + 0L)); + IllegalArgumentException missingIdentity = assertThrows( + IllegalArgumentException.class, + () -> new DocumentRevision( + DOCUMENT, 0L, 0L, + DocumentRevision.Kind.INITIALIZATION, + STATE, STATE, null, ORDER, null, null, + List.of(), 0L)); + + assertTrue(missingOrder.getMessage().contains("exact cause")); + assertTrue(missingIdentity.getMessage().contains("exact cause")); + } + + @Test + void initializationWithTimelineEntryIsRejected() { + TimelineEntry entry = new TimelineEntry( + STATE, + STATE, + ORDER, + ORDER, + new Timeline("timeline", "actor"), + "operation", + "channel", + 100L, + 1L, + 1L); + + assertThrows(IllegalArgumentException.class, + () -> new DocumentRevision( + DOCUMENT, + 0L, + 0L, + DocumentRevision.Kind.INITIALIZATION, + STATE, + STATE, + entry, + ORDER, + entry.blueId(), + null, + List.of(), + 0L)); + assertThrows(IllegalArgumentException.class, + () -> new DocumentRevision( + DOCUMENT, 1L, 1L, + DocumentRevision.Kind.TIMELINE_ENTRY, + STATE, STATE, entry, ORDER, CAUSE, null, + List.of(), 0L)); + } + + @Test + void processorManagedInitializationRetainsCauseWithoutInventingTimelineFact() { + Node event = new Node() + .properties("type", new Node().value("Coordination/Event")) + .properties("kind", new Node().value("Initialized")); + DocumentRevision revision = new DocumentRevision( + DOCUMENT, + 0L, + 0L, + DocumentRevision.Kind.INITIALIZATION, + STATE, + STATE, + null, + ORDER, + CAUSE, + null, + List.of(event), + 7L); + + assertTrue(revision.sourceEntry().isEmpty()); + assertEquals(ORDER, revision.sourceOrderKey().orElseThrow()); + assertEquals(CAUSE, + revision.causalEntryBlueId().orElseThrow()); + assertEquals(1, revision.emittedEvents().size()); + assertEquals(7L, revision.processingGas()); + } + + @Test + void initializationRejectsTextThatIsNotAnExactBlueId() { + assertThrows(IllegalArgumentException.class, + () -> new DocumentRevision( + DOCUMENT, 0L, 0L, + DocumentRevision.Kind.INITIALIZATION, + STATE, STATE, null, ORDER, "arbitrary-text", null, + List.of(), 0L)); + } +} diff --git a/src/test/java/blue/coordination/api/PublicValueContractTest.java b/src/test/java/blue/coordination/api/PublicValueContractTest.java new file mode 100644 index 0000000..fe213b0 --- /dev/null +++ b/src/test/java/blue/coordination/api/PublicValueContractTest.java @@ -0,0 +1,196 @@ +package blue.coordination.api; + +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Fast validation, immutability, and typed-error contracts for the API. */ +final class PublicValueContractTest { + @Test + void documentIdsAreValidatedOrderedAndStableAsText() { + DocumentId first = DocumentId.of("a"); + DocumentId second = DocumentId.of("b"); + + assertTrue(first.compareTo(second) < 0); + assertEquals("a", first.toString()); + assertThrows(IllegalArgumentException.class, + () -> DocumentId.of(" ")); + assertThrows(NullPointerException.class, + () -> DocumentId.of(null)); + } + + @Test + void timelinesRequireBothAuthenticatedIdentities() { + assertEquals("feed", new Timeline("feed", "alice").timelineId()); + assertThrows(IllegalArgumentException.class, + () -> new Timeline("", "alice")); + assertThrows(IllegalArgumentException.class, + () -> new Timeline("feed", " ")); + } + + @Test + void operationsHaveExactlyOneNormalizedRequestRepresentation() { + Operation empty = Operation.yaml("touch", "owner", " "); + ExactValue exact = ExactValue.verified(new Node().value("request")); + Operation reused = Operation.exact("touch", "owner", exact); + + assertEquals("{}", empty.requestYaml().orElseThrow()); + assertTrue(empty.exactRequest().isEmpty()); + assertEquals(exact, reused.exactRequest().orElseThrow()); + assertTrue(reused.requestYaml().isEmpty()); + assertThrows(IllegalArgumentException.class, + () -> Operation.yaml(" ", "owner", "{}")); + assertThrows(NullPointerException.class, + () -> Operation.exact("touch", "owner", null)); + } + + @Test + void exactValuesDetachMutableNodesAndVerifyIdentity() { + Node source = new Node().properties( + "value", new Node().value("original")); + ExactValue exact = ExactValue.verified(source); + source.getProperties().get("value").value("mutated"); + Node firstCopy = exact.copyNode(); + firstCopy.getProperties().get("value").value("copy-mutated"); + + assertEquals("original", exact.copyNode() + .getProperties().get("value").getValue()); + assertEquals(exact.blueId(), exact.referenceNode().getBlueId()); + assertTrue(exact.sameExactValue(ExactValue.verified( + exact.copyNode()))); + assertThrows(IllegalArgumentException.class, + () -> ExactValue.verified("wrong", exact.copyNode())); + } + + @Test + void metricsAreStableDefensiveSnapshots() { + Map counters = new LinkedHashMap<>(); + counters.put("ENTRIES_STORED_WHOLE", 2L); + CoordinationMetrics metrics = new CoordinationMetrics( + counters, Map.of("append.total", 2_500_000L), + 1, 2, 3, 4, 5L); + counters.put("ENTRIES_STORED_WHOLE", 99L); + + for (CoordinationMetrics.Counter counter + : CoordinationMetrics.Counter.values()) { + long expected = counter + == CoordinationMetrics.Counter.ENTRIES_STORED_WHOLE + ? 2L + : 0L; + assertEquals(expected, metrics.counter(counter.name())); + } + assertThrows(IllegalArgumentException.class, + () -> metrics.counter("work")); + assertEquals(2.5, metrics.millis("append.total")); + assertThrows(IllegalArgumentException.class, + () -> metrics.millis("phase")); + assertThrows(IllegalArgumentException.class, + () -> new CoordinationMetrics( + Map.of("work", 1L), Map.of(), + 0, 0, 0, 0, 1L)); + assertThrows(UnsupportedOperationException.class, + () -> metrics.counters().clear()); + assertThrows(IllegalArgumentException.class, + () -> new CoordinationMetrics(Map.of(), Map.of(), + -1, 0, 0, 0, 1L)); + assertThrows(IllegalArgumentException.class, + () -> new CoordinationMetrics(Map.of(), Map.of(), + 0, 0, 0, 0, 0L)); + } + + @Test + void typedFailuresPreserveCauseAndImmutableDetails() { + RuntimeException cause = new RuntimeException("root cause"); + Map details = new LinkedHashMap<>(); + details.put("documentId", "counter"); + CoordinationException failure = new CoordinationException( + CoordinationErrorCode.DOCUMENT_NOT_FOUND, + "missing", cause, details); + details.put("documentId", "changed"); + + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_FOUND, + failure.code()); + assertEquals(cause, failure.getCause()); + assertEquals("counter", failure.details().get("documentId")); + assertThrows(UnsupportedOperationException.class, + () -> failure.details().clear()); + } + + @Test + void builderFailsClosedUntilInMemoryModeIsSelected() { + CoordinationException failure = assertThrows( + CoordinationException.class, + () -> CoordinationEngine.builder().build()); + + assertEquals(CoordinationErrorCode.ATOMIC_COMMIT_FAILED, + failure.code()); + } + + @Test + void appendProducesSelfContainedExactImmutableEvidence() { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline timeline = engine.registerTimeline("feed", "alice"); + TimelineEntry entry = engine.append(timeline, Operation.yaml( + "touch", "owner", "value: 1")); + + assertEquals(1L, entry.globalSequence()); + assertEquals(1L, entry.timelineSequence()); + assertEquals(entry.blueId(), entry.exactEvent().blueId()); + assertNotNull(entry.sourceOrderKey()); + assertTrue(engine.drain().processedEntries().contains(entry)); + } + } + + @Test + void zeroTargetDispatchIsImmutableAndOnlyOutcomeFailsClearly() { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + Timeline timeline = engine.registerTimeline("feed", "alice"); + TimelineEntry entry = engine.append( + timeline, Operation.yaml("unknown", "owner", "{}")); + ProcessingDrainReceipt result = engine.drainThrough( + entry.sourceOrderKey()); + + assertTrue(result.outcomes().isEmpty()); + assertTrue(result.elapsedNanos() >= 0L); + assertThrows(UnsupportedOperationException.class, + () -> result.outcomes().clear()); + CoordinationException failure = assertThrows( + CoordinationException.class, result::onlyOutcome); + assertEquals(CoordinationErrorCode.ATOMIC_COMMIT_FAILED, + failure.code()); + } + } + + @Test + void missingDocumentsUseTheStableTypedErrorModel() { + try (CoordinationEngine engine = CoordinationEngine.inMemory()) { + CoordinationException failure = assertThrows( + CoordinationException.class, + () -> engine.document(DocumentId.of("missing"))); + + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_FOUND, + failure.code()); + assertEquals("missing", failure.details().get("documentId")); + } + } + + @Test + void closeIsIdempotentAndFurtherMutationFails() { + CoordinationEngine engine = CoordinationEngine.inMemory(); + engine.close(); + engine.close(); + + RuntimeException failure = assertThrows(RuntimeException.class, + () -> engine.registerTimeline("feed", "alice")); + assertNotEquals("", failure.getMessage()); + } +} diff --git a/src/test/java/blue/coordination/internal/CatchUpBarrierTest.java b/src/test/java/blue/coordination/internal/CatchUpBarrierTest.java new file mode 100644 index 0000000..91f8212 --- /dev/null +++ b/src/test/java/blue/coordination/internal/CatchUpBarrierTest.java @@ -0,0 +1,70 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Persistence and defensive-copy tests for catch-up completion proofs. */ +final class CatchUpBarrierTest { + @Test + void persistsPerBindingEvidenceAndCopiesItIndependently() { + ExternalOrderKey cutoff = ExternalOrderKey.of(List.of( + 200L, "timeline", "attachment")); + CatchUpBarrier barrier = new CatchUpBarrier( + "barrier-1", + DocumentId.of("parent"), + "attachment-entry", + cutoff); + barrier.extend("binding-a"); + CompletenessEvidence evidence = new CompletenessEvidence( + 3L, 5L, 7L, cutoff, "surface-a"); + barrier.recordCompletenessEvidence("binding-a", evidence); + barrier.defer("another source is unavailable"); + + CatchUpBarrier copy = barrier.copy(); + assertEquals(evidence, copy.completenessEvidence("binding-a")); + assertEquals(evidence, + copy.completenessEvidence().get("binding-a")); + assertEquals(CatchUpBarrier.Status.DEFERRED, copy.status()); + assertThrows(UnsupportedOperationException.class, + () -> copy.completenessEvidence().clear()); + + barrier.recordProgress( + "binding-a", + ExternalOrderKey.of(List.of(100L, "timeline", "history"))); + assertNull(barrier.completenessEvidence("binding-a")); + assertEquals(evidence, copy.completenessEvidence("binding-a")); + } + + @Test + void rejectsEvidenceForAnotherBindingOrCutoff() { + ExternalOrderKey cutoff = ExternalOrderKey.of(List.of(200L)); + CatchUpBarrier barrier = new CatchUpBarrier( + "barrier-1", + DocumentId.of("parent"), + "attachment-entry", + cutoff); + barrier.extend("binding-a"); + + assertThrows(IllegalArgumentException.class, + () -> barrier.recordCompletenessEvidence( + "binding-b", + new CompletenessEvidence( + 1L, 1L, 1L, cutoff, "surface"))); + assertThrows(IllegalArgumentException.class, + () -> barrier.recordCompletenessEvidence( + "binding-a", + new CompletenessEvidence( + 1L, + 1L, + 1L, + ExternalOrderKey.of(List.of(201L)), + "surface"))); + } +} diff --git a/src/test/java/blue/coordination/internal/DocumentAdmissionCauseTest.java b/src/test/java/blue/coordination/internal/DocumentAdmissionCauseTest.java new file mode 100644 index 0000000..98e1248 --- /dev/null +++ b/src/test/java/blue/coordination/internal/DocumentAdmissionCauseTest.java @@ -0,0 +1,74 @@ +package blue.coordination.internal; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Top-level initialization uses one retained, content-addressed admission cause. */ +final class DocumentAdmissionCauseTest { + @Test + void causeBlueIdBindsAdmissionTupleAndIsStableAcrossRestart() { + DocumentId id = DocumentId.of("admission-cause-document"); + try (DefaultCoordinationEngine engine = + DefaultCoordinationEngine.create()) { + DocumentSession session = engine.start(id, """ + documentId: admission-cause-document + state: authored + """); + DocumentRevision revision = session.revision(0L); + String causeId = revision.causalEntryBlueId().orElseThrow(); + WholeObjectStore objects = engine.objects(); + + assertFalse(causeId.startsWith("admission|")); + assertTrue(objects.contains(causeId)); + ExactValue cause = objects.require(causeId); + assertEquals(id.value(), cause.frozen().at( + "/documentId").getValue()); + assertEquals(revision.before().orElseThrow().blueId(), + cause.frozen().at("/authoredState").getReferenceBlueId()); + assertEquals("FROM_NOW", cause.frozen().at( + "/admissionPolicy").getValue()); + assertEquals(BigInteger.ZERO, + cause.frozen().at("/admissionFrontier/0").getValue()); + engine.restartFromStores(); + assertEquals(causeId, engine.documents().require(id) + .revision(0L).causalEntryBlueId().orElseThrow()); + + ExactValue authored = revision.before().orElseThrow(); + ExternalOrderKey frontier = revision.sourceOrderKey().orElseThrow(); + assertEquals(causeId, DocumentTransitionProcessor + .retainAdmissionCause(objects, id, authored, + CoordinationEngine.AdmissionPolicy.FROM_NOW, + frontier)); + assertNotEquals(causeId, DocumentTransitionProcessor + .retainAdmissionCause(objects, DocumentId.of("other"), + authored, CoordinationEngine.AdmissionPolicy.FROM_NOW, + frontier)); + assertNotEquals(causeId, DocumentTransitionProcessor + .retainAdmissionCause(objects, id, + ExactValue.verified(new Node().value("different")), + CoordinationEngine.AdmissionPolicy.FROM_NOW, + frontier)); + assertNotEquals(causeId, DocumentTransitionProcessor + .retainAdmissionCause(objects, id, authored, + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + frontier)); + assertNotEquals(causeId, DocumentTransitionProcessor + .retainAdmissionCause(objects, id, authored, + CoordinationEngine.AdmissionPolicy.FROM_NOW, + ExternalOrderKey.of(List.of(1L, "different")))); + } + } +} diff --git a/src/test/java/blue/coordination/internal/DocumentSessionStateEpochsTest.java b/src/test/java/blue/coordination/internal/DocumentSessionStateEpochsTest.java new file mode 100644 index 0000000..f8561df --- /dev/null +++ b/src/test/java/blue/coordination/internal/DocumentSessionStateEpochsTest.java @@ -0,0 +1,213 @@ +package blue.coordination.internal; + +import blue.coordination.api.CoordinationErrorCode; +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.CoordinationException; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.coordination.api.SessionStatus; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +final class DocumentSessionStateEpochsTest { + private static final DocumentId CHILD = DocumentId.of("recurrent-child"); + + @Test + void recurrentExactStateRequiresAnExplicitEpoch() { + ExactValue x = exact("X"); + ExactValue y = exact("Y"); + DocumentSession.StateEpochs epochs = new DocumentSession.StateEpochs(); + epochs.record(revision(4L, x)); + epochs.record(revision(5L, y)); + + assertEquals(4L, epochs.resolve(CHILD, "authored", x.blueId())); + + epochs.record(revision(7L, x)); + IllegalStateException failure = assertThrows( + IllegalStateException.class, + () -> epochs.resolve(CHILD, "authored", x.blueId())); + assertTrue(failure.getMessage().contains( + "exact admitted epoch is required"), failure::getMessage); + } + + @Test + void authoredStateMatchingInitializedEpochZeroKeepsPreInitCursor() { + ExactValue authored = exact("authored"); + DocumentSession.StateEpochs epochs = new DocumentSession.StateEpochs(); + epochs.record(revision(0L, authored)); + + assertEquals(-1L, epochs.resolve( + CHILD, authored.blueId(), authored.blueId())); + } + + @Test + void explicitEpochSelectsEitherOccurrenceOfARepeatedExactState() { + try (DefaultCoordinationEngine engine = + DefaultCoordinationEngine.create()) { + DocumentSession session = engine.start(CHILD, """ + documentId: recurrent-child + state: initial + """); + ExactValue x = exact("X"); + ExactValue previous = session.currentRevision().after(); + for (long epoch = 1L; epoch <= 7L; epoch++) { + ExactValue after = epoch == 4L || epoch == 7L + ? x : exact("state-" + epoch); + session.commit( + revision(epoch, previous, after), + session.layout(), + null, + session.activeSubscriptions(), + "synthetic|" + epoch); + previous = after; + } + + assertEquals(4L, session.resolveAdmissionEpoch(x.blueId(), 4L)); + assertEquals(7L, session.resolveAdmissionEpoch(x.blueId(), 7L)); + assertThrows(IllegalStateException.class, + () -> session.resolveAdmissionEpoch(x.blueId(), 5L)); + assertThrows(IllegalStateException.class, + () -> session.resolveAdmissionEpoch(x.blueId(), null)); + } + } + + @Test + void readyPublicationRequiresTheCurrentGraphEpoch() { + try (DefaultCoordinationEngine engine = + DefaultCoordinationEngine.create()) { + DocumentSession session = engine.start(CHILD, """ + documentId: recurrent-child + state: initial + """); + + assertEquals(0L, session.epoch()); + assertEquals(0L, session.readyEpoch()); + assertEquals(0L, session.graphPublishedEpoch()); + assertTrue(session.isLocallyReady()); + + ExactValue current = session.currentRevision().after(); + session.commit( + revision(1L, current, current), + session.layout(), + null, + session.activeSubscriptions(), + "synthetic|readiness"); + session.markCatchingUp(); + + assertEquals(1L, session.epoch()); + assertEquals(0L, session.readyEpoch()); + assertEquals(0L, session.graphPublishedEpoch()); + assertFalse(session.isLocallyReady()); + assertThrows(IllegalStateException.class, + () -> session.markReady(session.readyThrough())); + + session.markGraphPublished(); + assertFalse(session.isLocallyReady(), + "graph publication alone must not expose the state"); + session.markReady(session.readyThrough()); + + assertEquals(SessionStatus.READY, session.status()); + assertEquals(1L, session.readyEpoch()); + assertEquals(1L, session.graphPublishedEpoch()); + assertTrue(session.isLocallyReady()); + } + } + + @Test + void applicationReadRejectsEachStaleLocalPublicationEpoch() { + try (DefaultCoordinationEngine engine = + DefaultCoordinationEngine.create()) { + DocumentSession session = engine.start(CHILD, """ + documentId: recurrent-child + state: initial + """); + ExactValue current = session.currentRevision().after(); + session.commit( + revision(1L, current, current), + session.layout(), + null, + session.activeSubscriptions(), + "synthetic|application-read"); + + session.restoreCoordinationState( + SessionStatus.READY, session.readyThrough(), 0L, 1L); + assertNotReady(engine); + + session.restoreCoordinationState( + SessionStatus.READY, session.readyThrough(), 1L, 0L); + assertNotReady(engine); + + session.restoreCoordinationState( + SessionStatus.READY, session.readyThrough(), 1L, 1L); + assertEquals(1L, engine.document(CHILD).epoch()); + } + } + + @Test + void restartNormalizesLegacyReadyWithPendingTopLevelAdmission() { + try (DefaultCoordinationEngine engine = + DefaultCoordinationEngine.create()) { + engine.makeHistoricalUnavailable("provider window pending"); + engine.startDocument( + CHILD, + """ + documentId: recurrent-child + state: initial + """, + CoordinationEngine.AdmissionPolicy.FULL_HISTORY, + null); + DocumentSession session = engine.session(CHILD.value()); + assertEquals(SessionStatus.CATCHING_UP, session.status()); + + session.restoreCoordinationState( + SessionStatus.READY, + session.readyThrough(), + session.epoch(), + session.epoch()); + assertEquals(SessionStatus.READY, session.status(), + "simulate the legacy marker retained before Round 11"); + + engine.restartFromStores(); + + assertEquals(SessionStatus.CATCHING_UP, session.status()); + assertNotReady(engine); + engine.makeHistoricalAvailable(); + assertTrue(engine.drain().quiescent()); + assertEquals(SessionStatus.READY, engine.document(CHILD).status()); + } + } + + private static void assertNotReady(DefaultCoordinationEngine engine) { + CoordinationException failure = assertThrows( + CoordinationException.class, + () -> engine.document(CHILD)); + assertEquals(CoordinationErrorCode.DOCUMENT_NOT_READY, + failure.code()); + } + + private static DocumentRevision revision(long epoch, ExactValue after) { + return revision(epoch, null, after); + } + + private static DocumentRevision revision( + long epoch, + ExactValue before, + ExactValue after) { + return new DocumentRevision( + CHILD, epoch, epoch, DocumentRevision.Kind.CATCH_UP_COMPLETED, + before, after, null, null, List.of(), 0L); + } + + private static ExactValue exact(String value) { + return ExactValue.verified(new Node().properties( + "state", new Node().value(value))); + } +} diff --git a/src/test/java/blue/coordination/internal/DocumentTransitionProcessorSubscriptionDeltaTest.java b/src/test/java/blue/coordination/internal/DocumentTransitionProcessorSubscriptionDeltaTest.java new file mode 100644 index 0000000..8b999da --- /dev/null +++ b/src/test/java/blue/coordination/internal/DocumentTransitionProcessorSubscriptionDeltaTest.java @@ -0,0 +1,202 @@ +package blue.coordination.internal; + +import blue.language.processor.ExternalChannelDependencySnapshot; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.InvalidExecutionEvidenceException; +import blue.language.processor.SubscriptionDelta; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Exact interval-evidence tests for dynamic external subscriptions. */ +final class DocumentTransitionProcessorSubscriptionDeltaTest { + private static final ExternalOrderKey ADMISSION = + ExternalOrderKey.of(List.of(0L, "admission")); + private static final ExternalOrderKey TRANSITION = + ExternalOrderKey.of(List.of(1L, "transition")); + + @Test + void appliesAdditionAndRemovalAsOneDeterministicGeneration() { + SubscriptionDelta.Entry alice = active( + "aliceChannel", "alice-key", "alice-domain", 0L, ADMISSION); + SubscriptionDelta.Entry bob = active( + "bobChannel", "bob-key", "bob-domain", 1L, TRANSITION); + EngineMetrics metrics = new EngineMetrics(); + + List afterAddition = apply( + List.of(alice), + new SubscriptionDelta(List.of(bob), List.of()), + metrics); + assertEquals(List.of(alice, bob), afterAddition); + assertEquals(1L, metrics.counter( + "process.dynamicSubscriptionsAdded")); + + List afterRemoval = apply( + afterAddition, + new SubscriptionDelta( + List.of(), List.of(retired(bob, 1L))), + metrics); + assertEquals(List.of(alice), afterRemoval); + assertEquals(1L, metrics.counter( + "process.dynamicSubscriptionsRemoved")); + assertEquals(2L, metrics.counter( + "process.commitCompanionDeltasApplied")); + } + + @Test + void replacesChangedMembershipAtTheSameOccurrence() { + SubscriptionDelta.Entry before = active( + "ownerChannel", "old-key", "old-domain", 0L, ADMISSION); + SubscriptionDelta.Entry after = active( + "ownerChannel", "new-key", "new-domain", 1L, TRANSITION); + EngineMetrics metrics = new EngineMetrics(); + + List result = apply( + List.of(before), + new SubscriptionDelta( + List.of(after), List.of(retired(before, 1L))), + metrics); + + assertEquals(List.of(after), result); + assertEquals(1L, metrics.counter( + "process.dynamicSubscriptionsAdded")); + assertEquals(1L, metrics.counter( + "process.dynamicSubscriptionsRemoved")); + assertEquals(1L, metrics.counter( + "process.dynamicSubscriptionsReplaced")); + } + + @Test + void retainsVerifiedIntervalForConservativeHeaderOnlyReplacement() { + SubscriptionDelta.Entry established = active( + "ownerChannel", "stable-key", "verified-domain", 0L, + ADMISSION); + SubscriptionDelta.Entry invocationLocal = active( + "ownerChannel", "stable-key", "invocation-domain", 1L, + TRANSITION); + EngineMetrics metrics = new EngineMetrics(); + + List result = apply( + List.of(established), + new SubscriptionDelta( + List.of(invocationLocal), + List.of(retired(established, 1L))), + metrics); + + assertEquals(1, result.size()); + assertSame(established, result.get(0)); + assertEquals(1L, metrics.counter( + "process.companionReplacementsRetained")); + assertEquals(0L, metrics.counter( + "process.dynamicSubscriptionsAdded")); + assertEquals(0L, metrics.counter( + "process.dynamicSubscriptionsRemoved")); + } + + @Test + void rejectsSameOccurrenceSemanticReplacementMissingFromProjection() { + SubscriptionDelta.Entry before = active( + "ownerChannel", "old-key", "old-domain", 0L, ADMISSION); + SubscriptionDelta.Entry after = active( + "ownerChannel", "new-key", "new-domain", 1L, TRANSITION); + SubscriptionDelta companion = new SubscriptionDelta( + List.of(after), List.of(retired(before, 1L))); + + assertThrows(InvalidExecutionEvidenceException.class, () -> + DocumentTransitionProcessor.requireSameOwnedTransition( + companion, + new SubscriptionDelta(List.of(), List.of()), + List.of(), + List.of())); + } + + @Test + void rejectsUnknownOrForgedIntervalEvidenceWithoutPublishingMetrics() { + SubscriptionDelta.Entry established = active( + "ownerChannel", "stable-key", "verified-domain", 0L, + ADMISSION); + + assertInvalid(List.of(), new SubscriptionDelta( + List.of(), List.of(retired(established, 1L)))); + assertInvalid(List.of(established), new SubscriptionDelta( + List.of(), + List.of(retired(active( + "ownerChannel", "forged-key", "verified-domain", + 0L, ADMISSION), 1L)))); + assertInvalid(List.of(established), new SubscriptionDelta( + List.of(active( + "newChannel", "new-key", "new-domain", 2L, + TRANSITION)), + List.of())); + assertInvalid(List.of(established), new SubscriptionDelta( + List.of(active( + "ownerChannel", "stable-key", "verified-domain", + 1L, TRANSITION)), + List.of())); + } + + private static List apply( + List previous, + SubscriptionDelta delta, + EngineMetrics metrics) { + return DocumentTransitionProcessor.applyActiveSubscriptionDelta( + previous, + delta, + List.of(), + List.of(), + 1L, + TRANSITION, + metrics); + } + + private static void assertInvalid( + List previous, + SubscriptionDelta delta) { + EngineMetrics metrics = new EngineMetrics(); + assertThrows(InvalidExecutionEvidenceException.class, + () -> apply(previous, delta, metrics)); + assertEquals(0L, metrics.counter( + "process.commitCompanionDeltasApplied")); + } + + private static SubscriptionDelta.Entry active( + String channel, + String subscriptionKey, + String checkpointDomain, + long activationRevision, + ExternalOrderKey startAfter) { + return new SubscriptionDelta.Entry( + "/", + channel, + "timeline-channel-type", + List.of("source-" + channel), + 0, + List.of(subscriptionKey), + checkpointDomain, + ExternalChannelDependencySnapshot.none(), + activationRevision, + startAfter, + null); + } + + private static SubscriptionDelta.Entry retired( + SubscriptionDelta.Entry entry, + long retirementRevision) { + return new SubscriptionDelta.Entry( + entry.scopePath(), + entry.channelKey(), + entry.effectiveTypeBlueId(), + entry.sourceContributionNodeBlueIds(), + entry.order(), + entry.subscriptionKeys(), + entry.checkpointDomainBlueId(), + entry.dependencies(), + entry.activationRootRevision(), + entry.startAfterExternalOrderKey(), + retirementRevision); + } +} diff --git a/src/test/java/blue/coordination/internal/EmbeddedEpochInputEventEvidenceTest.java b/src/test/java/blue/coordination/internal/EmbeddedEpochInputEventEvidenceTest.java new file mode 100644 index 0000000..c518cd5 --- /dev/null +++ b/src/test/java/blue/coordination/internal/EmbeddedEpochInputEventEvidenceTest.java @@ -0,0 +1,84 @@ +package blue.coordination.internal; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Fail-closed validation for exact event evidence before parent PROCESS. */ +final class EmbeddedEpochInputEventEvidenceTest { + private static final DocumentId PARENT = DocumentId.of("event-parent"); + private static final DocumentId CHILD = DocumentId.of("event-child"); + private static final ExternalOrderKey ATTACHMENT_ORDER = + ExternalOrderKey.of(List.of(100L, "attachment")); + + @Test + void eventWithoutExactEffectiveTypeCannotCreateAParentProcessInput() { + EngineMetrics metrics = new EngineMetrics(); + WholeObjectStore objects = new WholeObjectStore(metrics); + try (BlueRuntime runtime = BlueRuntime.create(objects)) { + WholeRequestEntryFactory entryFactory = + new WholeRequestEntryFactory(runtime, objects, metrics); + ExactValue childState = objects.put( + new Node() + .properties("documentId", + new Node().value(CHILD.value())) + .properties("value", new Node().value(1)), + "malformed-event-child-state"); + Node eventWithoutType = new Node().properties( + "kind", new Node().value("Missing/Type")); + DocumentRevision childRevision = new DocumentRevision( + CHILD, + 0L, + 0L, + DocumentRevision.Kind.INITIALIZATION, + null, + childState, + null, + ATTACHMENT_ORDER, + childState.blueId(), + null, + List.of(eventWithoutType), + 0L); + EmbeddingBinding binding = new EmbeddingBinding( + "event-binding", + PARENT, + "/child", + CHILD, + 1L, + ActivationMode.IMPORT_FULL_HISTORY, + null, + childState.blueId(), + null, + "test-admission-proof", + childState.blueId(), + ATTACHMENT_ORDER); + + IllegalStateException failure = assertThrows( + IllegalStateException.class, + () -> EmbeddedEpochInput.create( + entryFactory, + objects, + binding, + childRevision, + 101L, + null)); + + assertTrue(failure.getMessage().contains( + "has no exact effective type"), failure::getMessage); + assertEquals(childState.blueId(), childRevision.after().blueId()); + assertEquals(0L, metrics.counter( + "process.embeddedEpochProcessCalls"), + "invalid evidence must fail before frozen parent PROCESS"); + } + } +} diff --git a/src/test/java/blue/coordination/internal/EmbeddedEpochInputInitializationCausalityTest.java b/src/test/java/blue/coordination/internal/EmbeddedEpochInputInitializationCausalityTest.java new file mode 100644 index 0000000..c6ab1f3 --- /dev/null +++ b/src/test/java/blue/coordination/internal/EmbeddedEpochInputInitializationCausalityTest.java @@ -0,0 +1,80 @@ +package blue.coordination.internal; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Internal application time never replaces the initialization's causal source order. */ +final class EmbeddedEpochInputInitializationCausalityTest { + private static final DocumentId PARENT = DocumentId.of("causal-parent"); + private static final DocumentId CHILD = DocumentId.of("causal-child"); + private static final ExternalOrderKey ATTACHMENT_ORDER = + ExternalOrderKey.of(List.of(100L, "attachment", "entry")); + + @Test + void parentInputKeepsAttachmentOrderAndSeparateApplicationOrder() { + EngineMetrics metrics = new EngineMetrics(); + WholeObjectStore objects = new WholeObjectStore(metrics); + try (BlueRuntime runtime = BlueRuntime.create(objects)) { + WholeRequestEntryFactory entryFactory = + new WholeRequestEntryFactory(runtime, objects, metrics); + ExactValue childState = objects.put( + new Node() + .properties("documentId", + new Node().value(CHILD.value())) + .properties("initializationCount", + new Node().value(1)), + "causal-child-state"); + DocumentRevision initialization = new DocumentRevision( + CHILD, + 0L, + 0L, + DocumentRevision.Kind.INITIALIZATION, + null, + childState, + null, + ATTACHMENT_ORDER, + childState.blueId(), + null, + List.of(), + 17L); + EmbeddingBinding binding = new EmbeddingBinding( + "causal-binding", + PARENT, + "/child", + CHILD, + 1L, + ActivationMode.IMPORT_FULL_HISTORY, + null, + childState.blueId(), + null, + "proof", + childState.blueId(), + ATTACHMENT_ORDER); + + EmbeddedEpochInput input = EmbeddedEpochInput.create( + entryFactory, + objects, + binding, + initialization, + 500L, + null); + + assertEquals(ATTACHMENT_ORDER, input.sourceOrder()); + assertEquals(childState.blueId(), input.originalEntryBlueId()); + assertEquals(500L, input.applicationTimestampMicros()); + assertNotEquals(input.sourceOrder(), input.applicationOrder()); + assertTrue(input.eventOccurrences().isEmpty()); + } + } +} diff --git a/src/test/java/blue/coordination/internal/EmbeddingBindingCanonicalOrderTest.java b/src/test/java/blue/coordination/internal/EmbeddingBindingCanonicalOrderTest.java new file mode 100644 index 0000000..0161735 --- /dev/null +++ b/src/test/java/blue/coordination/internal/EmbeddingBindingCanonicalOrderTest.java @@ -0,0 +1,194 @@ +package blue.coordination.internal; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentId; +import blue.coordination.api.DocumentRevision; +import blue.coordination.api.ExactValue; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +/** Process Embedded siblings follow Unicode code-point path order, never BlueId order. */ +final class EmbeddingBindingCanonicalOrderTest { + private static final ExternalOrderKey ORDER = + ExternalOrderKey.of(List.of(100L, "entry")); + + @Test + void supplementaryCodePointUsesCanonicalTextOrderRatherThanUtf16Order() { + String privateUse = "/games/\uE000"; + String supplementary = "/games/\uD800\uDC00"; + assertNotEquals( + Integer.signum(privateUse.compareTo(supplementary)), + Integer.signum(ExternalOrderKey.compareTextCodePoints( + privateUse, supplementary)), + "this pair deliberately distinguishes UTF-16 from code points"); + + List bindings = new ArrayList<>(List.of( + binding(supplementary, "aaa-child"), + binding(privateUse, "zzz-child"))); + bindings.sort(EmbeddingBinding.WITHIN_PARENT_ORDER); + + assertEquals(List.of(privateUse, supplementary), + bindings.stream().map( + EmbeddingBinding::absolutePath).toList()); + } + + @Test + void absolutePathPrecedesChildIdentityAndActivationGeneration() { + List bindings = new ArrayList<>(List.of( + binding("/games/zulu", "aaa-child", 1L), + binding("/games/alpha", "zzz-child", 9L), + binding("/games/middle", "middle-child", 3L))); + bindings.sort(EmbeddingBinding.WITHIN_PARENT_ORDER); + + assertEquals(List.of( + "/games/alpha", + "/games/middle", + "/games/zulu"), + bindings.stream().map( + EmbeddingBinding::absolutePath).toList()); + } + + @Test + void documentAndRoutingTextUseTheSameCodePointOrder() { + String privateUse = "\uE000"; + String supplementary = "\uD800\uDC00"; + List bindings = new ArrayList<>(List.of( + binding("/same", supplementary), + binding("/same", privateUse))); + bindings.sort(EmbeddingBinding.WITHIN_PARENT_ORDER); + assertEquals(List.of(privateUse, supplementary), bindings.stream() + .map(binding -> binding.childDocumentId().value()).toList()); + assertEquals(-1, Integer.signum( + DocumentId.of(privateUse).compareTo( + DocumentId.of(supplementary)))); + + RoutingSurface surface = new RoutingSurface(List.of( + definition("/" + supplementary, supplementary), + definition("/" + privateUse, privateUse)), false); + assertEquals(List.of("/" + privateUse, "/" + supplementary), + surface.definitions().stream() + .map(RoutingSurface.Definition::scopePath).toList()); + assertEquals(List.of(privateUse, supplementary), + surface.definitions().get(0).sources().stream() + .map(RoutingSurface.SourceAddress::timelineId).toList()); + } + + @Test + void barrierCandidatesUseActivationGenerationBeforeChildEpoch() { + ExactValue state = ExactValue.verified(new Node().value("state")); + DocumentRevision laterEpoch = revision(state, 9L); + DocumentRevision earlierEpoch = revision(state, 0L); + List candidates = + new ArrayList<>(List.of( + SequentialDrainCoordinator.BarrierCandidate.revision( + "barrier", 1, + binding("/same", "same-child", 2L), + earlierEpoch, ORDER), + SequentialDrainCoordinator.BarrierCandidate.revision( + "barrier", 1, + binding("/same", "same-child", 1L), + laterEpoch, ORDER))); + + candidates.sort(SequentialDrainCoordinator.BarrierCandidate.ORDER); + + assertEquals(List.of(1L, 2L), candidates.stream() + .map(candidate -> candidate.binding().activationGeneration()) + .toList(), "activation generation must precede child epoch"); + } + + @Test + void bindingIdentityIsInjectiveWhenParentAndPathContainDelimiters() { + DocumentId firstParent = DocumentId.of("tenant"); + String firstPath = "/offers|/summer"; + DocumentId secondParent = DocumentId.of("tenant|/offers"); + String secondPath = "/summer"; + assertEquals( + firstParent.value() + "|" + firstPath + "|1", + secondParent.value() + "|" + secondPath + "|1", + "the former delimiter concatenation collides for this tuple"); + + String firstId = SequentialDrainCoordinator.bindingId( + firstParent, firstPath, 1L); + String secondId = SequentialDrainCoordinator.bindingId( + secondParent, secondPath, 1L); + + assertNotEquals(firstId, secondId); + assertEquals(firstId, SequentialDrainCoordinator.bindingId( + firstParent, firstPath, 1L), + "structured binding identity must remain deterministic"); + ProcessEmbeddedGraphSnapshot graph = ProcessEmbeddedGraphSnapshot + .empty() + .reconcileParent(firstParent, List.of(binding( + firstParent, firstId, firstPath, "first-child", 1L))) + .reconcileParent(secondParent, List.of(binding( + secondParent, secondId, secondPath, + "second-child", 1L))); + assertEquals(2, graph.bindings().size(), + "both formerly colliding occurrences must coexist"); + } + + private static EmbeddingBinding binding( + String path, + String child) { + return binding(path, child, 1L); + } + + private static EmbeddingBinding binding( + String path, + String child, + long generation) { + return binding( + DocumentId.of("parent"), + "binding|" + path + "|" + child + "|" + generation, + path, + child, + generation); + } + + private static EmbeddingBinding binding( + DocumentId parent, + String bindingId, + String path, + String child, + long generation) { + return new EmbeddingBinding( + bindingId, + parent, + path, + DocumentId.of(child), + generation, + ActivationMode.IMPORT_FULL_HISTORY, + null, + "admitted-blue-id", + null, + "proof", + "attachment-entry", + ORDER); + } + + private static RoutingSurface.Definition definition( + String path, + String operation) { + return new RoutingSurface.Definition( + path, operation, "channel", + List.of( + new RoutingSurface.SourceAddress( + "\uD800\uDC00", "actor"), + new RoutingSurface.SourceAddress( + "\uE000", "actor"))); + } + + private static DocumentRevision revision(ExactValue state, long epoch) { + return new DocumentRevision( + DocumentId.of("same-child"), epoch, epoch, + DocumentRevision.Kind.CATCH_UP_COMPLETED, + state, state, null, null, List.of(), 0L); + } +} diff --git a/src/test/java/blue/coordination/internal/EngineMetricsTest.java b/src/test/java/blue/coordination/internal/EngineMetricsTest.java new file mode 100644 index 0000000..e72b6d4 --- /dev/null +++ b/src/test/java/blue/coordination/internal/EngineMetricsTest.java @@ -0,0 +1,182 @@ +package blue.coordination.internal; + +import blue.coordination.api.CoordinationMetrics; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Unit tests for the thread-safe diagnostic accumulator. */ +final class EngineMetricsTest { + @Test + void absentMeasurementsReadAsZeroAndNamesAreValidated() { + EngineMetrics metrics = new EngineMetrics(); + + assertEquals(0L, metrics.counter("missing")); + assertEquals(0L, metrics.phaseNanos("missing")); + assertThrows(IllegalArgumentException.class, + () -> metrics.increment(" ")); + assertThrows(NullPointerException.class, + () -> metrics.addNanos(null, 1L)); + } + + @Test + void negativeCounterAndTimerDeltasFailClosed() { + EngineMetrics metrics = new EngineMetrics(); + + assertThrows(IllegalArgumentException.class, + () -> metrics.add("work", -1L)); + assertThrows(IllegalArgumentException.class, + () -> metrics.addNanos("phase", -1L)); + } + + @Test + void timedRecordsSuccessfulAndFailedWork() { + EngineMetrics metrics = new EngineMetrics(); + + assertEquals("done", metrics.timed("success", () -> "done")); + assertThrows(IllegalStateException.class, + () -> metrics.timed("failure", () -> { + throw new IllegalStateException("expected"); + })); + + assertTrue(metrics.phaseNanos("success") >= 0L); + assertTrue(metrics.phaseNanos("failure") >= 0L); + } + + @Test + void snapshotsAreImmutableAndUnaffectedByLaterUpdates() { + EngineMetrics metrics = new EngineMetrics(); + metrics.add("work", 2L); + metrics.addNanos("phase", 3L); + EngineMetrics.MetricsSnapshot snapshot = metrics.snapshot(); + metrics.increment("work"); + metrics.addNanos("phase", 4L); + + assertEquals(2L, snapshot.counters().get("work")); + assertEquals(3L, snapshot.phaseNanos().get("phase")); + assertThrows(UnsupportedOperationException.class, + () -> snapshot.counters().clear()); + assertThrows(UnsupportedOperationException.class, + () -> snapshot.phaseNanos().put("other", 1L)); + assertEquals(3L, metrics.counter("work")); + assertEquals(7L, metrics.phaseNanos("phase")); + } + + @Test + void snapshotsProjectCanonicalCountersAndRetainInternalDeltas() { + EngineMetrics metrics = new EngineMetrics(); + metrics.add("journal.entriesStoredWhole", 2L); + metrics.add("routing.lookups", 3L); + metrics.add("temporal.graphSnapshotsReused", 4L); + metrics.add("temporal.graphReconciliations", 5L); + metrics.add("documentStart.sessionsInitialized", 6L); + metrics.add("deliveryReceiptsCommitted", 7L); + metrics.add("process.embeddedEpochProcessCalls", 8L); + metrics.add("temporal.childEpochsCommitted", 9L); + metrics.add("process.documentRevisionsCommitted", 90L); + metrics.add("embedding.parentEpochApplications", 10L); + metrics.add("journal.historicalWindowsOpened", 12L); + metrics.add("temporal.catchUpBarriersCreated", 11L); + metrics.add("temporal.catchUpBarriersExtended", 20L); + metrics.add("temporal.historicalEntriesReplayed", 13L); + metrics.add("temporal.catchUpBarriersCompleted", 14L); + metrics.add("diagnostic.internalDelta", 15L); + + Map snapshot = metrics.snapshot().counters(); + + assertEquals(2L, snapshot.get("ENTRIES_STORED_WHOLE")); + assertEquals(3L, snapshot.get("ROUTE_INDEX_LOOKUPS")); + assertEquals(4L, snapshot.get("GRAPH_SNAPSHOTS_REUSED")); + assertEquals(5L, snapshot.get("GRAPH_RECONCILIATIONS")); + assertEquals(6L, snapshot.get("DOCUMENT_INITIALIZATIONS")); + assertEquals(7L, snapshot.get("EXTERNAL_PROCESS_CALLS")); + assertEquals(8L, snapshot.get("EMBEDDED_EPOCH_PROCESS_CALLS")); + assertEquals(9L, snapshot.get("CHILD_EPOCHS_COMMITTED")); + assertEquals(10L, snapshot.get("PARENT_EPOCH_APPLICATIONS")); + assertEquals(12L, snapshot.get("HISTORICAL_WINDOWS_OPENED")); + assertEquals(13L, snapshot.get("HISTORICAL_ENTRIES_REPLAYED")); + assertEquals(11L, snapshot.get("CATCH_UP_BARRIERS_CREATED")); + assertEquals(14L, snapshot.get("CATCH_UP_BARRIERS_COMPLETED")); + assertEquals(15L, snapshot.get("diagnostic.internalDelta")); + for (CoordinationMetrics.Counter counter + : CoordinationMetrics.Counter.values()) { + assertTrue(snapshot.containsKey(counter.name()), + () -> "Missing canonical counter " + counter); + } + assertEquals(0L, snapshot.get("REQUEST_FRAGMENTS")); + assertEquals(0L, snapshot.get("FULL_ENVIRONMENT_SCANS")); + assertEquals(0L, snapshot.get("POST_PROCESS_FULL_PROJECTIONS")); + } + + @Test + void forbiddenWorkSourcesCannotDisappearBehindDefaultZero() { + EngineMetrics metrics = new EngineMetrics(); + Map sources = Map.of( + "temporal.unrelatedDocumentReads", + CoordinationMetrics.Counter.UNRELATED_DOCUMENT_READS, + "append.requestFragments", + CoordinationMetrics.Counter.REQUEST_FRAGMENTS, + "append.eventFragments", + CoordinationMetrics.Counter.TIMELINE_ENTRY_FRAGMENTS, + "layout.ordinaryNodeFragments", + CoordinationMetrics.Counter.ORDINARY_NODE_FRAGMENTS, + "temporal.fullEnvironmentScans", + CoordinationMetrics.Counter.FULL_ENVIRONMENT_SCANS, + "temporal.sourceReplaysPerParent", + CoordinationMetrics.Counter.SOURCE_REPLAYS_PER_PARENT, + "process.postProcessFullProjections", + CoordinationMetrics.Counter.POST_PROCESS_FULL_PROJECTIONS, + "temporal.parentProcessRerunsOnGraphRetry", + CoordinationMetrics.Counter + .PARENT_PROCESS_RERUNS_ON_GRAPH_RETRY, + "temporal.childProcessRerunsOnParentRetry", + CoordinationMetrics.Counter + .CHILD_PROCESS_RERUNS_ON_PARENT_RETRY); + + sources.forEach((source, ignored) -> metrics.increment(source)); + Map snapshot = metrics.publicSnapshot().counters(); + + sources.values().forEach(counter -> assertEquals( + 1L, snapshot.get(counter.name()), counter.name())); + } + + @Test + void concurrentUpdatesAreNotLost() throws Exception { + EngineMetrics metrics = new EngineMetrics(); + int workers = 8; + int increments = 1_000; + ExecutorService executor = Executors.newFixedThreadPool(workers); + CountDownLatch start = new CountDownLatch(1); + List> futures = new ArrayList<>(); + try { + for (int worker = 0; worker < workers; worker++) { + futures.add(executor.submit(() -> { + start.await(); + for (int index = 0; index < increments; index++) { + metrics.increment("concurrent"); + } + return null; + })); + } + start.countDown(); + for (Future future : futures) { + future.get(); + } + } finally { + executor.shutdownNow(); + } + + assertEquals((long) workers * increments, + metrics.counter("concurrent")); + } +} diff --git a/src/test/java/blue/coordination/internal/InMemoryTimelineJournalHistoricalStepTest.java b/src/test/java/blue/coordination/internal/InMemoryTimelineJournalHistoricalStepTest.java new file mode 100644 index 0000000..0568156 --- /dev/null +++ b/src/test/java/blue/coordination/internal/InMemoryTimelineJournalHistoricalStepTest.java @@ -0,0 +1,278 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; +import blue.coordination.api.Operation; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Supplier; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Closed historical-step and exact completeness-identity tests. */ +final class InMemoryTimelineJournalHistoricalStepTest { + private static final int LARGE_ENTRY_COUNT = 512; + private static final int TIMELINE_COUNT = 16; + + @Test + void returnsEveryClosedOutcomeWithoutConflatingAbsence() { + EngineMetrics metrics = new EngineMetrics(); + WholeObjectStore objects = new WholeObjectStore(metrics); + HistoricalAvailabilityControl availability = + new HistoricalAvailabilityControl(); + try (BlueRuntime runtime = BlueRuntime.create(objects)) { + InMemoryTimelineJournal journal = new InMemoryTimelineJournal( + new WholeRequestEntryFactory(runtime, objects, metrics), + metrics, + availability); + Timeline timeline = new Timeline("timeline-a", "alice"); + ExactValue request = objects.put( + new Node().value("increment"), "historical-test"); + Operation operation = Operation.exact( + "increment", "ownerChannel", request); + TimelineEntry first = journal.append(timeline, operation, 100L); + TimelineEntry second = journal.append(timeline, operation, 200L); + TimelineEntry cutoff = journal.append(timeline, operation, 300L); + AtomicInteger surfaceResolutions = new AtomicInteger(); + Supplier sourceSurface = () -> { + surfaceResolutions.incrementAndGet(); + return "alice-owner-surface"; + }; + + HistoricalStep.EligibleEntry eligible = assertInstanceOf( + HistoricalStep.EligibleEntry.class, + journal.nextHistoricalStep( + null, + cutoff.sourceOrderKey(), + null, + ignored -> true, + 7L, + 11L, + sourceSurface)); + assertEquals(first, eligible.entry()); + assertEquals(first.sourceOrderKey(), eligible.nextExclusive()); + assertEquals(0, surfaceResolutions.get(), + "eligible rows must not calculate completeness identity"); + + HistoricalStep.Complete complete = assertInstanceOf( + HistoricalStep.Complete.class, + journal.nextHistoricalStep( + null, + cutoff.sourceOrderKey(), + null, + ignored -> false, + 7L, + 11L, + sourceSurface)); + assertEquals(3L, complete.evidence().journalRevision()); + assertEquals(1, surfaceResolutions.get()); + + HistoricalStep.CompleteEmpty empty = assertInstanceOf( + HistoricalStep.CompleteEmpty.class, + journal.nextHistoricalStep( + second.sourceOrderKey(), + cutoff.sourceOrderKey(), + null, + ignored -> true, + 7L, + 11L, + sourceSurface)); + assertEquals(cutoff.sourceOrderKey(), + empty.evidence().cutoffExclusive()); + assertEquals(2, surfaceResolutions.get(), + "each completeness proof resolves identity exactly once"); + + availability.makeUnavailable("provider maintenance"); + HistoricalStep.Unavailable unavailable = assertInstanceOf( + HistoricalStep.Unavailable.class, + journal.nextHistoricalStep( + null, + cutoff.sourceOrderKey(), + null, + ignored -> true, + 7L, + 11L, + sourceSurface)); + assertEquals("provider maintenance", unavailable.diagnostic()); + assertEquals(2, surfaceResolutions.get()); + + availability.invalidateEvidence("provider cursor mismatch"); + assertInstanceOf( + HistoricalStep.InvalidEvidence.class, + journal.nextHistoricalStep( + null, + cutoff.sourceOrderKey(), + null, + ignored -> true, + 7L, + 11L, + sourceSurface)); + assertEquals(2, surfaceResolutions.get()); + availability.makeAvailable(); + assertInstanceOf( + HistoricalStep.EligibleEntry.class, + journal.nextHistoricalStep( + null, + cutoff.sourceOrderKey(), + null, + ignored -> true, + 7L, + 11L, + sourceSurface)); + assertEquals(2, surfaceResolutions.get()); + assertEquals(2L, metrics.snapshot().counters().getOrDefault( + "journal.sourceSurfaceIdentitiesResolved", 0L)); + } + } + + @Test + void completenessEvidenceFailsClosedForEveryStaleIdentity() { + ExternalOrderKey cutoff = ExternalOrderKey.of(List.of( + 100L, "timeline", "cutoff")); + CompletenessEvidence evidence = new CompletenessEvidence( + 5L, 7L, 11L, cutoff, "surface-v1"); + + assertTrue(evidence.isCurrentFor( + 5L, 7L, 11L, cutoff, "surface-v1")); + assertFalse(evidence.isCurrentFor( + 6L, 7L, 11L, cutoff, "surface-v1")); + assertFalse(evidence.isCurrentFor( + 5L, 8L, 11L, cutoff, "surface-v1")); + assertFalse(evidence.isCurrentFor( + 5L, 7L, 12L, cutoff, "surface-v1")); + assertFalse(evidence.isCurrentFor( + 5L, 7L, 11L, + ExternalOrderKey.of(List.of(101L, "timeline", "cutoff")), + "surface-v1")); + assertFalse(evidence.isCurrentFor( + 5L, 7L, 11L, cutoff, "surface-v2")); + assertThrows(IllegalArgumentException.class, + () -> new CompletenessEvidence( + -1L, 0L, 0L, cutoff, "surface")); + } + + @Test + void shuffledSparseHistoryAdvancesByCursorWithoutRestartScanning() { + EngineMetrics metrics = new EngineMetrics(); + WholeObjectStore objects = new WholeObjectStore(metrics); + try (BlueRuntime runtime = BlueRuntime.create(objects)) { + InMemoryTimelineJournal journal = new InMemoryTimelineJournal( + new WholeRequestEntryFactory(runtime, objects, metrics), + metrics); + ExactValue request = objects.put( + new Node().value("observe"), "historical-scale-test"); + Operation operation = Operation.exact( + "observe", "ownerChannel", request); + List insertionOrder = new ArrayList<>(); + + for (int batch = 0; batch < TIMELINE_COUNT; batch++) { + int timelineNumber = batch * 5 % TIMELINE_COUNT; + Timeline timeline = new Timeline( + "large-history-" + timelineNumber, + "actor-" + timelineNumber); + for (int offset = timelineNumber; + offset < LARGE_ENTRY_COUNT; + offset += TIMELINE_COUNT) { + insertionOrder.add(journal.append( + timeline, operation, offset + 1L)); + } + } + + List canonicalOrder = insertionOrder.stream() + .sorted(Comparator.comparing( + TimelineEntry::sourceOrderKey)) + .toList(); + assertFalse(insertionOrder.equals(canonicalOrder), + "fixture must not accidentally use source order"); + + EngineMetrics.MetricsSnapshot beforeOrdered = metrics.snapshot(); + List orderedRead = new ArrayList<>(); + ExternalOrderKey orderedCursor = null; + while (true) { + var next = journal.nextExternal( + orderedCursor, + canonicalOrder.get(canonicalOrder.size() - 1) + .sourceOrderKey()); + if (next.isEmpty()) { + break; + } + TimelineEntry entry = next.orElseThrow(); + orderedRead.add(entry); + orderedCursor = entry.sourceOrderKey(); + } + EngineMetrics.MetricsSnapshot afterOrdered = metrics.snapshot(); + + assertEquals(canonicalOrder, orderedRead); + assertEquals(LARGE_ENTRY_COUNT, deltaCounter( + beforeOrdered, afterOrdered, + "journal.orderedCursorReads")); + + ExternalOrderKey cutoff = ExternalOrderKey.of(List.of( + BigInteger.valueOf(LARGE_ENTRY_COUNT + 1L), + "cutoff", + "cutoff")); + List expectedSparse = canonicalOrder.stream() + .filter(entry -> entry.timestampMicros() % 31L == 0L) + .toList(); + EngineMetrics.MetricsSnapshot beforeSparse = metrics.snapshot(); + List actualSparse = new ArrayList<>(); + ExternalOrderKey sparseCursor = null; + while (true) { + HistoricalStep step = journal.nextHistoricalStep( + sparseCursor, + cutoff, + null, + entry -> entry.timestampMicros() % 31L == 0L, + 7L, + 11L, + () -> "large-sparse-surface"); + if (step instanceof HistoricalStep.EligibleEntry eligible) { + if (sparseCursor != null) { + assertTrue(eligible.nextExclusive().compareTo( + sparseCursor) > 0); + } + actualSparse.add(eligible.entry()); + sparseCursor = eligible.nextExclusive(); + continue; + } + HistoricalStep.Complete complete = assertInstanceOf( + HistoricalStep.Complete.class, step); + assertEquals(cutoff, complete.evidence().cutoffExclusive()); + break; + } + EngineMetrics.MetricsSnapshot afterSparse = metrics.snapshot(); + + assertEquals(expectedSparse, actualSparse); + assertEquals(expectedSparse.size() + 1L, deltaCounter( + beforeSparse, afterSparse, + "journal.historicalWindowsOpened")); + assertEquals(LARGE_ENTRY_COUNT, deltaCounter( + beforeSparse, afterSparse, + "journal.historicalCursorProbes"), + "each journal row is probed once across the sparse walk"); + assertEquals(0L, deltaCounter( + beforeSparse, afterSparse, + "journal.orderedCursorReads")); + } + } + + private static long deltaCounter( + EngineMetrics.MetricsSnapshot before, + EngineMetrics.MetricsSnapshot after, + String name) { + return after.counters().getOrDefault(name, 0L) + - before.counters().getOrDefault(name, 0L); + } +} diff --git a/src/test/java/blue/coordination/internal/OperationRouteIndexTest.java b/src/test/java/blue/coordination/internal/OperationRouteIndexTest.java new file mode 100644 index 0000000..33ee160 --- /dev/null +++ b/src/test/java/blue/coordination/internal/OperationRouteIndexTest.java @@ -0,0 +1,271 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; +import blue.coordination.api.ExactValue; +import blue.coordination.api.Timeline; +import blue.coordination.api.TimelineEntry; +import blue.coordination.processor.TimelineProviderSupport; +import blue.language.model.Node; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.SubscriptionDelta; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** Exact active-subscription routing tests for one document generation. */ +final class OperationRouteIndexTest { + private static final DocumentId DOCUMENT = DocumentId.of("document-a"); + + @Test + void atomicallyReplacesRowsFromExactActiveSubscriptionKeys() { + EngineMetrics metrics = new EngineMetrics(); + OperationRouteIndex index = new OperationRouteIndex(metrics); + RoutingSurface aliceSurface = surface("timeline-a", "alice"); + RoutingSurface bobSurface = surface("timeline-b", "bob"); + + index.replace(DOCUMENT, aliceSurface, List.of(active( + "timeline-a", "alice"))); + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-a", "alice"))); + assertEquals(List.of(), index.route(entry("timeline-b", "bob"))); + + index.replace(DOCUMENT, bobSurface, List.of(active( + "timeline-b", "bob"))); + assertEquals(List.of(), index.route(entry("timeline-a", "alice"))); + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-b", "bob"))); + + index.replace(DOCUMENT, bobSurface, List.of()); + assertEquals(List.of(), index.route(entry("timeline-b", "bob"))); + assertEquals(3L, metrics.counter("routing.surfaceCompilations")); + } + + @Test + void invalidReplacementLeavesPriorRouteGenerationPublished() { + OperationRouteIndex index = new OperationRouteIndex( + new EngineMetrics()); + RoutingSurface surface = surface("timeline-a", "alice"); + SubscriptionDelta.Entry active = active("timeline-a", "alice"); + index.replace(DOCUMENT, surface, List.of(active)); + + assertThrows(IllegalStateException.class, + () -> index.replace( + DOCUMENT, surface, List.of(active, active))); + + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-a", "alice"))); + } + + @Test + void changedSubscriptionPublishesOnlyItsRouteKey() { + EngineMetrics metrics = new EngineMetrics(); + OperationRouteIndex index = new OperationRouteIndex(metrics); + RoutingSurface surface = new RoutingSurface(List.of( + new RoutingSurface.Definition( + "/", "increment", "ownerChannel", + "timeline-a", "alice"), + new RoutingSurface.Definition( + "/", "increment", "backupChannel", + "timeline-b", "bob")), false); + ExternalOrderKey initial = ExternalOrderKey.of(List.of(0L)); + index.replace(DOCUMENT, surface, List.of( + active("ownerChannel", "timeline-a", "alice", initial), + active("backupChannel", "timeline-b", "bob", initial))); + long updated = metrics.counter("routing.routeKeysUpdated"); + long retained = metrics.counter("routing.routeKeysRetained"); + + index.replace(DOCUMENT, surface, List.of( + active("ownerChannel", "timeline-a", "alice", + ExternalOrderKey.of(List.of(5L))), + active("backupChannel", "timeline-b", "bob", initial))); + + assertEquals(updated + 1L, + metrics.counter("routing.routeKeysUpdated")); + assertEquals(retained + 1L, + metrics.counter("routing.routeKeysRetained")); + assertEquals(List.of(), index.route(entry( + "timeline-a", "alice", "ownerChannel", + ExactValue.verified(new Node().value("owner-boundary")), + ExternalOrderKey.of(List.of(5L))))); + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-b", "bob", "backupChannel"))); + } + + @Test + void activeLowerExclusiveBoundRejectsEarlierAndBoundaryEntries() { + OperationRouteIndex index = new OperationRouteIndex( + new EngineMetrics()); + ExternalOrderKey frontier = ExternalOrderKey.of(List.of(5L)); + index.replace( + DOCUMENT, + surface("timeline-a", "alice"), + List.of(active("timeline-a", "alice", frontier))); + + assertEquals(List.of(), index.route(entry( + "timeline-a", "alice", ExternalOrderKey.of(List.of(4L))))); + assertEquals(List.of(), index.route(entry( + "timeline-a", "alice", frontier))); + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-a", "alice", ExternalOrderKey.of(List.of(6L))))); + } + + @Test + void allTimelinesKeyStillHonorsTheFrozenMemberSourceSurface() { + OperationRouteIndex index = new OperationRouteIndex( + new EngineMetrics()); + RoutingSurface surface = new RoutingSurface(List.of( + new RoutingSurface.Definition( + "/", + "increment", + "allChannel", + List.of( + new RoutingSurface.SourceAddress( + "timeline-a", "alice"), + new RoutingSurface.SourceAddress( + "timeline-b", "bob")))), false); + List eventKeys = TimelineProviderSupport + .exactTimelineEntryEventKeys("timeline-a", "alice"); + String allTimelinesKey = eventKeys.get(eventKeys.size() - 1); + SubscriptionDelta.Entry active = new SubscriptionDelta.Entry( + "/", + "allChannel", + "all-timelines-type", + List.of("source-allChannel"), + 0, + List.of(allTimelinesKey), + "checkpoint-domain", + 0L, + ExternalOrderKey.of(List.of(0L)), + null); + index.replace(DOCUMENT, surface, List.of(active)); + + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-a", "alice", "allChannel"))); + assertEquals(List.of(DOCUMENT), index.route(entry( + "timeline-b", "bob", "allChannel"))); + assertEquals(List.of(), index.route(entry( + "timeline-c", "charlie", "allChannel"))); + } + + @Test + void publicationGenerationIsMonotonicAndFailedWritesDoNotPublish() { + EngineMetrics metrics = new EngineMetrics(); + OperationRouteIndex index = new OperationRouteIndex(metrics); + RoutingSurface surface = surface("timeline-a", "alice"); + SubscriptionDelta.Entry active = active("timeline-a", "alice"); + assertEquals(0L, index.generation()); + + index.replace(DOCUMENT, surface, List.of(active)); + assertEquals(1L, index.generation()); + assertThrows(IllegalStateException.class, + () -> index.replace( + DOCUMENT, surface, List.of(active, active))); + assertEquals(1L, index.generation()); + + index.replace(DOCUMENT, surface, List.of(active)); + assertEquals(1L, index.generation()); + assertEquals(1L, metrics.counter("routing.routeKeysRetained")); + index.remove(DocumentId.of("missing")); + assertEquals(1L, index.generation()); + index.remove(DOCUMENT); + assertEquals(2L, index.generation()); + index.clear(); + assertEquals(2L, index.generation()); + + index.replace(DOCUMENT, surface, List.of(active)); + assertEquals(3L, index.generation()); + index.clear(); + assertEquals(4L, index.generation()); + } + + private static RoutingSurface surface(String timeline, String actor) { + return new RoutingSurface(List.of(new RoutingSurface.Definition( + "/", + "increment", + "ownerChannel", + timeline, + actor)), false); + } + + private static SubscriptionDelta.Entry active( + String timeline, + String actor) { + return active( + timeline, + actor, + ExternalOrderKey.of(List.of(0L, "admission"))); + } + + private static SubscriptionDelta.Entry active( + String timeline, + String actor, + ExternalOrderKey startAfter) { + return active("ownerChannel", timeline, actor, startAfter); + } + + private static SubscriptionDelta.Entry active( + String channel, + String timeline, + String actor, + ExternalOrderKey startAfter) { + return new SubscriptionDelta.Entry( + "/", + channel, + "timeline-channel-type", + List.of("source-" + channel), + 0, + List.of(TimelineProviderSupport.exactScalarEventKeys( + timeline, actor).get(0)), + "checkpoint-domain", + 0L, + startAfter, + null); + } + + private static TimelineEntry entry(String timeline, String actor) { + return entry(timeline, actor, "ownerChannel"); + } + + private static TimelineEntry entry( + String timeline, + String actor, + String channel) { + ExactValue event = ExactValue.verified(new Node().value( + timeline + "|" + actor + "|event")); + ExternalOrderKey order = ExternalOrderKey.of(List.of( + 1L, timeline, event.blueId())); + return entry(timeline, actor, channel, event, order); + } + + private static TimelineEntry entry( + String timeline, + String actor, + ExternalOrderKey order) { + ExactValue event = ExactValue.verified(new Node().value( + timeline + "|" + actor + "|" + order)); + return entry(timeline, actor, "ownerChannel", event, order); + } + + private static TimelineEntry entry( + String timeline, + String actor, + String channel, + ExactValue event, + ExternalOrderKey order) { + ExactValue request = ExactValue.verified(new Node().value("request")); + return new TimelineEntry( + event, + request, + order, + order, + new Timeline(timeline, actor), + "increment", + channel, + 1L, + 1L, + 1L); + } +} diff --git a/src/test/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshotTest.java b/src/test/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshotTest.java new file mode 100644 index 0000000..e58344a --- /dev/null +++ b/src/test/java/blue/coordination/internal/ProcessEmbeddedGraphSnapshotTest.java @@ -0,0 +1,148 @@ +package blue.coordination.internal; + +import blue.coordination.api.DocumentId; +import blue.coordination.api.ActivationMode; +import blue.language.processor.ExternalOrderKey; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Immutability and independent cursor-generation tests for graph snapshots. */ +final class ProcessEmbeddedGraphSnapshotTest { + private static final DocumentId PARENT = DocumentId.of("parent"); + private static final DocumentId OTHER_PARENT = + DocumentId.of("other-parent"); + private static final DocumentId CHILD_A = DocumentId.of("child-a"); + private static final DocumentId CHILD_B = DocumentId.of("child-b"); + + @Test + void capturedSnapshotIsImmutableWhileCursorAndLaterTopologyAdvance() { + EmbeddingBinding first = binding( + "binding-a", "/a", CHILD_A, 1L); + ProcessEmbeddedGraphSnapshot captured = + ProcessEmbeddedGraphSnapshot.empty() + .reconcileParent(PARENT, List.of(first)); + List capturedChildren = captured.children(PARENT); + long capturedGeneration = captured.generation(); + + EmbeddedEpochCursor initial = new EmbeddedEpochCursor( + first.bindingId(), -1L); + EmbeddedEpochCursor initialized = initial.advanceTo(0L); + EmbeddedEpochCursor processed = initialized.advanceTo(1L); + + assertEquals(-1L, initial.appliedChildEpoch()); + assertEquals(0L, initialized.appliedChildEpoch()); + assertEquals(1L, processed.appliedChildEpoch()); + assertEquals(capturedGeneration, captured.generation()); + assertEquals(List.of(first), capturedChildren); + assertTrue(captured.containsBinding(first.bindingId())); + assertFalse(captured.containsBinding("missing")); + assertThrows(UnsupportedOperationException.class, + () -> capturedChildren.clear()); + assertThrows(UnsupportedOperationException.class, + () -> captured.bindings().clear()); + + ProcessEmbeddedGraphSnapshot unchanged = captured.reconcileParent( + PARENT, List.of(first)); + assertSame(captured, unchanged, + "cursor progress and identical reconciliation are not topology"); + + EmbeddingBinding second = binding( + "binding-b", "/b", CHILD_B, 1L); + ProcessEmbeddedGraphSnapshot advanced = captured.reconcileParent( + PARENT, List.of(first, second)); + + assertEquals(capturedGeneration + 1L, advanced.generation()); + assertEquals(List.of(first), captured.children(PARENT), + "the captured generation must not observe later topology"); + assertEquals(List.of(first, second), advanced.children(PARENT)); + assertTrue(advanced.containsBinding(second.bindingId())); + assertEquals(List.of(first), captured.parents(CHILD_A)); + assertEquals(List.of(second), advanced.parents(CHILD_B)); + } + + @Test + void oneAddedBindingRetainsEveryUnrelatedBucketAndRecord() { + List many = IntStream.range(0, 64) + .mapToObj(index -> binding( + "binding-" + index, + "/children/" + index, + DocumentId.of("child-" + index), 1L)) + .toList(); + EmbeddingBinding unrelated = binding( + OTHER_PARENT, "unrelated", "/other", + DocumentId.of("other-child"), 1L); + ProcessEmbeddedGraphSnapshot captured = + ProcessEmbeddedGraphSnapshot.empty() + .reconcileParent(PARENT, many) + .reconcileParent(OTHER_PARENT, List.of(unrelated)); + List unrelatedBucket = + captured.children(OTHER_PARENT); + List retainedReverse = captured.parents( + many.get(0).childDocumentId()); + EmbeddingBinding retainedRecord = captured.binding( + many.get(0).bindingId()); + List replacement = new ArrayList<>(many); + replacement.add(binding( + "binding-new", "/children/new", + DocumentId.of("child-new"), 1L)); + EngineMetrics metrics = new EngineMetrics(); + + ProcessEmbeddedGraphSnapshot advanced = captured.reconcileParent( + PARENT, replacement, metrics); + + assertSame(unrelatedBucket, advanced.children(OTHER_PARENT)); + assertSame(retainedReverse, advanced.parents( + many.get(0).childDocumentId())); + assertSame(retainedRecord, advanced.binding( + many.get(0).bindingId())); + assertSame(many.get(0), advanced.children(PARENT).get(0)); + assertEquals(1L, metrics.counter( + "temporal.graphForwardBucketsUpdated")); + assertEquals(1L, metrics.counter( + "temporal.graphReverseBucketsUpdated")); + assertEquals(1L, metrics.counter( + "temporal.graphBindingRecordsAdded")); + assertEquals(0L, metrics.counter( + "temporal.graphBindingRecordsRemoved")); + assertEquals(64L, metrics.counter( + "temporal.graphBindingRecordsRetained")); + } + + private static EmbeddingBinding binding( + String id, + String path, + DocumentId child, + long activationGeneration) { + return binding(PARENT, id, path, child, activationGeneration); + } + + private static EmbeddingBinding binding( + DocumentId parent, + String id, + String path, + DocumentId child, + long activationGeneration) { + return new EmbeddingBinding( + id, + parent, + path, + child, + activationGeneration, + ActivationMode.IMPORT_FULL_HISTORY, + null, + "state-" + id, + null, + "proof-" + id, + "attachment-" + id, + ExternalOrderKey.of(List.of(100L, id))); + } +} diff --git a/src/test/java/blue/coordination/internal/SourceSurfaceIdentityTest.java b/src/test/java/blue/coordination/internal/SourceSurfaceIdentityTest.java new file mode 100644 index 0000000..a4545a6 --- /dev/null +++ b/src/test/java/blue/coordination/internal/SourceSurfaceIdentityTest.java @@ -0,0 +1,426 @@ +package blue.coordination.internal; + +import blue.coordination.api.ActivationMode; +import blue.coordination.api.DocumentId; +import blue.language.processor.ExternalChannelDependencySnapshot; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.SubscriptionDelta; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +final class SourceSurfaceIdentityTest { + @Test + void unrelatedBusinessStateDoesNotInvalidateCompletenessIdentity() { + EmbeddingBinding stateA = binding( + "parent", "/child", "child", "state-A", 1L); + EmbeddingBinding stateB = binding( + "parent", "/child", "child", "state-B", 1L); + + assertEquals(identity(stateA), identity(stateB), + "admitted/current business-state identity is not a source surface"); + } + + @Test + void bindingLineageUsesCanonicalFieldsInsteadOfDelimitedDiagnosticId() { + EmbeddingBinding left = binding( + "parent|/slot", "/child", "child", "state", 1L); + EmbeddingBinding right = binding( + "parent", "/slot|/child", "child", "state", 1L); + + assertEquals(left.bindingId(), right.bindingId(), + "the legacy diagnostic encoding must demonstrate the collision"); + assertNotEquals(identity(left), identity(right), + "parent DocumentId and path must be encoded independently"); + } + + @Test + void stableBindingDimensionsInvalidateIdentity() { + String baseline = identity(binding( + "parent", "/child", "child", "state", 1L)); + + assertAll( + () -> assertNotEquals(baseline, identity(binding( + "other-parent", "/child", "child", "state", 1L))), + () -> assertNotEquals(baseline, identity(binding( + "parent", "/other", "child", "state", 1L))), + () -> assertNotEquals(baseline, identity(binding( + "parent", "/child", "other-child", "state", 1L))), + () -> assertNotEquals(baseline, identity(binding( + "parent", "/child", "child", "state", 2L)))); + } + + @Test + void canonicalSubscriptionOrderDoesNotChangeIdentity() { + SubscriptionDelta.Entry first = subscription( + "/", "channelA", "channel-type", "source", 0, + "timeline-key", "checkpoint", dependencies("intrinsic"), + 0L, order(100L), null); + SubscriptionDelta.Entry second = subscription( + "/", "channelB", "channel-type", "source", 1, + "timeline-key", "checkpoint", dependencies("intrinsic"), + 0L, order(100L), null); + EmbeddingBinding binding = defaultBinding(); + + assertEquals( + identity(binding, List.of(first, second), routing()), + identity(binding, List.of(second, first), routing())); + } + + @Test + void subscriptionTextDimensionsUseUnicodeCodePointOrder() { + String privateUse = "\uE000"; + String supplementary = "\uD800\uDC00"; + assertTrue(privateUse.compareTo(supplementary) > 0, + "the fixture must oppose Java UTF-16 ordering"); + + List channelKeys = new ArrayList<>(List.of( + subscription("/", supplementary, "type", "source", 0, + "key", "checkpoint", dependencies("intrinsic"), + 0L, order(100L), null), + subscription("/", privateUse, "type", "source", 0, + "key", "checkpoint", dependencies("intrinsic"), + 0L, order(100L), null))); + channelKeys.sort(SourceSurfaceIdentity.ENTRY_ORDER); + assertEquals(List.of(privateUse, supplementary), channelKeys.stream() + .map(SubscriptionDelta.Entry::channelKey).toList()); + + List sourceLists = new ArrayList<>(List.of( + subscription("/", "channel", "type", supplementary, 0, + "key", "checkpoint", dependencies("intrinsic"), + 0L, order(100L), null), + subscription("/", "channel", "type", privateUse, 0, + "key", "checkpoint", dependencies("intrinsic"), + 0L, order(100L), null))); + sourceLists.sort(SourceSurfaceIdentity.ENTRY_ORDER); + assertEquals(List.of(privateUse, supplementary), sourceLists.stream() + .map(entry -> entry.sourceContributionNodeBlueIds().get(0)) + .toList()); + } + + @Test + void tiedCanonicalSubscriptionPrefixesStillHaveTotalOrder() { + SubscriptionDelta.Entry sourceA = subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint", dependencies("intrinsic-A"), + 0L, order(100L), null); + SubscriptionDelta.Entry sourceB = subscription( + "/", "ownerChannel", "channel-type", "source-B", 0, + "timeline-key", "checkpoint", dependencies("intrinsic-B"), + 0L, order(100L), null); + + assertEquals( + identity(defaultBinding(), + List.of(sourceA, sourceB), routing()), + identity(defaultBinding(), + List.of(sourceB, sourceA), routing())); + } + + @Test + void everySubscriptionIdentityDimensionInvalidatesIdentity() { + EmbeddingBinding binding = defaultBinding(); + SubscriptionDelta.Entry baselineEntry = subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-A", dependencies("intrinsic-A"), + 1L, order(100L), null); + String baseline = identity( + binding, List.of(baselineEntry), routing()); + + assertAll( + () -> changed(baseline, subscription( + "/nested", "ownerChannel", "channel-type", "source-A", + 0, "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "otherChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "other-type", "source-A", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-B", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 1, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "other-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-B", + dependencies("intrinsic-A"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-B"), 1L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 2L, order(100L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(200L), null)), + () -> changed(baseline, subscription( + "/", "ownerChannel", "channel-type", "source-A", 0, + "timeline-key", "checkpoint-A", + dependencies("intrinsic-A"), 1L, order(100L), 3L))); + } + + @Test + void wholeSurfaceAndChannelCatalogEvidenceInvalidateIdentity() { + EmbeddingBinding binding = defaultBinding(); + ExternalChannelDependencySnapshot none = + ExternalChannelDependencySnapshot.none(); + ExternalChannelDependencySnapshot wholeSurface = dependencies( + List.of(), true, false, List.of()); + ExternalChannelDependencySnapshot wholeCatalog = dependencies( + List.of(), false, true, List.of("contract-A")); + String baseline = identity( + binding, List.of(subscription(none)), routing()); + + assertAll( + () -> changed(baseline, subscription(wholeSurface)), + () -> changed(baseline, subscription(wholeCatalog))); + } + + @Test + void exactDependencyAndCatalogEvidenceInvalidateIdentity() { + ExternalChannelDependencySnapshot dependencyA = dependencies( + List.of("intrinsic"), false, false, List.of()); + ExternalChannelDependencySnapshot dependencyB = dependencies( + List.of("intrinsic", "consulted-entry"), + false, false, List.of()); + ExternalChannelDependencySnapshot catalogA = dependencies( + List.of("intrinsic"), false, true, + List.of("contract-A")); + ExternalChannelDependencySnapshot catalogB = dependencies( + List.of("intrinsic"), false, true, + List.of("contract-B")); + + assertAll( + () -> assertNotEquals( + identityWith(dependencyA), identityWith(dependencyB)), + () -> assertNotEquals( + identityWith(catalogA), identityWith(catalogB), + "raw catalog membership is completeness evidence")); + } + + @Test + void compiledRoutesAndEmbeddedReceiverCapabilityInvalidateIdentity() { + EmbeddingBinding binding = defaultBinding(); + List subscriptions = + List.of(subscription(ExternalChannelDependencySnapshot.none())); + String baseline = identity(binding, subscriptions, routing( + "/", "increment", "ownerChannel", "timeline", "alice", false)); + + assertAll( + () -> changed(baseline, routing( + "/nested", "increment", "ownerChannel", + "timeline", "alice", false)), + () -> changed(baseline, routing( + "/", "decrement", "ownerChannel", + "timeline", "alice", false)), + () -> changed(baseline, routing( + "/", "increment", "otherChannel", + "timeline", "alice", false)), + () -> changed(baseline, routing( + "/", "increment", "ownerChannel", + "other-timeline", "alice", false)), + () -> changed(baseline, routing( + "/", "increment", "ownerChannel", + "timeline", "bob", false)), + () -> changed(baseline, routing( + "/", "increment", "ownerChannel", + "timeline", "alice", true))); + } + + @Test + void canonicalRouteAndSourceOrderingDoesNotChangeIdentity() { + RoutingSurface.Definition increment = new RoutingSurface.Definition( + "/", "increment", "ownerChannel", List.of( + new RoutingSurface.SourceAddress("timeline-b", "bob"), + new RoutingSurface.SourceAddress("timeline-a", "alice"))); + RoutingSurface.Definition decrement = new RoutingSurface.Definition( + "/", "decrement", "ownerChannel", "timeline-a", "alice"); + RoutingSurface left = new RoutingSurface( + List.of(increment, decrement), false); + RoutingSurface right = new RoutingSurface(List.of( + decrement, + new RoutingSurface.Definition( + "/", "increment", "ownerChannel", List.of( + new RoutingSurface.SourceAddress( + "timeline-a", "alice"), + new RoutingSurface.SourceAddress( + "timeline-b", "bob")))), false); + + assertEquals( + identity(defaultBinding(), subscriptions(), left), + identity(defaultBinding(), subscriptions(), right)); + } + + @Test + void tiedRoutePrefixesStillHaveCanonicalDefinitionOrder() { + RoutingSurface.Definition alice = new RoutingSurface.Definition( + "/", "increment", "ownerChannel", List.of( + new RoutingSurface.SourceAddress("timeline-b", "bob"), + new RoutingSurface.SourceAddress("timeline-a", "alice"))); + RoutingSurface.Definition carol = new RoutingSurface.Definition( + "/", "increment", "ownerChannel", + "timeline-c", "carol"); + + assertEquals( + identity(defaultBinding(), subscriptions(), + new RoutingSurface(List.of(alice, carol), false)), + identity(defaultBinding(), subscriptions(), + new RoutingSurface(List.of(carol, alice), false))); + } + + private static void changed( + String baseline, + SubscriptionDelta.Entry changed) { + assertNotEquals(baseline, + identity(defaultBinding(), List.of(changed), routing())); + } + + private static void changed(String baseline, RoutingSurface changed) { + assertNotEquals(baseline, + identity(defaultBinding(), subscriptions(), changed)); + } + + private static String identity(EmbeddingBinding binding) { + return identity(binding, subscriptions(), routing()); + } + + private static String identityWith( + ExternalChannelDependencySnapshot dependencies) { + return identity(defaultBinding(), + List.of(subscription(dependencies)), routing()); + } + + private static String identity( + EmbeddingBinding binding, + List subscriptions, + RoutingSurface routing) { + return SourceSurfaceIdentity.calculate( + binding, subscriptions, routing); + } + + private static EmbeddingBinding defaultBinding() { + return binding("parent", "/child", "child", "state", 1L); + } + + private static EmbeddingBinding binding( + String parent, + String path, + String child, + String admittedStateBlueId, + long generation) { + return new EmbeddingBinding( + parent + "|" + path + "|" + generation, + DocumentId.of(parent), + path, + DocumentId.of(child), + generation, + ActivationMode.IMPORT_FULL_HISTORY, + null, + admittedStateBlueId, + null, + "proof", + "attachment-entry", + order(300L)); + } + + private static List subscriptions() { + return List.of(subscription(ExternalChannelDependencySnapshot.none())); + } + + private static SubscriptionDelta.Entry subscription( + ExternalChannelDependencySnapshot dependencies) { + return subscription( + "/", "ownerChannel", "channel-type", "source", 0, + "timeline-key", "checkpoint-domain", dependencies, + 0L, order(100L), null); + } + + private static SubscriptionDelta.Entry subscription( + String scope, + String channel, + String type, + String source, + int channelOrder, + String subscriptionKey, + String checkpointDomain, + ExternalChannelDependencySnapshot dependencies, + Long activationRevision, + ExternalOrderKey start, + Long endRevision) { + return new SubscriptionDelta.Entry( + scope, + channel, + type, + List.of(source), + channelOrder, + List.of(subscriptionKey), + checkpointDomain, + dependencies, + activationRevision, + start, + endRevision); + } + + private static ExternalChannelDependencySnapshot dependencies( + String intrinsic) { + return dependencies(List.of(intrinsic), false, false, List.of()); + } + + private static ExternalChannelDependencySnapshot dependencies( + List intrinsic, + boolean wholeSurface, + boolean wholeCatalog, + List catalogKeys) { + return new ExternalChannelDependencySnapshot( + intrinsic, + List.of(), + List.of(), + wholeSurface, + List.of(), + wholeCatalog, + catalogKeys); + } + + private static RoutingSurface routing() { + return routing( + "/", "increment", "ownerChannel", + "timeline", "alice", false); + } + + private static RoutingSurface routing( + String scope, + String operation, + String channel, + String timeline, + String actor, + boolean embeddedReceiver) { + return new RoutingSurface(List.of(new RoutingSurface.Definition( + scope, operation, channel, timeline, actor)), embeddedReceiver); + } + + private static ExternalOrderKey order(long value) { + return ExternalOrderKey.of(List.of( + BigInteger.valueOf(value), "timeline", "entry")); + } +} diff --git a/src/test/java/blue/coordination/internal/WholeObjectStoreTest.java b/src/test/java/blue/coordination/internal/WholeObjectStoreTest.java new file mode 100644 index 0000000..cc0baa1 --- /dev/null +++ b/src/test/java/blue/coordination/internal/WholeObjectStoreTest.java @@ -0,0 +1,119 @@ +package blue.coordination.internal; + +import blue.coordination.api.ExactValue; +import blue.language.model.Node; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** Unit tests for exact whole-object retention and rollback visibility. */ +final class WholeObjectStoreTest { + @Test + void insertionAndReadsRetainDetachedExactBodies() { + EngineMetrics metrics = new EngineMetrics(); + WholeObjectStore store = new WholeObjectStore(metrics); + Node authored = new Node().properties( + "status", new Node().value("authored")); + ExactValue retained = store.put(authored, "test object"); + authored.getProperties().get("status").value("mutated"); + + assertTrue(store.contains(retained.blueId())); + assertEquals("authored", store.require(retained.blueId()).copyNode() + .getProperties().get("status").getValue()); + List provider = store.fetchByBlueId(retained.blueId()); + provider.get(0).getProperties().get("status").value("provider-copy"); + assertEquals("authored", store.fetchByBlueId(retained.blueId()).get(0) + .getProperties().get("status").getValue()); + assertEquals(1L, metrics.counter("wholeObjectStore.insertions")); + assertEquals(1L, metrics.counter( + "wholeObjectStore.purpose.test_object")); + } + + @Test + void duplicateIdentityDoesNotIncreaseStoreSize() { + EngineMetrics metrics = new EngineMetrics(); + WholeObjectStore store = new WholeObjectStore(metrics); + ExactValue value = ExactValue.verified(new Node().value("same")); + + store.put(value, "first"); + store.put(ExactValue.verified(new Node().value("same")), "second"); + + assertEquals(1, store.size()); + assertEquals(1L, metrics.counter( + "wholeObjectStore.representationVariants")); + } + + @Test + void rollbackRestoresProviderAndCanonicalVisibility() { + WholeObjectStore store = new WholeObjectStore(new EngineMetrics()); + ExactValue retained = ExactValue.verified(new Node().value("later")); + WholeObjectStore.Mark before = store.mark(); + store.put(retained, "later"); + assertEquals(1, store.size()); + + store.rollbackTo(before); + + assertEquals(0, store.size()); + assertFalse(store.contains(retained.blueId())); + assertTrue(store.fetchByBlueId(retained.blueId()).isEmpty()); + } + + @Test + void savepointsJournalOnlyChangedKeysAndNestInConstantStartTime() { + WholeObjectStore store = new WholeObjectStore(new EngineMetrics()); + for (int index = 0; index < 100; index++) { + store.put(new Node().value("existing-" + index), "existing"); + } + WholeObjectStore.Mark outer = store.mark(); + ExactValue retained = store.put( + new Node().value("outer-change"), "outer"); + assertEquals(1, outer.changedKeyCount(), + "a mark must not copy the hundred existing objects"); + + WholeObjectStore.Mark inner = store.mark(); + ExactValue rolledBack = store.put( + new Node().value("inner-change"), "inner"); + assertEquals(1, inner.changedKeyCount()); + store.rollbackTo(inner); + + assertTrue(store.contains(retained.blueId())); + assertFalse(store.contains(rolledBack.blueId())); + store.commit(outer); + assertTrue(store.contains(retained.blueId())); + assertEquals(101, store.size()); + } + + @Test + void exactReadsAreDetachedAndUnknownObjectsFailClearly() { + WholeObjectStore store = new WholeObjectStore(new EngineMetrics()); + ExactValue value = store.put(new Node().value("known"), "known"); + + Node detached = store.require(value.blueId()).copyNode(); + detached.value("changed"); + assertEquals("known", store.require(value.blueId()) + .copyNode().getValue()); + assertThrows(IllegalArgumentException.class, + () -> store.require("missing")); + } + + @Test + void providerPreferenceRejectsUnknownAndReferenceOnlyValues() { + WholeObjectStore store = new WholeObjectStore(new EngineMetrics()); + ExactValue known = store.put(new Node().value("known"), "known"); + + assertThrows(IllegalStateException.class, + () -> store.preferProviderRepresentation( + ExactValue.verified(new Node().value("other")).frozen(), + "unknown")); + assertThrows(IllegalArgumentException.class, + () -> store.preferProviderRepresentation( + ExactValue.verified( + new Node().blueId(known.blueId())).frozen(), + "reference")); + } +} diff --git a/src/test/java/blue/coordination/processor/AllTimelinesChannelProcessorTest.java b/src/test/java/blue/coordination/processor/AllTimelinesChannelProcessorTest.java deleted file mode 100644 index 4489099..0000000 --- a/src/test/java/blue/coordination/processor/AllTimelinesChannelProcessorTest.java +++ /dev/null @@ -1,226 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.repo.BlueRepository; -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; - -class AllTimelinesChannelProcessorTest { - private static final String TIMELINE = "shared-timeline"; - private static final String ACTOR = "shared-actor"; - - @Test - void allTimelinesWithSeveralMatchingChildrenDeliversOnce() { - Fixture fixture = configuredFixture(); - Map contracts = matchingChildren(); - contracts.put("all", allTimelines()); - contracts.put("handler", sourceReportingHandler()); - Node initialized = initializedDocument(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - TIMELINE, - ACTOR, - 10, - "hello"); - - assertChatCount(result.triggeredEvents(), "childA", 1); - assertNotNull(checkpoint(result.document(), "all")); - assertNull(checkpoint(result.document(), "all::childA")); - assertNull(checkpoint(result.document(), "all::childB")); - } - - @Test - void allTimelinesMatchingChildSelectionUsesOrderThenKey() { - Fixture fixture = configuredFixture(); - Map ordered = matchingChildren(); - ordered.get("childB").properties("order", new Node().value(-1)); - ordered.put("all", allTimelines()); - ordered.put("handler", sourceReportingHandler()); - - DocumentProcessingResult orderWinner = process(fixture, - initializedDocument(fixture, ordered), - TIMELINE, - ACTOR, - 1, - "order"); - - assertChatCount(orderWinner.triggeredEvents(), "childB", 1); - - Fixture keyFixture = configuredFixture(); - Map tied = new LinkedHashMap(); - tied.put("childB", TestTimelineProvider.channel(TIMELINE, ACTOR)); - tied.put("childA", TestTimelineProvider.channel(TIMELINE, ACTOR)); - tied.put("all", allTimelines()); - tied.put("handler", sourceReportingHandler()); - - DocumentProcessingResult keyWinner = process(keyFixture, - initializedDocument(keyFixture, tied), - TIMELINE, - ACTOR, - 1, - "key"); - - assertChatCount(keyWinner.triggeredEvents(), "childA", 1); - } - - @Test - void allTimelinesAcceptsEqualTimestampFromDifferentTimeline() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("alice", TestTimelineProvider.channel("alice-timeline", "alice-actor")); - contracts.put("bob", TestTimelineProvider.channel("bob-timeline", "bob-actor")); - contracts.put("all", allTimelines()); - Node initialized = initializedDocument(fixture, contracts); - - DocumentProcessingResult alice = process(fixture, - initialized, - "alice-timeline", - "alice-actor", - 100, - "alice"); - DocumentProcessingResult bob = process(fixture, - alice.document(), - "bob-timeline", - "bob-actor", - 100, - "bob"); - - assertEquals("bob-timeline", - checkpoint(bob.document(), "all").getAsText("/timeline/timelineId")); - assertEquals(BigInteger.valueOf(100), checkpoint(bob.document(), "all").get("/timestamp")); - assertEquals(BigInteger.valueOf(100), checkpoint(bob.document(), "alice").get("/timestamp")); - assertEquals(BigInteger.valueOf(100), checkpoint(bob.document(), "bob").get("/timestamp")); - } - - @Test - void allTimelinesRejectsEntryThatMatchesNoDeclaredTimelineChannel() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("child", TestTimelineProvider.channel(TIMELINE, ACTOR)); - contracts.put("all", allTimelines()); - contracts.put("triggered", new Node().type("Triggered Event Channel")); - - DocumentProcessingResult result = process(fixture, - initializedDocument(fixture, contracts), - "unknown-timeline", - "unknown-actor", - 1, - "unknown"); - - assertNull(checkpoint(result.document(), "all")); - } - - private static Map matchingChildren() { - Map contracts = new LinkedHashMap(); - contracts.put("childA", TestTimelineProvider.channel(TIMELINE, ACTOR)); - contracts.put("childB", TestTimelineProvider.channel(TIMELINE, ACTOR)); - return contracts; - } - - private static Node allTimelines() { - return new Node().type("Coordination/All Timelines Channel"); - } - - private static Node sourceReportingHandler() { - return handler(new Node().properties("$binding", - new Node().value("event/meta/allTimelinesSourceChannelKey"))); - } - - private static Node handler(Node message) { - Node append = new Node().properties("$appendEvent", - new Node().properties("$merge", new Node().items( - new Node().properties("type", new Node().value("Coordination/Chat Message")), - new Node().properties("message", message)))); - Node step = new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - append, - new Node().properties("$return", new Node().value(true)))); - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("all")) - .properties("steps", new Node().items(step)); - } - - private static Node initializedDocument(Fixture fixture, Map contracts) { - Node document = new Node() - .blue(fixture.repository.typeAliasBlue()) - .name("All Timelines V2 Test") - .properties("contracts", new Node().properties(contracts)); - DocumentProcessingResult initialized = fixture.blue.initializeDocument(fixture.blue.preprocess(document)); - assertEquals(ProcessorStatus.SUCCESS, initialized.status(), initialized.failureReason()); - return initialized.document(); - } - - private static DocumentProcessingResult process(Fixture fixture, - Node document, - String timeline, - String actor, - long timestamp, - String message) { - return fixture.blue.processDocument(document, - event(fixture, timeline, actor, timestamp, message)); - } - - private static Node event(Fixture fixture, - String timeline, - String actor, - long timestamp, - String message) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - timeline, - actor, - BigInteger.valueOf(timestamp), - TestTimelineProvider.chatMessage(message)); - } - - private static Node checkpoint(Node document, String key) { - try { - return document.getAsNode("/contracts/checkpoint/lastEvents/" + key); - } catch (IllegalArgumentException ex) { - return null; - } - } - - private static void assertChatCount(List events, String message, int expected) { - int count = 0; - for (Node event : events) { - try { - if (message.equals(event.get("/message"))) { - count++; - } - } catch (IllegalArgumentException ignored) { - } - } - assertEquals(expected, count); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/BootstrapDocumentTransportRoundTripTest.java b/src/test/java/blue/coordination/processor/BootstrapDocumentTransportRoundTripTest.java deleted file mode 100644 index 89a4048..0000000 --- a/src/test/java/blue/coordination/processor/BootstrapDocumentTransportRoundTripTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.snapshot.ResolvedSnapshot; -import blue.language.utils.MergeReverser; -import blue.language.utils.NodeToMapListOrValue; -import blue.repo.BlueRepository; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -class BootstrapDocumentTransportRoundTripTest { - - @Test - void initializedBootstrapDocumentRoundTripsThroughMinimizedTransportAcrossFreshRuntime() { - BlueRepository repository = BlueRepository.latest(); - Blue writer = configured(repository); - Node source = writer.parseSourceYaml(bootstrapSource()); - source.blue(repository.typeAliasBlue()); - - ResolvedSnapshot authored = writer.resolveToSnapshot(source); - DocumentProcessingResult initialization = writer.initializeDocument(authored); - ResolvedSnapshot initialized = initialization.snapshot(); - assertNotNull(initialized.resolvedRoot().getAsNode( - "/contracts/declineBootstrap/request/type/type/inResponseTo/type/requestId"), - "cold resolution must fully materialize nested inherited Request metadata"); - - Node minimized = new MergeReverser().reverseToMinimizedOverlay( - initialized.resolvedRoot()); - assertFalse(minimized.getContracts().getProperties().containsKey("declineBootstrap"), - "the minimized overlay must omit type-derived bootstrap operations"); - - Blue reader = configured(repository); - Node stored = reader.parseSourceJson(writer.nodeToJson(minimized)); - ResolvedSnapshot reloaded = reader.resolveToSnapshot(stored); - - assertEquals(initialized.blueId(), reloaded.blueId(), () -> - "canonical difference: " + firstDifference( - NodeToMapListOrValue.get(initialized.canonicalRoot()), - NodeToMapListOrValue.get(reloaded.canonicalRoot()), "")); - assertEquals(initialized.frozenResolvedRoot().resolvedStructuralKey(), - reloaded.frozenResolvedRoot().resolvedStructuralKey(), () -> - "resolved difference: " + firstDifference( - NodeToMapListOrValue.get(initialized.resolvedRoot()), - NodeToMapListOrValue.get(reloaded.resolvedRoot()), "")); - } - - private static Blue configured(BlueRepository repository) { - Blue blue = repository.configure(new Blue()); - CoordinationProcessors.registerWith(blue); - return blue; - } - - private static String bootstrapSource() { - return String.join("\n", - "type: Bootstrap/Document Bootstrap", - "status:", - " type: Coordination/Status Pending", - "contracts:", - " bootstrapProviderChannel:", - " type: Coordination/Timeline Channel", - " timeline:", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId: bootstrap-provider", - " actor:", - " type: Coordination/Principal Actor"); - } - - private static String firstDifference(Object expected, Object actual, String path) { - if (Objects.equals(expected, actual)) { - return null; - } - if (expected instanceof Map && actual instanceof Map) { - Map expectedMap = (Map) expected; - Map actualMap = (Map) actual; - for (Map.Entry entry : expectedMap.entrySet()) { - String childPath = path + "/" + entry.getKey(); - if (!actualMap.containsKey(entry.getKey())) { - return childPath; - } - String child = firstDifference( - entry.getValue(), actualMap.get(entry.getKey()), childPath); - if (child != null) { - return child; - } - } - for (Object key : actualMap.keySet()) { - if (!expectedMap.containsKey(key)) { - return path + "/" + key; - } - } - return path.isEmpty() ? "/" : path; - } - if (expected instanceof List && actual instanceof List) { - List expectedList = (List) expected; - List actualList = (List) actual; - int commonSize = Math.min(expectedList.size(), actualList.size()); - for (int index = 0; index < commonSize; index++) { - String child = firstDifference(expectedList.get(index), actualList.get(index), - path + "/" + index); - if (child != null) { - return child; - } - } - return path + "/" + commonSize; - } - return path.isEmpty() ? "/" : path; - } -} diff --git a/src/test/java/blue/coordination/processor/CompositeTimelineChannelProcessorTest.java b/src/test/java/blue/coordination/processor/CompositeTimelineChannelProcessorTest.java deleted file mode 100644 index 4ad16a9..0000000 --- a/src/test/java/blue/coordination/processor/CompositeTimelineChannelProcessorTest.java +++ /dev/null @@ -1,387 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelCheckpointContext; -import blue.language.processor.ChannelEvaluation; -import blue.language.processor.ChannelEvaluationContext; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.model.ChannelContract; -import blue.language.processor.model.ChannelEventCheckpoint; -import blue.language.processor.model.MarkerContract; -import blue.language.processor.ChannelEvaluationContextFactory; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.CompositeTimelineChannel; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineChannel; -import blue.repo.coordination.TimelineEntry; -import blue.repo.myos.PrincipalActor; -import java.math.BigInteger; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class CompositeTimelineChannelProcessorTest { - private static final String TIMELINE = "shared-timeline"; - private static final String ACTOR = "shared-actor"; - - @Test - void compositeWithSeveralMatchingChildrenDeliversOnce() { - Fixture fixture = configuredFixture(); - Map contracts = matchingChildren(); - contracts.put("inbox", composite("childB", "childA", "childA")); - contracts.put("handler", sourceReportingHandler("inbox", "compositeSourceChannelKey")); - Node initialized = initializedDocument(fixture, contracts); - - DocumentProcessingResult result = process(fixture, initialized, 10, "hello"); - - assertChatCount(result.triggeredEvents(), "childA", 1); - assertNotNull(checkpoint(result.document(), "inbox")); - assertNull(checkpoint(result.document(), "inbox::childA")); - assertNull(checkpoint(result.document(), "inbox::childB")); - } - - @Test - void unionCheckpointIsIndependentFromChildCheckpoint() { - Fixture fixture = configuredFixture(); - TimelineChannel child = timelineContract(); - Map channels = singletonChannel("child", child); - ChannelEventCheckpoint checkpoint = new ChannelEventCheckpoint() - .putEvent("child", eventNode(fixture, 100, "child ahead")); - ChannelEvaluationContext context = ChannelEvaluationContextFactory.create( - "inbox", - eventNode(fixture, 99, "union backfill"), - channels, - singletonMarker(checkpoint), - new TimelineChannelProcessor()); - CompositeTimelineChannel union = new CompositeTimelineChannel() - .channels(Collections.singletonList("child")); - - ChannelEvaluation evaluation = new CompositeTimelineChannelProcessor().evaluate(union, context); - - assertTrue(evaluation.matches()); - assertEquals(BigInteger.valueOf(99), evaluation.event().get("/timestamp")); - } - - @Test - void childCheckpointIsIndependentFromUnionCheckpoint() { - Fixture fixture = configuredFixture(); - TimelineChannel child = timelineContract(); - Node current = eventNode(fixture, 1, "child backfill"); - Node unionAhead = eventNode(fixture, 100, "union ahead"); - ChannelEventCheckpoint checkpoint = new ChannelEventCheckpoint().putEvent("inbox", unionAhead); - Map markers = singletonMarker(checkpoint); - ChannelEvaluationContext evaluationContext = ChannelEvaluationContextFactory.create( - "child", - current, - singletonChannel("child", child), - markers, - new TimelineChannelProcessor()); - TimelineChannelProcessor processor = new TimelineChannelProcessor(); - - assertTrue(processor.evaluate(child, evaluationContext).matches()); - assertTrue(processor.isNewerEvent(child, - ChannelCheckpointContext.of("/", "child", current, "current", null, null, markers))); - assertFalse(new CompositeTimelineChannelProcessor().isNewerEvent( - new CompositeTimelineChannel().channels(Collections.singletonList("child")), - ChannelCheckpointContext.of("/", "inbox", current, "current", unionAhead, "ahead", markers))); - } - - @Test - void directChildAndUnionHandlersMayBothRun() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("child", TestTimelineProvider.channel(TIMELINE, ACTOR)); - contracts.put("inbox", composite("child")); - contracts.put("childHandler", fixedHandler("child", "direct")); - contracts.put("unionHandler", fixedHandler("inbox", "union")); - Node initialized = initializedDocument(fixture, contracts); - - DocumentProcessingResult result = process(fixture, initialized, 1, "hello"); - - assertChatCount(result.triggeredEvents(), "direct", 1); - assertChatCount(result.triggeredEvents(), "union", 1); - assertNotNull(checkpoint(result.document(), "child")); - assertNotNull(checkpoint(result.document(), "inbox")); - } - - @Test - void matchingChildSelectionIsDeterministic() { - Fixture fixture = configuredFixture(); - Map ordered = matchingChildren(); - ordered.get("childB").properties("order", new Node().value(-1)); - ordered.put("inbox", composite("childA", "childB")); - ordered.put("handler", sourceReportingHandler("inbox", "compositeSourceChannelKey")); - - DocumentProcessingResult orderWinner = process(fixture, - initializedDocument(fixture, ordered), - 1, - "order"); - - assertChatCount(orderWinner.triggeredEvents(), "childB", 1); - - Fixture keyFixture = configuredFixture(); - Map tied = matchingChildren(); - tied.put("inbox", composite("childB", "childA")); - tied.put("handler", sourceReportingHandler("inbox", "compositeSourceChannelKey")); - - DocumentProcessingResult keyWinner = process(keyFixture, - initializedDocument(keyFixture, tied), - 1, - "key"); - - assertChatCount(keyWinner.triggeredEvents(), "childA", 1); - } - - @Test - void newUnionWithNoCheckpointCanBackfillIndependently() { - Fixture fixture = configuredFixture(); - TimelineChannel child = timelineContract(); - Node current = eventNode(fixture, 50, "backfill"); - Node ahead = eventNode(fixture, 100, "ahead"); - ChannelEventCheckpoint checkpoint = new ChannelEventCheckpoint() - .putEvent("child", ahead) - .putEvent("existingUnion", ahead); - Map markers = singletonMarker(checkpoint); - CompositeTimelineChannel union = new CompositeTimelineChannel() - .channels(Collections.singletonList("child")); - CompositeTimelineChannelProcessor processor = new CompositeTimelineChannelProcessor(); - ChannelEvaluationContext context = ChannelEvaluationContextFactory.create( - "newUnion", - current, - singletonChannel("child", child), - markers, - new TimelineChannelProcessor()); - - assertTrue(processor.evaluate(union, context).matches()); - assertTrue(processor.isNewerEvent(union, - ChannelCheckpointContext.of("/", "newUnion", current, "current", null, null, markers))); - } - - @Test - void missingChildChannelFailsClearly() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("inbox", composite("missing")); - - DocumentProcessingResult result = process(fixture, - initializedDocument(fixture, contracts), - 1, - "hello"); - - assertRuntimeFatal(result, "references missing child channel 'missing'"); - } - - @Test - void nonTimelineChildFailsClearly() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("triggered", new Node().type("Triggered Event Channel")); - contracts.put("inbox", composite("triggered")); - - DocumentProcessingResult result = process(fixture, - initializedDocument(fixture, contracts), - 1, - "hello"); - - assertRuntimeFatal(result, "must be a Timeline Channel"); - } - - @Test - void selfReferenceFailsClearly() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("inbox", composite("inbox")); - - DocumentProcessingResult result = process(fixture, - initializedDocument(fixture, contracts), - 1, - "hello"); - - assertRuntimeFatal(result, "cannot include itself"); - } - - @Test - void childChannelEventFilterIsHonored() { - Fixture fixture = configuredFixture(); - TimelineChannel filtered = timelineContract(); - filtered.setDefinition(new Node() - .type(TimelineEntry.repositoryType().reference()) - .properties("message", new Node() - .type(ChatMessage.repositoryType().reference()) - .properties("message", new Node().value("allowed")))); - Map channels = singletonChannel("child", filtered); - CompositeTimelineChannel union = new CompositeTimelineChannel() - .channels(Collections.singletonList("child")); - CompositeTimelineChannelProcessor processor = new CompositeTimelineChannelProcessor(); - - ChannelEvaluation allowed = processor.evaluate(union, - ChannelEvaluationContextFactory.create( - "inbox", - eventNode(fixture, 1, "allowed"), - channels, - Collections.emptyMap(), - new TimelineChannelProcessor())); - ChannelEvaluation denied = processor.evaluate(union, - ChannelEvaluationContextFactory.create( - "inbox", - eventNode(fixture, 2, "denied"), - channels, - Collections.emptyMap(), - new TimelineChannelProcessor())); - - assertTrue(allowed.matches()); - assertFalse(denied.matches()); - } - - private static Map matchingChildren() { - Map contracts = new LinkedHashMap(); - contracts.put("childA", TestTimelineProvider.channel(TIMELINE, ACTOR)); - contracts.put("childB", TestTimelineProvider.channel(TIMELINE, ACTOR)); - return contracts; - } - - private static TimelineChannel timelineContract() { - return new TimelineChannel() - .timeline(new Timeline().timelineId(TIMELINE)) - .actor(new PrincipalActor().accountId(ACTOR)); - } - - private static Map singletonChannel(String key, ChannelContract channel) { - Map channels = new LinkedHashMap(); - channels.put(key, channel); - return channels; - } - - private static Map singletonMarker(ChannelEventCheckpoint checkpoint) { - Map markers = new LinkedHashMap(); - markers.put("checkpoint", checkpoint); - return markers; - } - - private static Node composite(String... channels) { - return new Node() - .type("Coordination/Composite Timeline Channel") - .properties("channels", stringList(channels)); - } - - private static Node stringList(String... values) { - Node[] nodes = new Node[values.length]; - for (int i = 0; i < values.length; i++) { - nodes[i] = new Node().value(values[i]); - } - return new Node().items(nodes); - } - - private static Node sourceReportingHandler(String channel, String metadataKey) { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items( - appendChatMessageStep(bexBinding("event", "/meta/" + metadataKey)))); - } - - private static Node fixedHandler(String channel, String message) { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items( - appendChatMessageStep(new Node().value(message)))); - } - - private static Node appendChatMessageStep(Node message) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendEvent", new Node().properties("$merge", new Node().items( - new Node().properties("type", new Node().value("Coordination/Chat Message")), - new Node().properties("message", message)))), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node bexBinding(String name, String path) { - return new Node().properties("$binding", new Node().value(name + path)); - } - - private static Node initializedDocument(Fixture fixture, Map contracts) { - Node document = new Node() - .blue(fixture.repository.typeAliasBlue()) - .name("Composite Timeline V2 Test") - .properties("contracts", new Node().properties(contracts)); - DocumentProcessingResult initialized = fixture.blue.initializeDocument(fixture.blue.preprocess(document)); - assertEquals(ProcessorStatus.SUCCESS, initialized.status(), initialized.failureReason()); - return initialized.document(); - } - - private static DocumentProcessingResult process(Fixture fixture, - Node document, - long timestamp, - String message) { - return fixture.blue.processDocument(document, eventNode(fixture, timestamp, message)); - } - - private static Node eventNode(Fixture fixture, - long timestamp, - String message) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - TIMELINE, - ACTOR, - BigInteger.valueOf(timestamp), - TestTimelineProvider.chatMessage(message)); - } - - private static Node checkpoint(Node document, String key) { - try { - return document.getAsNode("/contracts/checkpoint/lastEvents/" + key); - } catch (IllegalArgumentException ex) { - return null; - } - } - - private static void assertChatCount(List events, String message, int expected) { - int count = 0; - for (Node event : events) { - try { - if (message.equals(event.get("/message"))) { - count++; - } - } catch (IllegalArgumentException ignored) { - } - } - assertEquals(expected, count); - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null && result.failureReason().contains(expectedMessage), - result.failureReason()); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/CoordinationProcessorsTest.java b/src/test/java/blue/coordination/processor/CoordinationProcessorsTest.java index ef3d123..316b9fa 100644 --- a/src/test/java/blue/coordination/processor/CoordinationProcessorsTest.java +++ b/src/test/java/blue/coordination/processor/CoordinationProcessorsTest.java @@ -1,320 +1,270 @@ package blue.coordination.processor; import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; +import blue.language.processor.ChannelEvaluation; import blue.language.processor.ContractProcessorRegistry; -import blue.language.processor.DocumentProcessingResult; +import blue.language.processor.ContractProcessorRegistryBuilder; import blue.language.processor.DocumentProcessor; -import blue.language.processor.model.ChannelContract; -import blue.language.processor.model.HandlerContract; -import blue.language.processor.model.MarkerContract; -import blue.language.utils.TypeClassResolver; +import blue.language.processor.ProcessingMetricId; +import blue.language.processor.ProcessingObservation; +import blue.language.processor.ProcessingObserver; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.language.runtime.BlueLanguage; import blue.repo.BlueRepository; -import blue.repo.coordination.AllTimelinesChannel; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.ChatWorkflowOperation; -import blue.repo.coordination.CompositeTimelineChannel; -import blue.repo.coordination.Operation; +import blue.repo.coordination.Actor; +import blue.repo.coordination.ActorPolicy; +import blue.repo.coordination.ComputeDefinition; +import blue.repo.coordination.DocumentAnchors; +import blue.repo.coordination.DocumentLinks; import blue.repo.coordination.OperationRequest; -import blue.repo.coordination.SequentialWorkflow; -import blue.repo.coordination.SequentialWorkflowOperation; +import blue.repo.coordination.Timeline; +import blue.repo.coordination.TimelineEntry; import blue.repo.coordination.TimelineChannel; -import blue.repo.coordination.UpdateDocument; -import java.math.BigInteger; +import blue.repo.myos.MyOSTimelineChannel; +import blue.repo.myos.SearchContract; +import blue.repo.workflows.ContractsChangePolicy; +import blue.repo.workflows.DocumentSection; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; -import org.junit.jupiter.api.Test; +import java.util.concurrent.atomic.AtomicInteger; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; -class CoordinationProcessorsTest { +/** Current immutable builder and observer coverage for Coordination wiring. */ +final class CoordinationProcessorsTest { @Test - void registerWithBlueRegistersCoordinationProcessors() { - Fixture fixture = configuredFixture(); - - assertCoordinationProcessorsRegistered(fixture.blue.getDocumentProcessor()); + void shouldRegisterCoordinationChannelsInCurrentContractsRegistry() { + // given + ContractProcessorRegistryBuilder builder = + ContractProcessorRegistryBuilder.create() + .registerDefaults(); + + // when + ContractProcessorRegistry registry = + CoordinationProcessors.configure(builder).build(); + + // then + assertTrue(registry.lookupChannel( + TimelineChannel.blueId()).isPresent()); } @Test - void configureBuilderRegistersCoordinationProcessors() { - DocumentProcessor processor = - CoordinationProcessors.configure(DocumentProcessor.builder()).build(); + void shouldRegisterEveryCurrentRepositoryMarkerCapability() { + // given + ContractProcessorRegistry registry = CoordinationProcessors.configure( + ContractProcessorRegistryBuilder.create() + .registerDefaults()).build(); + + // when + List registered = new ArrayList(); + if (registry.lookupMarker(ActorPolicy.blueId()).isPresent()) { + registered.add(ActorPolicy.blueId()); + } + if (registry.lookupMarker(ComputeDefinition.blueId()).isPresent()) { + registered.add(ComputeDefinition.blueId()); + } + if (registry.lookupMarker(DocumentAnchors.blueId()).isPresent()) { + registered.add(DocumentAnchors.blueId()); + } + if (registry.lookupMarker(DocumentLinks.blueId()).isPresent()) { + registered.add(DocumentLinks.blueId()); + } + if (registry.lookupMarker(SearchContract.blueId()).isPresent()) { + registered.add(SearchContract.blueId()); + } + if (registry.lookupMarker( + ContractsChangePolicy.blueId()).isPresent()) { + registered.add(ContractsChangePolicy.blueId()); + } + if (registry.lookupMarker(DocumentSection.blueId()).isPresent()) { + registered.add(DocumentSection.blueId()); + } - assertCoordinationProcessorsRegistered(processor); + // then + assertEquals(7, registered.size()); } @Test - void registerWithBlueInstallsOptionsMetricsAsLanguageSink() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - Blue blue = CoordinationTestResources.configuredBlue(BlueRepository.latest()); - - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - - assertSame(metrics, blue.getDocumentProcessor().processingMetricsSink()); + void shouldRegisterTimelineSubtypeInSuccessorRegistryGeneration() { + // given + ContractProcessorRegistryBuilder builder = + CoordinationProcessors.configure( + ContractProcessorRegistryBuilder.create() + .registerDefaults()); + + // when + ContractProcessorRegistry registry = + CoordinationProcessors.registerTimelineSubtype( + builder, + MyOSTimelineChannel.class) + .build(); + + // then + assertTrue(registry.lookupChannel( + MyOSTimelineChannel.blueId()).isPresent()); } @Test - void registerWithBluePreservesAndFansOutToIndependentLanguageSink() { - BexProcessingMetrics existing = new BexProcessingMetrics(); - BexProcessingMetrics coordination = new BexProcessingMetrics(); - Blue blue = CoordinationTestResources.configuredBlue(BlueRepository.latest()); - blue.getDocumentProcessor().processingMetricsSink(existing); - - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(coordination) - .build()); - blue.getDocumentProcessor().processingMetricsSink().incrementPatchSequencesPrepared(); - blue.getDocumentProcessor().processingMetricsSink().addPatchesPrepared(3L); - - assertEquals(1L, existing.preparedPatchSequences()); - assertEquals(3L, existing.preparedPatches()); - assertEquals(1L, coordination.preparedPatchSequences()); - assertEquals(3L, coordination.preparedPatches()); + void unionChannelTieBreaksUseUnicodeCodePointOrder() { + String privateUse = "\uE000"; + String supplementary = "\uD800\uDC00"; + assertTrue(privateUse.compareTo(supplementary) > 0, + "the fixture must oppose Java UTF-16 ordering"); + ChannelEvaluation evaluation = ChannelEvaluation.match(new Node()); + + AllTimelinesChannelProcessor.MatchingTimeline allPrivate = + new AllTimelinesChannelProcessor.MatchingTimeline( + privateUse, 0, evaluation); + AllTimelinesChannelProcessor.MatchingTimeline allSupplementary = + new AllTimelinesChannelProcessor.MatchingTimeline( + supplementary, 0, evaluation); + assertTrue(allPrivate.precedes(allSupplementary)); + assertFalse(allSupplementary.precedes(allPrivate)); + + CompositeTimelineChannelProcessor.MatchingChild compositePrivate = + new CompositeTimelineChannelProcessor.MatchingChild( + privateUse, 0, evaluation); + CompositeTimelineChannelProcessor.MatchingChild compositeSupplementary = + new CompositeTimelineChannelProcessor.MatchingChild( + supplementary, 0, evaluation); + assertTrue(compositePrivate.precedes(compositeSupplementary)); + assertFalse(compositeSupplementary.precedes(compositePrivate)); } @Test - void registerWithBlueFansOutGenericLanguageMetricsToBothSinks() { - BexProcessingMetrics existing = new BexProcessingMetrics(); - BexProcessingMetrics coordination = new BexProcessingMetrics(); - Blue blue = CoordinationTestResources.configuredBlue(BlueRepository.latest()); - blue.getDocumentProcessor().processingMetricsSink(existing); - - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(coordination) - .build()); - blue.getDocumentProcessor().processingMetricsSink() - .incrementFullSnapshotFallback("compositeTest"); - blue.getDocumentProcessor().processingMetricsSink() - .incrementNodeCloneCalls("compositeTest"); - blue.getDocumentProcessor().processingMetricsSink() - .setCacheEntries("compositeTest", 4L); - blue.getDocumentProcessor().processingMetricsSink() - .recordCacheHighWaterBytes("compositeTest", 12L); - - assertEquals(existing.languageCounters(), coordination.languageCounters()); - assertEquals(existing.languageGauges(), coordination.languageGauges()); - assertEquals(existing.languageHighWaterMarks(), coordination.languageHighWaterMarks()); - assertEquals(1L, existing.languageCounters().get("fullSnapshotFallbacks")); - assertEquals(1L, existing.languageCounters() - .get("fullSnapshotFallbackReason.compositeTest")); - assertEquals(1L, existing.languageCounters() - .get("nodeCloneCallsByPurpose.compositeTest")); - assertEquals(4L, existing.languageGauges().get("cache.compositeTest.entries")); - assertEquals(12L, existing.languageHighWaterMarks() - .get("cache.compositeTest.highWaterBytes")); + void shouldFanOutTypedObservationsToBothObservers() { + // given + List first = + new ArrayList(); + List second = + new ArrayList(); + ProcessingObserver observer = CoordinationProcessors.observers( + first::add, + second::add); + ProcessingObservation observation = ProcessingObservation.of( + ProcessingMetricId.BLUE_ID_CALCULATIONS, + 3L); + + // when + observer.record(observation); + + // then + assertEquals(1, first.size()); + assertEquals(1, second.size()); + assertEquals(observation, first.get(0)); + assertEquals(observation, second.get(0)); } @Test - void configureBuilderInstallsOptionsMetricsAsLanguageSink() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessor processor = CoordinationProcessors.configure( - DocumentProcessor.builder(), - CoordinationProcessorOptions.builder().processingMetrics(metrics).build()) - .build(); - - assertSame(metrics, processor.processingMetricsSink()); + void shouldIsolateOneFailingObserverFromTheOther() { + // given + AtomicInteger retainedCalls = new AtomicInteger(); + ProcessingObserver observer = CoordinationProcessors.observers( + observation -> { + throw new IllegalStateException("diagnostic failure"); + }, + observation -> retainedCalls.incrementAndGet()); + + // when + observer.record(ProcessingObservation.of( + ProcessingMetricId.BLUE_ID_CALCULATIONS, + 1L)); + + // then + assertEquals(1, retainedCalls.get()); } @Test - void optionsMetricsReceiveRealLanguageMultiPatchSequenceCallbacks() { + void shouldRetainLanguageMetricsThroughCurrentObserverBoundary() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); - Fixture fixture = configuredFixture(CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - Node preprocessed = fixture.blue.preprocess(multiPatchCounterDocument(fixture.repository)); - DocumentProcessingResult initialized = fixture.blue.initializeDocument(preprocessed); - BexProcessingMetrics.Snapshot before = metrics.snapshot(); - - DocumentProcessingResult processed = fixture.blue.processDocument(initialized.document(), - TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - "owner", - 1, - CoordinationTestResources.operationRequest( - "increment", "ownerChannel", new Node().value(7)))); - BexProcessingMetrics.Snapshot after = metrics.snapshot(); - - assertFalse(processed.capabilityFailure(), processed.failureReason()); - assertEquals(BigInteger.valueOf(3), processed.document().get("/counter")); - assertEquals(1L, after.preparedPatchSequences - before.preparedPatchSequences); - assertEquals(3L, after.preparedPatches - before.preparedPatches); - assertEquals(1L, after.languageSequenceTransactions - before.languageSequenceTransactions); - assertEquals(0L, after.languageSingletonTransactions - before.languageSingletonTransactions); - assertEquals(0L, after.languageSuffixRebases - before.languageSuffixRebases); - assertEquals(0L, after.languageFallbackPatches - before.languageFallbackPatches); - assertEquals(2L, after.languageIntermediateSnapshotAdvances - - before.languageIntermediateSnapshotAdvances); - assertEquals(1L, after.languageFinalSnapshotPromotions - - before.languageFinalSnapshotPromotions); + ProcessingObservation observation = ProcessingObservation.of( + ProcessingMetricId.BLUE_ID_CALCULATIONS, + 2L); + + // when + metrics.record(observation); + + // then + assertEquals( + Long.valueOf(2L), + metrics.languageCounters().get( + "blueIdCalculations")); } @Test - void realRepositoryCoordinationContractsLoadAndInitialize() { - Fixture fixture = configuredFixture(); - Node document = counterDocument(fixture.repository, "ownerChannel"); - Node preprocessed = fixture.blue.preprocess(document.clone()); - Map contracts = contracts(preprocessed); - - assertEquals(TimelineChannel.blueId(), contracts.get("ownerChannel").getType().getBlueId()); - assertEquals(SequentialWorkflowOperation.blueId(), - contracts.get("increment").getType().getBlueId()); - - Object convertedOperation = fixture.blue.nodeToObject(contracts.get("increment"), Object.class); - assertTrue(convertedOperation instanceof SequentialWorkflowOperation); - assertEquals("ownerChannel", ((SequentialWorkflowOperation) convertedOperation).getChannel()); - - Object convertedHandler = fixture.blue.nodeToObject(contracts.get("increment"), Object.class); - assertTrue(convertedHandler instanceof SequentialWorkflowOperation); - SequentialWorkflowOperation handler = (SequentialWorkflowOperation) convertedHandler; - assertEquals("ownerChannel", handler.getChannel()); - assertNotNull(handler.getRequest()); - assertNotNull(handler.getSteps()); - assertTrue(handler.getSteps().isEmpty()); - - DocumentProcessingResult result = fixture.blue.initializeDocument(preprocessed); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertTrue(fixture.blue.isInitialized(result.document())); - assertEquals(BigInteger.ZERO, result.document().getProperties().get("counter").getValue()); - assertFalse(contracts(result.document()).containsKey("checkpoint")); + void shouldKeepPublishedSemanticTypeIdentitiesAsTheDefaultProfile() { + // given + CoordinationSemanticTypeIdentities defaults = + CoordinationSemanticTypeIdentities.publishedDefaults(); + + // when + String profileIdentity = defaults.profileIdentity(); + + // then + assertEquals(TimelineEntry.blueId(), + defaults.timelineEntryBlueId()); + assertEquals(OperationRequest.blueId(), + defaults.operationRequestBlueId()); + assertEquals(Timeline.blueId(), defaults.timelineBlueId()); + assertEquals(Actor.blueId(), defaults.actorBlueId()); + assertEquals(profileIdentity, + CoordinationSemanticTypeIdentities + .publishedDefaults().profileIdentity()); } @Test - void sequentialWorkflowOperationWithMissingChannelDoesNotRun() { - Fixture fixture = configuredFixture(); - Node document = counterDocument(fixture.repository, "missingChannel"); - Node preprocessed = fixture.blue.preprocess(document.clone()); - - DocumentProcessingResult initialized = fixture.blue.initializeDocument(preprocessed); - DocumentProcessingResult processed = fixture.blue.processDocument(initialized.document(), - TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - "owner", - 1, - CoordinationTestResources.operationRequest( - "increment", "missingChannel", new Node().value(7)))); - - assertFalse(processed.capabilityFailure(), processed.failureReason()); - assertEquals(BigInteger.ZERO, processed.document().getProperties().get("counter").getValue()); - } - - @Test - void generatedRepositoryContractsProvideProcessorModelBaseTypes() { - assertTrue(ChannelContract.class.isAssignableFrom(AllTimelinesChannel.class)); - assertTrue(ChannelContract.class.isAssignableFrom(TimelineChannel.class)); - assertTrue(ChannelContract.class.isAssignableFrom(CompositeTimelineChannel.class)); - assertTrue(HandlerContract.class.isAssignableFrom(ChatWorkflowOperation.class)); - assertTrue(HandlerContract.class.isAssignableFrom(SequentialWorkflow.class)); - assertTrue(HandlerContract.class.isAssignableFrom(Operation.class)); - assertTrue(HandlerContract.class.isAssignableFrom(SequentialWorkflowOperation.class)); - } - - @Test - void generatedCoordinationTypesResolveToRepositoryClasses() { - TypeClassResolver resolver = BlueRepository.v1_3_0().typeClassResolver(); - - assertEquals(AllTimelinesChannel.class, resolver.resolveClass(AllTimelinesChannel.blueId())); - assertEquals(TimelineChannel.class, resolver.resolveClass(TimelineChannel.blueId())); - assertEquals(CompositeTimelineChannel.class, - resolver.resolveClass(CompositeTimelineChannel.blueId())); - assertEquals(ChatWorkflowOperation.class, resolver.resolveClass(ChatWorkflowOperation.blueId())); - assertEquals(Operation.class, resolver.resolveClass(Operation.blueId())); - assertEquals(SequentialWorkflow.class, resolver.resolveClass(SequentialWorkflow.blueId())); - assertEquals(SequentialWorkflowOperation.class, - resolver.resolveClass(SequentialWorkflowOperation.blueId())); - assertEquals(UpdateDocument.class, resolver.resolveClass(UpdateDocument.blueId())); - assertEquals(ChatMessage.class, resolver.resolveClass(ChatMessage.blueId())); - assertEquals(OperationRequest.class, resolver.resolveClass(OperationRequest.blueId())); - } - - private static void assertCoordinationProcessorsRegistered(DocumentProcessor processor) { - ContractProcessorRegistry registry = processor.getContractRegistry(); - - assertTrue(registry.lookupChannel(AllTimelinesChannel.blueId()).isPresent()); - assertTrue(registry.lookupChannel(TimelineChannel.blueId()).isPresent()); - assertTrue(registry.lookupChannel(CompositeTimelineChannel.blueId()).isPresent()); - assertFalse(registry.lookupMarker(Operation.blueId()).isPresent()); - assertTrue(registry.lookupHandler(ChatWorkflowOperation.blueId()).isPresent()); - assertTrue(registry.lookupHandler(Operation.blueId()).isPresent()); - assertTrue(registry.lookupHandler(SequentialWorkflow.blueId()).isPresent()); - assertTrue(registry.lookupHandler(SequentialWorkflowOperation.blueId()).isPresent()); - } - - private static Fixture configuredFixture() { - return configuredFixture(null); - } - - private static Fixture configuredFixture(CoordinationProcessorOptions options) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, options); - return new Fixture(repository, blue); - } - - private static Node multiPatchCounterDocument(BlueRepository repository) { - Node update = new Node() - .type("Coordination/Update Document") - .properties("changeset", new Node().items( - replacePatch("/counter", 1), - replacePatch("/counter", 2), - replacePatch("/counter", 3))); - Map contracts = new LinkedHashMap<>(); - contracts.put("ownerChannel", TestTimelineProvider.channel("owner")); - contracts.put("increment", new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value("ownerChannel")) - .properties("request", new Node().type("Integer")) - .properties("steps", new Node().items(update))); - return new Node() - .blue(repository.typeAliasBlue()) - .name("MultiPatchCounter") - .properties("counter", new Node().value(0)) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node replacePatch(String path, int value) { - return new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value(path)) - .properties("val", new Node().value(value)); - } - - private static Node counterDocument(BlueRepository repository, String operationChannel) { - Map contracts = new LinkedHashMap<>(); - contracts.put("ownerChannel", TestTimelineProvider.channel("owner")); - contracts.put("increment", new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value(operationChannel)) - .properties("request", new Node().type("Integer")) - .properties("steps", new Node().items(Collections.emptyList()))); - - return new Node() - .blue(repository.typeAliasBlue()) - .name("Counter") - .properties("counter", new Node().value(0)) - .properties("contracts", new Node().properties(contracts)); - } - - private static Map contracts(Node document) { - return document.getContracts().getProperties(); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; + void shouldRejectCustomSemanticIdentityWithMismatchedProviderContent() { + // given + Node timelineEntry = new Node().name("Test Timeline Entry"); + Node operationRequest = new Node().name("Test Operation Request"); + Node timeline = new Node().name("Test Timeline"); + Node actor = new Node().name("Test Actor"); + CoordinationSemanticTypeIdentities custom = + CoordinationSemanticTypeIdentities.exact( + DirectBlueIdCalculator.calculateBlueId(timelineEntry), + DirectBlueIdCalculator.calculateBlueId(operationRequest), + DirectBlueIdCalculator.calculateBlueId(timeline), + DirectBlueIdCalculator.calculateBlueId(actor)); + Map content = new LinkedHashMap(); + content.put(custom.timelineEntryBlueId(), + new Node().name("Mismatched Timeline Entry")); + content.put(custom.operationRequestBlueId(), operationRequest); + content.put(custom.timelineBlueId(), timeline); + content.put(custom.actorBlueId(), actor); + BlueLanguage language = BlueLanguage.builder() + .nodeProvider(blueId -> { + Node node = content.get(blueId); + return node == null + ? null + : Collections.singletonList(node.clone()); + }) + .build(); - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } + // when + IllegalArgumentException failure = assertThrows( + IllegalArgumentException.class, + () -> CoordinationProcessorOptions.builder() + .language(language) + .semanticTypeIdentities(custom) + .build()); + + // then + assertNotNull(failure.getMessage()); + assertTrue(failure.getMessage().contains("Timeline Entry"), + failure.getMessage()); + language.close(); } } diff --git a/src/test/java/blue/coordination/processor/CoordinationRuntimeRegistrationsTest.java b/src/test/java/blue/coordination/processor/CoordinationRuntimeRegistrationsTest.java new file mode 100644 index 0000000..c68aa88 --- /dev/null +++ b/src/test/java/blue/coordination/processor/CoordinationRuntimeRegistrationsTest.java @@ -0,0 +1,109 @@ +package blue.coordination.processor; + +import blue.language.processor.DocumentProcessor; +import blue.repo.myos.MyOSTimelineChannel; +import org.junit.jupiter.api.Test; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CoordinationRuntimeRegistrationsTest { + + @Test + void shouldBindIdentityToActuallyInstalledCoordinationProcessors() { + // given + DocumentProcessor empty = + DocumentProcessor.builder().build(); + DocumentProcessor configured = + CoordinationProcessors.configure( + DocumentProcessor.builder()) + .build(); + + try { + // when + String emptyIdentity = + CoordinationProcessors + .runtimeRegistrationIdentity(empty); + String configuredIdentity = + CoordinationProcessors + .runtimeRegistrationIdentity(configured); + + // then + assertNotEquals( + emptyIdentity, + configuredIdentity); + } finally { + empty.close(); + configured.close(); + } + } + + @Test + void shouldExposeStableIdentityForTheSuppliedProcessorGeneration() { + // given + DocumentProcessor configured = + CoordinationProcessors.configure( + DocumentProcessor.builder()) + .build(); + + try { + // when + String first = CoordinationProcessors + .runtimeRegistrationIdentity(configured); + String second = CoordinationProcessors + .runtimeRegistrationIdentity(configured); + + // then + assertEquals(first, second); + assertEquals( + CoordinationRuntimeRegistrations.identity(configured), + first); + } finally { + configured.close(); + } + } + + @Test + void shouldBindIdentityToExplicitTimelineSubtypeRegistration() { + // given + DocumentProcessor base = + CoordinationProcessors.configure( + DocumentProcessor.builder()) + .build(); + DocumentProcessor extended = + CoordinationProcessors + .registerTimelineSubtype( + CoordinationProcessors + .configure( + DocumentProcessor + .builder()), + MyOSTimelineChannel.class) + .build(); + + try { + // when + String baseIdentity = + CoordinationRuntimeRegistrations + .identity(base); + String extendedIdentity = + CoordinationRuntimeRegistrations + .identity(extended); + + // then + assertNotEquals( + baseIdentity, + extendedIdentity); + assertEquals( + Collections.singletonList( + MyOSTimelineChannel.blueId()), + CoordinationRuntimeRegistrations + .timelineSubtypeBlueIds( + extended)); + } finally { + base.close(); + extended.close(); + } + } +} diff --git a/src/test/java/blue/coordination/processor/CoordinationTestResources.java b/src/test/java/blue/coordination/processor/CoordinationTestResources.java deleted file mode 100644 index 279c9c4..0000000 --- a/src/test/java/blue/coordination/processor/CoordinationTestResources.java +++ /dev/null @@ -1,134 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.repo.BlueRepository; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineChannel; -import blue.repo.myos.PrincipalActor; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.Map; - -public final class CoordinationTestResources { - private static final String LEGACY_SAMPLE_NAMESPACE = "My" + "OS"; - private static final String LEGACY_SAMPLE_CAMEL = "my" + "Os"; - private static final String LEGACY_SAMPLE_LOWER = "my" + "os"; - - private CoordinationTestResources() { - } - - public static String readResource(String resourcePath) { - String normalizedPath = normalizeResourcePath(resourcePath); - InputStream stream = CoordinationTestResources.class.getClassLoader() - .getResourceAsStream(normalizedPath); - if (stream == null) { - throw new IllegalArgumentException("Missing test resource: " + resourcePath); - } - try (InputStream input = stream; ByteArrayOutputStream output = new ByteArrayOutputStream()) { - byte[] buffer = new byte[8192]; - int read; - while ((read = input.read(buffer)) != -1) { - output.write(buffer, 0, read); - } - return new String(output.toByteArray(), StandardCharsets.UTF_8); - } catch (IOException ex) { - throw new IllegalStateException("Failed to read test resource: " + resourcePath, ex); - } - } - - public static Node yamlResource(Blue blue, BlueRepository repository, String resourcePath) { - Node node = blue.parseSourceYaml(readResource(resourcePath)); - node.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(testTypeAliases(repository)).preprocess(node); - return blue.preprocess(aliasesResolved); - } - - public static Map testTypeAliases(BlueRepository repository) { - Map aliases = repository != null && repository.typeAliases() != null - ? new LinkedHashMap(repository.typeAliases()) - : new LinkedHashMap(); - Map additionalAliases = new LinkedHashMap(); - for (Map.Entry entry : aliases.entrySet()) { - String alias = entry.getKey(); - String neutralAlias = neutralSampleAlias(alias); - if (!alias.equals(neutralAlias)) { - additionalAliases.put(neutralAlias, entry.getValue()); - } - } - aliases.putAll(additionalAliases); - return aliases; - } - - public static Blue configuredBlue(BlueRepository repository) { - return repository.configure(new Blue()); - } - - public static String simpleTimelineChannelYaml(String key, String timelineId, int indent) { - String base = spaces(indent); - String child = spaces(indent + 2); - return String.join("\n", - base + key + ":", - child + "type: " + TimelineChannel.qualifiedName(), - child + "timeline:", - spaces(indent + 4) + "type: " + Timeline.qualifiedName(), - spaces(indent + 4) + "providerId: test-provider", - spaces(indent + 4) + "timelineId: " + timelineId, - child + "actor:", - spaces(indent + 4) + "type: " + PrincipalActor.qualifiedName(), - spaces(indent + 4) + "accountId: " + timelineId); - } - - public static Node operationRequest(String operation, String channel, Node request) { - Node safeRequest = request != null ? request : new Node(); - return new Node() - .type("Coordination/Operation Request") - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value(channel)) - .properties("request", safeRequest); - } - - public static Node operationRequestEvent(Blue blue, - BlueRepository repository, - String timelineId, - int timestamp, - String operation, - String channel, - Node request) { - Node requestWithResolvedAliases = new RepositoryTypeAliasPreprocessor( - testTypeAliases(repository)).preprocess( - request != null ? request.clone() : new Node()); - return TestTimelineProvider.timelineEntry(blue, - repository, - timelineId, - timestamp, - operationRequest(operation, channel, requestWithResolvedAliases)); - } - - private static String normalizeResourcePath(String resourcePath) { - if (resourcePath == null) { - throw new IllegalArgumentException("resourcePath must not be null"); - } - return resourcePath.startsWith("/") ? resourcePath.substring(1) : resourcePath; - } - - private static String neutralSampleAlias(String alias) { - return alias.replace(LEGACY_SAMPLE_NAMESPACE, "Sample") - .replace(LEGACY_SAMPLE_CAMEL, "sample") - .replace(LEGACY_SAMPLE_LOWER, "sample"); - } - - private static String spaces(int count) { - if (count <= 0) { - return ""; - } - char[] chars = new char[count]; - Arrays.fill(chars, ' '); - return new String(chars); - } -} diff --git a/src/test/java/blue/coordination/processor/CoordinationTestRuntime.java b/src/test/java/blue/coordination/processor/CoordinationTestRuntime.java new file mode 100644 index 0000000..1dfe38c --- /dev/null +++ b/src/test/java/blue/coordination/processor/CoordinationTestRuntime.java @@ -0,0 +1,500 @@ +package blue.coordination.processor; + +import blue.language.api.BlueCachePolicy; +import blue.language.codec.BlueFormat; +import blue.language.mapping.BlueMapper; +import blue.language.mapping.TypeClassResolver; +import blue.language.merge.ResolvedSnapshot; +import blue.language.model.Node; +import blue.language.processor.ContractProcessor; +import blue.language.processor.BlueContracts; +import blue.language.processor.ContractProcessorRegistryBuilder; +import blue.language.processor.DocumentProcessingResult; +import blue.language.processor.DocumentProcessor; +import blue.language.processor.ProcessingObserver; +import blue.language.processor.model.Contract; +import blue.language.processor.registry.BlueRuntimeTypeRegistry; +import blue.language.processor.registry.RuntimeTypeAliases; +import blue.language.provider.NodeProvider; +import blue.language.provider.SequentialNodeProvider; +import blue.language.runtime.BlueLanguage; +import blue.repo.BlueRepository; +import blue.repo.coordination.TimelineChannel; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Current-API composition fixture for Coordination tests. + * + *

The fixture keeps Language, Contracts, mapping, and exact Repository + * evidence as separate named services. Configuration changes rebuild an + * immutable processor generation; no removed mutable {@code Blue} API is + * reproduced in production code.

+ */ +public final class CoordinationTestRuntime implements AutoCloseable { + + private final BlueRepository repository; + private final BlueCachePolicy cachePolicy; + private final NodeProvider currentRepositoryExactNodes; + private final List additionalProviders = + new ArrayList(); + private final List> timelineSubtypes = + new ArrayList>(); + private final List externalRegistrations = + new ArrayList(); + private final TypeClassResolver typeClassResolver = + new TypeClassResolver("blue.repo"); + private final BlueMapper mapping = BlueMapper.builder() + .registerMappings(typeClassResolver) + .build(); + + private CoordinationProcessorOptions options; + private ProcessingObserver explicitObserver; + private NodeProvider nodeProvider; + private BlueLanguage language; + private BlueContracts contracts; + private DocumentProcessor processor; + private boolean closed; + + private CoordinationTestRuntime( + BlueRepository repository, + Collection initialProviders, + BlueCachePolicy cachePolicy) { + this.repository = Objects.requireNonNull(repository, "repository"); + this.cachePolicy = Objects.requireNonNull(cachePolicy, "cachePolicy"); + this.currentRepositoryExactNodes = + new CurrentRepositoryExactNodeProvider(repository); + this.additionalProviders.addAll(Objects.requireNonNull( + initialProviders, "initialProviders")); + rebuild(); + } + + /** Creates a fixture bound to the exact selected Repository release. */ + public static CoordinationTestRuntime create(BlueRepository repository) { + return new CoordinationTestRuntime( + repository, + Collections.emptyList(), + BlueCachePolicy.boundedDefaults()); + } + + /** + * Creates one runtime generation with its highest-priority provider and + * cache policy already installed. This avoids constructing and immediately + * closing a throwaway generation during test-environment startup. + */ + public static CoordinationTestRuntime create( + BlueRepository repository, + NodeProvider highestPriorityProvider, + BlueCachePolicy cachePolicy) { + return new CoordinationTestRuntime( + repository, + Collections.singletonList(Objects.requireNonNull( + highestPriorityProvider, + "highestPriorityProvider")), + cachePolicy); + } + + /** Returns the focused Language runtime. */ + public BlueLanguage language() { + ensureOpen(); + return language; + } + + /** Returns the current immutable Contracts processor generation. */ + public DocumentProcessor processor() { + ensureOpen(); + return processor; + } + + /** Returns the focused Contracts service used by managed-host tests. */ + public BlueContracts contracts() { + ensureOpen(); + return contracts; + } + + /** Returns the exact provider shared by Language and Contracts. */ + public NodeProvider nodeProvider() { + ensureOpen(); + return nodeProvider; + } + + /** Returns the immutable test fixture's current Repository type map. */ + public TypeClassResolver typeClassResolver() { + ensureOpen(); + return typeClassResolver; + } + + /** Compatibility spelling retained only for older Coordination fixtures. */ + public TypeClassResolver getTypeClassResolver() { + return typeClassResolver(); + } + + /** Rebuilds the fixture with one additional highest-priority provider. */ + public void addNodeProvider(NodeProvider provider) { + ensureOpen(); + additionalProviders.add(0, Objects.requireNonNull( + provider, "provider")); + rebuild(); + } + + /** Rebuilds the fixture with explicit Coordination processor options. */ + public void configure(CoordinationProcessorOptions newOptions) { + ensureOpen(); + options = Objects.requireNonNull(newOptions, "options"); + rebuild(); + } + + /** + * Rebuilds with independent host observation and workflow metrics. + * Both callbacks remain observational and failure-isolated. + */ + public void configure( + CoordinationProcessorOptions newOptions, + ProcessingObserver observer) { + ensureOpen(); + options = Objects.requireNonNull(newOptions, "options"); + explicitObserver = Objects.requireNonNull(observer, "observer"); + rebuild(); + } + + /** Registers one Timeline Channel subtype in a successor generation. */ + public void registerTimelineSubtype( + Class contractType) { + ensureOpen(); + timelineSubtypes.add(Objects.requireNonNull( + contractType, "contractType")); + rebuild(); + } + + /** Registers one exact external contract type in a successor generation. */ + public void registerExternalContractType( + String blueId, + Node canonicalType, + ContractProcessor contractProcessor) { + ensureOpen(); + externalRegistrations.add(new ExternalRegistration( + blueId, + canonicalType, + contractProcessor)); + rebuild(); + } + + public Node parseSourceYaml(String yaml) { + ensureOpen(); + return language.codec().parseSource(yaml, BlueFormat.YAML); + } + + public Node parseSourceJson(String json) { + ensureOpen(); + return language.codec().parseSource(json, BlueFormat.JSON); + } + + public Node yamlToNode(String yaml) { + return preprocess(parseSourceYaml(yaml)); + } + + public Node jsonToNode(String json) { + return preprocess(parseSourceJson(json)); + } + + public String nodeToYaml(Node node) { + ensureOpen(); + return language.codec().write(node, BlueFormat.YAML); + } + + public String nodeToJson(Node node) { + ensureOpen(); + return language.codec().write(node, BlueFormat.JSON); + } + + public Node objectToNode(Object value) { + ensureOpen(); + return preprocess(mapping.toNode(value)); + } + + public T nodeToObject(Node node, Class targetClass) { + ensureOpen(); + return mapping.fromNode(node, targetClass); + } + + public Node preprocess(Node source) { + ensureOpen(); + return language.preprocessing().preprocess(source); + } + + public Node resolve(Node source) { + ensureOpen(); + return language.resolution().resolve(source); + } + + public ResolvedSnapshot resolveToSnapshot(Node source) { + ensureOpen(); + return language.snapshots().resolve(source); + } + + public ResolvedSnapshot loadSnapshot(String blueId) { + ensureOpen(); + return language.snapshots().load(blueId); + } + + public ResolvedSnapshot loadSnapshot(Node canonicalIdentityInput) { + ensureOpen(); + return language.snapshots().load(canonicalIdentityInput); + } + + public ResolvedSnapshot resolveToSnapshotPreservingPaths( + Node source, + Collection paths) { + ensureOpen(); + return language.snapshots().resolvePreservingPaths(source, paths); + } + + public void clearResolvedSnapshotCache() { + ensureOpen(); + language.snapshots().clear(); + } + + public String calculateBlueId(Node exactInput) { + ensureOpen(); + return language.identity().directBlueId(exactInput); + } + + public String calculateSourceDocumentBlueId(Node source) { + ensureOpen(); + return language.identity().sourceDocumentBlueId(source); + } + + public Node canonicalize(Node source) { + ensureOpen(); + return language.identity().canonicalIdentityInput(source); + } + + public boolean nodeMatchesType(Node candidate, Node type) { + ensureOpen(); + return language.matching().matches(candidate, type); + } + + public DocumentProcessingResult initializeDocument(Node document) { + ensureOpen(); + return processor.initializeDocument(document); + } + + public DocumentProcessingResult initializeDocument( + ResolvedSnapshot snapshot) { + ensureOpen(); + return processor.initializeDocument(snapshot); + } + + public DocumentProcessingResult processDocument(Node root, Node event) { + ensureOpen(); + return processor.processDocument(root, event); + } + + public DocumentProcessingResult processDocument( + ResolvedSnapshot snapshot, + Node event) { + ensureOpen(); + return processor.processDocument(snapshot, event); + } + + public boolean isInitialized(Node document) { + ensureOpen(); + return processor.isInitialized(document); + } + + public boolean isInitialized(ResolvedSnapshot snapshot) { + ensureOpen(); + return processor.isInitialized(snapshot); + } + + @Override + public void close() { + if (closed) { + return; + } + closed = true; + closeGeneration(); + } + + private void rebuild() { + BlueContracts previousContracts = contracts; + DocumentProcessor previousProcessor = processor; + BlueLanguage previousLanguage = language; + + List providers = new ArrayList(); + providers.addAll(additionalProviders); + providers.add(BlueRuntimeTypeRegistry.getDefault() + .asProcessorSnapshotProvider()); + providers.add(repository.nodeProvider()); + providers.add(currentRepositoryExactNodes); + NodeProvider nextProvider = new SequentialNodeProvider(providers); + + Map imports = new LinkedHashMap(); + imports.putAll(RuntimeTypeAliases.AGGREGATE_NAME_TO_BLUE_ID); + imports.putAll(repository.preprocessingAliases()); + BlueLanguage nextLanguage = BlueLanguage.builder() + .nodeProvider(nextProvider) + .preprocessingAliases(imports) + .environmentImports(imports) + .cachePolicy(cachePolicy) + .build(); + + CoordinationProcessorOptions effectiveOptions = + optionsWithCurrentLanguage(nextLanguage); + ContractProcessorRegistryBuilder registry = + CoordinationProcessors.configure( + ContractProcessorRegistryBuilder.create() + .registerDefaults(), + effectiveOptions); + for (Class subtype : timelineSubtypes) { + registerTimelineSubtype(registry, subtype); + } + for (ExternalRegistration registration : externalRegistrations) { + registry.register( + registration.blueId, + registration.canonicalType.clone(), + registration.processor); + } + BlueContracts.Builder contractsBuilder = BlueContracts.builder( + nextLanguage.processing()) + .runtimeRegistry(registry.build()); + ProcessingObserver contractsObserver = + CoordinationProcessors.observers( + explicitObserver, + effectiveOptions.processingMetrics()); + if (contractsObserver != null) { + contractsBuilder.observer(contractsObserver); + } + BlueContracts nextContracts = contractsBuilder.build(); + + DocumentProcessor.Builder builder = + CoordinationProcessors.configure( + DocumentProcessor.builder() + .runtimeAccess( + nextContracts.runtimeAccess()), + effectiveOptions); + if (explicitObserver != null) { + builder.observer(CoordinationProcessors.observers( + explicitObserver, + effectiveOptions.processingMetrics())); + } + for (Class subtype : timelineSubtypes) { + builder = registerTimelineSubtype(builder, subtype); + } + for (ExternalRegistration registration : externalRegistrations) { + builder.registerContractProcessor( + registration.blueId, + registration.canonicalType.clone(), + registration.processor); + } + builder.runtimeRegistryIdentity( + "blue.coordination/test-support-runtime/1.0"); + DocumentProcessor nextProcessor = builder.build(); + + nodeProvider = nextProvider; + language = nextLanguage; + contracts = nextContracts; + processor = nextProcessor; + close(previousContracts); + close(previousProcessor); + close(previousLanguage); + } + + private CoordinationProcessorOptions optionsWithCurrentLanguage( + BlueLanguage currentLanguage) { + if (options == null) { + return CoordinationProcessorOptions.builder() + .language(currentLanguage) + .build(); + } + CoordinationProcessorOptions.Builder builder = + CoordinationProcessorOptions.builder() + .defaultComputeGasLimit( + options.defaultComputeGasLimit()) + .processingMetrics(options.processingMetrics()) + .processingEventIdentityObserver( + options.processingEventIdentityObserver()); + if (options.sequentialWorkflowRunner() != null) { + builder.sequentialWorkflowRunner( + options.sequentialWorkflowRunner()); + } else if (options.bexEngine() != null) { + builder.bexEngine(options.bexEngine()); + } else { + builder.language(currentLanguage); + } + return builder.build(); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static DocumentProcessor.Builder registerTimelineSubtype( + DocumentProcessor.Builder builder, + Class subtype) { + return CoordinationProcessors.registerTimelineSubtype( + builder, + (Class) subtype); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static ContractProcessorRegistryBuilder registerTimelineSubtype( + ContractProcessorRegistryBuilder registry, + Class subtype) { + return CoordinationProcessors.registerTimelineSubtype( + registry, + (Class) subtype); + } + + private void closeGeneration() { + close(contracts); + contracts = null; + close(processor); + processor = null; + close(language); + language = null; + nodeProvider = null; + } + + private static void close(AutoCloseable resource) { + if (resource == null) { + return; + } + try { + resource.close(); + } catch (RuntimeException failure) { + throw failure; + } catch (Exception failure) { + throw new IllegalStateException( + "Could not close test runtime generation", failure); + } + } + + private void ensureOpen() { + if (closed) { + throw new IllegalStateException( + "Coordination test runtime is closed"); + } + } + + private static final class ExternalRegistration { + private final String blueId; + private final Node canonicalType; + private final ContractProcessor processor; + + private ExternalRegistration( + String blueId, + Node canonicalType, + ContractProcessor processor) { + this.blueId = Objects.requireNonNull(blueId, "blueId"); + this.canonicalType = Objects.requireNonNull( + canonicalType, "canonicalType").clone(); + this.processor = Objects.requireNonNull( + processor, "processor"); + } + } +} + diff --git a/src/test/java/blue/coordination/processor/CounterSnapshotRoundTripStressTest.java b/src/test/java/blue/coordination/processor/CounterSnapshotRoundTripStressTest.java deleted file mode 100644 index 1dcff03..0000000 --- a/src/test/java/blue/coordination/processor/CounterSnapshotRoundTripStressTest.java +++ /dev/null @@ -1,231 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.CoordinationProcessors; -import blue.language.Blue; -import blue.language.NodeProvider; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.HandlerProcessor; -import blue.language.processor.ProcessorExecutionContext; -import blue.language.processor.model.HandlerContract; -import blue.language.processor.model.JsonPatch; -import blue.language.snapshot.ResolvedSnapshot; -import blue.language.provider.BasicNodeProvider; -import blue.language.provider.SequentialNodeProvider; -import blue.language.utils.NodeProviderWrapper; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.TimelineChannel; -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class CounterSnapshotRoundTripStressTest { - private static final int STRESS_ITERATIONS = 100; - - @Test - void bexOnlyCounterUpdatesSurviveCanonicalSnapshotRoundTrips() { - Fixture fixture = configuredFixture(); - DocumentProcessingResult initialized = fixture.blue.initializeDocument( - fixture.blue.preprocess(bexOnlyCounterDocument(fixture.counterIncrementHandlerBlueId) - .blue(fixture.repository.typeAliasBlue()))); - ResolvedSnapshot currentSnapshot = initialized.snapshot(); - assertNotNull(currentSnapshot); - - long started = System.nanoTime(); - long totalGas = 0L; - long maxGas = 0L; - long minGas = Long.MAX_VALUE; - String finalBlueId = null; - - for (int i = 1; i <= STRESS_ITERATIONS; i++) { - Node event = timelineEntry(fixture.blue, - fixture.repository, - "counter", - i, - chatMessage("tick " + i)); - if (i > 1) { - // Canonical child fragments may omit context-derived types; compare the - // resolved event view when treating the nested timeline as a document. - Node previous = currentSnapshot.resolvedNodeAt( - "/contracts/checkpoint/lastEvents/ownerChannel"); - CoordinationEventNodes.TimelineEntryView previousEntry = - CoordinationEventNodes.timelineEntry(previous); - CoordinationEventNodes.TimelineEntryView currentEntry = - CoordinationEventNodes.timelineEntry(event); - assertNotNull(previousEntry); - assertNotNull(currentEntry); - assertTrue(BlueSemanticIdentity.equals( - currentEntry.timeline(), previousEntry.timeline())); - assertTrue(currentEntry.timestamp().compareTo(previousEntry.timestamp()) > 0); - TimelineChannel channel = fixture.blue.nodeToObject( - currentSnapshot.resolvedNodeAt("/contracts/ownerChannel"), - TimelineChannel.class); - assertTrue(TimelineProviderSupport.matchesTimelineAndActor(channel, currentEntry)); - } - - DocumentProcessingResult result = fixture.blue.processDocument(currentSnapshot, event); - - assertNotNull(result.snapshot(), "iteration " + i + " should return a snapshot"); - assertNotNull(result.blueId(), "iteration " + i + " should return a BlueId"); - assertTrue(result.totalGas() > 0, "iteration " + i + " should charge gas"); - assertEquals(1, result.triggeredEvents().size(), "iteration " + i + " should emit one event"); - assertEquals(BigInteger.valueOf(i), result.resolvedDocument().get("/counter")); - assertCounterMessage(result.triggeredEvents().get(0), i); - - totalGas += result.totalGas(); - maxGas = Math.max(maxGas, result.totalGas()); - minGas = Math.min(minGas, result.totalGas()); - finalBlueId = result.blueId(); - - String canonicalJson = fixture.blue.nodeToJson(result.canonicalDocument()); - Fixture coldFixture = configuredFixture(); - Node parsedCanonical = coldFixture.blue.parseSourceJson(canonicalJson); - ResolvedSnapshot loadedSnapshot = coldFixture.blue.loadSnapshot(parsedCanonical); - - assertEquals(result.blueId(), loadedSnapshot.blueId(), "iteration " + i + " should preserve BlueId"); - assertSnapshotRoundTrip(result.snapshot(), loadedSnapshot); - currentSnapshot = loadedSnapshot; - fixture = coldFixture; - } - - long elapsedMillis = (System.nanoTime() - started) / 1_000_000L; - assertEquals(BigInteger.valueOf(STRESS_ITERATIONS), currentSnapshot.resolvedNodeAt("/counter").getValue()); - assertNotNull(finalBlueId); - assertTrue(totalGas > 0); - assertTrue(maxGas > 0); - assertTrue(minGas > 0); - assertEquals(minGas, maxGas, "equivalent BEX-only increments should charge stable gas"); - - System.out.println("BEX-only counter snapshot round-trip stress: iterations=" + STRESS_ITERATIONS - + ", totalGas=" + totalGas - + ", minGas=" + minGas - + ", maxGas=" + maxGas - + ", finalBlueId=" + finalBlueId - + ", elapsedMillis=" + elapsedMillis); - } - - private static void assertSnapshotRoundTrip(ResolvedSnapshot expected, ResolvedSnapshot actual) { - assertEquals(expected.blueId(), actual.blueId()); - assertEquals(expected.frozenCanonicalRoot().blueId(), - actual.frozenCanonicalRoot().blueId()); - } - - private static Node bexOnlyCounterDocument(String counterIncrementHandlerBlueId) { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", timelineChannel("counter")); - contracts.put("incrementImpl", new Node() - .type(new Node().blueId(counterIncrementHandlerBlueId)) - .properties("channel", new Node().value("ownerChannel"))); - - return new Node() - .name("Counter") - .properties("counter", new Node().value(0)) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node timelineChannel(String timelineId) { - return new Node() - .type(TimelineChannel.qualifiedName()) - .properties("timeline", timeline(timelineId)) - .properties("actor", principalActor()); - } - - private static Node timelineEntry(Blue blue, - BlueRepository repository, - String timelineId, - int timestamp, - Node message) { - Node event = new Node() - .type("Coordination/Timeline Entry") - .properties("timeline", timeline(timelineId)) - .properties("actor", principalActor()) - .properties("timestamp", new Node().value(BigInteger.valueOf(timestamp))) - .properties("message", message) - .blue(repository.typeAliasBlue()); - return blue.preprocess(event).blue(null); - } - - private static Node timeline(String timelineId) { - return new Node() - .type("Coordination/Timeline") - .properties("providerId", new Node().value("test-provider")) - .properties("timelineId", new Node().value(timelineId)); - } - - private static Node principalActor() { - return new Node().type("Coordination/Principal Actor"); - } - - private static Node chatMessage(String message) { - return new Node() - .type(ChatMessage.qualifiedName()) - .properties("message", new Node().value(message)); - } - - private static void assertCounterMessage(Node event, int counter) { - assertEquals("Counter is now " + counter, event.get("/message")); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - NodeProvider repositoryProvider = blue.getNodeProvider(); - Node counterIncrementHandlerType = new Node().name("Counter Increment Handler"); - BasicNodeProvider testTypes = new BasicNodeProvider(); - testTypes.addSingleNodes(counterIncrementHandlerType); - String counterIncrementHandlerBlueId = testTypes.getBlueIdByName( - "Counter Increment Handler"); - blue.nodeProvider(new SequentialNodeProvider( - NodeProviderWrapper.unverified(testTypes), repositoryProvider)); - CoordinationProcessors.registerWith(blue); - blue.registerExternalContractType(counterIncrementHandlerBlueId, - counterIncrementHandlerType, - new CounterIncrementHandlerProcessor()); - return new Fixture(repository, blue, counterIncrementHandlerBlueId); - } - - public static final class CounterIncrementHandler extends HandlerContract { - } - - public static final class CounterIncrementHandlerProcessor - implements HandlerProcessor { - - @Override - public Class contractType() { - return CounterIncrementHandler.class; - } - - @Override - public void execute(CounterIncrementHandler contract, ProcessorExecutionContext context) { - Node current = context.documentAt(context.resolvePointer("/counter")); - int value = ((Number) current.getValue()).intValue(); - int next = value + 1; - - context.applyPatch(JsonPatch.replace( - context.resolvePointer("/counter"), - new Node().value(next))); - - context.emitEvent(new Node() - .type(new Node().blueId(ChatMessage.blueId())) - .properties("message", new Node().value("Counter is now " + next))); - } - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - private final String counterIncrementHandlerBlueId; - - private Fixture(BlueRepository repository, Blue blue, String counterIncrementHandlerBlueId) { - this.repository = repository; - this.blue = blue; - this.counterIncrementHandlerBlueId = counterIncrementHandlerBlueId; - } - } -} diff --git a/src/test/java/blue/coordination/processor/CurrentRepositoryExactNodeProvider.java b/src/test/java/blue/coordination/processor/CurrentRepositoryExactNodeProvider.java new file mode 100644 index 0000000..a51a285 --- /dev/null +++ b/src/test/java/blue/coordination/processor/CurrentRepositoryExactNodeProvider.java @@ -0,0 +1,164 @@ +package blue.coordination.processor; + +import blue.language.codec.jackson.UncheckedObjectMapper; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.language.model.NodeWireForm; +import blue.language.provider.NodeProvider; +import blue.language.processor.ExternalOrderKey; +import blue.repo.BlueRepository; +import blue.repo.RepositoryDefinition; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * Lazy exact-content index over every inline node in the current Repository. + * + *

The generated Repository provider addresses complete definitions. The + * effective-contract catalog also names inherited inline Source + * contributions by their own content BlueIds. This derived provider exposes + * those already-verified subtrees without introducing aliases or replacement + * generated types.

+ */ +final class CurrentRepositoryExactNodeProvider implements NodeProvider { + + private final BlueRepository repository; + private final ClassLoader classLoader; + private volatile Map exactNodes; + + CurrentRepositoryExactNodeProvider(BlueRepository repository) { + this.repository = Objects.requireNonNull(repository, "repository"); + ClassLoader contextClassLoader = + Thread.currentThread().getContextClassLoader(); + this.classLoader = contextClassLoader != null + ? contextClassLoader + : CurrentRepositoryExactNodeProvider.class.getClassLoader(); + } + + @Override + public List fetchByBlueId(String blueId) { + Node found = exactNodes().get(Objects.requireNonNull( + blueId, "blueId")); + return found == null + ? null + : Collections.singletonList(found.clone()); + } + + private Map exactNodes() { + Map current = exactNodes; + if (current != null) { + return current; + } + synchronized (this) { + current = exactNodes; + if (current == null) { + current = buildIndex(); + exactNodes = current; + } + } + return current; + } + + private Map buildIndex() { + List qualifiedNames = new ArrayList( + repository.qualifiedNames()); + Collections.sort( + qualifiedNames, + ExternalOrderKey::compareTextCodePoints); + Map indexed = new LinkedHashMap(); + IdentityHashMap visited = + new IdentityHashMap(); + for (String qualifiedName : qualifiedNames) { + RepositoryDefinition manifestDefinition = repository + .definition(qualifiedName) + .orElseThrow(() -> new IllegalStateException( + "Current Repository manifest has no definition " + + qualifiedName)); + Node definition = manifestDefinition.blueId().indexOf('#') >= 0 + ? repository.nodeByName(qualifiedName) + .orElseThrow(() -> new IllegalStateException( + "Current Repository provider has no cyclic " + + "definition " + qualifiedName)) + : readAuthoredDefinition(manifestDefinition); + index(definition, indexed, visited); + } + return Collections.unmodifiableMap(indexed); + } + + private Node readAuthoredDefinition(RepositoryDefinition definition) { + try (InputStream input = classLoader.getResourceAsStream( + definition.resourcePath())) { + if (input == null) { + throw new IllegalStateException( + "Current Repository resource not found: " + + definition.resourcePath()); + } + return UncheckedObjectMapper.JSON_MAPPER.readValue( + input, Node.class); + } catch (IOException failure) { + throw new IllegalStateException( + "Could not read current Repository resource: " + + definition.resourcePath(), failure); + } + } + + private static void index( + Node node, + Map indexed, + IdentityHashMap visited) { + if (node == null || node.isReferenceOnly() + || visited.put(node, Boolean.TRUE) != null) { + return; + } + Node exact = node.clone(); + String declaredBlueId = exact.getBlueId(); + boolean addressableContent = declaredBlueId == null + || declaredBlueId.indexOf('#') < 0; + if (declaredBlueId != null && addressableContent) { + exact.blueId(null); + } + if (addressableContent) { + String blueId = DirectBlueIdCalculator.calculateBlueId(exact); + if (declaredBlueId != null && !declaredBlueId.equals(blueId)) { + throw new IllegalStateException( + "Current Repository subtree declares " + + declaredBlueId + " but calculates to " + + blueId); + } + Node prior = indexed.get(blueId); + if (prior == null) { + indexed.put(blueId, exact); + } else if (!NodeWireForm.get(prior).equals( + NodeWireForm.get(exact))) { + throw new IllegalStateException( + "Current Repository contains conflicting exact " + + "content for " + blueId); + } + } + index(node.getType(), indexed, visited); + index(node.getItemType(), indexed, visited); + index(node.getKeyType(), indexed, visited); + index(node.getValueType(), indexed, visited); + index(node.getBlue(), indexed, visited); + index(node.getContracts(), indexed, visited); + if (node.getProperties() != null) { + for (Node child : node.getProperties().values()) { + index(child, indexed, visited); + } + } + if (node.getItems() != null) { + for (Node child : node.getItems()) { + index(child, indexed, visited); + } + } + } +} + diff --git a/src/test/java/blue/coordination/processor/DeclaredTypeEventMatchingTest.java b/src/test/java/blue/coordination/processor/DeclaredTypeEventMatchingTest.java deleted file mode 100644 index df44a33..0000000 --- a/src/test/java/blue/coordination/processor/DeclaredTypeEventMatchingTest.java +++ /dev/null @@ -1,382 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.NodeProvider; -import blue.language.model.Node; -import blue.language.model.Schema; -import blue.language.processor.HandlerMatchContext; -import blue.language.processor.HandlerMatchContextFactory; -import blue.language.provider.SequentialNodeProvider; -import blue.language.utils.BlueIdCalculator; -import blue.language.utils.NodeProviderWrapper; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatWorkflowOperation; -import blue.repo.coordination.OperationRequest; -import blue.repo.coordination.Request; -import blue.repo.coordination.SequentialWorkflow; -import blue.repo.coordination.SequentialWorkflowOperation; - -import org.junit.jupiter.api.Test; - -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static blue.language.utils.Properties.TEXT_TYPE_BLUE_ID; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class DeclaredTypeEventMatchingTest { - private static final String CHANNEL = "operations"; - private static final String OPERATION = "run"; - - @Test - void directWorkflowAcceptsExactAndChildTypesButRejectsUnrelatedTypedShapes() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - SequentialWorkflow workflow = workflow(types.pattern(types.expectedId)); - SequentialWorkflowProcessor processor = new SequentialWorkflowProcessor(); - - assertTrue(processor.matches(workflow, context(blue, types.event(types.expectedId)))); - assertTrue(processor.matches(workflow, context(blue, types.event(types.childId)))); - assertFalse(processor.matches(workflow, context(blue, types.event(types.unrelatedSameShapeId)))); - assertFalse(processor.matches(workflow, context(blue, types.differentEvent()))); - } - - @Test - void directWorkflowLineageIsIndependentOfPureOrMaterializedRepresentation() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - SequentialWorkflowProcessor processor = new SequentialWorkflowProcessor(); - - assertRepresentationMatrix( - processor, blue, types, types.expectedId, types.expectedId, true); - assertRepresentationMatrix( - processor, blue, types, types.childId, types.expectedId, true); - assertRepresentationMatrix( - processor, blue, types, types.grandchildId, types.expectedId, true); - assertRepresentationMatrix( - processor, blue, types, types.siblingId, types.childId, false); - assertRepresentationMatrix( - processor, blue, types, types.unrelatedSameShapeId, types.expectedId, false); - } - - @Test - void compatibleDeclaredTypesStillSatisfyEveryAdditionalConstraint() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - SequentialWorkflowProcessor processor = new SequentialWorkflowProcessor(); - - Node requiredKind = new Node().schema(new Schema().required(true)); - assertFalse(processor.matches( - workflow(types.pattern(types.expectedId).properties("kind", requiredKind)), - context(blue, types.eventWithoutKind(types.childId)))); - assertFalse(processor.matches( - workflow(types.pattern(types.expectedId) - .properties("kind", new Node().value("required-value"))), - context(blue, types.event(types.childId)))); - assertFalse(processor.matches( - workflow(types.pattern(types.expectedId) - .properties("kind", new Node().schema(new Schema().minLength(12)))), - context(blue, types.event(types.childId)))); - } - - @Test - void anonymousTypedUntypedAndTypeFreePatternsRetainStructuralMatching() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - SequentialWorkflowProcessor processor = new SequentialWorkflowProcessor(); - - assertTrue(processor.matches( - workflow(null), - context(blue, types.event(types.unrelatedSameShapeId)))); - assertTrue(processor.matches( - workflow(types.pattern(types.expectedId)), - context(blue, types.untypedEvent()))); - assertFalse(processor.matches( - workflow(types.pattern(types.expectedId)), - context(blue, null))); - assertTrue(processor.matches( - workflow(new Node().properties("kind", new Node().value("accepted"))), - context(blue, types.event(types.unrelatedSameShapeId)))); - assertFalse(processor.matches( - workflow(new Node().properties("kind", new Node().value("other"))), - context(blue, types.event(types.unrelatedSameShapeId)))); - - Node anonymousExpectedType = TypeFixture.sameShapeDefinition("Anonymous Expected Event"); - assertTrue(processor.matches( - workflow(new Node().type(anonymousExpectedType)), - context(blue, types.event(types.unrelatedSameShapeId)))); - - Node anonymouslyTypedEvent = new Node() - .type(TypeFixture.sameShapeDefinition("Anonymous Actual Event")) - .properties("kind", new Node().value("accepted")); - SequentialWorkflow identityBearingPattern = workflow(types.pattern(types.expectedId)); - HandlerMatchContext anonymousActualContext = context(blue, anonymouslyTypedEvent); - boolean structuralResult = anonymousActualContext.matchesEventPattern( - identityBearingPattern.getEvent()); - assertTrue(structuralResult); - assertEquals(structuralResult, - processor.matches(identityBearingPattern, anonymousActualContext)); - } - - @Test - void sequentialAndChatOperationsShareDeclaredTypeEventFiltering() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - Node event = operationRequest(new Node()); - Node structurallyCompatibleUnrelatedPattern = types.pattern(types.operationLookalikeId); - SequentialWorkflowOperation sequential = operation(structurallyCompatibleUnrelatedPattern); - ChatWorkflowOperation chat = chatOperation(structurallyCompatibleUnrelatedPattern); - HandlerMatchContext context = context(blue, event); - - assertFalse(new SequentialWorkflowOperationProcessor().matches(sequential, context)); - assertFalse(new ChatWorkflowOperationProcessor().matches(chat, context)); - - sequential.setEvent(new Node().type(reference(Request.blueId()))); - chat.setEvent(new Node().type(reference(Request.blueId()))); - assertTrue(new SequentialWorkflowOperationProcessor().matches(sequential, context)); - assertTrue(new ChatWorkflowOperationProcessor().matches(chat, context)); - } - - @Test - void requestPayloadMatchingRetainsGenericStructuralTypeFallback() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - SequentialWorkflowOperation sequential = operation(null); - sequential.request(types.pattern(types.expectedId)); - ChatWorkflowOperation chat = chatOperation(null); - chat.request(types.pattern(types.expectedId)); - HandlerMatchContext context = context( - blue, - operationRequest(types.event(types.unrelatedSameShapeId))); - - assertTrue(new SequentialWorkflowOperationProcessor().matches(sequential, context)); - assertTrue(new ChatWorkflowOperationProcessor().matches(chat, context)); - - HandlerMatchContext materializedContext = context( - blue, - operationRequest(types.materializedEvent(blue, types.unrelatedSameShapeId))); - assertTrue(new SequentialWorkflowOperationProcessor().matches( - sequential, materializedContext)); - assertTrue(new ChatWorkflowOperationProcessor().matches(chat, materializedContext)); - } - - @Test - void pureReferenceResultsAgreeAcrossColdAndWarmContexts() { - TypeFixture types = TypeFixture.create(); - Blue blue = types.configuredBlue(); - SequentialWorkflow workflow = workflow(types.pattern(types.expectedId)); - SequentialWorkflowProcessor processor = new SequentialWorkflowProcessor(); - Node event = types.event(types.childId); - - assertTrue(processor.matches(workflow, context(blue, event))); - assertTrue(processor.matches(workflow, context(blue, event.clone()))); - assertTrue(processor.matches(workflow, context(blue, types.event(types.childId)))); - } - - private static SequentialWorkflow workflow(Node pattern) { - SequentialWorkflow workflow = new SequentialWorkflow(); - workflow.setEvent(pattern); - return workflow; - } - - private static SequentialWorkflowOperation operation(Node eventPattern) { - SequentialWorkflowOperation operation = new SequentialWorkflowOperation(); - operation.setKey(OPERATION); - operation.setEvent(eventPattern); - return operation; - } - - private static ChatWorkflowOperation chatOperation(Node eventPattern) { - ChatWorkflowOperation operation = new ChatWorkflowOperation(); - operation.setKey(OPERATION); - operation.setEvent(eventPattern); - return operation; - } - - private static Node operationRequest(Node request) { - return new Node() - .type(reference(OperationRequest.blueId())) - .properties("operation", new Node().value(OPERATION)) - .properties("channel", new Node().value(CHANNEL)) - .properties("request", request); - } - - private static HandlerMatchContext context(Blue blue, Node event) { - return HandlerMatchContextFactory.create(blue, OPERATION, CHANNEL, event); - } - - private static void assertRepresentationMatrix(SequentialWorkflowProcessor processor, - Blue blue, - TypeFixture types, - String actualTypeId, - String expectedTypeId, - boolean expectedResult) { - Node pureEvent = types.event(actualTypeId); - Node materializedEvent = types.materializedEvent(blue, actualTypeId); - Node pureExpected = reference(expectedTypeId); - Node materializedExpected = types.materializedType(blue, expectedTypeId); - - assertResult(expectedResult, processor.matches( - workflow(new Node().type(pureExpected)), context(blue, pureEvent))); - assertResult(expectedResult, processor.matches( - workflow(new Node().type(materializedExpected)), context(blue, pureEvent))); - assertResult(expectedResult, processor.matches( - workflow(new Node().type(pureExpected)), context(blue, materializedEvent))); - assertResult(expectedResult, processor.matches( - workflow(new Node().type(materializedExpected)), context(blue, materializedEvent))); - } - - private static void assertResult(boolean expected, boolean actual) { - if (expected) { - assertTrue(actual); - } else { - assertFalse(actual); - } - } - - private static Node reference(String blueId) { - return new Node().blueId(blueId); - } - - private static final class TypeFixture { - private final String expectedId; - private final String childId; - private final String grandchildId; - private final String siblingId; - private final String unrelatedSameShapeId; - private final String unrelatedDifferentShapeId; - private final String operationLookalikeId; - private final Map definitions; - - private TypeFixture(String expectedId, - String childId, - String grandchildId, - String siblingId, - String unrelatedSameShapeId, - String unrelatedDifferentShapeId, - String operationLookalikeId, - Map definitions) { - this.expectedId = expectedId; - this.childId = childId; - this.grandchildId = grandchildId; - this.siblingId = siblingId; - this.unrelatedSameShapeId = unrelatedSameShapeId; - this.unrelatedDifferentShapeId = unrelatedDifferentShapeId; - this.operationLookalikeId = operationLookalikeId; - this.definitions = definitions; - } - - private static TypeFixture create() { - Node expected = sameShapeDefinition("Expected Event"); - String expectedId = BlueIdCalculator.calculateBlueId(expected); - Node child = sameShapeDefinition("Child Event").type(reference(expectedId)); - String childId = BlueIdCalculator.calculateBlueId(child); - Node grandchild = sameShapeDefinition("Grandchild Event").type(reference(childId)); - Node common = sameShapeDefinition("Common Event"); - String commonId = BlueIdCalculator.calculateBlueId(common); - Node sibling = sameShapeDefinition("Sibling Event").type(reference(commonId)); - Node unrelatedSameShape = sameShapeDefinition("Unrelated Same Shape Event"); - Node unrelatedDifferentShape = new Node() - .name("Unrelated Different Shape Event") - .properties("different", requiredText()); - Node operationLookalike = new Node() - .name("Unrelated Operation Lookalike") - .properties("operation", requiredText()) - .properties("channel", requiredText()); - String grandchildId = BlueIdCalculator.calculateBlueId(grandchild); - String siblingId = BlueIdCalculator.calculateBlueId(sibling); - String unrelatedSameShapeId = BlueIdCalculator.calculateBlueId(unrelatedSameShape); - String unrelatedDifferentShapeId = BlueIdCalculator.calculateBlueId(unrelatedDifferentShape); - String operationLookalikeId = BlueIdCalculator.calculateBlueId(operationLookalike); - Map definitions = new LinkedHashMap(); - definitions.put(expectedId, expected); - definitions.put(childId, child); - definitions.put(grandchildId, grandchild); - definitions.put(commonId, common); - definitions.put(siblingId, sibling); - definitions.put(unrelatedSameShapeId, unrelatedSameShape); - definitions.put(unrelatedDifferentShapeId, unrelatedDifferentShape); - definitions.put(operationLookalikeId, operationLookalike); - return new TypeFixture( - expectedId, - childId, - grandchildId, - siblingId, - unrelatedSameShapeId, - unrelatedDifferentShapeId, - operationLookalikeId, - definitions); - } - - private Blue configuredBlue() { - Blue blue = BlueRepository.latest().configure(new Blue()); - NodeProvider repositoryProvider = blue.getNodeProvider(); - blue.nodeProvider(new SequentialNodeProvider( - NodeProviderWrapper.unverified(new MapProvider(definitions)), - repositoryProvider)); - return blue; - } - - private static Node sameShapeDefinition(String name) { - return new Node().name(name).properties("kind", requiredText()); - } - - private static Node requiredText() { - return new Node() - .type(reference(TEXT_TYPE_BLUE_ID)) - .schema(new Schema().required(true)); - } - - private Node event(String typeBlueId) { - return new Node() - .type(reference(typeBlueId)) - .properties("kind", new Node().value("accepted")); - } - - private Node materializedEvent(Blue blue, String typeBlueId) { - return blue.resolveToSnapshot(event(typeBlueId)).resolvedRoot(); - } - - private Node materializedType(Blue blue, String typeBlueId) { - return materializedEvent(blue, typeBlueId).getType(); - } - - private Node eventWithoutKind(String typeBlueId) { - return new Node().type(reference(typeBlueId)); - } - - private Node untypedEvent() { - return new Node().properties("kind", new Node().value("accepted")); - } - - private Node pattern(String typeBlueId) { - return new Node().type(reference(typeBlueId)); - } - - private Node differentEvent() { - return new Node() - .type(reference(unrelatedDifferentShapeId)) - .properties("different", new Node().value("value")); - } - } - - private static final class MapProvider implements NodeProvider { - private final Map definitions; - - private MapProvider(Map definitions) { - this.definitions = definitions; - } - - @Override - public List fetchByBlueId(String blueId) { - Node definition = definitions.get(blueId); - return definition != null - ? Collections.singletonList(definition.clone()) - : null; - } - } -} diff --git a/src/test/java/blue/coordination/processor/EmbeddedTerminationWorkflowTest.java b/src/test/java/blue/coordination/processor/EmbeddedTerminationWorkflowTest.java deleted file mode 100644 index ef51c0e..0000000 --- a/src/test/java/blue/coordination/processor/EmbeddedTerminationWorkflowTest.java +++ /dev/null @@ -1,183 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.repo.BlueRepository; - -import org.junit.jupiter.api.Test; - -import java.util.LinkedHashMap; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -class EmbeddedTerminationWorkflowTest { - @Test - void terminateProcessingInEmbeddedWorkflowTerminatesOnlyEmbeddedScope() { - Fixture fixture = fixture(); - Node initialized = fixture.initialize(documentWithEmbeddedTermination(false)); - - DocumentProcessingResult childResult = fixture.process(initialized, - fixture.operationEvent("child", 1, "runChild", "childChannel")); - - assertSuccess(childResult); - assertEquals("changed-before-stop", childResult.document().get("/child/status")); - assertEquals("graceful", childResult.document().get("/child/contracts/terminated/cause")); - assertEquals("embedded-complete", childResult.document().get("/child/contracts/terminated/reason")); - assertNull(nodeAt(childResult.document(), "/contracts/terminated")); - assertEquals(1L, fixture.metrics.declarativeTerminationSteps()); - - DocumentProcessingResult rootResult = fixture.process(childResult.document(), - fixture.operationEvent("root", 1, "runRoot", "rootChannel")); - - assertSuccess(rootResult); - assertEquals("root-still-active", rootResult.document().get("/rootStatus")); - assertNull(nodeAt(rootResult.document(), "/contracts/terminated")); - assertEquals("graceful", rootResult.document().get("/child/contracts/terminated/cause")); - } - - @Test - void computeAndDeclarativeTerminationProduceEquivalentEmbeddedEffects() { - Fixture computeFixture = fixture(); - Fixture declarativeFixture = fixture(); - Node computeDocument = computeFixture.initialize(documentWithEmbeddedTermination(true)); - Node declarativeDocument = declarativeFixture.initialize(documentWithEmbeddedTermination(false)); - - DocumentProcessingResult compute = computeFixture.process(computeDocument, - computeFixture.operationEvent("child", 1, "runChild", "childChannel")); - DocumentProcessingResult declarative = declarativeFixture.process(declarativeDocument, - declarativeFixture.operationEvent("child", 1, "runChild", "childChannel")); - - assertSuccess(compute); - assertSuccess(declarative); - assertEquals(compute.document().get("/child/status"), declarative.document().get("/child/status")); - assertEquals(compute.document().get("/child/contracts/terminated/cause"), - declarative.document().get("/child/contracts/terminated/cause")); - assertEquals(compute.document().get("/child/contracts/terminated/reason"), - declarative.document().get("/child/contracts/terminated/reason")); - assertNull(nodeAt(compute.document(), "/contracts/terminated")); - assertNull(nodeAt(declarative.document(), "/contracts/terminated")); - assertEquals(1L, computeFixture.metrics.successfulComputeTerminationRequests()); - assertEquals(1L, declarativeFixture.metrics.declarativeTerminationSteps()); - } - - private static Node documentWithEmbeddedTermination(boolean computeTermination) { - Map rootContracts = new LinkedHashMap(); - rootContracts.put("rootChannel", TestTimelineProvider.channel("root")); - rootContracts.put("embedded", new Node() - .type("Process Embedded") - .properties("paths", new Node().items(new Node().value("/child")))); - rootContracts.put("runRoot", operation("rootChannel", - updateStep("/rootStatus", "root-still-active"))); - - Map childContracts = new LinkedHashMap(); - childContracts.put("childChannel", TestTimelineProvider.channel("child")); - childContracts.put("runChild", operation("childChannel", - updateStep("/status", "changed-before-stop"), - computeTermination ? computeTerminateStep("embedded-complete") - : declarativeTerminateStep("embedded-complete"), - updateStep("/status", "must-not-run"))); - - return new Node() - .name("Embedded Termination Test") - .properties("rootStatus", new Node().value("idle")) - .properties("contracts", new Node().properties(rootContracts)) - .properties("child", new Node() - .name("Embedded Child") - .properties("status", new Node().value("idle")) - .properties("contracts", new Node().properties(childContracts))); - } - - private static Node operation(String channel, Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value(channel)) - .properties("request", new Node().type("Text")) - .properties("steps", new Node().items(steps)); - } - - private static Node updateStep(String path, String value) { - return new Node() - .type("Coordination/Update Document") - .properties("changeset", new Node().items(new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value(path)) - .properties("val", new Node().value(value)))); - } - - private static Node declarativeTerminateStep(String reason) { - return new Node() - .type("Coordination/Terminate Processing") - .properties("reason", new Node().value(reason)); - } - - private static Node computeTerminateStep(String reason) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items(new Node() - .properties("$return", new Node() - .properties("termination", new Node() - .properties("reason", new Node().value(reason)))))); - } - - private static Node nodeAt(Node node, String pointer) { - try { - Object value = node.get(pointer); - return value instanceof Node ? (Node) value : null; - } catch (IllegalArgumentException ex) { - return null; - } - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static Fixture fixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - BexProcessingMetrics metrics = new BexProcessingMetrics(); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - return new Fixture(repository, blue, metrics); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - private final BexProcessingMetrics metrics; - - private Fixture(BlueRepository repository, Blue blue, BexProcessingMetrics metrics) { - this.repository = repository; - this.blue = blue; - this.metrics = metrics; - } - - private Node initialize(Node document) { - document.blue(repository.typeAliasBlue()); - return blue.initializeDocument(blue.preprocess(document)).document(); - } - - private DocumentProcessingResult process(Node document, Node event) { - return blue.processDocument(document, event); - } - - private Node operationEvent(String timelineId, - int timestamp, - String operation, - String channel) { - return CoordinationTestResources.operationRequestEvent(blue, - repository, - timelineId, - timestamp, - operation, - channel, - new Node().value("request")); - } - } -} diff --git a/src/test/java/blue/coordination/processor/InheritedStaticUpdateDocumentTest.java b/src/test/java/blue/coordination/processor/InheritedStaticUpdateDocumentTest.java deleted file mode 100644 index 9ce1530..0000000 --- a/src/test/java/blue/coordination/processor/InheritedStaticUpdateDocumentTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.NodeProvider; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.language.provider.BasicNodeProvider; -import blue.language.provider.SequentialNodeProvider; -import blue.language.utils.NodeProviderWrapper; -import blue.repo.BlueRepository; -import blue.repo.coordination.DocumentStatus; -import blue.repo.coordination.SequentialWorkflow; -import blue.repo.coordination.StatusInProgress; -import blue.repo.coordination.UpdateDocument; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class InheritedStaticUpdateDocumentTest { - - @Test - void inheritedStaticPatchWritesItsAuthoredValueFromTheResolvedContractView() { - Blue blue = BlueRepository.latest().configure(new Blue()); - NodeProvider repositoryProvider = blue.getNodeProvider(); - BasicNodeProvider documentTypes = new BasicNodeProvider(); - documentTypes.addSingleNodes(documentType(new Node() - .name("Authored status") - .type(reference(StatusInProgress.blueId())))); - String documentTypeId = documentTypes.getBlueIdByName("Inherited Static Update Document"); - blue.nodeProvider(new SequentialNodeProvider( - NodeProviderWrapper.unverified(documentTypes), - repositoryProvider)); - CoordinationProcessors.registerWith(blue); - - DocumentProcessingResult result = blue.initializeDocument( - blue.resolveToSnapshot(new Node().type(reference(documentTypeId)))); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertNull(result.failureReason()); - Node canonicalStatus = result.canonicalDocument().getProperties().get("status"); - assertEquals(StatusInProgress.blueId(), canonicalStatus.getType().getBlueId()); - assertEquals("Authored status", canonicalStatus.getName()); - assertEquals("active", result.resolvedDocument().getAsText("/status/mode")); - assertNull(canonicalStatus.getDescription(), - "metadata inherited by Json Patch Entry.val must not become document content"); - } - - @Test - void authoredReferenceWithSiblingPayloadRemainsInvalid() { - BasicNodeProvider documentTypes = new BasicNodeProvider(); - - IllegalArgumentException failure = assertThrows(IllegalArgumentException.class, - () -> documentTypes.addSingleNodes(documentType(new Node() - .blueId(StatusInProgress.blueId()) - .properties("mode", new Node().value("tampered"))))); - - assertTrue(failure.getMessage().contains( - "\"blueId\" nodes must be reference-only and cannot contain sibling fields")); - } - - private static Node documentType(Node patchValue) { - return new Node() - .name("Inherited Static Update Document") - .properties("status", new Node().type(reference(DocumentStatus.blueId()))) - .contracts(new Node() - .properties("lifecycle", new Node() - .type(reference(RuntimeBlueIds.LIFECYCLE_EVENT_CHANNEL)) - .properties("event", new Node() - .type(reference(RuntimeBlueIds.DOCUMENT_PROCESSING_INITIATED)))) - .properties("initializeStatus", new Node() - .type(reference(SequentialWorkflow.blueId())) - .properties("channel", new Node().value("lifecycle")) - .properties("steps", new Node().items(new Node() - .type(reference(UpdateDocument.blueId())) - .properties("changeset", new Node().items(new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value("/status")) - .properties("val", patchValue))))))); - } - - private static Node reference(String blueId) { - return new Node().blueId(blueId); - } -} diff --git a/src/test/java/blue/coordination/processor/MustUnderstandContractsTest.java b/src/test/java/blue/coordination/processor/MustUnderstandContractsTest.java deleted file mode 100644 index c82b76d..0000000 --- a/src/test/java/blue/coordination/processor/MustUnderstandContractsTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.repo.BlueRepository; -import java.util.LinkedHashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class MustUnderstandContractsTest { - @Test - void unknownContractTypeStopsInitialization() { - Fixture fixture = configuredFixture(false); - String unknownType = "3nxchG67TRi4XrYFM2MTjj4LmuHNQzVv9NZLjATrPN19"; - Node document = document(fixture.repository, contract("unknown", new Node() - .type(new Node().blueId(unknownType)))); - - IllegalArgumentException ex = assertThrows(IllegalArgumentException.class, - () -> initialize(fixture, document)); - - assertTrue(ex.getMessage().contains(unknownType), ex.getMessage()); - } - - @Test - void baseChannelContractStopsInitializationWhenUsedAsExecutableContract() { - Fixture fixture = configuredFixture(false); - Node document = document(fixture.repository, contract("owner", new Node().type("Channel"))); - - DocumentProcessingResult result = initialize(fixture, document); - - assertCapabilityFailure(result, "Unsupported contract type"); - } - - @Test - void timelineChannelIsSupportedWhenUsedDirectly() { - Fixture fixture = configuredFixture(false); - Node document = document(fixture.repository, - contract("owner", TestTimelineProvider.channel("owner"))); - - DocumentProcessingResult result = initialize(fixture, document); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertTrue(fixture.blue.isInitialized(result.document())); - } - - @Test - void handlerBoundToTimelineChannelInitializes() { - Fixture fixture = configuredFixture(false); - Map contracts = contract("owner", TestTimelineProvider.channel("owner")); - contracts.put("handler", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("owner")) - .properties("steps", new Node().items())); - Node document = document(fixture.repository, contracts); - - DocumentProcessingResult result = initialize(fixture, document); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertTrue(fixture.blue.isInitialized(result.document())); - } - - @Test - void handlerBoundToTypelessContractFailsClearly() { - Fixture fixture = configuredFixture(false); - Map contracts = contract("owner", new Node() - .properties("timelineId", new Node().value("owner"))); - contracts.put("handler", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("owner")) - .properties("steps", new Node().items())); - Node document = document(fixture.repository, contracts); - - DocumentProcessingResult result = initialize(fixture, document); - - assertCapabilityFailure(result, "must declare a type"); - } - - @Test - void simpleTimelineProviderWorksWhenRegistered() { - Fixture fixture = configuredFixture(true); - Node document = document(fixture.repository, contract("owner", TestTimelineProvider.channel("owner"))); - Node initialized = initialize(fixture, document).document(); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, - TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - "owner", - 1, - TestTimelineProvider.chatMessage("hello"))); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNotNull(checkpointEvent(result.document(), "owner")); - } - - private static DocumentProcessingResult initialize(Fixture fixture, Node document) { - return fixture.blue.initializeDocument(fixture.blue.preprocess(document)); - } - - private static void assertCapabilityFailure(DocumentProcessingResult result, String reason) { - assertTrue(result.capabilityFailure(), result.failureReason()); - assertTrue(result.failureReason().contains(reason), result.failureReason()); - assertEquals(0L, result.totalGas()); - assertTrue(result.triggeredEvents().isEmpty()); - assertFalse(hasInitializedMarker(result.document())); - } - - private static boolean hasInitializedMarker(Node document) { - Node contracts = property(document, "contracts"); - return property(contracts, "initialized") != null; - } - - private static Node checkpointEvent(Node document, String key) { - Node contracts = property(document, "contracts"); - Node checkpoint = property(contracts, "checkpoint"); - Node lastEvents = property(checkpoint, "lastEvents"); - return property(lastEvents, key); - } - - private static Map contract(String key, Node contract) { - Map contracts = new LinkedHashMap(); - contracts.put(key, contract); - return contracts; - } - - private static Node document(BlueRepository repository, Map contracts) { - return new Node() - .blue(repository.typeAliasBlue()) - .name("Must Understand Test") - .properties("contracts", new Node().properties(contracts)); - } - - private static Node property(Node node, String key) { - if (node == null) { - return null; - } - if ("contracts".equals(key)) { - return node.getContracts(); - } - if (node.getProperties() == null) { - return null; - } - return node.getProperties().get(key); - } - - private static Fixture configuredFixture(boolean simpleTimelineProvider) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - if (simpleTimelineProvider) { - TestTimelineProvider.registerWith(blue); - } - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/OperationRequestMatchingTest.java b/src/test/java/blue/coordination/processor/OperationRequestMatchingTest.java deleted file mode 100644 index 2328822..0000000 --- a/src/test/java/blue/coordination/processor/OperationRequestMatchingTest.java +++ /dev/null @@ -1,513 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.CoordinationProcessors; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.model.Schema; -import blue.language.processor.DocumentProcessingResult; -import blue.repo.BlueRepository; -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class OperationRequestMatchingTest { - - @Test - void directOperationRequestRunsThroughTriggeredChannel() { - Fixture fixture = configuredFixture(); - Map contracts = ownerContracts(); - contracts.put("triggered", triggeredChannel()); - contracts.put("increment", operation("triggered", integerPattern(), - updateDocumentStep("replace", "/counter", directOperationIncrementValue()))); - contracts.put("producer", directWorkflow("owner", - triggerEventStep(operationRequestEventNode( - "increment", "triggered", new Node().value(7))))); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - Node processed = processChat(fixture, initialized, "owner", 1).document(); - - assertCounter(processed, 7); - } - - @Test - void bareOperationRequestCannotRedirectTriggeredDelivery() { - Fixture fixture = configuredFixture(); - Map contracts = ownerContracts(); - contracts.put("triggered", triggeredChannel()); - contracts.put("increment", operation("triggered", integerPattern(), - updateDocumentStep("replace", "/counter", directOperationIncrementValue()))); - contracts.put("producer", directWorkflow("owner", - triggerEventStep(operationRequestEventNode( - "increment", "owner", new Node().value(7))))); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - Node processed = processChat(fixture, initialized, "owner", 1).document(); - - assertCounter(processed, 0); - } - - @Test - void timelineEntryOperationRequestStillRuns() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue())))); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7)); - - assertCounter(processed, 7); - } - - @Test - void directSequentialWorkflowOperationDeclaresChannelRequestAndSteps() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue())))); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7)); - - assertCounter(processed, 7); - } - - @Test - void operationDeclarationCanCoexistWithConcreteSequentialWorkflowOperation() { - Fixture fixture = configuredFixture(); - Map contracts = ownerContracts(); - contracts.put("incrementShape", operationDeclaration("owner", integerPattern())); - contracts.put("increment", operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue()))); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7)); - - assertCounter(processed, 7); - } - - @Test - void operationDeclarationCanBeSpecializedBeforeConcreteSequentialWorkflowOperation() { - Fixture fixture = configuredFixture(); - Map contracts = ownerContracts(); - contracts.put("incrementShape", operationDeclaration("owner", null)); - contracts.put("incrementAmountShape", operationDeclaration("owner", objectAmountPattern())); - contracts.put("increment", operation("owner", objectAmountPattern(), - updateDocumentStep("replace", "/counter", timelineAmountIncrementValue()))); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - Node accepted = processOperationRequest(fixture, initialized, "owner", 1, "increment", - new Node().properties("amount", new Node().value(7))); - Node rejected = processOperationRequest(fixture, accepted, "owner", 2, "increment", - new Node().properties("ignored", new Node().value(7))); - - assertCounter(accepted, 7); - assertCounter(rejected, 7); - } - - @Test - void sequentialWorkflowOperationEventPatternAllowsMatchingEvent() { - Fixture fixture = configuredFixture(); - Node workflow = operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue())); - workflow.properties("event", new Node() - .properties("source", new Node() - .type("Coordination/API Call") - .properties("apiKeyId", new Node().value("web")))); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - workflow)); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7), "web"); - - assertCounter(processed, 7); - } - - @Test - void sequentialWorkflowOperationEventPatternRejectsDifferentEvent() { - Fixture fixture = configuredFixture(); - Node workflow = operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue())); - workflow.properties("event", new Node() - .properties("source", new Node() - .type("Coordination/API Call") - .properties("apiKeyId", new Node().value("web")))); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - workflow)); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7), "api"); - - assertCounter(processed, 0); - } - - @Test - void sequentialWorkflowOperationUsesDeclaredChannel() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue())))); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7)); - - assertCounter(processed, 7); - } - - @Test - void operationRequestRoutesFromEligibleSourceToDeclaredChannel() { - Fixture fixture = configuredFixture(); - Map contracts = ownerContracts(); - contracts.put("other", timelineChannel("other")); - contracts.put("increment", operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue()))); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - Node processed = processOperationRequest(fixture, initialized, "other", 1, "increment", new Node().value(7)); - - assertCounter(processed, 7); - } - - @Test - void integerRequestPatternAcceptsIntegerAndRejectsText() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue())))); - - Node afterInteger = processOperationRequest(fixture, initialized, "owner", 1, "increment", new Node().value(7)); - Node afterText = processOperationRequest(fixture, afterInteger, "owner", 2, "increment", new Node().value("7")); - - assertCounter(afterInteger, 7); - assertCounter(afterText, 7); - } - - @Test - void objectRequestPatternAcceptsRequiredNestedProperty() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", objectAmountPattern(), - updateDocumentStep("replace", "/counter", timelineAmountIncrementValue())))); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", - new Node().properties("amount", new Node().value(7))); - - assertCounter(processed, 7); - } - - @Test - void objectRequestPatternRejectsMissingRequiredNestedProperty() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", objectAmountPattern(), - updateDocumentStep("replace", "/counter", timelineAmountIncrementValue())))); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", - new Node().properties("ignored", new Node().value(7))); - - assertCounter(processed, 0); - } - - @Test - void requestPatternIgnoresIrrelevantLargePayloadBranches() { - Fixture fixture = configuredFixture(); - Node initialized = initializedDocument(fixture, timelineCounterDocument(fixture.repository, - operation("owner", objectAmountPattern(), - updateDocumentStep("replace", "/counter", timelineAmountIncrementValue())))); - Node irrelevant = new Node().properties("nested", largePayloadBranch()); - Node request = new Node() - .properties("amount", new Node().value(7)) - .properties("irrelevant", irrelevant); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, "increment", request); - - // Behavioral coverage: the shared FrozenTypeMatcher is path-local and - // only needs the requested amount field for this pattern. - assertCounter(processed, 7); - } - - @Test - void documentValueDoesNotAffectProcessorEligibility() { - Fixture fixture = configuredFixture(); - Node original = timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue()))); - Node initialized = initializedDocument(fixture, original); - Node unrelatedDocument = new Node() - .blueId("2vz831ZwzhpUefTb5XkodBRANKpFMbj1F4CN33kf38Hw"); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, - operationRequestEventNode("increment", new Node().value(7)) - .properties("document", unrelatedDocument)); - - assertCounter(processed, 7); - } - - @Test - void requireExactDocumentVersionTrueIsFeederOwned() { - Fixture fixture = configuredFixture(); - Node original = timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue()))); - Node initialized = initializedDocument(fixture, original); - Node stale = new Node().blueId("2vz831ZwzhpUefTb5XkodBRANKpFMbj1F4CN33kf38Hw"); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, - operationRequestEventNode("increment", new Node().value(7)) - .properties("requireExactDocumentVersion", new Node().value(true)) - .properties("document", stale)); - - assertCounter(processed, 7); - } - - @Test - void requireExactDocumentVersionFalseIsFeederOwned() { - Fixture fixture = configuredFixture(); - Node original = timelineCounterDocument(fixture.repository, - operation("owner", integerPattern(), - updateDocumentStep("replace", "/counter", timelineIncrementValue()))); - Node initialized = initializedDocument(fixture, original); - Node stale = new Node().blueId("2vz831ZwzhpUefTb5XkodBRANKpFMbj1F4CN33kf38Hw"); - - Node processed = processOperationRequest(fixture, initialized, "owner", 1, - operationRequestEventNode("increment", new Node().value(7)) - .properties("requireExactDocumentVersion", new Node().value(false)) - .properties("document", stale)); - - assertCounter(processed, 7); - } - - private static Node timelineCounterDocument(BlueRepository repository, Node operation) { - return timelineCounterDocument(repository, 0, operation); - } - - private static Node timelineCounterDocument(BlueRepository repository, int counter, Node operation) { - Map contracts = ownerContracts(); - contracts.put("increment", operation); - return document(repository, counter, contracts); - } - - private static Map ownerContracts() { - Map contracts = new LinkedHashMap(); - contracts.put("owner", timelineChannel("owner")); - return contracts; - } - - private static Node timelineChannel(String timelineId) { - return TestTimelineProvider.channel(timelineId); - } - - private static Node triggeredChannel() { - return new Node().type("Triggered Event Channel"); - } - - private static Node operation(String channel, Node requestPattern, Node... steps) { - Node operation = new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("request", requestPattern) - .properties("steps", new Node().items(steps)); - if (channel != null) { - operation.properties("channel", new Node().value(channel)); - } - return operation; - } - - private static Node operationDeclaration(String channel, Node requestPattern) { - Node operation = new Node() - .type("Coordination/Operation"); - if (channel != null) { - operation.properties("channel", new Node().value(channel)); - } - if (requestPattern != null) { - operation.properties("request", requestPattern); - } - return operation; - } - - private static Node integerPattern() { - return new Node().type("Integer"); - } - - private static Node objectAmountPattern() { - return new Node().properties("amount", new Node() - .type("Integer") - .value(7) - .schema(new Schema().required(new Node().value(true)))); - } - - private static Node directWorkflow(String channel, Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items(steps)); - } - - private static Node updateDocumentStep(String op, String path, Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendChange", new Node() - .properties("op", new Node().value(op)) - .properties("path", new Node().value(path)) - .properties("val", value)), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node directOperationIncrementValue() { - return bexAdd(bexBinding("event", "/request"), bexDocument("/counter")); - } - - private static Node timelineIncrementValue() { - return bexAdd(bexBinding("event", "/message/request"), bexDocument("/counter")); - } - - private static Node timelineAmountIncrementValue() { - return bexAdd(bexBinding("event", "/message/request/amount"), bexDocument("/counter")); - } - - private static Node bexAdd(Node... values) { - return new Node().properties("$add", new Node().items(values)); - } - - private static Node bexDocument(String path) { - return new Node().properties("$document", new Node().value(path)); - } - - private static Node bexBinding(String name, String path) { - return new Node().properties("$binding", new Node().value(name + path)); - } - - private static Node triggerEventStep(Node event) { - return new Node() - .type("Coordination/Trigger Event") - .properties("event", event); - } - - private static Node operationRequestEventNode(String operation, Node request) { - return operationRequestEventNode(operation, "owner", request); - } - - private static Node operationRequestEventNode(String operation, String channel, Node request) { - return new Node() - .type("Coordination/Operation Request") - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value(channel)) - .properties("request", request); - } - - private static DocumentProcessingResult processChat(Fixture fixture, - Node document, - String timelineId, - int timestamp) { - return fixture.blue.processDocument(document, chatTimelineEntry(fixture, timelineId, timestamp)); - } - - private static Node processOperationRequest(Fixture fixture, - Node document, - String timelineId, - int timestamp, - String operation, - Node request) { - return processOperationRequest(fixture, document, timelineId, timestamp, operation, request, null); - } - - private static Node processOperationRequest(Fixture fixture, - Node document, - String timelineId, - int timestamp, - String operation, - Node request, - String sourceValue) { - return processOperationRequest(fixture, - document, - timelineId, - timestamp, - operationRequestEventNode(operation, request), - sourceValue); - } - - private static Node processOperationRequest(Fixture fixture, - Node document, - String timelineId, - int timestamp, - Node operationRequest) { - return processOperationRequest(fixture, document, timelineId, timestamp, operationRequest, null); - } - - private static Node processOperationRequest(Fixture fixture, - Node document, - String timelineId, - int timestamp, - Node operationRequest, - String sourceValue) { - return fixture.blue.processDocument(document, - operationRequestTimelineEntry(fixture, timelineId, timestamp, operationRequest, sourceValue)).document(); - } - - private static Node operationRequestTimelineEntry(Fixture fixture, - String timelineId, - int timestamp, - Node operationRequest, - String sourceValue) { - Node event = TestTimelineProvider.timelineEntry( - fixture.blue, fixture.repository, timelineId, timestamp, operationRequest); - if (sourceValue != null) { - event.properties("source", new Node() - .type("Coordination/API Call") - .properties("apiKeyId", new Node().value(sourceValue))); - return fixture.blue.preprocess( - event.blue(fixture.repository.typeAliasBlue())).blue(null); - } - return event; - } - - private static Node chatTimelineEntry(Fixture fixture, String timelineId, int timestamp) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - timelineId, - timestamp, - TestTimelineProvider.chatMessage("run")); - } - - private static Node largePayloadBranch() { - Node root = new Node(); - for (int i = 0; i < 12; i++) { - root.properties("branch" + i, new Node() - .properties("value", new Node().value(i)) - .properties("nested", new Node() - .properties("ignored", new Node().value("payload-" + i)))); - } - return root; - } - - private static Node document(BlueRepository repository, int counter, Map contracts) { - return new Node() - .blue(repository.typeAliasBlue()) - .name("Operation Request Test") - .properties("counter", new Node().value(counter)) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node initializedDocument(Fixture fixture, Node document) { - return fixture.blue.initializeDocument(fixture.blue.preprocess(document)).document(); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static void assertCounter(Node document, int expected) { - assertEquals(BigInteger.valueOf(expected), document.get("/counter")); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/OperationRequestRoutingEvaluationTest.java b/src/test/java/blue/coordination/processor/OperationRequestRoutingEvaluationTest.java deleted file mode 100644 index 4570a61..0000000 --- a/src/test/java/blue/coordination/processor/OperationRequestRoutingEvaluationTest.java +++ /dev/null @@ -1,456 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelDelivery; -import blue.language.processor.ChannelEvaluation; -import blue.language.processor.ChannelEvaluationContext; -import blue.language.processor.ChannelEvaluationContextFactory; -import blue.language.processor.ChannelProcessor; -import blue.language.processor.HandlerMatchContextFactory; -import blue.language.processor.model.ChannelContract; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.OperationRequest; -import blue.repo.coordination.Request; -import blue.repo.coordination.SequentialWorkflowOperation; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineChannel; -import blue.repo.myos.PrincipalActor; -import java.math.BigInteger; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class OperationRequestRoutingEvaluationTest { - private static final String SOURCE = "aliceChannel"; - private static final String TARGET = "bobChannel"; - private static final String TIMELINE = "alice-timeline"; - private static final String ACTOR = "alice-account"; - - @Test - void generatedOperationRequestRoutesToDeclaredChannel() { - Fixture fixture = fixture(); - Node event = entry(fixture, request("increment", TARGET, new Node().value(7))); - - ChannelEvaluation evaluation = evaluate(fixture, event, channels()); - - ChannelDelivery delivery = onlyDelivery(evaluation); - assertEquals(TARGET, delivery.handlerChannelKey()); - assertEquals(OperationRequest.blueId() + ":increment", delivery.logicalDeliveryKey()); - assertNull(delivery.checkpointKey()); - assertNull(delivery.shouldProcess()); - assertNull(delivery.eventId()); - assertEquals(BigInteger.TEN, delivery.event().get("/timestamp")); - assertEquals(BigInteger.valueOf(7), delivery.event().get("/message/request")); - } - - @Test - void sameChannelTimelineRequestUsesTheSameRoutedPath() { - Fixture fixture = fixture(); - Map channels = channels(); - Node event = entry(fixture, request("increment", SOURCE, new Node().value(7))); - - ChannelDelivery delivery = onlyDelivery(evaluate(fixture, event, channels)); - - assertEquals(SOURCE, delivery.handlerChannelKey()); - assertEquals(OperationRequest.blueId() + ":increment", delivery.logicalDeliveryKey()); - } - - @Test - void compatibleOperationRequestSubtypeInheritsRoutingAndRetainsFields() { - Fixture fixture = fixture(); - Node message = requestWithType(compatibleSubtype(fixture), "increment", TARGET, new Node().value(7)) - .properties("specializedField", new Node().value("preserved")); - Node event = entry(fixture, TestTimelineProvider.chatMessage("placeholder")) - .properties("message", message); - - ChannelDelivery delivery = onlyDelivery(evaluate(fixture, event, channels())); - - assertEquals(TARGET, delivery.handlerChannelKey()); - assertEquals("preserved", delivery.event().get("/message/specializedField")); - } - - @Test - void unrelatedRequestSubtypeKeepsOrdinaryDelivery() { - Fixture fixture = fixture(); - Node unrelated = requestWithType(new Node().blueId(Request.blueId()), - "increment", TARGET, new Node().value(7)); - Node event = entry(fixture, TestTimelineProvider.chatMessage("placeholder")) - .properties("message", unrelated); - - assertOrdinary(evaluate(fixture, event, channels()), event); - } - - @Test - void qualifiedNameAndStructuralLookalikesAreNotRecognized() { - Node qualifiedName = request("increment", TARGET, new Node().value(7)); - Node structural = new Node() - .properties("operation", new Node().value("increment")) - .properties("channel", new Node().value(TARGET)); - - assertNull(CoordinationEventNodes.operationRequest(qualifiedName)); - assertNull(CoordinationEventNodes.operationRequest(structural)); - } - - @Test - void unavailableTypeClaimIsNotRecognized() { - Node unavailable = requestWithType( - new Node().blueId("11111111111111111111111111111111"), - "increment", - TARGET, - new Node().value(7)); - - assertNull(CoordinationEventNodes.operationRequest(unavailable)); - } - - @Test - void absentEventAndNonTextRoutingFieldsAreNotRoutable() { - assertNull(CoordinationEventNodes.operationRequest(null)); - - Node nonTextOperation = new Node() - .type(new Node().blueId(OperationRequest.blueId())) - .properties("operation", new Node().value(7)) - .properties("channel", new Node().value(TARGET)); - Node nonTextChannel = new Node() - .type(new Node().blueId(OperationRequest.blueId())) - .properties("operation", new Node().value("increment")) - .properties("channel", new Node().value(7)); - - assertFalse(CoordinationEventNodes.operationRequest(nonTextOperation).routable()); - assertFalse(CoordinationEventNodes.operationRequest(nonTextChannel).routable()); - } - - @Test - void malformedInlineTypeMetadataFailsClosed() { - Map malformedProperties = new LinkedHashMap(); - malformedProperties.put("broken", null); - Node malformedType = new Node() - .blueId(Request.blueId()) - .properties(malformedProperties); - Node request = requestWithType(malformedType, - "increment", TARGET, new Node().value(7)); - - assertNull(CoordinationEventNodes.operationRequest(request)); - } - - @Test - void missingAndBlankOperationKeepOrdinaryDelivery() { - Fixture fixture = fixture(); - Node missing = resolvedRequest(fixture, null, TARGET); - Node blank = resolvedRequest(fixture, " \t", TARGET); - - assertOrdinary(evaluate(fixture, entry(fixture, missing), channels()), entry(fixture, missing)); - assertOrdinary(evaluate(fixture, entry(fixture, blank), channels()), entry(fixture, blank)); - } - - @Test - void missingAndBlankChannelKeepOrdinaryDelivery() { - Fixture fixture = fixture(); - Node missing = resolvedRequest(fixture, "increment", null); - Node blank = resolvedRequest(fixture, "increment", " \n"); - - assertOrdinary(evaluate(fixture, entry(fixture, missing), channels()), entry(fixture, missing)); - assertOrdinary(evaluate(fixture, entry(fixture, blank), channels()), entry(fixture, blank)); - } - - @Test - void unknownTargetKeepsOrdinaryDelivery() { - Fixture fixture = fixture(); - Node event = entry(fixture, request("increment", "missing", new Node().value(7))); - - assertOrdinary(evaluate(fixture, event, channels()), event); - } - - @Test - void ordinaryTimelineMessageKeepsOrdinaryDelivery() { - Fixture fixture = fixture(); - Node event = entry(fixture, TestTimelineProvider.chatMessage("hello")); - - assertOrdinary(evaluate(fixture, event, channels()), event); - } - - @Test - void targetExternalAcceptanceEvaluatorIsNotInvoked() { - Fixture fixture = fixture(); - CountingTimelineProcessor targetProcessor = new CountingTimelineProcessor(); - ChannelEvaluationContext context = ChannelEvaluationContextFactory.create( - SOURCE, - entry(fixture, request("increment", TARGET, new Node().value(7))), - channels(), - Collections.emptyMap(), - targetProcessor); - - ChannelEvaluation evaluation = new TimelineChannelProcessor().evaluate(sourceContract(), context); - - assertTrue(evaluation.matches()); - assertEquals(0, targetProcessor.evaluations); - } - - @Test - void unionDeliveryPreservesRouteMetadataAndOwnsItsCheckpoint() { - Node event = new Node() - .properties("payload", new Node().value("selected")) - .properties("meta", new Node() - .properties("existing", new Node().value("retained"))); - ChannelDelivery child = ChannelDelivery.of(event, - "child-event-id", - "child-checkpoint", - Boolean.FALSE, - TARGET, - "logical-route"); - - ChannelEvaluation evaluation = TimelineProviderSupport.preserveUnionDelivery( - ChannelEvaluation.matchDeliveries(Collections.singletonList(child)), - new Node().properties("fallback", new Node().value(true)), - "compositeSourceChannelKey", - SOURCE); - - ChannelDelivery union = onlyDelivery(evaluation); - assertEquals("selected", union.event().get("/payload")); - assertEquals("retained", union.event().get("/meta/existing")); - assertEquals(SOURCE, union.event().get("/meta/compositeSourceChannelKey")); - assertEquals("child-event-id", union.eventId()); - assertNull(union.checkpointKey()); - assertEquals(Boolean.FALSE, union.shouldProcess()); - assertEquals(TARGET, union.handlerChannelKey()); - assertEquals("logical-route", union.logicalDeliveryKey()); - } - - @Test - void unionOrdinaryDeliveryUsesFallbackAndPreservesEventId() { - Node fallback = new Node().properties("payload", new Node().value("fallback")); - - ChannelEvaluation evaluation = TimelineProviderSupport.preserveUnionDelivery( - ChannelEvaluation.match(null, "ordinary-id"), - fallback, - "compositeSourceChannelKey", - SOURCE); - - assertTrue(evaluation.matches()); - assertEquals("fallback", evaluation.event().get("/payload")); - assertEquals(SOURCE, evaluation.event().get("/meta/compositeSourceChannelKey")); - assertEquals("ordinary-id", evaluation.eventId()); - } - - @Test - void unionWithoutChildOrFallbackEventDoesNotMatch() { - ChannelEvaluation evaluation = TimelineProviderSupport.preserveUnionDelivery( - ChannelEvaluation.match(null), - null, - "compositeSourceChannelKey", - SOURCE); - - assertFalse(evaluation.matches()); - } - - @Test - void operationMatcherRequiresExactEffectiveChannelAndOperationKey() { - Fixture fixture = fixture(); - Node event = entry(fixture, request("increment", TARGET, new Node().value(7))); - SequentialWorkflowOperation operation = new SequentialWorkflowOperation(); - operation.request(resolvedPattern(fixture, "Integer")); - operation.setKey("increment"); - - OperationRequestMatcher matcher = new OperationRequestMatcher(); - - assertTrue(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "increment", TARGET, event))); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "increment", "BobChannel", event))); - operation.setKey("Increment"); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "increment", TARGET, event))); - } - - @Test - void requestMayBeAbsentOnlyForAnEmptyOperationPattern() { - Fixture fixture = fixture(); - Node event = entry(fixture, resolvedRequest(fixture, "run", TARGET)); - SequentialWorkflowOperation operation = new SequentialWorkflowOperation(); - operation.setKey("run"); - OperationRequestMatcher matcher = new OperationRequestMatcher(); - - assertTrue(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, event))); - - operation.request(resolvedPattern(fixture, "Integer")); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, event))); - } - - @Test - void operationMatcherFailsClosedForMissingInputsAndMalformedRoute() { - Fixture fixture = fixture(); - OperationRequestMatcher matcher = new OperationRequestMatcher(); - SequentialWorkflowOperation operation = new SequentialWorkflowOperation(); - operation.setKey("run"); - Node validEvent = entry(fixture, resolvedRequest(fixture, "run", TARGET)); - - assertFalse(matcher.matches(null, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, validEvent))); - assertFalse(matcher.matches(operation, null)); - - Node ordinaryEvent = entry(fixture, TestTimelineProvider.chatMessage("ordinary")); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, ordinaryEvent))); - - operation.setKey(" \t"); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, validEvent))); - - operation.setKey(null); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, validEvent))); - - operation.setKey("run"); - Node malformedEvent = entry(fixture, resolvedRequest(fixture, null, TARGET)); - assertFalse(matcher.matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, malformedEvent))); - } - - @Test - void explicitlyEmptyRequestPatternAllowsAbsentPayload() { - Fixture fixture = fixture(); - Node event = entry(fixture, resolvedRequest(fixture, "run", TARGET)); - SequentialWorkflowOperation operation = new SequentialWorkflowOperation(); - operation.setKey("run"); - operation.request(new Node()); - - assertTrue(new OperationRequestMatcher().matches(operation, - HandlerMatchContextFactory.create(fixture.blue, "run", TARGET, event))); - } - - private static ChannelEvaluation evaluate(Fixture fixture, - Node event, - Map channels) { - ChannelEvaluationContext context = ChannelEvaluationContextFactory.create( - SOURCE, - event, - channels, - Collections.emptyMap(), - new TimelineChannelProcessor()); - return new TimelineChannelProcessor().evaluate(sourceContract(), context); - } - - private static void assertOrdinary(ChannelEvaluation evaluation, Node expectedEvent) { - assertTrue(evaluation.matches()); - assertTrue(evaluation.deliveries().isEmpty()); - assertNotNull(evaluation.event()); - assertEquals(TimelineProviderSupport.eventId(expectedEvent), - TimelineProviderSupport.eventId(evaluation.event())); - } - - private static ChannelDelivery onlyDelivery(ChannelEvaluation evaluation) { - assertTrue(evaluation.matches()); - List deliveries = evaluation.deliveries(); - assertEquals(1, deliveries.size()); - return deliveries.get(0); - } - - private static Map channels() { - Map channels = new LinkedHashMap(); - channels.put(SOURCE, sourceContract()); - channels.put(TARGET, targetContract()); - return channels; - } - - private static TimelineChannel sourceContract() { - return new TimelineChannel() - .timeline(new Timeline().timelineId(TIMELINE)) - .actor(new PrincipalActor().accountId(ACTOR)); - } - - private static TimelineChannel targetContract() { - return new TimelineChannel() - .timeline(new Timeline().timelineId("bob-timeline")) - .actor(new PrincipalActor().accountId("bob-account")); - } - - private static Node entry(Fixture fixture, Node message) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - TIMELINE, - ACTOR, - BigInteger.TEN, - message); - } - - private static Node request(String operation, String channel, Node payload) { - return new Node() - .type(OperationRequest.qualifiedName()) - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value(channel)) - .properties("request", payload); - } - - private static Node resolvedRequest(Fixture fixture, String operation, String channel) { - Node request = new Node().type(OperationRequest.qualifiedName()); - if (operation != null) { - request.properties("operation", new Node().value(operation)); - } - if (channel != null) { - request.properties("channel", new Node().value(channel)); - } - return fixture.blue.preprocess(request.blue(fixture.repository.typeAliasBlue())).blue(null); - } - - private static Node requestWithType(Node type, String operation, String channel, Node payload) { - return new Node() - .type(type) - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value(channel)) - .properties("request", payload); - } - - private static Node compatibleSubtype(Fixture fixture) { - Node subtype = new Node() - .name("Specialized Operation Request") - .type(new Node().blueId(OperationRequest.blueId())); - return subtype.blueId(blue.language.utils.BlueIdCalculator.calculateBlueId(subtype)); - } - - private static Node resolvedPattern(Fixture fixture, String type) { - return fixture.blue.preprocess(new Node() - .type(type) - .blue(fixture.repository.typeAliasBlue())).blue(null); - } - - private static Fixture fixture() { - BlueRepository repository = BlueRepository.latest(); - return new Fixture(repository, CoordinationTestResources.configuredBlue(repository)); - } - - private static final class CountingTimelineProcessor implements ChannelProcessor { - private int evaluations; - - @Override - public Class contractType() { - return TimelineChannel.class; - } - - @Override - public ChannelEvaluation evaluate(TimelineChannel contract, ChannelEvaluationContext context) { - evaluations++; - return ChannelEvaluation.noMatch(); - } - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/OperationRequestRoutingIntegrationTest.java b/src/test/java/blue/coordination/processor/OperationRequestRoutingIntegrationTest.java deleted file mode 100644 index 1beed51..0000000 --- a/src/test/java/blue/coordination/processor/OperationRequestRoutingIntegrationTest.java +++ /dev/null @@ -1,728 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.coordination.processor.workflow.StepExecutionContext; -import blue.coordination.processor.workflow.WorkflowStepExecutor; -import blue.coordination.processor.workflow.WorkflowStepResult; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelCheckpointContext; -import blue.language.processor.ChannelDelivery; -import blue.language.processor.ChannelEvaluation; -import blue.language.processor.ChannelEvaluationContext; -import blue.language.processor.ChannelProcessor; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessingMetricsSink; -import blue.language.processor.ProcessorStatus; -import blue.repo.BlueRepository; -import blue.repo.coordination.Authority; -import blue.repo.coordination.Compute; -import blue.repo.coordination.OperationRequest; -import blue.repo.coordination.SequentialWorkflowStep; -import blue.repo.coordination.TimelineChannel; -import java.math.BigInteger; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class OperationRequestRoutingIntegrationTest { - private static final String ALICE_CHANNEL = "aliceChannel"; - private static final String BOB_CHANNEL = "bobChannel"; - private static final String ALICE_TIMELINE = "alice-timeline"; - private static final String ALICE_ACTOR = "alice-account"; - - @Test - void crossChannelRequestRunsTargetOperationAndKeepsSourceCheckpoint() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("increment", BOB_CHANNEL, new Node().value(7))); - - assertSuccess(result); - assertEquals(BigInteger.ONE, result.document().get("/counter")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - assertNull(checkpoint(result.document(), BOB_CHANNEL)); - } - - @Test - void sourceActorMismatchRejectsBeforeRouting() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - Node event = timelineEntry(fixture, - ALICE_TIMELINE, - "intruder", - 1, - request("increment", BOB_CHANNEL, new Node().value(7))); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, event); - - assertSuccess(result); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - assertNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void sourceTimelineMismatchRejectsBeforeRouting() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - Node event = timelineEntry(fixture, - "different-timeline", - ALICE_ACTOR, - 1, - request("increment", BOB_CHANNEL, new Node().value(7))); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, event); - - assertSuccess(result); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - assertNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void sourceEventFilterRejectsBeforeRouting() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.get(ALICE_CHANNEL).properties("definition", new Node() - .properties("source", new Node() - .properties("kind", new Node().value("allowed")))); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - Node event = timelineEntry(fixture, - ALICE_TIMELINE, - ALICE_ACTOR, - 1, - request("increment", BOB_CHANNEL, new Node().value(7))) - .properties("source", new Node().properties("kind", new Node().value("denied"))); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, event); - - assertSuccess(result); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - assertNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void routedHandlerSeesFullRootAttributionWithoutTargetActorSubstitution() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("capture", captureEventOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - Node message = request("capture", BOB_CHANNEL, new Node().value(7)) - .properties("document", new Node() - .blueId("2vz831ZwzhpUefTb5XkodBRANKpFMbj1F4CN33kf38Hw")) - .properties("requireExactDocumentVersion", new Node().value(true)) - .properties("specializedField", new Node().value("preserved")); - Node event = timelineEntry(fixture, ALICE_TIMELINE, ALICE_ACTOR, 1, message) - .properties("source", new Node().properties("kind", new Node().value("verified-api"))) - .properties("onBehalfOf", new Node() - .type(new Node().blueId(Authority.blueId())) - .properties("label", new Node().value("mandate-owner"))); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, event); - - assertSuccess(result); - assertEquals(ALICE_TIMELINE, result.document().get("/captured/timeline/timelineId")); - assertEquals(ALICE_ACTOR, result.document().get("/captured/actor/accountId")); - assertEquals("verified-api", result.document().get("/captured/source/kind")); - assertEquals("mandate-owner", result.document().get("/captured/onBehalfOf/label")); - assertEquals("preserved", result.document().get("/captured/message/specializedField")); - assertEquals(BOB_CHANNEL, result.document().get("/captured/message/channel")); - assertEquals(Boolean.TRUE, - result.document().get("/captured/message/requireExactDocumentVersion")); - assertEquals("2vz831ZwzhpUefTb5XkodBRANKpFMbj1F4CN33kf38Hw", - result.document().getAsNode("/captured/message/document").getBlueId()); - } - - @Test - void unknownRequestTargetKeepsOrdinaryDeliveryAndCheckpoint() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("ordinaryObserver", ordinaryObserver(ALICE_CHANNEL)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("increment", "missingChannel", new Node().value(7))); - - assertSuccess(result); - assertEquals(BigInteger.ONE, result.document().get("/ordinaryCount")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void nonChannelRequestTargetKeepsOrdinaryDeliveryAndCheckpoint() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("ordinaryObserver", ordinaryObserver(ALICE_CHANNEL)); - contracts.put("notAChannel", new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value(ALICE_CHANNEL)) - .properties("steps", new Node().items())); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("increment", "notAChannel", new Node().value(7))); - - assertSuccess(result); - assertEquals(BigInteger.ONE, result.document().get("/ordinaryCount")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void malformedRoutingFieldsStayOrdinaryAndAdvanceCheckpoint() { - Node[] malformedRequests = new Node[] { - requestWithOptionalRoute(null, BOB_CHANNEL), - requestWithOptionalRoute(" \t", BOB_CHANNEL), - requestWithOptionalRoute("increment", null), - requestWithOptionalRoute("increment", " \n") - }; - - for (Node malformedRequest : malformedRequests) { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("ordinaryObserver", ordinaryObserver(ALICE_CHANNEL)); - Node initialized = initialize(fixture, contracts); - DocumentProcessingResult result = process(fixture, - initialized, - 1, - malformedRequest); - - assertSuccess(result); - assertEquals(BigInteger.ONE, result.document().get("/ordinaryCount")); - assertEquals(BigInteger.valueOf(1_001), - checkpoint(result.document(), ALICE_CHANNEL).get("/timestamp")); - } - } - - @Test - void unknownOperationRunsNoHandlerButAdvancesSourceCheckpoint() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("ordinaryObserver", ordinaryObserver(ALICE_CHANNEL)); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("missingOperation", BOB_CHANNEL, new Node().value(7))); - - assertSuccess(result); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - assertEquals(BigInteger.ZERO, result.document().get("/ordinaryCount")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void targetOperationRequestPatternRemainsMandatory() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("increment", BOB_CHANNEL, new Node().value("7"))); - - assertSuccess(result); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - assertEquals(BigInteger.valueOf(1_001), - checkpoint(result.document(), ALICE_CHANNEL).get("/timestamp")); - } - - @Test - void targetOperationEventPatternRemainsMandatory() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("increment", incrementOperation(BOB_CHANNEL) - .properties("event", new Node() - .properties("source", new Node() - .properties("kind", new Node().value("allowed"))))); - Node initialized = initialize(fixture, contracts); - Node event = timelineEntry(fixture, - ALICE_TIMELINE, - ALICE_ACTOR, - 1, - request("increment", BOB_CHANNEL, new Node().value(7))) - .properties("source", new Node().properties("kind", new Node().value("denied"))); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, event); - - assertSuccess(result); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - assertEquals(BigInteger.valueOf(1_001), - checkpoint(result.document(), ALICE_CHANNEL).get("/timestamp")); - } - - @Test - void firstCompositeSourceSuppliesPayloadWhileDuplicateSourcesCheckpoint() { - RecordingMetrics metrics = new RecordingMetrics(); - Fixture fixture = fixture(metrics, null); - Map contracts = baseContracts(); - contracts.get(ALICE_CHANNEL).properties("order", new Node().value(0)); - contracts.put("aliceComposite", composite(-10, ALICE_CHANNEL)); - contracts.put("recordWinner", recordMetadataOperation( - BOB_CHANNEL, "compositeSourceChannelKey")); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("recordWinner", BOB_CHANNEL, new Node().value(7))); - - assertSuccess(result); - assertEquals(ALICE_CHANNEL, result.document().get("/winner")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - assertNotNull(checkpoint(result.document(), "aliceComposite")); - assertNull(checkpoint(result.document(), "aliceComposite::" + ALICE_CHANNEL)); - assertEquals(1, metrics.routedDeliveries); - assertEquals(1, metrics.deduplicatedDeliveries); - assertEquals(1, metrics.handlersExecuted); - } - - @Test - void firstAllTimelinesSourceSuppliesPayloadWhileDuplicateSourcesCheckpoint() { - RecordingMetrics metrics = new RecordingMetrics(); - Fixture fixture = fixture(metrics, null); - Map contracts = baseContracts(); - contracts.get(ALICE_CHANNEL).properties("order", new Node().value(0)); - contracts.put("all", new Node() - .type("Coordination/All Timelines Channel") - .properties("order", new Node().value(-10))); - contracts.put("recordWinner", recordMetadataOperation( - BOB_CHANNEL, "allTimelinesSourceChannelKey")); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("recordWinner", BOB_CHANNEL, new Node().value(7))); - - assertSuccess(result); - assertEquals(ALICE_CHANNEL, result.document().get("/winner")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - assertNotNull(checkpoint(result.document(), "all")); - assertNull(checkpoint(result.document(), "all::" + ALICE_CHANNEL)); - assertEquals(1, metrics.routedDeliveries); - assertEquals(1, metrics.deduplicatedDeliveries); - assertEquals(1, metrics.handlersExecuted); - } - - @Test - void severalMatchingDirectSourcesInvokeTargetOnceAndPersistOwnCheckpoints() { - RecordingMetrics metrics = new RecordingMetrics(); - Fixture fixture = fixture(metrics, null); - Map contracts = baseContracts(); - contracts.put("aliceMirror", timelineChannel(ALICE_TIMELINE, ALICE_ACTOR)); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("increment", BOB_CHANNEL, new Node().value(7))); - - assertEquals(BigInteger.ONE, result.document().get("/counter")); - assertNotNull(checkpoint(result.document(), ALICE_CHANNEL)); - assertNotNull(checkpoint(result.document(), "aliceMirror")); - assertEquals(1, metrics.routedDeliveries); - assertEquals(1, metrics.deduplicatedDeliveries); - assertEquals(1, metrics.handlersExecuted); - } - - @Test - void staleSourceDoesNotPiggybackOnSuccessfulRoute() { - Fixture fixture = fixture(); - fixture.blue.registerContractProcessor(TimelineChannel.blueId(), - new SelectiveFreshnessTimelineProcessor()); - Map contracts = baseContracts(); - contracts.put("freshSource", timelineChannel(ALICE_TIMELINE, ALICE_ACTOR)); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult backfill = process(fixture, - initialized, - 5, - request("increment", BOB_CHANNEL, new Node().value(7))); - - assertSuccess(backfill); - assertEquals(BigInteger.ONE, backfill.document().get("/counter")); - assertNull(checkpoint(backfill.document(), ALICE_CHANNEL)); - assertEquals(BigInteger.valueOf(1_005), - checkpoint(backfill.document(), "freshSource").get("/timestamp")); - } - - @Test - void targetHandlerFailurePersistsNoSourceCheckpoint() { - Fixture fixture = fixture(); - Map contracts = baseContracts(); - contracts.put("fail", operation(BOB_CHANNEL, - new Node().type("Integer"), - failStep("target handler failed"))); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("fail", BOB_CHANNEL, new Node().value(7))); - - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status()); - assertTrue(result.failureReason().contains("target handler failed"), result.failureReason()); - assertNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void targetGracefulTerminationPersistsNoSourceCheckpoint() { - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Collections.>singletonList( - new GracefulTerminationExecutor())); - Fixture fixture = fixture(null, runner); - Map contracts = baseContracts(); - contracts.put("finish", operation(BOB_CHANNEL, - new Node().type("Integer"), - new Node().type("Coordination/Compute"))); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = process(fixture, - initialized, - 1, - request("finish", BOB_CHANNEL, new Node().value(7))); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - @Test - void replayAfterCommittedSourceCheckpointsRunsNothing() { - RecordingMetrics metrics = new RecordingMetrics(); - Fixture fixture = fixture(metrics, null); - Map contracts = baseContracts(); - contracts.put("aliceMirror", timelineChannel(ALICE_TIMELINE, ALICE_ACTOR)); - contracts.put("increment", incrementOperation(BOB_CHANNEL)); - Node initialized = initialize(fixture, contracts); - Node event = timelineEntry(fixture, - ALICE_TIMELINE, - ALICE_ACTOR, - 1, - request("increment", BOB_CHANNEL, new Node().value(7))); - - DocumentProcessingResult first = fixture.blue.processDocument(initialized, event); - int handlersAfterFirst = metrics.handlersExecuted; - DocumentProcessingResult replay = fixture.blue.processDocument(first.document(), event); - - assertEquals(BigInteger.ONE, replay.document().get("/counter")); - assertEquals(handlersAfterFirst, metrics.handlersExecuted); - assertTrue(replay.totalGas() < first.totalGas()); - } - - @Test - void invalidTrustedRouteMetadataRemainsCoreFatal() { - Fixture fixture = fixture(); - fixture.blue.registerContractProcessor(TimelineChannel.blueId(), - new InvalidRouteTimelineProcessor()); - Map contracts = new LinkedHashMap(); - contracts.put(ALICE_CHANNEL, timelineChannel(ALICE_TIMELINE, ALICE_ACTOR)); - Node initialized = initialize(fixture, contracts); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized, - timelineEntry(fixture, - ALICE_TIMELINE, - ALICE_ACTOR, - 1, - TestTimelineProvider.chatMessage("route"))); - - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status()); - assertTrue(result.failureReason().contains("same-scope Channel"), result.failureReason()); - assertNull(checkpoint(result.document(), ALICE_CHANNEL)); - } - - private static Map baseContracts() { - Map contracts = new LinkedHashMap(); - contracts.put(ALICE_CHANNEL, timelineChannel(ALICE_TIMELINE, ALICE_ACTOR)); - contracts.put(BOB_CHANNEL, timelineChannel("bob-timeline", "bob-account")); - return contracts; - } - - private static Node timelineChannel(String timelineId, String actorId) { - return TestTimelineProvider.channel(timelineId, actorId); - } - - private static Node composite(int order, String... childKeys) { - Node[] keys = new Node[childKeys.length]; - for (int i = 0; i < childKeys.length; i++) { - keys[i] = new Node().value(childKeys[i]); - } - return new Node() - .type("Coordination/Composite Timeline Channel") - .properties("order", new Node().value(order)) - .properties("channels", new Node().items(keys)); - } - - private static Node incrementOperation(String channel) { - return operation(channel, - new Node().type("Integer"), - replaceStep("/counter", bexAdd( - bexDocument("/counter"), - new Node().value(1)))); - } - - private static Node captureEventOperation(String channel) { - return operation(channel, - new Node().type("Integer"), - replaceStep("/captured", bexBinding("event"))); - } - - private static Node recordMetadataOperation(String channel, String metadataKey) { - return operation(channel, - new Node().type("Integer"), - replaceStep("/winner", bexBinding("event/meta/" + metadataKey))); - } - - private static Node operation(String channel, Node requestPattern, Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value(channel)) - .properties("request", requestPattern) - .properties("steps", new Node().items(steps)); - } - - private static Node ordinaryObserver(String channel) { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items( - replaceStep("/ordinaryCount", bexAdd( - bexDocument("/ordinaryCount"), - new Node().value(1))))); - } - - private static Node replaceStep(String path, Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendChange", new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value(path)) - .properties("val", value)), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node failStep(String reason) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$fail", new Node().value(reason)))); - } - - private static Node bexAdd(Node... values) { - return new Node().properties("$add", new Node().items(values)); - } - - private static Node bexDocument(String path) { - return new Node().properties("$document", new Node().value(path)); - } - - private static Node bexBinding(String path) { - return new Node().properties("$binding", new Node().value(path)); - } - - private static Node request(String operation, String channel, Node payload) { - Node request = new Node() - .type(OperationRequest.qualifiedName()) - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value(channel)); - if (payload != null) { - request.properties("request", payload); - } - return request; - } - - private static Node requestWithOptionalRoute(String operation, String channel) { - Node request = new Node().type(OperationRequest.qualifiedName()); - if (operation != null) { - request.properties("operation", new Node().value(operation)); - } - if (channel != null) { - request.properties("channel", new Node().value(channel)); - } - return request; - } - - private static Node initialize(Fixture fixture, Map contracts) { - Node document = new Node() - .blue(fixture.repository.typeAliasBlue()) - .name("Operation Request Routing Test") - .properties("counter", new Node().value(0)) - .properties("ordinaryCount", new Node().value(0)) - .properties("winner", new Node().value("none")) - .properties("captured", new Node()) - .properties("contracts", new Node().properties(contracts)); - DocumentProcessingResult initialized = fixture.blue.initializeDocument( - fixture.blue.preprocess(document)); - assertSuccess(initialized); - return initialized.document(); - } - - private static DocumentProcessingResult process(Fixture fixture, - Node document, - long timestampOffset, - Node message) { - return fixture.blue.processDocument(document, - timelineEntry(fixture, - ALICE_TIMELINE, - ALICE_ACTOR, - timestampOffset, - message)); - } - - private static Node timelineEntry(Fixture fixture, - String timeline, - String actor, - long timestampOffset, - Node message) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - timeline, - actor, - BigInteger.valueOf(1_000L + timestampOffset), - message); - } - - private static Node checkpoint(Node document, String key) { - try { - return document.getAsNode("/contracts/checkpoint/lastEvents/" + key); - } catch (IllegalArgumentException ex) { - return null; - } - } - - private static Fixture fixture() { - return fixture(null, null); - } - - private static Fixture fixture(RecordingMetrics metrics, SequentialWorkflowRunner runner) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - if (runner != null) { - blue.registerContractProcessor(new SequentialWorkflowOperationProcessor(runner)); - } - if (metrics != null) { - blue.getDocumentProcessor().processingMetricsSink(metrics); - } - return new Fixture(repository, blue); - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } - - private static final class RecordingMetrics implements ProcessingMetricsSink { - private int routedDeliveries; - private int deduplicatedDeliveries; - private int handlersExecuted; - - @Override - public void incrementRoutedChannelDeliveries() { - routedDeliveries++; - } - - @Override - public void incrementDeduplicatedChannelDeliveries() { - deduplicatedDeliveries++; - } - - @Override - public void incrementHandlersExecuted() { - handlersExecuted++; - } - } - - private static final class GracefulTerminationExecutor - implements WorkflowStepExecutor { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof Compute; - } - - @Override - public WorkflowStepResult execute(Compute step, StepExecutionContext context) { - context.processorContext().terminateGracefully("operation complete"); - return WorkflowStepResult.none(); - } - } - - private static final class InvalidRouteTimelineProcessor - implements ChannelProcessor { - @Override - public Class contractType() { - return TimelineChannel.class; - } - - @Override - public ChannelEvaluation evaluate(TimelineChannel contract, - ChannelEvaluationContext context) { - return ChannelEvaluation.matchDeliveries(Collections.singletonList( - ChannelDelivery.of(context.event(), - null, - null, - null, - "missing", - "invalid-route"))); - } - } - - private static final class SelectiveFreshnessTimelineProcessor - implements ChannelProcessor { - @Override - public Class contractType() { - return TimelineChannel.class; - } - - @Override - public ChannelEvaluation evaluate(TimelineChannel contract, - ChannelEvaluationContext context) { - return TimelineProviderSupport.evaluateTimelineEntry(contract, context); - } - - @Override - public String eventId(TimelineChannel contract, ChannelEvaluationContext context) { - return TimelineProviderSupport.eventId(context.event()); - } - - @Override - public boolean isNewerEvent(TimelineChannel contract, ChannelCheckpointContext context) { - return !ALICE_CHANNEL.equals(context.channelKey()) - && TimelineProviderSupport.isNewerOrSameTimelineEvent(context); - } - } -} diff --git a/src/test/java/blue/coordination/processor/PublishedTimelineChannelResolutionTest.java b/src/test/java/blue/coordination/processor/PublishedTimelineChannelResolutionTest.java deleted file mode 100644 index 53ced23..0000000 --- a/src/test/java/blue/coordination/processor/PublishedTimelineChannelResolutionTest.java +++ /dev/null @@ -1,183 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelEvaluationContext; -import blue.language.processor.ChannelProcessor; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.repo.BlueRepository; -import blue.repo.coordination.Actor; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineChannel; -import blue.repo.coordination.TimelineEntry; -import blue.repo.myos.PrincipalActor; -import java.math.BigInteger; -import java.util.Collections; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class PublishedTimelineChannelResolutionTest { - private static final String CHANNEL_YAML = String.join("\n", - "type: Coordination/Timeline Channel", - "timeline:", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId: timeline-1", - "actor:", - " type: MyOS/Principal Actor", - " accountId: account-1"); - - @Test - void publishedMaterializedTimelineChannelResolves() { - Fixture fixture = fixture(false); - - Node resolved = fixture.blue.resolve(fixture.blue.preprocess( - authoredChannel(fixture.blue).blue(fixture.repository.typeAliasBlue()))); - - assertResolvedBinding(fixture, resolved); - } - - @Test - void publishedMaterializedTimelineChannelInitializesAsContract() { - Fixture fixture = fixture(false); - - DocumentProcessingResult result = fixture.blue.initializeDocument( - fixture.blue.preprocess(document(fixture))); - - assertSuccessfulSnapshot(result); - assertResolvedBinding(fixture, result.document().getAsNode("/contracts/timeline")); - } - - @Test - void publishedTimelineEntryRecursiveTypeResolvesFinitely() { - Fixture fixture = fixture(false); - - Node resolved = fixture.blue.resolve(timelineEntry(fixture.blue, BigInteger.ONE, "finite")); - - assertFinitePrevEntryBoundary(resolved); - } - - @Test - void publishedCheckpointedTimelineEntrySurvivesClonedDocumentRebuild() { - Fixture fixture = fixture(true); - Node initialized = fixture.blue.initializeDocument( - fixture.blue.preprocess(document(fixture))).document(); - - DocumentProcessingResult first = fixture.blue.processDocument(initialized, - timelineEntry(fixture.blue, BigInteger.ONE, "first")); - - assertSuccessfulSnapshot(first); - assertCheckpoint(first.document(), BigInteger.ONE, "first"); - - DocumentProcessingResult second = fixture.blue.processDocument(first.document().clone(), - timelineEntry(fixture.blue, BigInteger.valueOf(2), "second")); - - assertSuccessfulSnapshot(second); - assertCheckpoint(second.document(), BigInteger.valueOf(2), "second"); - assertFinitePrevEntryBoundary(fixture.blue.resolve( - timelineEntry(fixture.blue, BigInteger.valueOf(2), "second"))); - } - - private static Fixture fixture(boolean alwaysMatchingProcessor) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = repository.configure(new Blue()); - if (alwaysMatchingProcessor) { - blue.registerContractProcessor(TimelineChannel.blueId(), - new AlwaysMatchingTimelineChannelProcessor()); - } else { - CoordinationProcessors.registerWith(blue); - } - return new Fixture(repository, blue); - } - - private static Node document(Fixture fixture) { - return new Node() - .blue(fixture.repository.typeAliasBlue()) - .properties("contracts", new Node().properties(Collections.singletonMap( - "timeline", authoredChannel(fixture.blue)))); - } - - private static Node authoredChannel(Blue blue) { - return blue.parseSourceYaml(CHANNEL_YAML); - } - - private static Node timelineEntry(Blue blue, BigInteger timestamp, String message) { - TimelineEntry entry = new TimelineEntry() - .timeline(new Timeline().timelineId("timeline-1")) - .actor(new PrincipalActor().accountId("account-1")) - .timestamp(timestamp) - .message(blue.objectToNode(new ChatMessage().message(message))); - return blue.preprocess(blue.objectToNode(entry)); - } - - private static void assertSuccessfulSnapshot(DocumentProcessingResult result) { - assertFalse(result.capabilityFailure(), result.failureReason()); - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertNotNull(result.snapshot()); - assertEquals(result.snapshot().blueId(), result.snapshot().frozenCanonicalRoot().blueId()); - } - - private static void assertCheckpoint(Node document, BigInteger timestamp, String message) { - Node event = document.getAsNode("/contracts/checkpoint/lastEvents/timeline"); - assertNotNull(event); - assertNotNull(event.getType()); - assertTrue(event.getType().isReferenceOnly()); - assertEquals(TimelineEntry.blueId(), event.getType().getBlueId()); - assertEquals("timeline-1", event.getAsText("/timeline/timelineId")); - assertEquals("account-1", event.getAsText("/actor/accountId")); - assertFalse(event.getProperties().containsKey("sequence")); - assertEquals(timestamp, event.get("/timestamp")); - assertEquals(message, event.getAsText("/message/message")); - } - - private static void assertFinitePrevEntryBoundary(Node resolvedTimelineEntry) { - Node prevEntry = resolvedTimelineEntry.getAsNode("/prevEntry"); - assertNotNull(prevEntry); - Node prevEntryType = prevEntry.getType(); - assertNotNull(prevEntryType); - assertTrue(prevEntryType.isReferenceOnly()); - assertEquals(TimelineEntry.blueId(), prevEntryType.getBlueId()); - assertNull(prevEntryType.getProperties()); - assertNull(prevEntryType.getItems()); - assertNull(prevEntryType.getType()); - } - - private static void assertResolvedBinding(Fixture fixture, Node channel) { - assertNotNull(channel); - assertEquals("timeline-1", channel.getAsText("/timeline/timelineId")); - assertEquals("account-1", channel.getAsText("/actor/accountId")); - Node actorType = fixture.repository.nodeByName(Actor.qualifiedName()) - .orElseThrow(() -> new AssertionError("Published repository is missing Coordination/Actor")); - assertTrue(fixture.blue.nodeMatchesType(channel.getAsNode("/actor"), actorType)); - } - - private static final class AlwaysMatchingTimelineChannelProcessor - implements ChannelProcessor { - @Override - public Class contractType() { - return TimelineChannel.class; - } - - @Override - public boolean matches(TimelineChannel contract, ChannelEvaluationContext context) { - return true; - } - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/RepositoryStyleCounterDocumentTest.java b/src/test/java/blue/coordination/processor/RepositoryStyleCounterDocumentTest.java deleted file mode 100644 index b9dac9d..0000000 --- a/src/test/java/blue/coordination/processor/RepositoryStyleCounterDocumentTest.java +++ /dev/null @@ -1,241 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.CoordinationProcessors; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.repo.BlueRepository; -import blue.repo.coordination.OperationRequest; -import java.math.BigInteger; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class RepositoryStyleCounterDocumentTest { - private static final String TIMELINE_ID = "bb13b2d9-3df9-5fea-9fdf-dd4f0ae74486"; - - @Test - void richCounterDocumentInitializesAndProcessesIncrementOperation() { - Fixture fixture = configuredFixture(); - Node authored = richCounterDocument(fixture); - - assertNull(property(property(authored, "contracts"), "initialized")); - assertNull(property(property(authored, "contracts"), "checkpoint")); - - DocumentProcessingResult initialized = fixture.blue.initializeDocument(authored); - - assertFalse(initialized.capabilityFailure(), initialized.failureReason()); - assertTrue(fixture.blue.isInitialized(initialized.document())); - assertNotNull(initialized.snapshot()); - assertNotNull(initialized.blueId()); - String initializedDocumentId = initialized.resolvedDocument().getAsText("/contracts/initialized/documentId"); - assertNotNull(initializedDocumentId); - assertNull(property(property(initialized.resolvedDocument(), "contracts"), "checkpoint")); - - Node event = TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - TIMELINE_ID, - 1777987926, - operationRequest("increment", 5)); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized.snapshot(), event); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNotNull(result.snapshot()); - assertNotNull(result.blueId()); - assertEquals(BigInteger.valueOf(5), result.resolvedDocument().get("/counter")); - assertEquals(1, result.triggeredEvents().size()); - assertEquals("Counter was incremented by 5 and is now 5", - result.triggeredEvents().get(0).getAsText("/message")); - - Node resolved = result.resolvedDocument(); - assertEquals(initializedDocumentId, resolved.getAsText("/contracts/initialized/documentId")); - assertEquals(TIMELINE_ID, resolved.getAsText("/contracts/checkpoint/lastEvents/ownerChannel/timeline/timelineId")); - assertEquals(BigInteger.valueOf(1777987926L), - resolved.get("/contracts/checkpoint/lastEvents/ownerChannel/timestamp")); - assertEquals("increment", - resolved.getAsText("/contracts/checkpoint/lastEvents/ownerChannel/message/operation")); - assertEquals(BigInteger.valueOf(5), - resolved.get("/contracts/checkpoint/lastEvents/ownerChannel/message/request")); - assertNotNull(resolved.get("/contracts/checkpoint/lastEvents/ownerChannel")); - } - - private static Node richCounterDocument(Fixture fixture) { - Node parsed = fixture.blue.yamlToNode(richCounterDocumentYaml()); - return fixture.blue.preprocess(parsed.blue(fixture.repository.typeAliasBlue())); - } - - private static String richCounterDocumentYaml() { - return String.join("\n", - "name: Counter - 2026-04-21T09:47:18.314Z", - "description: Target Blue document to be bootstrapped", - "counter: 0", - "contracts:", - " ownerChannel:", - " type: Coordination/Timeline Channel", - " order:", - " description: Deterministic sort key within a scope; missing == 0.", - " type: Integer", - " event:", - " description: Optional matcher payload used by the channel's processor to further restrict which incoming events it accepts at this scope.", - " timeline:", - " description: Timeline whose entries this channel delivers.", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId:", - " type: Text", - " value: " + TIMELINE_ID, - " actor:", - " description: Actor whose entries this channel delivers.", - " type: MyOS/Principal Actor", - " accountId:", - " type: Text", - " value: " + TIMELINE_ID, - " increment:", - " description: Increment the counter by the given number", - " type: Coordination/Sequential Workflow Operation", - " order:", - " description: Deterministic sort key within a scope; missing == 0.", - " type: Integer", - " channel:", - " description: Contracts-map key of the Channel in this scope on which Operation Request events are sent to invoke this operation.", - " type: Text", - " value: ownerChannel", - " request:", - " description: Represents a value by which counter will be incremented", - " type: Integer", - " event:", - " description: Optional matcher payload used by the handler's processor to further restrict events.", - " steps:", - " description: Ordered list of steps to execute (positional semantics).", - " type: List", - " itemType: Coordination/Sequential Workflow Step", - " items:", - " - name: ApplyIncrement", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /counter", - " val:", - " $add:", - " - $document: /counter", - " - $binding:", - " name: event", - " path: /message/request", - " - $return: {}", - " - name: CreateMessageEvent", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " $merge:", - " - type: Coordination/Chat Message", - " - message:", - " $concat:", - " - Counter was incremented by", - " - \" \"", - " - $binding:", - " name: event", - " path: /message/request", - " - \" and is now \"", - " - $text:", - " $document: /counter", - " - $return: {}", - " decrement:", - " description: Decrement the counter by the given number", - " type: Coordination/Sequential Workflow Operation", - " order:", - " description: Deterministic sort key within a scope; missing == 0.", - " type: Integer", - " channel:", - " description: Contracts-map key of the Channel in this scope on which Operation Request events are sent to invoke this operation.", - " type: Text", - " value: ownerChannel", - " request:", - " description: Value to subtract", - " type: Integer", - " event:", - " description: Optional matcher payload used by the handler's processor to further restrict events.", - " steps:", - " description: Ordered list of steps to execute (positional semantics).", - " type: List", - " itemType: Coordination/Sequential Workflow Step", - " items:", - " - name: ApplyDecrement", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /counter", - " val:", - " $subtract:", - " - $document: /counter", - " - $binding:", - " name: event", - " path: /message/request", - " - $return: {}", - " - name: CreateMessageEvent", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " $merge:", - " - type: Coordination/Chat Message", - " - message:", - " $concat:", - " - Counter was decremented by", - " - \" \"", - " - $binding:", - " name: event", - " path: /message/request", - " - \" and is now \"", - " - $text:", - " $document: /counter", - " - $return: {}"); - } - - private static Node operationRequest(String operation, int request) { - OperationRequest operationRequest = new OperationRequest() - .operation(operation) - .channel("ownerChannel") - .request(new Node().value(request)); - return new Node() - .type(OperationRequest.qualifiedName()) - .properties("operation", new Node().value(operationRequest.getOperation())) - .properties("channel", new Node().value(operationRequest.getChannel())) - .properties("request", operationRequest.getRequest()); - } - - private static Node property(Node node, String key) { - if (node == null) { - return null; - } - if ("contracts".equals(key)) { - return node.getContracts(); - } - if (node.getProperties() == null) { - return null; - } - return node.getProperties().get(key); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/RepositoryTypeAliasPreprocessorTest.java b/src/test/java/blue/coordination/processor/RepositoryTypeAliasPreprocessorTest.java deleted file mode 100644 index ecc9763..0000000 --- a/src/test/java/blue/coordination/processor/RepositoryTypeAliasPreprocessorTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package blue.coordination.processor; - -import blue.language.model.Node; -import blue.repo.BlueRepository; -import blue.repo.common.CryptoEd25519Verify; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class RepositoryTypeAliasPreprocessorTest { - @Test - void resolvesCorrectRepositoryQualifiedIntrinsicAlias() { - Node node = intrinsicType("Common/Crypto Ed25519 Verify"); - - Node resolved = new RepositoryTypeAliasPreprocessor(BlueRepository.v1_3_0()).preprocess(node); - - assertEquals(CryptoEd25519Verify.blueId(), - resolved.getProperties().get("$intrinsic").getType().getBlueId()); - } - - @Test - void doesNotResolveOldDoubleCommonAlias() { - Node node = intrinsicType("Common/Common/Crypto Ed25519 Verify"); - - Node resolved = new RepositoryTypeAliasPreprocessor(BlueRepository.v1_3_0()).preprocess(node); - - assertEquals("Common/Common/Crypto Ed25519 Verify", - resolved.getProperties().get("$intrinsic").getType().getBlueId()); - } - - private static Node intrinsicType(String blueId) { - Node intrinsic = new Node() - .type(new Node().blueId(blueId)) - .properties("message", new Node().value("test")); - return new Node().properties("$intrinsic", intrinsic); - } -} diff --git a/src/test/java/blue/coordination/processor/RuntimeChannelsTest.java b/src/test/java/blue/coordination/processor/RuntimeChannelsTest.java deleted file mode 100644 index b61420d..0000000 --- a/src/test/java/blue/coordination/processor/RuntimeChannelsTest.java +++ /dev/null @@ -1,494 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.repo.BlueRepository; -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class RuntimeChannelsTest { - - @Test - void runtimeDocumentUpdateChannelReceivesUpdateEvents() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("updates", documentUpdateChannel("/counter")); - contracts.put("writer", directWorkflow("owner", updateDocumentStep("replace", "/counter", new Node().value(5)))); - contracts.put("observer", directWorkflowMatching("updates", - new Node().type("Document Update"), - computeAppendChatMessageStep(documentUpdateMessage()))); - Node document = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertEquals(BigInteger.valueOf(5), result.document().get("/counter")); - assertContainsChatMessage(result.triggeredEvents(), "updated /counter from 0 to 5"); - } - - @Test - void documentUpdateChannelPathFilteringUsesRepositoryTypes() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("counterUpdates", documentUpdateChannel("/counter")); - contracts.put("nameUpdates", documentUpdateChannel("/name")); - contracts.put("writer", directWorkflow("owner", updateDocumentStep("replace", "/counter", new Node().value(5)))); - contracts.put("counterObserver", directWorkflowMatching("counterUpdates", - new Node().type("Document Update"), - triggerEventStep(chatMessageEvent("counter updated")))); - contracts.put("nameObserver", directWorkflowMatching("nameUpdates", - new Node().type("Document Update"), - triggerEventStep(chatMessageEvent("name updated")))); - Node document = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertContainsChatMessage(result.triggeredEvents(), "counter updated"); - assertNoChatMessage(result.triggeredEvents(), "name updated"); - } - - @Test - void nestedUpdatesPropagateToParentWatchers() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("profileUpdates", documentUpdateChannel("/profile")); - contracts.put("writer", directWorkflow("owner", - updateDocumentStep("replace", "/profile/name", new Node().value("Ada")))); - contracts.put("observer", directWorkflowMatching("profileUpdates", - new Node().type("Document Update"), - computeAppendChatMessageStep(documentUpdateMessage()))); - Node document = document(fixture.repository, 0, contracts) - .properties("profile", new Node() - .properties("name", new Node().value("Grace"))); - Node initialized = initializedDocument(fixture, document); - - DocumentProcessingResult result = processChat(fixture, initialized, 1); - - assertEquals("Ada", result.document() - .getProperties().get("profile") - .getProperties().get("name") - .getValue()); - assertContainsChatMessage(result.triggeredEvents(), "updated /profile/name from Grace to Ada"); - } - - @Test - void updateEventCanBeMatchedMoreSpecifically() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("allUpdates", documentUpdateChannel("/")); - contracts.put("writer", directWorkflow("owner", - updateDocumentStep("replace", "/counter", new Node().value(5)), - updateDocumentStep("add", "/other", new Node().value(9)))); - contracts.put("observer", directWorkflowMatching("allUpdates", - new Node() - .type("Document Update") - .properties("path", new Node().value("/counter")) - .properties("op", new Node().value("replace")), - triggerEventStep(chatMessageEvent("specific replace")))); - Node document = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertEquals(BigInteger.valueOf(5), result.document().get("/counter")); - assertEquals(BigInteger.valueOf(9), result.document().get("/other")); - assertSingleChatMessage(result.triggeredEvents(), "specific replace"); - } - - @Test - void embeddedChildProcessesExternalEventWithRealProcessEmbeddedType() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, embeddedOperationDocument(fixture.repository)); - - DocumentProcessingResult result = fixture.blue.processDocument(document, - operationRequestEvent(fixture, 1, "increment", new Node().value(7))); - - assertEquals(BigInteger.valueOf(100), result.document().get("/counter")); - assertEquals(BigInteger.valueOf(7), result.document().get("/child/counter")); - } - - @Test - void parentCannotPatchIntoEmbeddedScope() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("embedded", processEmbedded("/child")); - contracts.put("writer", directWorkflow("owner", - updateDocumentStep("replace", "/child/counter", new Node().value(99)))); - Node document = initializedDocument(fixture, document(fixture.repository, 0, contracts) - .properties("child", childDocument(1, new LinkedHashMap()))); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertEquals(BigInteger.valueOf(1), result.document().get("/child/counter")); - assertEquals("fatal", result.document().get("/contracts/terminated/cause")); - } - - @Test - void replacingEmbeddedNodeCutsOffChildScopeWithinRun() { - Fixture fixture = configuredFixture(); - Map childContracts = ownerChannelContracts(); - childContracts.put("probe", directWorkflow("owner", - triggerEventStep(chatMessageEvent("pre-cutoff")), - updateDocumentStep("replace", "/marker", new Node().value(1)), - triggerEventStep(chatMessageEvent("post-cutoff")))); - - Map rootContracts = ownerChannelContracts(); - rootContracts.put("embedded", processEmbedded("/child")); - rootContracts.put("childUpdates", documentUpdateChannel("/child/marker")); - rootContracts.put("cutChild", directWorkflowMatching("childUpdates", - new Node().type("Document Update"), - updateDocumentStep("replace", "/child", new Node() - .name("Replacement Child") - .properties("counter", new Node().value(0))))); - Node document = initializedDocument(fixture, document(fixture.repository, 0, rootContracts) - .properties("child", childDocument(0, childContracts))); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertEquals("Replacement Child", nodeAt(result.document(), "/child").getName()); - assertNull(nodeAt(result.document(), "/child/marker")); - assertNoChatMessage(result.triggeredEvents(), "post-cutoff"); - } - - @Test - void embeddedNodeChannelBridgesConfiguredChildEmissions() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, embeddedBridgeDocument(fixture.repository, "/child")); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertContainsChatMessage(result.triggeredEvents(), "parent saw child emitted"); - assertNoChatMessage(result.triggeredEvents(), "parent saw other child emitted"); - } - - @Test - void embeddedNodeChannelDoesNotBridgeWrongChildPath() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, embeddedBridgeDocument(fixture.repository, "/missingChild")); - - DocumentProcessingResult result = processChat(fixture, document, 1); - - assertNoChatMessage(result.triggeredEvents(), "parent saw child emitted"); - assertNoChatMessage(result.triggeredEvents(), "parent saw other child emitted"); - } - - @Test - void duplicateExternalEventsAreSkippedWithRealRepositoryChannelCheckpointShape() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("writer", directWorkflow("owner", - computePatchStep("replace", "/counter", bexAdd(bexDocument("/counter"), new Node().value(1))))); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - Node event = chatTimelineEntry(fixture, 1); - - Node afterFirst = fixture.blue.processDocument(initialized, event).document(); - Node afterSecond = fixture.blue.processDocument(afterFirst, event).document(); - - assertEquals(BigInteger.ONE, afterSecond.get("/counter")); - Node checkpoint = nodeAt(afterSecond, "/contracts/checkpoint"); - assertNotNull(checkpoint); - assertNotNull(nodeAt(checkpoint, "/lastEvents/owner")); - } - - @Test - void checkpointDeclaredUnderWrongKeyFails() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - contracts.put("wrongCheckpoint", new Node().type("Channel Event Checkpoint")); - - IllegalStateException ex = assertThrows(IllegalStateException.class, - () -> fixture.blue.initializeDocument(fixture.blue.preprocess(document(fixture.repository, 0, contracts)))); - - assertTrue(ex.getMessage().contains("Channel Event Checkpoint")); - } - - @Test - void multipleCheckpointMarkersInOneScopeFail() { - Fixture fixture = configuredFixture(); - Map contracts = ownerChannelContracts(); - Node initialized = initializedDocument(fixture, document(fixture.repository, 0, contracts)); - initialized.getContracts().properties("checkpoint", new Node() - .type(new Node().blueId(RuntimeBlueIds.CHANNEL_EVENT_CHECKPOINT)) - .properties("lastEvents", new Node().properties(new LinkedHashMap()))); - initialized.getContracts().properties("extraCheckpoint", new Node() - .type(new Node().blueId(RuntimeBlueIds.CHANNEL_EVENT_CHECKPOINT))); - - assertThrows(RuntimeException.class, - () -> fixture.blue.processDocument(fixture.blue.preprocess(initialized), chatTimelineEntry(fixture, 1))); - } - - private static Node embeddedOperationDocument(BlueRepository repository) { - Map childContracts = ownerChannelContracts(); - childContracts.put("increment", sequentialWorkflowOperation("owner", - computePatchStep("replace", "/counter", - bexAdd(bexBinding("event", "/message/request"), bexDocument("/counter"))))); - - Map rootContracts = new LinkedHashMap(); - rootContracts.put("embedded", processEmbedded("/child")); - return document(repository, 100, rootContracts) - .properties("child", childDocument(0, childContracts)); - } - - private static Node embeddedBridgeDocument(BlueRepository repository, String childPath) { - Map childContracts = ownerChannelContracts(); - childContracts.put("emit", directWorkflow("owner", triggerEventStep(chatMessageEvent("child emitted")))); - - Map otherChildContracts = ownerChannelContracts(); - otherChildContracts.put("emit", directWorkflow("owner", triggerEventStep(chatMessageEvent("other child emitted")))); - - Map rootContracts = ownerChannelContracts(); - rootContracts.put("embedded", new Node() - .type("Process Embedded") - .properties("paths", new Node().items( - new Node().value("/child"), - new Node().value("/otherChild")))); - rootContracts.put("embeddedEvents", new Node() - .type("Embedded Node Channel") - .properties("childPath", new Node().value(childPath))); - rootContracts.put("childObserver", directWorkflowMatching("embeddedEvents", - new Node() - .type("Coordination/Chat Message") - .properties("message", new Node().value("child emitted")), - triggerEventStep(chatMessageEvent("parent saw child emitted")))); - rootContracts.put("otherChildObserver", directWorkflowMatching("embeddedEvents", - new Node() - .type("Coordination/Chat Message") - .properties("message", new Node().value("other child emitted")), - triggerEventStep(chatMessageEvent("parent saw other child emitted")))); - return document(repository, 0, rootContracts) - .properties("child", childDocument(0, childContracts)) - .properties("otherChild", childDocument(0, otherChildContracts)); - } - - private static Map ownerChannelContracts() { - Map contracts = new LinkedHashMap(); - contracts.put("owner", TestTimelineProvider.channel("owner")); - return contracts; - } - - private static Node documentUpdateChannel(String path) { - return new Node() - .type("Document Update Channel") - .properties("path", new Node().value(path)); - } - - private static Node processEmbedded(String path) { - return new Node() - .type("Process Embedded") - .properties("paths", new Node().items(new Node().value(path))); - } - - private static Node sequentialWorkflowOperation(String channel, Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value(channel)) - .properties("request", new Node().type("Integer")) - .properties("steps", new Node().items(steps)); - } - - private static Node directWorkflow(String channel, Node... steps) { - Node workflow = new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items(steps)); - return workflow; - } - - private static Node directWorkflowMatching(String channel, Node event, Node... steps) { - Node workflow = new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items(steps)); - workflow.properties("event", event); - return workflow; - } - - private static Node updateDocumentStep(String op, String path, Node value) { - return new Node() - .type("Coordination/Update Document") - .properties("changeset", new Node().items(new Node() - .properties("op", new Node().value(op)) - .properties("path", new Node().value(path)) - .properties("val", value))); - } - - private static Node triggerEventStep(Node event) { - return new Node() - .type("Coordination/Trigger Event") - .properties("event", event); - } - - private static Node computePatchStep(String op, String path, Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendChange", new Node() - .properties("op", new Node().value(op)) - .properties("path", new Node().value(path)) - .properties("val", value)), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node computeAppendChatMessageStep(Node message) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendEvent", chatMessageBexEvent(message)), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node chatMessageEvent(String message) { - return new Node() - .type("Coordination/Chat Message") - .properties("message", new Node().value(message)); - } - - private static Node chatMessageBexEvent(Node message) { - return new Node().properties("$merge", new Node().items( - new Node().properties("type", new Node().value("Coordination/Chat Message")), - new Node().properties("message", message))); - } - - private static Node documentUpdateMessage() { - return bexConcat( - new Node().value("updated "), - bexBinding("event", "/path"), - new Node().value(" from "), - bexText(bexBinding("event", "/before")), - new Node().value(" to "), - bexText(bexBinding("event", "/after"))); - } - - private static Node bexAdd(Node... values) { - return new Node().properties("$add", new Node().items(values)); - } - - private static Node bexConcat(Node... values) { - return new Node().properties("$concat", new Node().items(values)); - } - - private static Node bexText(Node value) { - return new Node().properties("$text", value); - } - - private static Node bexDocument(String path) { - return new Node().properties("$document", new Node().value(path)); - } - - private static Node bexBinding(String name, String path) { - return new Node().properties("$binding", new Node().value(name + path)); - } - - private static Node childDocument(int counter, Map contracts) { - Node child = new Node() - .name("Child") - .properties("counter", new Node().value(counter)); - if (!contracts.isEmpty()) { - child.properties("contracts", new Node().properties(contracts)); - } - return child; - } - - private static Node document(BlueRepository repository, int counter, Map contracts) { - return new Node() - .blue(repository.typeAliasBlue()) - .name("Runtime Channel Test") - .properties("counter", new Node().value(counter)) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node initializedDocument(Fixture fixture, Node document) { - return fixture.blue.initializeDocument(fixture.blue.preprocess(document)).document(); - } - - private static DocumentProcessingResult processChat(Fixture fixture, Node document, int timestamp) { - return fixture.blue.processDocument(document, chatTimelineEntry(fixture, timestamp)); - } - - private static Node chatTimelineEntry(Fixture fixture, int timestamp) { - return TestTimelineProvider.timelineEntry( - fixture.blue, fixture.repository, "owner", timestamp, chatMessageEvent("run")); - } - - private static Node operationRequestEvent(Fixture fixture, - int timestamp, - String operation, - Node request) { - Node operationRequest = new Node() - .type("Coordination/Operation Request") - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value("owner")) - .properties("request", request); - return TestTimelineProvider.timelineEntry( - fixture.blue, fixture.repository, "owner", timestamp, operationRequest); - } - - private static Node nodeAt(Node node, String pointer) { - try { - Object value = node.get(pointer); - return value instanceof Node ? (Node) value : null; - } catch (IllegalArgumentException ex) { - return null; - } - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static void assertSingleChatMessage(List events, String expectedMessage) { - int count = 0; - for (Node event : events) { - if (isChatMessage(event, expectedMessage)) { - count++; - } - } - assertEquals(1, count, "Expected exactly one chat message: " + expectedMessage); - } - - private static void assertContainsChatMessage(List events, String expectedMessage) { - for (Node event : events) { - if (isChatMessage(event, expectedMessage)) { - return; - } - } - assertFalse(true, "Expected chat message: " + expectedMessage); - } - - private static void assertNoChatMessage(List events, String message) { - for (Node event : events) { - assertFalse(isChatMessage(event, message), "Unexpected chat message: " + message); - } - } - - private static boolean isChatMessage(Node event, String message) { - try { - return message.equals(event.get("/message")); - } catch (IllegalArgumentException ex) { - return false; - } - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/SelectedWorkflowBodyLocalityTest.java b/src/test/java/blue/coordination/processor/SelectedWorkflowBodyLocalityTest.java new file mode 100644 index 0000000..c53124d --- /dev/null +++ b/src/test/java/blue/coordination/processor/SelectedWorkflowBodyLocalityTest.java @@ -0,0 +1,171 @@ +package blue.coordination.processor; + +import blue.language.api.BlueCachePolicy; +import blue.language.merge.ResolvedSnapshot; +import blue.language.identity.DirectBlueIdCalculator; +import blue.language.model.Node; +import blue.language.processor.DocumentProcessingResult; +import blue.language.processor.ExternalDeliveryPlan; +import blue.language.processor.ExternalOrderKey; +import blue.language.processor.PlatformProcessInvocation; +import blue.language.processor.PlatformProcessingResult; +import blue.language.processor.ProcessorStatus; +import blue.language.processor.SubscriptionDelta; +import blue.language.provider.NodeProvider; +import blue.repo.BlueRepository; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +/** Release gate: one PROCESS opens only its selected exact workflow body. */ +final class SelectedWorkflowBodyLocalityTest { + + @Test + void processReadsOnlyTheSelectedWorkflowBodyByExactBlueId() { + RecordingBodyProvider bodies = new RecordingBodyProvider(); + try (CoordinationTestRuntime runtime = CoordinationTestRuntime.create( + BlueRepository.current(), + bodies, + BlueCachePolicy.boundedDefaults())) { + ExactBody selected = body(runtime, """ + - type: Coordination/Compute + do: + - $appendChange: + op: replace + path: /counter + val: 1 + - $return: true + """); + ExactBody rejected = body(runtime, """ + - type: Coordination/Compute + do: + - $return: true + """); + bodies.put(selected); + bodies.put(rejected); + DocumentProcessingResult initialized = runtime.initializeDocument( + runtime.yamlToNode(document( + selected.blueId(), rejected.blueId()))); + assertEquals(ProcessorStatus.SUCCESS, initialized.status()); + ExternalOrderKey activation = ExternalOrderKey.of(List.of(0L)); + SubscriptionDelta initial = runtime.contracts() + .subscriptionSurfaceProjection().projectInitial( + initialized.document(), 0L, activation); + Node event = runtime.yamlToNode(selectedEvent()); + ExternalOrderKey eventOrder = ExternalOrderKey.of(List.of( + 1_700_000_000_000_000L, + "gate/selected", + DirectBlueIdCalculator.calculateBlueId(event))); + + runtime.clearResolvedSnapshotCache(); + bodies.resetReads(); + ExternalDeliveryPlan plan = runtime.contracts() + .currentRootDeliveryPlanDeriver( + 0L, eventOrder, initial.added()) + .derive(initialized.document(), event); + PlatformProcessingResult processed = runtime.contracts() + .processForPlatformCommit( + initialized.document(), + event, + PlatformProcessInvocation.builder() + .deliveryPlan(plan) + .nodeProvider(runtime.nodeProvider()) + .build()); + + assertEquals(ProcessorStatus.SUCCESS, + processed.processResult().status()); + assertEquals(BigInteger.ONE, processed.processResult().document() + .getProperties().get("counter").getValue()); + assertEquals(List.of(selected.blueId()), bodies.bodyReads()); + assertEquals(1, plan.deliveries().size()); + assertEquals("selectedChannel", + plan.deliveries().get(0).channelKey()); + assertFalse(bodies.bodyReads().contains(rejected.blueId())); + } + } + + private static ExactBody body( + CoordinationTestRuntime runtime, + String yaml) { + ResolvedSnapshot snapshot = runtime.resolveToSnapshot( + runtime.yamlToNode(yaml)); + return new ExactBody( + snapshot.blueId(), snapshot.frozenCanonicalRoot().toNode()); + } + + private static String document(String selected, String rejected) { + return """ + counter: 0 + contracts: + selectedChannel: + type: Coordination/Timeline Channel + timeline: {type: MyOS/MyOS Timeline, timelineId: gate/selected} + actor: {type: MyOS/Principal Actor, accountId: alice} + rejectedChannel: + type: Coordination/Timeline Channel + timeline: {type: MyOS/MyOS Timeline, timelineId: gate/rejected} + actor: {type: MyOS/Principal Actor, accountId: bob} + selected: + type: Coordination/Sequential Workflow Operation + channel: selectedChannel + request: {} + steps: {blueId: %s} + rejected: + type: Coordination/Sequential Workflow Operation + channel: rejectedChannel + request: {} + steps: {blueId: %s} + """.formatted(selected, rejected); + } + + private static String selectedEvent() { + return """ + type: Coordination/Timeline Entry + timeline: {type: MyOS/MyOS Timeline, timelineId: gate/selected} + timestamp: 1700000000000000 + actor: {type: MyOS/Principal Actor, accountId: alice} + message: + type: Coordination/Operation Request + operation: selected + channel: selectedChannel + request: {} + """; + } + + private record ExactBody(String blueId, Node node) { + } + + private static final class RecordingBodyProvider implements NodeProvider { + private final Map bodies = new LinkedHashMap<>(); + private final List reads = new ArrayList<>(); + + private void put(ExactBody body) { + bodies.put(body.blueId(), body.node()); + } + + private void resetReads() { + reads.clear(); + } + + private List bodyReads() { + return List.copyOf(reads); + } + + @Override + public List fetchByBlueId(String blueId) { + Node body = bodies.get(blueId); + if (body == null) { + return null; + } + reads.add(blueId); + return List.of(body.clone()); + } + } +} diff --git a/src/test/java/blue/coordination/processor/SequentialWorkflowExecutionTest.java b/src/test/java/blue/coordination/processor/SequentialWorkflowExecutionTest.java deleted file mode 100644 index 7cfb201..0000000 --- a/src/test/java/blue/coordination/processor/SequentialWorkflowExecutionTest.java +++ /dev/null @@ -1,737 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.coordination.processor.workflow.StepExecutionContext; -import blue.coordination.processor.workflow.UpdateDocumentStepExecutor; -import blue.coordination.processor.workflow.WorkflowStepExecutor; -import blue.coordination.processor.workflow.WorkflowStepResult; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.SequentialWorkflowStep; -import blue.repo.coordination.TriggerEvent; -import blue.repo.coordination.UpdateDocument; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class SequentialWorkflowExecutionTest { - - @Test - void sequentialWorkflowOperationDerivesAndMatchesOperationRequest() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterDocument(fixture.repository, 0, true)); - - Node processed = processOperationRequest(fixture, document, "owner", 1, "increment", 7); - - assertCounter(processed, 7); - } - - @Test - void wrongOperationDoesNotRun() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterDocument(fixture.repository, 0, false)); - - Node processed = processOperationRequest(fixture, document, "owner", 1, "decrement", 7); - - assertCounter(processed, 0); - } - - @Test - void wrongRequestTypeDoesNotRun() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterDocument(fixture.repository, 0, true)); - - Node event = operationRequestEvent(fixture, "owner", 1, "increment", new Node().value("text")); - Node processed = fixture.blue.processDocument(document, event).document(); - - assertCounter(processed, 0); - } - - @Test - void duplicateRequestDoesNotRunTwice() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterDocument(fixture.repository, 0, true)); - Node event = operationRequestEvent(fixture, "owner", 1, "increment", new Node().value(7)); - - Node afterFirst = fixture.blue.processDocument(document, event).document(); - Node afterSecond = fixture.blue.processDocument(afterFirst, event).document(); - - assertCounter(afterSecond, 7); - } - - @Test - void newerRequestRunsAfterPreviousRequest() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterDocument(fixture.repository, 0, true)); - Node afterFirst = processOperationRequest(fixture, document, "owner", 1, "increment", 7); - assertEquals(BigInteger.ONE, - afterFirst.get("/contracts/checkpoint/lastEvents/ownerChannel/timestamp")); - - Node afterSecond = processOperationRequest(fixture, afterFirst, "owner", 2, "increment", 5); - - assertEquals(BigInteger.valueOf(2), - afterSecond.get("/contracts/checkpoint/lastEvents/ownerChannel/timestamp")); - assertCounter(afterSecond, 12); - } - - @Test - void decrementComputeWorks() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterDocument(fixture.repository, 10, true)); - - Node processed = processOperationRequest(fixture, document, "owner", 1, "decrement", 3); - - assertCounter(processed, 7); - } - - @Test - void multipleComputeStepsSeePreviousStepState() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, doubleIncrementDocument(fixture.repository)); - - Node processed = processOperationRequest(fixture, document, "owner", 1, "increment", 2); - - assertCounter(processed, 4); - } - - @Test - void directSequentialWorkflowExecutesUpdateDocument() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository)); - Node event = chatTimelineEntry(fixture, "owner", 1, "run"); - - Node processed = fixture.blue.processDocument(document, event).document(); - - assertCounter(processed, 5); - } - - @Test - void unsupportedStepFailsExplicitly() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, unsupportedStepDocument(fixture.repository)); - Node event = chatTimelineEntry(fixture, "owner", 1, "run"); - - DocumentProcessingResult result = fixture.blue.processDocument(document, event); - - assertRuntimeFatal(result, "Unsupported sequential workflow step"); - } - - @Test - void coordinationProcessorOptionsInjectsSequentialWorkflowRunner() { - WorkflowStepExecutor injectedExecutor = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof UpdateDocument; - } - - @Override - public WorkflowStepResult execute(UpdateDocument step, StepExecutionContext context) { - context.processorContext().throwFatal("injected runner"); - return WorkflowStepResult.none(); - } - }; - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Arrays.>asList( - injectedExecutor)); - CoordinationProcessorOptions options = CoordinationProcessorOptions.builder() - .sequentialWorkflowRunner(runner) - .build(); - Fixture fixture = configuredCoordinationFixture(options); - Node document = initializedDocument(fixture, staticUpdateDocument(fixture.repository, - 0, - new Node().value(1))); - - DocumentProcessingResult result = processOperationRequestResult(fixture, - document, - "owner", - 1, - "increment", - new Node().value(7)); - - assertRuntimeFatal(result, "injected runner"); - } - - @Test - void literalUpdateValuesPassThrough() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, staticUpdateDocument(fixture.repository, - 0, - new Node().properties("nested", new Node().value(true)))); - - Node processed = processOperationRequest(fixture, document, "owner", 1, "increment", 7); - - assertEquals(Boolean.TRUE, processed.get("/counter/nested")); - } - - @Test - void stepResultsAreCollected() { - final AtomicReference> seenResults = new AtomicReference>(); - WorkflowStepExecutor first = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof UpdateDocument; - } - - @Override - public WorkflowStepResult execute(UpdateDocument step, StepExecutionContext context) { - return WorkflowStepResult.value("a"); - } - }; - WorkflowStepExecutor second = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - seenResults.set(context.stepResults()); - return WorkflowStepResult.value("b"); - } - }; - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Arrays.>asList(first, second)); - Fixture fixture = configuredFixture(null, runner); - Node document = initializedDocument(fixture, stepResultsDocument(fixture.repository)); - Node event = chatTimelineEntry(fixture, "owner", 1, "run"); - - fixture.blue.processDocument(document, event); - - assertEquals(1, seenResults.get().size()); - assertEquals("a", seenResults.get().get("Step1")); - } - - @Test - void patchPathResolvesAgainstEmbeddedScope() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, embeddedScopeDocument(fixture.repository)); - Node event = operationRequestEvent(fixture, "owner", 1, "increment", new Node().value(7)); - - Node processed = fixture.blue.processDocument(document, event).document(); - - assertEquals(BigInteger.valueOf(100), processed.get("/counter")); - assertEquals(BigInteger.valueOf(7), processed.get("/child/counter")); - } - - @Test - void computeEventStepSeesUpdatedDocument() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - updateDocumentStep("replace", "/counter", new Node().value(5)), - computeAppendChatMessageStep(bexConcat(new Node().value("counter is "), bexText(bexDocument("/counter")))))); - - DocumentProcessingResult result = processChat(fixture, document, "owner", 1, "run"); - - assertCounter(result.document(), 5); - assertTriggeredChatMessage(result, "counter is 5"); - } - - @Test - void triggerEventStepEmitsEvent() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - triggerEventStep("Workflow finished"))); - - DocumentProcessingResult result = processChat(fixture, document, "owner", 1, "run"); - - assertTriggeredChatMessage(result, "Workflow finished"); - } - - @Test - void fullCounterWorkflowEmitsChatMessageWithTriggerEvent() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, counterWorkflowDocument(fixture.repository, - 0, - computeReplaceCounterStep(incrementValue()), - computeAppendChatMessageStep(bexConcat( - new Node().value("Counter was incremented by "), - bexBinding("event", "/message/request"), - new Node().value(" and is now "), - bexText(bexDocument("/counter")))))); - - DocumentProcessingResult result = processOperationRequestResult(fixture, - document, - "owner", - 1, - "increment", - new Node().value(7)); - - assertCounter(result.document(), 7); - assertTriggeredChatMessage(result, "Counter was incremented by 7 and is now 7"); - } - - @Test - void updateDocumentDoesNotCreateStepResult() { - final AtomicReference seenResultCount = new AtomicReference(); - WorkflowStepExecutor inspectStep = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - seenResultCount.set(context.stepResults().size()); - return WorkflowStepResult.none(); - } - }; - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Arrays.>asList( - new UpdateDocumentStepExecutor(), - inspectStep)); - Fixture fixture = configuredFixture(null, runner); - Node document = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - updateDocumentStep("replace", "/counter", new Node().value(3)), - triggerEventStep("ignored").name("Inspect"))); - - Node processed = processChat(fixture, document, "owner", 1, "run").document(); - - assertCounter(processed, 3); - assertEquals(Integer.valueOf(0), seenResultCount.get()); - } - - @Test - void nullStepResultIsPreserved() { - final AtomicReference sawNullResult = new AtomicReference(); - final AtomicReference firstCall = new AtomicReference(Boolean.TRUE); - WorkflowStepExecutor executor = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - if (Boolean.TRUE.equals(firstCall.get())) { - firstCall.set(Boolean.FALSE); - return WorkflowStepResult.value(null); - } - sawNullResult.set(context.stepResults().containsKey("MaybeNull") - && context.stepResults().get("MaybeNull") == null); - return WorkflowStepResult.none(); - } - }; - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Arrays.>asList( - executor)); - Fixture fixture = configuredFixture(null, runner); - Node document = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - triggerEventStep("ignored").name("MaybeNull"), - triggerEventStep("inspect").name("Inspect"))); - - Node processed = processChat(fixture, document, "owner", 1, "run").document(); - - assertCounter(processed, 0); - assertEquals(Boolean.TRUE, sawNullResult.get()); - } - - @Test - void workflowPlanReusesExactContractAndReplansChangedContract() { - AtomicInteger supportsCalls = new AtomicInteger(); - WorkflowStepExecutor executor = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - supportsCalls.incrementAndGet(); - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - return WorkflowStepResult.none(); - } - }; - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Arrays.>asList(executor)); - Fixture fixture = configuredFixture(null, runner); - - Node first = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - "same contract", - triggerEventStep("ignored"))); - Node afterFirst = processChat(fixture, first, "owner", 1, "run").document(); - processChat(fixture, afterFirst, "owner", 2, "run"); - Node equivalent = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - "same contract", - triggerEventStep("ignored"))); - processChat(fixture, equivalent, "owner", 1, "run"); - Node changed = initializedDocument(fixture, directWorkflowStepsDocument(fixture.repository, - 0, - "changed contract", - triggerEventStep("ignored"))); - processChat(fixture, changed, "owner", 1, "run"); - - assertEquals(2, supportsCalls.get()); - assertEquals(2, runner.workflowPlanCacheSize()); - assertTrue(runner.workflowPlanCacheWeightBytes() > 0L); - runner.clearCaches(); - assertEquals(0, runner.workflowPlanCacheSize()); - assertEquals(0L, runner.workflowPlanCacheWeightBytes()); - } - - private static Node processOperationRequest(Fixture fixture, - Node document, - String timelineId, - int timestamp, - String operation, - int request) { - return processOperationRequestResult(fixture, - document, - timelineId, - timestamp, - operation, - new Node().value(request)).document(); - } - - private static DocumentProcessingResult processOperationRequestResult(Fixture fixture, - Node document, - String timelineId, - int timestamp, - String operation, - Node request) { - Node event = operationRequestEvent(fixture, timelineId, timestamp, operation, request); - return fixture.blue.processDocument(document, event); - } - - private static DocumentProcessingResult processChat(Fixture fixture, - Node document, - String timelineId, - int timestamp, - String message) { - Node event = chatTimelineEntry(fixture, timelineId, timestamp, message); - return fixture.blue.processDocument(document, event); - } - - private static Node counterDocument(BlueRepository repository, int counter, boolean includeDecrement) { - Map contracts = baseOperationContracts(); - contracts.put("increment", sequentialWorkflowOperation("ownerChannel", - computeReplaceCounterStep(incrementValue()))); - if (includeDecrement) { - contracts.put("decrement", sequentialWorkflowOperation("ownerChannel", - computeReplaceCounterStep(decrementValue()))); - } - return document(repository, counter, contracts); - } - - private static Node counterWorkflowDocument(BlueRepository repository, int counter, Node... steps) { - Map contracts = baseOperationContracts(); - contracts.put("increment", sequentialWorkflowOperation("ownerChannel", steps)); - return document(repository, counter, contracts); - } - - private static Node staticUpdateDocument(BlueRepository repository, int counter, Node value) { - return staticUpdateDocument(repository, new Node().value(counter), value); - } - - private static Node staticUpdateDocument(BlueRepository repository, Node counter, Node value) { - Map contracts = baseOperationContracts(); - contracts.put("increment", sequentialWorkflowOperation("ownerChannel", - updateDocumentStep("replace", "/counter", value))); - return document(repository, counter, contracts); - } - - private static Node doubleIncrementDocument(BlueRepository repository) { - Map contracts = baseOperationContracts(); - contracts.put("increment", sequentialWorkflowOperation("ownerChannel", - computeReplaceCounterStep(incrementValue()), - computeReplaceCounterStep(incrementValue()))); - return document(repository, 0, contracts); - } - - private static Node directWorkflowDocument(BlueRepository repository) { - Map contracts = baseOperationContracts(); - contracts.put("direct", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("event", new Node() - .properties("message", new Node() - .properties("message", new Node().value("run")))) - .properties("steps", new Node().items( - updateDocumentStep("replace", "/counter", new Node().value(5))))); - return document(repository, 0, contracts); - } - - private static Node directWorkflowStepsDocument(BlueRepository repository, int counter, Node... steps) { - return directWorkflowStepsDocument(repository, counter, null, steps); - } - - private static Node directWorkflowStepsDocument(BlueRepository repository, - int counter, - String description, - Node... steps) { - Map contracts = baseOperationContracts(); - Node workflow = new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items(steps)); - if (description != null) { - workflow.description(description); - } - contracts.put("direct", workflow); - return document(repository, counter, contracts); - } - - private static Node unsupportedStepDocument(BlueRepository repository) { - Map contracts = baseOperationContracts(); - contracts.put("direct", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items(new Node() - .type("Coordination/Sequential Workflow Step")))); - return document(repository, 0, contracts); - } - - private static Node stepResultsDocument(BlueRepository repository) { - Map contracts = baseOperationContracts(); - contracts.put("direct", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items( - updateDocumentStep("replace", "/counter", new Node().value(1)), - triggerEventStep("ignored")))); - return document(repository, 0, contracts); - } - - private static Node embeddedScopeDocument(BlueRepository repository) { - Map childContracts = baseOperationContracts(); - childContracts.put("increment", sequentialWorkflowOperation("ownerChannel", - computeReplaceCounterStep(incrementValue()))); - - Map rootContracts = new LinkedHashMap<>(); - rootContracts.put("embedded", new Node() - .type("Process Embedded") - .properties("paths", new Node().items(new Node().value("/child")))); - - return new Node() - .blue(repository.typeAliasBlue()) - .name("Root") - .properties("counter", new Node().value(100)) - .properties("child", new Node() - .name("Child") - .properties("counter", new Node().value(0)) - .properties("contracts", new Node().properties(childContracts))) - .properties("contracts", new Node().properties(rootContracts)); - } - - private static Map baseOperationContracts() { - Map contracts = new LinkedHashMap<>(); - contracts.put("ownerChannel", TestTimelineProvider.channel("owner")); - return contracts; - } - - private static Node sequentialWorkflowOperation(String channel, Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value(channel)) - .properties("request", new Node().type("Integer")) - .properties("steps", new Node().items(steps)); - } - - private static Node updateDocumentStep(String op, String path, Node value) { - return new Node() - .type("Coordination/Update Document") - .properties("changeset", new Node().items(new Node() - .properties("op", new Node().value(op)) - .properties("path", new Node().value(path)) - .properties("val", value))); - } - - private static Node computeReplaceCounterStep(Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendChange", new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value("/counter")) - .properties("val", value)), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node incrementValue() { - return bexAdd(bexDocument("/counter"), bexBinding("event", "/message/request")); - } - - private static Node decrementValue() { - return bexSubtract(bexDocument("/counter"), bexBinding("event", "/message/request")); - } - - private static Node triggerEventStep(String message) { - return new Node() - .type("Coordination/Trigger Event") - .properties("event", new Node() - .type("Coordination/Chat Message") - .properties("message", new Node().value(message))); - } - - private static Node computeAppendChatMessageStep(Node message) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendEvent", new Node().properties("$merge", new Node().items( - new Node().properties("type", new Node().value("Coordination/Chat Message")), - new Node().properties("message", message)))), - new Node().properties("$return", new Node().value(true)))); - } - - private static Node bexAdd(Node... values) { - return new Node().properties("$add", new Node().items(values)); - } - - private static Node bexSubtract(Node... values) { - return new Node().properties("$subtract", new Node().items(values)); - } - - private static Node bexConcat(Node... values) { - return new Node().properties("$concat", new Node().items(values)); - } - - private static Node bexText(Node value) { - return new Node().properties("$text", value); - } - - private static Node bexDocument(String path) { - return new Node().properties("$document", new Node().value(path)); - } - - private static Node bexBinding(String name, String path) { - return new Node().properties("$binding", new Node().value(name + path)); - } - - private static Node document(BlueRepository repository, int counter, Map contracts) { - return document(repository, new Node().value(counter), contracts); - } - - private static Node document(BlueRepository repository, Node counter, Map contracts) { - return new Node() - .blue(repository.typeAliasBlue()) - .name("Counter") - .properties("counter", counter) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node operationRequestEvent(Fixture fixture, - String timelineId, - int timestamp, - String operation, - Node request) { - Node operationRequest = new Node() - .type("Coordination/Operation Request") - .properties("operation", new Node().value(operation)) - .properties("channel", new Node().value("ownerChannel")) - .properties("request", request); - return TestTimelineProvider.timelineEntry( - fixture.blue, fixture.repository, timelineId, timestamp, operationRequest); - } - - private static Node chatTimelineEntry(Fixture fixture, String timelineId, int timestamp, String message) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - timelineId, - timestamp, - TestTimelineProvider.chatMessage(message)); - } - - private static Node initializedDocument(Fixture fixture, Node document) { - DocumentProcessingResult result = fixture.blue.initializeDocument(fixture.blue.preprocess(document)); - return result.document(); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static Fixture configuredFixture(CoordinationProcessorOptions options) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, options); - return new Fixture(repository, blue); - } - - private static Fixture configuredCoordinationFixture(CoordinationProcessorOptions options) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, options); - return new Fixture(repository, blue); - } - - private static Fixture configuredFixture(SequentialWorkflowRunner operationRunner, - SequentialWorkflowRunner directRunner) { - Fixture fixture = configuredFixture(); - if (operationRunner != null) { - fixture.blue.registerContractProcessor(new SequentialWorkflowOperationProcessor(operationRunner)); - } - if (directRunner != null) { - fixture.blue.registerContractProcessor(new SequentialWorkflowProcessor(directRunner)); - } - return fixture; - } - - private static void assertCounter(Node document, int expected) { - assertEquals(BigInteger.valueOf(expected), document.get("/counter")); - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null && result.failureReason().contains(expectedMessage), - result.failureReason()); - } - - private static void assertTriggeredChatMessage(DocumentProcessingResult result, String expectedMessage) { - for (Node event : result.triggeredEvents()) { - if (isChatMessage(event) - && expectedMessage.equals(event.get("/message"))) { - return; - } - } - throw new AssertionError("Expected triggered chat message: " + expectedMessage - + " in " + result.triggeredEvents()); - } - - private static boolean isChatMessage(Node event) { - if (event == null) { - return false; - } - Node type = event.getType(); - if (type != null) { - return ChatMessage.qualifiedName().equals(type.getValue()) - || ChatMessage.blueId().equals(type.getBlueId()); - } - if (event.getProperties() == null) { - return false; - } - Node typeProperty = event.getProperties().get("type"); - Object value = typeProperty != null ? typeProperty.getValue() : null; - return ChatMessage.qualifiedName().equals(value) || ChatMessage.typeName().equals(value); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/Task9PublishedArtifactTest.java b/src/test/java/blue/coordination/processor/Task9PublishedArtifactTest.java deleted file mode 100644 index 46d6fcd..0000000 --- a/src/test/java/blue/coordination/processor/Task9PublishedArtifactTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package blue.coordination.processor; - -import blue.language.model.Node; -import blue.repo.BlueRepository; -import blue.repo.RepositoryDefinition; -import blue.repo.coordination.Compute; -import blue.repo.coordination.SequentialWorkflowStep; -import blue.repo.coordination.TerminateProcessing; -import blue.repo.mandate.Mandate; -import blue.repo.types.CoordinationTypes; - -import org.junit.jupiter.api.Test; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class Task9PublishedArtifactTest { - private static final String REPOSITORY_AGGREGATE = - "DPkjPHvEASr115BcLA4CMXRYKaJRAfmqTyodkndGJ4FY"; - private static final String TERMINATE_PROCESSING_BLUE_ID = - "DacNQ6C6PgsEiE4QfUHmaWBztpEvo2YyXxUcP86ze77w"; - private static final String CONTRACTS_FIXTURE_IDENTITY = - "sha256:013ad328449a15ae2ff969f4bcb308db7413ffe8138b5309e7a9fe342723fcf3"; - - @Test - void repositoryRc10ContainsGeneratedTerminateProcessingContract() { - BlueRepository repository = BlueRepository.latest(); - RepositoryDefinition definition = repository.definition(TerminateProcessing.qualifiedName()) - .orElseThrow(() -> new AssertionError("Terminate Processing manifest entry is missing")); - - assertEquals(REPOSITORY_AGGREGATE, repository.repositoryVersionBlueId()); - assertEquals(TERMINATE_PROCESSING_BLUE_ID, TerminateProcessing.blueId()); - assertEquals(TERMINATE_PROCESSING_BLUE_ID, definition.blueId()); - assertEquals("blue/repo/definitions/Coordination/TerminateProcessing.json", - definition.resourcePath()); - assertEquals(CoordinationTypes.TERMINATE_PROCESSING, TerminateProcessing.repositoryType()); - assertTrue(SequentialWorkflowStep.class.isAssignableFrom(TerminateProcessing.class)); - assertEquals("static", new TerminateProcessing().reason("static").getReason()); - assertNotNull(Task9PublishedArtifactTest.class.getClassLoader() - .getResource(definition.resourcePath())); - } - - @Test - void generatedMandateUsesOneComputeStepPropagatingTerminationReason() { - Node mandate = BlueRepository.latest().nodeByBlueId(Mandate.blueId()) - .orElseThrow(() -> new AssertionError("Published Mandate definition is missing")); - Node steps = mandate.getAsNode("/contracts/applyMandateTermination/steps"); - - assertEquals(1, steps.getItems().size()); - assertEquals(Compute.blueId(), steps.getItems().get(0).getType().getBlueId()); - assertEquals("terminationReason", mandate.get( - "/contracts/mandateLifecycleDefinition/functions/applyMandateTermination/do/2/$return/termination/reason/$var")); - } - - @Test - void publishedLanguageAdvertisesReviewedContractsFixtureIdentity() throws IOException { - String manifest = resourceText("registry/blue-contracts-1.0/manifest.yaml"); - - assertTrue(manifest.contains( - "conformanceFixturePackageIdentity: \"" + CONTRACTS_FIXTURE_IDENTITY + "\"")); - } - - private static String resourceText(String path) throws IOException { - InputStream stream = Task9PublishedArtifactTest.class.getClassLoader().getResourceAsStream(path); - assertNotNull(stream, "Missing published resource " + path); - try (InputStream input = stream; ByteArrayOutputStream output = new ByteArrayOutputStream()) { - byte[] buffer = new byte[4096]; - int read; - while ((read = input.read(buffer)) != -1) { - output.write(buffer, 0, read); - } - return new String(output.toByteArray(), StandardCharsets.UTF_8); - } - } -} diff --git a/src/test/java/blue/coordination/processor/TestTimelineProvider.java b/src/test/java/blue/coordination/processor/TestTimelineProvider.java deleted file mode 100644 index 631b258..0000000 --- a/src/test/java/blue/coordination/processor/TestTimelineProvider.java +++ /dev/null @@ -1,117 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelCheckpointContext; -import blue.language.processor.ChannelEvaluation; -import blue.language.processor.ChannelEvaluationContext; -import blue.language.processor.ChannelProcessor; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineChannel; -import blue.repo.coordination.TimelineEntry; -import blue.repo.myos.PrincipalActor; - -import java.math.BigInteger; - -public final class TestTimelineProvider { - private TestTimelineProvider() { - } - - public static Blue registerWith(Blue blue) { - blue.registerContractProcessor(TimelineChannel.blueId(), new SimpleTimelineChannelProcessor()); - return blue; - } - - public static Node channel(String timelineId) { - return channel(timelineId, timelineId); - } - - public static Node channel(String timelineId, String actorId) { - Node channel = new Node().type(TimelineChannel.qualifiedName()); - if (timelineId != null) { - channel.properties("timeline", new Node() - .type(Timeline.qualifiedName()) - .properties("providerId", new Node().value("test-provider")) - .properties("timelineId", new Node().value(timelineId))); - } - if (actorId != null) { - channel.properties("actor", new Node() - .type(PrincipalActor.qualifiedName()) - .properties("accountId", new Node().value(actorId))); - } - return channel; - } - - public static Node timelineEntry(Blue blue, - BlueRepository repository, - String timelineId, - int timestamp, - Node message) { - return timelineEntry(blue, - repository, - timelineId, - timelineId, - BigInteger.valueOf(timestamp), - message); - } - - public static Node timelineEntry(Blue blue, - BlueRepository repository, - String timelineId, - String actorId, - BigInteger timestamp, - Node message) { - TimelineEntry entry = new TimelineEntry() - .timeline(new Timeline().timelineId(timelineId)) - .actor(new PrincipalActor().accountId(actorId)) - .timestamp(timestamp); - - Node event = blue.objectToNode(entry) - .properties("timestamp", new Node().value(timestamp)) - .properties("message", message) - .blue(repository.typeAliasBlue()); - return blue.preprocess(event).blue(null); - } - - public static Node timelineEntryWithProviderSequence(Blue blue, - BlueRepository repository, - String timelineId, - String actorId, - BigInteger providerSequence, - BigInteger timestamp, - Node message) { - return timelineEntry(blue, repository, timelineId, actorId, timestamp, message) - .properties("sequence", new Node().value(providerSequence)); - } - - public static Node chatMessage(String message) { - ChatMessage chatMessage = new ChatMessage().message(message); - return new Node() - .type(ChatMessage.qualifiedName()) - .properties("message", new Node().value(chatMessage.getMessage())); - } - - public static final class SimpleTimelineChannelProcessor implements ChannelProcessor { - @Override - public Class contractType() { - return TimelineChannel.class; - } - - @Override - public ChannelEvaluation evaluate(TimelineChannel contract, ChannelEvaluationContext context) { - return TimelineProviderSupport.evaluateTimelineEntry(contract, context); - } - - @Override - public String eventId(TimelineChannel contract, ChannelEvaluationContext context) { - return TimelineProviderSupport.eventId(context.event()); - } - - @Override - public boolean isNewerEvent(TimelineChannel contract, ChannelCheckpointContext context) { - return TimelineProviderSupport.isNewerOrSameTimelineEvent(context); - } - } -} diff --git a/src/test/java/blue/coordination/processor/TimelineChannelBindingMatchingTest.java b/src/test/java/blue/coordination/processor/TimelineChannelBindingMatchingTest.java deleted file mode 100644 index 0d43998..0000000 --- a/src/test/java/blue/coordination/processor/TimelineChannelBindingMatchingTest.java +++ /dev/null @@ -1,287 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelEvaluation; -import blue.language.processor.ChannelEvaluationContextFactory; -import blue.language.processor.model.ChannelContract; -import blue.language.processor.model.MarkerContract; -import blue.repo.BlueRepository; -import blue.repo.coordination.Actor; -import blue.repo.coordination.AllTimelinesChannel; -import blue.repo.coordination.CompositeTimelineChannel; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineChannel; -import blue.repo.coordination.TimelineEntry; -import blue.repo.myos.MyOSAgentActor; -import blue.repo.myos.PrincipalActor; -import blue.repo.myos.MyOSTimeline; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class TimelineChannelBindingMatchingTest { - private static final String TIMELINE = "owner-timeline"; - private static final String ACTOR = "owner-account"; - private static final TimelineChannelProcessor TIMELINE_PROCESSOR = new TimelineChannelProcessor(); - - @Test - void matchingTimelineAndActorAccepts() { - Fixture fixture = configuredFixture(); - - ChannelEvaluation evaluation = evaluateTimeline( - channel(TIMELINE, ACTOR), - resolvedEvent(fixture, TIMELINE, ACTOR)); - - assertTrue(evaluation.matches()); - } - - @Test - void differentTimelineRejects() { - Fixture fixture = configuredFixture(); - - ChannelEvaluation evaluation = evaluateTimeline( - channel(TIMELINE, ACTOR), - resolvedEvent(fixture, "different-timeline", ACTOR)); - - assertFalse(evaluation.matches()); - } - - @Test - void differentActorRejects() { - Fixture fixture = configuredFixture(); - - ChannelEvaluation evaluation = evaluateTimeline( - channel(TIMELINE, ACTOR), - resolvedEvent(fixture, TIMELINE, "different-account")); - - assertFalse(evaluation.matches()); - } - - @Test - void missingFixedTimelineFieldRejects() { - Fixture fixture = configuredFixture(); - Node event = resolvedEvent(fixture, TIMELINE, ACTOR); - event.getAsNode("/timeline").getProperties().remove("timelineId"); - - assertFalse(evaluateTimeline(channel(TIMELINE, ACTOR), event).matches()); - } - - @Test - void missingFixedActorFieldRejects() { - Fixture fixture = configuredFixture(); - Node event = resolvedEvent(fixture, TIMELINE, ACTOR); - event.getAsNode("/actor").getProperties().remove("accountId"); - - assertFalse(evaluateTimeline(channel(TIMELINE, ACTOR), event).matches()); - } - - @Test - void additionalTimelineFieldsDoNotReject() { - Fixture fixture = configuredFixture(); - MyOSTimeline configuredTimeline = new MyOSTimeline(); - configuredTimeline.timelineId(TIMELINE); - MyOSTimeline entryTimeline = new MyOSTimeline(); - entryTimeline.timelineId(TIMELINE); - Node event = resolvedEvent(fixture, entryTimeline, principal(ACTOR)); - event.getAsNode("/timeline").properties("providerExtension", new Node().value("present")); - - ChannelEvaluation evaluation = evaluateTimeline( - channel(configuredTimeline, principal(ACTOR)), - event); - - assertTrue(evaluation.matches()); - } - - @Test - void additionalActorFieldsDoNotReject() { - Fixture fixture = configuredFixture(); - MyOSAgentActor configuredActor = new MyOSAgentActor().accountId(ACTOR); - MyOSAgentActor entryActor = new MyOSAgentActor().accountId(ACTOR); - entryActor.onBehalfOf(principal("represented-account")); - - ChannelEvaluation evaluation = evaluateTimeline( - channel(timeline(TIMELINE), configuredActor), - resolvedEvent(fixture, timeline(TIMELINE), entryActor)); - - assertTrue(evaluation.matches()); - } - - @Test - void missingRequiredEntryBindingRejects() { - Fixture fixture = configuredFixture(); - Node missingTimeline = resolvedEvent(fixture, TIMELINE, ACTOR); - missingTimeline.getProperties().remove("timeline"); - Node missingActor = resolvedEvent(fixture, TIMELINE, ACTOR); - missingActor.getProperties().remove("actor"); - - TimelineChannel channel = channel(TIMELINE, ACTOR); - assertFalse(evaluateTimeline(channel, missingTimeline).matches()); - assertFalse(evaluateTimeline(channel, missingActor).matches()); - } - - @Test - void missingConfiguredBindingRejects() { - Fixture fixture = configuredFixture(); - Node event = resolvedEvent(fixture, TIMELINE, ACTOR); - - assertFalse(evaluateTimeline( - new TimelineChannel().actor(principal(ACTOR)), event).matches()); - assertFalse(evaluateTimeline( - new TimelineChannel().timeline(timeline(TIMELINE)), event).matches()); - } - - @Test - void missingMatchingInputsReject() { - Fixture fixture = configuredFixture(); - CoordinationEventNodes.TimelineEntryView entry = CoordinationEventNodes.timelineEntry( - resolvedEvent(fixture, TIMELINE, ACTOR)); - - assertFalse(TimelineProviderSupport.matchesTimelineAndActor(null, entry)); - assertFalse(TimelineProviderSupport.matchesTimelineAndActor( - channel(TIMELINE, ACTOR), null)); - } - - @Test - void compositeDelegatesCorrectedActorMatch() { - Fixture fixture = configuredFixture(); - Node event = resolvedEvent(fixture, TIMELINE, ACTOR); - Map wrongOnly = channels( - "wrong", channel(TIMELINE, "different-account")); - CompositeTimelineChannel wrongOnlyComposite = new CompositeTimelineChannel() - .channels(Collections.singletonList("wrong")); - - assertFalse(evaluateComposite(wrongOnlyComposite, event, wrongOnly).matches()); - - Map withMatch = channels( - "wrong", channel(TIMELINE, "different-account"), - "matching", channel(TIMELINE, ACTOR)); - CompositeTimelineChannel composite = new CompositeTimelineChannel() - .channels(Arrays.asList("wrong", "matching")); - - ChannelEvaluation evaluation = evaluateComposite(composite, event, withMatch); - - assertTrue(evaluation.matches()); - assertEquals("matching", evaluation.event().getAsText("/meta/compositeSourceChannelKey")); - } - - @Test - void allTimelinesDelegatesCorrectedActorMatch() { - Fixture fixture = configuredFixture(); - Node event = resolvedEvent(fixture, TIMELINE, ACTOR); - Map wrongOnly = channels( - "wrong", channel(TIMELINE, "different-account")); - - assertFalse(evaluateAll(event, wrongOnly).matches()); - - Map withMatch = channels( - "wrong", channel(TIMELINE, "different-account"), - "matching", channel(TIMELINE, ACTOR)); - - ChannelEvaluation evaluation = evaluateAll(event, withMatch); - - assertTrue(evaluation.matches()); - assertEquals("matching", evaluation.event().getAsText("/meta/allTimelinesSourceChannelKey")); - } - - private static ChannelEvaluation evaluateTimeline(TimelineChannel channel, Node event) { - return TIMELINE_PROCESSOR.evaluate(channel, ChannelEvaluationContextFactory.create( - "timeline", - event, - Collections.emptyMap(), - noMarkers(), - TIMELINE_PROCESSOR)); - } - - private static ChannelEvaluation evaluateComposite(CompositeTimelineChannel composite, - Node event, - Map channels) { - return new CompositeTimelineChannelProcessor().evaluate(composite, - ChannelEvaluationContextFactory.create( - "composite", event, channels, noMarkers(), TIMELINE_PROCESSOR)); - } - - private static ChannelEvaluation evaluateAll(Node event, - Map channels) { - return new AllTimelinesChannelProcessor().evaluate(new AllTimelinesChannel(), - ChannelEvaluationContextFactory.create( - "all", event, channels, noMarkers(), TIMELINE_PROCESSOR)); - } - - private static TimelineChannel channel(String timelineId, String actorId) { - return channel(timeline(timelineId), principal(actorId)); - } - - private static TimelineChannel channel(Timeline timeline, Actor actor) { - return new TimelineChannel().timeline(timeline).actor(actor); - } - - private static PrincipalActor principal(String accountId) { - return new PrincipalActor().accountId(accountId); - } - - private static Node resolvedEvent(Fixture fixture, String timelineId, String actorId) { - return resolvedEvent(fixture, - timeline(timelineId), - principal(actorId)); - } - - private static Timeline timeline(String timelineId) { - return new Timeline().timelineId(timelineId); - } - - private static Node resolvedEvent(Fixture fixture, Timeline timeline, Actor actor) { - TimelineEntry entry = new TimelineEntry() - .timeline(timeline) - .actor(actor) - .timestamp(BigInteger.ONE); - Node event = fixture.blue.objectToNode(entry) - .properties("timestamp", new Node().value(BigInteger.ONE)) - .properties("message", TestTimelineProvider.chatMessage("hello")) - .blue(fixture.repository.typeAliasBlue()); - return fixture.blue.resolve(fixture.blue.preprocess(event).blue(null)); - } - - private static Map channels(String key, - ChannelContract channel) { - Map channels = new LinkedHashMap(); - channels.put(key, channel); - return channels; - } - - private static Map channels(String firstKey, - ChannelContract firstChannel, - String secondKey, - ChannelContract secondChannel) { - Map channels = channels(firstKey, firstChannel); - channels.put(secondKey, secondChannel); - return channels; - } - - private static Map noMarkers() { - return Collections.emptyMap(); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/TimelineChannelProcessorTest.java b/src/test/java/blue/coordination/processor/TimelineChannelProcessorTest.java deleted file mode 100644 index 70f5147..0000000 --- a/src/test/java/blue/coordination/processor/TimelineChannelProcessorTest.java +++ /dev/null @@ -1,546 +0,0 @@ -package blue.coordination.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.ChannelCheckpointContext; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.model.MarkerContract; -import blue.repo.BlueRepository; -import blue.repo.coordination.APICall; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.Timeline; -import blue.repo.coordination.TimelineEntry; -import blue.repo.mandate.Mandate; -import blue.repo.mandate.MandateAuthority; -import blue.repo.myos.PrincipalActor; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class TimelineChannelProcessorTest { - private static final String TIMELINE = "owner-timeline"; - private static final String ACTOR = "owner-account"; - - @Test - void matchingTimelineAndActorAccept() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture); - - Node processed = process(fixture, document, - event(fixture, TIMELINE, ACTOR, 100, "hello")).document(); - - assertEquals(TIMELINE, checkpointEvent(processed).getAsText("/timeline/timelineId")); - assertEquals(ACTOR, checkpointEvent(processed).getAsText("/actor/accountId")); - assertEquals("hello", checkpointEvent(processed).getAsText("/message/message")); - } - - @Test - void unrelatedTypedLookalikeRejectsWithoutCheckpoint() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture); - Node event = new Node() - .type(ChatMessage.repositoryType().reference()) - .properties("timeline", new Node().blueId("not-a-blue-id")) - .properties("actor", new Node().blueId("not-a-blue-id")) - .properties("timestamp", new Node().value(1)) - .properties("message", TestTimelineProvider.chatMessage("lookalike")); - - DocumentProcessingResult result = process(fixture, document, event); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNull(checkpointEvent(result.document())); - } - - @Test - void untypedTimelineLookalikeRejectsWithoutCheckpoint() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture); - Node event = new Node() - .properties("timeline", new Node().blueId("not-a-blue-id")) - .properties("actor", new Node().blueId("not-a-blue-id")) - .properties("timestamp", new Node().value(1)) - .properties("message", TestTimelineProvider.chatMessage("lookalike")); - - DocumentProcessingResult result = process(fixture, document, event); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNull(checkpointEvent(result.document())); - } - - @Test - void invalidTimelineEntryReferenceFailsDeterministically() { - Fixture fixture = configuredFixture(); - Node invalid = event(fixture, TIMELINE, ACTOR, 1, "invalid"); - invalid.getProperties().put("timeline", new Node().blueId("not-a-blue-id")); - - IllegalArgumentException failure = assertThrows(IllegalArgumentException.class, - () -> CoordinationEventNodes.timelineEntry(invalid)); - - assertTrue(failure.getMessage().contains("Semantic identity reference"), failure.getMessage()); - } - - @Test - void sameTimelineDifferentActorRejectsWithoutCheckpoint() { - Fixture fixture = configuredFixture(); - - Node processed = process(fixture, initializedDocument(fixture), - event(fixture, TIMELINE, "different-account", 1, "wrong actor")).document(); - - assertNull(checkpointEvent(processed)); - } - - @Test - void sameActorDifferentTimelineRejectsWithoutCheckpoint() { - Fixture fixture = configuredFixture(); - - Node processed = process(fixture, initializedDocument(fixture), - event(fixture, "different-timeline", ACTOR, 1, "wrong timeline")).document(); - - assertNull(checkpointEvent(processed)); - } - - @Test - void pureReferenceEqualsEquivalentMaterializedBinding() { - Fixture fixture = configuredFixture(); - Node timeline = fixture.blue.objectToNode(new Timeline().timelineId(TIMELINE)); - Node actor = fixture.blue.objectToNode(new PrincipalActor().accountId(ACTOR)); - - Node timelineReference = new Node().blueId(fixture.blue.calculateSemanticBlueId(timeline)); - Node actorReference = new Node().blueId(fixture.blue.calculateSemanticBlueId(actor)); - - assertTrue(BlueSemanticIdentity.equals(timelineReference, timeline)); - assertTrue(BlueSemanticIdentity.equals(actorReference, actor)); - } - - @Test - void completedAndMinimalMaterializedBindingsAreEqual() { - Fixture fixture = configuredFixture(); - Node minimalEntry = event(fixture, TIMELINE, ACTOR, 1, "entry"); - Node completedEntry = fixture.blue.resolve(minimalEntry.clone()); - - assertTrue(BlueSemanticIdentity.equals( - minimalEntry.getAsNode("/timeline"), completedEntry.getAsNode("/timeline"))); - assertTrue(BlueSemanticIdentity.equals( - minimalEntry.getAsNode("/actor"), completedEntry.getAsNode("/actor"))); - } - - @Test - void sameTypeDifferentContentDoesNotEqual() { - Fixture fixture = configuredFixture(); - Node first = fixture.blue.objectToNode(new Timeline().timelineId("first")); - Node second = fixture.blue.objectToNode(new Timeline().timelineId("second")); - - assertFalse(BlueSemanticIdentity.equals(first, second)); - } - - @Test - void sequenceFreeTimelineEntryMatchesAndCheckpoints() { - Fixture fixture = configuredFixture(); - Node entry = event(fixture, TIMELINE, ACTOR, 100, "sequence-free"); - - DocumentProcessingResult result = process(fixture, initializedDocument(fixture), entry); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertNotNull(checkpointEvent(result.document())); - assertEquals(BigInteger.valueOf(100), checkpointEvent(result.document()).get("/timestamp")); - assertFalse(checkpointEvent(result.document()).getProperties().containsKey("sequence")); - } - - @Test - void firstValidTimestampIsAccepted() { - Fixture fixture = configuredFixture(); - BigInteger firstTimestamp = new BigInteger("-92233720368547758081234567890"); - - DocumentProcessingResult result = process(fixture, observingDocument(fixture), - event(fixture, TIMELINE, ACTOR, firstTimestamp, "first")); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals(1, result.triggeredEvents().size()); - assertEquals(firstTimestamp, checkpointEvent(result.document()).get("/timestamp")); - } - - @Test - void higherTimestampLowerProviderSequenceAccepts() { - Fixture fixture = configuredFixture(); - Node first = process(fixture, initializedDocument(fixture), - providerSequencedEvent(fixture, 10, 100, "first")).document(); - - DocumentProcessingResult result = process(fixture, first, - providerSequencedEvent(fixture, 1, 101, "second")); - - assertEquals("second", checkpointEvent(result.document()).getAsText("/message/message")); - assertEquals(BigInteger.valueOf(101), checkpointEvent(result.document()).get("/timestamp")); - assertEquals(BigInteger.ONE, checkpointEvent(result.document()).get("/sequence")); - } - - @Test - void lowerTimestampHigherProviderSequenceRejectsWithoutEffectsOrCheckpointMutation() { - Fixture fixture = configuredFixture(); - Node first = process(fixture, observingDocument(fixture), - providerSequencedEvent(fixture, 1, 100, "first")).document(); - Node checkpointBefore = checkpointEvent(first).clone(); - - DocumentProcessingResult result = process(fixture, first, - providerSequencedEvent(fixture, 2, 99, "stale")); - - assertTrue(result.triggeredEvents().isEmpty()); - assertEquals(fixture.blue.calculateBlueId(checkpointBefore), - fixture.blue.calculateBlueId(checkpointEvent(result.document()))); - } - - @Test - void equalTimestampHigherProviderSequenceRejectsAsEquivocationWithoutMutation() { - Fixture fixture = configuredFixture(); - Node first = process(fixture, observingDocument(fixture), - providerSequencedEvent(fixture, 1, 100, "first")).document(); - Node checkpointBefore = checkpointEvent(first).clone(); - - DocumentProcessingResult result = process(fixture, first, - providerSequencedEvent(fixture, 2, 100, "different")); - - assertTrue(result.triggeredEvents().isEmpty()); - assertEquals(fixture.blue.calculateBlueId(checkpointBefore), - fixture.blue.calculateBlueId(checkpointEvent(result.document()))); - } - - @Test - void higherTimestampAcceptsWithGaps() { - Fixture fixture = configuredFixture(); - Node first = process(fixture, initializedDocument(fixture), - event(fixture, TIMELINE, ACTOR, 100, "first")).document(); - - Node second = process(fixture, first, - event(fixture, TIMELINE, ACTOR, 1_000_000, "second")).document(); - - assertEquals(BigInteger.valueOf(1_000_000), checkpointEvent(second).get("/timestamp")); - assertEquals("second", checkpointEvent(second).getAsText("/message/message")); - } - - @Test - void lowerTimestampRejectsWithoutEffectsOrCheckpointMutation() { - Fixture fixture = configuredFixture(); - Node first = process(fixture, observingDocument(fixture), - event(fixture, TIMELINE, ACTOR, 100, "first")).document(); - Node checkpointBefore = checkpointEvent(first).clone(); - - DocumentProcessingResult stale = process(fixture, first, - event(fixture, TIMELINE, ACTOR, 99, "stale")); - - assertTrue(stale.triggeredEvents().isEmpty()); - assertEquals(fixture.blue.calculateBlueId(checkpointBefore), - fixture.blue.calculateBlueId(checkpointEvent(stale.document()))); - } - - @Test - void sameTimelineReferenceAndMaterializedFormsCompareTogether() { - Fixture fixture = configuredFixture(); - Node previous = event(fixture, TIMELINE, ACTOR, 100, "first"); - Node checkpointTimeline = previous.getAsNode("/timeline"); - previous.getProperties().put("timeline", - new Node().blueId(fixture.blue.calculateSemanticBlueId(checkpointTimeline))); - Node current = event(fixture, TIMELINE, ACTOR, 101, "next"); - - assertTrue(TimelineProviderSupport.isNewerOrSameTimelineEvent( - ChannelCheckpointContext.of("/", "ownerChannel", current, "current", - previous, "previous", Collections.emptyMap()))); - } - - @Test - void exactEventReplayDoesNotRunHandlersAgain() { - Fixture fixture = configuredFixture(); - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", TestTimelineProvider.channel(TIMELINE, ACTOR)); - contracts.put("replayObserver", replayObserver()); - Node event = event(fixture, TIMELINE, ACTOR, 100, "same"); - DocumentProcessingResult first = process(fixture, initializedDocument(fixture, contracts), event); - Node checkpointBefore = checkpointEvent(first.document()).clone(); - - DocumentProcessingResult replay = process(fixture, first.document(), event.clone()); - - assertEquals(1, first.triggeredEvents().size()); - assertEquals("handled once", first.triggeredEvents().get(0).getAsText("/message")); - assertTrue(replay.triggeredEvents().isEmpty()); - assertEquals(fixture.blue.calculateBlueId(checkpointBefore), - fixture.blue.calculateBlueId(checkpointEvent(replay.document()))); - } - - @Test - void equalTimestampDifferentContentRejectsAsProviderEquivocation() { - Fixture fixture = configuredFixture(); - Node first = process(fixture, observingDocument(fixture), - event(fixture, TIMELINE, ACTOR, 100, "first")).document(); - Node checkpointBefore = checkpointEvent(first).clone(); - - DocumentProcessingResult equivocation = process(fixture, first, - event(fixture, TIMELINE, ACTOR, 100, "different")); - - assertTrue(equivocation.triggeredEvents().isEmpty()); - assertEquals(fixture.blue.calculateBlueId(checkpointBefore), - fixture.blue.calculateBlueId(checkpointEvent(equivocation.document()))); - } - - @Test - void timestampBeyondLongRangeRemainsExact() { - Fixture fixture = configuredFixture(); - BigInteger firstTimestamp = new BigInteger("9223372036854775808123456789"); - BigInteger secondTimestamp = firstTimestamp.add(BigInteger.ONE); - Node firstEvent = event(fixture, TIMELINE, ACTOR, firstTimestamp, "first"); - assertEquals(firstTimestamp, firstEvent.get("/timestamp")); - assertNotNull(CoordinationEventNodes.timelineEntry(firstEvent)); - DocumentProcessingResult firstResult = process(fixture, initializedDocument(fixture), - firstEvent); - assertNotNull(checkpointEvent(firstResult.document()), firstResult.failureReason()); - - DocumentProcessingResult secondResult = process(fixture, firstResult.document(), - event(fixture, TIMELINE, ACTOR, secondTimestamp, "second")); - assertNotNull(checkpointEvent(secondResult.document()), secondResult.failureReason()); - - assertEquals(secondTimestamp, checkpointEvent(secondResult.document()).get("/timestamp")); - } - - @Test - void missingTimelineRejectsWithoutCheckpoint() { - assertMissingFieldRejects("timeline"); - } - - @Test - void missingActorRejectsWithoutCheckpoint() { - assertMissingFieldRejects("actor"); - } - - @Test - void missingTimestampRejectsWithoutCheckpoint() { - assertMissingFieldRejects("timestamp"); - } - - @Test - void invalidTimestampRejectsWithoutCheckpoint() { - Fixture fixture = configuredFixture(); - Node invalid = event(fixture, TIMELINE, ACTOR, 1, "invalid"); - invalid.getProperties().put("timestamp", new Node().value("1")); - - assertRejected(fixture, invalid); - } - - @Test - void decimalTimestampRejectsWithoutTruncation() { - Fixture fixture = configuredFixture(); - Node invalid = event(fixture, TIMELINE, ACTOR, 1, "invalid"); - invalid.getProperties().put("timestamp", new Node().value(new BigDecimal("1.5"))); - - assertRejected(fixture, invalid); - } - - @Test - void malformedPreviousCheckpointFailsClosedWithoutEffectsOrMutation() { - Fixture fixture = configuredFixture(); - Node malformed = process(fixture, observingDocument(fixture), - event(fixture, TIMELINE, ACTOR, 100, "first")).document().clone(); - checkpointEvent(malformed).getProperties().remove("timestamp"); - Node checkpointBefore = checkpointEvent(malformed).clone(); - - DocumentProcessingResult result = process(fixture, malformed, - event(fixture, TIMELINE, ACTOR, 101, "next")); - - assertTrue(result.triggeredEvents().isEmpty()); - assertEquals(fixture.blue.calculateBlueId(checkpointBefore), - fixture.blue.calculateBlueId(checkpointEvent(result.document()))); - } - - @Test - void missingMessageRejectsWithoutCheckpoint() { - assertMissingFieldRejects("message"); - } - - @Test - void optionalSourceSurvivesDeliveryUnchanged() { - Fixture fixture = configuredFixture(); - TimelineEntry attributed = baseEntry(fixture, BigInteger.ONE, "source") - .source(new APICall().apiKeyId("api-key-7")); - - Node event = fixture.blue.preprocess(fixture.blue.objectToNode(attributed) - .blue(fixture.repository.typeAliasBlue())).blue(null); - DocumentProcessingResult result = process(fixture, initializedDocument(fixture), event); - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - Node processed = result.document(); - - assertEquals("api-key-7", checkpointEvent(processed).getAsText("/source/apiKeyId")); - } - - @Test - void optionalOnBehalfOfSurvivesDeliveryUnchanged() { - Fixture fixture = configuredFixture(); - Node authority = new Node() - .type(MandateAuthority.qualifiedName()) - .properties("actor", new Node() - .type(PrincipalActor.qualifiedName()) - .properties("accountId", new Node().value("represented-account"))) - .properties("mandate", authorityMandate()); - Node event = fixture.blue.preprocess(fixture.blue.objectToNode( - baseEntry(fixture, BigInteger.ONE, "authority")) - .properties("onBehalfOf", authority) - .blue(fixture.repository.typeAliasBlue())).blue(null); - DocumentProcessingResult result = process(fixture, initializedDocument(fixture), event); - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - Node processed = result.document(); - - assertEquals("represented-account", - checkpointEvent(processed).getAsText("/onBehalfOf/actor/accountId")); - assertEquals("Timeline Authority Mandate", - checkpointEvent(processed).getAsText("/onBehalfOf/mandate/name")); - assertNotNull(checkpointEvent(result.snapshot().resolvedRoot()).getAsNode( - "/onBehalfOf/mandate/contracts/mandateGuarantorChannel/type")); - } - - private static void assertMissingFieldRejects(String field) { - Fixture fixture = configuredFixture(); - Node invalid = event(fixture, TIMELINE, ACTOR, 1, "invalid"); - invalid.getProperties().remove(field); - assertRejected(fixture, invalid); - } - - private static void assertRejected(Fixture fixture, Node event) { - DocumentProcessingResult result = process(fixture, observingDocument(fixture), event); - assertTrue(result.triggeredEvents().isEmpty()); - assertNull(checkpointEvent(result.document()), result.failureReason()); - } - - private static Node initializedDocument(Fixture fixture) { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", TestTimelineProvider.channel(TIMELINE, ACTOR)); - return initializedDocument(fixture, contracts); - } - - private static Node observingDocument(Fixture fixture) { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", TestTimelineProvider.channel(TIMELINE, ACTOR)); - contracts.put("observer", replayObserver()); - return initializedDocument(fixture, contracts); - } - - private static Node initializedDocument(Fixture fixture, Map contracts) { - Node document = new Node() - .blue(fixture.repository.typeAliasBlue()) - .name("Timeline V2 Test") - .properties("contracts", new Node().properties(contracts)); - DocumentProcessingResult result = fixture.blue.initializeDocument(fixture.blue.preprocess(document)); - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNotNull(result.snapshot()); - return result.document(); - } - - private static Node replayObserver() { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items(new Node() - .type("Coordination/Trigger Event") - .properties("event", TestTimelineProvider.chatMessage("handled once")))); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static Node event(Fixture fixture, - String timelineId, - String actorId, - long timestamp, - String message) { - return event(fixture, - timelineId, - actorId, - BigInteger.valueOf(timestamp), - message); - } - - private static Node event(Fixture fixture, - String timelineId, - String actorId, - BigInteger timestamp, - String message) { - return TestTimelineProvider.timelineEntry(fixture.blue, - fixture.repository, - timelineId, - actorId, - timestamp, - TestTimelineProvider.chatMessage(message)); - } - - private static Node providerSequencedEvent(Fixture fixture, - long providerSequence, - long timestamp, - String message) { - return TestTimelineProvider.timelineEntryWithProviderSequence(fixture.blue, - fixture.repository, - TIMELINE, - ACTOR, - BigInteger.valueOf(providerSequence), - BigInteger.valueOf(timestamp), - TestTimelineProvider.chatMessage(message)); - } - - private static TimelineEntry baseEntry(Fixture fixture, - BigInteger timestamp, - String message) { - return new TimelineEntry() - .timeline(new Timeline().timelineId(TIMELINE)) - .actor(new PrincipalActor().accountId(ACTOR)) - .timestamp(timestamp) - .message(fixture.blue.objectToNode(new ChatMessage().message(message))); - } - - private static Node authorityMandate() { - return new Node() - .name("Timeline Authority Mandate") - .type(Mandate.qualifiedName()) - .properties("contracts", requiredMandateChannels()); - } - - private static Node requiredMandateChannels() { - return new Node().properties("mandateGuarantorChannel", TestTimelineProvider.channel("guarantor")) - .properties("authorityHolderChannel", TestTimelineProvider.channel("holder")) - .properties("authorizedActorChannel", TestTimelineProvider.channel("authorized")); - } - - private static DocumentProcessingResult process(Fixture fixture, Node document, Node event) { - return fixture.blue.processDocument(document, event); - } - - private static Node checkpointEvent(Node document) { - return nodeAt(document, "/contracts/checkpoint/lastEvents/ownerChannel"); - } - - private static Node nodeAt(Node node, String path) { - try { - Object value = node.get(path); - return value instanceof Node ? (Node) value : null; - } catch (IllegalArgumentException ex) { - return null; - } - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/TimelineCheckpointSubjectTest.java b/src/test/java/blue/coordination/processor/TimelineCheckpointSubjectTest.java new file mode 100644 index 0000000..22aacf8 --- /dev/null +++ b/src/test/java/blue/coordination/processor/TimelineCheckpointSubjectTest.java @@ -0,0 +1,278 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.processor.ChannelCheckpointContext; +import blue.repo.coordination.AllTimelinesChannel; +import blue.repo.coordination.CompositeTimelineChannel; +import blue.repo.coordination.TimelineChannel; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class TimelineCheckpointSubjectTest { + + @Test + void shouldAcceptIncreasingTimestampForDirectTimeline() { + // given + TimelineChannelProcessor processor = + new TimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new TimelineChannel(), + context( + directSubject(11, "entry-b"), + directSubject(10, "entry-a"))); + + // then + assertTrue(newer); + } + + @Test + void shouldRejectEqualTimestampForDirectTimeline() { + // given + TimelineChannelProcessor processor = + new TimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new TimelineChannel(), + context( + directSubject(10, "entry-z"), + directSubject(10, "entry-a"))); + + // then + assertFalse(newer); + } + + @Test + void shouldRejectBackdatedEntryForDirectTimeline() { + // given + TimelineChannelProcessor processor = + new TimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new TimelineChannel(), + context( + directSubject(9, "entry-z"), + directSubject(10, "entry-a"))); + + // then + assertFalse(newer); + } + + @Test + void shouldConsumeVerifiedPlatformOrderAcrossDifferentTimelines() { + // given + CompositeTimelineChannelProcessor processor = + new CompositeTimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new CompositeTimelineChannel(), + context(compositeSubject( + 9, "timeline-a", + "entry-a", "a", "domain-a"), + compositeSubject( + 10, "timeline-z", + "entry-z", "z", "domain-z"))); + + // then + assertTrue(newer); + } + + @Test + void shouldAcceptIncreasingTimestampWithinSameTimelineWhenMemberChanges() { + // given + CompositeTimelineChannelProcessor processor = + new CompositeTimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new CompositeTimelineChannel(), + context(compositeSubject( + 11, "timeline-a", + "entry-b", "b", "domain-b"), + compositeSubject( + 10, "timeline-a", + "entry-a", "a", "domain-a"))); + + // then + assertTrue(newer); + } + + @Test + void shouldRejectEqualTimestampWithinSameTimelineWhenMemberChanges() { + // given + CompositeTimelineChannelProcessor processor = + new CompositeTimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new CompositeTimelineChannel(), + context(compositeSubject( + 10, "timeline-a", + "entry-b", "b", "domain-b"), + compositeSubject( + 10, "timeline-a", + "entry-a", "a", "domain-a"))); + + // then + assertFalse(newer); + } + + @Test + void shouldRejectBackdatedEntryWithinSameTimelineWhenMemberChanges() { + // given + CompositeTimelineChannelProcessor processor = + new CompositeTimelineChannelProcessor(); + + // when + boolean newer = processor.isNewerEvent( + new CompositeTimelineChannel(), + context(compositeSubject( + 9, "timeline-z", + "entry-z", "z", "domain-z"), + compositeSubject( + 10, "timeline-z", + "entry-a", "a", "domain-a"))); + + // then + assertFalse(newer); + } + + @Test + void shouldEnsureThatAllTimelinesRejectsMalformedStoredOrderSubject() { + // given + AllTimelinesChannelProcessor processor = + new AllTimelinesChannelProcessor(); + // when + Node malformed = new Node() + .properties("semantics", new Node().value( + AllTimelinesExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION)); + + // then + assertThrows(IllegalArgumentException.class, + () -> processor.isNewerEvent( + new AllTimelinesChannel(), + context(allSubject( + 10, "timeline-a", "entry-a", + "a", "domain"), + malformed))); + } + + @Test + void shouldEnsureThatAggregateSubjectsRejectEmptyMemberLineage() { + // given + // when + AllTimelinesChannelProcessor processor = + new AllTimelinesChannelProcessor(); + + // then + assertThrows(IllegalArgumentException.class, + () -> processor.isNewerEvent( + new AllTimelinesChannel(), + context(allSubject( + 10, "timeline-a", "entry-a", + "", "domain"), + null))); + assertThrows(IllegalArgumentException.class, + () -> processor.isNewerEvent( + new AllTimelinesChannel(), + context(allSubject( + 10, "timeline-a", "entry-a", + "member", ""), + null))); + } + + private static ChannelCheckpointContext context(Node current, + Node previous) { + return ChannelCheckpointContext.of( + "/", + "timeline", + new Node().properties( + "rawTimelineExtension", + new Node().value("ignored")), + "current-signature", + current, + previous, + "previous-signature", + Collections.emptyMap()); + } + + private static Node directSubject(long timestamp, + String entryBlueId) { + return subject( + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION, + timestamp, + "timeline-a", + entryBlueId, + null, + null); + } + + private static Node compositeSubject(long timestamp, + String timelineBlueId, + String entryBlueId, + String memberKey, + String memberDomain) { + return subject( + CompositeTimelineExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION, + timestamp, + timelineBlueId, + entryBlueId, + memberKey, + memberDomain); + } + + private static Node allSubject(long timestamp, + String timelineBlueId, + String entryBlueId, + String memberKey, + String memberDomain) { + return subject( + AllTimelinesExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION, + timestamp, + timelineBlueId, + entryBlueId, + memberKey, + memberDomain); + } + + private static Node subject(String semantics, + long timestamp, + String timelineBlueId, + String entryBlueId, + String memberKey, + String memberDomain) { + Node subject = new Node() + .properties("semantics", + new Node().value(semantics)) + .properties("timestamp", + new Node().value( + BigInteger.valueOf(timestamp))) + .properties("timelineBlueId", + new Node().value(timelineBlueId)) + .properties("entryBlueId", + new Node().value(entryBlueId)); + if (memberKey != null) { + subject.properties("memberKey", + new Node().value(memberKey)); + } + if (memberDomain != null) { + subject.properties("memberDomain", + new Node().value(memberDomain)); + } + return subject; + } +} diff --git a/src/test/java/blue/coordination/processor/TimelineProviderSupportFinalSemanticsTest.java b/src/test/java/blue/coordination/processor/TimelineProviderSupportFinalSemanticsTest.java new file mode 100644 index 0000000..dffdf6c --- /dev/null +++ b/src/test/java/blue/coordination/processor/TimelineProviderSupportFinalSemanticsTest.java @@ -0,0 +1,437 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.repo.BlueRepository; +import blue.repo.coordination.Timeline; +import blue.repo.coordination.TimelineChannel; +import blue.repo.coordination.TimelineEntry; +import blue.repo.myos.PrincipalActor; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class TimelineProviderSupportFinalSemanticsTest { + + @Test + void shouldRetainTheExactFixedTimelineCheckpointKey() { + // given + Node exactEntry = entry( + "timeline-a", + 10, + "checkpointed"); + CoordinationEventNodes.TimelineEntryView view = + CoordinationEventNodes.timelineEntry(exactEntry); + + // when + Node subject = + TimelineProviderSupport.timelineOrderSubject(view); + + // then + assertEquals( + TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION, + subject.getAsText("/semantics")); + assertEquals(BigInteger.TEN, subject.get("/timestamp")); + assertEquals( + exactBlueId("timeline-a"), + subject.getAsText("/timelineBlueId")); + assertNull(TimelineProviderSupport.property( + subject, "sequence")); + assertEquals( + TimelineProviderSupport.eventId(exactEntry), + subject.getAsText("/entryBlueId")); + } + + @Test + void shouldNotInventSequenceInCheckpointSubject() { + // given + Node exactEntry = + entry("timeline-a", 11, + "fixed-shape"); + + // when + Node subject = + TimelineProviderSupport.timelineOrderSubject( + CoordinationEventNodes.timelineEntry( + exactEntry)); + + // then + assertNull(TimelineProviderSupport.property( + subject, "sequence")); + } + + @Test + void shouldEnsureThatCheckpointSubjectSemanticsAreRotatedTogether() { + // given + // when + // then + assertTrue(TimelineExternalSubscriptionFunctions + .TIMELINE_ORDER_SUBJECT_VERSION.endsWith("-v3")); + assertTrue(CompositeTimelineExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION.endsWith("-v3")); + assertTrue(AllTimelinesExternalSubscriptionFunctions + .ORDER_SUBJECT_VERSION.endsWith("-v3")); + } + + @Test + void shouldPreserveEveryImmutableTimelineEntryHeader() { + // given + Node previous = entry("timeline-a", 9, "previous"); + Node event = entry("timeline-a", 10, "message") + .properties("prevEntry", new Node().blueId( + TimelineProviderSupport.eventId(previous))) + .properties("source", exactReference("source")) + .properties("onBehalfOf", exactReference("authority")); + // when + CoordinationEventNodes.TimelineEntryView view = + CoordinationEventNodes.timelineEntry(event); + + // then + assertNotNull(view); + assertEquals(exactBlueId("timeline-a"), + view.timeline().getBlueId()); + assertEquals( + TimelineProviderSupport.eventId(previous), + view.prevEntry().getBlueId()); + assertEquals(BigInteger.TEN, view.timestamp()); + assertEquals(BigInteger.TEN, view.timestampNode().getValue()); + assertEquals(exactBlueId("actor"), + view.actor().getBlueId()); + assertEquals(exactBlueId("source"), + view.source().getBlueId()); + assertEquals(exactBlueId("authority"), + view.onBehalfOf().getBlueId()); + assertEquals("message", view.message().getValue()); + assertEquals( + TimelineProviderSupport.eventId(event), + view.entryBlueId()); + } + + @Test + void shouldDefensivelyCopyTimelineEntryHeaders() { + // given + Node event = entry( + "timeline-a", 10, + "message") + .properties( + "source", + exactReference("source")); + CoordinationEventNodes.TimelineEntryView view = + CoordinationEventNodes.timelineEntry(event); + + // when + event.getProperties().remove("source"); + view.timeline().blueId("mutated"); + view.message().value("mutated"); + + // then + assertEquals(exactBlueId("timeline-a"), + view.timeline().getBlueId()); + assertEquals(exactBlueId("source"), + view.source().getBlueId()); + assertEquals("message", view.message().getValue()); + assertNotNull(view.exactEntry().getProperties().get("source")); + } + + @Test + void shouldEnsureThatCommittedFrontierIsExclusiveAndExactTimelineBound() { + // given + Node timeline = exactReference("timeline-a"); + Node before = entry("timeline-a", 99, "before"); + // when + Node at = entry("timeline-a", 100, "at"); + + // then + assertTrue(TimelineProviderSupport.isBehindCommittedFrontier( + before, timeline, BigInteger.valueOf(100))); + assertFalse(TimelineProviderSupport.isBehindCommittedFrontier( + at, timeline, BigInteger.valueOf(100))); + assertThrows(IllegalArgumentException.class, + () -> TimelineProviderSupport.isBehindCommittedFrontier( + before, + exactReference("timeline-b"), + BigInteger.valueOf(100))); + assertThrows(IllegalArgumentException.class, + () -> TimelineProviderSupport.isBehindCommittedFrontier( + before, timeline, null)); + } + + @Test + void shouldEnsureThatPredecessorMustBindExactEntryTimelineAndDefaultOrder() { + // given + Node previous = entry("timeline-a", 10, "previous"); + // when + Node current = entry("timeline-a", 11, "current") + .properties("prevEntry", new Node().blueId( + TimelineProviderSupport.eventId(previous))); + + // then + assertTrue(TimelineProviderSupport.followsExactPredecessor( + current, previous)); + + Node wrongIdentity = current.clone().properties( + "prevEntry", exactReference("wrong")); + assertFalse(TimelineProviderSupport.followsExactPredecessor( + wrongIdentity, previous)); + + Node wrongTimeline = entry("timeline-b", 11, "current") + .properties("prevEntry", new Node().blueId( + TimelineProviderSupport.eventId(previous))); + assertFalse(TimelineProviderSupport.followsExactPredecessor( + wrongTimeline, previous)); + + Node backdated = entry("timeline-a", 9, "current") + .properties("prevEntry", new Node().blueId( + TimelineProviderSupport.eventId(previous))); + assertFalse(TimelineProviderSupport.followsExactPredecessor( + backdated, previous)); + } + + @Test + void shouldRejectAnEqualTimestampPredecessorEdge() { + // given + Node previous = entry("timeline-a", 10, "previous"); + // when + Node equalTimestamp = withPredecessor( + entry("timeline-a", 10, "equal"), + previous); + + // then + assertFalse(TimelineProviderSupport.followsExactPredecessor( + equalTimestamp, previous)); + } + + @Test + void shouldPreserveVerifiedPlatformOrderAcrossTimelines() { + // given + Node timelineA = exactReference("timeline-a"); + Node timelineB = exactReference("timeline-b"); + Node a1 = entry("timeline-a", 100, "A1"); + Node b1 = entry("timeline-b", 90, "B1"); + Node a2 = entry("timeline-a", 110, "A2"); + Map frontiers = + new LinkedHashMap(); + frontiers.put( + timelineA.getBlueId(), + BigInteger.valueOf(120)); + frontiers.put( + timelineB.getBlueId(), + BigInteger.valueOf(120)); + + // when + TimelineProviderSupport.CompletenessWindow window = + TimelineProviderSupport.evaluateCompletenessWindow( + Arrays.asList(a1, b1, a2), + Arrays.asList(timelineB, timelineA), + frontiers); + + // then + assertTrue(window.ready()); + assertEquals(BigInteger.valueOf(110), + window.maximumTimestamp()); + assertEquals( + Arrays.asList( + TimelineProviderSupport.eventId(a1), + TimelineProviderSupport.eventId(b1), + TimelineProviderSupport.eventId(a2)), + entryBlueIds(window.orderedEntries())); + assertTrue(window.incompleteTimelineBlueIds().isEmpty()); + + window.orderedEntries().get(0) + .getProperties().get("message") + .value("mutated"); + assertEquals("A1", window.orderedEntries().get(0) + .getProperties().get("message").getValue()); + } + + @Test + void shouldRejectEqualTimestampsWithinOneTimelineWindow() { + // given + Node timelineA = exactReference("timeline-a"); + Node first = entry("timeline-a", 100, "first"); + Node second = entry("timeline-a", 100, "second"); + Map frontiers = + Collections.singletonMap( + timelineA.getBlueId(), + BigInteger.valueOf(101)); + + // when + IllegalArgumentException failure = + assertThrows( + IllegalArgumentException.class, + () -> TimelineProviderSupport + .evaluateCompletenessWindow( + Arrays.asList(first, second), + Collections.singletonList(timelineA), + frontiers)); + + // then + assertTrue(failure.getMessage().contains( + "timestamps must be strictly increasing")); + } + + @Test + void shouldRejectDecreasingTimestampsWithinOneTimelineWindow() { + // given + Node timelineA = exactReference("timeline-a"); + Node later = entry("timeline-a", 101, "later"); + Node earlier = entry("timeline-a", 100, "earlier"); + Map frontiers = + Collections.singletonMap( + timelineA.getBlueId(), + BigInteger.valueOf(102)); + + // when + IllegalArgumentException failure = + assertThrows( + IllegalArgumentException.class, + () -> TimelineProviderSupport + .evaluateCompletenessWindow( + Arrays.asList(later, earlier), + Collections.singletonList(timelineA), + frontiers)); + + // then + assertTrue(failure.getMessage().contains( + "timestamps must be strictly increasing")); + } + + @Test + void shouldFailClosedForInsufficientCompleteness() { + // given + Node timelineA = exactReference("timeline-a"); + Node timelineB = exactReference("timeline-b"); + Node a1 = entry("timeline-a", 100, "A1"); + Node b1 = entry("timeline-b", 90, "B1"); + Map frontiers = + new LinkedHashMap(); + frontiers.put( + timelineA.getBlueId(), + BigInteger.valueOf(120)); + frontiers.put( + timelineB.getBlueId(), + BigInteger.valueOf(80)); + + // when + TimelineProviderSupport.CompletenessWindow window = + TimelineProviderSupport.evaluateCompletenessWindow( + Arrays.asList(a1, b1), + Arrays.asList(timelineA, timelineB), + frontiers); + + // then + assertFalse(window.ready()); + assertTrue(window.orderedEntries().isEmpty()); + assertEquals( + Arrays.asList(timelineB.getBlueId()), + window.incompleteTimelineBlueIds()); + } + + @Test + void shouldRejectInconsistentCompletenessInputs() { + // given + Node timelineA = exactReference("timeline-a"); + Node timelineB = exactReference("timeline-b"); + Node a1 = entry("timeline-a", 100, "A1"); + Node b1 = entry("timeline-b", 90, "B1"); + Map frontiers = + new LinkedHashMap(); + frontiers.put( + timelineA.getBlueId(), + BigInteger.valueOf(120)); + frontiers.put( + timelineB.getBlueId(), + BigInteger.valueOf(80)); + Map extra = + new LinkedHashMap( + frontiers); + extra.put( + exactBlueId("inactive"), + BigInteger.valueOf(120)); + + // when + // then + assertThrows(IllegalArgumentException.class, + () -> TimelineProviderSupport + .evaluateCompletenessWindow( + Arrays.asList(a1, b1), + Arrays.asList( + timelineA, timelineB), + extra)); + assertThrows(IllegalArgumentException.class, + () -> TimelineProviderSupport + .evaluateCompletenessWindow( + Arrays.asList(a1, b1), + Arrays.asList(timelineA), + Collections.singletonMap( + timelineA.getBlueId(), + BigInteger.valueOf(120)))); + } + + private static Node entry( + String timelineBlueId, + long timestamp, + String message) { + return entry( + exactReference(timelineBlueId), + timestamp, + message); + } + + private static Node entry( + Node timeline, + long timestamp, + String message) { + return new Node() + .type(new Node().blueId(TimelineEntry.blueId())) + .properties("timeline", timeline) + .properties("timestamp", new Node().value( + BigInteger.valueOf(timestamp))) + .properties("actor", exactReference("actor")) + .properties("message", new Node().value(message)); + } + + private static Node withPredecessor( + Node entry, + Node predecessor) { + return entry.properties( + "prevEntry", + new Node().blueId( + TimelineProviderSupport.eventId(predecessor))); + } + + private static Node exactReference(String label) { + return new Node().blueId(exactBlueId(label)); + } + + private static List entryBlueIds( + List entries) { + List blueIds = + new ArrayList(entries.size()); + for (Node entry : entries) { + blueIds.add( + TimelineProviderSupport.eventId(entry)); + } + return blueIds; + } + + private static String exactBlueId(String label) { + return TimelineProviderSupport.eventId( + new Node().properties( + "fixtureIdentity", + new Node().value(label))); + } +} diff --git a/src/test/java/blue/coordination/processor/TimelineSubscriptionProjectionTest.java b/src/test/java/blue/coordination/processor/TimelineSubscriptionProjectionTest.java new file mode 100644 index 0000000..0c9a6ab --- /dev/null +++ b/src/test/java/blue/coordination/processor/TimelineSubscriptionProjectionTest.java @@ -0,0 +1,977 @@ +package blue.coordination.processor; + +import blue.language.model.Node; +import blue.language.model.TypeBlueId; +import blue.language.processor.ExternalChannelFunctionContext; +import blue.language.processor.GasMeter; +import blue.language.processor.GasSchedule; +import blue.language.processor.RuntimeWorkSession; +import blue.language.snapshot.FrozenNode; +import blue.repo.BlueRepository; +import blue.repo.coordination.Actor; +import blue.repo.coordination.Timeline; +import blue.repo.coordination.TimelineChannel; +import blue.repo.coordination.TimelineEntry; +import blue.repo.myos.MyOSAdminActor; +import blue.repo.myos.MyOSTimeline; +import blue.repo.myos.PrincipalActor; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class TimelineSubscriptionProjectionTest { + private static final String UNLISTED_TIMELINE_BLUE_ID = + "FZrvbrXVyURJ7BDokWvbN753NgWV8RVepeKngSMUjPxg"; + private static final String UNLISTED_ACTOR_BLUE_ID = + "FCNMAeNe8X5LiG8TPfwk6wS9k7uYnxxYyUe6iCAEVSNC"; + + @Test + void shouldBoundMyosSubtypeProjectionToNineUniqueKeys() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + MyOSTimeline timeline = new MyOSTimeline(); + timeline.timelineId("timeline-a"); + MyOSAdminActor actor = new MyOSAdminActor(); + actor.accountId("actor-a"); + TimelineChannel channel = new TimelineChannel() + .timeline(timeline) + .actor(actor); + Node event = entry( + fixture.blue.objectToNode(timeline), + fixture.blue.objectToNode(actor)); + + // when + List eventKeys = eventKeys( + fixture, event, Collections.emptyMap()); + List channelKeys = + TimelineSubscriptionProjection.channelKeys(channel); + + // then + assertFalse(eventKeys.isEmpty()); + assertTrue(eventKeys.size() <= 9, eventKeys.toString()); + assertEquals( + eventKeys.size(), + new LinkedHashSet(eventKeys).size()); + assertTrue(eventKeys.contains( + TimelineSubscriptionProjection.BROAD_KEY)); + assertFalse(Collections.disjoint(channelKeys, eventKeys)); + } + } + + @Test + void shouldProduceIdenticalKeysForInlineAndReferenceHeaders() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + Node timeline = timeline(fixture, "timeline-a"); + Node actor = actor(fixture, "actor-a"); + Map references = + new LinkedHashMap(); + String timelineBlueId = + fixture.blue.calculateBlueId(timeline); + String actorBlueId = + fixture.blue.calculateBlueId(actor); + references.put(timelineBlueId, timeline); + references.put(actorBlueId, actor); + Node inline = entry(timeline, actor); + Node referenced = entry( + new Node().blueId(timelineBlueId), + new Node().blueId(actorBlueId)); + ExternalChannelFunctionContext context = + context(fixture, references); + + // when + List inlineKeys = + TimelineSubscriptionProjection.eventKeys( + inline, context); + List referenceKeys = + TimelineSubscriptionProjection.eventKeys( + referenced, context); + + // then + assertFalse(inlineKeys.isEmpty()); + assertEquals(inlineKeys, referenceKeys); + } + } + + @Test + void shouldProjectVerifiedPartialTimelineEntryHeaderLikeInlineEvent() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + Node timeline = timeline(fixture, "timeline-a"); + Node actor = actor(fixture, "actor-a"); + String timelineBlueId = + fixture.blue.calculateBlueId(timeline); + String actorBlueId = + fixture.blue.calculateBlueId(actor); + Node partialHeader = new Node() + .type(new Node().blueId( + TimelineEntry.blueId())) + .properties( + "timeline", + new Node().blueId( + timelineBlueId)) + .properties( + "actor", + new Node().blueId( + actorBlueId)); + String headerBlueId = + fixture.blue.calculateBlueId( + partialHeader); + Map references = + new LinkedHashMap(); + references.put(timelineBlueId, timeline); + references.put(actorBlueId, actor); + references.put( + headerBlueId, + partialHeader); + Node inline = entry(timeline, actor); + Node referencedPartialHeader = + new Node().blueId(headerBlueId); + ExternalChannelFunctionContext context = + context(fixture, references); + + // when + List inlineKeys = + TimelineSubscriptionProjection.eventKeys( + inline, context); + List partialKeys = + TimelineSubscriptionProjection.eventKeys( + referencedPartialHeader, + context); + + // then + assertFalse(partialKeys.isEmpty()); + assertEquals(inlineKeys, partialKeys); + } + } + + @Test + void shouldFailClosedWhenVerifiedTimelineHeaderEvidenceIsUnavailable() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + Node exactHeader = entry( + timeline(fixture, "timeline-a"), + actor(fixture, "actor-a")); + Node unavailable = + new Node().blueId( + fixture.blue.calculateBlueId( + exactHeader)); + ExternalChannelFunctionContext context = + context( + fixture, + Collections.emptyMap()); + + // when + IllegalArgumentException failure = + assertThrows( + IllegalArgumentException.class, + () -> TimelineSubscriptionProjection + .eventKeys( + unavailable, + context)); + + // then + assertTrue( + failure.getMessage().contains( + "Missing exact reference"), + failure.getMessage()); + } + } + + @Test + void shouldFailClosedWhenVerifiedTimelineHeaderEvidenceIsInvalid() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + Node expectedHeader = entry( + timeline(fixture, "timeline-a"), + actor(fixture, "actor-a")); + String expectedBlueId = + fixture.blue.calculateBlueId( + expectedHeader); + Node invalidContent = entry( + timeline(fixture, "timeline-a"), + actor(fixture, "different-actor")); + Map references = + new LinkedHashMap(); + references.put( + expectedBlueId, + invalidContent); + ExternalChannelFunctionContext context = + context(fixture, references); + + // when + IllegalStateException failure = + assertThrows( + IllegalStateException.class, + () -> TimelineSubscriptionProjection + .eventKeys( + new Node().blueId( + expectedBlueId), + context)); + + // then + assertTrue( + failure.getMessage().contains( + "does not match exact reference"), + failure.getMessage()); + } + } + + @Test + void shouldPreserveProjectionAcrossColdAndWarmReferenceMaterialization() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + Node timeline = timeline( + fixture, "timeline-a"); + Node actor = actor( + fixture, "actor-a"); + String timelineBlueId = + fixture.blue.calculateBlueId( + timeline); + String actorBlueId = + fixture.blue.calculateBlueId( + actor); + Map references = + new LinkedHashMap(); + references.put(timelineBlueId, timeline); + references.put(actorBlueId, actor); + Node referenced = entry( + new Node().blueId(timelineBlueId), + new Node().blueId(actorBlueId)); + ExternalChannelFunctionContext coldContext = + context(fixture, references); + ExternalChannelFunctionContext warmContext = + context(fixture, references); + List inlineKeys = + eventKeys( + fixture, + entry(timeline, actor), + Collections.emptyMap()); + + // when + List coldKeys = + TimelineSubscriptionProjection.eventKeys( + referenced, + coldContext); + TimelineSubscriptionProjection.eventKeys( + referenced, + warmContext); + List warmKeys = + TimelineSubscriptionProjection.eventKeys( + referenced, + warmContext); + + // then + assertEquals(inlineKeys, coldKeys); + assertEquals(coldKeys, warmKeys); + } + } + + @Test + void shouldUseBroaderKeysForPartialPatterns() { + // given + Timeline exactTimeline = + new Timeline().timelineId("timeline-a"); + TimelineChannel timelineOnly = new TimelineChannel() + .timeline(exactTimeline) + .actor(new Actor()); + TimelineChannel fullyBroad = new TimelineChannel() + .timeline(new Timeline()) + .actor(new Actor()); + + // when + List timelineOnlyKeys = + TimelineSubscriptionProjection.channelKeys( + timelineOnly); + List broadKeys = + TimelineSubscriptionProjection.channelKeys( + fullyBroad); + + // then + assertEquals(1, timelineOnlyKeys.size()); + assertTrue(timelineOnlyKeys.get(0).startsWith( + TimelineSubscriptionProjection.VERSION + + ":timeline=")); + assertEquals( + Collections.singletonList( + TimelineSubscriptionProjection.BROAD_KEY), + broadKeys); + } + + @Test + void shouldReturnNoKeysForMalformedTimelineEntryHeaders() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + List malformed = Arrays.asList( + new Node().value("not an event"), + new Node() + .type(new Node().blueId( + TimelineEntry.blueId())) + .properties("timeline", + timeline(fixture, "timeline-a")), + new Node() + .type(new Node().blueId( + TimelineEntry.blueId())) + .properties("actor", + actor(fixture, "actor-a")), + entry( + new Node().type( + new Node().blueId( + PrincipalActor.blueId())), + actor(fixture, "actor-a")), + entry( + timeline(fixture, "timeline-a"), + new Node().type( + new Node().blueId( + Timeline.blueId())))); + ExternalChannelFunctionContext context = + context(fixture, Collections.emptyMap()); + + // when + List> projected = + new ArrayList>(); + for (Node event : malformed) { + projected.add( + TimelineSubscriptionProjection.eventKeys( + event, context)); + } + + // then + for (List keys : projected) { + assertTrue(keys.isEmpty(), keys.toString()); + } + } + } + + @Test + void shouldNotChargeHeaderReadsForNonTimelineEntryAtZeroGasLimit() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 0L); + ExternalChannelFunctionContext context = + context( + fixture, + Collections.emptyMap(), + parent); + Node nonTimelineEntry = + new Node().value("not-a-timeline-entry"); + + // when + List keys = + TimelineSubscriptionProjection.eventKeys( + nonTimelineEntry, + context); + + // then + assertTrue(keys.isEmpty()); + assertTrue( + context.runtimeWorkSession() + .stagedTrace() + .isEmpty()); + } + } + + @Test + void shouldChargeExactlyTwoHeaderReadsForTimelineEntry() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 2L); + ExternalChannelFunctionContext context = + context( + fixture, + Collections.emptyMap(), + parent); + Node timelineEntry = entry( + timeline(fixture, "timeline-a"), + actor(fixture, "actor-a")); + + // when + List keys = + TimelineSubscriptionProjection.eventKeys( + timelineEntry, + context); + + // then + assertFalse(keys.isEmpty()); + assertEquals( + 1, + context.runtimeWorkSession() + .stagedTrace() + .size()); + assertEquals( + "timelineHeaderRead", + context.runtimeWorkSession() + .stagedTrace() + .get(0) + .counter()); + assertEquals( + 2L, + context.runtimeWorkSession() + .stagedTrace() + .get(0) + .quantity()); + } + } + + @Test + void shouldChargeOnlyTimelineComparisonWhenMismatchShortCircuits() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 2L); + ExternalChannelFunctionContext context = + context( + fixture, + Collections.emptyMap(), + parent); + TimelineChannel channel = + channel("timeline-a", "actor-a"); + Node differentTimeline = entry( + timeline(fixture, "timeline-b"), + actor(fixture, "actor-a")); + + // when + boolean accepted = + TimelineExternalSubscriptionFunctions + .INSTANCE + .accepts( + channel, + differentTimeline, + context); + + // then + assertFalse(accepted); + assertEquals( + 1, + context.runtimeWorkSession() + .stagedTrace() + .size()); + assertEquals( + "timelineBindingCompared", + context.runtimeWorkSession() + .stagedTrace() + .get(0) + .counter()); + assertEquals( + 1L, + context.runtimeWorkSession() + .stagedTrace() + .get(0) + .quantity()); + assertEquals( + "compare Timeline binding", + context.runtimeWorkSession() + .stagedTrace() + .get(0) + .reason()); + } + } + + @Test + void shouldChargeTimelineAndActorComparisonsForAcceptedEntry() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 4L); + ExternalChannelFunctionContext context = + context( + fixture, + Collections.emptyMap(), + parent); + TimelineChannel channel = + channel("timeline-a", "actor-a"); + Node matching = entry( + timeline(fixture, "timeline-a"), + actor(fixture, "actor-a")); + + // when + boolean accepted = + TimelineExternalSubscriptionFunctions + .INSTANCE + .accepts( + channel, + matching, + context); + + // then + assertTrue(accepted); + assertEquals( + 2, + context.runtimeWorkSession() + .stagedTrace() + .size()); + assertEquals( + "compare Timeline binding", + context.runtimeWorkSession() + .stagedTrace() + .get(0) + .reason()); + assertEquals( + "compare Actor binding", + context.runtimeWorkSession() + .stagedTrace() + .get(1) + .reason()); + for (int index = 0; index < 2; index++) { + assertEquals( + "timelineBindingCompared", + context.runtimeWorkSession() + .stagedTrace() + .get(index) + .counter()); + assertEquals( + 1L, + context.runtimeWorkSession() + .stagedTrace() + .get(index) + .quantity()); + } + } + } + + @Test + void shouldIntersectKeysWheneverFinalAcceptanceSucceeds() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + List channels = Arrays.asList( + channel("timeline-a", "actor-a"), + channel("timeline-b", "actor-b")); + List events = Arrays.asList( + entry( + timeline(fixture, "timeline-a"), + actor(fixture, "actor-a")), + entry( + timeline(fixture, "timeline-a"), + actor(fixture, "actor-b")), + entry( + timeline(fixture, "timeline-b"), + actor(fixture, "actor-b"))); + ExternalChannelFunctionContext context = + context(fixture, Collections.emptyMap()); + int accepted = 0; + + // when + for (TimelineChannel channel : channels) { + for (Node event : events) { + if (!TimelineExternalSubscriptionFunctions.INSTANCE + .accepts(channel, event, context)) { + continue; + } + accepted++; + List channelKeys = + TimelineSubscriptionProjection.channelKeys( + channel); + List eventKeys = + TimelineSubscriptionProjection.eventKeys( + event, context); + + // then + assertFalse( + Collections.disjoint( + channelKeys, eventKeys), + channelKeys + " vs " + eventKeys); + } + } + assertTrue(accepted > 0); + } + } + + @Test + void shouldRecognizeRegisteredMyosSubtypeMembership() { + // given + try (ProjectionFixture fixture = configuredFixture()) { + MyOSTimeline timeline = new MyOSTimeline(); + timeline.timelineId("timeline-a"); + MyOSAdminActor actor = new MyOSAdminActor(); + actor.accountId("actor-a"); + Node timelineNode = fixture.blue.objectToNode(timeline); + Node actorNode = fixture.blue.objectToNode(actor); + + // when + List keys = eventKeys( + fixture, + entry(timelineNode, actorNode), + Collections.emptyMap()); + + // then + assertEquals( + MyOSTimeline.class, + fixture.blue.getTypeClassResolver() + .resolveClass(MyOSTimeline.blueId())); + assertEquals( + MyOSAdminActor.class, + fixture.blue.getTypeClassResolver() + .resolveClass(MyOSAdminActor.blueId())); + assertTrue(Timeline.class.isAssignableFrom( + fixture.blue.getTypeClassResolver() + .resolveClass(MyOSTimeline.blueId()))); + assertTrue(Actor.class.isAssignableFrom( + fixture.blue.getTypeClassResolver() + .resolveClass(MyOSAdminActor.blueId()))); + assertTrue(contains(keys, MyOSTimeline.blueId())); + assertTrue(contains(keys, MyOSAdminActor.blueId())); + } + } + + private static TimelineChannel channel( + String timelineId, + String actorId) { + return new TimelineChannel() + .timeline( + new Timeline().timelineId( + timelineId)) + .actor( + new PrincipalActor().accountId( + actorId)); + } + + private static Node timeline( + ProjectionFixture fixture, + String timelineId) { + return fixture.blue.objectToNode( + new Timeline().timelineId(timelineId)); + } + + private static Node actor( + ProjectionFixture fixture, + String actorId) { + return fixture.blue.objectToNode( + new PrincipalActor().accountId(actorId)); + } + + private static Node entry( + Node timeline, + Node actor) { + return new Node() + .type(new Node().blueId( + TimelineEntry.blueId())) + .properties("timeline", timeline) + .properties("actor", actor) + .properties("timestamp", + new Node().value(BigInteger.ONE)) + .properties("message", + new Node().value("message")); + } + + private static List eventKeys( + ProjectionFixture fixture, + Node event, + Map references) { + return TimelineSubscriptionProjection.eventKeys( + event, context(fixture, references)); + } + + private static boolean contains( + List keys, + String fragment) { + for (String key : keys) { + if (key.contains(fragment)) { + return true; + } + } + return false; + } + + private static ProjectionFixture configuredFixture() { + BlueRepository repository = + BlueRepository.current(); + CoordinationTestRuntime blue = + CoordinationTestRuntime.create(repository); + return new ProjectionFixture(blue); + } + + private static ExternalChannelFunctionContext context( + ProjectionFixture fixture, + Map references) { + return context( + fixture, + references, + new GasMeter()); + } + + private static ExternalChannelFunctionContext context( + ProjectionFixture fixture, + Map references, + GasMeter parent) { + try { + Class accessType = Class.forName( + "blue.language.processor." + + "ExternalChannelFunctionContext$Access"); + InvocationHandler handler = + new ProjectionAccess( + fixture, references); + Object access = Proxy.newProxyInstance( + accessType.getClassLoader(), + new Class[] {accessType}, + handler); + RuntimeWorkSession session = + runtimeWorkSession(parent); + Constructor constructor = + ExternalChannelFunctionContext.class + .getDeclaredConstructor( + String.class, + String.class, + accessType, + RuntimeWorkSession.class); + constructor.setAccessible(true); + return constructor.newInstance( + "/", "timeline", access, session); + } catch (ReflectiveOperationException exception) { + throw new IllegalStateException( + "Unable to construct projection context", + exception); + } + } + + private static RuntimeWorkSession runtimeWorkSession( + GasMeter parent) + throws ReflectiveOperationException { + Constructor constructor = + RuntimeWorkSession.class.getDeclaredConstructor( + GasMeter.class, + RuntimeWorkSession.Mode.class); + constructor.setAccessible(true); + return constructor.newInstance( + parent, + RuntimeWorkSession.Mode.ADMISSION); + } + + private static final class ProjectionAccess + implements InvocationHandler { + private final ProjectionFixture fixture; + private final Map references; + private final Map + materializedReferences = + new LinkedHashMap(); + + private ProjectionAccess( + ProjectionFixture fixture, + Map references) { + this.fixture = fixture; + this.references = + new LinkedHashMap( + references); + } + + @Override + public Object invoke( + Object proxy, + Method method, + Object[] arguments) { + if ("matchesPattern".equals( + method.getName())) { + return matchesPattern( + fixture, + (FrozenNode) arguments[0], + (FrozenNode) arguments[1]); + } + if ("materializeExactReference".equals( + method.getName())) { + FrozenNode reference = + (FrozenNode) arguments[0]; + FrozenNode warm = + materializedReferences.get( + reference + .getReferenceBlueId()); + if (warm != null) { + return warm; + } + Node materialized = references.get( + reference.getReferenceBlueId()); + if (materialized == null) { + throw new IllegalArgumentException( + "Missing exact reference " + + reference + .getReferenceBlueId()); + } + if (materialized.isReferenceOnly()) { + throw new IllegalStateException( + "Verified provider returned a reference " + + "instead of exact content for " + + reference + .getReferenceBlueId()); + } + String actualBlueId = + fixture.blue.calculateBlueId( + materialized); + if (!reference.getReferenceBlueId() + .equals(actualBlueId)) { + throw new IllegalStateException( + "Verified provider content " + + actualBlueId + + " does not match exact reference " + + reference + .getReferenceBlueId()); + } + FrozenNode verified = + FrozenNode.fromResolvedNode( + materialized); + materializedReferences.put( + reference.getReferenceBlueId(), + verified); + return verified; + } + if ("toString".equals(method.getName())) { + return "ProjectionAccess"; + } + if ("hashCode".equals(method.getName())) { + return Integer.valueOf( + System.identityHashCode(proxy)); + } + if ("equals".equals(method.getName())) { + return Boolean.valueOf( + proxy == arguments[0]); + } + throw new UnsupportedOperationException( + method.getName()); + } + + private static boolean matchesPattern( + ProjectionFixture fixture, + FrozenNode candidate, + FrozenNode pattern) { + if (pattern == null) { + return true; + } + if (candidate == null) { + return false; + } + return matchesNode( + fixture, + candidate.toNode(), + pattern.toNode()); + } + + private static boolean matchesNode( + ProjectionFixture fixture, + Node candidate, + Node pattern) { + if (pattern.getType() != null + && !matchesDeclaredType( + fixture, + candidate.getType(), + pattern.getType())) { + return false; + } + if (pattern.getValue() != null + && !Objects.equals( + pattern.getValue(), + candidate.getValue())) { + return false; + } + if (pattern.getProperties() == null) { + return true; + } + if (candidate.getProperties() == null) { + return false; + } + for (Map.Entry entry + : pattern.getProperties() + .entrySet()) { + Node candidateProperty = + candidate.getProperties().get( + entry.getKey()); + if (candidateProperty == null + || !matchesNode( + fixture, + candidateProperty, + entry.getValue())) { + return false; + } + } + return true; + } + + private static boolean matchesDeclaredType( + ProjectionFixture fixture, + Node candidateType, + Node patternType) { + String candidateBlueId = + candidateType != null + ? candidateType.getBlueId() + : null; + String patternBlueId = + patternType != null + ? patternType.getBlueId() + : null; + if (candidateBlueId == null + || patternBlueId == null) { + return Objects.equals( + candidateBlueId, + patternBlueId); + } + if (candidateBlueId.equals( + patternBlueId)) { + return true; + } + Class candidateClass = + fixture.blue.typeClassResolver() + .resolveClass(candidateBlueId); + Class patternClass = + fixture.blue.typeClassResolver() + .resolveClass(patternBlueId); + return candidateClass != null + && patternClass != null + && patternClass.isAssignableFrom( + candidateClass); + } + } + + private static final class ProjectionFixture + implements AutoCloseable { + private final CoordinationTestRuntime blue; + + private ProjectionFixture(CoordinationTestRuntime blue) { + this.blue = blue; + } + + @Override + public void close() { + blue.close(); + } + } + + @TypeBlueId(UNLISTED_TIMELINE_BLUE_ID) + private static final class UnlistedTimeline + extends Timeline { + @Override + public UnlistedTimeline timelineId( + String timelineId) { + super.timelineId(timelineId); + return this; + } + } + + @TypeBlueId(UNLISTED_ACTOR_BLUE_ID) + private static final class UnlistedActor + extends blue.repo.myos.PrincipalActor { + @Override + public UnlistedActor accountId( + String accountId) { + super.accountId(accountId); + return this; + } + } +} diff --git a/src/test/java/blue/coordination/processor/TriggerEventStepExecutorTest.java b/src/test/java/blue/coordination/processor/TriggerEventStepExecutorTest.java deleted file mode 100644 index d4d657a..0000000 --- a/src/test/java/blue/coordination/processor/TriggerEventStepExecutorTest.java +++ /dev/null @@ -1,303 +0,0 @@ -package blue.coordination.processor; - -import blue.coordination.processor.CoordinationProcessors; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.StatusCompleted; -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class TriggerEventStepExecutorTest { - - @Test - void emitsStaticEventPayload() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository, - 0, - triggerEventStep(chatMessageEvent("Hello World")))); - - DocumentProcessingResult result = processChat(fixture, document); - - assertEquals(1, result.triggeredEvents().size()); - assertEventType(result.triggeredEvents().get(0), ChatMessage.qualifiedName(), ChatMessage.blueId()); - assertEquals("Hello World", result.triggeredEvents().get(0).get("/message")); - } - - @Test - void staticPayloadPreservesNonStringValues() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository, - 1, - triggerEventStep(new Node() - .type("Coordination/Event") - .properties("amount", new Node().value(2))))); - - DocumentProcessingResult result = processChat(fixture, document); - - assertEquals(BigInteger.valueOf(2), result.triggeredEvents().get(0).get("/amount")); - } - - @Test - void bexOperatorPayloadFailsClearly() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository, - 0, - triggerEventStep(new Node().properties("$document", new Node().value("/counter"))))); - - DocumentProcessingResult result = processChat(fixture, document); - - assertRuntimeFatal(result, "Trigger Event event must be static"); - } - - @Test - void missingEventFailsClearly() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository, - 0, - new Node().type("Coordination/Trigger Event"))); - - DocumentProcessingResult result = processChat(fixture, document); - - assertRuntimeFatal(result, "Trigger Event step must declare event payload"); - } - - @Test - void namedEventOnlyFailsClearlyAsMissingSemanticPayload() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository, - 0, - triggerEventStep(new Node().name("Named Event Only")))); - - DocumentProcessingResult result = processChat(fixture, document); - - // Trigger Event requires semantic payload content such as type, value, - // properties, items, or a blueId; name/description-only metadata is not emitted. - assertRuntimeFatal(result, "Trigger Event step must declare event payload"); - } - - @Test - void emittedEventIsDeliveredToRuntimeTriggeredChannel() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, triggeredConsumerDocument(fixture.repository)); - - DocumentProcessingResult result = processChat(fixture, document); - - assertContainsEventType(result.triggeredEvents(), StatusCompleted.qualifiedName(), StatusCompleted.blueId()); - assertContainsChatMessage(result.triggeredEvents(), "Triggered consumer ran"); - } - - @Test - void lifecycleProducerCanTriggerConsumer() { - Fixture fixture = configuredFixture(); - - DocumentProcessingResult result = fixture.blue.initializeDocument( - fixture.blue.preprocess(lifecycleProducerDocument(fixture.repository))); - - assertContainsEventType(result.triggeredEvents(), StatusCompleted.qualifiedName(), StatusCompleted.blueId()); - assertContainsChatMessage(result.triggeredEvents(), "Init triggered consumer"); - } - - @Test - void triggerEventDoesNotMutateDocumentState() { - Fixture fixture = configuredFixture(); - Node document = initializedDocument(fixture, directWorkflowDocument(fixture.repository, - 9, - triggerEventStep(chatMessageEvent("state is external")))); - - DocumentProcessingResult result = processChat(fixture, document); - - assertEquals(BigInteger.valueOf(9), result.document().get("/counter")); - assertTriggeredChatMessage(result, "state is external"); - } - - private static Node directWorkflowDocument(BlueRepository repository, int counter, Node... steps) { - return directWorkflowDocument(repository, counter, null, steps); - } - - private static Node directWorkflowDocument(BlueRepository repository, - int counter, - String description, - Node... steps) { - Map contracts = ownerChannelContracts(); - Node workflow = new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items(steps)); - if (description != null) { - workflow.description(description); - } - contracts.put("direct", workflow); - return document(repository, counter, contracts); - } - - private static Node triggeredConsumerDocument(BlueRepository repository) { - Map contracts = ownerChannelContracts(); - contracts.put("triggered", new Node() - .type("Triggered Event Channel")); - contracts.put("producer", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("ownerChannel")) - .properties("steps", new Node().items( - triggerEventStep(new Node().type("Coordination/Status Completed"))))); - contracts.put("consumer", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("triggered")) - .properties("event", new Node().type("Coordination/Status Completed")) - .properties("steps", new Node().items( - triggerEventStep(chatMessageEvent("Triggered consumer ran"))))); - return document(repository, 0, contracts); - } - - private static Node lifecycleProducerDocument(BlueRepository repository) { - Map contracts = new LinkedHashMap(); - contracts.put("life", new Node() - .type("Lifecycle Event Channel")); - contracts.put("triggered", new Node() - .type("Triggered Event Channel")); - contracts.put("onInit", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("life")) - .properties("event", new Node().type("Document Processing Initiated")) - .properties("steps", new Node().items( - triggerEventStep(new Node().type("Coordination/Status Completed"))))); - contracts.put("consumer", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("triggered")) - .properties("event", new Node().type("Coordination/Status Completed")) - .properties("steps", new Node().items( - triggerEventStep(chatMessageEvent("Init triggered consumer"))))); - return document(repository, 0, contracts); - } - - private static Map ownerChannelContracts() { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", TestTimelineProvider.channel("owner")); - return contracts; - } - - private static Node triggerEventStep(Node event) { - return new Node() - .type("Coordination/Trigger Event") - .properties("event", event); - } - - private static Node chatMessageEvent(String message) { - return chatMessageEvent(new Node().value(message)); - } - - private static Node chatMessageEvent(Node message) { - return new Node() - .type("Coordination/Chat Message") - .properties("message", message); - } - - private static Node document(BlueRepository repository, int counter, Map contracts) { - return new Node() - .blue(repository.typeAliasBlue()) - .name("Trigger Event Test") - .properties("counter", new Node().value(counter)) - .properties("contracts", new Node().properties(contracts)); - } - - private static DocumentProcessingResult processChat(Fixture fixture, Node document) { - return fixture.blue.processDocument(document, chatTimelineEntry(fixture)); - } - - private static Node chatTimelineEntry(Fixture fixture) { - return TestTimelineProvider.timelineEntry( - fixture.blue, fixture.repository, "owner", 1, chatMessageEvent("run")); - } - - private static Node initializedDocument(Fixture fixture, Node document) { - return fixture.blue.initializeDocument(fixture.blue.preprocess(document)).document(); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static void assertTriggeredChatMessage(DocumentProcessingResult result, String expectedMessage) { - assertEquals(1, result.triggeredEvents().size()); - assertContainsChatMessage(result.triggeredEvents(), expectedMessage); - } - - private static void assertContainsChatMessage(List events, String expectedMessage) { - for (Node event : events) { - if (isEventType(event, ChatMessage.qualifiedName(), ChatMessage.blueId()) - && expectedMessage.equals(event.get("/message"))) { - return; - } - } - assertFalse(true, "Expected triggered chat message: " + expectedMessage); - } - - private static void assertContainsEventType(List events, String qualifiedName, String blueId) { - for (Node event : events) { - if (isEventType(event, qualifiedName, blueId)) { - return; - } - } - assertFalse(true, "Expected triggered event type: " + qualifiedName); - } - - private static void assertEventType(Node event, String qualifiedName, String blueId) { - assertTrue(isEventType(event, qualifiedName, blueId), - "Expected event type " + qualifiedName + " but was " + event); - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null && result.failureReason().contains(expectedMessage), - result.failureReason()); - } - - private static boolean isEventType(Node event, String qualifiedName, String blueId) { - if (event == null) { - return false; - } - Node type = event.getType(); - if (type != null) { - if (qualifiedName.equals(type.getValue())) { - return true; - } - if (blueId.equals(type.getBlueId())) { - return true; - } - } - if (event.getProperties() == null) { - return false; - } - Node typeProperty = event.getProperties().get("type"); - Object value = typeProperty != null ? typeProperty.getValue() : null; - if (qualifiedName.equals(value)) { - return true; - } - int slash = qualifiedName.indexOf('/'); - String localName = slash >= 0 ? qualifiedName.substring(slash + 1) : qualifiedName; - return localName.equals(value); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/bex/BexProcessingMetricsTest.java b/src/test/java/blue/coordination/processor/bex/BexProcessingMetricsTest.java index d08f857..7f80cdd 100644 --- a/src/test/java/blue/coordination/processor/bex/BexProcessingMetricsTest.java +++ b/src/test/java/blue/coordination/processor/bex/BexProcessingMetricsTest.java @@ -1,5 +1,8 @@ package blue.coordination.processor.bex; +import blue.bex.result.BexMetrics; +import blue.bex.result.BexMetricsRecorder; + import org.junit.jupiter.api.Test; import java.util.ArrayList; @@ -18,79 +21,138 @@ class BexProcessingMetricsTest { @Test - void genericLanguageMetricsAreThreadSafeSortedAndImmutable() throws Exception { + @SuppressWarnings("deprecation") + void shouldDelegateLegacyBexMetricsViewToImmutableSnapshot() { + // given + BexMetricsRecorder recorder = new BexMetricsRecorder(); + recorder.incrementCompiledExecutions(); + recorder.incrementCompileCacheHits(); + recorder.incrementCompileCacheMisses(); + recorder.addCompileNanos(13L); + recorder.addExecuteNanos(17L); + BexMetrics legacy = + BexMetrics.fromSnapshot(recorder.snapshot()); + BexProcessingMetrics metrics = new BexProcessingMetrics(); + + // when + metrics.addBexMetrics(legacy); + + // then + assertEquals(1L, metrics.bexCompiledExecutions()); + assertEquals(1L, metrics.bexCompileCacheHits()); + assertEquals(1L, metrics.bexCompileCacheMisses()); + assertEquals(13L, metrics.bexCompileNanos()); + assertEquals(17L, metrics.bexExecuteNanos()); + } + + @Test + void shouldRecordConcurrentLanguageMetricAdditionsSafely() throws Exception { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); int workers = 8; int additionsPerWorker = 2_000; - ExecutorService executor = Executors.newFixedThreadPool(workers); - CountDownLatch start = new CountDownLatch(1); - List> futures = new ArrayList<>(); - try { - for (int worker = 0; worker < workers; worker++) { - futures.add(executor.submit(() -> { - start.await(); - for (int addition = 0; addition < additionsPerWorker; addition++) { - metrics.addMetric("concurrent.additions", 1L); - } - return null; - })); - } - start.countDown(); - for (Future future : futures) { - future.get(); - } - } finally { - executor.shutdownNow(); - } - metrics.addMetric("alpha", 2L); + // when + recordConcurrentAdditions(metrics, workers, additionsPerWorker); + + // then + assertEquals((long) workers * additionsPerWorker, + metrics.snapshot().languageCounters.get("concurrent.additions")); + } + + @Test + void shouldExposeLanguageMetricsInSortedImmutableSnapshots() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.addMetric("zulu", 3L); - metrics.setMetric("cache.plan.entries", 1L); + metrics.addMetric("alpha", 2L); metrics.setMetric("cache.plan.entries", 7L); - metrics.recordMetricHighWater("cache.plan.highWaterBytes", 5L); metrics.recordMetricHighWater("cache.plan.highWaterBytes", 11L); - metrics.recordMetricHighWater("cache.plan.highWaterBytes", 9L); + // when BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); - assertEquals((long) workers * additionsPerWorker, - snapshot.languageCounters.get("concurrent.additions")); + + // then + assertEquals(Arrays.asList("alpha", "zulu"), + new ArrayList<>(snapshot.languageCounters.keySet())); assertEquals(7L, snapshot.languageGauges.get("cache.plan.entries")); assertEquals(11L, snapshot.languageHighWaterMarks.get("cache.plan.highWaterBytes")); - assertEquals(Arrays.asList("alpha", "concurrent.additions", "zulu"), - new ArrayList<>(snapshot.languageCounters.keySet())); - assertThrows(UnsupportedOperationException.class, () -> snapshot.languageCounters.put("later", 1L)); assertThrows(UnsupportedOperationException.class, () -> snapshot.languageGauges.clear()); assertThrows(UnsupportedOperationException.class, () -> snapshot.languageHighWaterMarks.remove("cache.plan.highWaterBytes")); + } + + @Test + void shouldKeepLanguageMetricSnapshotsStableAfterLaterUpdates() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); + metrics.addMetric("alpha", 2L); + metrics.setMetric("cache.plan.entries", 7L); + metrics.recordMetricHighWater("cache.plan.highWaterBytes", 11L); + BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); + // when metrics.addMetric("alpha", 5L); metrics.setMetric("cache.plan.entries", 9L); metrics.recordMetricHighWater("cache.plan.highWaterBytes", 13L); + + // then assertEquals(2L, snapshot.languageCounters.get("alpha")); assertEquals(7L, snapshot.languageGauges.get("cache.plan.entries")); assertEquals(11L, snapshot.languageHighWaterMarks.get("cache.plan.highWaterBytes")); } + private static void recordConcurrentAdditions(BexProcessingMetrics metrics, + int workers, + int additionsPerWorker) throws Exception { + ExecutorService executor = Executors.newFixedThreadPool(workers); + CountDownLatch start = new CountDownLatch(1); + List> futures = new ArrayList<>(); + try { + for (int worker = 0; worker < workers; worker++) { + futures.add(executor.submit(() -> { + start.await(); + for (int addition = 0; addition < additionsPerWorker; addition++) { + metrics.addMetric("concurrent.additions", 1L); + } + return null; + })); + } + start.countDown(); + for (Future future : futures) { + future.get(); + } + } finally { + executor.shutdownNow(); + } + } + @Test - void genericLanguageMetricsRetainSuffixesAndCacheMetricKinds() { + void shouldRetainLanguageMetricSuffixesAndCacheMetricKinds() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); - metrics.incrementFullSnapshotFallback("stalePreview"); - metrics.incrementNodeCloneCalls("patchValue"); - metrics.incrementNodeCloneCalls("patchValue"); - metrics.incrementCacheHits("processingSnapshot"); - metrics.setCacheCurrentWeightBytes("processingSnapshot", 40L); - metrics.setCacheEntries("processingSnapshot", 3L); - metrics.recordCacheHighWaterBytes("processingSnapshot", 40L); - metrics.recordCacheHighWaterBytes("processingSnapshot", 35L); - metrics.recordCacheHighWaterBytes("processingSnapshot", 52L); - + // when + metrics.addMetric("fullSnapshotFallbacks", 1L); + metrics.addMetric("fullSnapshotFallbackReason.stalePreview", 1L); + metrics.addMetric("nodeCloneCallsByPurpose.patchValue", 2L); + metrics.addMetric("cache.processingSnapshot.hits", 1L); + metrics.setMetric("cache.processingSnapshot.currentWeightBytes", 40L); + metrics.setMetric("cache.processingSnapshot.entries", 3L); + metrics.recordMetricHighWater( + "cache.processingSnapshot.highWaterBytes", 40L); + metrics.recordMetricHighWater( + "cache.processingSnapshot.highWaterBytes", 35L); + metrics.recordMetricHighWater( + "cache.processingSnapshot.highWaterBytes", 52L); Map counters = metrics.languageCounters(); + + // then assertEquals(1L, counters.get("fullSnapshotFallbacks")); assertEquals(1L, counters.get("fullSnapshotFallbackReason.stalePreview")); assertEquals(2L, counters.get("nodeCloneCallsByPurpose.patchValue")); @@ -104,18 +166,21 @@ void genericLanguageMetricsRetainSuffixesAndCacheMetricKinds() { } @Test - void genericLanguageMetricNamesAreCappedAcrossMetricKinds() { + void shouldCapLanguageMetricNamesAcrossMetricKinds() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); for (int index = 0; index < BexProcessingMetrics.MAX_LANGUAGE_METRIC_NAMES; index++) { metrics.addMetric("bounded." + index, 1L); } + // when metrics.setMetric("bounded.0", 7L); metrics.setMetric("overflow.gauge", 9L); metrics.recordMetricHighWater("overflow.highWater", 11L); metrics.addMetric("overflow.counter", 1L); BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); + // then assertEquals(BexProcessingMetrics.MAX_LANGUAGE_METRIC_NAMES, snapshot.languageCounters.size()); assertEquals(7L, snapshot.languageGauges.get("bounded.0")); @@ -127,14 +192,17 @@ void genericLanguageMetricNamesAreCappedAcrossMetricKinds() { } @Test - void bexProcessingMetricsExposeProcessEventSnapshotCounters() { + void shouldExposeProcessEventSnapshotCounters() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); + // when metrics.incrementProcessEventSnapshotAttempts(); metrics.incrementProcessEventSnapshotBuilds(); metrics.incrementProcessEventSnapshotFailures(); metrics.addProcessEventSnapshotConstructionNanos(-1L); + // then assertEquals(1L, metrics.processEventSnapshotAttempts()); assertEquals(1L, metrics.processEventSnapshotBuilds()); assertEquals(1L, metrics.processEventSnapshotFailures()); @@ -143,42 +211,49 @@ void bexProcessingMetricsExposeProcessEventSnapshotCounters() { } @Test - void bexProcessingMetricsSnapshotIsImmutableAndAccumulates() { + void shouldAccumulateProcessEventMetricsWithoutMutatingEarlierSnapshots() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.incrementProcessEventSnapshotAttempts(); metrics.incrementProcessEventSnapshotBuilds(); metrics.addProcessEventSnapshotConstructionNanos(11L); BexProcessingMetrics.Snapshot first = metrics.snapshot(); + // when metrics.incrementProcessEventSnapshotAttempts(); metrics.incrementProcessEventSnapshotBuilds(); metrics.incrementProcessEventSnapshotFailures(); metrics.addProcessEventSnapshotConstructionNanos(13L); BexProcessingMetrics.Snapshot second = metrics.snapshot(); + // then assertSnapshot(first, 1L, 1L, 0L, 11L); assertSnapshot(second, 2L, 2L, 1L, 24L); } @Test - void terminationMetricsAreBoundedCountersAndSnapshotsAreImmutable() { + void shouldAccumulateTerminationCountersWithoutMutatingEarlierSnapshots() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.incrementSuccessfulComputeTerminationRequests(); metrics.incrementDeclarativeTerminationSteps(); metrics.incrementComputeResultValidationFailures(); BexProcessingMetrics.Snapshot first = metrics.snapshot(); + // when metrics.incrementSuccessfulComputeTerminationRequests(); metrics.incrementDeclarativeTerminationSteps(); metrics.incrementComputeResultValidationFailures(); BexProcessingMetrics.Snapshot second = metrics.snapshot(); + // then assertTerminationSnapshot(first, 1L); assertTerminationSnapshot(second, 2L); } @Test - void languageSequenceCallbacksExposeProofAliasesAndImmutableSnapshots() { + void shouldExposeLanguageSequenceAliasesWithoutMutatingEarlierSnapshots() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.incrementPatchSequencesPrepared(); metrics.addPatchesPrepared(3L); @@ -199,12 +274,14 @@ void languageSequenceCallbacksExposeProofAliasesAndImmutableSnapshots() { metrics.incrementPatchValueMaterializations(); BexProcessingMetrics.Snapshot first = metrics.snapshot(); + // when metrics.incrementPatchSequencesPrepared(); metrics.addPatchesPrepared(2L); metrics.incrementSequenceFinalSnapshotCacheInserts(); metrics.incrementPatchValueMaterializations(); BexProcessingMetrics.Snapshot second = metrics.snapshot(); + // then assertLanguageSnapshot(first, 1L, 3L, 1L, 1L); assertEquals(0L, first.sequencePlanningNanos); assertEquals(2L, first.sequenceConformanceNanos); @@ -222,7 +299,8 @@ void languageSequenceCallbacksExposeProofAliasesAndImmutableSnapshots() { } @Test - void planAndConversionMetricsUseImmutableSnapshotsAndNonNegativeWeightGauges() { + void shouldExposeWorkflowPlanMetrics() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.incrementWorkflowPlansBuilt(); metrics.incrementWorkflowPlanCacheHits(); @@ -232,6 +310,25 @@ void planAndConversionMetricsUseImmutableSnapshotsAndNonNegativeWeightGauges() { metrics.incrementWorkflowExecutorLookups(); metrics.incrementWorkflowStepResultSnapshotsCreated(); metrics.incrementWorkflowStepResultViewHits(); + + // when + BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); + + // then + assertEquals(1L, snapshot.workflowPlansBuilt); + assertEquals(1L, snapshot.workflowPlanCacheHits); + assertEquals(1L, snapshot.workflowPlanCacheMisses); + assertEquals(1L, snapshot.workflowPlanCacheEvictions); + assertEquals(100L, snapshot.workflowPlanWeightBytes); + assertEquals(1L, snapshot.workflowExecutorLookups); + assertEquals(1L, snapshot.workflowStepResultSnapshotsCreated); + assertEquals(1L, snapshot.workflowStepResultViewHits); + } + + @Test + void shouldExposeComputePlanMetrics() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.incrementComputePlansBuilt(); metrics.incrementComputePlanCacheHits(); metrics.incrementComputePlanCacheMisses(); @@ -240,42 +337,57 @@ void planAndConversionMetricsUseImmutableSnapshotsAndNonNegativeWeightGauges() { metrics.incrementComputeDefinitionMaterializations(); metrics.incrementComputeDefinitionFrozenDirectHits(); metrics.incrementComputeProgramSourceBuilds(); + + // when + BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); + + // then + assertEquals(1L, snapshot.computePlansBuilt); + assertEquals(1L, snapshot.computePlanCacheHits); + assertEquals(1L, snapshot.computePlanCacheMisses); + assertEquals(1L, snapshot.computePlanCacheEvictions); + assertEquals(200L, snapshot.computePlanWeightBytes); + assertEquals(1L, snapshot.computeDefinitionMaterializations); + assertEquals(1L, snapshot.computeDefinitionFrozenDirectHits); + assertEquals(1L, snapshot.computeProgramSourceBuilds); + } + + @Test + void shouldExposeConversionAndStaticUpdateMetrics() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); metrics.incrementBexPatchFrozenDirectConversions(); metrics.incrementBexPatchNodeMaterializations(); metrics.incrementUpdateStaticTemplatesBuilt(); metrics.incrementUpdateStaticTemplateHits(); metrics.incrementUpdateReflectionFallbacks(); - BexProcessingMetrics.Snapshot first = metrics.snapshot(); + // when + BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); + + // then + assertEquals(1L, snapshot.bexPatchFrozenDirectConversions); + assertEquals(1L, snapshot.bexPatchNodeMaterializations); + assertEquals(1L, snapshot.updateStaticTemplatesBuilt); + assertEquals(1L, snapshot.updateStaticTemplateHits); + assertEquals(1L, snapshot.updateReflectionFallbacks); + } + + @Test + void shouldClampPlanWeightGaugesAtZero() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); + metrics.addWorkflowPlanWeightBytes(100L); + metrics.addComputePlanWeightBytes(200L); + + // when metrics.addWorkflowPlanWeightBytes(-150L); - metrics.addComputePlanWeightBytes(-50L); - metrics.incrementWorkflowPlansBuilt(); - BexProcessingMetrics.Snapshot second = metrics.snapshot(); + metrics.addComputePlanWeightBytes(-250L); + BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); - assertEquals(1L, first.workflowPlansBuilt); - assertEquals(1L, first.workflowPlanCacheHits); - assertEquals(1L, first.workflowPlanCacheMisses); - assertEquals(1L, first.workflowPlanCacheEvictions); - assertEquals(100L, first.workflowPlanWeightBytes); - assertEquals(1L, first.workflowExecutorLookups); - assertEquals(1L, first.workflowStepResultSnapshotsCreated); - assertEquals(1L, first.workflowStepResultViewHits); - assertEquals(1L, first.computePlansBuilt); - assertEquals(1L, first.computePlanCacheHits); - assertEquals(1L, first.computePlanCacheMisses); - assertEquals(1L, first.computePlanCacheEvictions); - assertEquals(200L, first.computePlanWeightBytes); - assertEquals(1L, first.computeDefinitionMaterializations); - assertEquals(1L, first.computeDefinitionFrozenDirectHits); - assertEquals(1L, first.computeProgramSourceBuilds); - assertEquals(1L, first.bexPatchFrozenDirectConversions); - assertEquals(1L, first.bexPatchNodeMaterializations); - assertEquals(1L, first.updateStaticTemplatesBuilt); - assertEquals(1L, first.updateStaticTemplateHits); - assertEquals(1L, first.updateReflectionFallbacks); - assertEquals(2L, second.workflowPlansBuilt); - assertEquals(0L, second.workflowPlanWeightBytes); - assertEquals(150L, second.computePlanWeightBytes); + // then + assertEquals(0L, snapshot.workflowPlanWeightBytes); + assertEquals(0L, snapshot.computePlanWeightBytes); } private static void assertSnapshot(BexProcessingMetrics.Snapshot snapshot, diff --git a/src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidence.java b/src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidence.java new file mode 100644 index 0000000..65a7d93 --- /dev/null +++ b/src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidence.java @@ -0,0 +1,125 @@ +package blue.coordination.processor.bex; + +import blue.language.snapshot.FrozenNode; +import blue.language.identity.BlueIds; + +import java.util.Objects; + +/** + * Test-only evidence collector for the Processing Event identity assertions + * used by the executable conformance harness. + */ +public final class ProcessingEventIdentityEvidence + implements ProcessingEventIdentityObserver { + private String admittedBlueId; + private boolean stable = true; + private long workflowObservations; + private long bexBindingObservations; + + @Override + public synchronized void observe( + FrozenNode processingEvent, + String exposedBlueId, + Boundary boundary) { + FrozenNode exactEvent = Objects.requireNonNull( + processingEvent, "processingEvent"); + String exactExposedBlueId = requireBlueId( + exposedBlueId, "exposedBlueId"); + Boundary exactBoundary = Objects.requireNonNull( + boundary, "boundary"); + String snapshotBlueId = requireBlueId( + exactEvent.blueId(), "processingEvent.blueId"); + + if (!snapshotBlueId.equals(exactExposedBlueId)) { + stable = false; + } + if (admittedBlueId == null) { + admittedBlueId = snapshotBlueId; + } else if (!admittedBlueId.equals(snapshotBlueId)) { + stable = false; + } + + if (exactBoundary == Boundary.WORKFLOW) { + workflowObservations++; + } else { + bexBindingObservations++; + } + } + + /** + * Returns an immutable point-in-time evidence view. + * + * @return current evidence snapshot + */ + public synchronized Snapshot snapshot() { + return new Snapshot( + admittedBlueId, + stable, + workflowObservations, + bexBindingObservations); + } + + private static String requireBlueId( + String blueId, + String name) { + return BlueIds.requirePlainBlueId( + blueId, name); + } + + /** Immutable Processing Event identity evidence. */ + public static final class Snapshot { + private final String admittedBlueId; + private final boolean stable; + private final long workflowObservations; + private final long bexBindingObservations; + + private Snapshot( + String admittedBlueId, + boolean stable, + long workflowObservations, + long bexBindingObservations) { + this.admittedBlueId = admittedBlueId; + this.stable = stable; + this.workflowObservations = workflowObservations; + this.bexBindingObservations = + bexBindingObservations; + } + + /** + * Whether at least one exact Coordination boundary was observed. + * + * @return {@code true} only when evidence is present + */ + public boolean observed() { + return workflowObservations + + bexBindingObservations > 0L; + } + + /** + * Whether every observed boundary retained the admitted identity. + * + *

Callers must also require {@link #observed()} before treating this + * value as proof.

+ * + * @return identity-stability result for the observations + */ + public boolean stable() { + return stable; + } + + /** @return first exact Processing Event BlueId, or {@code null} */ + public String admittedBlueId() { + return admittedBlueId; + } + + /** @return number of workflow-boundary observations */ + public long workflowObservations() { + return workflowObservations; + } + + /** @return number of hosted BEX binding observations */ + public long bexBindingObservations() { + return bexBindingObservations; + } + } +} diff --git a/src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidenceTest.java b/src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidenceTest.java new file mode 100644 index 0000000..c2c314a --- /dev/null +++ b/src/test/java/blue/coordination/processor/bex/ProcessingEventIdentityEvidenceTest.java @@ -0,0 +1,123 @@ +package blue.coordination.processor.bex; + +import blue.language.model.Node; +import blue.language.snapshot.FrozenNode; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ProcessingEventIdentityEvidenceTest { + + @Test + void shouldKeepEmptyEvidenceExplicitlyUnobserved() { + // given + ProcessingEventIdentityEvidence evidence = + new ProcessingEventIdentityEvidence(); + + // when + ProcessingEventIdentityEvidence.Snapshot snapshot = + evidence.snapshot(); + + // then + assertFalse(snapshot.observed()); + assertNull(snapshot.admittedBlueId()); + assertEquals(0L, snapshot.workflowObservations()); + assertEquals(0L, snapshot.bexBindingObservations()); + } + + @Test + void shouldProveSameIdentityAcrossWorkflowAndBexBoundaries() { + // given + ProcessingEventIdentityEvidence evidence = + new ProcessingEventIdentityEvidence(); + FrozenNode processingEvent = + event("original"); + String admittedBlueId = + processingEvent.blueId(); + + // when + evidence.observe( + processingEvent, + admittedBlueId, + ProcessingEventIdentityObserver.Boundary + .WORKFLOW); + evidence.observe( + processingEvent, + admittedBlueId, + ProcessingEventIdentityObserver.Boundary + .BEX_BINDING); + ProcessingEventIdentityEvidence.Snapshot snapshot = + evidence.snapshot(); + + // then + assertTrue(snapshot.observed()); + assertTrue(snapshot.stable()); + assertEquals( + admittedBlueId, + snapshot.admittedBlueId()); + assertEquals(1L, snapshot.workflowObservations()); + assertEquals(1L, snapshot.bexBindingObservations()); + } + + @Test + void shouldRejectIdentityDifferentFromExposedBexBinding() { + // given + ProcessingEventIdentityEvidence evidence = + new ProcessingEventIdentityEvidence(); + FrozenNode processingEvent = + event("original"); + + // when + evidence.observe( + processingEvent, + event("different").blueId(), + ProcessingEventIdentityObserver.Boundary + .BEX_BINDING); + ProcessingEventIdentityEvidence.Snapshot snapshot = + evidence.snapshot(); + + // then + assertTrue(snapshot.observed()); + assertFalse(snapshot.stable()); + } + + @Test + void shouldRejectChangedProcessingEventAcrossWorkflowInvocations() { + // given + ProcessingEventIdentityEvidence evidence = + new ProcessingEventIdentityEvidence(); + FrozenNode original = + event("original"); + FrozenNode changed = + event("changed"); + + // when + evidence.observe( + original, + original.blueId(), + ProcessingEventIdentityObserver.Boundary + .WORKFLOW); + evidence.observe( + changed, + changed.blueId(), + ProcessingEventIdentityObserver.Boundary + .WORKFLOW); + ProcessingEventIdentityEvidence.Snapshot snapshot = + evidence.snapshot(); + + // then + assertTrue(snapshot.observed()); + assertFalse(snapshot.stable()); + } + + private static FrozenNode event(String marker) { + return FrozenNode.fromResolvedNode( + new Node().properties( + "marker", + new Node().value(marker))); + } +} diff --git a/src/test/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentViewTest.java b/src/test/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentViewTest.java new file mode 100644 index 0000000..9c0d98d --- /dev/null +++ b/src/test/java/blue/coordination/processor/bex/ScopedProcessorExecutionContextBexDocumentViewTest.java @@ -0,0 +1,460 @@ +package blue.coordination.processor.bex; + +import blue.bex.value.BexValue; +import blue.bex.value.BexValues; +import blue.language.model.Node; +import blue.language.snapshot.FrozenNode; + +import java.math.BigInteger; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ScopedProcessorExecutionContextBexDocumentViewTest { + + @Test + void shouldPreserveResolvedSemanticsForWorkingDocumentDirectRead() { + // given + ExactValue exact = exactInteger(7); + RecordingFrozenAccess access = + new RecordingFrozenAccess(); + access.workingCanonical = exact.canonical; + access.workingResolved = exact.resolved; + ScopedProcessorExecutionContextBexDocumentView view = + new ScopedProcessorExecutionContextBexDocumentView( + access, null); + + // when + BexValue canonicalRead = + view.canonicalAt("/counter"); + BexValue resolvedRead = + view.resolvedAt("/counter"); + + // then + assertExactInteger( + canonicalRead, exact.blueId, 7); + assertExactInteger( + resolvedRead, exact.blueId, 7); + assertEquals(4, access.workingDirectReads); + assertEquals(0, access.processorDirectReads); + assertEquals(0, access.rootReads); + } + + @Test + void shouldUseProcessorSnapshotPairWhenWorkingValueIsCollapsedReference() { + // given + ExactValue exact = exactObject( + "processor snapshot"); + RecordingFrozenAccess access = + new RecordingFrozenAccess(); + access.workingCanonical = exact.canonical; + access.workingResolved = exact.canonical; + access.processorCanonical = exact.canonical; + access.processorResolved = exact.resolved; + ScopedProcessorExecutionContextBexDocumentView view = + new ScopedProcessorExecutionContextBexDocumentView( + access, null); + + // when + BexValue read = + view.resolvedAt("/status"); + + // then + assertTrue(read.isExact()); + assertEquals(exact.blueId, read.exactBlueId()); + assertEquals( + "processor snapshot", + read.get("marker").asText()); + assertEquals(2, access.workingDirectReads); + assertEquals(2, access.processorDirectReads); + assertEquals(0, access.rootReads); + } + + @Test + void shouldPairCanonicalAndResolvedWorkingRootsDuringFallback() { + // given + ExactValue exact = exactObject( + "root fallback"); + RecordingFrozenAccess access = + new RecordingFrozenAccess(); + access.workingCanonicalRoot = + FrozenNode.fromNode( + new Node().properties( + "nested", + new Node().blueId( + exact.blueId))); + access.workingResolvedRoot = + FrozenNode.fromResolvedNode( + new Node().properties( + "nested", + exact.resolved.toNode())); + ScopedProcessorExecutionContextBexDocumentView view = + new ScopedProcessorExecutionContextBexDocumentView( + access, null); + + // when + BexValue read = + view.canonicalAt("/nested"); + + // then + assertTrue(read.isExact()); + assertEquals(exact.blueId, read.exactBlueId()); + assertEquals( + "root fallback", + read.get("marker").asText()); + assertEquals(2, access.workingDirectReads); + assertEquals(2, access.processorDirectReads); + assertEquals(2, access.rootReads); + } + + @Test + void shouldDemandProcessorChildBeforeUsingCollapsedRootChild() { + // given + ExactValue counter = exactInteger(7); + CollapsedChildFrozenAccess access = + new CollapsedChildFrozenAccess( + "counter", counter); + ScopedProcessorExecutionContextBexDocumentView view = + new ScopedProcessorExecutionContextBexDocumentView( + access, null); + + // when + BexValue read = view.resolvedAt("/") + .get("counter"); + + // then + assertExactInteger( + read, counter.blueId, 7); + assertEquals(1, access.processorResolvedReads); + } + + @Test + void shouldExposeResolvedBooleanWithoutCursorScalarCoercion() { + // given + ExactValue exact = exactBoolean(false); + RecordingFrozenAccess access = + new RecordingFrozenAccess(); + access.workingCanonical = exact.canonical; + access.workingResolved = exact.resolved; + ScopedProcessorExecutionContextBexDocumentView view = + new ScopedProcessorExecutionContextBexDocumentView( + access, null); + + // when + BexValue read = view.resolvedAt("/payNoteAttached"); + + // then + assertTrue(read.isScalar()); + assertTrue(BexValues.equal( + read, + BexValues.scalar(false))); + } + + @Test + void shouldReadCollapsedLeafThroughResolvedProcessorScope() { + // given + ExactValue amount = exactInteger(0); + ResolvedScopeFrozenAccess access = + new ResolvedScopeFrozenAccess(amount); + ScopedProcessorExecutionContextBexDocumentView view = + new ScopedProcessorExecutionContextBexDocumentView( + access, null); + + // when + BexValue read = view.resolvedAt( + "/embedded/authorization/amount"); + + // then + assertExactInteger(read, amount.blueId, 0); + assertEquals(1, access.scopeResolvedReads); + } + + private static void assertExactInteger( + BexValue actual, + String expectedBlueId, + int expectedValue) { + assertTrue(actual.isExact()); + assertEquals( + expectedBlueId, + actual.exactBlueId()); + assertEquals( + BigInteger.valueOf(expectedValue), + actual.asInteger()); + } + + private static ExactValue exactInteger( + int value) { + return exact( + new Node().value(value)); + } + + private static ExactValue exactBoolean( + boolean value) { + return exact( + new Node().value(value)); + } + + private static ExactValue exactObject( + String marker) { + return exact( + new Node().properties( + "marker", + new Node().value(marker))); + } + + private static ExactValue exact( + Node resolvedNode) { + FrozenNode resolved = + FrozenNode.fromResolvedNode( + resolvedNode); + String blueId = + resolved.blueId(); + return new ExactValue( + FrozenNode.fromNode( + new Node().blueId( + blueId)), + resolved, + blueId); + } + + private static final class ExactValue { + private final FrozenNode canonical; + private final FrozenNode resolved; + private final String blueId; + + private ExactValue( + FrozenNode canonical, + FrozenNode resolved, + String blueId) { + this.canonical = canonical; + this.resolved = resolved; + this.blueId = blueId; + } + } + + private static final class RecordingFrozenAccess + implements ScopedProcessorExecutionContextBexDocumentView + .FrozenAccess { + private FrozenNode workingCanonical; + private FrozenNode workingResolved; + private FrozenNode processorCanonical; + private FrozenNode processorResolved; + private FrozenNode workingCanonicalRoot; + private FrozenNode workingResolvedRoot; + private int workingDirectReads; + private int processorDirectReads; + private int rootReads; + + @Override + public String resolvePointer( + String authoredPointer) { + return authoredPointer; + } + + @Override + public String currentScopePath() { + return "/"; + } + + @Override + public FrozenNode workingCanonicalAt( + String absolutePointer) { + workingDirectReads++; + return workingCanonical; + } + + @Override + public FrozenNode workingResolvedAt( + String absolutePointer) { + workingDirectReads++; + return workingResolved; + } + + @Override + public FrozenNode processorCanonicalAt( + String absolutePointer) { + processorDirectReads++; + return processorCanonical; + } + + @Override + public FrozenNode processorResolvedAt( + String absolutePointer) { + processorDirectReads++; + return processorResolved; + } + + @Override + public FrozenNode workingCanonicalRoot() { + rootReads++; + return workingCanonicalRoot; + } + + @Override + public FrozenNode workingResolvedRoot() { + rootReads++; + return workingResolvedRoot; + } + } + + private static final class CollapsedChildFrozenAccess + implements ScopedProcessorExecutionContextBexDocumentView + .FrozenAccess { + private final String childPointer; + private final ExactValue child; + private final FrozenNode collapsedRoot; + private int processorResolvedReads; + + private CollapsedChildFrozenAccess( + String childKey, + ExactValue child) { + this.childPointer = "/" + childKey; + this.child = child; + this.collapsedRoot = FrozenNode.fromResolvedNode( + new Node().properties( + childKey, + new Node().blueId( + child.blueId))); + } + + @Override + public String resolvePointer( + String authoredPointer) { + return authoredPointer; + } + + @Override + public String currentScopePath() { + return "/"; + } + + @Override + public FrozenNode workingCanonicalAt( + String absolutePointer) { + return "/".equals(absolutePointer) + ? collapsedRoot + : childPointer.equals(absolutePointer) + ? child.canonical + : null; + } + + @Override + public FrozenNode workingResolvedAt( + String absolutePointer) { + return "/".equals(absolutePointer) + ? collapsedRoot + : childPointer.equals(absolutePointer) + ? child.canonical + : null; + } + + @Override + public FrozenNode processorCanonicalAt( + String absolutePointer) { + return childPointer.equals(absolutePointer) + ? child.canonical + : null; + } + + @Override + public FrozenNode processorResolvedAt( + String absolutePointer) { + processorResolvedReads++; + return childPointer.equals(absolutePointer) + ? child.resolved + : null; + } + + @Override + public FrozenNode workingCanonicalRoot() { + return collapsedRoot; + } + + @Override + public FrozenNode workingResolvedRoot() { + return collapsedRoot; + } + } + + private static final class ResolvedScopeFrozenAccess + implements ScopedProcessorExecutionContextBexDocumentView + .FrozenAccess { + private static final String SCOPE = "/embedded"; + private static final String LEAF = + "/embedded/authorization/amount"; + + private final ExactValue amount; + private final FrozenNode resolvedScope; + private int scopeResolvedReads; + + private ResolvedScopeFrozenAccess( + ExactValue amount) { + this.amount = amount; + this.resolvedScope = FrozenNode.fromResolvedNode( + new Node().properties( + "authorization", + new Node().properties( + "amount", + amount.resolved.toNode()))); + } + + @Override + public String resolvePointer( + String authoredPointer) { + return authoredPointer; + } + + @Override + public String currentScopePath() { + return SCOPE; + } + + @Override + public FrozenNode workingCanonicalAt( + String absolutePointer) { + return LEAF.equals(absolutePointer) + ? amount.canonical + : null; + } + + @Override + public FrozenNode workingResolvedAt( + String absolutePointer) { + return LEAF.equals(absolutePointer) + ? amount.canonical + : null; + } + + @Override + public FrozenNode processorCanonicalAt( + String absolutePointer) { + return LEAF.equals(absolutePointer) + ? amount.canonical + : null; + } + + @Override + public FrozenNode processorResolvedAt( + String absolutePointer) { + if (SCOPE.equals(absolutePointer)) { + scopeResolvedReads++; + return resolvedScope; + } + return LEAF.equals(absolutePointer) + ? amount.canonical + : null; + } + + @Override + public FrozenNode workingCanonicalRoot() { + return null; + } + + @Override + public FrozenNode workingResolvedRoot() { + return null; + } + } +} diff --git a/src/test/java/blue/coordination/processor/compute/BexCounterPersistenceRoundTripTest.java b/src/test/java/blue/coordination/processor/compute/BexCounterPersistenceRoundTripTest.java deleted file mode 100644 index 4ed406d..0000000 --- a/src/test/java/blue/coordination/processor/compute/BexCounterPersistenceRoundTripTest.java +++ /dev/null @@ -1,156 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import java.math.BigInteger; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Scenario: - * A production-style counter document is initialized once, stored as canonical data, then reloaded for - * every incoming event before being processed and stored again. - * - * Main flow: - * 1. Initialize the BEX counter document and serialize the canonical result. - * 2. Run 100 independent {@code increment} operation requests, each adding 1 to {@code /counter}. - * 3. Before each increment, deserialize the previously stored canonical document and load a snapshot. - * 4. After each increment, serialize the new canonical document for the next iteration. - * - * Actors and operations: - * - The owner timeline calls {@code increment}. - * - {@code Coordination/Compute} builds and applies the returned changeset. - */ -class BexCounterPersistenceRoundTripTest { - private static final int ITERATIONS = 100; - private static final String COUNTER_RESOURCE = "coordination/compute/bex-counter-persistence.yaml"; - - @Test - void serializedCanonicalDocumentCanBeReloadedAndProcessedAcrossOneHundredBexIncrements() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - CoordinationProcessorOptions options = CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build(); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(options); - - long start = System.nanoTime(); - - long initializeStart = System.nanoTime(); - DocumentProcessingResult initialized = support.initialize(support.yamlResource(COUNTER_RESOURCE)); - long initializeNanos = System.nanoTime() - initializeStart; - assertFalse(initialized.capabilityFailure(), initialized.failureReason()); - assertNotNull(initialized.snapshot()); - - long initialSerializeStart = System.nanoTime(); - String storedCanonicalJson = serializeCanonical(support, initialized); - long initialSerializeNanos = System.nanoTime() - initialSerializeStart; - String storedBlueId = initialized.blueId(); - assertNotNull(storedBlueId); - - long totalProcessNanos = 0L; - long totalDeserializeAndLoadSnapshotNanos = 0L; - long totalSerializeNanos = 0L; - - for (int i = 1; i <= ITERATIONS; i++) { - ComputeWorkflowTestSupport coldSupport = ComputeWorkflowTestSupport.create(options); - long loadStart = System.nanoTime(); - ResolvedSnapshot snapshot = deserializeCanonicalAndLoadSnapshot( - coldSupport, storedCanonicalJson); - totalDeserializeAndLoadSnapshotNanos += System.nanoTime() - loadStart; - assertNotNull(snapshot.blueId(), "stored snapshot should load at iteration " + i); - storedBlueId = snapshot.blueId(); - - long processStart = System.nanoTime(); - DocumentProcessingResult result = coldSupport.blue.processDocument(snapshot, - operationRequest(coldSupport.blue, coldSupport.repository, i)); - totalProcessNanos += System.nanoTime() - processStart; - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNotNull(result.snapshot(), "iteration " + i + " should return a snapshot"); - assertEquals(BigInteger.valueOf(i), result.resolvedDocument().get("/counter")); - - long serializeStart = System.nanoTime(); - storedCanonicalJson = serializeCanonical(coldSupport, result); - storedBlueId = result.blueId(); - totalSerializeNanos += System.nanoTime() - serializeStart; - } - - long totalNanos = System.nanoTime() - start; - ResolvedSnapshot finalSnapshot = deserializeCanonicalAndLoadSnapshot( - ComputeWorkflowTestSupport.create(options), storedCanonicalJson); - assertEquals(BigInteger.valueOf(ITERATIONS), finalSnapshot.resolvedNodeAt("/counter").getValue()); - assertEquals(ITERATIONS, metrics.updateBatchPatchApplications()); - assertEquals(ITERATIONS, metrics.directBexChangesetHits()); - assertEquals(0L, metrics.updateIndividualPatchApplications()); - - System.out.printf("BEX counter persistence round trip - iterations=%d, finalBlueId=%s, totalMs=%.3f, " - + "initializeMs=%.3f, initialSerializeMs=%.3f, deserializeLoadSnapshotMs=%.3f, " - + "processMs=%.3f, serializeMs=%.3f, " - + "batchPatchApplications=%d, bundleCacheHits=%d, bundleCacheMisses=%d%n", - ITERATIONS, - storedBlueId, - nanosToMs(totalNanos), - nanosToMs(initializeNanos), - nanosToMs(initialSerializeNanos), - nanosToMs(totalDeserializeAndLoadSnapshotNanos), - nanosToMs(totalProcessNanos), - nanosToMs(totalSerializeNanos), - metrics.updateBatchPatchApplications(), - metrics.bundleLoadCacheHits(), - metrics.bundleLoadCacheMisses()); - } - - private static String serializeCanonical(ComputeWorkflowTestSupport support, DocumentProcessingResult result) { - assertNotNull(result.canonicalDocument()); - return support.blue.nodeToJson(result.canonicalDocument()); - } - - private static ResolvedSnapshot deserializeCanonicalAndLoadSnapshot(ComputeWorkflowTestSupport support, - String storedCanonicalJson) { - Node storedCanonical = support.blue.parseSourceJson(storedCanonicalJson); - // Canonical Identity Input is not a Resolved View. Reload it through the - // Language resolver so context-derived types are restored before processing. - return support.blue.loadSnapshot(storedCanonical); - } - - private static Node operationRequest(Blue blue, - BlueRepository repository, - int timestamp) { - Node message = new Node() - .type("Coordination/Operation Request") - .properties("operation", new Node().value("increment")) - .properties("channel", new Node().value("ownerChannel")) - .properties("request", new Node().value(1)); - Node event = new Node() - .type("Coordination/Timeline Entry") - .properties("timeline", timeline()) - .properties("actor", principalActor()) - .properties("timestamp", new Node().value(BigInteger.valueOf(timestamp))) - .properties("message", message) - .blue(repository.typeAliasBlue()); - return blue.preprocess(event).blue(null); - } - - private static Node timeline() { - return new Node() - .type("Coordination/Timeline") - .properties("providerId", new Node().value("test-provider")) - .properties("timelineId", new Node().value("owner")); - } - - private static Node principalActor() { - return new Node().type("Coordination/Principal Actor"); - } - - private static double nanosToMs(long nanos) { - return nanos / 1_000_000.0; - } -} diff --git a/src/test/java/blue/coordination/processor/compute/BexCounterResourceWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/BexCounterResourceWorkflowTest.java deleted file mode 100644 index 4afd702..0000000 --- a/src/test/java/blue/coordination/processor/compute/BexCounterResourceWorkflowTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.repo.BlueRepository; -import org.junit.jupiter.api.Test; - -import java.math.BigInteger; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Scenario: - * A small YAML counter document proves the resource-based BEX workflow used by examples and smoke tests. - * - * Main flow: - * 1. Load {@code coordination/counter-bex.yaml} from test resources. - * 2. Initialize the document. - * 3. Send one {@code increment} operation request with value 1 through a simple timeline channel. - * 4. Assert that the document counter is incremented and a chat message is emitted. - * - * Actors and operations: - * - The owner timeline calls {@code increment}. - * - BEX compute mutates {@code /counter} from the returned changeset and emits the chat message. - */ -class BexCounterResourceWorkflowTest { - private static final String COUNTER_RESOURCE = "/coordination/counter-bex.yaml"; - private static final String TIMELINE_ID = "counter-timeline"; - - @Test - void counterBexWorkflowProcessesTimelineIncrementOperation() { - Fixture fixture = configuredFixture(); - Node document = CoordinationTestResources.yamlResource(fixture.blue, fixture.repository, COUNTER_RESOURCE); - DocumentProcessingResult initialized = fixture.blue.initializeDocument(document); - Node event = CoordinationTestResources.operationRequestEvent(fixture.blue, - fixture.repository, - TIMELINE_ID, - 1700000001, - "increment", - "ownerChannel", - new Node().value(1)); - - DocumentProcessingResult result = fixture.blue.processDocument(initialized.document(), event); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertNotNull(result.document()); - assertEquals(BigInteger.ONE, result.document().get("/counter")); - assertEquals(1, result.triggeredEvents().size()); - assertEquals("Counter was incremented by 1 and is now 1", - result.triggeredEvents().get(0).getAsText("/message")); - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/ComputeFrozenPatchHandoffIntegrationTest.java b/src/test/java/blue/coordination/processor/compute/ComputeFrozenPatchHandoffIntegrationTest.java deleted file mode 100644 index 0beddf5..0000000 --- a/src/test/java/blue/coordination/processor/compute/ComputeFrozenPatchHandoffIntegrationTest.java +++ /dev/null @@ -1,191 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.registry.RuntimeBlueIds; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** Focused proof that built-in Compute effects use the frozen patch boundary. */ -class ComputeFrozenPatchHandoffIntegrationTest { - - @Test - void accumulatedChangesetRetainsCanonicalFrozenBindingWithoutNodeMaterialization() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: CopyChannel", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: add", - " path: /copiedChannel", - " val:", - " $currentContract: /channel", - " - $return:", - " changeset:", - " $changeset: true")); - Counters before = Counters.capture(metrics); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals("ownerChannel", result.document().get("/copiedChannel")); - assertEquals(1L, metrics.directBexChangesetHits()); - assertEquals(1L, metrics.bexPatchFrozenDirectConversions()); - assertEquals(0L, metrics.bexPatchNodeMaterializations()); - assertEquals(1L, delta(metrics, before, "frozenPatchesHandedToLanguage")); - assertEquals(2L, delta(metrics, before, "frozenPatchValuesAccepted"), - "the frozen value is accepted during preview and runtime consumption"); - assertEquals(2L, delta(metrics, before, "frozenPatchValuesHandedToLanguage")); - assertEquals(0L, delta(metrics, before, "mutablePatchValuesFrozen")); - assertEquals(0L, delta(metrics, before, "frozenPatchValuesMaterialized")); - } - - @Test - void independentlyReturnedChangesetEventsAndTerminationKeepEffectOrder() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node document = support.initialize(support.yaml( - support.operationWorkflowDocumentWithStatus("removeMe: old", String.join("\n", - " steps:", - " - name: ReturnEffects", - " type: Coordination/Compute", - " do:", - " - $return:", - " changeset:", - " - op: add", - " path: /added", - " val:", - " nested: value", - " - op: replace", - " path: /status", - " val: changed", - " - op: remove", - " path: /removeMe", - " events:", - " - type: Coordination/Event", - " kind: first", - " - type: Coordination/Event", - " kind: second", - " termination:", - " reason: complete", - " - name: MustNotRun", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: forbidden")))).document(); - Counters before = Counters.capture(metrics); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals("changed", result.document().get("/status")); - assertEquals("value", result.document().get("/added/nested")); - assertFalse(hasPath(result.document(), "/removeMe")); - assertEquals("graceful", result.document().get("/contracts/terminated/cause")); - assertEquals("complete", result.document().get("/contracts/terminated/reason")); - assertEquals(Arrays.asList("first", "second"), selectedKinds(result)); - assertTrue(indexOfKind(result, "second") < indexOfType(result, - RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED)); - - assertEquals(0L, metrics.directBexChangesetHits(), - "the returned list is independent of BEX's accumulated changeset"); - assertEquals(0L, metrics.bexPatchFrozenDirectConversions()); - assertEquals(2L, metrics.bexPatchNodeMaterializations()); - assertEquals(3L, delta(metrics, before, "frozenPatchesHandedToLanguage")); - assertEquals(4L, delta(metrics, before, "frozenPatchValuesAccepted"), - "each add/replace value is accepted by preview and runtime consumption"); - assertEquals(4L, delta(metrics, before, "frozenPatchValuesHandedToLanguage")); - assertEquals(0L, delta(metrics, before, "mutablePatchValuesFrozen")); - assertEquals(0L, delta(metrics, before, "frozenPatchValuesMaterialized")); - assertEquals(2L, metrics.eventsEmitted()); - assertEquals(1L, metrics.successfulComputeTerminationRequests()); - } - - private static ComputeWorkflowTestSupport support(BexProcessingMetrics metrics) { - return ComputeWorkflowTestSupport.create(CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - } - - private static long delta(BexProcessingMetrics metrics, Counters before, String name) { - return metric(metrics.languageCounters(), name) - metric(before.values, name); - } - - private static long metric(Map values, String name) { - Long value = values.get(name); - return value != null ? value.longValue() : 0L; - } - - private static boolean hasPath(Node document, String path) { - try { - return document.getNode(path) != null; - } catch (RuntimeException ex) { - return false; - } - } - - private static List selectedKinds(DocumentProcessingResult result) { - List selected = new ArrayList(); - for (Node event : result.triggeredEvents()) { - Object kind = valueAt(event, "/kind"); - if ("first".equals(kind) || "second".equals(kind)) { - selected.add((String) kind); - } - } - return selected; - } - - private static int indexOfKind(DocumentProcessingResult result, String kind) { - for (int index = 0; index < result.triggeredEvents().size(); index++) { - if (kind.equals(valueAt(result.triggeredEvents().get(index), "/kind"))) { - return index; - } - } - return -1; - } - - private static Object valueAt(Node node, String path) { - try { - return node.get(path); - } catch (RuntimeException ex) { - return null; - } - } - - private static int indexOfType(DocumentProcessingResult result, String typeBlueId) { - for (int index = 0; index < result.triggeredEvents().size(); index++) { - Node event = result.triggeredEvents().get(index); - if (event.getType() != null && typeBlueId.equals(event.getType().getBlueId())) { - return index; - } - } - return -1; - } - - private static final class Counters { - private final Map values; - - private Counters(Map values) { - this.values = values; - } - - private static Counters capture(BexProcessingMetrics metrics) { - return new Counters(metrics.languageCounters()); - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/ComputeProgramPlanIntegrationTest.java b/src/test/java/blue/coordination/processor/compute/ComputeProgramPlanIntegrationTest.java deleted file mode 100644 index a488a58..0000000 --- a/src/test/java/blue/coordination/processor/compute/ComputeProgramPlanIntegrationTest.java +++ /dev/null @@ -1,195 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ComputeProgramPlanIntegrationTest { - @Test - void unchangedInlineComputeMissesOnceThenReusesItsFrozenPlan() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " value: warm")); - - DocumentProcessingResult first = support.processRun(document); - DocumentProcessingResult second = support.processRun(first.document()); - - assertFalse(first.capabilityFailure(), first.failureReason()); - assertFalse(second.capabilityFailure(), second.failureReason()); - assertEquals(1L, metrics.computePlanCacheMisses()); - assertEquals(1L, metrics.computePlanCacheHits()); - assertEquals(1L, metrics.computePlansBuilt()); - assertEquals(1L, metrics.computeProgramNormalizations()); - assertEquals(1L, metrics.computeProgramSourceBuilds()); - assertEquals(0L, metrics.computeDefinitionNormalizations()); - assertTrue(metrics.computePlanWeightBytes() > 0L); - } - - @Test - void referencedDefinitionIsReadFrozenEveryTimeButNormalizedOnlyOnMiss() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node document = definitionDocument(support, "Warm Definition"); - - DocumentProcessingResult first = support.processRun(document); - DocumentProcessingResult second = support.processRun(first.document()); - - assertEquals("Warm Definition", onlyEvent(first).get("/kind")); - assertEquals("Warm Definition", onlyEvent(second).get("/kind")); - assertEquals(1L, metrics.computePlanCacheMisses()); - assertEquals(1L, metrics.computePlanCacheHits()); - assertEquals(1L, metrics.computePlansBuilt()); - assertEquals(1L, metrics.computeProgramNormalizations()); - assertEquals(1L, metrics.computeDefinitionNormalizations()); - assertEquals(1L, metrics.computeDefinitionMaterializations()); - assertEquals(2L, metrics.computeDefinitionFrozenDirectHits()); - assertEquals(1L, metrics.computeProgramSourceBuilds()); - } - - @Test - void sameContractAndStepNamesAcrossDocumentsUseExactDefinitionIdentity() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node documentA = definitionDocument(support, "Definition A"); - Node documentB = definitionDocument(support, "Definition B"); - - DocumentProcessingResult firstA = support.processRun(documentA); - DocumentProcessingResult firstB = support.processRun(documentB); - DocumentProcessingResult warmA = support.processRun(firstA.document()); - DocumentProcessingResult warmB = support.processRun(firstB.document()); - - assertEquals("Definition A", onlyEvent(firstA).get("/kind")); - assertEquals("Definition B", onlyEvent(firstB).get("/kind")); - assertEquals("Definition A", onlyEvent(warmA).get("/kind")); - assertEquals("Definition B", onlyEvent(warmB).get("/kind")); - assertEquals(2L, metrics.computePlanCacheMisses()); - assertEquals(2L, metrics.computePlanCacheHits()); - assertEquals(2L, metrics.computePlansBuilt()); - assertEquals(2L, metrics.computeDefinitionNormalizations()); - assertEquals(2L, metrics.computeProgramSourceBuilds()); - } - - @Test - void changedStepContentBuildsASeparatePlan() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node documentA = inlineDocument(support, "A"); - Node documentB = inlineDocument(support, "B"); - - assertFalse(support.processRun(documentA).capabilityFailure()); - assertFalse(support.processRun(documentB).capabilityFailure()); - - assertEquals(2L, metrics.computePlanCacheMisses()); - assertEquals(0L, metrics.computePlanCacheHits()); - assertEquals(2L, metrics.computePlansBuilt()); - assertEquals(2L, metrics.computeProgramNormalizations()); - assertEquals(2L, metrics.computeProgramSourceBuilds()); - } - - @Test - void malformedProgramAndFatalResultNeverPoisonPlanCache() { - BexProcessingMetrics malformedMetrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport malformedSupport = support(malformedMetrics); - Node malformed = malformedSupport.initialize(malformedSupport.yaml( - malformedSupport.operationWorkflowDocumentWithContracts(String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " functions:", - " build:", - " do:", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: computeLogic", - " entry: missing")))).document(); - - assertRuntimeFatal(malformedSupport.processRun(malformed), "Unknown entry function"); - assertRuntimeFatal(malformedSupport.processRun(malformed), "Unknown entry function"); - assertEquals(2L, malformedMetrics.computePlanCacheMisses()); - assertEquals(0L, malformedMetrics.computePlanCacheHits()); - assertEquals(2L, malformedMetrics.computePlansBuilt()); - - BexProcessingMetrics fatalMetrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport fatalSupport = support(fatalMetrics); - Node fatal = fatalSupport.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " events: malformed")); - - assertRuntimeFatal(fatalSupport.processRun(fatal), "Compute result events must be a list"); - assertRuntimeFatal(fatalSupport.processRun(fatal), "Compute result events must be a list"); - assertEquals(2L, fatalMetrics.computePlanCacheMisses()); - assertEquals(0L, fatalMetrics.computePlanCacheHits()); - assertEquals(2L, fatalMetrics.computePlansBuilt()); - } - - private static ComputeWorkflowTestSupport support(BexProcessingMetrics metrics) { - return ComputeWorkflowTestSupport.create(CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - } - - private static Node inlineDocument(ComputeWorkflowTestSupport support, String value) { - return support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " value: " + value)); - } - - private static Node definitionDocument(ComputeWorkflowTestSupport support, String kind) { - return support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts( - String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " constants:", - " kind: " + kind, - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind:", - " $const: kind", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: computeLogic", - " entry: build")))).document(); - } - - private static Node onlyEvent(DocumentProcessingResult result) { - assertEquals(1, result.triggeredEvents().size(), result.failureReason()); - return result.triggeredEvents().get(0); - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, - String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null - && result.failureReason().contains(expectedMessage), - result.failureReason()); - } -} diff --git a/src/test/java/blue/coordination/processor/compute/ComputeTerminationWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/ComputeTerminationWorkflowTest.java deleted file mode 100644 index 35a3249..0000000 --- a/src/test/java/blue/coordination/processor/compute/ComputeTerminationWorkflowTest.java +++ /dev/null @@ -1,587 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.registry.RuntimeBlueIds; - -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ComputeTerminationWorkflowTest { - @Test - void absentTerminationContinuesWorkflow() { - DocumentProcessingResult result = runCompute("approved: true", "", updateStatusStep("continued")); - - assertSuccess(result); - assertEquals("continued", result.document().get("/status")); - assertNoTerminationMarker(result); - } - - @Test - void nullTerminationContinuesWorkflow() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " $null: true"), "", updateStatusStep("continued")); - - assertSuccess(result); - assertEquals("continued", result.document().get("/status")); - assertNoTerminationMarker(result); - } - - @Test - void emptyTerminationRequestsGracefulStopWithoutReason() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " $emptyObject: true"), "", updateStatusStep("must-not-run")); - - assertGracefulTermination(result, null); - assertEquals("idle", result.document().get("/status")); - } - - @Test - void textReasonIsPassedUnchanged() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " reason: Mandate terminated"), ""); - - assertGracefulTermination(result, "Mandate terminated"); - } - - @Test - void emptyReasonUsesCoreOmissionSemantics() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " reason: ''"), ""); - - assertGracefulTermination(result, null); - } - - @Test - void whitespaceReasonIsPreserved() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " reason: ' '"), ""); - - assertGracefulTermination(result, " "); - } - - @Test - void nullReasonMeansNoReason() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " reason:", - " $null: true"), ""); - - assertGracefulTermination(result, null); - } - - @Test - void scalarListAndNonTextReasonAreRejected() { - List invalidResults = Arrays.asList( - "termination: stop", - "termination: []", - String.join("\n", "termination:", " reason: 7"), - String.join("\n", "termination:", " reason: true"), - String.join("\n", "termination:", " reason: []"), - String.join("\n", "termination:", " reason:", " $emptyObject: true")); - - for (String invalidResult : invalidResults) { - DocumentProcessingResult result = runCompute(invalidResult, ""); - assertFatalResult(result, "Invalid Compute result", invalidResult); - assertEquals("fatal", terminationValue(result, "cause"), invalidResult); - } - } - - @Test - void unknownFatalScopeAndDelayFieldsAreRejected() { - for (String property : Arrays.asList("other", "cause", "fatal", "scope", "document", "delay")) { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " " + property + ": forbidden"), ""); - assertFatalResult(result, "unsupported properties"); - } - } - - @Test - void returnResultFalseStillTerminatesAndStops() { - DocumentProcessingResult result = runCompute(String.join("\n", - "termination:", - " reason: hidden-result"), - "returnResult: false", - updateStatusStep("must-not-run")); - - assertGracefulTermination(result, "hidden-result"); - assertEquals("idle", result.document().get("/status")); - } - - @Test - void emitEventsFalseDoesNotInterpretMalformedEvents() { - DocumentProcessingResult result = runCompute(String.join("\n", - "events: malformed-but-inactive", - "termination:", - " reason: events-disabled"), - "emitEvents: false"); - - assertGracefulTermination(result, "events-disabled"); - assertEquals(0, countKind(result, "must-not-emit")); - } - - @Test - void invalidActiveEventsPreventComputeChangesetAndTermination() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - "changeset:", - " - op: replace", - " path: /status", - " val: changed", - "events: malformed", - "termination:", - " reason: must-not-buffer"), ""); - - assertFatalResult(result, "events must be a list"); - assertEquals("idle", result.document().get("/status")); - assertEquals(0, countKind(result, "planned")); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - assertEquals(1L, metrics.computeResultValidationFailures()); - } - - @Test - void invalidTerminationPreventsComputeChangesetAndEvents() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - "changeset:", - " - op: replace", - " path: /status", - " val: changed", - "events:", - " - type: Coordination/Event", - " kind: planned", - "termination:", - " reason: 99"), ""); - - assertFatalResult(result, "reason must be Text"); - assertEquals("idle", result.document().get("/status")); - assertEquals(0, countKind(result, "planned")); - assertEquals(0L, metrics.eventsEmitted()); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - assertEquals(1L, metrics.computeResultValidationFailures()); - } - - @Test - void invalidChangesetPreventsComputeEventsAndTermination() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - "changeset: invalid", - "events:", - " - type: Coordination/Event", - " kind: planned", - "termination:", - " reason: must-not-buffer"), ""); - - assertFatalResult(result, "changeset must be a list"); - assertEquals(0, countKind(result, "planned")); - assertEquals(0L, metrics.eventsEmitted()); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - assertEquals(1L, metrics.computeResultValidationFailures()); - } - - @Test - void invalidChangesetEntryFieldsPreventEveryPlannedEffect() { - List invalidChangesets = Arrays.asList( - String.join("\n", - "changeset:", - " - op: copy", - " path: /status", - " val: changed"), - String.join("\n", - "changeset:", - " - op: replace", - " val: changed"), - String.join("\n", - "changeset:", - " - op: replace", - " path: ' '", - " val: changed"), - String.join("\n", - "changeset:", - " - op: add", - " path: /added")); - - for (String changeset : invalidChangesets) { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - changeset, - "events:", - " - type: Coordination/Event", - " kind: planned", - "termination:", - " reason: must-not-buffer"), ""); - - assertFatalResult(result, "Invalid Compute result", changeset); - assertEquals("idle", result.document().get("/status"), changeset); - assertEquals(0, countKind(result, "planned"), changeset); - assertEquals(0L, metrics.eventsEmitted(), changeset); - assertEquals(0L, metrics.successfulComputeTerminationRequests(), changeset); - assertEquals(1L, metrics.computeResultValidationFailures(), changeset); - } - } - - @Test - void explicitNullEventEntryPreventsEveryPlannedEffect() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - "changeset:", - " - op: replace", - " path: /status", - " val: changed", - "events:", - " - $null: true", - "termination:", - " reason: must-not-buffer"), ""); - - assertFatalResult(result, "events cannot contain undefined/null entries"); - assertEquals("idle", result.document().get("/status")); - assertEquals(0L, metrics.eventsEmitted()); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - assertEquals(1L, metrics.computeResultValidationFailures()); - } - - @Test - void validPlanBuffersChangesetEventsAndTerminationOnceInSourceOrder() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - "changeset:", - " - op: add", - " path: /added", - " val: planned", - " - op: replace", - " path: /status", - " val: changed", - "events:", - " - type: Coordination/Event", - " kind: first", - " - type: Coordination/Event", - " kind: second", - "termination:", - " reason: complete"), - "", - updateStatusStep("must-not-run")); - - assertGracefulTermination(result, "complete"); - assertEquals("changed", result.document().get("/status")); - assertEquals("planned", result.document().get("/added")); - assertEquals(Arrays.asList("first", "second"), kinds(result, "first", "second")); - assertTrue(indexOfKind(result, "second") - < indexOfType(result, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED)); - assertEquals(2L, metrics.eventsEmitted()); - assertEquals(1L, metrics.successfulComputeTerminationRequests()); - assertEquals(0L, metrics.computeResultValidationFailures()); - } - - @Test - void patchPreviewFailureBuffersNoComputeEventOrGracefulTermination() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, String.join("\n", - "changeset:", - " - op: replace", - " path: /status/child", - " val: changed", - "events:", - " - type: Coordination/Event", - " kind: planned", - "termination:", - " reason: must-not-buffer"), ""); - - assertFatalResult(result, "Working document preview failed"); - assertEquals("idle", result.document().get("/status")); - assertEquals(0, countKind(result, "planned")); - assertEquals(0L, metrics.eventsEmitted()); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - assertEquals(0L, metrics.computeResultValidationFailures()); - } - - @Test - void accumulatedChangesetAndEventsRemainFallbackWhenTerminationIsReturned() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Accumulate", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: add", - " path: /temporary", - " val: temporary", - " - $appendChange:", - " op: remove", - " path: /temporary", - " - $appendChange:", - " op: replace", - " path: /status", - " val: accumulated", - " - $appendEvent:", - " type: Coordination/Event", - " kind: accumulated", - " - $return:", - " termination:", - " reason: fallback")); - - DocumentProcessingResult result = support.processRun(document); - - assertGracefulTermination(result, "fallback"); - assertEquals("accumulated", result.document().get("/status")); - assertNull(result.document().getProperties().get("temporary")); - assertEquals(1, countKind(result, "accumulated")); - assertEquals(1L, metrics.successfulComputeTerminationRequests()); - } - - @Test - void returnedChangesetAndEventsRetainPrecedenceOverAccumulators() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Explicit Effects", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val: accumulated", - " - $appendEvent:", - " type: Coordination/Event", - " kind: accumulated", - " - $return:", - " changeset:", - " - op: replace", - " path: /status", - " val: returned", - " events:", - " - type: Coordination/Event", - " kind: returned")); - - DocumentProcessingResult result = support.processRun(document); - - assertSuccess(result); - assertEquals("returned", result.document().get("/status")); - assertEquals(1, countKind(result, "returned")); - assertEquals(0, countKind(result, "accumulated")); - } - - @Test - void invalidResultStillChargesBexEvaluationGas() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, "termination: invalid", ""); - - assertFatalResult(result, "termination must be an object"); - assertTrue(result.totalGas() > 0L); - assertEquals(1L, metrics.bexCompiledExecutions()); - assertEquals(1L, metrics.computeResultValidationFailures()); - } - - @Test - void ordinaryNonTerminationComputeDoesNotIncrementTerminationCounters() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runCompute(metrics, "ordinary: data", ""); - - assertSuccess(result); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - assertEquals(0L, metrics.declarativeTerminationSteps()); - assertEquals(0L, metrics.computeResultValidationFailures()); - } - - @Test - void documentProcessingTerminatedEventAloneDoesNotRequestTermination() { - DocumentProcessingResult result = runSteps(String.join("\n", - "- name: Domain-looking lifecycle event", - " type: Coordination/Trigger Event", - " event:", - " type: Document Processing Terminated", - " cause: graceful", - updateStatusStep("continued"))); - - assertSuccess(result); - assertEquals("continued", result.document().get("/status")); - assertNoTerminationMarker(result); - } - - @Test - void domainTerminatedMessageAloneDoesNotRequestTermination() { - DocumentProcessingResult result = runSteps(String.join("\n", - "- name: Domain termination message", - " type: Coordination/Trigger Event", - " event:", - " type: Mandate/Mandate Terminated", - " reason: ordinary data", - updateStatusStep("continued"))); - - assertSuccess(result); - assertEquals("continued", result.document().get("/status")); - assertNoTerminationMarker(result); - } - - private static DocumentProcessingResult runCompute(String returnedFields, - String options, - String... laterSteps) { - return runCompute(null, returnedFields, options, laterSteps); - } - - private static DocumentProcessingResult runCompute(BexProcessingMetrics metrics, - String returnedFields, - String options, - String... laterSteps) { - StringBuilder steps = new StringBuilder(); - steps.append("- name: Compute Effects\n") - .append(" type: Coordination/Compute\n"); - if (options != null && !options.trim().isEmpty()) { - steps.append(indent(options, 2)).append('\n'); - } - steps.append(" do:\n") - .append(" - $return:"); - if (returnedFields == null || returnedFields.trim().isEmpty()) { - steps.append(" {}\n"); - } else { - steps.append('\n').append(indent(returnedFields, 8)).append('\n'); - } - for (String laterStep : laterSteps) { - steps.append(laterStep).append('\n'); - } - return runSteps(metrics, steps.toString()); - } - - private static DocumentProcessingResult runSteps(String steps) { - return runSteps(null, steps); - } - - private static DocumentProcessingResult runSteps(BexProcessingMetrics metrics, String steps) { - ComputeWorkflowTestSupport support = metrics != null ? support(metrics) : ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - indent(steps.trim(), 6))); - return support.processRun(document); - } - - private static ComputeWorkflowTestSupport support(BexProcessingMetrics metrics) { - return ComputeWorkflowTestSupport.create(CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - } - - private static String updateStatusStep(String status) { - return String.join("\n", - "- name: Later Step", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: " + status); - } - - private static String indent(String value, int spaces) { - String prefix = repeat(' ', spaces); - return prefix + value.replace("\n", "\n" + prefix); - } - - private static String repeat(char character, int count) { - char[] characters = new char[count]; - Arrays.fill(characters, character); - return new String(characters); - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static void assertFatalResult(DocumentProcessingResult result, String reasonFragment) { - assertFatalResult(result, reasonFragment, result.failureReason()); - } - - private static void assertFatalResult(DocumentProcessingResult result, - String reasonFragment, - String message) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), message); - assertTrue(result.failureReason() != null && result.failureReason().contains(reasonFragment), - message + ": " + result.failureReason()); - } - - private static void assertGracefulTermination(DocumentProcessingResult result, String expectedReason) { - assertSuccess(result); - assertEquals("graceful", terminationValue(result, "cause")); - assertEquals(expectedReason, terminationValue(result, "reason")); - } - - private static void assertNoTerminationMarker(DocumentProcessingResult result) { - assertNull(terminationMarker(result)); - } - - private static int countKind(DocumentProcessingResult result, String kind) { - int count = 0; - for (Node event : result.triggeredEvents()) { - Node kindNode = event.getProperties() != null ? event.getProperties().get("kind") : null; - if (kindNode != null && kind.equals(kindNode.getValue())) { - count++; - } - } - return count; - } - - private static List kinds(DocumentProcessingResult result, String... selected) { - List allowed = Arrays.asList(selected); - List actual = new ArrayList(); - for (Node event : result.triggeredEvents()) { - Node kindNode = event.getProperties() != null ? event.getProperties().get("kind") : null; - Object kind = kindNode != null ? kindNode.getValue() : null; - if (kind instanceof String && allowed.contains(kind)) { - actual.add((String) kind); - } - } - return actual; - } - - private static int indexOfKind(DocumentProcessingResult result, String kind) { - for (int i = 0; i < result.triggeredEvents().size(); i++) { - Node event = result.triggeredEvents().get(i); - Node value = event.getProperties() != null ? event.getProperties().get("kind") : null; - if (value != null && kind.equals(value.getValue())) { - return i; - } - } - return -1; - } - - private static int indexOfType(DocumentProcessingResult result, String blueId) { - for (int i = 0; i < result.triggeredEvents().size(); i++) { - Node event = result.triggeredEvents().get(i); - if (event.getType() != null && blueId.equals(event.getType().getBlueId())) { - return i; - } - } - return -1; - } - - private static Node terminationMarker(DocumentProcessingResult result) { - Node contracts = result.document().getContracts(); - return contracts != null && contracts.getProperties() != null - ? contracts.getProperties().get("terminated") - : null; - } - - private static Object terminationValue(DocumentProcessingResult result, String key) { - Node marker = terminationMarker(result); - if (marker == null || marker.getProperties() == null) { - return null; - } - Node value = marker.getProperties().get(key); - return value != null ? value.getValue() : null; - } -} diff --git a/src/test/java/blue/coordination/processor/compute/ComputeWorkflowExecutionTest.java b/src/test/java/blue/coordination/processor/compute/ComputeWorkflowExecutionTest.java deleted file mode 100644 index 530da4f..0000000 --- a/src/test/java/blue/coordination/processor/compute/ComputeWorkflowExecutionTest.java +++ /dev/null @@ -1,895 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.bex.api.BexEngine; -import blue.bex.api.BexMetricsSink; -import blue.bex.result.BexMetrics; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.coordination.processor.workflow.StepExecutionContext; -import blue.coordination.processor.workflow.WorkflowStepExecutor; -import blue.coordination.processor.workflow.WorkflowStepResult; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.repo.coordination.Compute; -import blue.repo.coordination.SequentialWorkflowStep; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Scenario: - * Primary {@code Coordination/Compute} behavior is verified with direct patch and event effects. - * - * Main flow: - * 1. Execute inline Compute programs and Compute Definition backed programs. - * 2. Prove Compute can read {@code $document}, {@code $event}, {@code $steps}, and - * {@code $currentContract}. - * 3. Prove Compute can apply returned changesets, emit events, return step results, and consume gas. - * 4. Prove returned changesets remain readable as step result data after being applied. - * 5. Keep Trigger Event and literal Update Document compatibility intact. - * - * Actors and operations: - * - The owner timeline calls {@code run}. - * - Compute steps build patches, data, and events. - * - Later Compute steps read prior named step results. - * - Compatibility cases ensure existing non-BEX workflow executors still work. - */ -class ComputeWorkflowExecutionTest { - @Test - void inlineComputeEmitsEventAndDoesNotMutateDocument() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Compute Event", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("idle", result.document().get("/status")); - assertEquals(1, result.triggeredEvents().size()); - assertEquals("Compute Event", result.triggeredEvents().get(0).get("/kind")); - } - - @Test - void inlineComputeResultIsReadableByLaterComputeViaSteps() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " approved: true", - " reason: ok", - " - name: ReadPrior", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Prior Result", - " approved:", - " $steps: Build.approved", - " reason:", - " $steps: Build.reason", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - Node event = onlyEvent(result); - - assertEquals("Prior Result", event.get("/kind")); - assertEquals(Boolean.TRUE, event.get("/approved")); - assertEquals("ok", event.get("/reason")); - } - - @Test - void emitEventsFalseSuppressesComputedEvents() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " emitEvents: false", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Should Not Emit", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertTrue(result.triggeredEvents().isEmpty()); - } - - @Test - void emitEventsFalseStillExportsStepResult() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " emitEvents: false", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Should Not Emit", - " - $return:", - " approved: true", - " - name: Read", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Exported Result", - " approved:", - " $steps: Build.approved", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("Exported Result", onlyEvent(result).get("/kind")); - assertEquals(Boolean.TRUE, onlyEvent(result).get("/approved")); - } - - @Test - void returnResultFalseSuppressesStepResult() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " returnResult: false", - " do:", - " - $return:", - " approved: true", - " - name: ReadPrior", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Missing Prior", - " approved:", - " $coalesce:", - " - $steps: Build.approved", - " - missing", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("missing", onlyEvent(result).get("/approved")); - } - - @Test - void returnResultFalseStillAllowsEventEmission() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " returnResult: false", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Event Still Emits", - " - $return:", - " approved: true")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("Event Still Emits", onlyEvent(result).get("/kind")); - } - - @Test - void unnamedComputeStepExportsAsStepIndexKey() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - type: Coordination/Compute", - " do:", - " - $return:", - " value: abc", - " - name: Read", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind:", - " $steps: Step1.value", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("abc", onlyEvent(result).get("/kind")); - } - - @Test - void computeChangesetAppliesAndRemainsStepData() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: BuildPatch", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val: active", - " - $return: {}", - " - name: VerifyPatchData", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Patch Data", - " patchPath:", - " $steps:", - " step: BuildPatch", - " path: /changeset/0/path", - " patchValue:", - " $steps:", - " step: BuildPatch", - " path: /changeset/0/val", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("active", result.document().get("/status")); - assertEquals("/status", onlyEvent(result).get("/patchPath")); - assertEquals("active", onlyEvent(result).get("/patchValue")); - } - - @Test - void explicitEmptyChangesetSuppressesAccumulatedChanges() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: BuildPatch", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val: active", - " - $return:", - " changeset: []")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("idle", result.document().get("/status")); - } - - @Test - void returnResultFalseStillAppliesChangeset() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: BuildPatch", - " type: Coordination/Compute", - " returnResult: false", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val: active", - " - $return:", - " ignored: true")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("active", result.document().get("/status")); - } - - @Test - void inlineExprComputeExportsScalarResult() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: ReadStatus", - " type: Coordination/Compute", - " expr:", - " $document: /status", - " - name: EmitStatus", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Status", - " status:", - " $steps: ReadStatus", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("idle", onlyEvent(result).get("/status")); - } - - @Test - void computeReadsEventDocumentAndCurrentContract() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Inputs", - " request:", - " $event: /message/request", - " status:", - " $document: /status", - " channel:", - " $currentContract: /channel", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document, new Node().value("hello")); - Node event = onlyEvent(result); - - assertEquals("hello", event.get("/request")); - assertEquals("idle", event.get("/status")); - assertEquals("ownerChannel", event.get("/channel")); - } - - @Test - void currentContractChannelBindingPreservesAuthoredChannel() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(String.join("\n", - "name: Compute Authored Channel Test", - "status: idle", - "contracts:", - CoordinationTestResources.simpleTimelineChannelYaml("manualChannel", "owner", 2), - " run:", - " type: Coordination/Sequential Workflow Operation", - " channel: manualChannel", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Authored Channel", - " channel:", - " $currentContract: /channel", - " - $return: {}"))).document(); - - DocumentProcessingResult result = support.process( - document, - support.operationRequest("run", "manualChannel", new Node().value("request"))); - - assertEquals("manualChannel", onlyEvent(result).get("/channel")); - } - - @Test - void computeDefinitionCanBeReferencedBySiblingContractKey() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts(String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " constants:", - " kind: From Definition", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind:", - " $const: kind", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: computeLogic", - " entry: build")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("From Definition", onlyEvent(result).get("/kind")); - } - - @Test - void computeDefinitionCanBeReferencedByAbsolutePointer() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts(String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Absolute Definition", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: /contracts/computeLogic", - " entry: build")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("Absolute Definition", onlyEvent(result).get("/kind")); - } - - @Test - void inlineObjectComputeDefinitionWorks() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition:", - " constants:", - " kind: Inline Definition", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind:", - " $const: kind", - " - $return: {}", - " entry: build")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("Inline Definition", onlyEvent(result).get("/kind")); - } - - @Test - void computeDefinitionMarkerDoesNotExecuteByItself() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts(String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Should Not Happen", - " - $return: {}"), - String.join("\n", - " steps: []")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertTrue(result.triggeredEvents().isEmpty()); - } - - @Test - void missingDefinitionFailsClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: missingCompute", - " entry: build")); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Compute definition not found"); - } - - @Test - void missingEntryFailsClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts(String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " functions:", - " build:", - " do:", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: computeLogic", - " entry: missing")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Unknown entry function"); - } - - @Test - void stepConstantsOverrideDefinitionConstants() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts(String.join("\n", - " computeLogic:", - " type: Coordination/Compute Definition", - " constants:", - " kind: From Definition", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind:", - " $const: kind", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: computeLogic", - " entry: build", - " constants:", - " kind: From Step")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("From Step", onlyEvent(result).get("/kind")); - } - - @Test - void definitionReferenceEscapesJsonPointerSegments() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithContracts(String.join("\n", - " \"compute/logic~v1\":", - " type: Coordination/Compute Definition", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Escaped Definition", - " - $return: {}"), - String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " definition: compute/logic~v1", - " entry: build")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("Escaped Definition", onlyEvent(result).get("/kind")); - } - - @Test - void localFunctionsWorkWithoutDefinition() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " entry: build", - " functions:", - " build:", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Local Function", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("Local Function", onlyEvent(result).get("/kind")); - } - - @Test - void gasLimitFailureAndDefaultGasLimitFromOptionsFailClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " gasLimit: 1", - " do:", - " - $return:", - " ok: true")); - - DocumentProcessingResult explicit = support.processRun(document); - assertRuntimeFatalIgnoreCase(explicit, "gas"); - - ComputeWorkflowTestSupport lowDefault = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder().defaultComputeGasLimit(1L).build()); - Node lowDefaultDocument = lowDefault.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " ok: true")); - DocumentProcessingResult defaultFailure = lowDefault.processRun(lowDefaultDocument); - assertRuntimeFatalIgnoreCase(defaultFailure, "gas"); - - ComputeWorkflowTestSupport normalDefault = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder().defaultComputeGasLimit(100_000L).build()); - Node normalDocument = normalDefault.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " ok: true")); - - assertFalse(normalDefault.processRun(normalDocument).capabilityFailure()); - } - - @Test - void defaultComputeGasLimitMustBePositive() { - IllegalArgumentException zero = assertThrows(IllegalArgumentException.class, - () -> CoordinationProcessorOptions.builder().defaultComputeGasLimit(0L)); - assertTrue(zero.getMessage().contains("defaultComputeGasLimit must be positive")); - - IllegalArgumentException negative = assertThrows(IllegalArgumentException.class, - () -> CoordinationProcessorOptions.builder().defaultComputeGasLimit(-1L)); - assertTrue(negative.getMessage().contains("defaultComputeGasLimit must be positive")); - } - - @Test - void explicitResultEventsAndAccumulatorEventsAreEmitted() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Explicit", - " type: Coordination/Compute", - " do:", - " - $return:", - " events:", - " - type: Coordination/Event", - " kind: Explicit Events", - " changeset: []", - " - name: Accumulator", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Accumulator Event", - " - $return:", - " approved: true")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals(2, result.triggeredEvents().size()); - assertEquals("Explicit Events", result.triggeredEvents().get(0).get("/kind")); - assertEquals("Accumulator Event", result.triggeredEvents().get(1).get("/kind")); - } - - @Test - void invalidEventsFieldFailsClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " events: not-a-list")); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Compute result events must be a list"); - } - - @Test - void invalidChangesetFieldFailsClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " changeset: not-a-list")); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Compute result changeset must be a list"); - } - - @Test - void scalarChangesetEntriesFailClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " changeset:", - " - hello")); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Compute result changeset entry 0 must be an object"); - } - - @Test - void scalarEventEntriesFailClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " events:", - " - hello")); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Compute result events must contain object entries"); - } - - @Test - void nullEventEntriesFailClosed() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return:", - " events:", - " - null")); - - DocumentProcessingResult result = support.processRun(document); - - assertRuntimeFatal(result, "Compute result events must contain object entries"); - } - - @Test - void pureComputeWorkflowRunsWithBexOnlyRunner() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .sequentialWorkflowRunner(SequentialWorkflowRunner.withBexEngine( - BexEngine.builder().build(), - 100_000L)) - .build()); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: BEX Only", - " - $return: {}")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals("BEX Only", onlyEvent(result).get("/kind")); - } - - @Test - void literalTriggerAndUpdateDocumentStepsStillWork() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Apply", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: 42", - " - name: Trigger", - " type: Coordination/Trigger Event", - " event:", - " type: Coordination/Event", - " kind: Existing Trigger", - " status: static")); - - DocumentProcessingResult result = support.processRun(document); - - assertEquals(BigInteger.valueOf(42), result.document().get("/status")); - assertEquals("Existing Trigger", onlyEvent(result).get("/kind")); - assertEquals("static", onlyEvent(result).get("/status")); - } - - @Test - void bexEngineCompileCacheIsUsedAcrossRuns() { - final List metrics = new ArrayList(); - BexEngine engine = BexEngine.builder().metrics(new BexMetricsSink() { - @Override - public void accept(BexMetrics item) { - metrics.add(item.copy()); - } - }).build(); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder().bexEngine(engine).build()); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " expr:", - " $document: /status")); - - Node afterFirst = support.processRun(document).document(); - long hitsAfterWarmup = 0L; - long missesAfterWarmup = 0L; - for (BexMetrics item : metrics) { - hitsAfterWarmup += item.compileCacheHits(); - missesAfterWarmup += item.compileCacheMisses(); - } - - support.processRun(afterFirst); - - long totalHits = 0L; - long totalMisses = 0L; - for (BexMetrics item : metrics) { - totalHits += item.compileCacheHits(); - totalMisses += item.compileCacheMisses(); - } - assertTrue(totalHits - hitsAfterWarmup > 0L); - assertEquals(0L, totalMisses - missesAfterWarmup); - } - - @Test - void runnerProvidesFrozenStepAndContractNodesToExecutors() { - final AtomicBoolean sawFrozenStep = new AtomicBoolean(false); - final AtomicBoolean sawFrozenContract = new AtomicBoolean(false); - WorkflowStepExecutor executor = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof Compute; - } - - @Override - public WorkflowStepResult execute(Compute step, StepExecutionContext context) { - sawFrozenStep.set(context.stepFrozenNode() != null); - sawFrozenContract.set(context.currentContractFrozenNode() != null); - return WorkflowStepResult.none(); - } - }; - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .sequentialWorkflowRunner(new SequentialWorkflowRunner( - Collections.>singletonList(executor))) - .build()); - Node document = support.initializedOperationWorkflow(String.join("\n", - " largePayload:", - " item000: value000", - " item001: value001", - " item002: value002", - " steps:", - " - name: Build", - " type: Coordination/Compute", - " do:", - " - $return: {}")); - - support.processRun(document); - - assertTrue(sawFrozenStep.get()); - assertTrue(sawFrozenContract.get()); - } - - private static Node onlyEvent(DocumentProcessingResult result) { - assertEquals(1, result.triggeredEvents().size()); - return result.triggeredEvents().get(0); - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null && result.failureReason().contains(expectedMessage), - result.failureReason()); - } - - private static void assertRuntimeFatalIgnoreCase(DocumentProcessingResult result, String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null - && result.failureReason().toLowerCase().contains(expectedMessage.toLowerCase()), - result.failureReason()); - } -} diff --git a/src/test/java/blue/coordination/processor/compute/ComputeWorkflowTestSupport.java b/src/test/java/blue/coordination/processor/compute/ComputeWorkflowTestSupport.java deleted file mode 100644 index 1dcb0cd..0000000 --- a/src/test/java/blue/coordination/processor/compute/ComputeWorkflowTestSupport.java +++ /dev/null @@ -1,117 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.CoordinationTestResources; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.repo.BlueRepository; - -final class ComputeWorkflowTestSupport { - private int timestamp = 1; - - final BlueRepository repository; - final Blue blue; - - private ComputeWorkflowTestSupport(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - - static ComputeWorkflowTestSupport create() { - return create(null); - } - - static ComputeWorkflowTestSupport create(CoordinationProcessorOptions options) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, options); - return new ComputeWorkflowTestSupport(repository, blue); - } - - Node yaml(String source) { - Node node = blue.parseSourceYaml(source); - node.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(node); - return blue.preprocess(aliasesResolved); - } - - Node yamlResource(String resourcePath) { - return CoordinationTestResources.yamlResource(blue, repository, resourcePath); - } - - DocumentProcessingResult initialize(Node document) { - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(document); - return blue.initializeDocument(blue.preprocess(aliasesResolved)); - } - - DocumentProcessingResult process(Node snapshot, Node event) { - return blue.processDocument(snapshot, event); - } - - DocumentProcessingResult processRun(Node snapshot) { - return processRun(snapshot, new Node().value("request")); - } - - DocumentProcessingResult processRun(Node snapshot, Node request) { - return process(snapshot, operationRequest("run", request)); - } - - Node operationRequest(String operation, Node request) { - return operationRequest("owner", timestamp++, operation, "ownerChannel", request); - } - - Node operationRequest(String operation, String channel, Node request) { - return operationRequest("owner", timestamp++, operation, channel, request); - } - - Node operationRequest(String timelineId, - int timestamp, - String operation, - String channel, - Node request) { - return CoordinationTestResources.operationRequestEvent(blue, - repository, - timelineId, - timestamp, - operation, - channel, - request); - } - - String operationWorkflowDocument(String body) { - return operationWorkflowDocumentWithContracts("", body); - } - - String operationWorkflowDocumentWithStatus(String rootFields, String body) { - return String.join("\n", - "name: Compute Workflow Test", - "status: idle", - rootFields, - "contracts:", - CoordinationTestResources.simpleTimelineChannelYaml("ownerChannel", "owner", 2), - " run:", - " type: Coordination/Sequential Workflow Operation", - " channel: ownerChannel", - body); - } - - String operationWorkflowDocumentWithContracts(String extraContracts, String body) { - return String.join("\n", - "name: Compute Workflow Test", - "status: idle", - "contracts:", - CoordinationTestResources.simpleTimelineChannelYaml("ownerChannel", "owner", 2), - " run:", - " type: Coordination/Sequential Workflow Operation", - " channel: ownerChannel", - body, - extraContracts); - } - - Node initializedOperationWorkflow(String body) { - return initialize(yaml(operationWorkflowDocument(body))).document(); - } -} diff --git a/src/test/java/blue/coordination/processor/compute/CustomerPaynoteLatestBexFixtureTest.java b/src/test/java/blue/coordination/processor/compute/CustomerPaynoteLatestBexFixtureTest.java deleted file mode 100644 index 231bf09..0000000 --- a/src/test/java/blue/coordination/processor/compute/CustomerPaynoteLatestBexFixtureTest.java +++ /dev/null @@ -1,236 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.repo.BlueRepository; -import org.junit.jupiter.api.Test; - -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Scenario: - * The large customer Paynote snapshot fixture is processed through the BEX-based document path. - * - * Main flow: - * 1. Load the latest Compute/BEX Paynote document fixture and its snapshot event fixture. - * 2. Initialize the document, process the supplied event, and time the processing call. - * 3. Verify the expected package-fulfillment document remains active and emits snapshot events. - * - * Actors and operations: - * - The incoming fixture event represents the external snapshot/update being processed. - * - Admin/update workflows emit snapshot-related events. - * - Compute and BEX handle data construction. - */ -class CustomerPaynoteLatestBexFixtureTest { - private static final String DOCUMENT_RESOURCE = - "/processor-delay/customer-paynote-snapshot.document.compute.latest-bex.yaml"; - private static final String EVENT_RESOURCE = - "/processor-delay/customer-paynote-snapshot.event.yaml"; - private static final String SNAPSHOT_RESOLVED_TYPE = - "Sample/Document Initial Snapshot Resolved"; - private static final String PROCESSING_INITIALIZED_MARKER = "Processing Initialized Marker"; - - @Test - void customerPaynoteLatestBexDocumentProcessesSnapshotEvent() { - Fixture fixture = configuredFixture(); - Node document = loadYaml(fixture, DOCUMENT_RESOURCE); - Node event = loadYaml(fixture, EVENT_RESOURCE); - stripNestedSnapshotDocuments(event); - retainAdminUpdateContracts(document); - - DocumentProcessingResult initialized = fixture.blue.initializeDocument(document); - long start = System.currentTimeMillis(); - DocumentProcessingResult result = fixture.blue.processDocument(initialized.document(), event); - System.out.println("Processing time: " + (System.currentTimeMillis() - start) + "ms"); - - assertNotNull(result.document()); - assertEquals("Global Package Fulfillment Automation - Weekend Stay + Wine Dinner", - result.document().getName()); - assertFalse(result.triggeredEvents().isEmpty(), - "Expected the admin update workflow to emit snapshot events; checkpoint timestamp=" - + result.document().get("/contracts/checkpoint/lastEvents/sampleAdminChannel/timestamp")); - assertContainsEventType(result, - SNAPSHOT_RESOLVED_TYPE, - CoordinationTestResources.testTypeAliases(fixture.repository).get(SNAPSHOT_RESOLVED_TYPE)); - assertEquals("active", result.document().get("/status")); - } - - private static Node loadYaml(Fixture fixture, String resourcePath) { - Node parsed = fixture.blue.parseSourceYaml(CoordinationTestResources.readResource(resourcePath)); - parsed.blue(fixture.repository.typeAliasBlue()); - if (EVENT_RESOURCE.equals(resourcePath)) { - stripNestedSnapshotDocuments(parsed); - } - Node aliasesResolved = new RepositoryTypeAliasPreprocessor( - CoordinationTestResources.testTypeAliases(fixture.repository)).preprocess(parsed); - Node preprocessed = fixture.blue.preprocess(aliasesResolved); - normalizeInitializationMarkers(preprocessed); - clearCheckpoint(preprocessed); - if (DOCUMENT_RESOURCE.equals(resourcePath)) { - preprocessed.type((Node) null); - } - return preprocessed; - } - - private static Fixture configuredFixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue); - return new Fixture(repository, blue); - } - - private static void assertContainsEventType(DocumentProcessingResult result, String expectedType, String expectedBlueId) { - for (Node event : result.triggeredEvents()) { - if (isEventType(event, expectedType, expectedBlueId)) { - return; - } - } - throw new AssertionError("Expected triggered event type: " + expectedType - + ", actual count: " + result.triggeredEvents().size() - + ", actual types: " + triggeredEventTypes(result) - + ", first event: " + (result.triggeredEvents().isEmpty() ? null : result.triggeredEvents().get(0))); - } - - private static boolean isEventType(Node event, String expectedType, String expectedBlueId) { - if (event == null) { - return false; - } - if (event.getType() != null) { - if (expectedBlueId != null && expectedBlueId.equals(event.getType().getBlueId())) { - return true; - } - Object value = event.getType().getValue(); - if (expectedType.equals(value)) { - return true; - } - } - Node typeProperty = property(event, "type"); - Object propertyValue = typeProperty != null ? typeProperty.getValue() : null; - return expectedType.equals(propertyValue); - } - - private static String triggeredEventTypes(DocumentProcessingResult result) { - StringBuilder builder = new StringBuilder(); - for (Node event : result.triggeredEvents()) { - if (builder.length() > 0) { - builder.append(", "); - } - Node type = event != null ? event.getType() : null; - builder.append(type != null ? type.getValue() : null) - .append("/") - .append(type != null ? type.getBlueId() : null) - .append(" field=") - .append(typeField(event)); - } - return builder.toString(); - } - - private static Object typeField(Node event) { - Node type = property(event, "type"); - return type != null ? type.getValue() : null; - } - - private static void normalizeInitializationMarkers(Node node) { - if (node == null) { - return; - } - Map properties = node.getProperties(); - if (properties != null) { - Node contracts = properties.get("contracts"); - if (contracts != null && contracts.getProperties() != null) { - normalizeInitializationMarker(contracts.getProperties().get("initialized")); - } - for (Node child : properties.values()) { - normalizeInitializationMarkers(child); - } - } - if (node.getItems() != null) { - for (Node item : node.getItems()) { - normalizeInitializationMarkers(item); - } - } - } - - private static void normalizeInitializationMarker(Node marker) { - if (marker == null || marker.getType() == null) { - return; - } - Node type = marker.getType(); - if (PROCESSING_INITIALIZED_MARKER.equals(type.getValue()) - || RuntimeBlueIds.PROCESSING_INITIALIZED_MARKER.equals(type.getBlueId())) { - marker.type(new Node().blueId("InitializationMarker")); - } - } - - private static void clearCheckpoint(Node node) { - if (node == null) { - return; - } - Node contracts = property(node, "contracts"); - if (contracts != null && contracts.getProperties() != null) { - contracts.getProperties().remove("checkpoint"); - } - } - - private static Node property(Node node, String key) { - if (node == null) { - return null; - } - if ("contracts".equals(key)) { - return node.getContracts(); - } - return node.getProperties() != null ? node.getProperties().get(key) : null; - } - - private static void stripNestedSnapshotDocuments(Node event) { - // The attached event carries a full customer PayNote snapshot inside the - // admin request. That nested snapshot is not needed to prove the admin - // BEX workflow emits the request event, and retaining it forces checkpoint - // metadata to resolve stale embedded repository contracts. - Node message = property(event, "message"); - Node request = property(message, "request"); - if (request == null || request.getItems() == null) { - return; - } - for (Node item : request.getItems()) { - if (item.getProperties() != null) { - item.getProperties().remove("document"); - } - } - } - - private static void retainAdminUpdateContracts(Node document) { - // Keep the workflow under test from the attached document while avoiding - // unrelated generated contracts whose historical schema metadata is not - // needed for this event path. - Node contracts = property(document, "contracts"); - Map all = contracts.getProperties(); - Node channel = all.get("sampleAdminChannel"); - Node operation = all.get("sampleAdminUpdate"); - operation.getProperties().remove("request"); - operation.getProperties().remove("event"); - operation.properties("channel", new Node().value("sampleAdminChannel")); - all.clear(); - all.put("sampleAdminChannel", channel); - all.put("sampleAdminUpdate", operation); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/DynamicEmbeddedParticipantsWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/DynamicEmbeddedParticipantsWorkflowTest.java deleted file mode 100644 index 07b877e..0000000 --- a/src/test/java/blue/coordination/processor/compute/DynamicEmbeddedParticipantsWorkflowTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.snapshot.ResolvedSnapshot; -import java.math.BigInteger; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Scenario: - * A main document dynamically creates embedded participant documents and then listens to those embedded - * timelines through generated channels. - * - * Main flow: - * 1. Alice calls {@code createEmbedded} five times. - * 2. Each call adds one {@code /embedded_N} document, adds a simple timeline channel for it, and adds - * bridge/counter contracts that make the main document observe the embedded timeline. - * 3. Each embedded participant calls {@code say}, which emits a chat message from the embedded document. - * 4. The main document catches the embedded chat event, increments chat counters, and Bob calls - * {@code checkChatCount}. - * 5. Bob's check sets {@code /success} once the main document has seen five chat messages. - * - * Actors and operations: - * - Alice owns dynamic embedding through {@code createEmbedded}. - * - Embedded participants own their own simple timeline {@code say} operations. - * - Bob calls {@code checkChatCount} to mark success. - * - All mutations are returned BEX Compute changesets applied through batch patches. - */ -class DynamicEmbeddedParticipantsWorkflowTest { - private static final String DOCUMENT_RESOURCE = - "coordination/compute/dynamic-embedded-participants-bex.yaml"; - private static final int EMBEDDED_PARTICIPANTS = 5; - private static final int CHAT_MESSAGES = 5; - - @Test - void aliceAddsEmbeddedParticipantDocumentsAndBobWaitsUntilMainDocumentCountsFiveChats() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - - DocumentProcessingResult initialized = support.initialize(support.yamlResource(DOCUMENT_RESOURCE)); - ResolvedSnapshot current = initialized.snapshot(); - Node currentDocument = initialized.document(); - - assertNotNull(currentDocument.getAsNode("/embeddedTemplate")); - assertNotNull(currentDocument.getAsNode("/contractTemplates/embeddedTimeline")); - assertNotNull(currentDocument.getAsNode("/contractTemplates/embeddedBridge")); - assertNotNull(currentDocument.getAsNode("/contractTemplates/embeddedChatCounter")); - assertFalse(currentDocument.getProperties().containsKey("embeddedTemplates")); - - for (int i = 1; i <= EMBEDDED_PARTICIPANTS; i++) { - // Alice creates /embedded_i plus the root contracts that make this new document routable: - // a simple timeline channel, an embedded-node bridge, a chat counter workflow, and a - // composite-channel entry. - DocumentProcessingResult result = support.blue.processDocument(current, - operationEvent(support, "alice", i, "createEmbedded")); - assertFalse(result.capabilityFailure(), result.failureReason()); - current = result.snapshot(); - currentDocument = result.document(); - } - - assertEquals(BigInteger.valueOf(EMBEDDED_PARTICIPANTS), currentDocument.get("/nextEmbeddedNumber")); - for (int i = 1; i <= EMBEDDED_PARTICIPANTS; i++) { - assertEmbeddedParticipant(currentDocument, i); - assertEquals("/embedded_" + i, currentDocument.get("/contracts/embeddedDocs/paths/" + (i - 1))); - assertEquals("embedded_" + i + "_timeline", - currentDocument.get("/contracts/allEmbeddedTimelines/channels/" + (i - 1))); - assertNotNull(currentDocument.getAsNode("/contracts/embedded_" + i + "_timeline")); - assertNotNull(currentDocument.getAsNode("/contracts/embedded_" + i + "_bridge")); - assertNotNull(currentDocument.getAsNode("/contracts/embedded_" + i + "_chatCounter")); - } - - for (int i = 0; i < CHAT_MESSAGES; i++) { - int participantNumber = i + 1; - int timestamp = 10 + i; - // The generated embedded participant calls its own say operation. That operation lives - // inside /embedded_i and emits a chat message from the child document scope. - DocumentProcessingResult chatResult = support.blue.processDocument(current, - operationEvent(support, "embedded-" + participantNumber, timestamp, "say")); - assertFalse(chatResult.capabilityFailure(), chatResult.failureReason()); - current = chatResult.snapshot(); - currentDocument = chatResult.document(); - - // Bob checks the root counter after each embedded chat. The check is intentionally a - // separate operation so the test proves both automatic event counting and explicit user - // operations can interact with the same state. - DocumentProcessingResult bobCheck = support.blue.processDocument(current, - operationEvent(support, "bob", 100 + i, "checkChatCount")); - assertFalse(bobCheck.capabilityFailure(), bobCheck.failureReason()); - current = bobCheck.snapshot(); - currentDocument = bobCheck.document(); - - assertEquals(BigInteger.valueOf(i + 1), currentDocument.get("/chatMessagesSeen")); - assertEquals(BigInteger.valueOf(i + 1), currentDocument.get("/embeddedTimelineEventsSeen")); - assertEquals(Boolean.valueOf(i + 1 >= 5), currentDocument.get("/success")); - } - - assertEquals(Boolean.TRUE, currentDocument.get("/success")); - long expectedPatchApplications = EMBEDDED_PARTICIPANTS + (CHAT_MESSAGES * 3L); - assertEquals(expectedPatchApplications, metrics.directBexChangesetHits(), - "Every returned Compute changeset should use direct BEX changeset application"); - assertEquals(expectedPatchApplications, metrics.updateBatchPatchApplications(), - "Alice creates, composite timeline counters, bridged chat counters, and Bob checks should batch apply"); - assertEquals(0L, metrics.updateIndividualPatchApplications()); - } - - private static void assertEmbeddedParticipant(Node document, int number) { - String prefix = "/embedded_" + number; - assertEquals("Embedded", document.get(prefix + "/name")); - assertEquals("Embedded " + number, document.get(prefix + "/displayName")); - assertEquals("embedded-" + number, - document.get(prefix + "/contracts/participantChannel/timeline/timelineId")); - assertEquals("embedded-" + number, - document.get(prefix + "/contracts/participantChannel/actor/accountId")); - assertNotNull(document.getAsNode(prefix + "/contracts/say")); - assertNotNull(document.getAsNode(prefix + "/contracts/say")); - } - - private static Node operationEvent(ComputeWorkflowTestSupport support, - String timelineId, - int timestamp, - String operation) { - return support.operationRequest( - timelineId, - timestamp, - operation, - operationChannel(operation), - new Node()); - } - - private static String operationChannel(String operation) { - if ("createEmbedded".equals(operation)) { - return "aliceChannel"; - } - if ("say".equals(operation)) { - return "participantChannel"; - } - if ("checkChatCount".equals(operation)) { - return "bobChannel"; - } - throw new IllegalArgumentException("Unknown operation: " + operation); - } - -} diff --git a/src/test/java/blue/coordination/processor/compute/Ed25519IntrinsicWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/Ed25519IntrinsicWorkflowTest.java deleted file mode 100644 index e27b84f..0000000 --- a/src/test/java/blue/coordination/processor/compute/Ed25519IntrinsicWorkflowTest.java +++ /dev/null @@ -1,104 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.bex.api.BexEngine; -import blue.coordination.processor.CoordinationBexIntrinsics; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -class Ed25519IntrinsicWorkflowTest { - private static final String HOTEL_DOCUMENT = "coordination/compute/ed25519-hotel-access.yaml"; - private static final String THRESHOLD_DOCUMENT = "coordination/compute/ed25519-threshold-approval.yaml"; - - private static final String HOTEL_SIGNATURE = - "oVqYjDGViWObQDdAAyiwfauZqPIt3PwzJTbdt2VbS6hdSquw8GqQyTFE-9RUf3ubupP_h35sLlZPXulrPmeeBQ"; - private static final String ALICE_SIGNATURE = - "r2xDuEqbtGNwiDOULGp6Epc1g3L_59k-tVbh7_qnLKd1XiVkjeVCm2b7b-6HdRRATK6S0zpc_DnInvFdV3BOCw"; - private static final String BOB_SIGNATURE = - "3EXsrtb4nLC37E14iOsREFhFgibnIl6MyYjzAztnUfpNdicSqs3lj4RTHM0N9E8uNCPufItDDxkL4Q8dzem3DQ"; - - @Test - void hotelAccessUsesCommonEd25519IntrinsicToGrantValidSignedRequest() { - ComputeWorkflowTestSupport support = supportWithCommonIntrinsics(); - Node document = support.initialize(support.yamlResource(HOTEL_DOCUMENT)).document(); - - DocumentProcessingResult result = support.process(document, - support.operationRequest("hotel", 1, "checkIn", "hotelChannel", hotelRequest())); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertEquals(Boolean.TRUE, result.document().get("/usedNonces/customerA/hotel-nonce-1")); - assertEquals("Hotel Access Granted", onlyEvent(result).get("/kind")); - assertEquals("customerA", onlyEvent(result).get("/userId")); - assertEquals("R123", onlyEvent(result).get("/reservationId")); - } - - @Test - void thresholdApprovalExecutesActionAfterTwoValidEd25519Approvals() { - ComputeWorkflowTestSupport support = supportWithCommonIntrinsics(); - Node document = support.initialize(support.yamlResource(THRESHOLD_DOCUMENT)).document(); - - DocumentProcessingResult afterAlice = support.process(document, - support.operationRequest("admin", 1, "approveAction", "adminChannel", - approvalRequest("alice", "alice-nonce-1", ALICE_SIGNATURE))); - - assertFalse(afterAlice.capabilityFailure(), afterAlice.failureReason()); - assertEquals("Admin Approval Recorded", onlyEvent(afterAlice).get("/kind")); - assertEquals(Boolean.TRUE, afterAlice.document().get("/approvals/delete-file-123/alice")); - - DocumentProcessingResult afterBob = support.process(afterAlice.document(), - support.operationRequest("admin", 2, "approveAction", "adminChannel", - approvalRequest("bob", "bob-nonce-1", BOB_SIGNATURE))); - - assertFalse(afterBob.capabilityFailure(), afterBob.failureReason()); - assertEquals("Admin Action Executed", onlyEvent(afterBob).get("/kind")); - assertEquals(Boolean.TRUE, afterBob.document().get("/approvals/delete-file-123/alice")); - assertEquals(Boolean.TRUE, afterBob.document().get("/approvals/delete-file-123/bob")); - assertEquals(Boolean.TRUE, afterBob.document().get("/executed/delete-file-123")); - } - - private static ComputeWorkflowTestSupport supportWithCommonIntrinsics() { - BexEngine engine = BexEngine.builder() - .intrinsics(CoordinationBexIntrinsics.common()) - .build(); - return ComputeWorkflowTestSupport.create(CoordinationProcessorOptions.builder() - .bexEngine(engine) - .build()); - } - - private static Node hotelRequest() { - return object( - "userId", "customerA", - "reservationId", "R123", - "nonce", "hotel-nonce-1", - "expires", 1000, - "signature", HOTEL_SIGNATURE); - } - - private static Node approvalRequest(String signer, String nonce, String signature) { - return object( - "actionId", "delete-file-123", - "action", "delete-file", - "resource", "file123", - "signer", signer, - "nonce", nonce, - "expires", 1000, - "signature", signature); - } - - private static Node object(Object... fields) { - Node node = new Node(); - for (int i = 0; i < fields.length; i += 2) { - node.properties(String.valueOf(fields[i]), new Node().value(fields[i + 1])); - } - return node; - } - - private static Node onlyEvent(DocumentProcessingResult result) { - assertEquals(1, result.triggeredEvents().size()); - return result.triggeredEvents().get(0); - } -} diff --git a/src/test/java/blue/coordination/processor/compute/LanguageAdoptionMetricsArtifactTest.java b/src/test/java/blue/coordination/processor/compute/LanguageAdoptionMetricsArtifactTest.java deleted file mode 100644 index 87c43b3..0000000 --- a/src/test/java/blue/coordination/processor/compute/LanguageAdoptionMetricsArtifactTest.java +++ /dev/null @@ -1,367 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.bex.api.BexEngine; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.coordination.StatusPending; -import blue.repo.mandate.Mandate; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; - -import java.io.IOException; -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** Produces deterministic machine-readable evidence for the Language-adoption scenarios. */ -class LanguageAdoptionMetricsArtifactTest { - private static final String PAYNOTE_RESOURCE = - "/processor-delay/paynote-resale-reduced-bex.yaml"; - private static final Path REPORT_DIRECTORY = Paths.get(System.getProperty("user.dir"), - "build", "reports", "language-adoption"); - - @Test - void writesJsonAndCsvForRequiredRepresentativeScenarios() throws Exception { - List scenarios = Arrays.asList( - staticUpdateDocumentScenario(), - multiPatchComputeScenario(), - payNoteFixtureScenario(), - mandateFixtureScenario()); - - LanguageAdoptionMetricsArtifactWriter.write(REPORT_DIRECTORY, scenarios); - - Path json = REPORT_DIRECTORY.resolve(LanguageAdoptionMetricsArtifactWriter.JSON_FILE_NAME); - Path csv = REPORT_DIRECTORY.resolve(LanguageAdoptionMetricsArtifactWriter.CSV_FILE_NAME); - assertTrue(Files.isRegularFile(json)); - assertTrue(Files.isRegularFile(csv)); - assertJsonScenarios(json); - assertCsvScenarios(csv); - } - - private static LanguageAdoptionMetricsArtifactWriter.Scenario staticUpdateDocumentScenario() { - OwnedScenario fixture = new OwnedScenario(); - try { - DocumentProcessingResult initialized = fixture.support.initialize(fixture.support.yaml( - fixture.support.operationWorkflowDocumentWithStatus("count: 0", String.join("\n", - " steps:", - " - name: ApplyStaticChanges", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: static-updated", - " - op: replace", - " path: /count", - " val: 1")))); - Node document = initialized.document(); - BexProcessingMetrics.Snapshot baseline = fixture.metrics.snapshot(); - - DocumentProcessingResult result = fixture.support.processRun(document); - assertSuccess(result); - assertEquals("static-updated", result.document().get("/status")); - assertEquals(BigInteger.ONE, result.document().get("/count")); - assertEquals(2L, fixture.metrics.patchesApplied()); - assertTrue(metric(fixture.metrics, "frozenPatchesHandedToLanguage") >= 2L); - return LanguageAdoptionMetricsArtifactWriter.capture( - "static-update-document", - "static-update-document", - "inline Coordination/Update Document with two authored patches", - result, - fixture.metrics, - baseline); - } finally { - fixture.close(); - } - } - - private static LanguageAdoptionMetricsArtifactWriter.Scenario multiPatchComputeScenario() { - OwnedScenario fixture = new OwnedScenario(); - try { - DocumentProcessingResult initialized = fixture.support.initialize(fixture.support.yaml( - fixture.support.operationWorkflowDocumentWithStatus("count: 0", String.join("\n", - " steps:", - " - name: BuildMultiPatchChangeset", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val: first", - " - $appendChange:", - " op: replace", - " path: /count", - " val: 2", - " - $appendChange:", - " op: replace", - " path: /status", - " val: computed", - " - $return:", - " changeset:", - " $changeset: true")))); - Node document = initialized.document(); - BexProcessingMetrics.Snapshot baseline = fixture.metrics.snapshot(); - - DocumentProcessingResult result = fixture.support.processRun(document); - assertSuccess(result); - assertEquals("computed", result.document().get("/status")); - assertEquals(BigInteger.valueOf(2L), result.document().get("/count")); - assertEquals(3L, fixture.metrics.patchesApplied()); - assertEquals(1L, fixture.metrics.updateBatchPatchApplications()); - assertEquals(0L, fixture.metrics.updateIndividualPatchApplications()); - return LanguageAdoptionMetricsArtifactWriter.capture( - "multi-patch-compute", - "multi-patch-compute", - "inline Coordination/Compute accumulated three-patch BEX changeset", - result, - fixture.metrics, - baseline); - } finally { - fixture.close(); - } - } - - private static LanguageAdoptionMetricsArtifactWriter.Scenario payNoteFixtureScenario() { - OwnedScenario fixture = new OwnedScenario(); - try { - DocumentProcessingResult initialized = fixture.support.blue.initializeDocument( - fixture.support.yamlResource(PAYNOTE_RESOURCE)); - assertSuccess(initialized); - BexProcessingMetrics.Snapshot baseline = fixture.metrics.snapshot(); - - Node event = fixture.support.operationRequest( - "hotel-participant", - 1_700_000_100, - "hotelResaleOrderPlaced", - "hotelParticipantChannel", - subscriptionUpdate()); - DocumentProcessingResult result = fixture.support.blue.processDocument( - initialized.snapshot(), event); - - assertSuccess(result); - assertEquals(Boolean.TRUE, - result.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - return LanguageAdoptionMetricsArtifactWriter.capture( - "paynote-resale-fixture", - "paynote-fixture", - "classpath:" + PAYNOTE_RESOURCE, - result, - fixture.metrics, - baseline); - } finally { - fixture.close(); - } - } - - private static LanguageAdoptionMetricsArtifactWriter.Scenario mandateFixtureScenario() { - OwnedScenario fixture = new OwnedScenario(); - try { - Node mandate = mandateDocument(); - mandate.blue(fixture.support.repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor( - fixture.support.repository).preprocess(mandate); - ResolvedSnapshot resolved = fixture.support.blue.resolveToSnapshot( - fixture.support.blue.preprocess(aliasesResolved)); - DocumentProcessingResult initialized = - fixture.support.blue.initializeDocument(resolved); - assertSuccess(initialized); - assertEquals(StatusPending.blueId(), - initialized.canonicalDocument().getAsText("/status/type/blueId")); - BexProcessingMetrics.Snapshot baseline = fixture.metrics.snapshot(); - - Node event = TestTimelineProvider.timelineEntry( - fixture.support.blue, - fixture.support.repository, - "guarantor", - "guarantor", - BigInteger.valueOf(7_000_001L), - CoordinationTestResources.operationRequest( - "confirmMandateAuthority", - "mandateGuarantorChannel", - new Node())); - DocumentProcessingResult result = fixture.support.blue.processDocument( - initialized.snapshot(), event); - - assertSuccess(result); - assertEquals(BigInteger.valueOf(7_000_001L), - result.document().get("/authorityConfirmedAt")); - return LanguageAdoptionMetricsArtifactWriter.capture( - "mandate-authority-confirmation", - "mandate-fixture", - "generated Mandate authority-confirmation lifecycle fixture", - result, - fixture.metrics, - baseline); - } finally { - fixture.close(); - } - } - - private static Node subscriptionUpdate() { - return new Node() - .type("Sample/Subscription Update") - .properties("subscriptionId", new Node().value("hotel-resale-agreement")) - .properties("targetSessionId", new Node().value("hotel-agreement-session")) - .properties("update", new Node() - .properties("kind", new Node().value("Resale Order Placed")) - .properties("inResponseTo", new Node() - .properties("requestId", new Node().value("hotel-request-a"))) - .properties("orderSessionId", new Node().value("hotel-order-session-a"))); - } - - private static Node mandateDocument() { - return new Node() - .name("Metrics artifact mandate") - .type(Mandate.qualifiedName()) - .properties("activateOnAuthorityConfirmation", new Node().value(false)) - .properties("contracts", new Node() - .properties("mandateGuarantorChannel", - TestTimelineProvider.channel("guarantor")) - .properties("authorityHolderChannel", - TestTimelineProvider.channel("holder")) - .properties("authorizedActorChannel", - TestTimelineProvider.channel("authorized"))); - } - - private static long metric(BexProcessingMetrics metrics, String name) { - Long value = metrics.languageCounters().get(name); - return value != null ? value.longValue() : 0L; - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertNotNull(result.snapshot()); - assertNotNull(result.blueId()); - } - - private static void assertJsonScenarios(Path json) throws IOException { - JsonNode root = new ObjectMapper().readTree(Files.newInputStream(json)); - assertEquals(2, root.path("schemaVersion").asInt()); - assertEquals("after-scenario-before-runtime-and-runner-close", - root.path("capturePhase").asText()); - assertEquals("runtime-construction-through-scenario", - root.path("cumulativeMetricScope").asText()); - assertEquals("after-document-initialization-before-scenario", - root.path("proofCounterDeltaBaseline").asText()); - assertTrue(root.path("coordinationElapsedTimingMetricsExcluded").asBoolean()); - assertTrue(root.path("genericElapsedTimingMetricsExcluded").asBoolean()); - assertEquals(4, root.path("scenarios").size()); - - Set ids = new HashSet(); - for (JsonNode scenario : root.path("scenarios")) { - ids.add(scenario.path("scenarioId").asText()); - assertEquals("SUCCESS", scenario.path("result").path("status").asText()); - assertTrue(scenario.path("result").path("totalGas").asLong() > 0L); - assertTrue(scenario.path("metrics").path("coordinationStrong").size() > 0); - assertTrue(scenario.path("metrics").path("language").path("counters").size() > 0); - assertTrue(scenario.path("metrics").path("language").path("gauges").size() > 0); - assertTrue(scenario.path("metrics").path("language") - .path("highWaterMarks").size() > 0); - assertNoTimingMetrics(scenario.path("metrics").path("language").path("counters")); - assertNoTimingMetrics(scenario.path("metrics").path("language").path("gauges")); - assertNoTimingMetrics(scenario.path("metrics").path("language") - .path("highWaterMarks")); - - JsonNode proof = scenario.path("metrics") - .path("proofCounterDeltasSinceInitialization"); - assertEquals(6, proof.size()); - assertEquals(expectedPatches(scenario.path("scenarioId").asText()), - proof.path("frozenPatchesHandedToLanguage").asLong()); - assertTrue(proof.path("frozenPatchValuesHandedToLanguage").asLong() > 0L); - assertEquals(proof.path("frozenPatchValuesHandedToLanguage").asLong(), - proof.path("frozenPatchValuesAccepted").asLong()); - assertEquals(0L, proof.path("mutablePatchesHandedToLanguage").asLong()); - assertEquals(0L, proof.path("mutablePatchValuesFrozen").asLong()); - assertEquals(0L, proof.path("frozenPatchValuesMaterialized").asLong()); - } - assertEquals(new HashSet(Arrays.asList( - "static-update-document", - "multi-patch-compute", - "paynote-resale-fixture", - "mandate-authority-confirmation")), ids); - } - - private static void assertCsvScenarios(Path csv) throws IOException { - String content = new String(Files.readAllBytes(csv), StandardCharsets.UTF_8); - assertTrue(content.startsWith("scenario_id,scenario_kind,fixture,status")); - assertTrue(content.contains("\"static-update-document\"")); - assertTrue(content.contains("\"multi-patch-compute\"")); - assertTrue(content.contains("\"paynote-resale-fixture\"")); - assertTrue(content.contains("\"mandate-authority-confirmation\"")); - assertTrue(content.contains("\"coordination-cumulative\",\"strong\"")); - assertTrue(content.contains("\"language-cumulative\",\"counter\"")); - assertTrue(content.contains("\"language-cumulative\",\"gauge\"")); - assertTrue(content.contains("\"language-cumulative\",\"high_water\"")); - assertTrue(content.contains("\"workflow-since-initialization\",\"counter_delta\"," - + "\"frozenPatchValuesMaterialized\",\"0\"")); - assertFalse(content.contains("Nanos")); - } - - private static void assertNoTimingMetrics(JsonNode metrics) { - Iterator names = metrics.fieldNames(); - while (names.hasNext()) { - assertFalse(names.next().endsWith("Nanos")); - } - } - - private static long expectedPatches(String scenarioId) { - if ("static-update-document".equals(scenarioId)) { - return 2L; - } - if ("multi-patch-compute".equals(scenarioId)) { - return 3L; - } - if ("paynote-resale-fixture".equals(scenarioId)) { - return 6L; - } - if ("mandate-authority-confirmation".equals(scenarioId)) { - return 2L; - } - throw new AssertionError("Unexpected scenario id: " + scenarioId); - } - - private static final class OwnedScenario implements AutoCloseable { - private final BexProcessingMetrics metrics = new BexProcessingMetrics(); - private final BexEngine engine = BexEngine.builder().build(); - private final SequentialWorkflowRunner runner = SequentialWorkflowRunner.withBexEngine( - engine, 100_000L, metrics); - private final ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .bexEngine(engine) - .sequentialWorkflowRunner(runner) - .defaultComputeGasLimit(100_000L) - .processingMetrics(metrics) - .build()); - - @Override - public void close() { - try { - support.blue.close(); - } finally { - runner.close(); - } - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/LanguageAdoptionMetricsArtifactWriter.java b/src/test/java/blue/coordination/processor/compute/LanguageAdoptionMetricsArtifactWriter.java deleted file mode 100644 index 5c82567..0000000 --- a/src/test/java/blue/coordination/processor/compute/LanguageAdoptionMetricsArtifactWriter.java +++ /dev/null @@ -1,342 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.processor.DocumentProcessingResult; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.nio.charset.StandardCharsets; -import java.nio.file.AtomicMoveNotSupportedException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -/** Deterministic JSON/CSV serialization for representative Language-adoption metrics. */ -final class LanguageAdoptionMetricsArtifactWriter { - static final String JSON_FILE_NAME = "scenario-metrics.json"; - static final String CSV_FILE_NAME = "scenario-metrics.csv"; - private static final String CAPTURE_PHASE = - "after-scenario-before-runtime-and-runner-close"; - private static final String CUMULATIVE_METRIC_SCOPE = - "runtime-construction-through-scenario"; - private static final String PROOF_COUNTER_DELTA_BASELINE = - "after-document-initialization-before-scenario"; - private static final String[] REQUIRED_PROOF_COUNTERS = { - "frozenPatchesHandedToLanguage", - "frozenPatchValuesHandedToLanguage", - "mutablePatchesHandedToLanguage", - "frozenPatchValuesAccepted", - "mutablePatchValuesFrozen", - "frozenPatchValuesMaterialized" - }; - - private LanguageAdoptionMetricsArtifactWriter() { - } - - static Scenario capture(String scenarioId, - String scenarioKind, - String fixture, - DocumentProcessingResult result, - BexProcessingMetrics metrics, - BexProcessingMetrics.Snapshot postInitializationBaseline) { - if (result == null) { - throw new IllegalArgumentException("result must not be null"); - } - if (metrics == null) { - throw new IllegalArgumentException("metrics must not be null"); - } - if (postInitializationBaseline == null) { - throw new IllegalArgumentException("postInitializationBaseline must not be null"); - } - - BexProcessingMetrics.Snapshot snapshot = metrics.snapshot(); - return new Scenario(scenarioId, - scenarioKind, - fixture, - result.status().name(), - result.errorCategory() != null ? result.errorCategory().name() : null, - result.failureReason(), - result.totalGas(), - result.triggeredEvents().size(), - result.blueId(), - strongMetrics(snapshot), - deterministicGenericMetrics(snapshot.languageCounters), - deterministicGenericMetrics(snapshot.languageGauges), - deterministicGenericMetrics(snapshot.languageHighWaterMarks), - proofCounterDeltas(postInitializationBaseline, snapshot)); - } - - static void write(Path reportDirectory, List scenarios) throws IOException { - if (reportDirectory == null) { - throw new IllegalArgumentException("reportDirectory must not be null"); - } - if (scenarios == null || scenarios.isEmpty()) { - throw new IllegalArgumentException("scenarios must not be empty"); - } - - List ordered = new ArrayList(scenarios); - Collections.sort(ordered, new Comparator() { - @Override - public int compare(Scenario left, Scenario right) { - return left.scenarioId.compareTo(right.scenarioId); - } - }); - rejectDuplicateScenarioIds(ordered); - - Files.createDirectories(reportDirectory); - writeAtomically(reportDirectory.resolve(JSON_FILE_NAME), json(ordered)); - writeAtomically(reportDirectory.resolve(CSV_FILE_NAME), csv(ordered)); - } - - private static Map strongMetrics(BexProcessingMetrics.Snapshot snapshot) { - Map values = new TreeMap(); - for (Field field : BexProcessingMetrics.Snapshot.class.getFields()) { - if (field.getType() != Long.TYPE - || !Modifier.isPublic(field.getModifiers()) - || Modifier.isStatic(field.getModifiers()) - || field.getName().endsWith("Nanos")) { - continue; - } - try { - values.put(field.getName(), Long.valueOf(field.getLong(snapshot))); - } catch (IllegalAccessException ex) { - throw new IllegalStateException("Cannot read metrics field " + field.getName(), ex); - } - } - return Collections.unmodifiableMap(values); - } - - private static Map deterministicGenericMetrics(Map source) { - Map values = new TreeMap(); - for (Map.Entry metric : source.entrySet()) { - if (!metric.getKey().endsWith("Nanos")) { - values.put(metric.getKey(), metric.getValue()); - } - } - return Collections.unmodifiableMap(values); - } - - private static Map proofCounterDeltas( - BexProcessingMetrics.Snapshot baseline, - BexProcessingMetrics.Snapshot current) { - Map values = new TreeMap(); - for (String name : REQUIRED_PROOF_COUNTERS) { - long delta = metric(current.languageCounters, name) - - metric(baseline.languageCounters, name); - if (delta < 0L) { - throw new IllegalStateException("Counter decreased after initialization: " + name); - } - values.put(name, Long.valueOf(delta)); - } - return Collections.unmodifiableMap(values); - } - - private static long metric(Map metrics, String name) { - Long value = metrics.get(name); - return value != null ? value.longValue() : 0L; - } - - private static byte[] json(List scenarios) throws IOException { - Map root = new LinkedHashMap(); - root.put("schemaVersion", Integer.valueOf(2)); - root.put("capturePhase", CAPTURE_PHASE); - root.put("cumulativeMetricScope", CUMULATIVE_METRIC_SCOPE); - root.put("proofCounterDeltaBaseline", PROOF_COUNTER_DELTA_BASELINE); - root.put("coordinationElapsedTimingMetricsExcluded", Boolean.TRUE); - root.put("genericElapsedTimingMetricsExcluded", Boolean.TRUE); - - List> serializedScenarios = - new ArrayList>(scenarios.size()); - for (Scenario scenario : scenarios) { - serializedScenarios.add(scenario.toJson()); - } - root.put("scenarios", serializedScenarios); - - ObjectMapper mapper = new ObjectMapper(); - mapper.enable(SerializationFeature.INDENT_OUTPUT); - mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS); - return (mapper.writeValueAsString(root) + "\n").getBytes(StandardCharsets.UTF_8); - } - - private static byte[] csv(List scenarios) { - StringBuilder csv = new StringBuilder(); - csv.append("scenario_id,scenario_kind,fixture,status,error_category,failure_reason,") - .append("total_gas,triggered_event_count,final_blue_id,") - .append("metric_scope,metric_kind,metric_name,metric_value\n"); - for (Scenario scenario : scenarios) { - appendMetrics(csv, scenario, "coordination-cumulative", "strong", - scenario.coordination); - appendMetrics(csv, scenario, "language-cumulative", "counter", - scenario.languageCounters); - appendMetrics(csv, scenario, "language-cumulative", "gauge", - scenario.languageGauges); - appendMetrics(csv, scenario, "language-cumulative", "high_water", - scenario.languageHighWaterMarks); - appendMetrics(csv, scenario, "workflow-since-initialization", "counter_delta", - scenario.proofCounterDeltasSinceInitialization); - } - return csv.toString().getBytes(StandardCharsets.UTF_8); - } - - private static void appendMetrics(StringBuilder csv, - Scenario scenario, - String scope, - String kind, - Map metrics) { - for (Map.Entry metric : metrics.entrySet()) { - appendCsvCell(csv, scenario.scenarioId); - appendCsvCell(csv, scenario.scenarioKind); - appendCsvCell(csv, scenario.fixture); - appendCsvCell(csv, scenario.status); - appendCsvCell(csv, scenario.errorCategory); - appendCsvCell(csv, scenario.failureReason); - appendCsvCell(csv, Long.toString(scenario.totalGas)); - appendCsvCell(csv, Integer.toString(scenario.triggeredEventCount)); - appendCsvCell(csv, scenario.finalBlueId); - appendCsvCell(csv, scope); - appendCsvCell(csv, kind); - appendCsvCell(csv, metric.getKey()); - appendCsvCell(csv, Long.toString(metric.getValue().longValue()), true); - } - } - - private static void appendCsvCell(StringBuilder target, String value) { - appendCsvCell(target, value, false); - } - - private static void appendCsvCell(StringBuilder target, String value, boolean last) { - target.append('"'); - if (value != null) { - for (int i = 0; i < value.length(); i++) { - char character = value.charAt(i); - if (character == '"') { - target.append("\"\""); - } else { - target.append(character); - } - } - } - target.append('"').append(last ? '\n' : ','); - } - - private static void writeAtomically(Path target, byte[] content) throws IOException { - Path temporary = target.resolveSibling(target.getFileName().toString() + ".tmp"); - Files.write(temporary, content); - try { - Files.move(temporary, target, - StandardCopyOption.ATOMIC_MOVE, - StandardCopyOption.REPLACE_EXISTING); - } catch (AtomicMoveNotSupportedException ex) { - Files.move(temporary, target, StandardCopyOption.REPLACE_EXISTING); - } - } - - private static void rejectDuplicateScenarioIds(List scenarios) { - String previous = null; - for (Scenario scenario : scenarios) { - if (scenario.scenarioId.equals(previous)) { - throw new IllegalArgumentException("Duplicate scenario id: " + previous); - } - previous = scenario.scenarioId; - } - } - - static final class Scenario { - private final String scenarioId; - private final String scenarioKind; - private final String fixture; - private final String status; - private final String errorCategory; - private final String failureReason; - private final long totalGas; - private final int triggeredEventCount; - private final String finalBlueId; - private final Map coordination; - private final Map languageCounters; - private final Map languageGauges; - private final Map languageHighWaterMarks; - private final Map proofCounterDeltasSinceInitialization; - - private Scenario(String scenarioId, - String scenarioKind, - String fixture, - String status, - String errorCategory, - String failureReason, - long totalGas, - int triggeredEventCount, - String finalBlueId, - Map coordination, - Map languageCounters, - Map languageGauges, - Map languageHighWaterMarks, - Map proofCounterDeltasSinceInitialization) { - this.scenarioId = required(scenarioId, "scenarioId"); - this.scenarioKind = required(scenarioKind, "scenarioKind"); - this.fixture = required(fixture, "fixture"); - this.status = required(status, "status"); - this.errorCategory = errorCategory; - this.failureReason = failureReason; - this.totalGas = totalGas; - this.triggeredEventCount = triggeredEventCount; - this.finalBlueId = finalBlueId; - this.coordination = immutableSortedCopy(coordination); - this.languageCounters = immutableSortedCopy(languageCounters); - this.languageGauges = immutableSortedCopy(languageGauges); - this.languageHighWaterMarks = immutableSortedCopy(languageHighWaterMarks); - this.proofCounterDeltasSinceInitialization = - immutableSortedCopy(proofCounterDeltasSinceInitialization); - } - - private Map toJson() { - Map result = new LinkedHashMap(); - result.put("status", status); - result.put("errorCategory", errorCategory); - result.put("failureReason", failureReason); - result.put("totalGas", Long.valueOf(totalGas)); - result.put("triggeredEventCount", Integer.valueOf(triggeredEventCount)); - result.put("finalBlueId", finalBlueId); - - Map language = new LinkedHashMap(); - language.put("counters", languageCounters); - language.put("gauges", languageGauges); - language.put("highWaterMarks", languageHighWaterMarks); - - Map metrics = new LinkedHashMap(); - metrics.put("coordinationStrong", coordination); - metrics.put("language", language); - metrics.put("proofCounterDeltasSinceInitialization", - proofCounterDeltasSinceInitialization); - - Map json = new LinkedHashMap(); - json.put("scenarioId", scenarioId); - json.put("scenarioKind", scenarioKind); - json.put("fixture", fixture); - json.put("result", result); - json.put("metrics", metrics); - return json; - } - - private static String required(String value, String label) { - if (value == null || value.isEmpty()) { - throw new IllegalArgumentException(label + " must not be empty"); - } - return value; - } - - private static Map immutableSortedCopy(Map source) { - return Collections.unmodifiableMap(new TreeMap(source)); - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/MandateDeclaredTypeEventMatchingTest.java b/src/test/java/blue/coordination/processor/compute/MandateDeclaredTypeEventMatchingTest.java deleted file mode 100644 index 0ee9d2b..0000000 --- a/src/test/java/blue/coordination/processor/compute/MandateDeclaredTypeEventMatchingTest.java +++ /dev/null @@ -1,196 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.mandate.Mandate; -import blue.repo.mandate.MandateActivated; -import blue.repo.mandate.MandateAuthorityConfirmed; -import blue.repo.mandate.MandateTerminated; -import blue.repo.mandate.StatusActive; -import blue.repo.mandate.StatusAuthorityConfirmed; - -import org.junit.jupiter.api.Test; - -import java.math.BigInteger; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class MandateDeclaredTypeEventMatchingTest { - private static final int EVENT_TIMESTAMP = 7_000_001; - - @Test - void initializationExecutesExactlyOnceAndActivationSelectsOnlyItsHandler() { - Fixture fixture = fixture(); - - DocumentProcessingResult initialized = fixture.initialize(mandateDocument(true, false)); - - assertSuccess(initialized); - assertEquals(1L, fixture.metrics.handlersExecuted()); - assertEquals(1L, fixture.metrics.workflowStepsExecuted()); - - long handlersBeforeConfirmation = fixture.metrics.handlersExecuted(); - DocumentProcessingResult activated = fixture.process( - initialized.snapshot(), - fixture.confirmAuthorityEvent()); - - assertSuccess(activated); - assertEquals(StatusActive.blueId(), - activated.canonicalDocument().getAsText("/status/type/blueId")); - assertEquals(BigInteger.valueOf(EVENT_TIMESTAMP), activated.document().get("/activatedAt")); - assertEquals(2L, fixture.metrics.handlersExecuted() - handlersBeforeConfirmation); - assertEquals(0L, fixture.metrics.successfulComputeTerminationRequests()); - assertEquals(1, eventsOfType(activated, MandateAuthorityConfirmed.blueId())); - assertEquals(1, eventsOfType(activated, MandateActivated.blueId())); - assertEquals(0, eventsOfType(activated, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED)); - } - - @Test - void fatalLifecycleDeliveryDoesNotReselectInitialization() { - Fixture fixture = fixture(); - DocumentProcessingResult initialized = fixture.initialize(mandateDocument(false, true)); - DocumentProcessingResult confirmed = fixture.process( - initialized.snapshot(), - fixture.confirmAuthorityEvent()); - assertSuccess(confirmed); - assertEquals(StatusAuthorityConfirmed.blueId(), - confirmed.canonicalDocument().getAsText("/status/type/blueId")); - long handlersBeforeFatal = fixture.metrics.handlersExecuted(); - - DocumentProcessingResult fatal = fixture.process( - confirmed.snapshot(), - fixture.fatalProbeEvent()); - - assertEquals(ProcessorStatus.RUNTIME_FATAL, fatal.status(), fatal.failureReason()); - assertTrue(fatal.failureReason().contains("Unsupported sequential workflow step"), - fatal.failureReason()); - assertEquals(StatusAuthorityConfirmed.blueId(), - fatal.canonicalDocument().getAsText("/status/type/blueId")); - assertEquals(1L, fixture.metrics.handlersExecuted() - handlersBeforeFatal); - assertEquals(1, eventsOfType(fatal, RuntimeBlueIds.DOCUMENT_PROCESSING_FATAL_ERROR)); - } - - private static Node mandateDocument(boolean activateOnConfirmation, boolean fatalProbe) { - Node contracts = new Node() - .properties("mandateGuarantorChannel", TestTimelineProvider.channel("guarantor")) - .properties("authorityHolderChannel", TestTimelineProvider.channel("holder")) - .properties("authorizedActorChannel", TestTimelineProvider.channel("authorized")); - if (fatalProbe) { - contracts.properties("fatalProbe", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value("mandateGuarantorChannel")) - .properties("event", new Node() - .properties("message", new Node().type(ChatMessage.qualifiedName()))) - .properties("steps", new Node().items( - new Node().type("Coordination/Sequential Workflow Step")))); - } - return new Node() - .name("Mandate Declared-Type Event Matching Acceptance") - .type(Mandate.qualifiedName()) - .properties("activateOnAuthorityConfirmation", new Node().value(activateOnConfirmation)) - .properties("contracts", contracts); - } - - private static int eventsOfType(DocumentProcessingResult result, String blueId) { - int count = 0; - for (Node event : result.triggeredEvents()) { - if (event.getType() != null && blueId.equals(event.getType().getBlueId())) { - count++; - } - } - return count; - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static Fixture fixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - BexProcessingMetrics metrics = new BexProcessingMetrics(); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - blue.getDocumentProcessor().processingMetricsSink(metrics); - return new Fixture(repository, blue, metrics); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - private final BexProcessingMetrics metrics; - - private Fixture(BlueRepository repository, Blue blue, BexProcessingMetrics metrics) { - this.repository = repository; - this.blue = blue; - this.metrics = metrics; - } - - private DocumentProcessingResult initialize(Node document) { - document.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(document); - ResolvedSnapshot snapshot = blue.resolveToSnapshot(blue.preprocess(aliasesResolved)); - assertMaterializedDeclaredType(snapshot, - "/contracts/initializeMandate/event/type", - RuntimeBlueIds.DOCUMENT_PROCESSING_INITIATED); - assertMaterializedDeclaredType(snapshot, - "/contracts/applyMandateActivation/event/type", - MandateActivated.blueId()); - assertMaterializedDeclaredType(snapshot, - "/contracts/applyMandateTermination/event/type", - MandateTerminated.blueId()); - return blue.initializeDocument(snapshot); - } - - private static void assertMaterializedDeclaredType(ResolvedSnapshot snapshot, - String path, - String expectedBlueId) { - Node type = snapshot.resolvedRoot().getAsNode(path); - assertNotNull(type, path); - assertEquals(expectedBlueId, type.getBlueId(), path); - assertFalse(type.isReferenceOnly(), path); - } - - private DocumentProcessingResult process(ResolvedSnapshot snapshot, Node event) { - return blue.processDocument(snapshot, event); - } - - private Node confirmAuthorityEvent() { - return TestTimelineProvider.timelineEntry( - blue, - repository, - "guarantor", - "guarantor", - BigInteger.valueOf(EVENT_TIMESTAMP), - CoordinationTestResources.operationRequest( - "confirmMandateAuthority", - "mandateGuarantorChannel", - new Node())); - } - - private Node fatalProbeEvent() { - return TestTimelineProvider.timelineEntry( - blue, - repository, - "guarantor", - "guarantor", - BigInteger.valueOf(EVENT_TIMESTAMP + 1L), - TestTimelineProvider.chatMessage("trigger fatal probe")); - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/MandateProcessingEventBindingTest.java b/src/test/java/blue/coordination/processor/compute/MandateProcessingEventBindingTest.java deleted file mode 100644 index 6ebb7ca..0000000 --- a/src/test/java/blue/coordination/processor/compute/MandateProcessingEventBindingTest.java +++ /dev/null @@ -1,195 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import blue.repo.coordination.StatusPending; -import blue.repo.mandate.Mandate; -import blue.repo.mandate.MandateAuthorityConfirmed; - -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Acceptance coverage for the generated Mandate programs that consume processingEvent. - */ -class MandateProcessingEventBindingTest { - private static final int PROCESSING_EVENT_TIMESTAMP = 7_000_001; - - @Test - void realMandateAuthorityConfirmationUsesRootProcessingEventTimestamp() { - Fixture fixture = fixture(); - DocumentProcessingResult initialized = fixture.initialize(mandateDocument()); - assertEquals(StatusPending.blueId(), - initialized.canonicalDocument().getAsText("/status/type/blueId")); - - DocumentProcessingResult result = fixture.process(initialized.snapshot(), - fixture.confirmAuthorityEvent(PROCESSING_EVENT_TIMESTAMP)); - - assertSuccess(result); - // Declared-type event matching owns final lifecycle state; this case isolates processingEvent. - assertEquals(BigInteger.valueOf(PROCESSING_EVENT_TIMESTAMP), - result.document().get("/authorityConfirmedAt")); - assertTrue(result.triggeredEvents().stream().anyMatch(event -> event.getType() != null - && MandateAuthorityConfirmed.blueId().equals(event.getType().getBlueId()))); - assertTrue(fixture.metrics.processEventSnapshotAttempts() > 0L); - assertEquals(fixture.metrics.processEventSnapshotAttempts(), - fixture.metrics.processEventSnapshotBuilds()); - } - - @Test - void mandateTimestampFunctionReturnsUndefinedWhenTimestampMissing() { - assertGuardReturnsUndefined(new Node().properties("kind", scalar("missing-timestamp"))); - } - - @Test - void mandateTimestampFunctionReturnsUndefinedForNonIntegerTimestamp() { - assertGuardReturnsUndefined(new Node().properties("timestamp", scalar("7000001"))); - } - - private static void assertGuardReturnsUndefined(Node processEvent) { - Fixture fixture = fixture(); - DocumentProcessingResult result = fixture.process( - fixture.preprocess(timestampGuardDocument(fixture.repository)), processEvent); - - assertSuccess(result); - assertEquals("undefined", result.document().get("/observation")); - assertEquals(1L, fixture.metrics.processEventSnapshotAttempts()); - assertEquals(1L, fixture.metrics.processEventSnapshotBuilds()); - } - - private static Node mandateDocument() { - return new Node() - .name("Processing Event Mandate Acceptance") - .type(Mandate.qualifiedName()) - .properties("activateOnAuthorityConfirmation", new Node().value(false)) - .properties("contracts", new Node() - .properties("mandateGuarantorChannel", TestTimelineProvider.channel("guarantor")) - .properties("authorityHolderChannel", TestTimelineProvider.channel("holder")) - .properties("authorizedActorChannel", TestTimelineProvider.channel("authorized"))); - } - - private static Node timestampGuardDocument(BlueRepository repository) { - Node mandateDefinition = repository.nodeByBlueId(Mandate.blueId()) - .orElseThrow(() -> new IllegalStateException("Published Mandate definition is unavailable")); - Node lifecycleDefinition = mandateDefinition - .getAsNode("/contracts/mandateLifecycleDefinition") - .clone(); - Map contracts = new LinkedHashMap(); - contracts.put("lifecycle", new Node().type("Lifecycle Event Channel")); - contracts.put("mandateLifecycleDefinition", lifecycleDefinition); - contracts.put("guard", new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", scalar("lifecycle")) - .properties("event", new Node().type("Document Processing Initiated")) - .properties("steps", new Node().items( - new Node() - .name("Timestamp Guard") - .type("Coordination/Compute") - .properties("definition", scalar("mandateLifecycleDefinition")) - .properties("entry", scalar("processingEventTimestamp")), - captureStep("/observation", operation("$coalesce", new Node().items( - operation("$steps", scalar("Timestamp Guard")), - scalar("undefined"))))))); - return new Node() - .name("Generated Mandate Timestamp Guard") - .properties("observation", scalar("unset")) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node captureStep(String path, Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - operation("$appendChange", new Node() - .properties("op", scalar("replace")) - .properties("path", scalar(path)) - .properties("val", value)), - operation("$return", new Node() - .properties("changeset", operation("$changeset", scalar(true)))))); - } - - private static Node operation(String name, Node argument) { - return new Node().properties(name, argument); - } - - private static Node scalar(Object value) { - return new Node().value(value); - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static Fixture fixture() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - blue.getDocumentProcessor().processingMetricsSink(metrics); - return new Fixture(repository, blue, metrics); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - private final BexProcessingMetrics metrics; - - Fixture(BlueRepository repository, Blue blue, BexProcessingMetrics metrics) { - this.repository = repository; - this.blue = blue; - this.metrics = metrics; - } - - DocumentProcessingResult initialize(Node document) { - document.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(document); - ResolvedSnapshot snapshot = blue.resolveToSnapshot(blue.preprocess(aliasesResolved)); - DocumentProcessingResult result = blue.initializeDocument(snapshot); - assertSuccess(result); - return result; - } - - DocumentProcessingResult process(Node document, Node event) { - return blue.processDocument(document, event); - } - - DocumentProcessingResult process(ResolvedSnapshot snapshot, Node event) { - return blue.processDocument(snapshot, event); - } - - Node confirmAuthorityEvent(int timestamp) { - return TestTimelineProvider.timelineEntry(blue, - repository, - "guarantor", - "guarantor", - BigInteger.valueOf(timestamp), - CoordinationTestResources.operationRequest( - "confirmMandateAuthority", - "mandateGuarantorChannel", - new Node())); - } - - Node preprocess(Node document) { - document.blue(repository.typeAliasBlue()); - return blue.preprocess(document); - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/MandateTerminationWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/MandateTerminationWorkflowTest.java deleted file mode 100644 index 48745c9..0000000 --- a/src/test/java/blue/coordination/processor/compute/MandateTerminationWorkflowTest.java +++ /dev/null @@ -1,188 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import blue.repo.coordination.StatusFailed; -import blue.repo.mandate.Mandate; -import blue.repo.mandate.MandateTerminated; -import blue.repo.mandate.StatusTerminated; - -import org.junit.jupiter.api.Test; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class MandateTerminationWorkflowTest { - private static final int TERMINATION_TIMESTAMP = 7_000_001; - - @Test - void generatedMandateTerminationAppliesTimestampAndTerminatesExactlyOnce() { - Fixture fixture = fixture(); - DocumentProcessingResult initialized = fixture.initialize(mandateDocument(false)); - assertEquals(1L, fixture.metrics.handlersExecuted()); - long handlersBeforeTermination = fixture.metrics.handlersExecuted(); - - DocumentProcessingResult result = fixture.process(initialized.snapshot(), - fixture.terminateMandateEvent(TERMINATION_TIMESTAMP)); - - assertSuccess(result); - assertEquals(StatusTerminated.blueId(), - result.canonicalDocument().getAsText("/status/type/blueId")); - assertEquals(BigInteger.valueOf(TERMINATION_TIMESTAMP), result.document().get("/terminatedAt")); - assertEquals("graceful", result.document().get("/contracts/terminated/cause")); - assertEquals("requested by guarantor", result.document().get("/contracts/terminated/reason")); - - List domainEvents = eventsOfType(result, MandateTerminated.blueId()); - assertEquals(1, domainEvents.size()); - assertEquals("requested by guarantor", domainEvents.get(0).get("/reason")); - assertEquals(1, eventsOfType(result, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED).size()); - assertTrue(indexOfType(result, MandateTerminated.blueId()) - < indexOfType(result, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED)); - - assertEquals(1L, fixture.metrics.successfulComputeTerminationRequests()); - assertEquals(0L, fixture.metrics.declarativeTerminationSteps()); - assertEquals(0L, fixture.metrics.computeResultValidationFailures()); - assertEquals(2L, fixture.metrics.handlersExecuted() - handlersBeforeTermination); - - long handlersBeforeDuplicate = fixture.metrics.handlersExecuted(); - DocumentProcessingResult duplicate = fixture.process(result.snapshot(), - fixture.terminateMandateEvent(TERMINATION_TIMESTAMP)); - assertSuccess(duplicate); - assertTrue(eventsOfType(duplicate, MandateTerminated.blueId()).isEmpty()); - assertTrue(eventsOfType(duplicate, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED).isEmpty()); - assertEquals(StatusTerminated.blueId(), - duplicate.canonicalDocument().getAsText("/status/type/blueId")); - assertEquals(BigInteger.valueOf(TERMINATION_TIMESTAMP), duplicate.document().get("/terminatedAt")); - assertEquals(handlersBeforeDuplicate, fixture.metrics.handlersExecuted()); - assertEquals(1L, fixture.metrics.successfulComputeTerminationRequests()); - } - - @Test - void failedMandateTerminatesWithoutReplacingFailureStateOrTimestamp() { - Fixture fixture = fixture(); - DocumentProcessingResult initialized = fixture.initialize(mandateDocument(true)); - assertEquals(StatusFailed.blueId(), initialized.canonicalDocument().getAsText("/status/type/blueId")); - assertNull(initialized.document().getAsNode("/terminatedAt").getValue()); - - DocumentProcessingResult result = fixture.process(initialized.snapshot(), - fixture.terminateMandateEvent(TERMINATION_TIMESTAMP)); - - assertSuccess(result); - assertEquals(StatusFailed.blueId(), result.canonicalDocument().getAsText("/status/type/blueId")); - assertNull(result.document().getAsNode("/terminatedAt").getValue()); - assertEquals("graceful", result.document().get("/contracts/terminated/cause")); - assertEquals("requested by guarantor", result.document().get("/contracts/terminated/reason")); - assertEquals(1, eventsOfType(result, MandateTerminated.blueId()).size()); - assertEquals(1, eventsOfType(result, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED).size()); - assertEquals(1L, fixture.metrics.successfulComputeTerminationRequests()); - } - - private static Node mandateDocument(boolean invalidInitializationEntry) { - Node document = new Node() - .name("Generated Mandate Termination Acceptance") - .type(Mandate.qualifiedName()) - .properties("activateOnAuthorityConfirmation", new Node().value(false)) - .properties("contracts", new Node() - .properties("mandateGuarantorChannel", TestTimelineProvider.channel("guarantor")) - .properties("authorityHolderChannel", TestTimelineProvider.channel("holder")) - .properties("authorizedActorChannel", TestTimelineProvider.channel("authorized"))); - if (invalidInitializationEntry) { - document.properties("validation", new Node() - .properties("function", new Node() - .properties("entry", new Node().value("missing")) - .properties("functions", new Node() - .properties("other", new Node() - .properties("expr", new Node().value(true)))))); - } - return document; - } - - private static List eventsOfType(DocumentProcessingResult result, String blueId) { - List events = new ArrayList(); - for (Node event : result.triggeredEvents()) { - if (event.getType() != null && blueId.equals(event.getType().getBlueId())) { - events.add(event); - } - } - return events; - } - - private static int indexOfType(DocumentProcessingResult result, String blueId) { - for (int i = 0; i < result.triggeredEvents().size(); i++) { - Node event = result.triggeredEvents().get(i); - if (event.getType() != null && blueId.equals(event.getType().getBlueId())) { - return i; - } - } - return -1; - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static Fixture fixture() { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - BexProcessingMetrics metrics = new BexProcessingMetrics(); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - blue.getDocumentProcessor().processingMetricsSink(metrics); - return new Fixture(repository, blue, metrics); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - private final BexProcessingMetrics metrics; - - private Fixture(BlueRepository repository, Blue blue, BexProcessingMetrics metrics) { - this.repository = repository; - this.blue = blue; - this.metrics = metrics; - } - - private DocumentProcessingResult initialize(Node document) { - document.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor(repository).preprocess(document); - ResolvedSnapshot snapshot = blue.resolveToSnapshot(blue.preprocess(aliasesResolved)); - DocumentProcessingResult result = blue.initializeDocument(snapshot); - assertSuccess(result); - return result; - } - - private DocumentProcessingResult process(ResolvedSnapshot snapshot, Node event) { - return blue.processDocument(snapshot, event); - } - - private Node terminateMandateEvent(int timestamp) { - Node request = new Node().properties("reason", new Node().value("requested by guarantor")); - return TestTimelineProvider.timelineEntry(blue, - repository, - "guarantor", - "guarantor", - BigInteger.valueOf(timestamp), - CoordinationTestResources.operationRequest( - "terminateMandate", - "mandateTerminationChannel", - request)); - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/OfferPaynoteEmbeddedOrdersWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/OfferPaynoteEmbeddedOrdersWorkflowTest.java deleted file mode 100644 index c48190a..0000000 --- a/src/test/java/blue/coordination/processor/compute/OfferPaynoteEmbeddedOrdersWorkflowTest.java +++ /dev/null @@ -1,838 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.ResolvedSnapshot; -import java.math.BigInteger; -import java.util.List; -import java.util.Locale; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Scenario: - * A package order for Customer and Travel Agency sells a 20-21 June weekend package: Deluxe Room in - * Hotel Badura plus a 250zl Dinner for Two at Restaurant Cud Malina for 499 PLN. - * - * Main flow: - * 1. Travel Agency delivers the exact Package PayNote as the operation request. - * 2. Card Processor authorizes the embedded PayNote. - * 3. Travel Agency provides the Restaurant Order and Hotel Order as separate operation requests inside - * the embedded PayNote. The orders are not root templates. - * 4. Restaurant and Hotel confirm their own embedded orders. - * 5. PayNote listens to the embedded order channels and requests capture only after both confirmations. - * 6. Card Processor confirms capture. - * 7. The package order listens to the embedded PayNote and changes order status to {@code Ready to use}. - * - * Actors and operations: - * - Customer and Travel Agency are package-order participants. - * - Travel Agency calls {@code deliverPaynote}, {@code provideRestaurantOrder}, and - * {@code provideHotelOrder}. - * - Card Processor calls {@code confirmAuthorization} and {@code confirmCapture}. - * - Restaurant and Hotel each call {@code confirm} inside their embedded order scopes. - */ -class OfferPaynoteEmbeddedOrdersWorkflowTest { - private static final String DOCUMENT_RESOURCE = - "coordination/compute/offer-paynote-embedded-orders-bex.yaml"; - - @Test - void packageOrderBecomesReadyToUseAfterPaynoteCapturesConfirmedRestaurantAndHotelOrders() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - - Node authored = support.yamlResource(DOCUMENT_RESOURCE); - assertNoRootTemplates(authored); - ResolvedSnapshot current = support.initialize(authored).snapshot(); - assertEquals("Awaiting PayNote", current.resolvedNodeAt("/order/status").getValue()); - assertEquals("20-21 June weekend", current.resolvedNodeAt("/package/title").getValue()); - assertEquals("Deluxe Room", current.resolvedNodeAt("/package/roomType").getValue()); - assertEquals("Restaurant Cud Malina", current.resolvedNodeAt("/package/restaurantName").getValue()); - assertEquals(BigInteger.valueOf(499), current.resolvedNodeAt("/package/price/amount").getValue()); - long snapshotBuildsAfterInitialize = metrics.processingSnapshotFromDocumentBuilds(); - - // Travel Agency delivers the PayNote directly in the operation request. The root order embeds - // that request at /paynote and asks Card Processor to authorize 499 PLN. - DocumentProcessingResult paynoteDelivered = processMeasured(metrics, "deliverPaynote", support, current, - operationEvent(support, "travel-agency", 1, "deliverPaynote", packagePaynote(support))); - assertFalse(paynoteDelivered.capabilityFailure(), paynoteDelivered.failureReason()); - current = paynoteDelivered.snapshot(); - Node currentDocument = paynoteDelivered.document(); - assertEquals("Waiting for PayNote capture", currentDocument.get("/order/status")); - assertEquals(Boolean.TRUE, currentDocument.get("/order/paynoteDelivered")); - assertEquals("Package PayNote", currentDocument.get("/paynote/name")); - assertEquals("/paynote", currentDocument.get("/contracts/embeddedPaynotes/paths/0")); - assertContainsEventKind(paynoteDelivered.triggeredEvents(), "PayNote Authorization Requested"); - - // Card Processor authorizes the PayNote. Before this point, component orders are illegal. - DocumentProcessingResult authorized = processMeasured(metrics, "confirmAuthorization", support, current, - operationEvent(support, "card-processor", 2, "confirmAuthorization", new Node())); - assertFalse(authorized.capabilityFailure(), authorized.failureReason()); - current = authorized.snapshot(); - assertEquals("Authorized", authorized.document().get("/paynote/status")); - - // Travel Agency provides the restaurant document as a request to PayNote. - DocumentProcessingResult restaurantProvided = processMeasured(metrics, "provideRestaurantOrder", support, current, - operationEvent(support, "travel-agency", 3, "provideRestaurantOrder", restaurantOrder(support))); - assertFalse(restaurantProvided.capabilityFailure(), restaurantProvided.failureReason()); - current = restaurantProvided.snapshot(); - currentDocument = restaurantProvided.document(); - assertEquals("Restaurant Order", currentDocument.get("/paynote/restaurantOrder/name")); - assertEquals(Boolean.TRUE, currentDocument.get("/paynote/restaurantOrderProvided")); - assertEquals("/restaurantOrder", currentDocument.get("/paynote/contracts/componentOrders/paths/0")); - - // Travel Agency provides the hotel document as a separate request to PayNote. - DocumentProcessingResult hotelProvided = processMeasured(metrics, "provideHotelOrder", support, current, - operationEvent(support, "travel-agency", 4, "provideHotelOrder", hotelOrder(support))); - assertFalse(hotelProvided.capabilityFailure(), hotelProvided.failureReason()); - current = hotelProvided.snapshot(); - currentDocument = hotelProvided.document(); - assertEquals("Hotel Order", currentDocument.get("/paynote/hotelOrder/name")); - assertEquals(Boolean.TRUE, currentDocument.get("/paynote/hotelOrderProvided")); - assertEquals("/hotelOrder", currentDocument.get("/paynote/contracts/componentOrders/paths/1")); - - // Restaurant confirms the restaurant order. PayNote notices the embedded event, but capture - // is still blocked because the hotel order has not confirmed yet. - DocumentProcessingResult restaurantConfirmed = processMeasured(metrics, "restaurantConfirm", support, current, - operationEvent(support, "restaurant", 5, "confirm", new Node())); - assertFalse(restaurantConfirmed.capabilityFailure(), restaurantConfirmed.failureReason()); - current = restaurantConfirmed.snapshot(); - currentDocument = restaurantConfirmed.document(); - assertEquals("Confirmed", currentDocument.get("/paynote/restaurantOrder/status")); - assertEquals(Boolean.TRUE, currentDocument.get("/paynote/restaurantConfirmed")); - assertEquals(Boolean.FALSE, currentDocument.get("/paynote/captureRequested")); - - // Hotel confirms the hotel order. Now both embedded confirmations exist, so PayNote emits a - // capture request for Card Processor. - DocumentProcessingResult hotelConfirmed = processMeasured(metrics, "hotelConfirm", support, current, - operationEvent(support, "hotel", 6, "confirm", new Node())); - assertFalse(hotelConfirmed.capabilityFailure(), hotelConfirmed.failureReason()); - current = hotelConfirmed.snapshot(); - currentDocument = hotelConfirmed.document(); - assertEquals("Confirmed", currentDocument.get("/paynote/hotelOrder/status")); - assertEquals(Boolean.TRUE, currentDocument.get("/paynote/hotelConfirmed")); - assertEquals(Boolean.TRUE, currentDocument.get("/paynote/captureRequested")); - - // Card Processor confirms capture. The root package order observes /paynote/captured through - // a Document Update Channel and switches to Ready to use. - DocumentProcessingResult captured = processMeasured(metrics, "confirmCapture", support, current, - operationEvent(support, "card-processor", 7, "confirmCapture", new Node())); - assertFalse(captured.capabilityFailure(), captured.failureReason()); - currentDocument = captured.document(); - assertEquals("Captured", currentDocument.get("/paynote/status")); - assertEquals(Boolean.TRUE, currentDocument.get("/paynote/captured")); - assertEquals("Ready to use", currentDocument.get("/order/status")); - assertContainsEventKind(captured.triggeredEvents(), "Package Order Ready to Use"); - - assertEquals(0L, metrics.updateIndividualPatchApplications()); - assertEquals(metrics.updateBatchPatchApplications(), metrics.directBexChangesetHits()); - assertEquals(0L, metrics.bexDocumentViewMaterializedHits()); - assertEquals(0L, metrics.bexSyntheticProgramMaterializations()); - assertEquals(0L, metrics.workflowDocumentViewsFromDocument()); - assertEquals(0L, metrics.workflowDocumentViewMisses()); - assertTrue(metrics.bexDocumentViewFrozenDirectHits() > 0L); - assertEquals(snapshotBuildsAfterInitialize, metrics.processingSnapshotFromDocumentBuilds()); - } - - @Test - void illegalPackagePaynoteAndComponentOrderOperationsFailClosed() { - ComputeWorkflowTestSupport support = support(null); - ResolvedSnapshot current = support.initialize(support.yamlResource(DOCUMENT_RESOURCE)).snapshot(); - - // Illegal: wrong PayNote amount. The package order only accepts the exact 499 PLN PayNote for - // this Hotel Badura + Cud Malina weekend package. This is rejected by deliverPaynote.request - // matching, so the workflow does not run and the document is unchanged. - Node wrongPaynote = packagePaynote(support); - wrongPaynote.getProperties().put("amount", new Node().value(498)); - DocumentProcessingResult wrongPaynoteResult = support.blue.processDocument(current, - operationEvent(support, "travel-agency", 11, "deliverPaynote", wrongPaynote)); - assertFalse(wrongPaynoteResult.capabilityFailure(), wrongPaynoteResult.failureReason()); - assertFalse(wrongPaynoteResult.document().getProperties().containsKey("paynote")); - assertEquals("Awaiting PayNote", wrongPaynoteResult.document().get("/order/status")); - - current = support.blue.processDocument(current, - operationEvent(support, "travel-agency", 12, "deliverPaynote", packagePaynote(support))).snapshot(); - - // Illegal: Travel Agency cannot provide component orders until Card Processor authorizes the - // embedded PayNote. - DocumentProcessingResult beforeAuthorization = support.blue.processDocument(current, - operationEvent(support, "travel-agency", 13, "provideHotelOrder", hotelOrder(support))); - assertRuntimeFatal(beforeAuthorization, "after PayNote authorization"); - - current = support.blue.processDocument(current, - operationEvent(support, "card-processor", 14, "confirmAuthorization", new Node())).snapshot(); - - // Illegal: provideRestaurantOrder rejects a hotel document at operation-request matching time. - // Restaurant and hotel fulfillment documents are intentionally specific and not interchangeable. - DocumentProcessingResult wrongRestaurantDocument = support.blue.processDocument(current, - operationEvent(support, "travel-agency", 15, "provideRestaurantOrder", hotelOrder(support))); - assertFalse(wrongRestaurantDocument.capabilityFailure(), wrongRestaurantDocument.failureReason()); - assertFalse(wrongRestaurantDocument.document().getAsNode("/paynote").getProperties() - .containsKey("restaurantOrder")); - assertEquals(Boolean.FALSE, wrongRestaurantDocument.document().get("/paynote/restaurantOrderProvided")); - - current = support.blue.processDocument(current, - operationEvent(support, "travel-agency", 16, "provideRestaurantOrder", restaurantOrder(support))).snapshot(); - current = support.blue.processDocument(current, - operationEvent(support, "travel-agency", 17, "provideHotelOrder", hotelOrder(support))).snapshot(); - - // Illegal: Card Processor cannot capture before both Restaurant and Hotel have confirmed. - DocumentProcessingResult earlyCapture = support.blue.processDocument(current, - operationEvent(support, "card-processor", 18, "confirmCapture", new Node())); - assertRuntimeFatal(earlyCapture, "before both orders confirm"); - } - - private static ComputeWorkflowTestSupport support(BexProcessingMetrics metrics) { - CoordinationProcessorOptions.Builder builder = CoordinationProcessorOptions.builder(); - if (metrics != null) { - builder.processingMetrics(metrics); - } - return ComputeWorkflowTestSupport.create(builder.build()); - } - - private static DocumentProcessingResult processMeasured(BexProcessingMetrics metrics, - String label, - ComputeWorkflowTestSupport support, - ResolvedSnapshot document, - Node event) { - BexProcessingMetrics.Snapshot before = metrics.snapshot(); - long start = System.nanoTime(); - DocumentProcessingResult result = support.blue.processDocument(document, event); - long wallNanos = System.nanoTime() - start; - BexProcessingMetrics.Snapshot after = metrics.snapshot(); - printStepMetrics(label, wallNanos, result, before, after); - return result; - } - - private static void printStepMetrics(String label, - long wallNanos, - DocumentProcessingResult result, - BexProcessingMetrics.Snapshot before, - BexProcessingMetrics.Snapshot after) { - System.out.printf(Locale.ROOT, - "[offer-paynote metrics] %s wall=%.3fms status=%s gas=%d events=%d snapshot=%s failure=%s%n", - label, - nanosToMs(wallNanos), - result.status(), - result.totalGas(), - result.triggeredEvents().size(), - result.snapshot() != null, - result.failureReason()); - System.out.printf(Locale.ROOT, - " processor blue=%.3fms process=%.3fms preprocess=%.3fms bundle=%.3fms actualBundle=%.3fms reuse=%.3fms cacheKey=%.3fms bundleHits=%d bundleMisses=%d built=%d reused=%d%n", - ms(after.blueProcessDocumentNanos, before.blueProcessDocumentNanos), - ms(after.processDocumentNanos, before.processDocumentNanos), - ms(after.eventPreprocessNanos, before.eventPreprocessNanos), - ms(after.bundleLoadNanos, before.bundleLoadNanos), - ms(after.bundleLoadActualBuildNanos, before.bundleLoadActualBuildNanos), - ms(after.bundleLoadReuseNanos, before.bundleLoadReuseNanos), - ms(after.bundleLoadCacheKeyBuildNanos, before.bundleLoadCacheKeyBuildNanos), - delta(after.bundleLoadCacheHits, before.bundleLoadCacheHits), - delta(after.bundleLoadCacheMisses, before.bundleLoadCacheMisses), - delta(after.bundlesBuilt, before.bundlesBuilt), - delta(after.bundlesReused, before.bundlesReused)); - System.out.printf(Locale.ROOT, - " snapshotCache lookup=%.3fms hits=%d misses=%d fromDocument=%.3fms builds=%d bundleScope attempts=%d execHits=%d refreshes=%d termination=%.3fms resolved=%.3fms contractLoad=%.3fms%n", - ms(after.processingSnapshotCacheLookupNanos, before.processingSnapshotCacheLookupNanos), - delta(after.processingSnapshotCacheHits, before.processingSnapshotCacheHits), - delta(after.processingSnapshotCacheMisses, before.processingSnapshotCacheMisses), - ms(after.processingSnapshotFromDocumentNanos, before.processingSnapshotFromDocumentNanos), - delta(after.processingSnapshotFromDocumentBuilds, before.processingSnapshotFromDocumentBuilds), - delta(after.bundleScopeLoadAttempts, before.bundleScopeLoadAttempts), - delta(after.bundleScopeExecutionCacheHits, before.bundleScopeExecutionCacheHits), - delta(after.bundleScopeRefreshes, before.bundleScopeRefreshes), - ms(after.bundleScopeTerminationCheckNanos, before.bundleScopeTerminationCheckNanos), - ms(after.bundleScopeResolvedLookupNanos, before.bundleScopeResolvedLookupNanos), - ms(after.bundleScopeContractLoadNanos, before.bundleScopeContractLoadNanos)); - System.out.printf(Locale.ROOT, - " routing channelDiscovery=%.3fms channelMatch=%.3fms channelEvals=%d handlerDiscovery=%.3fms handlerMatch=%.3fms handlerAttempts=%d handlerExecution=%.3fms handlers=%d eventRouting=%.3fms routed=%d%n", - ms(after.channelDiscoveryNanos, before.channelDiscoveryNanos), - ms(after.channelMatchNanos, before.channelMatchNanos), - delta(after.channelEvaluations, before.channelEvaluations), - ms(after.handlerDiscoveryNanos, before.handlerDiscoveryNanos), - ms(after.handlerMatchNanos, before.handlerMatchNanos), - delta(after.handlerMatchAttempts, before.handlerMatchAttempts), - ms(after.handlerExecutionNanos, before.handlerExecutionNanos), - delta(after.handlersExecuted, before.handlersExecuted), - ms(after.triggeredEventRoutingNanos, before.triggeredEventRoutingNanos), - delta(after.triggeredEventsRouted, before.triggeredEventsRouted)); - System.out.printf(Locale.ROOT, - " workflow runner=%.3fms steps=%d computeSteps=%d updateSteps=%d triggerSteps=%d compute=%.3fms update=%.3fms trigger=%.3fms checkpoint=%.3fms snapshot=%.3fms post=%.3fms%n", - ms(after.workflowRunnerNanos, before.workflowRunnerNanos), - delta(after.workflowStepsExecuted, before.workflowStepsExecuted), - delta(after.computeStepsExecuted, before.computeStepsExecuted), - delta(after.updateDocumentStepsExecuted, before.updateDocumentStepsExecuted), - delta(after.triggerEventStepsExecuted, before.triggerEventStepsExecuted), - ms(after.computeStepNanos, before.computeStepNanos), - ms(after.updateStepNanos, before.updateStepNanos), - ms(after.triggerStepNanos, before.triggerStepNanos), - ms(after.checkpointUpdateNanos, before.checkpointUpdateNanos), - ms(after.snapshotCommitNanos, before.snapshotCommitNanos), - ms(after.postProcessingNanos, before.postProcessingNanos)); - System.out.printf(Locale.ROOT, - " checkpoint phases ensure=%.3fms find=%.3fms currentIdentity=%.3fms isNewer=%.3fms duplicate=%.3fms persist=%.3fms identityCache hits=%d misses=%d storedHits=%d storedMisses=%d directBlueId=%.3fms contentBlueId=%.3fms fallback=%.3fms%n", - ms(after.checkpointEnsureNanos, before.checkpointEnsureNanos), - ms(after.checkpointFindNanos, before.checkpointFindNanos), - ms(after.checkpointCurrentIdentityNanos, before.checkpointCurrentIdentityNanos), - ms(after.checkpointIsNewerNanos, before.checkpointIsNewerNanos), - ms(after.checkpointDuplicateNanos, before.checkpointDuplicateNanos), - ms(after.checkpointPersistNanos, before.checkpointPersistNanos), - delta(after.checkpointIdentityCacheHits, before.checkpointIdentityCacheHits), - delta(after.checkpointIdentityCacheMisses, before.checkpointIdentityCacheMisses), - delta(after.checkpointStoredIdentityCacheHits, before.checkpointStoredIdentityCacheHits), - delta(after.checkpointStoredIdentityCacheMisses, before.checkpointStoredIdentityCacheMisses), - ms(after.checkpointDirectBlueIdNanos, before.checkpointDirectBlueIdNanos), - ms(after.checkpointContentBlueIdNanos, before.checkpointContentBlueIdNanos), - ms(after.checkpointFallbackNanos, before.checkpointFallbackNanos)); - System.out.printf(Locale.ROOT, - " bex compileExecute=%.3fms compile=%.3fms execute=%.3fms compiled=%d cacheHits=%d cacheMisses=%d nodeWriter=%.3fms syntheticProgramMaterializations=%d directChangesets=%d%n", - ms(after.computeCompileExecuteNanos, before.computeCompileExecuteNanos), - ms(after.bexCompileNanos, before.bexCompileNanos), - ms(after.bexExecuteNanos, before.bexExecuteNanos), - delta(after.bexCompiledExecutions, before.bexCompiledExecutions), - delta(after.bexCompileCacheHits, before.bexCompileCacheHits), - delta(after.bexCompileCacheMisses, before.bexCompileCacheMisses), - ms(after.bexNodeWriterNanos, before.bexNodeWriterNanos), - delta(after.bexSyntheticProgramMaterializations, before.bexSyntheticProgramMaterializations), - delta(after.directBexChangesetHits, before.directBexChangesetHits)); - System.out.printf(Locale.ROOT, - " patches applied=%d batch=%d individual=%d conversion=%.3fms apply=%.3fms batchPlan=%.3fms batchConform=%.3fms batchBuild=%.3fms batchCommit=%.3fms boundary=%.3fms gas=%.3fms updateRouting=%.3fms%n", - delta(after.patchesApplied, before.patchesApplied), - delta(after.updateBatchPatchApplications, before.updateBatchPatchApplications), - delta(after.updateIndividualPatchApplications, before.updateIndividualPatchApplications), - ms(after.updatePatchConversionNanos, before.updatePatchConversionNanos), - ms(after.updatePatchApplyNanos, before.updatePatchApplyNanos), - ms(after.batchPatchPlanningNanos, before.batchPatchPlanningNanos), - ms(after.batchPatchConformanceNanos, before.batchPatchConformanceNanos), - ms(after.batchPatchBuildUpdatesNanos, before.batchPatchBuildUpdatesNanos), - ms(after.batchPatchCommitNanos, before.batchPatchCommitNanos), - ms(after.patchBoundaryNanos, before.patchBoundaryNanos), - ms(after.patchGasNanos, before.patchGasNanos), - ms(after.documentUpdateRoutingNanos, before.documentUpdateRoutingNanos)); - System.out.printf(Locale.ROOT, - " documentView workflowFromFrozen=%d workflowFromDocument=%d workflowMisses=%d bexMaterialized=%d frozenDirect=%d frozenRootFallback=%d undefined=%d updateMaterializeBefore=%d updateMaterializeAfter=%d%n", - delta(after.workflowDocumentViewsFromFrozen, before.workflowDocumentViewsFromFrozen), - delta(after.workflowDocumentViewsFromDocument, before.workflowDocumentViewsFromDocument), - delta(after.workflowDocumentViewMisses, before.workflowDocumentViewMisses), - delta(after.bexDocumentViewMaterializedHits, before.bexDocumentViewMaterializedHits), - delta(after.bexDocumentViewFrozenDirectHits, before.bexDocumentViewFrozenDirectHits), - delta(after.bexDocumentViewFrozenRootFallbackHits, before.bexDocumentViewFrozenRootFallbackHits), - delta(after.bexDocumentViewUndefinedHits, before.bexDocumentViewUndefinedHits), - delta(after.documentUpdateBeforeMaterializations, before.documentUpdateBeforeMaterializations), - delta(after.documentUpdateAfterMaterializations, before.documentUpdateAfterMaterializations)); - } - - private static long delta(long after, long before) { - return after - before; - } - - private static double ms(long afterNanos, long beforeNanos) { - return nanosToMs(afterNanos - beforeNanos); - } - - private static double nanosToMs(long nanos) { - return nanos / 1_000_000.0d; - } - - private static void assertNoRootTemplates(Node document) { - assertFalse(document.getProperties().containsKey("paynoteTemplate")); - assertFalse(document.getProperties().containsKey("hotelOrderTemplate")); - assertFalse(document.getProperties().containsKey("restaurantOrderTemplate")); - } - - private static Node operationEvent(ComputeWorkflowTestSupport support, - String timelineId, - int timestamp, - String operation, - Node request) { - return support.operationRequest( - timelineId, - timestamp, - operation, - operationChannel(timelineId, operation), - request); - } - - private static String operationChannel(String timelineId, String operation) { - if ("deliverPaynote".equals(operation)) { - return "packageParticipants"; - } - if ("confirmAuthorization".equals(operation) || "confirmCapture".equals(operation)) { - return "cardProcessorChannel"; - } - if ("provideRestaurantOrder".equals(operation) || "provideHotelOrder".equals(operation)) { - return "travelAgencyChannel"; - } - if ("confirm".equals(operation) && "restaurant".equals(timelineId)) { - return "restaurantChannel"; - } - if ("confirm".equals(operation) && "hotel".equals(timelineId)) { - return "hotelChannel"; - } - throw new IllegalArgumentException("Unknown operation route: " + operation + " from " + timelineId); - } - - private static Node packagePaynote(ComputeWorkflowTestSupport support) { - return support.yaml(String.join("\n", - "name: Package PayNote", - "packageId: weekend-badura-cud-malina", - "status: Pending authorization", - "amount: 499", - "currency: PLN", - "startDate: 2026-06-20", - "endDate: 2026-06-21", - "customer: Customer", - "travelAgency: Travel Agency", - "cardProcessor: Card Processor", - "restaurantOrderProvided: false", - "hotelOrderProvided: false", - "restaurantConfirmed: false", - "hotelConfirmed: false", - "captureRequested: false", - "captured: false", - "contracts:", - " travelAgencyChannel:", - " type: Coordination/Timeline Channel", - " timeline:", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId: travel-agency", - " actor:", - " type: MyOS/Principal Actor", - " accountId: travel-agency", - " cardProcessorChannel:", - " type: Coordination/Timeline Channel", - " timeline:", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId: card-processor", - " actor:", - " type: MyOS/Principal Actor", - " accountId: card-processor", - " confirmAuthorization:", - " type: Coordination/Sequential Workflow Operation", - " channel: cardProcessorChannel", - " steps:", - " - name: BuildAuthorizationPatch", - " type: Coordination/Compute", - " do:", - " - $if:", - " cond:", - " $ne:", - " - $document: /status", - " - Pending authorization", - " then:", - " - $fail: PayNote authorization can only be confirmed while pending", - " - $appendChange:", - " op: replace", - " path: /status", - " val: Authorized", - " - $appendEvent:", - " type: Coordination/Event", - " kind: PayNote Authorized", - " amount:", - " $document: /amount", - " currency:", - " $document: /currency", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true", - " provideRestaurantOrder:", - " type: Coordination/Sequential Workflow Operation", - " channel: travelAgencyChannel", - " request:", - " name: Restaurant Order", - " packageId: weekend-badura-cud-malina", - " restaurantName: Restaurant Cud Malina", - " description: 250zl Dinner for Two", - " dinnerDate: 2026-06-20", - " amount: 250", - " currency: PLN", - " status: Pending", - " contracts:", - " restaurantChannel:", - " timeline:", - " timelineId: restaurant", - " actor:", - " accountId: restaurant", - " confirm:", - " channel: restaurantChannel", - " steps:", - " - name: BuildRestaurantOrderPatch", - " type: Coordination/Compute", - " do:", - " - $if:", - " cond:", - " $ne:", - " - $document: /status", - " - Authorized", - " then:", - " - $fail: Restaurant Order can only be provided after PayNote authorization", - " - $if:", - " cond:", - " $document: /restaurantOrderProvided", - " then:", - " - $fail: Restaurant Order is already provided", - " - $appendChange:", - " op: add", - " path: /restaurantOrder", - " val:", - " $binding:", - " name: event", - " path: /message/request", - " - $appendChange:", - " op: replace", - " path: /restaurantOrderProvided", - " val: true", - " - $appendChange:", - " op: add", - " path: /contracts/componentOrders/paths/-", - " val: /restaurantOrder", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true", - " provideHotelOrder:", - " type: Coordination/Sequential Workflow Operation", - " channel: travelAgencyChannel", - " request:", - " name: Hotel Order", - " packageId: weekend-badura-cud-malina", - " hotelName: Hotel Badura", - " roomType: Deluxe Room", - " checkIn: 2026-06-20", - " checkOut: 2026-06-21", - " amount: 249", - " currency: PLN", - " status: Pending", - " contracts:", - " hotelChannel:", - " timeline:", - " timelineId: hotel", - " actor:", - " accountId: hotel", - " confirm:", - " channel: hotelChannel", - " steps:", - " - name: BuildHotelOrderPatch", - " type: Coordination/Compute", - " do:", - " - $if:", - " cond:", - " $ne:", - " - $document: /status", - " - Authorized", - " then:", - " - $fail: Hotel Order can only be provided after PayNote authorization", - " - $if:", - " cond:", - " $document: /hotelOrderProvided", - " then:", - " - $fail: Hotel Order is already provided", - " - $appendChange:", - " op: add", - " path: /hotelOrder", - " val:", - " $binding:", - " name: event", - " path: /message/request", - " - $appendChange:", - " op: replace", - " path: /hotelOrderProvided", - " val: true", - " - $appendChange:", - " op: add", - " path: /contracts/componentOrders/paths/-", - " val: /hotelOrder", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true", - " componentOrders:", - " type: Process Embedded", - " paths: []", - " restaurantOrderEvents:", - " type: Embedded Node Channel", - " childPath: /restaurantOrder", - " hotelOrderEvents:", - " type: Embedded Node Channel", - " childPath: /hotelOrder", - " restaurantOrderConfirmed:", - " type: Coordination/Sequential Workflow", - " channel: restaurantOrderEvents", - " event:", - " type: Coordination/Event", - " kind: Component Order Confirmed", - " component: restaurant", - " steps:", - " - name: BuildRestaurantConfirmedPatch", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /restaurantConfirmed", - " val: true", - " - $if:", - " cond:", - " $and:", - " - $document: /hotelConfirmed", - " - $not:", - " $document: /captureRequested", - " then:", - " - $appendChange:", - " op: replace", - " path: /captureRequested", - " val: true", - " - $appendEvent:", - " type: Coordination/Event", - " kind: PayNote Capture Requested", - " amount:", - " $document: /amount", - " currency:", - " $document: /currency", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true", - " hotelOrderConfirmed:", - " type: Coordination/Sequential Workflow", - " channel: hotelOrderEvents", - " event:", - " type: Coordination/Event", - " kind: Component Order Confirmed", - " component: hotel", - " steps:", - " - name: BuildHotelConfirmedPatch", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /hotelConfirmed", - " val: true", - " - $if:", - " cond:", - " $and:", - " - $document: /restaurantConfirmed", - " - $not:", - " $document: /captureRequested", - " then:", - " - $appendChange:", - " op: replace", - " path: /captureRequested", - " val: true", - " - $appendEvent:", - " type: Coordination/Event", - " kind: PayNote Capture Requested", - " amount:", - " $document: /amount", - " currency:", - " $document: /currency", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true", - " confirmCapture:", - " type: Coordination/Sequential Workflow Operation", - " channel: cardProcessorChannel", - " steps:", - " - name: BuildCapturePatch", - " type: Coordination/Compute", - " do:", - " - $if:", - " cond:", - " $not:", - " $document: /captureRequested", - " then:", - " - $fail: PayNote capture cannot be confirmed before both orders confirm", - " - $appendChange:", - " op: replace", - " path: /status", - " val: Captured", - " - $appendChange:", - " op: replace", - " path: /captured", - " val: true", - " - $appendEvent:", - " type: Coordination/Event", - " kind: PayNote Captured", - " amount:", - " $document: /amount", - " currency:", - " $document: /currency", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true")); - } - - private static Node restaurantOrder(ComputeWorkflowTestSupport support) { - return support.yaml(String.join("\n", - "name: Restaurant Order", - "packageId: weekend-badura-cud-malina", - "restaurantName: Restaurant Cud Malina", - "description: 250zl Dinner for Two", - "dinnerDate: 2026-06-20", - "amount: 250", - "currency: PLN", - "status: Pending", - "contracts:", - " restaurantChannel:", - " type: Coordination/Timeline Channel", - " timeline:", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId: restaurant", - " actor:", - " type: MyOS/Principal Actor", - " accountId: restaurant", - " confirm:", - " type: Coordination/Sequential Workflow Operation", - " channel: restaurantChannel", - " steps:", - " - name: BuildConfirmation", - " type: Coordination/Compute", - " do:", - " - $if:", - " cond:", - " $ne:", - " - $document: /status", - " - Pending", - " then:", - " - $fail: Restaurant Order can only be confirmed while pending", - " - $appendChange:", - " op: replace", - " path: /status", - " val: Confirmed", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Component Order Confirmed", - " component: restaurant", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true")); - } - - private static Node hotelOrder(ComputeWorkflowTestSupport support) { - return support.yaml(String.join("\n", - "name: Hotel Order", - "packageId: weekend-badura-cud-malina", - "hotelName: Hotel Badura", - "roomType: Deluxe Room", - "checkIn: 2026-06-20", - "checkOut: 2026-06-21", - "amount: 249", - "currency: PLN", - "status: Pending", - "contracts:", - " hotelChannel:", - " type: Coordination/Timeline Channel", - " timeline:", - " type: Coordination/Timeline", - " providerId: test-provider", - " timelineId: hotel", - " actor:", - " type: MyOS/Principal Actor", - " accountId: hotel", - " confirm:", - " type: Coordination/Sequential Workflow Operation", - " channel: hotelChannel", - " steps:", - " - name: BuildConfirmation", - " type: Coordination/Compute", - " do:", - " - $if:", - " cond:", - " $ne:", - " - $document: /status", - " - Pending", - " then:", - " - $fail: Hotel Order can only be confirmed while pending", - " - $appendChange:", - " op: replace", - " path: /status", - " val: Confirmed", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Component Order Confirmed", - " component: hotel", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true")); - } - - private static void assertContainsEventKind(List events, String expectedKind) { - for (Node event : events) { - if (expectedKind.equals(eventKind(event))) { - return; - } - } - throw new AssertionError("Expected event kind " + expectedKind + " in " + events); - } - - private static String eventKind(Node event) { - if (event == null) { - return null; - } - Node kind = event.getProperties() != null ? event.getProperties().get("kind") : null; - Object value = kind != null ? kind.getValue() : null; - return value instanceof String ? (String) value : null; - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, String expectedMessage) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - if (result.failureReason() != null && result.failureReason().contains(expectedMessage)) { - return; - } - assertTrue(containsStringValue(result.document(), expectedMessage), - "Expected fatal reason containing: " + expectedMessage); - } - - private static boolean containsStringValue(Node node, String expectedMessage) { - if (node == null) { - return false; - } - Object value = node.getValue(); - if (value instanceof String && ((String) value).contains(expectedMessage)) { - return true; - } - if (containsStringValue(node.getType(), expectedMessage)) { - return true; - } - if (containsStringValue(node.getContracts(), expectedMessage)) { - return true; - } - if (node.getItems() != null) { - for (Node item : node.getItems()) { - if (containsStringValue(item, expectedMessage)) { - return true; - } - } - } - if (node.getProperties() != null) { - for (Node property : node.getProperties().values()) { - if (containsStringValue(property, expectedMessage)) { - return true; - } - } - } - return false; - } - -} diff --git a/src/test/java/blue/coordination/processor/compute/PaynoteReducedDefinitionWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/PaynoteReducedDefinitionWorkflowTest.java deleted file mode 100644 index f5a6d47..0000000 --- a/src/test/java/blue/coordination/processor/compute/PaynoteReducedDefinitionWorkflowTest.java +++ /dev/null @@ -1,708 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.BlueRepository; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.MethodOrderer; -import org.junit.jupiter.api.Order; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestMethodOrder; - -import java.util.List; -import java.util.Locale; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Scenario: - * A reduced Paynote resale package document exercises shared Compute Definitions, BEX field fast paths, - * batch patching, bundle caching, and cold/warm processing metrics. - * - * Main flow: - * 1. A hotel participant places a resale order through the hotel participant timeline. - * 2. The participant workflow forwards a subscription update event. - * 3. The package workflow catches that update, calls the hotel entry function from the shared - * {@code packageFulfillmentComputeDefinition}, and applies its returned changeset. - * 4. A restaurant participant repeats the same pattern through a different operation and different - * definition entry function. - * 5. Tests print cold, warm, same-path, and event-only timing so setup, compilation, bundle loading, - * handler matching, BEX execution, and patch application costs are visible. - * - * Actors and operations: - * - {@code hotel-participant} calls {@code hotelResaleOrderPlaced}. - * - {@code restaurant-participant} calls {@code restaurantResaleOrderPlaced}. - * - Both operations share one Compute Definition but enter different functions. - * - Compute returns changesets and events directly from BEX accumulators. - */ -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -class PaynoteReducedDefinitionWorkflowTest { - private static final String DOCUMENT_RESOURCE = "/processor-delay/paynote-resale-reduced-bex.yaml"; - private static Fixture fixture; - private static BexProcessingMetrics metrics; - private static ResolvedSnapshot initializedSnapshot; - private static Node hotelEvent; - private static Node restaurantEvent; - private static double setupBlueMs; - private static double loadYamlMs; - private static double initializeMs; - private static double buildHotelEventMs; - private static double buildRestaurantEventMs; - - @BeforeAll - static void prepareFixture() { - long start = System.nanoTime(); - metrics = new BexProcessingMetrics(); - fixture = configuredFixture(metrics); - setupBlueMs = elapsedMs(start); - - start = System.nanoTime(); - Node document = loadYaml(fixture, DOCUMENT_RESOURCE); - loadYamlMs = elapsedMs(start); - - start = System.nanoTime(); - initializedSnapshot = fixture.blue.initializeDocument(document).snapshot(); - initializeMs = elapsedMs(start); - - start = System.nanoTime(); - hotelEvent = participantOperation(fixture, - "hotel-participant", - 1700000100, - "hotelResaleOrderPlaced", - subscriptionUpdate("hotel-resale-agreement", - "hotel-agreement-session", - "hotel-request-a", - "hotel-order-session-a")); - buildHotelEventMs = elapsedMs(start); - - start = System.nanoTime(); - restaurantEvent = participantOperation(fixture, - "restaurant-participant", - 1700000200, - "restaurantResaleOrderPlaced", - subscriptionUpdate("restaurant-resale-agreement", - "restaurant-agreement-session", - "restaurant-request-a", - "restaurant-order-session-a")); - buildRestaurantEventMs = elapsedMs(start); - } - - @Test - @Order(1) - void eventProcessingOnlyTimingColdAndWarm() { - BexProcessingMetrics.Snapshot beforeCold = metrics.snapshot(); - long start = System.nanoTime(); - DocumentProcessingResult coldHotel = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - double coldHotelMs = elapsedMs(start); - - start = System.nanoTime(); - DocumentProcessingResult coldRestaurant = fixture.blue.processDocument(coldHotel.snapshot(), restaurantEvent); - double coldRestaurantMs = elapsedMs(start); - BexProcessingMetrics.Snapshot afterCold = metrics.snapshot(); - - assertFalse(coldHotel.capabilityFailure(), coldHotel.failureReason()); - assertFalse(coldRestaurant.capabilityFailure(), coldRestaurant.failureReason()); - assertEquals(Boolean.TRUE, coldRestaurant.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - assertEquals(Boolean.TRUE, coldRestaurant.document().get("/orders/package-order-a/restaurantOrder/resalePlaced")); - - start = System.nanoTime(); - DocumentProcessingResult warmHotel = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - double warmHotelMs = elapsedMs(start); - - start = System.nanoTime(); - DocumentProcessingResult warmRestaurant = fixture.blue.processDocument(warmHotel.snapshot(), restaurantEvent); - double warmRestaurantMs = elapsedMs(start); - BexProcessingMetrics.Snapshot afterWarm = metrics.snapshot(); - - assertFalse(warmHotel.capabilityFailure(), warmHotel.failureReason()); - assertFalse(warmRestaurant.capabilityFailure(), warmRestaurant.failureReason()); - assertEquals(Boolean.TRUE, warmRestaurant.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - assertEquals(Boolean.TRUE, warmRestaurant.document().get("/orders/package-order-a/restaurantOrder/resalePlaced")); - - System.out.printf(Locale.ROOT, - "Paynote reduced BEX cold/warm timing - coldHotelMs: %.3fms, coldRestaurantMs: %.3fms, " + - "warmHotelMs: %.3fms, warmRestaurantMs: %.3fms%n", - coldHotelMs, - coldRestaurantMs, - warmHotelMs, - warmRestaurantMs); - printMetricsDelta("cold event-only metrics delta", beforeCold, afterCold); - printMetricsDelta("warm event-only metrics delta", afterCold, afterWarm); - assertEquals(2L, afterCold.updateBatchPatchApplications - beforeCold.updateBatchPatchApplications); - assertEquals(0L, afterCold.updateIndividualPatchApplications - beforeCold.updateIndividualPatchApplications); - assertEquals(2L, afterWarm.updateBatchPatchApplications - afterCold.updateBatchPatchApplications); - assertEquals(0L, afterWarm.updateIndividualPatchApplications - afterCold.updateIndividualPatchApplications); - } - - @Test - @Order(2) - void twoParticipantsCallDifferentOperationsBackedBySharedComputeDefinition() { - long totalStart = System.nanoTime(); - BexProcessingMetrics.Snapshot before = metrics.snapshot(); - printSetupTimings(); - - long start = System.nanoTime(); - DocumentProcessingResult hotelResult = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - printTiming("process hotel participant operation", start); - - assertFalse(hotelResult.capabilityFailure(), hotelResult.failureReason()); - assertEquals("placed", - hotelResult.document().getAsText("/resaleOrderRequests/hotel-request-a/status"), - hotelResult.triggeredEvents().toString()); - assertEquals("hotel-order-session-a", - hotelResult.document().getAsText("/resaleOrderRequests/hotel-request-a/orderSessionId")); - assertEquals(Boolean.TRUE, hotelResult.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - assertEquals("hotel-order-session-a", - hotelResult.document().getAsText("/orders/package-order-a/hotelOrder/sessionId")); - assertEquals("snapshot:component:hotel:hotel-order-session-a", - hotelResult.document().getAsText("/orders/package-order-a/hotelOrder/snapshotRequestId")); - assertEquals("agreement-linked:hotel:hotel-order-session-a", - hotelResult.document().getAsText("/orders/package-order-a/hotelOrder/subscriptionId")); - assertEquals("package-order-a", - hotelResult.document().getAsText("/componentOrderRefsBySessionId/hotel-order-session-a/packageOrderSessionId")); - assertEquals("hotelOrder", - hotelResult.document().getAsText("/componentOrderRefsBySessionId/hotel-order-session-a/component")); - assertContainsType(hotelResult.triggeredEvents(), "Sample/Document Initial Snapshot Requested"); - assertContainsType(hotelResult.triggeredEvents(), "Sample/Subscribe to Session Requested"); - - start = System.nanoTime(); - DocumentProcessingResult restaurantResult = fixture.blue.processDocument(hotelResult.snapshot(), restaurantEvent); - printTiming("process restaurant participant operation", start); - - assertFalse(restaurantResult.capabilityFailure(), restaurantResult.failureReason()); - assertNotNull(restaurantResult.document()); - assertEquals("placed", restaurantResult.document().getAsText("/resaleOrderRequests/restaurant-request-a/status")); - assertEquals("restaurant-order-session-a", - restaurantResult.document().getAsText("/resaleOrderRequests/restaurant-request-a/orderSessionId")); - assertEquals(Boolean.TRUE, restaurantResult.document().get("/orders/package-order-a/restaurantOrder/resalePlaced")); - assertEquals("restaurant-order-session-a", - restaurantResult.document().getAsText("/orders/package-order-a/restaurantOrder/sessionId")); - assertEquals("snapshot:component:restaurant:restaurant-order-session-a", - restaurantResult.document().getAsText("/orders/package-order-a/restaurantOrder/snapshotRequestId")); - assertEquals("agreement-linked:restaurant:restaurant-order-session-a", - restaurantResult.document().getAsText("/orders/package-order-a/restaurantOrder/subscriptionId")); - assertEquals("package-order-a", - restaurantResult.document().getAsText("/componentOrderRefsBySessionId/restaurant-order-session-a/packageOrderSessionId")); - assertEquals("restaurantOrder", - restaurantResult.document().getAsText("/componentOrderRefsBySessionId/restaurant-order-session-a/component")); - assertEquals(Boolean.TRUE, restaurantResult.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - assertContainsType(restaurantResult.triggeredEvents(), "Sample/Document Initial Snapshot Requested"); - assertContainsType(restaurantResult.triggeredEvents(), "Sample/Subscribe to Session Requested"); - printTiming("total reduced paynote flow", totalStart); - printMetricsDelta("reduced paynote flow metrics", before, metrics.snapshot()); - } - - @Test - @Order(3) - void sameEventPathColdAndWarmTiming() { - BexProcessingMetrics.Snapshot beforeHotelCold = metrics.snapshot(); - long start = System.nanoTime(); - DocumentProcessingResult coldHotel = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - double coldHotelMs = elapsedMs(start); - BexProcessingMetrics.Snapshot afterHotelCold = metrics.snapshot(); - assertFalse(coldHotel.capabilityFailure(), coldHotel.failureReason()); - - start = System.nanoTime(); - DocumentProcessingResult warmHotel = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - double warmHotelMs = elapsedMs(start); - BexProcessingMetrics.Snapshot afterHotelWarm = metrics.snapshot(); - assertFalse(warmHotel.capabilityFailure(), warmHotel.failureReason()); - - BexProcessingMetrics.Snapshot beforeRestaurantCold = metrics.snapshot(); - start = System.nanoTime(); - DocumentProcessingResult coldRestaurant = fixture.blue.processDocument(initializedSnapshot, restaurantEvent); - double coldRestaurantMs = elapsedMs(start); - BexProcessingMetrics.Snapshot afterRestaurantCold = metrics.snapshot(); - assertFalse(coldRestaurant.capabilityFailure(), coldRestaurant.failureReason()); - - start = System.nanoTime(); - DocumentProcessingResult warmRestaurant = fixture.blue.processDocument(initializedSnapshot, restaurantEvent); - double warmRestaurantMs = elapsedMs(start); - BexProcessingMetrics.Snapshot afterRestaurantWarm = metrics.snapshot(); - assertFalse(warmRestaurant.capabilityFailure(), warmRestaurant.failureReason()); - - System.out.printf(Locale.ROOT, - "Paynote reduced BEX same-path cold/warm timing - coldHotelMs: %.3fms, warmHotelMs: %.3fms, " + - "coldRestaurantMs: %.3fms, warmRestaurantMs: %.3fms%n", - coldHotelMs, - warmHotelMs, - coldRestaurantMs, - warmRestaurantMs); - printMetricsDelta("same-path hotel cold delta", beforeHotelCold, afterHotelCold); - printMetricsDelta("same-path hotel warm delta", afterHotelCold, afterHotelWarm); - printMetricsDelta("same-path restaurant cold delta", beforeRestaurantCold, afterRestaurantCold); - printMetricsDelta("same-path restaurant warm delta", afterRestaurantCold, afterRestaurantWarm); - } - - @Test - @Order(4) - void eventProcessingOnlyTimingAfterWarmup() { - DocumentProcessingResult warmHotel = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - assertFalse(warmHotel.capabilityFailure(), warmHotel.failureReason()); - DocumentProcessingResult warmRestaurant = fixture.blue.processDocument(warmHotel.snapshot(), restaurantEvent); - assertFalse(warmRestaurant.capabilityFailure(), warmRestaurant.failureReason()); - - BexProcessingMetrics.Snapshot before = metrics.snapshot(); - long start = System.nanoTime(); - DocumentProcessingResult hotelResult = fixture.blue.processDocument(initializedSnapshot, hotelEvent); - double processHotelMs = elapsedMs(start); - - start = System.nanoTime(); - DocumentProcessingResult restaurantResult = fixture.blue.processDocument(hotelResult.snapshot(), restaurantEvent); - double processRestaurantMs = elapsedMs(start); - BexProcessingMetrics.Snapshot after = metrics.snapshot(); - - assertFalse(hotelResult.capabilityFailure(), hotelResult.failureReason()); - assertFalse(restaurantResult.capabilityFailure(), restaurantResult.failureReason()); - assertEquals(Boolean.TRUE, restaurantResult.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - assertEquals(Boolean.TRUE, restaurantResult.document().get("/orders/package-order-a/restaurantOrder/resalePlaced")); - - System.out.printf(Locale.ROOT, - "Paynote reduced BEX event-only timing - processHotelMs: %.3fms, processRestaurantMs: %.3fms%n", - processHotelMs, - processRestaurantMs); - printMetricsDelta("event-only metrics delta", before, after); - assertEquals(2L, after.updateBatchPatchApplications - before.updateBatchPatchApplications); - assertEquals(0L, after.updateIndividualPatchApplications - before.updateIndividualPatchApplications); - } - - private static Node participantOperation(Fixture fixture, - String timelineId, - int timestamp, - String operation, - Node request) { - return CoordinationTestResources.operationRequestEvent(fixture.blue, - fixture.repository, - timelineId, - timestamp, - operation, - participantChannel(timelineId), - request); - } - - private static String participantChannel(String timelineId) { - if ("hotel-participant".equals(timelineId)) { - return "hotelParticipantChannel"; - } - if ("restaurant-participant".equals(timelineId)) { - return "restaurantParticipantChannel"; - } - throw new IllegalArgumentException("Unknown participant timeline: " + timelineId); - } - - private static Node subscriptionUpdate(String subscriptionId, - String targetSessionId, - String requestId, - String orderSessionId) { - return new Node() - .type("Sample/Subscription Update") - .properties("subscriptionId", new Node().value(subscriptionId)) - .properties("targetSessionId", new Node().value(targetSessionId)) - .properties("update", new Node() - .properties("kind", new Node().value("Resale Order Placed")) - .properties("inResponseTo", new Node() - .properties("requestId", new Node().value(requestId))) - .properties("orderSessionId", new Node().value(orderSessionId))); - } - - private static Node loadYaml(Fixture fixture, String resourcePath) { - return CoordinationTestResources.yamlResource(fixture.blue, fixture.repository, resourcePath); - } - - private static void assertContainsType(List events, String expectedType) { - for (Node event : events) { - if (expectedType.equals(typeName(event))) { - return; - } - } - throw new AssertionError("Expected emitted event type " + expectedType + " in " + events); - } - - private static String typeName(Node event) { - if (event == null) { - return null; - } - if (event.getType() != null && event.getType().getValue() instanceof String) { - return (String) event.getType().getValue(); - } - Node type = event.getProperties() != null ? event.getProperties().get("type") : null; - Object value = type != null ? type.getValue() : null; - return value instanceof String ? (String) value : null; - } - - private static void printTiming(String label, long startNanos) { - System.out.printf(Locale.ROOT, "Paynote reduced BEX timing - %s: %.3fms%n", - label, - elapsedMs(startNanos)); - } - - private static double elapsedMs(long startNanos) { - return (System.nanoTime() - startNanos) / 1_000_000.0d; - } - - private static void printSetupTimings() { - System.out.printf(Locale.ROOT, "Paynote reduced BEX setup timing - setupBlueMs: %.3fms%n", setupBlueMs); - System.out.printf(Locale.ROOT, "Paynote reduced BEX setup timing - loadYamlMs: %.3fms%n", loadYamlMs); - System.out.printf(Locale.ROOT, "Paynote reduced BEX setup timing - initializeMs: %.3fms%n", initializeMs); - System.out.printf(Locale.ROOT, "Paynote reduced BEX setup timing - buildHotelEventMs: %.3fms%n", buildHotelEventMs); - System.out.printf(Locale.ROOT, "Paynote reduced BEX setup timing - buildRestaurantEventMs: %.3fms%n", buildRestaurantEventMs); - } - - private static void printMetrics(String label, BexProcessingMetrics.Snapshot snapshot) { - printMetrics(label, - snapshot.workflowStepsExecuted, - snapshot.computeStepsExecuted, - snapshot.updateDocumentStepsExecuted, - snapshot.triggerEventStepsExecuted, - snapshot.directBexChangesetHits, - snapshot.patchesApplied, - snapshot.updateBatchPatchApplications, - snapshot.updateIndividualPatchApplications, - snapshot.eventsEmitted, - snapshot.computeProgramNormalizations, - snapshot.computeDefinitionNormalizations); - printTimingMetrics(label, snapshot); - } - - private static void printMetrics(String label, - long workflowStepsExecuted, - long computeStepsExecuted, - long updateDocumentStepsExecuted, - long triggerEventStepsExecuted, - long directBexChangesetHits, - long patchesApplied, - long updateBatchPatchApplications, - long updateIndividualPatchApplications, - long eventsEmitted, - long computeProgramNormalizations, - long computeDefinitionNormalizations) { - System.out.printf(Locale.ROOT, - "Paynote reduced BEX %s - workflowSteps=%d, computeSteps=%d, updateSteps=%d, triggerSteps=%d, " + - "directChangesetHits=%d, patchesApplied=%d, " + - "batchPatchApplications=%d, individualPatchApplications=%d, eventsEmitted=%d, " + - "programNormalizations=%d, definitionNormalizations=%d%n", - label, - workflowStepsExecuted, - computeStepsExecuted, - updateDocumentStepsExecuted, - triggerEventStepsExecuted, - directBexChangesetHits, - patchesApplied, - updateBatchPatchApplications, - updateIndividualPatchApplications, - eventsEmitted, - computeProgramNormalizations, - computeDefinitionNormalizations); - } - - private static void printMetricsDelta(String label, - BexProcessingMetrics.Snapshot before, - BexProcessingMetrics.Snapshot after) { - printMetrics(label, - after.workflowStepsExecuted - before.workflowStepsExecuted, - after.computeStepsExecuted - before.computeStepsExecuted, - after.updateDocumentStepsExecuted - before.updateDocumentStepsExecuted, - after.triggerEventStepsExecuted - before.triggerEventStepsExecuted, - after.directBexChangesetHits - before.directBexChangesetHits, - after.patchesApplied - before.patchesApplied, - after.updateBatchPatchApplications - before.updateBatchPatchApplications, - after.updateIndividualPatchApplications - before.updateIndividualPatchApplications, - after.eventsEmitted - before.eventsEmitted, - after.computeProgramNormalizations - before.computeProgramNormalizations, - after.computeDefinitionNormalizations - before.computeDefinitionNormalizations); - printTimingMetricsDelta(label, before, after); - } - - private static void printTimingMetrics(String label, BexProcessingMetrics.Snapshot snapshot) { - System.out.printf(Locale.ROOT, - "Paynote reduced BEX %s timing metrics - workflowRunnerMs=%.3f, computeStepMs=%.3f, " + - "definitionResolveMs=%.3f, contextBuildMs=%.3f, programSourceBuildMs=%.3f, " + - "compileExecuteMs=%.3f, bexCompileMs=%.3f, bexExecuteMs=%.3f, " + - "updateStepMs=%.3f, directChangesetMs=%.3f, patchConversionMs=%.3f, " + - "patchApplyMs=%.3f, triggerStepMs=%.3f, emitEventMs=%.3f, " + - "bexNodeWriterMs=%.3f, compileCacheHits=%d, " + - "compileCacheMisses=%d, compiledExecutions=%d, definitionResolveHits=%d, " + - "definitionResolveMisses=%d, directPatchEntryConversions=%d%n", - label, - nanosToMs(snapshot.workflowRunnerNanos), - nanosToMs(snapshot.computeStepNanos), - nanosToMs(snapshot.computeDefinitionResolveNanos), - nanosToMs(snapshot.computeContextBuildNanos), - nanosToMs(snapshot.computeProgramSourceBuildNanos), - nanosToMs(snapshot.computeCompileExecuteNanos), - nanosToMs(snapshot.bexCompileNanos), - nanosToMs(snapshot.bexExecuteNanos), - nanosToMs(snapshot.updateStepNanos), - nanosToMs(snapshot.updateDirectChangesetNanos), - nanosToMs(snapshot.updatePatchConversionNanos), - nanosToMs(snapshot.updatePatchApplyNanos), - nanosToMs(snapshot.triggerStepNanos), - nanosToMs(snapshot.triggerEmitEventNanos), - nanosToMs(snapshot.bexNodeWriterNanos), - snapshot.bexCompileCacheHits, - snapshot.bexCompileCacheMisses, - snapshot.bexCompiledExecutions, - snapshot.computeDefinitionResolveHits, - snapshot.computeDefinitionResolveMisses, - snapshot.directBexPatchEntryConversions); - printOuterProcessingMetrics(label, - snapshot.blueProcessDocumentNanos, - snapshot.processDocumentNanos, - snapshot.eventPreprocessNanos, - snapshot.resultSnapshotAttachNanos, - snapshot.blueIdCalculationNanos, - snapshot.bundleLoadNanos, - snapshot.bundleLoadCacheKeyBuildNanos, - snapshot.bundleLoadActualBuildNanos, - snapshot.bundleLoadReuseNanos, - snapshot.bundleLoadCacheHits, - snapshot.bundleLoadCacheMisses, - snapshot.bundlesBuilt, - snapshot.bundlesReused, - snapshot.channelDiscoveryNanos, - snapshot.channelMatchNanos, - snapshot.channelEvaluations, - snapshot.handlerDiscoveryNanos, - snapshot.handlerMatchNanos, - snapshot.handlerMatchAttempts, - snapshot.handlerExecutionNanos, - snapshot.handlersExecuted, - snapshot.triggeredEventRoutingNanos, - snapshot.triggeredEventsRouted, - snapshot.checkpointUpdateNanos, - snapshot.snapshotCommitNanos, - snapshot.postProcessingNanos); - printPatchBatchMetrics(label, - snapshot.patchBoundaryNanos, - snapshot.patchGasNanos, - snapshot.documentUpdateRoutingNanos, - snapshot.documentUpdateEventsBuilt, - snapshot.documentUpdateEventsSkippedNoChannel, - snapshot.batchPatchPlanningNanos, - snapshot.batchPatchConformanceNanos, - snapshot.batchPatchBuildUpdatesNanos, - snapshot.batchPatchCommitNanos, - snapshot.documentUpdateBeforeMaterializations, - snapshot.documentUpdateAfterMaterializations); - } - - private static void printTimingMetricsDelta(String label, - BexProcessingMetrics.Snapshot before, - BexProcessingMetrics.Snapshot after) { - System.out.printf(Locale.ROOT, - "Paynote reduced BEX %s timing metrics - workflowRunnerMs=%.3f, computeStepMs=%.3f, " + - "definitionResolveMs=%.3f, contextBuildMs=%.3f, programSourceBuildMs=%.3f, " + - "compileExecuteMs=%.3f, bexCompileMs=%.3f, bexExecuteMs=%.3f, " + - "updateStepMs=%.3f, directChangesetMs=%.3f, patchConversionMs=%.3f, " + - "patchApplyMs=%.3f, triggerStepMs=%.3f, emitEventMs=%.3f, " + - "bexNodeWriterMs=%.3f, compileCacheHits=%d, " + - "compileCacheMisses=%d, compiledExecutions=%d, definitionResolveHits=%d, " + - "definitionResolveMisses=%d, directPatchEntryConversions=%d%n", - label, - nanosToMs(after.workflowRunnerNanos - before.workflowRunnerNanos), - nanosToMs(after.computeStepNanos - before.computeStepNanos), - nanosToMs(after.computeDefinitionResolveNanos - before.computeDefinitionResolveNanos), - nanosToMs(after.computeContextBuildNanos - before.computeContextBuildNanos), - nanosToMs(after.computeProgramSourceBuildNanos - before.computeProgramSourceBuildNanos), - nanosToMs(after.computeCompileExecuteNanos - before.computeCompileExecuteNanos), - nanosToMs(after.bexCompileNanos - before.bexCompileNanos), - nanosToMs(after.bexExecuteNanos - before.bexExecuteNanos), - nanosToMs(after.updateStepNanos - before.updateStepNanos), - nanosToMs(after.updateDirectChangesetNanos - before.updateDirectChangesetNanos), - nanosToMs(after.updatePatchConversionNanos - before.updatePatchConversionNanos), - nanosToMs(after.updatePatchApplyNanos - before.updatePatchApplyNanos), - nanosToMs(after.triggerStepNanos - before.triggerStepNanos), - nanosToMs(after.triggerEmitEventNanos - before.triggerEmitEventNanos), - nanosToMs(after.bexNodeWriterNanos - before.bexNodeWriterNanos), - after.bexCompileCacheHits - before.bexCompileCacheHits, - after.bexCompileCacheMisses - before.bexCompileCacheMisses, - after.bexCompiledExecutions - before.bexCompiledExecutions, - after.computeDefinitionResolveHits - before.computeDefinitionResolveHits, - after.computeDefinitionResolveMisses - before.computeDefinitionResolveMisses, - after.directBexPatchEntryConversions - before.directBexPatchEntryConversions); - printOuterProcessingMetrics(label, - after.blueProcessDocumentNanos - before.blueProcessDocumentNanos, - after.processDocumentNanos - before.processDocumentNanos, - after.eventPreprocessNanos - before.eventPreprocessNanos, - after.resultSnapshotAttachNanos - before.resultSnapshotAttachNanos, - after.blueIdCalculationNanos - before.blueIdCalculationNanos, - after.bundleLoadNanos - before.bundleLoadNanos, - after.bundleLoadCacheKeyBuildNanos - before.bundleLoadCacheKeyBuildNanos, - after.bundleLoadActualBuildNanos - before.bundleLoadActualBuildNanos, - after.bundleLoadReuseNanos - before.bundleLoadReuseNanos, - after.bundleLoadCacheHits - before.bundleLoadCacheHits, - after.bundleLoadCacheMisses - before.bundleLoadCacheMisses, - after.bundlesBuilt - before.bundlesBuilt, - after.bundlesReused - before.bundlesReused, - after.channelDiscoveryNanos - before.channelDiscoveryNanos, - after.channelMatchNanos - before.channelMatchNanos, - after.channelEvaluations - before.channelEvaluations, - after.handlerDiscoveryNanos - before.handlerDiscoveryNanos, - after.handlerMatchNanos - before.handlerMatchNanos, - after.handlerMatchAttempts - before.handlerMatchAttempts, - after.handlerExecutionNanos - before.handlerExecutionNanos, - after.handlersExecuted - before.handlersExecuted, - after.triggeredEventRoutingNanos - before.triggeredEventRoutingNanos, - after.triggeredEventsRouted - before.triggeredEventsRouted, - after.checkpointUpdateNanos - before.checkpointUpdateNanos, - after.snapshotCommitNanos - before.snapshotCommitNanos, - after.postProcessingNanos - before.postProcessingNanos); - printPatchBatchMetrics(label, - after.patchBoundaryNanos - before.patchBoundaryNanos, - after.patchGasNanos - before.patchGasNanos, - after.documentUpdateRoutingNanos - before.documentUpdateRoutingNanos, - after.documentUpdateEventsBuilt - before.documentUpdateEventsBuilt, - after.documentUpdateEventsSkippedNoChannel - before.documentUpdateEventsSkippedNoChannel, - after.batchPatchPlanningNanos - before.batchPatchPlanningNanos, - after.batchPatchConformanceNanos - before.batchPatchConformanceNanos, - after.batchPatchBuildUpdatesNanos - before.batchPatchBuildUpdatesNanos, - after.batchPatchCommitNanos - before.batchPatchCommitNanos, - after.documentUpdateBeforeMaterializations - before.documentUpdateBeforeMaterializations, - after.documentUpdateAfterMaterializations - before.documentUpdateAfterMaterializations); - } - - private static void printOuterProcessingMetrics(String label, - long blueProcessDocumentNanos, - long processDocumentNanos, - long eventPreprocessNanos, - long resultSnapshotAttachNanos, - long blueIdCalculationNanos, - long bundleLoadNanos, - long bundleLoadCacheKeyBuildNanos, - long bundleLoadActualBuildNanos, - long bundleLoadReuseNanos, - long bundleLoadCacheHits, - long bundleLoadCacheMisses, - long bundlesBuilt, - long bundlesReused, - long channelDiscoveryNanos, - long channelMatchNanos, - long channelEvaluations, - long handlerDiscoveryNanos, - long handlerMatchNanos, - long handlerMatchAttempts, - long handlerExecutionNanos, - long handlersExecuted, - long triggeredEventRoutingNanos, - long triggeredEventsRouted, - long checkpointUpdateNanos, - long snapshotCommitNanos, - long postProcessingNanos) { - long attributed = eventPreprocessNanos - + bundleLoadNanos - + channelDiscoveryNanos - + channelMatchNanos - + handlerDiscoveryNanos - + handlerMatchNanos - + handlerExecutionNanos - + checkpointUpdateNanos - + postProcessingNanos; - long processorUnattributed = Math.max(0L, processDocumentNanos - attributed); - long blueUnattributed = Math.max(0L, - blueProcessDocumentNanos - processDocumentNanos - resultSnapshotAttachNanos); - System.out.printf(Locale.ROOT, - "Paynote reduced BEX %s outer processing metrics - blueProcessDocumentMs=%.3f, " + - "processorProcessDocumentMs=%.3f, resultSnapshotAttachMs=%.3f, " + - "blueIdCalculationMs=%.3f, eventPreprocessMs=%.3f, bundleLoadMs=%.3f, " + - "bundleKeyBuildMs=%.3f, bundleActualBuildMs=%.3f, bundleReuseMs=%.3f, " + - "bundleCacheHits=%d, bundleCacheMisses=%d, bundlesBuilt=%d, bundlesReused=%d, " + - "channelDiscoveryMs=%.3f, " + - "channelMatchMs=%.3f, channelEvaluations=%d, handlerDiscoveryMs=%.3f, " + - "handlerMatchMs=%.3f, handlerMatchAttempts=%d, handlerExecutionMs=%.3f, " + - "handlersExecuted=%d, triggeredEventRoutingMs=%.3f, triggeredEventsRouted=%d, " + - "checkpointUpdateMs=%.3f, snapshotCommitMs=%.3f, postProcessingMs=%.3f, " + - "processorUnattributedMs=%.3f, blueUnattributedMs=%.3f%n", - label, - nanosToMs(blueProcessDocumentNanos), - nanosToMs(processDocumentNanos), - nanosToMs(resultSnapshotAttachNanos), - nanosToMs(blueIdCalculationNanos), - nanosToMs(eventPreprocessNanos), - nanosToMs(bundleLoadNanos), - nanosToMs(bundleLoadCacheKeyBuildNanos), - nanosToMs(bundleLoadActualBuildNanos), - nanosToMs(bundleLoadReuseNanos), - bundleLoadCacheHits, - bundleLoadCacheMisses, - bundlesBuilt, - bundlesReused, - nanosToMs(channelDiscoveryNanos), - nanosToMs(channelMatchNanos), - channelEvaluations, - nanosToMs(handlerDiscoveryNanos), - nanosToMs(handlerMatchNanos), - handlerMatchAttempts, - nanosToMs(handlerExecutionNanos), - handlersExecuted, - nanosToMs(triggeredEventRoutingNanos), - triggeredEventsRouted, - nanosToMs(checkpointUpdateNanos), - nanosToMs(snapshotCommitNanos), - nanosToMs(postProcessingNanos), - nanosToMs(processorUnattributed), - nanosToMs(blueUnattributed)); - } - - private static void printPatchBatchMetrics(String label, - long patchBoundaryNanos, - long patchGasNanos, - long documentUpdateRoutingNanos, - long documentUpdateEventsBuilt, - long documentUpdateEventsSkippedNoChannel, - long batchPatchPlanningNanos, - long batchPatchConformanceNanos, - long batchPatchBuildUpdatesNanos, - long batchPatchCommitNanos, - long documentUpdateBeforeMaterializations, - long documentUpdateAfterMaterializations) { - System.out.printf(Locale.ROOT, - "Paynote reduced BEX %s batch patch metrics - patchBoundaryMs=%.3f, patchGasMs=%.3f, " + - "documentUpdateRoutingMs=%.3f, documentUpdateEventsBuilt=%d, " + - "documentUpdateEventsSkippedNoChannel=%d, batchPlanningMs=%.3f, " + - "batchConformanceMs=%.3f, batchBuildUpdatesMs=%.3f, batchCommitMs=%.3f, " + - "documentUpdateBeforeMaterializations=%d, documentUpdateAfterMaterializations=%d%n", - label, - nanosToMs(patchBoundaryNanos), - nanosToMs(patchGasNanos), - nanosToMs(documentUpdateRoutingNanos), - documentUpdateEventsBuilt, - documentUpdateEventsSkippedNoChannel, - nanosToMs(batchPatchPlanningNanos), - nanosToMs(batchPatchConformanceNanos), - nanosToMs(batchPatchBuildUpdatesNanos), - nanosToMs(batchPatchCommitNanos), - documentUpdateBeforeMaterializations, - documentUpdateAfterMaterializations); - } - - private static double nanosToMs(long nanos) { - return nanos / 1_000_000.0d; - } - - private static Fixture configuredFixture(BexProcessingMetrics metrics) { - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - return new Fixture(repository, blue); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - - private Fixture(BlueRepository repository, Blue blue) { - this.repository = repository; - this.blue = blue; - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/ProcessingEventBindingTest.java b/src/test/java/blue/coordination/processor/compute/ProcessingEventBindingTest.java deleted file mode 100644 index 85676a9..0000000 --- a/src/test/java/blue/coordination/processor/compute/ProcessingEventBindingTest.java +++ /dev/null @@ -1,603 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.bex.api.BexDocumentView; -import blue.bex.api.BexEngine; -import blue.bex.api.BexExecutionContext; -import blue.bex.api.BexProgramSource; -import blue.bex.result.BexExecutionResult; -import blue.bex.value.BexValue; -import blue.bex.value.BexValues; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.FrozenNode; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Integration coverage for Coordination's immutable root Processing Event BEX binding. - */ -class ProcessingEventBindingTest { - private static final int ROOT_TIMESTAMP = 7_000_001; - - @Test - void directComputeReadsCompleteProcessingEvent() { - Fixture fixture = fixture(); - Node initialized = fixture.initialize(operationDocument( - captureStep("/observation", directObservation()))); - - DocumentProcessingResult result = fixture.process(initialized, - fixture.operationEvent(ROOT_TIMESTAMP, "run", "ownerChannel", - new Node().properties("requestSentinel", scalar("direct-request")))); - - assertSuccess(result); - assertEquals("object", result.document().get("/observation/rootKind")); - assertEquals("owner", result.document().get("/observation/rootTimeline")); - assertEquals("owner", result.document().get("/observation/rootActor")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/observation/currentTimestamp")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/observation/rootTimestamp")); - assertEquals("direct-request", result.document().get("/observation/rootRequestSentinel")); - } - - @Test - void triggeredComputeDistinguishesEventFromProcessingEvent() { - Fixture fixture = fixture(); - Map contracts = operationContracts(); - contracts.put("run", operationWorkflow(triggerChat("triggered-message"))); - contracts.put("triggered", new Node().type("Triggered Event Channel")); - contracts.put("observeTriggered", workflow("triggered", - new Node().type(ChatMessage.qualifiedName()) - .properties("message", scalar("triggered-message")), - captureStep("/observation", routedObservation("/message")))); - Node initialized = fixture.initialize(document(contracts)); - - DocumentProcessingResult result = fixture.process(initialized, - fixture.operationEvent(ROOT_TIMESTAMP, "run", "ownerChannel", scalar("request"))); - - assertSuccess(result); - assertEquals("triggered-message", result.document().get("/observation/currentSentinel")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/observation/rootTimestamp")); - assertEquals("request", result.document().get("/observation/rootRequest")); - assertEquals("undefined", result.document().get("/observation/currentTimestampKind"), - "$event must remain the triggered Message, not the root Timeline Entry"); - } - - @Test - void multiHopComputeKeepsOriginalProcessingEvent() { - Fixture fixture = fixture(); - Map contracts = operationContracts(); - contracts.put("run", operationWorkflow(triggerChat("first-hop"))); - contracts.put("triggered", new Node().type("Triggered Event Channel")); - contracts.put("firstHop", workflow("triggered", chatMatcher("first-hop"), triggerChat("second-hop"))); - contracts.put("secondHop", workflow("triggered", chatMatcher("second-hop"), - captureStep("/observation", routedObservation("/message")))); - Node initialized = fixture.initialize(document(contracts)); - - DocumentProcessingResult result = fixture.process(initialized, - fixture.operationEvent(ROOT_TIMESTAMP, "run", "ownerChannel", scalar("request"))); - - assertSuccess(result); - assertEquals("second-hop", result.document().get("/observation/currentSentinel")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/observation/rootTimestamp")); - } - - @Test - void implicitInitializationCanReadProcessingEvent() { - Fixture fixture = fixture(); - Node rootEvent = new Node() - .properties("kind", scalar("implicit-root")) - .properties("nested", new Node().properties("answer", scalar(42))); - - DocumentProcessingResult result = fixture.processUninitialized( - lifecycleDocument(binding("processingEvent")), rootEvent); - - assertSuccess(result); - assertEquals("implicit-root", result.document().get("/observation/kind")); - assertEquals(BigInteger.valueOf(42), result.document().get("/observation/nested/answer")); - } - - @Test - void explicitInitializationReadsUndefined() { - Fixture fixture = fixture(); - Node fallback = operation("$coalesce", new Node().items( - binding("processingEvent"), scalar("undefined"))); - - DocumentProcessingResult result = fixture.initializeResult(lifecycleDocument(fallback)); - - assertSuccess(result); - assertEquals("undefined", result.document().get("/observation")); - assertEquals(0L, fixture.metrics.processEventSnapshotAttempts()); - } - - @Test - void embeddedScopeReadsRootProcessingEvent() { - Fixture fixture = fixture(); - Map childContracts = operationContracts(); - childContracts.put("run", operationWorkflow( - captureStep("/observation", routedObservation("/message/request")))); - Node child = document(childContracts); - Map rootContracts = new LinkedHashMap(); - rootContracts.put("embedded", new Node().type("Process Embedded") - .properties("paths", new Node().items(scalar("/child")))); - Node root = document(rootContracts).properties("child", child); - Node initialized = fixture.initialize(root); - - DocumentProcessingResult result = fixture.process(initialized, - fixture.operationEvent(ROOT_TIMESTAMP, "run", "ownerChannel", scalar("child-request"))); - - assertSuccess(result); - assertEquals("child-request", result.document().get("/child/observation/currentSentinel")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/child/observation/rootTimestamp")); - } - - @Test - void bridgeHandlerReadsRootProcessingEvent() { - Fixture fixture = fixture(); - Map childContracts = operationContracts(); - childContracts.put("run", operationWorkflow(triggerChat("from-child"))); - Node child = document(childContracts); - Map rootContracts = new LinkedHashMap(); - rootContracts.put("embedded", new Node().type("Process Embedded") - .properties("paths", new Node().items(scalar("/child")))); - rootContracts.put("childBridge", new Node().type("Embedded Node Channel") - .properties("childPath", scalar("/child"))); - rootContracts.put("observeBridge", workflow("childBridge", chatMatcher("from-child"), - captureStep("/observation", routedObservation("/message")))); - Node initialized = fixture.initialize(document(rootContracts).properties("child", child)); - - DocumentProcessingResult result = fixture.process(initialized, - fixture.operationEvent(ROOT_TIMESTAMP, "run", "ownerChannel", scalar("request"))); - - assertSuccess(result); - assertEquals("from-child", result.document().get("/observation/currentSentinel")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/observation/rootTimestamp")); - } - - @Test - void nonTimelineScalarListAndObjectEventsAreSupported() { - Node[] events = { - scalar("scalar-root"), - new Node().items(scalar("first"), scalar(2), scalar(true)), - new Node().properties("kind", scalar("object-root")) - }; - - for (Node event : events) { - Fixture fixture = fixture(); - DocumentProcessingResult result = fixture.processUninitialized( - lifecycleDocument(binding("processingEvent")), event); - - assertSuccess(result); - assertNodeShapeEquals(event, result.document().getProperties().get("observation")); - } - } - - @Test - void pureReferenceProcessingEventPreservesReferenceIdentity() { - Fixture fixture = fixture(); - Node reference = new Node().blueId(ChatMessage.blueId()); - - DocumentProcessingResult result = fixture.processUninitialized( - lifecycleDocument(binding("processingEvent")), reference); - - assertSuccess(result); - Node observed = result.document().getAsNode("/observation"); - assertTrue(observed.isReferenceOnly()); - assertEquals(ChatMessage.blueId(), observed.getBlueId()); - } - - @Test - void separateProcessRunsDoNotLeakProcessingEvent() { - Fixture fixture = fixture(); - Node initialized = fixture.initialize(operationDocument( - captureStep("/observation", binding("processingEvent/timestamp")))); - - DocumentProcessingResult first = fixture.process(initialized, - fixture.operationEvent(101, "run", "ownerChannel", scalar("first"))); - DocumentProcessingResult second = fixture.process(first.document(), - fixture.operationEvent(202, "run", "ownerChannel", scalar("second"))); - - assertSuccess(first); - assertSuccess(second); - assertEquals(BigInteger.valueOf(101), first.document().get("/observation")); - assertEquals(BigInteger.valueOf(202), second.document().get("/observation")); - assertEquals(2L, fixture.metrics.processEventSnapshotAttempts()); - assertEquals(2L, fixture.metrics.processEventSnapshotBuilds()); - } - - @Test - void wideAndDeepUnusedEventsProduceZeroSnapshotAttempts() { - Fixture fixture = fixture(); - - assertSuccess(fixture.processUninitialized(lifecycleDocument(scalar("unused")), wideEvent())); - assertSuccess(fixture.processUninitialized(lifecycleDocument(scalar("unused")), deepEvent())); - - assertEquals(0L, fixture.metrics.processEventSnapshotAttempts()); - assertEquals(0L, fixture.metrics.processEventSnapshotBuilds()); - assertEquals(0L, fixture.metrics.processEventSnapshotFailures()); - assertEquals(0L, fixture.metrics.processEventSnapshotConstructionNanos()); - } - - @Test - void firstBindingReadBuildsOneSnapshot() { - Fixture fixture = fixture(); - - DocumentProcessingResult result = fixture.processUninitialized( - lifecycleDocument(binding("processingEvent")), wideEvent()); - - assertSuccess(result); - assertEquals(1L, fixture.metrics.processEventSnapshotAttempts()); - assertEquals(1L, fixture.metrics.processEventSnapshotBuilds()); - assertEquals(0L, fixture.metrics.processEventSnapshotFailures()); - assertTrue(fixture.metrics.processEventSnapshotConstructionNanos() >= 0L); - } - - @Test - void manyReadsAndComputesInOneRunBuildOneSnapshot() { - Fixture fixture = fixture(); - Node initialized = fixture.initialize(operationDocument( - captureStep("/observation", binding("processingEvent/timestamp")), - captureStep("/secondObservation", binding("processingEvent/message/request")), - captureStep("/thirdObservation", routedObservation("/message/request")))); - - DocumentProcessingResult result = fixture.process(initialized, - fixture.operationEvent(ROOT_TIMESTAMP, "run", "ownerChannel", scalar("request"))); - - assertSuccess(result); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/observation")); - assertEquals("request", result.document().get("/secondObservation")); - assertEquals(BigInteger.valueOf(ROOT_TIMESTAMP), result.document().get("/thirdObservation/rootTimestamp")); - assertEquals(1L, fixture.metrics.processEventSnapshotAttempts()); - assertEquals(1L, fixture.metrics.processEventSnapshotBuilds()); - } - - @Test - void processingEventBindingReadUsesExactExistingVarReadGas() { - Fixture currentEventFixture = fixture(); - Fixture processingEventFixture = fixture(); - Node currentDocument = currentEventFixture.initialize(directTimelineDocument(binding("event/timestamp"))); - Node processingDocument = processingEventFixture.initialize( - directTimelineDocument(binding("processingEvent/timestamp"))); - Node currentEvent = currentEventFixture.timelineEvent(ROOT_TIMESTAMP, scalar("same")); - Node processingEvent = processingEventFixture.timelineEvent(ROOT_TIMESTAMP, scalar("same")); - - DocumentProcessingResult currentResult = currentEventFixture.process(currentDocument, currentEvent); - DocumentProcessingResult processingResult = processingEventFixture.process(processingDocument, processingEvent); - - assertSuccess(currentResult); - assertSuccess(processingResult); - assertEquals(currentResult.totalGas(), processingResult.totalGas()); - assertEquals(0L, currentEventFixture.metrics.processEventSnapshotAttempts()); - assertEquals(1L, processingEventFixture.metrics.processEventSnapshotAttempts()); - } - - @Test - void unusedProcessingEventBindingAddsZeroGas() { - AtomicInteger supplierCalls = new AtomicInteger(); - BexEngine engine = BexEngine.builder().build(); - BexProgramSource source = BexProgramSource.expression(FrozenNode.fromResolvedNode(scalar("result"))); - BexExecutionContext withoutBinding = bareBexContext().build(); - BexExecutionContext withUnusedBinding = bareBexContext() - .lazyBinding("processingEvent", () -> { - supplierCalls.incrementAndGet(); - return BexValues.scalar("unused"); - }) - .build(); - - BexExecutionResult withoutResult = engine.compileAndExecute(source, withoutBinding); - BexExecutionResult withResult = engine.compileAndExecute(source, withUnusedBinding); - - assertEquals(withoutResult.gasUsed(), withResult.gasUsed()); - assertEquals(0, supplierCalls.get()); - } - - @Test - void coordinationRegistrationPreservesIndependentSinkAndFansOutLanguageMetrics() { - BexProcessingMetrics processorMetrics = new BexProcessingMetrics(); - BexProcessingMetrics workflowMetrics = new BexProcessingMetrics(); - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - blue.getDocumentProcessor().processingMetricsSink(processorMetrics); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(workflowMetrics) - .build()); - Node document = lifecycleDocument(binding("processingEvent")) - .blue(repository.typeAliasBlue()); - - DocumentProcessingResult result = blue.processDocument( - blue.preprocess(document), new Node().properties("kind", scalar("root"))); - - assertSuccess(result); - assertEquals(1L, processorMetrics.processEventSnapshotAttempts()); - assertEquals(1L, workflowMetrics.processEventSnapshotAttempts()); - assertEquals(0L, processorMetrics.computeStepsExecuted()); - assertEquals(1L, workflowMetrics.computeStepsExecuted()); - } - - private static BexExecutionContext.Builder bareBexContext() { - return BexExecutionContext.builder() - .document(EmptyDocumentView.INSTANCE) - .gasLimit(10_000L); - } - - private static Node directTimelineDocument(Node returnValue) { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", TestTimelineProvider.channel("owner")); - contracts.put("observe", workflow("ownerChannel", null, computeReturnStep(returnValue))); - return document(contracts); - } - - private static Node operationDocument(Node... steps) { - Map contracts = operationContracts(); - contracts.put("run", operationWorkflow(steps)); - return document(contracts); - } - - private static Map operationContracts() { - Map contracts = new LinkedHashMap(); - contracts.put("ownerChannel", TestTimelineProvider.channel("owner")); - return contracts; - } - - private static Node operationWorkflow(Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", scalar("ownerChannel")) - .properties("steps", new Node().items(steps)); - } - - private static Node workflow(String channel, Node event, Node... steps) { - Node workflow = new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", scalar(channel)) - .properties("steps", new Node().items(steps)); - if (event != null) { - workflow.properties("event", event); - } - return workflow; - } - - private static Node lifecycleDocument(Node observation) { - Map contracts = new LinkedHashMap(); - contracts.put("lifecycle", new Node().type("Lifecycle Event Channel")); - contracts.put("observeInitialization", workflow("lifecycle", - new Node().type("Document Processing Initiated"), - captureStep("/observation", observation))); - return document(contracts); - } - - private static Node document(Map contracts) { - return new Node() - .name("Processing Event Binding Test") - .properties("observation", scalar("unset")) - .properties("secondObservation", scalar("unset")) - .properties("thirdObservation", scalar("unset")) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node captureStep(String path, Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items( - operation("$appendChange", new Node() - .properties("op", scalar("replace")) - .properties("path", scalar(path)) - .properties("val", value)), - operation("$return", new Node() - .properties("changeset", operation("$changeset", scalar(true)))))); - } - - private static Node computeReturnStep(Node value) { - return new Node() - .type("Coordination/Compute") - .properties("do", new Node().items(operation("$return", value))); - } - - private static Node triggerChat(String message) { - return new Node() - .type("Coordination/Trigger Event") - .properties("event", new Node() - .type(ChatMessage.qualifiedName()) - .properties("message", scalar(message))); - } - - private static Node chatMatcher(String message) { - return new Node() - .type(ChatMessage.qualifiedName()) - .properties("message", scalar(message)); - } - - private static Node directObservation() { - return new Node() - .properties("rootKind", operation("$kind", binding("processingEvent"))) - .properties("rootTimeline", binding("processingEvent/timeline/timelineId")) - .properties("rootActor", binding("processingEvent/actor/accountId")) - .properties("currentTimestamp", event("/timestamp")) - .properties("rootTimestamp", binding("processingEvent/timestamp")) - .properties("rootRequestSentinel", - binding("processingEvent/message/request/requestSentinel")); - } - - private static Node routedObservation(String currentPath) { - return new Node() - .properties("currentSentinel", event(currentPath)) - .properties("currentTimestampKind", operation("$kind", binding("event/timestamp"))) - .properties("rootTimestamp", binding("processingEvent/timestamp")) - .properties("rootRequest", binding("processingEvent/message/request")); - } - - private static Node binding(String path) { - return operation("$binding", scalar(path)); - } - - private static Node event(String path) { - return operation("$event", scalar(path)); - } - - private static Node operation(String name, Node argument) { - return new Node().properties(name, argument); - } - - private static Node scalar(Object value) { - return new Node().value(value); - } - - private static Node wideEvent() { - Node event = new Node().properties("kind", scalar("wide")); - for (int index = 0; index < 256; index++) { - event.properties("field" + index, scalar(index)); - } - return event; - } - - private static Node deepEvent() { - Node event = new Node().properties("kind", scalar("deep")); - Node cursor = event; - for (int index = 0; index < 128; index++) { - Node child = new Node(); - cursor.properties("next", child); - cursor = child; - } - cursor.properties("leaf", scalar("end")); - return event; - } - - private static void assertNodeShapeEquals(Node expected, Node actual) { - assertNotNull(actual); - assertScalarEquals(expected.getValue(), actual.getValue()); - if (expected.getItems() == null) { - assertNull(actual.getItems()); - } else { - assertNotNull(actual.getItems()); - assertEquals(expected.getItems().size(), actual.getItems().size()); - for (int index = 0; index < expected.getItems().size(); index++) { - assertNodeShapeEquals(expected.getItems().get(index), actual.getItems().get(index)); - } - } - if (expected.getProperties() == null) { - assertNull(actual.getProperties()); - } else { - assertNotNull(actual.getProperties()); - assertEquals(expected.getProperties().keySet(), actual.getProperties().keySet()); - for (String key : expected.getProperties().keySet()) { - assertNodeShapeEquals(expected.getProperties().get(key), actual.getProperties().get(key)); - } - } - } - - private static void assertScalarEquals(Object expected, Object actual) { - if (expected instanceof Number && actual instanceof Number) { - assertEquals(new BigDecimal(expected.toString()), new BigDecimal(actual.toString())); - return; - } - assertEquals(expected, actual); - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static Fixture fixture() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - BlueRepository repository = BlueRepository.latest(); - Blue blue = CoordinationTestResources.configuredBlue(repository); - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - blue.getDocumentProcessor().processingMetricsSink(metrics); - return new Fixture(repository, blue, metrics); - } - - private static final class Fixture { - private final BlueRepository repository; - private final Blue blue; - private final BexProcessingMetrics metrics; - - Fixture(BlueRepository repository, Blue blue, BexProcessingMetrics metrics) { - this.repository = repository; - this.blue = blue; - this.metrics = metrics; - } - - Node initialize(Node document) { - return initializeResult(document).document(); - } - - DocumentProcessingResult initializeResult(Node document) { - document.blue(repository.typeAliasBlue()); - return blue.initializeDocument(blue.preprocess(document)); - } - - DocumentProcessingResult process(Node document, Node event) { - return blue.processDocument(document, event); - } - - DocumentProcessingResult processUninitialized(Node document, Node event) { - document.blue(repository.typeAliasBlue()); - return blue.processDocument(blue.preprocess(document), event); - } - - Node operationEvent(int timestamp, - String operation, - String channel, - Node request) { - return TestTimelineProvider.timelineEntry(blue, - repository, - "owner", - "owner", - BigInteger.valueOf(timestamp), - CoordinationTestResources.operationRequest(operation, channel, request)); - } - - Node timelineEvent(int timestamp, Node message) { - return TestTimelineProvider.timelineEntry(blue, - repository, - "owner", - "owner", - BigInteger.valueOf(timestamp), - message); - } - } - - private enum EmptyDocumentView implements BexDocumentView { - INSTANCE; - - @Override - public String resolvePointer(String pointer) { - return pointer; - } - - @Override - public BexValue canonicalAt(String pointer) { - return BexValues.undefined(); - } - - @Override - public BexValue resolvedAt(String pointer) { - return BexValues.undefined(); - } - - @Override - public String currentScopePath() { - return "/"; - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/RepresentativeWorkflowLifecycleSmokeTest.java b/src/test/java/blue/coordination/processor/compute/RepresentativeWorkflowLifecycleSmokeTest.java deleted file mode 100644 index 416947e..0000000 --- a/src/test/java/blue/coordination/processor/compute/RepresentativeWorkflowLifecycleSmokeTest.java +++ /dev/null @@ -1,404 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.bex.api.BexEngine; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.language.BlueCacheStats; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.coordination.StatusPending; -import blue.repo.mandate.Mandate; -import java.math.BigInteger; -import java.util.Map; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * A deterministic lifecycle/memory smoke over representative real workflow shapes. - * - *

This deliberately measures owned cache state instead of heap deltas, weak references, or - * forced GC. Replaying identical work must settle below a warmed retention ceiling, every - * workflow-scoped transient reference cache must return to its baseline, and explicit shutdown - * must release both the Language runtime and the externally owned Coordination runner.

- */ -class RepresentativeWorkflowLifecycleSmokeTest { - private static final String PAYNOTE_RESOURCE = - "/processor-delay/paynote-resale-reduced-bex.yaml"; - private static final String TRANSIENT_REFERENCE_CACHE = "transientTrustedReferences"; - private static final long TWO_GIB = 2L * 1024L * 1024L * 1024L; - - @Test - void repeatedPayNoteMandateAndEmbeddedRunsPlateauAndReleaseOwnedState() { - assertEquals("1.8", System.getProperty("java.specification.version"), - "memoryIntegrationTest must keep the Java 8 compatibility runtime"); - assertTrue(Runtime.getRuntime().maxMemory() <= TWO_GIB, - "memoryIntegrationTest must retain its -Xmx2g ceiling"); - - OwnedFixture fixture = new OwnedFixture(); - try { - fixture.prepare(); - fixture.assertTransientStateAtBaseline("after fixture preparation"); - - fixture.runRepresentativeSuite(); - RetainedState firstWarmSample = fixture.retainedState(); - fixture.runRepresentativeSuite(); - RetainedState warmedCeiling = RetainedState.maximum( - firstWarmSample, fixture.retainedState()); - - for (int repetition = 0; repetition < 3; repetition++) { - fixture.runRepresentativeSuite(); - fixture.retainedState().assertAtOrBelow(warmedCeiling, - "repetition " + repetition); - } - - assertTrue(fixture.metrics.workflowStepsExecuted() > 0L); - assertTrue(fixture.metrics.computeStepsExecuted() > 0L); - assertTrue(fixture.metrics.workflowPlanWeightBytes() > 0L); - assertTrue(fixture.metrics.computePlanWeightBytes() > 0L); - assertTrue(fixture.runner.workflowPlanCacheSize() > 0); - - long runnerWeightBeforeRuntimeClose = - fixture.runner.workflowPlanCacheWeightBytes(); - long computeWeightBeforeRuntimeClose = fixture.metrics.computePlanWeightBytes(); - fixture.closeRuntime(); - - BlueCacheStats closedRuntime = fixture.support.blue.cacheStats(); - assertTrue(closedRuntime.isClosed()); - assertEquals(0, closedRuntime.entries()); - assertEquals(0L, closedRuntime.currentWeightBytes()); - assertEquals(runnerWeightBeforeRuntimeClose, - fixture.runner.workflowPlanCacheWeightBytes(), - "Blue must not close an injected runner it does not own"); - assertEquals(computeWeightBeforeRuntimeClose, - fixture.metrics.computePlanWeightBytes(), - "runner Compute plans remain externally owned until runner.close()"); - assertEquals(1L, metric(fixture.metrics.languageCounters(), "runtimeCloseCalls")); - assertTrue(metric(fixture.metrics.languageCounters(), - "runtimeCloseReleasedWeightBytes") > 0L); - assertClosedLanguageCacheGauges(fixture.metrics.languageGauges()); - - fixture.closeRunner(); - assertEquals(0, fixture.runner.workflowPlanCacheSize()); - assertEquals(0L, fixture.runner.workflowPlanCacheWeightBytes()); - assertEquals(0L, fixture.metrics.workflowPlanWeightBytes()); - assertEquals(0L, fixture.metrics.computePlanWeightBytes()); - } finally { - fixture.close(); - } - } - - private static void assertClosedLanguageCacheGauges(Map gauges) { - boolean observedRetentionGauge = false; - for (Map.Entry gauge : gauges.entrySet()) { - String name = gauge.getKey(); - if (name.startsWith("cache.") - && (name.endsWith(".entries") - || name.endsWith(".currentWeightBytes") - || name.endsWith(".pinnedEntries") - || name.endsWith(".derivedEntries"))) { - observedRetentionGauge = true; - assertEquals(0L, gauge.getValue().longValue(), - "runtime close retained " + name); - } - } - assertTrue(observedRetentionGauge, - "the Language runtime must publish close-time cache gauges"); - } - - private static long metric(Map metrics, String name) { - Long value = metrics.get(name); - return value == null ? 0L : value.longValue(); - } - - private static void assertSuccess(DocumentProcessingResult result) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - } - - private static Node subscriptionUpdate(String subscriptionId, - String targetSessionId, - String requestId, - String orderSessionId) { - return new Node() - .type("Sample/Subscription Update") - .properties("subscriptionId", new Node().value(subscriptionId)) - .properties("targetSessionId", new Node().value(targetSessionId)) - .properties("update", new Node() - .properties("kind", new Node().value("Resale Order Placed")) - .properties("inResponseTo", new Node() - .properties("requestId", new Node().value(requestId))) - .properties("orderSessionId", new Node().value(orderSessionId))); - } - - private static Node mandateDocument() { - return new Node() - .name("Lifecycle memory smoke mandate") - .type(Mandate.qualifiedName()) - .properties("activateOnAuthorityConfirmation", new Node().value(false)) - .properties("contracts", new Node() - .properties("mandateGuarantorChannel", - TestTimelineProvider.channel("guarantor")) - .properties("authorityHolderChannel", - TestTimelineProvider.channel("holder")) - .properties("authorizedActorChannel", - TestTimelineProvider.channel("authorized"))); - } - - private static Node embeddedDocument() { - return new Node() - .name("Lifecycle memory smoke embedded parent") - .properties("contracts", new Node() - .properties("embedded", new Node() - .type("Process Embedded") - .properties("paths", new Node().items( - new Node().value("/child"))))) - .properties("child", new Node() - .name("Lifecycle memory smoke embedded child") - .properties("status", new Node().value("idle")) - .properties("contracts", new Node() - .properties("childChannel", - TestTimelineProvider.channel("child")) - .properties("runChild", new Node() - .type("Coordination/Sequential Workflow Operation") - .properties("channel", new Node().value("childChannel")) - .properties("request", new Node().type("Text")) - .properties("steps", new Node().items( - embeddedComputeStep()))))); - } - - private static Node embeddedComputeStep() { - return new Node() - .name("Update embedded child") - .type("Coordination/Compute") - .properties("do", new Node().items( - new Node().properties("$appendChange", new Node() - .properties("op", new Node().value("replace")) - .properties("path", new Node().value("/status")) - .properties("val", new Node().value("processed"))), - new Node().properties("$return", new Node() - .properties("changeset", new Node() - .properties("$changeset", new Node().value(true)))))); - } - - private static final class OwnedFixture implements AutoCloseable { - private final BexProcessingMetrics metrics = new BexProcessingMetrics(); - private final BexEngine engine = BexEngine.builder().build(); - private final SequentialWorkflowRunner runner = SequentialWorkflowRunner.withBexEngine( - engine, 100_000L, metrics); - private final ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .bexEngine(engine) - .sequentialWorkflowRunner(runner) - .defaultComputeGasLimit(100_000L) - .processingMetrics(metrics) - .build()); - - private ResolvedSnapshot paynoteSnapshot; - private Node paynoteEvent; - private ResolvedSnapshot mandateSnapshot; - private Node mandateEvent; - private ResolvedSnapshot embeddedSnapshot; - private Node embeddedEvent; - private int transientBaselineEntries; - private long transientBaselineWeightBytes; - private boolean runtimeClosed; - private boolean runnerClosed; - - private void prepare() { - DocumentProcessingResult paynoteInitialized = support.blue.initializeDocument( - support.yamlResource(PAYNOTE_RESOURCE)); - assertSuccess(paynoteInitialized); - paynoteSnapshot = paynoteInitialized.snapshot(); - paynoteEvent = CoordinationTestResources.operationRequestEvent( - support.blue, - support.repository, - "hotel-participant", - 1_700_000_100, - "hotelResaleOrderPlaced", - "hotelParticipantChannel", - subscriptionUpdate("hotel-resale-agreement", - "hotel-agreement-session", - "hotel-request-a", - "hotel-order-session-a")); - - Node mandate = mandateDocument(); - mandate.blue(support.repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor( - support.repository).preprocess(mandate); - ResolvedSnapshot resolvedMandate = support.blue.resolveToSnapshot( - support.blue.preprocess(aliasesResolved)); - DocumentProcessingResult mandateInitialized = - support.blue.initializeDocument(resolvedMandate); - assertSuccess(mandateInitialized); - assertEquals(StatusPending.blueId(), - mandateInitialized.canonicalDocument().getAsText("/status/type/blueId")); - mandateSnapshot = mandateInitialized.snapshot(); - mandateEvent = TestTimelineProvider.timelineEntry( - support.blue, - support.repository, - "guarantor", - "guarantor", - BigInteger.valueOf(7_000_001L), - CoordinationTestResources.operationRequest( - "confirmMandateAuthority", - "mandateGuarantorChannel", - new Node())); - - DocumentProcessingResult embeddedInitialized = support.initialize( - embeddedDocument()); - assertSuccess(embeddedInitialized); - embeddedSnapshot = embeddedInitialized.snapshot(); - embeddedEvent = CoordinationTestResources.operationRequestEvent( - support.blue, - support.repository, - "child", - 1, - "runChild", - "childChannel", - new Node().value("request")); - - BlueCacheStats.Region transientCache = transientCache(); - transientBaselineEntries = transientCache.entries(); - transientBaselineWeightBytes = transientCache.currentWeightBytes(); - } - - private void runRepresentativeSuite() { - DocumentProcessingResult paynote = support.blue.processDocument( - paynoteSnapshot, paynoteEvent.clone()); - assertSuccess(paynote); - assertEquals(Boolean.TRUE, - paynote.document().get("/orders/package-order-a/hotelOrder/resalePlaced")); - - DocumentProcessingResult mandate = support.blue.processDocument( - mandateSnapshot, mandateEvent.clone()); - assertSuccess(mandate); - assertEquals(BigInteger.valueOf(7_000_001L), - mandate.document().get("/authorityConfirmedAt")); - - DocumentProcessingResult embedded = support.blue.processDocument( - embeddedSnapshot, embeddedEvent.clone()); - assertSuccess(embedded); - assertEquals("processed", embedded.document().get("/child/status")); - - assertTransientStateAtBaseline("after representative suite"); - } - - private RetainedState retainedState() { - BlueCacheStats runtime = support.blue.cacheStats(); - BlueCacheStats.Region transientCache = transientCache(); - return new RetainedState(runtime.entries(), - runtime.currentWeightBytes(), - transientCache.entries(), - transientCache.currentWeightBytes(), - runner.workflowPlanCacheSize(), - runner.workflowPlanCacheWeightBytes(), - metrics.computePlanWeightBytes()); - } - - private void assertTransientStateAtBaseline(String phase) { - BlueCacheStats.Region transientCache = transientCache(); - assertEquals(transientBaselineEntries, transientCache.entries(), - phase + " retained transient reference entries"); - assertEquals(transientBaselineWeightBytes, transientCache.currentWeightBytes(), - phase + " retained transient reference weight"); - } - - private BlueCacheStats.Region transientCache() { - BlueCacheStats.Region region = support.blue.cacheStats().region( - TRANSIENT_REFERENCE_CACHE); - assertNotNull(region, "Language runtime did not expose the transient cache region"); - return region; - } - - private void closeRuntime() { - if (!runtimeClosed) { - runtimeClosed = true; - support.blue.close(); - } - } - - private void closeRunner() { - if (!runnerClosed) { - runnerClosed = true; - runner.close(); - } - } - - @Override - public void close() { - try { - closeRuntime(); - } finally { - closeRunner(); - } - } - } - - private static final class RetainedState { - private final int languageEntries; - private final long languageWeightBytes; - private final int transientEntries; - private final long transientWeightBytes; - private final int workflowPlanEntries; - private final long workflowPlanWeightBytes; - private final long computePlanWeightBytes; - - private RetainedState(int languageEntries, - long languageWeightBytes, - int transientEntries, - long transientWeightBytes, - int workflowPlanEntries, - long workflowPlanWeightBytes, - long computePlanWeightBytes) { - this.languageEntries = languageEntries; - this.languageWeightBytes = languageWeightBytes; - this.transientEntries = transientEntries; - this.transientWeightBytes = transientWeightBytes; - this.workflowPlanEntries = workflowPlanEntries; - this.workflowPlanWeightBytes = workflowPlanWeightBytes; - this.computePlanWeightBytes = computePlanWeightBytes; - } - - private static RetainedState maximum(RetainedState left, RetainedState right) { - return new RetainedState( - Math.max(left.languageEntries, right.languageEntries), - Math.max(left.languageWeightBytes, right.languageWeightBytes), - Math.max(left.transientEntries, right.transientEntries), - Math.max(left.transientWeightBytes, right.transientWeightBytes), - Math.max(left.workflowPlanEntries, right.workflowPlanEntries), - Math.max(left.workflowPlanWeightBytes, right.workflowPlanWeightBytes), - Math.max(left.computePlanWeightBytes, right.computePlanWeightBytes)); - } - - private void assertAtOrBelow(RetainedState ceiling, String phase) { - assertAtOrBelow(languageEntries, ceiling.languageEntries, - phase + " Language cache entries"); - assertAtOrBelow(languageWeightBytes, ceiling.languageWeightBytes, - phase + " Language cache weight"); - assertAtOrBelow(transientEntries, ceiling.transientEntries, - phase + " transient entries"); - assertAtOrBelow(transientWeightBytes, ceiling.transientWeightBytes, - phase + " transient weight"); - assertAtOrBelow(workflowPlanEntries, ceiling.workflowPlanEntries, - phase + " workflow-plan entries"); - assertAtOrBelow(workflowPlanWeightBytes, ceiling.workflowPlanWeightBytes, - phase + " workflow-plan weight"); - assertAtOrBelow(computePlanWeightBytes, ceiling.computePlanWeightBytes, - phase + " Compute-plan weight"); - } - - private static void assertAtOrBelow(long actual, long ceiling, String label) { - assertTrue(actual <= ceiling, - label + " exceeded the warmed ceiling: actual=" + actual - + ", ceiling=" + ceiling); - } - } -} diff --git a/src/test/java/blue/coordination/processor/compute/TerminateProcessingWorkflowTest.java b/src/test/java/blue/coordination/processor/compute/TerminateProcessingWorkflowTest.java deleted file mode 100644 index 4e90706..0000000 --- a/src/test/java/blue/coordination/processor/compute/TerminateProcessingWorkflowTest.java +++ /dev/null @@ -1,359 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.coordination.processor.workflow.SequentialWorkflowRunner; -import blue.coordination.processor.workflow.StepExecutionContext; -import blue.coordination.processor.workflow.TerminateProcessingStepExecutor; -import blue.coordination.processor.workflow.WorkflowStepExecutor; -import blue.coordination.processor.workflow.WorkflowStepResult; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.repo.coordination.Compute; -import blue.repo.coordination.SequentialWorkflowStep; -import blue.repo.coordination.TerminateProcessing; - -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class TerminateProcessingWorkflowTest { - @Test - void terminateProcessingWithoutReasonTerminatesGracefully() { - DocumentProcessingResult result = runDeclarative(null, null); - - assertGracefulTermination(result, null); - } - - @Test - void terminateProcessingPassesReasonUnchanged() { - DocumentProcessingResult result = runDeclarative(null, "Workflow completed"); - - assertGracefulTermination(result, "Workflow completed"); - } - - @Test - void terminateProcessingEmptyReasonUsesCoreOmissionSemantics() { - DocumentProcessingResult result = runDeclarative(null, ""); - - assertGracefulTermination(result, null); - } - - @Test - void terminateProcessingPreservesWhitespaceReason() { - DocumentProcessingResult result = runDeclarative(null, " "); - - assertGracefulTermination(result, " "); - } - - @Test - void terminateProcessingStopsEveryLaterStepAndPreservesPrecedingEffects() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runSteps(metrics, String.join("\n", - "- name: Before Termination Patch", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: changed-before-stop", - "- name: Before Termination Event", - " type: Coordination/Trigger Event", - " event:", - " type: Coordination/Event", - " kind: before-stop", - terminateStep("stop-now"), - "- name: Later Patch", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: must-not-run", - "- name: Later Event", - " type: Coordination/Trigger Event", - " event:", - " type: Coordination/Event", - " kind: must-not-emit")); - - assertGracefulTermination(result, "stop-now"); - assertEquals("changed-before-stop", result.document().get("/status")); - assertEquals(Arrays.asList("before-stop"), kinds(result, "before-stop", "must-not-emit")); - assertTrue(indexOfKind(result, "before-stop") - < indexOfType(result, RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED)); - assertEquals(3L, metrics.workflowStepsExecuted()); - assertEquals(1L, metrics.declarativeTerminationSteps()); - assertEquals(0L, metrics.successfulComputeTerminationRequests()); - } - - @Test - void terminateProcessingBexShapedReasonFailsTypeResolutionBeforeExecution() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - IllegalArgumentException failure = assertThrows(IllegalArgumentException.class, - () -> runSteps(metrics, String.join("\n", - "- name: Invalid Dynamic Reason", - " type: Coordination/Terminate Processing", - " reason:", - " $document: /status"))); - - assertTrue(failure.getMessage().contains("must not have items or properties")); - assertEquals(0L, metrics.declarativeTerminationSteps()); - assertEquals(0L, metrics.bexCompiledExecutions()); - } - - @Test - void terminateProcessingIsRegisteredInDefaultAndConfiguredBexRunners() { - DocumentProcessingResult defaultRunner = runDeclarativeWithSupport( - ComputeWorkflowTestSupport.create(), "default"); - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult configuredRunner = runDeclarativeWithSupport( - support(metrics), "configured"); - - assertGracefulTermination(defaultRunner, "default"); - assertGracefulTermination(configuredRunner, "configured"); - assertEquals(1L, metrics.declarativeTerminationSteps()); - } - - @Test - void runnerWithoutTerminateExecutorNamesUnsupportedStepPrecisely() { - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - new ArrayList>()); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder().sequentialWorkflowRunner(runner).build()); - - DocumentProcessingResult result = runDeclarativeWithSupport(support, "unsupported"); - - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status()); - assertTrue(result.failureReason().contains( - "Unsupported sequential workflow step: Coordination/Terminate Processing")); - } - - @Test - void terminateProcessingAddsNoBexCompilationOrEvaluation() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - DocumentProcessingResult result = runDeclarative(metrics, "static reason"); - - assertGracefulTermination(result, "static reason"); - assertEquals(0L, metrics.bexCompiledExecutions()); - assertEquals(0L, metrics.bexCompileCacheHits()); - assertEquals(0L, metrics.bexCompileCacheMisses()); - assertEquals(1L, metrics.declarativeTerminationSteps()); - } - - @Test - void terminateProcessingExportsNoStepResult() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - AtomicReference observed = new AtomicReference(); - final TerminateProcessingStepExecutor delegate = new TerminateProcessingStepExecutor(metrics); - WorkflowStepExecutor inspector = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return delegate.supports(step); - } - - @Override - public WorkflowStepResult execute(TerminateProcessing step, StepExecutionContext context) { - WorkflowStepResult result = delegate.execute(step, context); - observed.set(result); - return result; - } - }; - assertTrue(inspector.supports(new TerminateProcessing())); - assertFalse(inspector.supports(new Compute())); - SequentialWorkflowRunner runner = new SequentialWorkflowRunner( - Arrays.>asList(inspector)); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder().sequentialWorkflowRunner(runner).build()); - - DocumentProcessingResult result = runDeclarativeWithSupport(support, "no-result"); - - assertGracefulTermination(result, "no-result"); - assertTrue(observed.get().isTerminal()); - assertFalse(observed.get().hasValue()); - assertEquals(1L, metrics.declarativeTerminationSteps()); - } - - @Test - void computeAndDeclarativeTerminationProduceEquivalentRootEffects() { - DocumentProcessingResult compute = runSteps(null, String.join("\n", - "- name: Before Compute", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: completed", - "- name: Compute Stop", - " type: Coordination/Compute", - " do:", - " - $return:", - " termination:", - " reason: same-reason")); - DocumentProcessingResult declarative = runSteps(null, String.join("\n", - "- name: Before Declarative", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: completed", - terminateStep("same-reason"))); - - assertEquals(ProcessorStatus.SUCCESS, compute.status(), compute.failureReason()); - assertEquals(ProcessorStatus.SUCCESS, declarative.status(), declarative.failureReason()); - assertEquals(compute.document().get("/status"), declarative.document().get("/status")); - assertEquals(terminationValue(compute, "cause"), terminationValue(declarative, "cause")); - assertEquals(terminationValue(compute, "reason"), terminationValue(declarative, "reason")); - assertEquals(lifecycleCauses(compute), lifecycleCauses(declarative)); - } - - @Test - void duplicateTerminationCannotReplaceFirstCoreReason() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = support(metrics); - Node document = support.initialize(support.yaml(String.join("\n", - "name: Duplicate Termination Test", - "contracts:", - CoordinationTestResources.simpleTimelineChannelYaml("ownerChannel", "owner", 2), - " first:", - " type: Coordination/Sequential Workflow", - " channel: ownerChannel", - " steps:", - " - type: Coordination/Terminate Processing", - " reason: first-reason", - " second:", - " type: Coordination/Sequential Workflow", - " channel: ownerChannel", - " steps:", - " - type: Coordination/Terminate Processing", - " reason: second-reason"))).document(); - Node event = TestTimelineProvider.timelineEntry(support.blue, - support.repository, - "owner", - 1, - TestTimelineProvider.chatMessage("stop")); - - DocumentProcessingResult result = support.process(document, event); - - assertGracefulTermination(result, "first-reason"); - assertEquals(1L, metrics.declarativeTerminationSteps()); - } - - private static DocumentProcessingResult runDeclarative(BexProcessingMetrics metrics, String reason) { - return runSteps(metrics, terminateStep(reason)); - } - - private static DocumentProcessingResult runDeclarativeWithSupport(ComputeWorkflowTestSupport support, - String reason) { - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - indent(terminateStep(reason), 6))); - return support.processRun(document); - } - - private static DocumentProcessingResult runSteps(BexProcessingMetrics metrics, String steps) { - ComputeWorkflowTestSupport support = metrics == null - ? ComputeWorkflowTestSupport.create() - : support(metrics); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - indent(steps, 6))); - return support.processRun(document); - } - - private static ComputeWorkflowTestSupport support(BexProcessingMetrics metrics) { - return ComputeWorkflowTestSupport.create(CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - } - - private static String terminateStep(String reason) { - String step = String.join("\n", - "- name: Stop Processing", - " type: Coordination/Terminate Processing"); - if (reason == null) { - return step; - } - return step + "\n reason: '" + reason.replace("'", "''") + "'"; - } - - private static String indent(String value, int spaces) { - char[] indentation = new char[spaces]; - Arrays.fill(indentation, ' '); - String prefix = new String(indentation); - return prefix + value.replace("\n", "\n" + prefix); - } - - private static void assertGracefulTermination(DocumentProcessingResult result, String reason) { - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals("graceful", terminationValue(result, "cause")); - assertEquals(reason, terminationValue(result, "reason")); - } - - private static List kinds(DocumentProcessingResult result, String... selected) { - List allowed = Arrays.asList(selected); - List actual = new ArrayList(); - for (Node event : result.triggeredEvents()) { - Object kind = scalarProperty(event, "kind"); - if (kind instanceof String && allowed.contains(kind)) { - actual.add((String) kind); - } - } - return actual; - } - - private static List lifecycleCauses(DocumentProcessingResult result) { - List causes = new ArrayList(); - for (Node event : result.triggeredEvents()) { - Object cause = scalarProperty(event, "cause"); - if (cause != null) { - causes.add(cause); - } - } - return causes; - } - - private static int indexOfKind(DocumentProcessingResult result, String kind) { - for (int i = 0; i < result.triggeredEvents().size(); i++) { - if (kind.equals(scalarProperty(result.triggeredEvents().get(i), "kind"))) { - return i; - } - } - return -1; - } - - private static int indexOfType(DocumentProcessingResult result, String blueId) { - for (int i = 0; i < result.triggeredEvents().size(); i++) { - Node event = result.triggeredEvents().get(i); - if (event.getType() != null && blueId.equals(event.getType().getBlueId())) { - return i; - } - } - return -1; - } - - private static Object scalarProperty(Node node, String key) { - Node value = node.getProperties() != null ? node.getProperties().get(key) : null; - return value != null ? value.getValue() : null; - } - - private static Node terminationMarker(DocumentProcessingResult result) { - Node contracts = result.document().getContracts(); - return contracts != null && contracts.getProperties() != null - ? contracts.getProperties().get("terminated") - : null; - } - - private static Object terminationValue(DocumentProcessingResult result, String key) { - Node marker = terminationMarker(result); - return marker != null ? scalarProperty(marker, key) : null; - } -} diff --git a/src/test/java/blue/coordination/processor/compute/UpdateDocumentBatchApplyIntegrationTest.java b/src/test/java/blue/coordination/processor/compute/UpdateDocumentBatchApplyIntegrationTest.java deleted file mode 100644 index 8c08d47..0000000 --- a/src/test/java/blue/coordination/processor/compute/UpdateDocumentBatchApplyIntegrationTest.java +++ /dev/null @@ -1,198 +0,0 @@ -package blue.coordination.processor.compute; - -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorStatus; -import java.math.BigInteger; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Scenario: - * BEX-produced changesets flow through the language batch patch API. - * - * Main flow: - * 1. Compute builds patch data, including duplicate paths where order matters. - * 2. Compute applies returned changesets directly through batch apply. - * 3. Additional cases prove later Compute steps see patched state, and - * literal Update Document changesets still use batch apply. - * - * Actors and operations: - * - The owner timeline calls {@code run}. - * - Compute creates changesets and events. - * - Update Document remains supported for literal or separately authored patches. - */ -class UpdateDocumentBatchApplyIntegrationTest { - @Test - void computeChangesetUsesLanguageBatchApplyAndPreservesPatchOrder() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - Node document = support.initialize(support.yaml(support.operationWorkflowDocumentWithStatus("count: 0", - String.join("\n", - " steps:", - " - name: BuildPatch", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val: first", - " - $appendChange:", - " op: replace", - " path: /count", - " val: 1", - " - $appendChange:", - " op: replace", - " path: /status", - " val: second", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true")))).document(); - - DocumentProcessingResult result = support.processRun(document); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertEquals("second", result.document().getAsText("/status")); - assertEquals(BigInteger.ONE, result.document().get("/count")); - assertEquals(3L, metrics.patchesApplied()); - assertEquals(1L, metrics.updateBatchPatchApplications()); - assertEquals(0L, metrics.updateIndividualPatchApplications()); - assertEquals(1L, metrics.directBexChangesetHits()); - assertEquals(3L, metrics.bexPatchNodeMaterializations()); - assertEquals(0L, metrics.bexPatchFrozenDirectConversions(), - "newly computed scalar values still require the single measured BEX boundary conversion"); - } - - @Test - void pureBexComputeEventUsesBatchApply() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: BuildPatch", - " type: Coordination/Compute", - " do:", - " - $appendChange:", - " op: replace", - " path: /status", - " val:", - " $binding:", - " name: event", - " path: /message/request/status", - " - $return:", - " changeset:", - " $changeset: true", - " events:", - " $events: true", - " - name: BuildEvent", - " type: Coordination/Compute", - " do:", - " - $appendEvent:", - " type: Coordination/Event", - " kind: Status Applied", - " status:", - " $document: /status", - " - $return:", - " events:", - " $events: true")); - - DocumentProcessingResult result = support.processRun(document, - new Node().properties("status", new Node().value("active"))); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertEquals("active", result.document().get("/status")); - assertEquals(1, result.triggeredEvents().size()); - assertEquals("Status Applied", result.triggeredEvents().get(0).get("/kind")); - assertEquals("active", result.triggeredEvents().get(0).get("/status")); - assertEquals(1L, metrics.patchesApplied()); - assertEquals(1L, metrics.updateBatchPatchApplications()); - assertEquals(0L, metrics.updateIndividualPatchApplications()); - assertEquals(1L, metrics.directBexChangesetHits()); - assertEquals(1L, metrics.eventsEmitted()); - } - - @Test - void literalUpdateDocumentChangesetsUseBatchApply() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create( - CoordinationProcessorOptions.builder() - .processingMetrics(metrics) - .build()); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: ApplyLiteral", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: literal", - " - name: ApplySecondLiteral", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val: existing")); - long frozenHandedBefore = metric(metrics, "frozenPatchesHandedToLanguage"); - long frozenAcceptedBefore = metric(metrics, "frozenPatchValuesAccepted"); - long mutableFrozenBefore = metric(metrics, "mutablePatchValuesFrozen"); - long frozenMaterializedBefore = metric(metrics, "frozenPatchValuesMaterialized"); - - DocumentProcessingResult result = support.processRun(document, - new Node() - .properties("detail", new Node().value("detail")) - .properties("status", new Node().value("existing"))); - - assertFalse(result.capabilityFailure(), result.failureReason()); - assertEquals("existing", result.document().get("/status")); - assertEquals(2L, metrics.patchesApplied()); - assertEquals(2L, metrics.updateBatchPatchApplications()); - assertEquals(0L, metrics.updateIndividualPatchApplications()); - assertEquals(2L, metrics.updateStaticTemplatesBuilt()); - assertEquals(2L, metrics.updateStaticTemplateHits()); - assertEquals(0L, metrics.updateReflectionFallbacks()); - assertEquals(2L, metric(metrics, "frozenPatchesHandedToLanguage") - frozenHandedBefore); - assertTrue(metric(metrics, "frozenPatchValuesAccepted") - frozenAcceptedBefore >= 2L); - assertEquals(0L, metric(metrics, "mutablePatchValuesFrozen") - mutableFrozenBefore); - assertEquals(0L, metric(metrics, "frozenPatchValuesMaterialized") - frozenMaterializedBefore); - } - - @Test - void updateDocumentRejectsBexOperatorsInStaticChangeset() { - ComputeWorkflowTestSupport support = ComputeWorkflowTestSupport.create(); - Node document = support.initializedOperationWorkflow(String.join("\n", - " steps:", - " - name: ApplyPatch", - " type: Coordination/Update Document", - " changeset:", - " - op: replace", - " path: /status", - " val:", - " $binding:", - " name: event", - " path: /message/request/status")); - - DocumentProcessingResult result = support.processRun(document, - new Node().properties("status", new Node().value("existing"))); - - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason().contains("Update Document changeset must be static")); - } - - private static long metric(BexProcessingMetrics metrics, String name) { - Long value = metrics.languageCounters().get(name); - return value != null ? value.longValue() : 0L; - } -} diff --git a/src/test/java/blue/coordination/processor/workflow/ComputeEffectPlanTest.java b/src/test/java/blue/coordination/processor/workflow/ComputeEffectPlanTest.java index fd9778c..c5872ff 100644 --- a/src/test/java/blue/coordination/processor/workflow/ComputeEffectPlanTest.java +++ b/src/test/java/blue/coordination/processor/workflow/ComputeEffectPlanTest.java @@ -1,15 +1,32 @@ package blue.coordination.processor.workflow; +import blue.bex.BexException; +import blue.bex.gas.BexGasCounter; +import blue.bex.gas.BexGasLedgerCapability; +import blue.bex.gas.BexGasLedger; +import blue.bex.gas.BexGasLimitExceededException; +import blue.bex.gas.BexGasMeter; +import blue.bex.gas.BexGasSchedule; import blue.bex.result.BexChangeset; import blue.bex.result.BexEvents; import blue.bex.result.BexExecutionResult; -import blue.bex.result.BexMetrics; import blue.bex.result.BexPatchEntry; import blue.bex.value.BexValue; import blue.bex.value.BexValues; import blue.coordination.processor.bex.BexProcessingMetrics; +import blue.bex.contracts.ProcessorExecutionContextBexGasLedgerHost; import blue.language.model.Node; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.ExecutionEvidenceUnavailableException; +import blue.language.processor.GasLimitExceededException; +import blue.language.processor.GasMeter; +import blue.language.processor.GasSchedule; +import blue.language.processor.InvalidExecutionEvidenceException; +import blue.language.processor.PortableLimitExceededException; +import blue.language.processor.ProcessorErrorCategory; +import blue.language.processor.ProcessorFailureException; +import blue.language.processor.RuntimeWorkSession; +import blue.language.processor.RuntimeWorkSessionTestSupport; +import blue.language.processor.FrozenJsonPatch; import blue.language.snapshot.FrozenNode; import blue.repo.coordination.TerminateProcessing; @@ -19,6 +36,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; @@ -33,20 +51,25 @@ class ComputeEffectPlanTest { @Test - void planCopiesAndFreezesEventContent() { + void shouldCopyAndFreezeEventContentInEffectPlan() { + // given Node event = new Node().properties("kind", new Node().value("original")); List events = new ArrayList(); events.add(event); + // when ComputeEffectPlan plan = new ComputeEffectPlan( - Collections.emptyList(), events, true, "done", true); + Collections.emptyList(), events, true, + "completed", "done", true); event.getProperties().get("kind").value("mutated"); events.clear(); + // then assertTrue(plan.patches().isEmpty()); assertEquals(1, plan.events().size()); assertEquals("original", plan.events().get(0).toNode().get("/kind")); assertTrue(plan.terminationRequested()); + assertEquals("completed", plan.terminationCause()); assertEquals("done", plan.terminationReason()); assertTrue(plan.changesetHandled()); assertThrows(UnsupportedOperationException.class, @@ -54,89 +77,130 @@ void planCopiesAndFreezesEventContent() { } @Test - void planDefensivelyCopiesAndRetainsImmutableFrozenPatches() { + void shouldDefensivelyCopyPatchListAndRetainImmutableFrozenPatches() { + // given Node value = new Node().properties("status", new Node().value("original")); FrozenNode frozenValue = FrozenNode.fromNode(value); FrozenJsonPatch patch = FrozenJsonPatch.replace("/target", frozenValue); List patches = new ArrayList(); patches.add(patch); + + // when ComputeEffectPlan plan = new ComputeEffectPlan( - patches, Collections.emptyList(), false, null, true); + patches, Collections.emptyList(), false, + null, null, true); value.getProperties().get("status").value("mutated-input"); patches.clear(); List firstRead = plan.patches(); + // then assertEquals(1, plan.patches().size()); assertSame(patch, plan.patches().get(0), "immutable patches should be retained without rematerialization"); - assertSame(frozenValue, plan.patches().get(0).getVal()); + assertSame(frozenValue, plan.patches().get(0).getValue()); assertEquals("original", - plan.patches().get(0).getVal().property("status").getValue()); + plan.patches().get(0).getValue().property("status").getValue()); assertThrows(UnsupportedOperationException.class, firstRead::clear); } @Test - void planPreservesEverySupportedPatchOperationAndRejectsNullPatches() { + void shouldPreserveEverySupportedPatchOperation() { + // given FrozenNode value = FrozenNode.fromNode(new Node().value("value")); List patches = new ArrayList(); patches.add(FrozenJsonPatch.add("/added", value)); patches.add(FrozenJsonPatch.replace("/replaced", value)); patches.add(FrozenJsonPatch.remove("/removed")); + // when ComputeEffectPlan plan = new ComputeEffectPlan( - patches, Collections.emptyList(), false, null, true); + patches, Collections.emptyList(), false, + null, null, true); + // then assertEquals(blue.language.processor.model.JsonPatch.Op.ADD, plan.patches().get(0).getOp()); assertEquals(blue.language.processor.model.JsonPatch.Op.REPLACE, plan.patches().get(1).getOp()); assertEquals(blue.language.processor.model.JsonPatch.Op.REMOVE, plan.patches().get(2).getOp()); + } + + @Test + void shouldRejectNullPatchInEffectPlan() { + // given + List patches = Collections.singletonList(null); + + // when + Runnable construction = () -> new ComputeEffectPlan( + patches, Collections.emptyList(), false, + null, null, false); + + // then assertThrows(IllegalArgumentException.class, - () -> new ComputeEffectPlan(Collections.singletonList(null), - Collections.emptyList(), false, null, false)); + construction::run); } @Test - void planCannotBeBufferedTwice() { + void shouldRejectBufferingSameEffectPlanTwice() { + // given ComputeEffectPlan plan = new ComputeEffectPlan( - Collections.emptyList(), Collections.emptyList(), false, null, false); + Collections.emptyList(), Collections.emptyList(), false, + null, null, false); ComputeResultEmitter emitter = new ComputeResultEmitter(); + // when emitter.buffer(plan, null); - IllegalStateException failure = assertThrows(IllegalStateException.class, () -> emitter.buffer(plan, null)); + + // then assertEquals("Compute effect plan has already been buffered", failure.getMessage()); } @Test - void emitterRejectsMissingExecutionResultOrPlan() { + void shouldRejectMissingComputeExecutionResult() { + // given ComputeResultEmitter emitter = new ComputeResultEmitter(); + // when ComputeResultValidationException missingResult = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(null, null, true)); + + // then + assertEquals("Compute execution result is required", missingResult.getMessage()); + } + + @Test + void shouldRejectMissingEffectPlanDuringBuffering() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + + // when IllegalArgumentException missingPlan = assertThrows( IllegalArgumentException.class, () -> emitter.buffer(null, null)); - assertEquals("Compute execution result is required", missingResult.getMessage()); + // then assertEquals("plan must not be null", missingPlan.getMessage()); } @Test - void emitterRetainsStrictFrozenBexValuesAndMaterializesComputedValuesOnce() { + void shouldRetainFrozenBexValuesAndMaterializeComputedValuesOnce() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeResultEmitter emitter = new ComputeResultEmitter(metrics); FrozenNode retained = FrozenNode.fromNode(new Node() .properties("kind", new Node().value("retained"))); + // when FrozenNode direct = emitter.freezePatchValue(BexValues.frozen(retained)); FrozenNode computed = emitter.freezePatchValue(BexValues.map( Collections.singletonMap("kind", BexValues.scalar("computed")))); + // then assertSame(retained, direct, "strict BEX frozen values must cross the boundary by identity"); assertTrue(computed.isStrictCanonical()); @@ -146,11 +210,38 @@ void emitterRetainsStrictFrozenBexValuesAndMaterializesComputedValuesOnce() { } @Test - void emitterTreatsMissingReturnedValueAsNoActiveEffects() { + void shouldPreserveSemanticContentForAdmittedExactPatchValues() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); + ComputeResultEmitter emitter = new ComputeResultEmitter(metrics); + FrozenNode admittedContent = FrozenNode.fromNode( + new Node().value("admitted")); + BexValue admitted = BexValues.admittedExact( + admittedContent, + admittedContent.blueId(), + BexValues.scalar("admitted")); + + // when + FrozenNode frozenPatchValue = emitter.freezePatchValue(admitted); + + // then + assertTrue(frozenPatchValue.isStrictCanonical()); + assertFalse(frozenPatchValue.isReferenceOnly()); + assertEquals("admitted", frozenPatchValue.getValue()); + assertEquals(admittedContent.blueId(), frozenPatchValue.blueId()); + assertEquals(0L, metrics.bexPatchFrozenDirectConversions()); + assertEquals(1L, metrics.bexPatchNodeMaterializations()); + } + + @Test + void shouldTreatMissingReturnedValueAsNoActiveEffects() { + // given ComputeResultEmitter emitter = new ComputeResultEmitter(); + // when ComputeEffectPlan plan = emitter.plan(executionResult(null), null, true); + // then assertTrue(plan.patches().isEmpty()); assertTrue(plan.events().isEmpty()); assertFalse(plan.terminationRequested()); @@ -158,39 +249,334 @@ void emitterTreatsMissingReturnedValueAsNoActiveEffects() { } @Test - void emitterBoundsUnexpectedConversionDiagnosticsByActiveField() { + void shouldPreserveComputeTerminationCauseAndOptionalReason() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + Map termination = new LinkedHashMap(); + termination.put("cause", BexValues.scalar("completed")); + termination.put("reason", BexValues.scalar("all work applied")); + Map resultValue = new LinkedHashMap(); + resultValue.put("termination", BexValues.map(termination)); + + // when + ComputeEffectPlan plan = emitter.plan( + executionResult(BexValues.map(resultValue)), null, true); + + // then + assertTrue(plan.terminationRequested()); + assertEquals("completed", plan.terminationCause()); + assertEquals("all work applied", plan.terminationReason()); + } + + @Test + void shouldRejectMissingEmptyOrModeStyleComputeTerminationCause() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + Map reasonOnly = new LinkedHashMap(); + reasonOnly.put("reason", BexValues.scalar("legacy")); + Map emptyCause = new LinkedHashMap(); + emptyCause.put("cause", BexValues.scalar("")); + Map unknownField = new LinkedHashMap(); + unknownField.put("cause", BexValues.scalar("completed")); + unknownField.put("mode", BexValues.scalar("legacy-mode")); + + // when + List messages = Arrays.asList( + terminationFailure(emitter, reasonOnly), + terminationFailure(emitter, emptyCause), + terminationFailure(emitter, unknownField)); + + // then + assertEquals(Arrays.asList( + "Compute result termination cause must be non-empty Text", + "Compute result termination cause must be non-empty Text", + "Compute result termination contains unsupported properties"), + messages); + } + + @Test + void shouldBoundUnexpectedChangesetConversionDiagnostic() { + // given ComputeResultEmitter emitter = new ComputeResultEmitter(); String longMessage = repeat('x', 200) + "\nnot-exposed"; Map changesetResult = new LinkedHashMap(); changesetResult.put("changeset", listThrowingOnSize(new IllegalStateException(longMessage))); + // when ComputeResultValidationException changesetFailure = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(executionResult(BexValues.map(changesetResult)), null, false)); + // then assertTrue(changesetFailure.getMessage().startsWith( "Compute result changeset could not be converted: ")); assertFalse(changesetFailure.getMessage().contains("not-exposed")); assertTrue(changesetFailure.getCause() instanceof IllegalStateException); + } + @Test + void shouldReportUnexpectedEventConversionDiagnosticByActiveField() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); Map eventResult = new LinkedHashMap(); eventResult.put("events", listThrowingOnSize(new IllegalStateException("event failure"))); + + // when ComputeResultValidationException eventFailure = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(executionResult(BexValues.map(eventResult)), null, true)); + + // then assertEquals("Compute result events could not be converted: event failure", eventFailure.getMessage()); + } + + @Test + void shouldReportUnexpectedEffectConversionDiagnosticByActiveField() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + // when ComputeResultValidationException effectFailure = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(executionResult(valueThrowingOnGet( new IllegalStateException())), null, true)); + + // then assertEquals("Compute result effects could not be converted: IllegalStateException", effectFailure.getMessage()); } @Test - void emitterReportsEventNodeConversionWithoutBuffering() { + void shouldPreserveInvalidExecutionEvidenceFromNestedResultConversion() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + InvalidExecutionEvidenceException invalidEvidence = + new InvalidExecutionEvidenceException( + "forged Compute output evidence"); + Map resultValue = + new LinkedHashMap(); + resultValue.put( + "changeset", + listThrowingOnSize(invalidEvidence)); + + // when + InvalidExecutionEvidenceException failure = assertThrows( + InvalidExecutionEvidenceException.class, + () -> emitter.plan( + executionResult( + BexValues.map(resultValue)), + null, + false)); + + // then + assertSame(invalidEvidence, failure); + } + + @Test + void shouldPreserveUnavailableEvidenceFromLazyResultConversion() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + ExecutionEvidenceUnavailableException unavailable = + new ExecutionEvidenceUnavailableException( + "exact Compute output evidence is unavailable"); + Map resultValue = + resultWithChangesetThrowing(unavailable); + + // when + ExecutionEvidenceUnavailableException failure = assertThrows( + ExecutionEvidenceUnavailableException.class, + () -> emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + false)); + + // then + assertSame(unavailable, failure); + } + + @Test + void shouldPreservePortableLimitFromLazyResultConversion() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + PortableLimitExceededException portableLimit = + new PortableLimitExceededException( + "maxDirectNodes", + 2L, + 1L); + Map resultValue = + resultWithChangesetThrowing(portableLimit); + + // when + PortableLimitExceededException failure = assertThrows( + PortableLimitExceededException.class, + () -> emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + false)); + + // then + assertSame(portableLimit, failure); + } + + @Test + void shouldLetOuterProcessorFailureWinOverNestedInvalidEvidence() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + InvalidExecutionEvidenceException invalidEvidence = + new InvalidExecutionEvidenceException( + "nested invalid evidence"); + ProcessorFailureException processorFailure = + new ProcessorFailureException( + ProcessorErrorCategory.RuntimeExecutionFailure, + "authoritative processor failure", + invalidEvidence); + Map resultValue = + resultWithChangesetThrowing(processorFailure); + + // when + ProcessorFailureException failure = assertThrows( + ProcessorFailureException.class, + () -> emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + false)); + + // then + assertSame(processorFailure, failure); + } + + @Test + void shouldLookThroughGenericBexWrapperForUnavailableEvidence() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + ExecutionEvidenceUnavailableException unavailable = + new ExecutionEvidenceUnavailableException( + "provider result is not available yet"); + BexException wrapper = + new BexException("BEX value access failed", unavailable); + Map resultValue = + resultWithChangesetThrowing(wrapper); + + // when + ExecutionEvidenceUnavailableException failure = assertThrows( + ExecutionEvidenceUnavailableException.class, + () -> emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + false)); + + // then + assertSame(unavailable, failure); + } + + @Test + void shouldRecoverInvalidExecutionEvidenceWrappedForExecutorHandling() { + // given + InvalidExecutionEvidenceException invalidEvidence = + new InvalidExecutionEvidenceException( + "invalid verified provider result"); + ComputeResultValidationException converted = + new ComputeResultValidationException( + "converted result", + new IllegalStateException( + "writer boundary", + invalidEvidence)); + + // when + RuntimeException recovered = + ComputeStepExecutor.classifiedBoundaryFailure(converted); + + // then + assertSame(invalidEvidence, recovered); + } + + @Test + void shouldPreserveDirectLanguageGasExhaustion() { + // given + Map weights = + Collections.singletonMap("unit", 1L); + GasMeter.ChildGasLedger ledger = + new GasMeter(GasSchedule.contracts10(), 0L) + .childLedger("compute-test", weights); + + // when + GasLimitExceededException exhaustion = assertThrows( + GasLimitExceededException.class, + () -> ledger.charge("unit", 1L)); + RuntimeException classified = + ComputeStepExecutor.classifiedBoundaryFailure(exhaustion); + + // then + assertSame(exhaustion, classified); + } + + @Test + void shouldPreserveHostedBexGasExhaustionAsLanguageBoundary() { + // given + BexGasSchedule schedule = BexGasSchedule.defaults(); + long hostBudget = + schedule.weight(BexGasCounter.EXPRESSION_EVALUATED); + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), hostBudget); + RuntimeWorkSession session = + RuntimeWorkSessionTestSupport.processing(parent); + BexGasLedgerCapability hostLedger = + new ProcessorExecutionContextBexGasLedgerHost( + session, "compute-test") + .open( + BexGasCounter.NAMESPACE, + BexGasMeter.childLedgerWeights( + schedule, + Collections.emptyMap())); + BexGasMeter meter = new BexGasMeter(schedule, hostLedger); + hostLedger.charge( + BexGasCounter.EXPRESSION_EVALUATED.canonicalName(), + 1L); + + // when + BexGasLimitExceededException exhaustion = assertThrows( + BexGasLimitExceededException.class, + () -> meter.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 1L)); + RuntimeException classified = + ComputeStepExecutor.classifiedBoundaryFailure(exhaustion); + + // then + assertSame( + exhaustion.hostGasExhaustion().hostFailure(), + classified); + } + + @Test + void shouldMapLocalBexGasExhaustionToProcessorFailure() { + // given + BexGasMeter meter = + new BexGasMeter(BexGasSchedule.defaults(), 0L); + + // when + BexGasLimitExceededException exhaustion = assertThrows( + BexGasLimitExceededException.class, + () -> meter.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 1L)); + RuntimeException classified = + ComputeStepExecutor.classifiedBoundaryFailure(exhaustion); + + // then + assertTrue(classified instanceof ProcessorFailureException); + ProcessorFailureException processorFailure = + (ProcessorFailureException) classified; + assertEquals( + ProcessorErrorCategory.GasLimitExceeded, + processorFailure.errorCategory()); + assertSame(exhaustion, processorFailure.getCause()); + } + + @Test + void shouldReportEventNodeConversionFailureWithoutBuffering() { + // given ComputeResultEmitter emitter = new ComputeResultEmitter(); Map malformedEvent = new LinkedHashMap(); malformedEvent.put("properties", BexValues.scalar("internal")); @@ -198,16 +584,85 @@ void emitterReportsEventNodeConversionWithoutBuffering() { resultValue.put("events", BexValues.list(Collections.singletonList( BexValues.map(malformedEvent)))); + // when ComputeResultValidationException failure = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(executionResult(BexValues.map(resultValue)), null, true)); + // then assertEquals("Compute result event entry could not be converted", failure.getMessage()); assertTrue(failure.getCause() instanceof RuntimeException); } @Test - void emitterRejectsMalformedAccumulatedPatchesBeforePointerResolution() { + void shouldPreserveScalarAndListEventNodes() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + List events = Arrays.asList( + BexValues.scalar("scalar-event"), + BexValues.list(Arrays.asList( + BexValues.scalar("first"), + BexValues.scalar("second")))); + Map resultValue = + new LinkedHashMap(); + resultValue.put("events", BexValues.list(events)); + + // when + ComputeEffectPlan plan = emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + true); + + // then + assertEquals("scalar-event", plan.events().get(0).getValue()); + assertEquals("first", + plan.events().get(1).getItems().get(0).getValue()); + assertEquals("second", + plan.events().get(1).getItems().get(1).getValue()); + } + + @Test + void shouldRetainLocallyVerifiedExactEventContentForSameInvocationRouting() { + // given + ComputeResultEmitter emitter = + new ComputeResultEmitter(); + FrozenNode exactEvent = + FrozenNode.fromResolvedNode( + new Node().properties( + "kind", + new Node().value( + "nested-compute-event"))); + Map resultValue = + new LinkedHashMap(); + resultValue.put( + "events", + BexValues.list( + Collections.singletonList( + BexValues.frozen( + exactEvent)))); + + // when + ComputeEffectPlan plan = emitter.plan( + executionResult( + BexValues.map( + resultValue)), + null, + true); + + // then + assertFalse( + plan.events().get(0).isReferenceOnly(), + "same-invocation routing needs the locally verified event body"); + assertEquals( + "nested-compute-event", + plan.events().get(0) + .property("kind") + .getValue()); + } + + @Test + void shouldRejectMalformedAccumulatedPatchesBeforePointerResolution() { + // given ComputeResultEmitter emitter = new ComputeResultEmitter(); List malformed = new ArrayList(); malformed.add(null); @@ -217,18 +672,89 @@ void emitterRejectsMalformedAccumulatedPatchesBeforePointerResolution() { "Compute result patch value is required" }; + // when + List messages = new ArrayList(); for (int i = 0; i < malformed.size(); i++) { BexExecutionResult result = executionResult(null, new BexChangeset(Collections.singletonList(malformed.get(i)))); ComputeResultValidationException failure = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(result, null, false)); - assertEquals(expected[i], failure.getMessage()); + messages.add(failure.getMessage()); } + + // then + assertEquals(Arrays.asList(expected), messages); + } + + @Test + void shouldRejectNonTextPatchFieldsAndRemoveValuesBeforeBuffering() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + Map nonTextOp = patchValue( + BexValues.scalar(7), BexValues.scalar("/target"), + BexValues.scalar("value")); + Map nonTextPath = patchValue( + BexValues.scalar("replace"), BexValues.scalar(true), + BexValues.scalar("value")); + Map removeWithValue = patchValue( + BexValues.scalar("remove"), BexValues.scalar("/target"), + BexValues.scalar("forbidden")); + + // when + List messages = Arrays.asList( + changesetFailure(emitter, nonTextOp), + changesetFailure(emitter, nonTextPath), + changesetFailure(emitter, removeWithValue)); + + // then + assertEquals(Arrays.asList( + "Compute result changeset entry 0 field 'op' must be Text", + "Compute result changeset entry 0 field 'path' must be Text", + "Compute result changeset entry 0 val must be absent for remove"), + messages); + } + + @Test + void shouldNotTreatExplicitNullRemoveValueAsAccumulatedChangeset() { + // given + ComputeResultEmitter emitter = new ComputeResultEmitter(); + Map returnedRemove = patchValue( + BexValues.scalar("remove"), + BexValues.scalar("/target"), + BexValues.nullValue()); + Map resultValue = + new LinkedHashMap(); + resultValue.put("changeset", BexValues.list( + Collections.singletonList( + BexValues.map(returnedRemove)))); + BexChangeset accumulated = new BexChangeset( + Collections.singletonList( + new BexPatchEntry( + "remove", + "/target", + "/target", + BexValues.undefined()))); + + // when + ComputeResultValidationException failure = assertThrows( + ComputeResultValidationException.class, + () -> emitter.plan( + executionResult( + BexValues.map(resultValue), + accumulated), + null, + false)); + + // then + assertEquals( + "Compute result changeset entry 0 val must be absent for remove", + failure.getMessage()); } @Test - void emitterWrapsPatchPointerResolutionFailures() { + void shouldWrapPatchPointerResolutionFailure() { + // given ComputeResultEmitter emitter = new ComputeResultEmitter(); Map patch = new LinkedHashMap(); patch.put("op", BexValues.scalar("replace")); @@ -238,56 +764,96 @@ void emitterWrapsPatchPointerResolutionFailures() { resultValue.put("changeset", BexValues.list(Collections.singletonList( BexValues.map(patch)))); + // when ComputeResultValidationException failure = assertThrows( ComputeResultValidationException.class, () -> emitter.plan(executionResult(BexValues.map(resultValue)), null, false)); + // then assertEquals("Compute result patch path is invalid", failure.getMessage()); assertTrue(failure.getCause() instanceof NullPointerException); } @Test - void workflowStepResultFactoriesPreserveValueMetadataAndTerminalControl() { + void shouldCreateEmptyNonTerminalWorkflowStepResult() { + // given WorkflowStepResult none = WorkflowStepResult.none(); - WorkflowStepResult value = WorkflowStepResult.value(null, true); - WorkflowStepResult terminal = WorkflowStepResult.terminal(); - WorkflowStepResult terminalValueWithoutChangeset = WorkflowStepResult.terminalValue("plain"); - WorkflowStepResult terminalValue = WorkflowStepResult.terminalValue("result", true); + // when + Object value = none.value(); + + // then assertFalse(none.hasValue()); assertFalse(none.changesetHandled()); assertFalse(none.isTerminal()); - assertNull(none.value()); + assertNull(value); + } + + @Test + void shouldPreserveValueMetadataInWorkflowStepResult() { + // given + WorkflowStepResult result = WorkflowStepResult.value(null, true); + + // when + Object value = result.value(); + + // then + assertTrue(result.hasValue()); + assertNull(value); + assertTrue(result.changesetHandled()); + assertFalse(result.isTerminal()); + } + + @Test + void shouldCreateTerminalWorkflowStepResultsWithOptionalValues() { + // given + WorkflowStepResult terminal = WorkflowStepResult.terminal(); + WorkflowStepResult terminalValueWithoutChangeset = WorkflowStepResult.terminalValue("plain"); + WorkflowStepResult terminalValue = WorkflowStepResult.terminalValue("result", true); - assertTrue(value.hasValue()); - assertNull(value.value()); - assertTrue(value.changesetHandled()); - assertFalse(value.isTerminal()); + // when + List terminalFlags = Arrays.asList( + terminal.isTerminal(), + terminalValueWithoutChangeset.isTerminal(), + terminalValue.isTerminal()); + // then + assertEquals(Arrays.asList(true, true, true), terminalFlags); assertFalse(terminal.hasValue()); assertFalse(terminal.changesetHandled()); - assertTrue(terminal.isTerminal()); assertEquals("plain", terminalValueWithoutChangeset.value()); assertFalse(terminalValueWithoutChangeset.changesetHandled()); - assertTrue(terminalValueWithoutChangeset.isTerminal()); assertTrue(terminalValue.hasValue()); assertEquals("result", terminalValue.value()); assertTrue(terminalValue.changesetHandled()); - assertTrue(terminalValue.isTerminal()); } @Test - void validationExceptionAndDefaultTerminateExecutorRetainSimpleContracts() { + void shouldPreserveValidationExceptionMessageAndCause() { + // given IllegalStateException cause = new IllegalStateException("cause"); + + // when ComputeResultValidationException failure = new ComputeResultValidationException("invalid", cause); - TerminateProcessingStepExecutor executor = new TerminateProcessingStepExecutor(); + // then assertEquals("invalid", failure.getMessage()); assertEquals(cause, failure.getCause()); - assertTrue(executor.supports(new TerminateProcessing())); + } + + @Test + void shouldSupportTerminateProcessingWithDefaultExecutor() { + // given + TerminateProcessingStepExecutor executor = new TerminateProcessingStepExecutor(); + + // when + boolean supported = executor.supports(new TerminateProcessing()); + + // then + assertTrue(supported); } private static BexExecutionResult executionResult(BexValue value) { @@ -298,8 +864,62 @@ private static BexExecutionResult executionResult(BexValue value, BexChangeset c return new BexExecutionResult(value, changeset, new BexEvents(Collections.emptyList()), - 0L, - new BexMetrics()); + BexGasLedger.empty(), + null); + } + + private static String terminationFailure( + ComputeResultEmitter emitter, + Map termination) { + Map resultValue = + new LinkedHashMap(); + resultValue.put("termination", BexValues.map(termination)); + ComputeResultValidationException failure = assertThrows( + ComputeResultValidationException.class, + () -> emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + true)); + return failure.getMessage(); + } + + private static Map patchValue( + BexValue op, + BexValue path, + BexValue val) { + Map patch = new LinkedHashMap(); + patch.put("op", op); + patch.put("path", path); + if (val != null) { + patch.put("val", val); + } + return patch; + } + + private static Map resultWithChangesetThrowing( + RuntimeException failure) { + Map resultValue = + new LinkedHashMap(); + resultValue.put( + "changeset", + listThrowingOnSize(failure)); + return resultValue; + } + + private static String changesetFailure( + ComputeResultEmitter emitter, + Map patch) { + Map resultValue = + new LinkedHashMap(); + resultValue.put("changeset", BexValues.list( + Collections.singletonList(BexValues.map(patch)))); + ComputeResultValidationException failure = assertThrows( + ComputeResultValidationException.class, + () -> emitter.plan( + executionResult(BexValues.map(resultValue)), + null, + false)); + return failure.getMessage(); } private static BexValue listThrowingOnSize(final RuntimeException failure) { diff --git a/src/test/java/blue/coordination/processor/workflow/ComputeProgramPlanCacheTest.java b/src/test/java/blue/coordination/processor/workflow/ComputeProgramPlanCacheTest.java index 38aa40b..7dcdb4f 100644 --- a/src/test/java/blue/coordination/processor/workflow/ComputeProgramPlanCacheTest.java +++ b/src/test/java/blue/coordination/processor/workflow/ComputeProgramPlanCacheTest.java @@ -17,6 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -25,7 +26,8 @@ class ComputeProgramPlanCacheTest { private static final String VERSION = "test-normalization-v1"; @Test - void firstLookupMissesAndPublishedPlanIsReusedByExactFrozenIdentity() { + void shouldReusePublishedPlanForEquivalentFrozenIdentityAfterInitialMiss() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeProgramPlanCache cache = new ComputeProgramPlanCache(8, 1_000_000L, metrics); FrozenNode rawStep = step("same"); @@ -33,6 +35,7 @@ void firstLookupMissesAndPublishedPlanIsReusedByExactFrozenIdentity() { AtomicInteger builds = new AtomicInteger(); ComputeProgramPlanCache.Key firstKey = key(rawStep, null, null); + // when ComputeProgramPlanCache.Lookup first = cache.lookup(firstKey, () -> { builds.incrementAndGet(); return expected; @@ -47,6 +50,7 @@ void firstLookupMissesAndPublishedPlanIsReusedByExactFrozenIdentity() { throw new AssertionError("warm lookup rebuilt the plan"); }); + // then assertFalse(first.cacheHit()); assertTrue(second.cacheHit()); assertSame(expected, second.plan()); @@ -57,12 +61,13 @@ void firstLookupMissesAndPublishedPlanIsReusedByExactFrozenIdentity() { assertEquals(1, cache.size()); assertTrue(cache.weightBytes() > 0L); assertEquals(cache.weightBytes(), metrics.computePlanWeightBytes()); - assertEquals(expected.sourceIdentity(), - blue.bex.compile.BexCompiledProgramKey.from(expected.source())); + assertEquals(BexProgramSource.Kind.FULL_PROGRAM, + expected.source().kind()); } @Test - void changedStepDefinitionEntryOrNormalizationVersionCannotCollide() { + void shouldKeepChangedStepDefinitionEntryAndNormalizationKeysDistinct() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeProgramPlanCache cache = new ComputeProgramPlanCache(8, 1_000_000L, metrics); FrozenNode baseStep = step("base"); @@ -71,23 +76,33 @@ void changedStepDefinitionEntryOrNormalizationVersionCannotCollide() { publish(cache, key(baseStep, definitionA, "run"), plan(baseStep, definitionA)); - assertFalse(cache.lookup(key(step("changed"), definitionA, "run"), - () -> plan(step("changed"), definitionA)).cacheHit()); - assertFalse(cache.lookup(key(baseStep, definitionB, "run"), - () -> plan(baseStep, definitionB)).cacheHit()); - assertFalse(cache.lookup(key(baseStep, definitionA, "other"), - () -> plan(baseStep, definitionA)).cacheHit()); + // when + ComputeProgramPlanCache.Lookup changedStep = + cache.lookup(key(step("changed"), definitionA, "run"), + () -> plan(step("changed"), definitionA)); + ComputeProgramPlanCache.Lookup changedDefinition = + cache.lookup(key(baseStep, definitionB, "run"), + () -> plan(baseStep, definitionB)); + ComputeProgramPlanCache.Lookup changedEntry = + cache.lookup(key(baseStep, definitionA, "other"), + () -> plan(baseStep, definitionA)); ComputeProgramPlanCache.Key otherVersion = ComputeProgramPlanCache.Key.from( baseStep, definitionA, "run", VERSION + "-changed"); - assertFalse(cache.lookup(otherVersion, - () -> plan(baseStep, definitionA)).cacheHit()); - + ComputeProgramPlanCache.Lookup changedVersion = + cache.lookup(otherVersion, () -> plan(baseStep, definitionA)); + + // then + assertFalse(changedStep.cacheHit()); + assertFalse(changedDefinition.cacheHit()); + assertFalse(changedEntry.cacheHit()); + assertFalse(changedVersion.cacheHit()); assertEquals(5L, metrics.computePlanCacheMisses()); assertEquals(0L, metrics.computePlanCacheHits()); } @Test - void leastRecentlyUsedPlansAreEvictedAndWeightGaugeTracksLiveEntries() { + void shouldEvictLeastRecentlyUsedPlansAndTrackLiveWeight() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeProgramPlanCache cache = new ComputeProgramPlanCache(2, Long.MAX_VALUE, metrics); FrozenNode rawA = step("A"); @@ -96,14 +111,17 @@ void leastRecentlyUsedPlansAreEvictedAndWeightGaugeTracksLiveEntries() { ComputeProgramPlanCache.Key keyA = key(rawA, null, null); ComputeProgramPlanCache.Key keyB = key(rawB, null, null); + // when publish(cache, keyA, plan(rawA, null)); publish(cache, keyB, plan(rawB, null)); - assertTrue(cache.lookup(keyA, + boolean retainedA = cache.lookup(keyA, () -> { throw new AssertionError("A should be cached"); - }).cacheHit()); + }).cacheHit(); publish(cache, key(rawC, null, null), plan(rawC, null)); + // then + assertTrue(retainedA); assertEquals(2, cache.size()); assertEquals(1L, metrics.computePlanCacheEvictions()); assertFalse(cache.lookup(keyB, () -> plan(rawB, null)).cacheHit()); @@ -112,7 +130,8 @@ void leastRecentlyUsedPlansAreEvictedAndWeightGaugeTracksLiveEntries() { } @Test - void clearAndCloseReleaseAllWeightAndClosePreventsRepublishing() { + void shouldClearAllWeightAndRejectCandidatesCreatedBeforeClear() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeProgramPlanCache cache = new ComputeProgramPlanCache(4, 1_000_000L, metrics); FrozenNode raw = step("clear"); @@ -124,28 +143,45 @@ void clearAndCloseReleaseAllWeightAndClosePreventsRepublishing() { ComputeProgramPlanCache.Lookup staleCandidate = cache.lookup( key(staleRaw, null, null), () -> plan(staleRaw, null)); + + // when cache.clear(); cache.publish(staleCandidate); + // then assertEquals(0, cache.size()); assertEquals(0L, cache.weightBytes()); assertEquals(0L, metrics.computePlanWeightBytes()); + } + + @Test + void shouldCloseCacheReleaseWeightAndPreventRepopulation() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); + ComputeProgramPlanCache cache = new ComputeProgramPlanCache(4, 1_000_000L, metrics); + FrozenNode raw = step("close"); + ComputeProgramPlan plan = plan(raw, null); + ComputeProgramPlanCache.Key key = key(raw, null, null); ComputeProgramPlanCache.Lookup afterClear = cache.lookup(key, () -> plan); cache.publish(afterClear); - assertEquals(1, cache.size()); + int sizeBeforeClose = cache.size(); + // when cache.close(); - assertTrue(cache.isClosed()); - assertEquals(0, cache.size()); - assertEquals(0L, metrics.computePlanWeightBytes()); ComputeProgramPlanCache.Lookup afterClose = cache.lookup(key, () -> plan); cache.publish(afterClose); + + // then + assertEquals(1, sizeBeforeClose); + assertTrue(cache.isClosed()); assertEquals(0, cache.size()); + assertEquals(0L, metrics.computePlanWeightBytes()); assertEquals(0L, cache.weightBytes()); } @Test - void retainedWeightEstimatorDeduplicatesSharedFrozenSubgraphs() { + void shouldDeduplicateSharedFrozenSubgraphsWhenEstimatingRetainedWeight() { + // given FrozenNode sharedChild = FrozenNode.fromResolvedNode(new Node().value("shared")); FrozenNode shared = FrozenNode.empty() .withProperty("left", sharedChild) @@ -154,36 +190,171 @@ void retainedWeightEstimatorDeduplicatesSharedFrozenSubgraphs() { .withProperty("left", FrozenNode.fromResolvedNode(new Node().value("shared"))) .withProperty("right", FrozenNode.fromResolvedNode(new Node().value("shared"))); + // when + long sharedWeight = plan(shared, null).approximateWeightBytes(); + long duplicateWeight = plan(duplicate, null).approximateWeightBytes(); + + // then assertSame(shared.getProperties().get("left"), shared.getProperties().get("right")); - assertTrue(plan(shared, null).approximateWeightBytes() - < plan(duplicate, null).approximateWeightBytes()); + assertTrue(sharedWeight < duplicateWeight); + } + + @Test + void shouldPreserveExactDefinitionIdentityAndMetadataDuringNormalization() { + // given + FrozenNode exactDefinition = + FrozenNode.fromNode( + new Node() + .name("Exact hosted definition") + .description( + "Provider-authored metadata") + .properties( + "constants", + new Node().properties( + "kind", + new Node().value( + "exact"))) + .properties( + "extension", + new Node().value( + "retained"))); + ComputeProgramNormalizer normalizer = + new ComputeProgramNormalizer(); + String exactBlueId = exactDefinition.blueId(); + + // when + FrozenNode normalized = + normalizer.definition(exactDefinition); + + // then + assertSame(exactDefinition, normalized); + assertEquals(exactBlueId, normalized.blueId()); + assertEquals( + "Exact hosted definition", + normalized.getName()); + assertEquals( + "Provider-authored metadata", + normalized.getDescription()); + assertEquals( + "retained", + normalized.property("extension").getValue()); + } + + @Test + void shouldProjectOnlyExecutableDefinitionFieldsForBex() { + // given + Node containerType = + new Node().name( + "resolved container type"); + Node expandedTextType = + new Node() + .blueId( + "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC") + .description( + "resolved provider metadata"); + FrozenNode exactDefinition = + FrozenNode.fromResolvedNode( + new Node() + .name("Resolved definition") + .properties( + "constants", + new Node() + .type(containerType) + .properties( + "kind", + new Node() + .type( + expandedTextType) + .value( + "projected"))) + .properties( + "functions", + new Node() + .type(containerType) + .properties( + "build", + new Node() + .properties( + "do", + new Node() + .items( + new Node()))))); + ComputeProgramNormalizer normalizer = + new ComputeProgramNormalizer(); + + // when + FrozenNode source = + normalizer.definitionSource( + exactDefinition); + + // then + assertSame( + exactDefinition, + normalizer.definition( + exactDefinition)); + assertEquals( + "Resolved definition", + source.getName()); + assertEquals( + "projected", + source.property("constants") + .property("kind") + .getValue()); + assertTrue( + source.property("constants") + .property("kind") + .getType() + .isReferenceOnly()); + assertNull( + source.property("constants") + .property("kind") + .getType() + .getDescription()); + assertNull( + source.property("constants") + .getType()); + assertTrue( + source.property("functions") + .property("build") + .property("do") + .getItems() + .get(0) + .getProperties() + .containsKey("$return")); } @Test - void failedPlanBuildIsNeverPublishedOrReturnedAsAHit() { + void shouldNeverPublishFailedBuildOrReturnRetryAsHit() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeProgramPlanCache cache = new ComputeProgramPlanCache(4, 1_000_000L, metrics); FrozenNode raw = step("malformed"); ComputeProgramPlanCache.Key key = key(raw, null, null); - assertThrows(IllegalStateException.class, + // when + IllegalStateException failure = assertThrows(IllegalStateException.class, () -> cache.lookup(key, () -> { throw new IllegalStateException("malformed"); })); - assertEquals(0, cache.size()); + int sizeAfterFailure = cache.size(); ComputeProgramPlan valid = plan(raw, null); ComputeProgramPlanCache.Lookup retry = cache.lookup(key, () -> valid); - assertFalse(retry.cacheHit()); + boolean retryHit = retry.cacheHit(); cache.publish(retry); + // then + assertEquals("malformed", failure.getMessage()); + assertEquals(0, sizeAfterFailure); + assertFalse(retryHit); assertEquals(2L, metrics.computePlanCacheMisses()); assertEquals(1L, metrics.computePlansBuilt()); assertEquals(1, cache.size()); } @Test - void concurrentWarmLookupsAreSafeAndNeverRebuild() throws Exception { + void shouldServeConcurrentWarmLookupsWithoutRebuilding() throws Exception { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); ComputeProgramPlanCache cache = new ComputeProgramPlanCache(4, 1_000_000L, metrics); FrozenNode raw = step("concurrent"); @@ -194,6 +365,8 @@ void concurrentWarmLookupsAreSafeAndNeverRebuild() throws Exception { int lookupsPerThread = 100; ExecutorService executor = Executors.newFixedThreadPool(threads); List> futures = new ArrayList>(); + + // when try { for (int i = 0; i < threads; i++) { futures.add(executor.submit(new Callable() { @@ -217,6 +390,7 @@ public Void call() { executor.shutdownNow(); } + // then assertEquals((long) threads * lookupsPerThread, metrics.computePlanCacheHits()); assertEquals(1L, metrics.computePlanCacheMisses()); assertEquals(1L, metrics.computePlansBuilt()); diff --git a/src/test/java/blue/coordination/processor/workflow/FrozenComputeDifferentialTest.java b/src/test/java/blue/coordination/processor/workflow/FrozenComputeDifferentialTest.java deleted file mode 100644 index 5d48f39..0000000 --- a/src/test/java/blue/coordination/processor/workflow/FrozenComputeDifferentialTest.java +++ /dev/null @@ -1,565 +0,0 @@ -package blue.coordination.processor.workflow; - -import blue.bex.BexException; -import blue.bex.api.BexEngine; -import blue.bex.api.BexExecutionContext; -import blue.bex.api.BexProgramSource; -import blue.bex.result.BexExecutionResult; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.RepositoryTypeAliasPreprocessor; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.coordination.processor.bex.BexWorkflowContextFactory; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorErrorCategory; -import blue.language.processor.ProcessorFatalException; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.WorkingDocument; -import blue.language.processor.model.FrozenJsonPatch; -import blue.language.processor.model.JsonPatch; -import blue.language.processor.registry.RuntimeBlueIds; -import blue.language.snapshot.FrozenNode; -import blue.repo.BlueRepository; -import blue.repo.coordination.Compute; -import blue.repo.coordination.SequentialWorkflowStep; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** End-to-end differential for the frozen Compute patch handoff. */ -class FrozenComputeDifferentialTest { - - @Test - void computeChangesetEventsAndTerminationMatchTheLegacyMutableHandoff() { - Outcome frozen = run(false); - Outcome legacy = run(true); - - assertEquals(legacy.canonicalKey, frozen.canonicalKey, "final canonical document"); - assertEquals(legacy.resolvedKey, frozen.resolvedKey, "final resolved document"); - assertEquals(legacy.blueId, frozen.blueId, "final BlueId"); - assertEquals(legacy.documentUpdateEvents, frozen.documentUpdateEvents, - "all Document Update events and order"); - assertEquals(legacy.triggeredEvents, frozen.triggeredEvents, - "all triggered events and order"); - assertEquals(legacy.totalGas, frozen.totalGas, "gas"); - assertEquals(legacy.status, frozen.status, "status"); - assertEquals(legacy.errorCategory, frozen.errorCategory, "failure category"); - assertEquals(legacy.failureReason, frozen.failureReason, "failure reason"); - assertEquals(legacy.terminationMarker, frozen.terminationMarker, - "termination marker"); - assertEquals(legacy.channelCheckpoint, frozen.channelCheckpoint, - "channel checkpoint"); - - assertEquals(ProcessorStatus.SUCCESS, frozen.status, frozen.failureReason); - assertNull(frozen.failureReason); - assertEquals("value", frozen.document.get("/added/nested")); - assertEquals("final", frozen.document.get("/status")); - assertFalse(hasPath(frozen.document, "/removeMe")); - assertFalse(hasPath(frozen.document, "/mustNotRun")); - assertEquals("graceful", frozen.document.get("/contracts/terminated/cause")); - assertEquals("compute complete", frozen.document.get("/contracts/terminated/reason")); - assertNull(frozen.channelCheckpoint, - "graceful termination must not persist the source-channel checkpoint"); - assertEquals(Arrays.asList("first", "second"), selectedKinds(frozen.documentEvents)); - assertTrue(indexOfKind(frozen.documentEvents, "second") - < indexOfType(frozen.documentEvents, - RuntimeBlueIds.DOCUMENT_PROCESSING_TERMINATED), - "Compute events must remain ahead of the termination event"); - assertEquals(Arrays.asList( - "add:/added", - "replace:/status", - "replace:/status", - "remove:/removeMe"), - primaryUpdateOrder(frozen.documentEvents)); - - assertTrue(metricDelta(frozen, "frozenPatchesHandedToLanguage") > 0L); - assertEquals(0L, metricDelta(frozen, "mutablePatchesHandedToLanguage")); - assertTrue(metricDelta(frozen, "frozenPatchValuesAccepted") > 0L); - assertEquals(0L, metricDelta(frozen, "mutablePatchValuesFrozen"), - "initialization metrics must not be attributed to the Compute handoff"); - assertTrue(metricDelta(legacy, "mutablePatchesHandedToLanguage") > 0L); - assertTrue(metricDelta(legacy, "mutablePatchValuesFrozen") > 0L); - } - - private static Outcome run(boolean legacyMutableHandoff) { - BlueRepository repository = BlueRepository.latest(); - BexProcessingMetrics metrics = new BexProcessingMetrics(); - BexEngine engine = BexEngine.builder().build(); - SequentialWorkflowRunner runner = legacyMutableHandoff - ? legacyRunner(engine, metrics) - : SequentialWorkflowRunner.withBexEngine(engine, 100_000L, metrics); - Blue blue = CoordinationTestResources.configuredBlue(repository); - try { - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .bexEngine(engine) - .sequentialWorkflowRunner(runner) - .defaultComputeGasLimit(100_000L) - .processingMetrics(metrics) - .build()); - Node authored = blue.parseSourceYaml(documentYaml()); - authored.blue(repository.typeAliasBlue()); - Node aliasesResolved = new RepositoryTypeAliasPreprocessor( - CoordinationTestResources.testTypeAliases(repository)).preprocess(authored); - Node initialized = blue.initializeDocument(blue.preprocess(aliasesResolved)).document(); - Map languageCountersBeforeRun = metrics.languageCounters(); - Node event = TestTimelineProvider.timelineEntry(blue, - repository, - "owner", - 1, - TestTimelineProvider.chatMessage("run")); - - DocumentProcessingResult result = blue.processDocument(initialized, event); - List documentEvents = immutableClones(result.triggeredEvents()); - return new Outcome(result.document().clone(), - result.snapshot() != null - ? result.snapshot().frozenCanonicalRoot().resolvedStructuralKey() - : null, - result.snapshot() != null - ? result.snapshot().frozenResolvedRoot().resolvedStructuralKey() - : null, - result.blueId(), - jsonEvents(blue, documentEvents, false), - jsonEvents(blue, documentEvents, true), - result.totalGas(), - result.status(), - result.errorCategory(), - result.failureReason(), - jsonAt(blue, result.document(), "/contracts/terminated"), - jsonAt(blue, - result.document(), - "/contracts/checkpoint/lastEvents/ownerChannel"), - documentEvents, - metrics, - languageCountersBeforeRun); - } finally { - try { - blue.close(); - } finally { - runner.close(); - } - } - } - - private static SequentialWorkflowRunner legacyRunner(BexEngine engine, - BexProcessingMetrics metrics) { - return new SequentialWorkflowRunner(Arrays - .>asList( - new TriggerEventStepExecutor(metrics), - new LegacyMutableComputeExecutor(engine, 100_000L, metrics), - new TerminateProcessingStepExecutor(metrics), - new UpdateDocumentStepExecutor(metrics))); - } - - private static String documentYaml() { - return String.join("\n", - "name: Frozen Compute Differential", - "status: idle", - "removeMe: old", - "contracts:", - CoordinationTestResources.simpleTimelineChannelYaml("ownerChannel", "owner", 2), - " addedUpdates:", - " type: Document Update Channel", - " path: /added", - " statusUpdates:", - " type: Document Update Channel", - " path: /status", - " removedUpdates:", - " type: Document Update Channel", - " path: /removeMe", - documentUpdateObserver("observeAdded", "addedUpdates", "add", "/added"), - documentUpdateObserver("observeStatus", "statusUpdates", "replace", "/status"), - documentUpdateObserver("observeRemoved", "removedUpdates", "remove", "/removeMe"), - " run:", - " type: Coordination/Sequential Workflow", - " channel: ownerChannel", - " steps:", - " - name: Return ordered effects", - " type: Coordination/Compute", - " do:", - " - $return:", - " changeset:", - " - op: add", - " path: /added", - " val:", - " nested: value", - " - op: replace", - " path: /status", - " val: intermediate", - " - op: replace", - " path: /status", - " val: final", - " - op: remove", - " path: /removeMe", - " events:", - " - type: Coordination/Event", - " kind: first", - " - type: Coordination/Event", - " kind: second", - " termination:", - " reason: compute complete", - " - name: Must not run after termination", - " type: Coordination/Update Document", - " changeset:", - " - op: add", - " path: /mustNotRun", - " val: true"); - } - - /** - * Re-emits a stable trace from each exact-path Document Update channel. This - * makes every internally delivered update and its order observable through - * DocumentProcessingResult without depending on Language implementation - * internals. - */ - private static String documentUpdateObserver(String key, - String channel, - String op, - String path) { - return String.join("\n", - " " + key + ":", - " type: Coordination/Sequential Workflow", - " channel: " + channel, - " event:", - " type: Document Update", - " steps:", - " - type: Coordination/Trigger Event", - " event:", - " type: Coordination/Event", - " kind: document-update", - " op: " + op, - " path: " + path); - } - - private static List immutableClones(List events) { - List clones = new ArrayList(events.size()); - for (Node event : events) { - clones.add(event.clone()); - } - return Collections.unmodifiableList(clones); - } - - private static List jsonEvents(Blue blue, - List events, - boolean documentUpdatesOnly) { - List json = new ArrayList(); - for (Node event : events) { - if (!documentUpdatesOnly || isDocumentUpdateTrace(event)) { - json.add(blue.nodeToJson(event)); - } - } - return Collections.unmodifiableList(json); - } - - private static String jsonAt(Blue blue, Node document, String pointer) { - Node node = nodeAt(document, pointer); - return node != null ? blue.nodeToJson(node) : null; - } - - private static List selectedKinds(List events) { - List kinds = new ArrayList(); - for (Node event : events) { - Object kind = valueAt(event, "/kind"); - if ("first".equals(kind) || "second".equals(kind)) { - kinds.add((String) kind); - } - } - return kinds; - } - - private static List primaryUpdateOrder(List events) { - List updates = new ArrayList(); - for (Node event : events) { - if (!isDocumentUpdateTrace(event)) { - continue; - } - Object path = valueAt(event, "/path"); - if ("/added".equals(path) - || "/status".equals(path) - || "/removeMe".equals(path)) { - updates.add(String.valueOf(valueAt(event, "/op")) + ":" + path); - } - } - return updates; - } - - private static boolean isDocumentUpdateTrace(Node event) { - return "document-update".equals(valueAt(event, "/kind")); - } - - private static int indexOfKind(List events, String kind) { - for (int index = 0; index < events.size(); index++) { - if (kind.equals(valueAt(events.get(index), "/kind"))) { - return index; - } - } - return -1; - } - - private static int indexOfType(List events, String blueId) { - for (int index = 0; index < events.size(); index++) { - if (isType(events.get(index), blueId)) { - return index; - } - } - return -1; - } - - private static boolean isType(Node node, String blueId) { - return node != null - && node.getType() != null - && blueId.equals(node.getType().getBlueId()); - } - - private static Object valueAt(Node node, String pointer) { - try { - return node.get(pointer); - } catch (RuntimeException ex) { - return null; - } - } - - private static boolean hasPath(Node node, String pointer) { - return nodeAt(node, pointer) != null; - } - - private static Node nodeAt(Node node, String pointer) { - try { - return node != null ? node.getAsNode(pointer) : null; - } catch (RuntimeException ex) { - return null; - } - } - - private static long metricDelta(Outcome outcome, String name) { - return metric(outcome.metrics.languageCounters(), name) - - metric(outcome.languageCountersBeforeRun, name); - } - - private static long metric(Map counters, String name) { - Long value = counters.get(name); - return value != null ? value.longValue() : 0L; - } - - private static final class Outcome { - private final Node document; - private final Object canonicalKey; - private final Object resolvedKey; - private final String blueId; - private final List triggeredEvents; - private final List documentUpdateEvents; - private final long totalGas; - private final ProcessorStatus status; - private final ProcessorErrorCategory errorCategory; - private final String failureReason; - private final String terminationMarker; - private final String channelCheckpoint; - private final List documentEvents; - private final BexProcessingMetrics metrics; - private final Map languageCountersBeforeRun; - - private Outcome(Node document, - Object canonicalKey, - Object resolvedKey, - String blueId, - List triggeredEvents, - List documentUpdateEvents, - long totalGas, - ProcessorStatus status, - ProcessorErrorCategory errorCategory, - String failureReason, - String terminationMarker, - String channelCheckpoint, - List documentEvents, - BexProcessingMetrics metrics, - Map languageCountersBeforeRun) { - this.document = document; - this.canonicalKey = canonicalKey; - this.resolvedKey = resolvedKey; - this.blueId = blueId; - this.triggeredEvents = triggeredEvents; - this.documentUpdateEvents = documentUpdateEvents; - this.totalGas = totalGas; - this.status = status; - this.errorCategory = errorCategory; - this.failureReason = failureReason; - this.terminationMarker = terminationMarker; - this.channelCheckpoint = channelCheckpoint; - this.documentEvents = documentEvents; - this.metrics = metrics; - this.languageCountersBeforeRun = languageCountersBeforeRun; - } - } - - /** - * Test-only reproduction of the legacy mutable Language patch handoff. - * Planning and BEX execution stay shared so the differential isolates the - * mutable-versus-frozen boundary under test. - */ - private static final class LegacyMutableComputeExecutor - implements WorkflowStepExecutor { - private final BexEngine bexEngine; - private final long defaultGasLimit; - private final ComputeDefinitionResolver definitionResolver; - private final BexWorkflowContextFactory contextFactory; - private final ComputeResultEmitter resultPlanner; - private final ComputeProgramNormalizer normalizer; - private final BexProcessingMetrics metrics; - - private LegacyMutableComputeExecutor(BexEngine bexEngine, - long defaultGasLimit, - BexProcessingMetrics metrics) { - this.bexEngine = bexEngine; - this.defaultGasLimit = defaultGasLimit; - this.definitionResolver = new ComputeDefinitionResolver(metrics); - this.contextFactory = new BexWorkflowContextFactory(metrics); - this.resultPlanner = new ComputeResultEmitter(metrics); - this.normalizer = new ComputeProgramNormalizer(metrics); - this.metrics = metrics; - } - - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof Compute; - } - - @Override - public WorkflowStepResult execute(Compute step, StepExecutionContext context) { - long stepStart = System.nanoTime(); - try { - metrics.incrementComputeStepsExecuted(); - FrozenNode rawStep = context.stepFrozenNode(); - if (rawStep == null) { - Node mutableStep = context.stepNodeRef(); - if (mutableStep == null) { - context.processorContext().throwFatal( - "Compute step must have a raw step node"); - return WorkflowStepResult.none(); - } - rawStep = FrozenNode.fromResolvedNode(mutableStep); - } - FrozenNode resolvedDefinition = definitionResolver.resolve(rawStep, - context, - metrics); - FrozenNode program = normalizer.program(rawStep); - FrozenNode definition = resolvedDefinition != null - ? normalizer.definition(resolvedDefinition) - : null; - String authoredEntry = FrozenNodeUtil.textProperty(rawStep, "entry"); - String normalizedEntry = FrozenNodeUtil.textProperty(program, "entry"); - if (!Objects.equals(authoredEntry, normalizedEntry)) { - throw new BexException("Compute entry changed during normalization"); - } - BexProgramSource source = definition != null - ? BexProgramSource.withDefinition(program, definition, normalizedEntry) - : BexProgramSource.inline(program); - long gasLimit = gasLimit(program); - BexExecutionContext bexContext = contextFactory.create(context, gasLimit); - BexExecutionResult execution = bexEngine.compileAndExecute(source, bexContext); - metrics.addBexMetrics(execution.metrics()); - if (execution.gasUsed() > 0L) { - context.processorContext().consumeGas(execution.gasUsed()); - } - ComputeEffectPlan effects = resultPlanner.plan(execution, - context, - FrozenNodeUtil.booleanProperty(program, "emitEvents", true)); - bufferThroughLegacyMutableApi(effects, context); - if (effects.terminationRequested()) { - return FrozenNodeUtil.booleanProperty(program, "returnResult", true) - ? WorkflowStepResult.terminalValue(execution, - effects.changesetHandled()) - : WorkflowStepResult.terminal(); - } - return FrozenNodeUtil.booleanProperty(program, "returnResult", true) - ? WorkflowStepResult.value(execution, effects.changesetHandled()) - : WorkflowStepResult.none(); - } catch (ComputeResultValidationException ex) { - metrics.incrementComputeResultValidationFailures(); - context.processorContext().throwFatal( - "Invalid Compute result: " + ex.getMessage()); - return WorkflowStepResult.none(); - } catch (ProcessorFatalException ex) { - throw ex; - } catch (BexException ex) { - context.processorContext().throwFatal("Compute failed: " + ex.getMessage()); - return WorkflowStepResult.none(); - } catch (RuntimeException ex) { - context.processorContext().throwFatal("Compute failed: " + ex.getMessage()); - return WorkflowStepResult.none(); - } finally { - metrics.addComputeStepNanos(System.nanoTime() - stepStart); - } - } - - private long gasLimit(FrozenNode program) { - Long configured = FrozenNodeUtil.integer( - FrozenNodeUtil.property(program, "gasLimit")); - if (configured == null) { - return defaultGasLimit; - } - if (configured.longValue() <= 0L) { - throw new BexException("Compute gasLimit must be positive"); - } - return configured.longValue(); - } - - private void bufferThroughLegacyMutableApi(ComputeEffectPlan effects, - StepExecutionContext context) { - effects.claimForBuffering(); - List patches = mutablePatches(effects.patches()); - if (!patches.isEmpty()) { - WorkingDocument.Preview preview = null; - boolean transferred = false; - try { - preview = context.advanceWorkingDocument(patches); - if (preview != null) { - metrics.addMetric("mutablePatchesHandedToLanguage", patches.size()); - context.processorContext().applyPreviewedPatches(patches, preview); - transferred = true; - metrics.addPatchesApplied(patches.size()); - metrics.incrementUpdateBatchPatchApplications(); - } - } finally { - if (!transferred && preview != null) { - preview.close(); - } - } - } - for (FrozenNode event : effects.events()) { - context.processorContext().emitEvent(event.toNode()); - metrics.incrementEventsEmitted(); - } - if (effects.terminationRequested()) { - context.processorContext().terminateGracefully(effects.terminationReason()); - metrics.incrementSuccessfulComputeTerminationRequests(); - } - } - - private List mutablePatches(List frozenPatches) { - List mutable = new ArrayList(frozenPatches.size()); - for (FrozenJsonPatch patch : frozenPatches) { - if (patch.getOp() == JsonPatch.Op.ADD) { - mutable.add(JsonPatch.add(patch.getPath(), patch.getValue().toNode())); - } else if (patch.getOp() == JsonPatch.Op.REPLACE) { - mutable.add(JsonPatch.replace(patch.getPath(), patch.getValue().toNode())); - } else { - mutable.add(JsonPatch.remove(patch.getPath())); - } - } - return mutable; - } - } -} diff --git a/src/test/java/blue/coordination/processor/workflow/FrozenUpdateDocumentDifferentialTest.java b/src/test/java/blue/coordination/processor/workflow/FrozenUpdateDocumentDifferentialTest.java deleted file mode 100644 index 741bef4..0000000 --- a/src/test/java/blue/coordination/processor/workflow/FrozenUpdateDocumentDifferentialTest.java +++ /dev/null @@ -1,503 +0,0 @@ -package blue.coordination.processor.workflow; - -import blue.bex.api.BexEngine; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.CoordinationTestResources; -import blue.coordination.processor.TestTimelineProvider; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.DocumentProcessingRuntime; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.ProcessorErrorCategory; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.WorkingDocument; -import blue.language.processor.model.FrozenJsonPatch; -import blue.language.processor.model.JsonPatch; -import blue.language.snapshot.FrozenNode; -import blue.repo.BlueRepository; -import blue.repo.coordination.ChatMessage; -import blue.repo.coordination.SequentialWorkflowStep; -import blue.repo.coordination.UpdateDocument; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** Differential coverage for the test-only legacy mutable Update Document lane. */ -class FrozenUpdateDocumentDifferentialTest { - private static final String TEXT_BLUE_ID = - "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC"; - - @Test - void orderedStructuralTypedReferenceAndReentrantUpdatesMatchLegacyLane() { - Outcome frozen = run(false, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return broadPatchDocument(repository); - } - }); - Outcome legacy = run(true, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return broadPatchDocument(repository); - } - }); - - assertEquivalent(frozen, legacy); - assertEquals("second", frozen.document.getAsText("/status")); - assertEquals("child-after-parent", frozen.document.getAsText("/parent/child")); - assertEquals("ZERO", frozen.document.getAsText("/rows/0")); - assertEquals("inserted", frozen.document.getAsText("/rows/1")); - assertEquals("one", frozen.document.getAsText("/rows/2")); - assertNull(nodeAt(frozen.document, "/removeMe")); - assertEquals(TEXT_BLUE_ID, frozen.document.getAsNode("/pureReference").getBlueId()); - assertEquals("typed text", frozen.document.get("/typed")); - assertEquals(2, frozen.document.getAsNode("/generalized").getItems().size()); - assertEquals("embedded payload", frozen.document.getAsNode("/embeddedValue").getName()); - assertEquals("seen", frozen.document.getAsText("/observed")); - assertFalse(frozen.triggeredEventsJson.isEmpty()); - assertTrue(metric(frozen.metrics, "frozenPatchesHandedToLanguage") > 0L); - assertEquals(0L, metric(frozen.metrics, "mutablePatchesHandedToLanguage")); - assertTrue(metric(legacy.metrics, "mutablePatchesHandedToLanguage") > 0L); - } - - @Test - void failureOnPatchNHasTheSameFailureAndCommittedPrefix() { - Outcome frozen = run(false, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return failureDocument(repository); - } - }); - Outcome legacy = run(true, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return failureDocument(repository); - } - }); - - assertEquivalent(frozen, legacy); - assertEquals(ProcessorStatus.RUNTIME_FATAL, frozen.status); - assertNotNull(frozen.failureReason); - assertTrue(frozen.failureReason.contains( - "Path does not exist for remove: /patchNTarget"), frozen.failureReason); - assertEquals("prefix-one", frozen.document.getAsText("/status")); - assertEquals("prefix-one", legacy.document.getAsText("/status")); - assertEquals("prefix-two", frozen.document.getAsText("/secondPrefix")); - assertEquals("prefix-two", legacy.document.getAsText("/secondPrefix")); - assertNull(nodeAt(frozen.document, "/patchNTarget")); - assertNull(nodeAt(legacy.document, "/patchNTarget")); - assertNull(nodeAt(frozen.document, "/mustNotAppear")); - assertNull(nodeAt(legacy.document, "/mustNotAppear")); - assertTrue(metric(frozen.metrics, "frozenPatchesHandedToLanguage") >= 4L, - "the full frozen sequence must cross the Language boundary before patch N fails"); - assertTrue(metric(legacy.metrics, "mutablePatchesHandedToLanguage") >= 4L, - "the full legacy sequence must cross the Language boundary before patch N fails"); - } - - @Test - void gracefulTerminationKeepsPriorChangesAndSkipsLaterPatchProduction() { - Outcome frozen = run(false, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return terminationDocument(repository); - } - }); - Outcome legacy = run(true, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return terminationDocument(repository); - } - }); - - assertEquivalent(frozen, legacy); - assertEquals("before termination", frozen.document.getAsText("/status")); - assertNull(nodeAt(frozen.document, "/mustNotAppear")); - assertNotNull(frozen.document.get("/contracts/terminated")); - assertEquals(1L, metric(frozen.metrics, "frozenPatchesHandedToLanguage")); - } - - @Test - void embeddedScopePointerResolutionMatchesLegacyLane() { - Outcome frozen = run(false, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return embeddedDocument(repository); - } - }); - Outcome legacy = run(true, new DocumentFactory() { - @Override - public Node build(BlueRepository repository) { - return embeddedDocument(repository); - } - }); - - assertEquivalent(frozen, legacy); - assertEquals(100, ((Number) frozen.document.get("/counter")).intValue()); - assertEquals(7, ((Number) frozen.document.get("/child/counter")).intValue()); - } - - @Test - void expandedReferenceLikeValueMatchesLegacyAtTheLanguageBoundary() { - BlueRepository repository = BlueRepository.latest(); - // Repository lookup returns a resolved view whose root combines blueId with expanded - // content. Remove the reference marker to model the equivalent authored expansion; - // FrozenJsonPatch must continue rejecting the ambiguous resolved representation. - Node expanded = repository.nodeByBlueId(ChatMessage.blueId()) - .orElseThrow(() -> new AssertionError("Chat Message type missing")) - .clone() - .blueId(null); - Node mutableDocument = new Node(); - Node frozenDocument = new Node(); - - new DocumentProcessingRuntime(mutableDocument).applyPatches("/", Collections.singletonList( - JsonPatch.add("/expanded", expanded.clone()))); - new DocumentProcessingRuntime(frozenDocument).applyFrozenPatches("/", Collections.singletonList( - FrozenJsonPatch.add("/expanded", FrozenNode.fromNode(expanded)))); - - Blue blue = CoordinationTestResources.configuredBlue(repository); - try { - assertEquals(blue.calculateBlueId(mutableDocument), blue.calculateBlueId(frozenDocument)); - assertEquals(mutableDocument.getAsNode("/expanded").getName(), - frozenDocument.getAsNode("/expanded").getName()); - } finally { - blue.close(); - } - } - - private static Node broadPatchDocument(BlueRepository repository) { - Map contracts = ownerContracts(); - contracts.put("allUpdates", documentUpdateChannel("/")); - contracts.put("statusUpdates", documentUpdateChannel("/status")); - contracts.put("observedUpdates", documentUpdateChannel("/observed")); - contracts.put("writer", directWorkflow("owner", - updateDocumentStep( - patch("add", "/added", new Node().value("added")), - patch("replace", "/status", new Node().value("first")), - patch("replace", "/status", new Node().value("second")), - patch("replace", "/parent", new Node() - .properties("child", new Node().value("from-parent")) - .properties("keep", new Node().value(false))), - patch("replace", "/parent/child", new Node().value("child-after-parent")), - patch("add", "/rows/1", new Node().value("inserted")), - patch("replace", "/rows/0", new Node().value("ZERO")), - patch("remove", "/rows/3", null), - patch("remove", "/removeMe", null), - patch("add", "/typed", new Node() - .type(new Node().blueId(TEXT_BLUE_ID)) - .value("typed text")), - patch("add", "/generalized", new Node() - .type("List") - .itemType(new Node().blueId(TEXT_BLUE_ID)) - .items(new Node().value("one"), new Node().value("two"))), - patch("add", "/pureReference", new Node().blueId(TEXT_BLUE_ID)), - patch("add", "/embeddedValue", new Node() - .name("embedded payload") - .properties("counter", new Node().value(1)))))); - contracts.put("reentrantWriter", directWorkflowMatching("statusUpdates", - new Node().type("Document Update"), - updateDocumentStep(patch("replace", "/observed", new Node().value("seen"))))); - contracts.put("reentrantObserver", directWorkflowMatching("observedUpdates", - new Node().type("Document Update"), - triggerEventStep("reentrant update observed"))); - return root(repository, contracts) - .properties("status", new Node().value("initial")) - .properties("observed", new Node().value("not yet")) - .properties("removeMe", new Node().value("gone")) - .properties("parent", new Node() - .properties("child", new Node().value("old")) - .properties("keep", new Node().value(true))) - .properties("rows", new Node().items( - new Node().value("zero"), - new Node().value("one"), - new Node().value("two"))); - } - - private static Node failureDocument(BlueRepository repository) { - Map contracts = ownerContracts(); - contracts.put("statusUpdates", documentUpdateChannel("/status")); - contracts.put("writer", directWorkflow("owner", - updateDocumentStep( - patch("replace", "/status", new Node().value("prefix-one")), - patch("add", "/secondPrefix", new Node().value("prefix-two")), - patch("remove", "/patchNTarget", null), - patch("add", "/mustNotAppear", new Node().value(true))))); - // Patch 1 routes a Document Update that removes patch N's target. The - // complete outer sequence therefore previews successfully, patch 1 and - // patch 2 commit, then the runtime rebase makes patch N fail. This is - // deliberately different from a preview-time batch rollback. - contracts.put("invalidatePatchN", directWorkflowMatching("statusUpdates", - new Node().type("Document Update"), - updateDocumentStep(patch("remove", "/patchNTarget", null)))); - return root(repository, contracts) - .properties("status", new Node().value("initial")) - .properties("patchNTarget", new Node().value("present during preview")); - } - - private static Node terminationDocument(BlueRepository repository) { - Map contracts = ownerContracts(); - contracts.put("writer", directWorkflow("owner", - updateDocumentStep(patch("replace", "/status", new Node().value("before termination"))), - new Node().type("Coordination/Terminate Processing") - .properties("reason", new Node().value("finished intentionally")), - updateDocumentStep(patch("add", "/mustNotAppear", new Node().value(true))))); - return root(repository, contracts).properties("status", new Node().value("initial")); - } - - private static Node embeddedDocument(BlueRepository repository) { - Map childContracts = ownerContracts(); - childContracts.put("writer", directWorkflow("owner", - updateDocumentStep(patch("replace", "/counter", new Node().value(7))))); - Map rootContracts = new LinkedHashMap(); - rootContracts.put("embedded", new Node() - .type("Process Embedded") - .properties("paths", new Node().items(new Node().value("/child")))); - return root(repository, rootContracts) - .properties("counter", new Node().value(100)) - .properties("child", new Node() - .name("Child") - .properties("counter", new Node().value(0)) - .properties("contracts", new Node().properties(childContracts))); - } - - private static Node root(BlueRepository repository, Map contracts) { - return new Node() - .blue(repository.typeAliasBlue()) - .name("Frozen Update Differential") - .properties("contracts", new Node().properties(contracts)); - } - - private static Map ownerContracts() { - Map contracts = new LinkedHashMap(); - contracts.put("owner", TestTimelineProvider.channel("owner")); - return contracts; - } - - private static Node directWorkflow(String channel, Node... steps) { - return new Node() - .type("Coordination/Sequential Workflow") - .properties("channel", new Node().value(channel)) - .properties("steps", new Node().items(steps)); - } - - private static Node directWorkflowMatching(String channel, Node event, Node... steps) { - return directWorkflow(channel, steps).properties("event", event); - } - - private static Node updateDocumentStep(Node... patches) { - return new Node() - .type("Coordination/Update Document") - .properties("changeset", new Node().items(patches)); - } - - private static Node patch(String op, String path, Node value) { - Node patch = new Node() - .properties("op", new Node().value(op)) - .properties("path", new Node().value(path)); - if (value != null) { - patch.properties("val", value); - } - return patch; - } - - private static Node documentUpdateChannel(String path) { - return new Node() - .type("Document Update Channel") - .properties("path", new Node().value(path)); - } - - private static Node triggerEventStep(String message) { - return new Node() - .type("Coordination/Trigger Event") - .properties("event", new Node() - .type("Coordination/Chat Message") - .properties("message", new Node().value(message))); - } - - private static Outcome run(boolean legacy, DocumentFactory factory) { - BlueRepository repository = BlueRepository.latest(); - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = legacy - ? legacyRunner(metrics) - : SequentialWorkflowRunner.withBexEngine( - BexEngine.builder().build(), 100_000L, metrics); - Blue blue = CoordinationTestResources.configuredBlue(repository); - try { - CoordinationProcessors.registerWith(blue, CoordinationProcessorOptions.builder() - .sequentialWorkflowRunner(runner) - .processingMetrics(metrics) - .build()); - Node initialized = blue.initializeDocument(blue.preprocess(factory.build(repository))).document(); - Node event = TestTimelineProvider.timelineEntry(blue, - repository, - "owner", - 1, - TestTimelineProvider.chatMessage("run")); - DocumentProcessingResult result = blue.processDocument(initialized, event); - List triggeredEventsJson = new ArrayList(result.triggeredEvents().size()); - for (Node triggered : result.triggeredEvents()) { - triggeredEventsJson.add(blue.nodeToJson(triggered)); - } - return new Outcome(result.document().clone(), - result.snapshot() != null - ? result.snapshot().frozenCanonicalRoot().resolvedStructuralKey() - : null, - result.snapshot() != null - ? result.snapshot().frozenResolvedRoot().resolvedStructuralKey() - : null, - result.blueId(), - triggeredEventsJson, - result.totalGas(), - result.status(), - result.errorCategory(), - result.failureReason(), - metrics); - } finally { - try { - blue.close(); - } finally { - runner.close(); - } - } - } - - private static SequentialWorkflowRunner legacyRunner(BexProcessingMetrics metrics) { - return new SequentialWorkflowRunner(Arrays - .>asList( - new TriggerEventStepExecutor(metrics), - new TerminateProcessingStepExecutor(metrics), - new LegacyMutableUpdateExecutor(metrics))); - } - - private static void assertEquivalent(Outcome frozen, Outcome legacy) { - assertEquals(legacy.canonicalKey, frozen.canonicalKey, "canonical document"); - assertEquals(legacy.resolvedKey, frozen.resolvedKey, "resolved document"); - assertEquals(legacy.blueId, frozen.blueId, "final BlueId"); - assertEquals(legacy.triggeredEventsJson, frozen.triggeredEventsJson, - "triggered events and order"); - assertEquals(legacy.totalGas, frozen.totalGas, "gas"); - assertEquals(legacy.status, frozen.status, "status"); - assertEquals(legacy.errorCategory, frozen.errorCategory, "failure category"); - assertEquals(legacy.failureReason, frozen.failureReason, "failure reason"); - } - - private static long metric(BexProcessingMetrics metrics, String name) { - Long value = metrics.languageCounters().get(name); - return value != null ? value.longValue() : 0L; - } - - private static Node nodeAt(Node root, String path) { - try { - return root != null ? root.getAsNode(path) : null; - } catch (IllegalArgumentException ex) { - return null; - } - } - - private interface DocumentFactory { - Node build(BlueRepository repository); - } - - private static final class Outcome { - private final Node document; - private final Object canonicalKey; - private final Object resolvedKey; - private final String blueId; - private final List triggeredEventsJson; - private final long totalGas; - private final ProcessorStatus status; - private final ProcessorErrorCategory errorCategory; - private final String failureReason; - private final BexProcessingMetrics metrics; - - private Outcome(Node document, - Object canonicalKey, - Object resolvedKey, - String blueId, - List triggeredEventsJson, - long totalGas, - ProcessorStatus status, - ProcessorErrorCategory errorCategory, - String failureReason, - BexProcessingMetrics metrics) { - this.document = document; - this.canonicalKey = canonicalKey; - this.resolvedKey = resolvedKey; - this.blueId = blueId; - this.triggeredEventsJson = Collections.unmodifiableList( - new ArrayList(triggeredEventsJson)); - this.totalGas = totalGas; - this.status = status; - this.errorCategory = errorCategory; - this.failureReason = failureReason; - this.metrics = metrics; - } - } - - /** Test-only reproduction of the legacy mutable Language handoff. */ - private static final class LegacyMutableUpdateExecutor - implements WorkflowStepExecutor { - private final BexProcessingMetrics metrics; - - private LegacyMutableUpdateExecutor(BexProcessingMetrics metrics) { - this.metrics = metrics; - } - - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof UpdateDocument; - } - - @Override - public WorkflowStepResult execute(UpdateDocument step, StepExecutionContext context) { - StaticUpdatePlan plan = context.staticUpdatePlan(); - if (plan == null) { - context.processorContext().throwFatal("Legacy differential lane requires a static plan"); - return WorkflowStepResult.none(); - } - List patches = new ArrayList(plan.patches().size()); - for (StaticUpdatePlan.PatchTemplate template : plan.patches()) { - FrozenJsonPatch frozen = template.bind(context.processorContext() - .resolvePointer(template.authoredPath())); - if (frozen.getOp() == JsonPatch.Op.ADD) { - patches.add(JsonPatch.add(frozen.getPath(), frozen.getValue().toNode())); - } else if (frozen.getOp() == JsonPatch.Op.REPLACE) { - patches.add(JsonPatch.replace(frozen.getPath(), frozen.getValue().toNode())); - } else { - patches.add(JsonPatch.remove(frozen.getPath())); - } - } - if (patches.isEmpty()) { - return WorkflowStepResult.none(); - } - WorkingDocument.Preview preview = null; - boolean transferred = false; - try { - preview = context.advanceWorkingDocument(patches); - if (preview == null) { - return WorkflowStepResult.none(); - } - metrics.addMetric("mutablePatchesHandedToLanguage", patches.size()); - context.processorContext().applyPreviewedPatches(patches, preview); - transferred = true; - return WorkflowStepResult.none(); - } finally { - if (!transferred && preview != null) { - preview.close(); - } - } - } - } -} diff --git a/src/test/java/blue/coordination/processor/workflow/NodeUtilTest.java b/src/test/java/blue/coordination/processor/workflow/NodeUtilTest.java new file mode 100644 index 0000000..609dd5c --- /dev/null +++ b/src/test/java/blue/coordination/processor/workflow/NodeUtilTest.java @@ -0,0 +1,74 @@ +package blue.coordination.processor.workflow; + +import blue.language.model.Node; +import blue.language.snapshot.FrozenNode; +import blue.language.identity.DirectBlueIdCalculator; +import org.junit.jupiter.api.Test; + +import java.math.BigInteger; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class NodeUtilTest { + private static final String VALID_BLUE_ID = + DirectBlueIdCalculator.calculateBlueId( + new Node().value("identity")); + + @Test + void shouldTreatOnlyAxisFreeMutableAndFrozenNodesAsEmpty() { + // given + Node empty = new Node(); + FrozenNode frozenEmpty = FrozenNode.fromNode(new Node()); + + // when + boolean mutableEmpty = NodeUtil.isEmpty(empty); + boolean immutableEmpty = FrozenNodeUtil.isEmpty(frozenEmpty); + + // then + assertTrue(mutableEmpty); + assertTrue(immutableEmpty); + assertRetained(new Node().name("named")); + assertRetained(new Node().type( + new Node().blueId(VALID_BLUE_ID))); + assertRetained(new Node().blueId(VALID_BLUE_ID)); + assertRetained(new Node().items( + Collections.emptyList())); + } + + @Test + void shouldRejectScalarCoercionAcrossContractTypes() { + // given + Node absentText = new Node(); + Node numericText = new Node().value(1); + Node textualBoolean = new Node().properties( + "flag", + new Node().value("true")); + FrozenNode oversizedInteger = FrozenNode.fromNode( + new Node().value(BigInteger.ONE.shiftLeft(80))); + + // when + String missing = NodeUtil.text(absentText); + + // then + assertNull(missing); + assertThrows(IllegalArgumentException.class, + () -> NodeUtil.text(numericText)); + assertThrows(IllegalArgumentException.class, + () -> NodeUtil.booleanProperty( + textualBoolean, + "flag", + false)); + assertThrows(ArithmeticException.class, + () -> FrozenNodeUtil.integer(oversizedInteger)); + } + + private static void assertRetained(Node node) { + assertFalse(NodeUtil.isEmpty(node)); + assertFalse(FrozenNodeUtil.isEmpty( + FrozenNode.fromNode(node))); + } +} diff --git a/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCacheTest.java b/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCacheTest.java index a76c64e..5b95171 100644 --- a/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCacheTest.java +++ b/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowPlanCacheTest.java @@ -5,8 +5,10 @@ import blue.language.snapshot.FrozenNode; import blue.repo.coordination.SequentialWorkflowStep; import blue.repo.coordination.TriggerEvent; +import blue.repo.coordination.UpdateDocument; import org.junit.jupiter.api.Test; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.CountDownLatch; @@ -17,13 +19,16 @@ import java.util.concurrent.atomic.AtomicInteger; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; class SequentialWorkflowPlanCacheTest { @Test - void exactEquivalentFrozenContractsReusePlanAndExecutorSelection() { + void shouldPublishAndReuseExecutorSelectionOnlyAfterStepAdmission() { + // given FrozenNode firstContract = contract("Same", "Run"); FrozenNode equivalentContract = contract("Same", "Run"); AtomicInteger supportsCalls = new AtomicInteger(); @@ -33,20 +38,193 @@ void exactEquivalentFrozenContractsReusePlanAndExecutorSelection() { SequentialWorkflowPlanCache cache = new SequentialWorkflowPlanCache(8, 1024L * 1024L, null); AtomicInteger builds = new AtomicInteger(); + // when SequentialWorkflowPlan first = cache.getOrBuild(firstContract.resolvedStructuralKey(), planFactory(firstContract, executors, builds)); SequentialWorkflowPlan reused = cache.getOrBuild(equivalentContract.resolvedStructuralKey(), planFactory(equivalentContract, executors, builds)); + int supportsCallsBeforeAdmission = supportsCalls.get(); + SequentialWorkflowPlan.PlannedStep admitted = + reused.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + cache.refreshWeight(reused); + SequentialWorkflowPlan.PlannedStep warmed = + reused.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + // then assertSame(first, reused); assertEquals(1, builds.get()); + assertEquals(0, supportsCallsBeforeAdmission); assertEquals(1, supportsCalls.get()); + assertTrue(admitted.published()); + assertFalse(warmed.published()); + assertSame(admitted.step(), warmed.step()); assertEquals("Run", reused.step(0).key()); assertTrue(reused.step(0).matches(new TriggerEvent())); } @Test - void changedContractIdentityBuildsIndependentPlan() { + void shouldIncreaseRetainedWeightOnlyWhenAdmittedStepIsPublished() { + // given + FrozenNode contract = contract("Lazy weight", "Run"); + AtomicInteger supportsCalls = new AtomicInteger(); + List> executors = + Collections.>singletonList( + countingTriggerExecutor(supportsCalls)); + SequentialWorkflowPlanCache cache = + new SequentialWorkflowPlanCache( + 8, + 1024L * 1024L, + null); + SequentialWorkflowPlan plan = + cache.getOrBuild( + contract.resolvedStructuralKey(), + planFactory( + contract, + executors, + new AtomicInteger())); + long shellWeight = cache.weightBytes(); + + // when + SequentialWorkflowPlan.PlannedStep admitted = + plan.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + cache.refreshWeight(plan); + + // then + assertTrue(admitted.published()); + assertEquals(1, supportsCalls.get()); + assertTrue(cache.weightBytes() > shellWeight); + } + + @Test + void shouldNotReuseExactStepOrStaticChangesetAcrossIdentityEquivalentProcessRepresentations() { + // given + FrozenNode firstChangeset = changeset(7); + FrozenNode secondChangeset = FrozenNode.fromNode( + firstChangeset.toNode()); + FrozenNode firstExactStep = updateStep(firstChangeset); + FrozenNode secondExactStep = FrozenNode.fromNode( + firstExactStep.toNode()); + FrozenNode inlineSelection = firstExactStep; + FrozenNode referenceSelection = FrozenNode.fromNode( + new Node().blueId(firstExactStep.blueId())); + AtomicInteger supportsCalls = new AtomicInteger(); + List> executors = + Collections.>singletonList( + countingUpdateExecutor(supportsCalls)); + SequentialWorkflowPlan plan = SequentialWorkflowPlan.build( + contract("Representation", "Update"), + Collections.singletonList( + new UpdateDocument())); + + // when + SequentialWorkflowPlan.PlannedStep first = + plan.planAdmittedStep( + new UpdateDocument(), + firstExactStep, + inlineSelection, + 0, + executors, + null, + () -> firstChangeset); + SequentialWorkflowPlan.PlannedStep second = + plan.planAdmittedStep( + new UpdateDocument(), + secondExactStep, + referenceSelection, + 0, + executors, + null, + () -> secondChangeset); + + // then + assertEquals( + firstExactStep.blueId(), + referenceSelection.getReferenceBlueId()); + assertEquals( + firstExactStep.resolvedStructuralKey(), + secondExactStep.resolvedStructuralKey()); + assertFalse( + inlineSelection.resolvedStructuralKey().equals( + referenceSelection.resolvedStructuralKey())); + assertTrue(first.published()); + assertFalse(second.published()); + assertNotSame(first.step(), second.step()); + assertNotSame( + first.step().staticUpdatePlan(), + second.step().staticUpdatePlan()); + assertSame(secondExactStep, second.exactStep()); + assertEquals(2, supportsCalls.get()); + } + + @Test + void shouldSkipChangesetMaterializationOnExactRepresentationHit() { + // given + FrozenNode materializedChangeset = changeset(11); + FrozenNode changesetReference = FrozenNode.fromNode( + new Node().blueId(materializedChangeset.blueId())); + FrozenNode firstExactStep = updateStep(changesetReference); + FrozenNode secondExactStep = FrozenNode.fromNode( + firstExactStep.toNode()); + AtomicInteger materializations = new AtomicInteger(); + AtomicInteger supportsCalls = new AtomicInteger(); + List> executors = + Collections.>singletonList( + countingUpdateExecutor(supportsCalls)); + SequentialWorkflowPlan plan = SequentialWorkflowPlan.build( + contract("Lazy changeset", "Update"), + Collections.singletonList( + new UpdateDocument())); + + // when + SequentialWorkflowPlan.PlannedStep first = + plan.planAdmittedStep( + new UpdateDocument(), + firstExactStep, + firstExactStep, + 0, + executors, + null, + () -> { + materializations.incrementAndGet(); + return materializedChangeset; + }); + SequentialWorkflowPlan.PlannedStep warmed = + plan.planAdmittedStep( + new UpdateDocument(), + secondExactStep, + secondExactStep, + 0, + executors, + null, + () -> { + throw new AssertionError( + "cache hit materialized referenced changeset"); + }); + + // then + assertTrue(first.published()); + assertFalse(warmed.published()); + assertSame(first.step(), warmed.step()); + assertSame(secondExactStep, warmed.exactStep()); + assertEquals(1, materializations.get()); + assertEquals(1, supportsCalls.get()); + } + + @Test + void shouldBuildIndependentPlanForChangedContractIdentity() { + // given FrozenNode firstContract = contract("First", "Run"); FrozenNode changedContract = contract("Changed", "Run"); List> executors = @@ -55,18 +233,21 @@ void changedContractIdentityBuildsIndependentPlan() { SequentialWorkflowPlanCache cache = new SequentialWorkflowPlanCache(8, 1024L * 1024L, null); AtomicInteger builds = new AtomicInteger(); + // when SequentialWorkflowPlan first = cache.getOrBuild(firstContract.resolvedStructuralKey(), planFactory(firstContract, executors, builds)); SequentialWorkflowPlan changed = cache.getOrBuild(changedContract.resolvedStructuralKey(), planFactory(changedContract, executors, builds)); + // then assertNotSame(first, changed); assertEquals(2, builds.get()); assertEquals(2, cache.size()); } @Test - void entryBoundUsesAccessOrderAndEvictedPlanRebuilds() { + void shouldUseAccessOrderForEntryBoundAndRebuildEvictedPlan() { + // given FrozenNode firstContract = contract("First", "One"); FrozenNode secondContract = contract("Second", "Two"); FrozenNode thirdContract = contract("Third", "Three"); @@ -76,57 +257,130 @@ void entryBoundUsesAccessOrderAndEvictedPlanRebuilds() { SequentialWorkflowPlanCache cache = new SequentialWorkflowPlanCache(2, Long.MAX_VALUE, null); AtomicInteger builds = new AtomicInteger(); + // when SequentialWorkflowPlan first = cache.getOrBuild(firstContract.resolvedStructuralKey(), planFactory(firstContract, executors, builds)); SequentialWorkflowPlan second = cache.getOrBuild(secondContract.resolvedStructuralKey(), planFactory(secondContract, executors, builds)); - assertSame(first, cache.getOrBuild(firstContract.resolvedStructuralKey(), - planFactory(firstContract, executors, builds))); + SequentialWorkflowPlan touchedFirst = + cache.getOrBuild(firstContract.resolvedStructuralKey(), + planFactory(firstContract, executors, builds)); cache.getOrBuild(thirdContract.resolvedStructuralKey(), planFactory(thirdContract, executors, builds)); SequentialWorkflowPlan rebuiltSecond = cache.getOrBuild(secondContract.resolvedStructuralKey(), planFactory(secondContract, executors, builds)); + // then + assertSame(first, touchedFirst); assertNotSame(second, rebuiltSecond); assertEquals(4, builds.get()); assertEquals(2, cache.size()); } @Test - void weightBoundEvictsAndOversizedPlansAreNotRetained() { - FrozenNode firstContract = contract("First", "One"); - FrozenNode secondContract = contract("Second", "Two"); + void shouldEvictPlanWhenLiveWeightExceedsBound() { + // given + FrozenNode contract = contract("Live weight", "One"); List> executors = Collections.>singletonList( countingTriggerExecutor(new AtomicInteger())); - SequentialWorkflowPlan firstPlan = buildPlan(firstContract, executors); - SequentialWorkflowPlan secondPlan = buildPlan(secondContract, executors); - long firstEntryWeight = firstPlan.approximateWeightBytes() + 64L; - long secondEntryWeight = secondPlan.approximateWeightBytes() + 64L; - long oneEntryLimit = Math.max(firstEntryWeight, secondEntryWeight); - SequentialWorkflowPlanCache bounded = new SequentialWorkflowPlanCache(8, oneEntryLimit, null); + SequentialWorkflowPlan plan = + buildPlan(contract); + long shellEntryWeight = + plan.approximateWeightBytes() + 64L; + SequentialWorkflowPlanCache bounded = + new SequentialWorkflowPlanCache( + 8, + shellEntryWeight, + null); + bounded.getOrBuild( + contract.resolvedStructuralKey(), + () -> plan); + int sizeBeforeAdmission = bounded.size(); - bounded.getOrBuild(firstContract.resolvedStructuralKey(), () -> firstPlan); - bounded.getOrBuild(secondContract.resolvedStructuralKey(), () -> secondPlan); + // when + plan.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + bounded.refreshWeight(plan); - assertEquals(1, bounded.size()); - assertTrue(bounded.weightBytes() <= oneEntryLimit); + // then + assertEquals(1, sizeBeforeAdmission); + assertEquals(0, bounded.size()); + assertEquals(0L, bounded.weightBytes()); + } + @Test + void shouldNotRetainPlanThatExceedsWeightBound() { + // given + FrozenNode contract = contract("Oversized", "One"); + List> executors = + Collections.>singletonList( + countingTriggerExecutor(new AtomicInteger())); + SequentialWorkflowPlan plan = buildPlan(contract); SequentialWorkflowPlanCache oversized = new SequentialWorkflowPlanCache(8, - firstPlan.approximateWeightBytes(), + plan.approximateWeightBytes(), null); - AtomicInteger oversizedBuilds = new AtomicInteger(); - oversized.getOrBuild(firstContract.resolvedStructuralKey(), - countingFactory(firstPlan, oversizedBuilds)); - oversized.getOrBuild(firstContract.resolvedStructuralKey(), - countingFactory(firstPlan, oversizedBuilds)); - assertEquals(2, oversizedBuilds.get()); + AtomicInteger builds = new AtomicInteger(); + + // when + oversized.getOrBuild(contract.resolvedStructuralKey(), + countingFactory(plan, builds)); + oversized.getOrBuild(contract.resolvedStructuralKey(), + countingFactory(plan, builds)); + + // then + assertEquals(2, builds.get()); assertEquals(0, oversized.size()); assertEquals(0L, oversized.weightBytes()); } @Test - void clearAndCloseReleaseRetainedWeightAndPreventRepopulation() { + void shouldEstimateRetainedStepWeightWithoutTraversingTriggerPayload() { + // given + List> executors = + Collections.>singletonList( + countingTriggerExecutor(new AtomicInteger())); + FrozenNode small = triggerContract(new Node().value("small")); + Node largeEvent = new Node().value("leaf"); + for (int index = 0; index < 128; index++) { + largeEvent = new Node().properties("nested", largeEvent); + } + FrozenNode large = triggerContract(largeEvent); + + // when + SequentialWorkflowPlan smallPlan = + buildPlan(small); + SequentialWorkflowPlan largePlan = + buildPlan(large); + assertNull(smallPlan.step(0)); + assertNull(largePlan.step(0)); + smallPlan.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + largePlan.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + long smallWeight = + smallPlan.approximateWeightBytes(); + long largeWeight = + largePlan.approximateWeightBytes(); + + // then + assertEquals( + smallWeight, + largeWeight); + } + + @Test + void shouldCloseCacheReleaseRetainedWeightAndPreventRepopulation() { + // given FrozenNode contract = contract("Clear", "Run"); List> executors = Collections.>singletonList( @@ -134,17 +388,17 @@ void clearAndCloseReleaseRetainedWeightAndPreventRepopulation() { SequentialWorkflowPlanCache cache = new SequentialWorkflowPlanCache(8, 1024L * 1024L, null); cache.getOrBuild(contract.resolvedStructuralKey(), planFactory(contract, executors, new AtomicInteger())); + long weightBeforeClose = cache.weightBytes(); - assertEquals(1, cache.size()); - assertTrue(cache.weightBytes() > 0L); + // when cache.close(); - assertTrue(cache.isClosed()); - assertEquals(0, cache.size()); - assertEquals(0L, cache.weightBytes()); - AtomicInteger buildsAfterClose = new AtomicInteger(); SequentialWorkflowPlan uncached = cache.getOrBuild(contract.resolvedStructuralKey(), planFactory(contract, executors, buildsAfterClose)); + + // then + assertTrue(weightBeforeClose > 0L); + assertTrue(cache.isClosed()); assertEquals(contract.resolvedStructuralKey(), uncached.contractIdentity()); assertEquals(1, buildsAfterClose.get()); assertEquals(0, cache.size()); @@ -152,7 +406,8 @@ void clearAndCloseReleaseRetainedWeightAndPreventRepopulation() { } @Test - void cachePublishesHitsMissesBuildsEvictionsLookupsAndCurrentWeight() { + void shouldPublishCacheHitsMissesBuildsEvictionsLookupsAndCurrentWeight() { + // given FrozenNode firstContract = contract("First metrics", "One"); FrozenNode secondContract = contract("Second metrics", "Two"); BexProcessingMetrics metrics = new BexProcessingMetrics(); @@ -161,13 +416,42 @@ void cachePublishesHitsMissesBuildsEvictionsLookupsAndCurrentWeight() { countingTriggerExecutor(new AtomicInteger())); SequentialWorkflowPlanCache cache = new SequentialWorkflowPlanCache(1, 1024L * 1024L, metrics); - cache.getOrBuild(firstContract.resolvedStructuralKey(), - metricsPlanFactory(firstContract, executors, metrics)); - cache.getOrBuild(contract("First metrics", "One").resolvedStructuralKey(), - metricsPlanFactory(firstContract, executors, metrics)); - cache.getOrBuild(secondContract.resolvedStructuralKey(), - metricsPlanFactory(secondContract, executors, metrics)); + // when + SequentialWorkflowPlan first = + cache.getOrBuild( + firstContract.resolvedStructuralKey(), + metricsPlanFactory( + firstContract)); + first.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + metrics); + cache.refreshWeight(first); + SequentialWorkflowPlan warmed = + cache.getOrBuild( + contract("First metrics", "One") + .resolvedStructuralKey(), + metricsPlanFactory( + firstContract)); + warmed.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + metrics); + SequentialWorkflowPlan second = + cache.getOrBuild( + secondContract.resolvedStructuralKey(), + metricsPlanFactory( + secondContract)); + second.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + metrics); + cache.refreshWeight(second); + // then assertEquals(2L, metrics.workflowPlansBuilt()); assertEquals(1L, metrics.workflowPlanCacheHits()); assertEquals(2L, metrics.workflowPlanCacheMisses()); @@ -179,25 +463,43 @@ void cachePublishesHitsMissesBuildsEvictionsLookupsAndCurrentWeight() { } @Test - void concurrentMissBuildsOnlyOnce() throws Exception { + void shouldBuildOnlyOnceForConcurrentMisses() throws Exception { + // given FrozenNode contract = contract("Concurrent", "Run"); + AtomicInteger supportsCalls = new AtomicInteger(); List> executors = Collections.>singletonList( - countingTriggerExecutor(new AtomicInteger())); - SequentialWorkflowPlan expected = buildPlan(contract, executors); + countingTriggerExecutor(supportsCalls)); + SequentialWorkflowPlan expected = buildPlan(contract); SequentialWorkflowPlanCache cache = new SequentialWorkflowPlanCache(8, 1024L * 1024L, null); AtomicInteger builds = new AtomicInteger(); CountDownLatch start = new CountDownLatch(1); ExecutorService pool = Executors.newFixedThreadPool(8); + + // when try { - @SuppressWarnings("unchecked") - Future[] futures = new Future[8]; - for (int i = 0; i < futures.length; i++) { - futures[i] = pool.submit(() -> { + List> futures = + new ArrayList<>(8); + for (int i = 0; i < 8; i++) { + futures.add(pool.submit(() -> { start.await(); - return cache.getOrBuild(contract.resolvedStructuralKey(), - countingFactory(expected, builds)); - }); + SequentialWorkflowPlan plan = + cache.getOrBuild( + contract.resolvedStructuralKey(), + countingFactory( + expected, + builds)); + SequentialWorkflowPlan.PlannedStep step = + plan.planAdmittedStep( + new TriggerEvent(), + 0, + executors, + null); + cache.refreshWeight(plan); + return step.step() != null + ? plan + : null; + })); } start.countDown(); for (Future future : futures) { @@ -206,7 +508,10 @@ void concurrentMissBuildsOnlyOnce() throws Exception { } finally { pool.shutdownNow(); } + + // then assertEquals(1, builds.get()); + assertEquals(1, supportsCalls.get()); } private static SequentialWorkflowPlanCache.PlanFactory planFactory( @@ -215,7 +520,7 @@ private static SequentialWorkflowPlanCache.PlanFactory planFactory( final AtomicInteger builds) { return () -> { builds.incrementAndGet(); - return buildPlan(contract, executors); + return buildPlan(contract); }; } @@ -229,22 +534,15 @@ private static SequentialWorkflowPlanCache.PlanFactory countingFactory( } private static SequentialWorkflowPlanCache.PlanFactory metricsPlanFactory( - final FrozenNode contract, - final List> executors, - final BexProcessingMetrics metrics) { + final FrozenNode contract) { return () -> SequentialWorkflowPlan.build(contract, - Collections.singletonList(new TriggerEvent()), - executors, - metrics); + Collections.singletonList(new TriggerEvent())); } private static SequentialWorkflowPlan buildPlan( - FrozenNode contract, - List> executors) { + FrozenNode contract) { return SequentialWorkflowPlan.build(contract, - Collections.singletonList(new TriggerEvent()), - executors, - null); + Collections.singletonList(new TriggerEvent())); } private static WorkflowStepExecutor countingTriggerExecutor(AtomicInteger supportsCalls) { @@ -262,6 +560,53 @@ public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext contex }; } + private static WorkflowStepExecutor + countingUpdateExecutor(AtomicInteger supportsCalls) { + return new WorkflowStepExecutor() { + @Override + public boolean supports(SequentialWorkflowStep step) { + supportsCalls.incrementAndGet(); + return step instanceof UpdateDocument; + } + + @Override + public WorkflowStepResult execute( + UpdateDocument step, + StepExecutionContext context) { + return WorkflowStepResult.none(); + } + }; + } + + private static FrozenNode changeset(int value) { + return FrozenNode.fromNode( + new Node().items( + new Node() + .properties( + "op", + new Node().value( + "replace")) + .properties( + "path", + new Node().value( + "/counter")) + .properties( + "val", + new Node().value( + value)))); + } + + private static FrozenNode updateStep( + FrozenNode changeset) { + return FrozenNode.fromNode( + new Node() + .type(new Node().blueId( + UpdateDocument.blueId())) + .properties( + "changeset", + changeset.toNode())); + } + private static FrozenNode contract(String description, String stepName) { Node step = new Node() .name(stepName) @@ -272,4 +617,13 @@ private static FrozenNode contract(String description, String stepName) { .properties("steps", new Node().items(step)); return FrozenNode.fromResolvedNode(contract); } + + private static FrozenNode triggerContract(Node event) { + Node step = new Node() + .name("Run") + .type("Coordination/Trigger Event") + .properties("event", event); + return FrozenNode.fromResolvedNode( + new Node().properties("steps", new Node().items(step))); + } } diff --git a/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowRunnerLifecycleTest.java b/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowRunnerLifecycleTest.java deleted file mode 100644 index bd97e62..0000000 --- a/src/test/java/blue/coordination/processor/workflow/SequentialWorkflowRunnerLifecycleTest.java +++ /dev/null @@ -1,521 +0,0 @@ -package blue.coordination.processor.workflow; - -import blue.bex.api.BexEngine; -import blue.coordination.processor.CoordinationProcessorOptions; -import blue.coordination.processor.CoordinationProcessors; -import blue.coordination.processor.bex.BexProcessingMetrics; -import blue.language.model.Node; -import blue.language.model.TypeBlueId; -import blue.language.processor.ChannelEvaluationContext; -import blue.language.processor.ChannelProcessor; -import blue.language.processor.DocumentProcessingResult; -import blue.language.processor.DocumentProcessor; -import blue.language.processor.ProcessingSnapshotManager; -import blue.language.processor.ProcessorStatus; -import blue.language.processor.WorkingDocument; -import blue.language.processor.model.ChannelContract; -import blue.language.processor.model.JsonPatch; -import blue.language.snapshot.CanonicalPatchResult; -import blue.language.snapshot.FrozenNode; -import blue.language.snapshot.ResolvedSnapshot; -import blue.repo.coordination.Compute; -import blue.repo.coordination.SequentialWorkflow; -import blue.repo.coordination.SequentialWorkflowStep; -import blue.repo.coordination.TerminateProcessing; -import blue.repo.coordination.TriggerEvent; -import blue.repo.coordination.UpdateDocument; -import java.math.BigInteger; -import java.util.Arrays; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** Lifecycle regressions for the workflow-owned Language working document. */ -class SequentialWorkflowRunnerLifecycleTest { - - private static final String CHANNEL_BLUE_ID = - "BHRKnD9toWwiU34GJvqLJ3Rtiv6W7Mmubai7CdrA1i3L"; - - @Test - void normalWorkflowCreatesAndClosesOneFrozenWorkingDocument() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = runner(metrics, frozenObservingExecutor()); - Fixture fixture = fixture(runner, triggerStep()); - - DocumentProcessingResult result = fixture.process(); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - fixture.assertOneWorkflowScopeReleased(); - assertEquals(1L, metrics.workflowDocumentViewsFromFrozen()); - assertEquals(0L, metrics.workflowDocumentViewsFromDocument()); - } - - @Test - void zeroStepWorkflowStillClosesItsWorkingDocument() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = runner(metrics); - Fixture fixture = fixture(runner); - - DocumentProcessingResult result = fixture.process(); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - fixture.assertOneWorkflowScopeReleased(); - assertEquals(1L, metrics.workflowDocumentViewsFromFrozen()); - assertEquals(0L, metrics.workflowDocumentViewsFromDocument()); - } - - @Test - void executorExceptionClosesWorkingDocumentAndStillRecordsRunnerTiming() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - WorkflowStepExecutor throwing = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - throw new IllegalStateException("executor exploded"); - } - }; - Fixture fixture = fixture(runner(metrics, throwing), triggerStep()); - - DocumentProcessingResult result = fixture.process(); - - assertRuntimeFatal(result, "executor exploded"); - fixture.assertOneWorkflowScopeReleased(); - assertTrue(metrics.workflowRunnerNanos() > 0L, - "the outer timing finally must run when an executor throws"); - } - - @Test - void throwFatalClosesWorkingDocument() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - WorkflowStepExecutor fatal = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - context.processorContext().throwFatal("requested fatal"); - return WorkflowStepResult.none(); - } - }; - Fixture fixture = fixture(runner(metrics, fatal), triggerStep()); - - DocumentProcessingResult result = fixture.process(); - - assertRuntimeFatal(result, "requested fatal"); - fixture.assertOneWorkflowScopeReleased(); - } - - @Test - void declarativeGracefulTerminationClosesAndSkipsLaterPatchStep() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - AtomicInteger patchExecutions = new AtomicInteger(); - WorkflowStepExecutor forbiddenPatch = new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof UpdateDocument; - } - - @Override - public WorkflowStepResult execute(UpdateDocument step, StepExecutionContext context) { - patchExecutions.incrementAndGet(); - context.processorContext().applyPatch( - JsonPatch.replace("/counter", new Node().value(99))); - return WorkflowStepResult.none(); - } - }; - SequentialWorkflowRunner runner = runner(metrics, - new TerminateProcessingStepExecutor(metrics), forbiddenPatch); - Fixture fixture = fixture(runner, - terminateStep("finished"), - updateStep("replace", "/counter", new Node().value(99))); - - DocumentProcessingResult result = fixture.process(); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals(0, patchExecutions.get(), - "no patch-producing step may execute after terminal scope work"); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - fixture.assertOneWorkflowScopeReleased(); - assertEquals(1L, metrics.declarativeTerminationSteps()); - } - - @Test - void computeResultValidationFailureClosesWorkingDocument() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = SequentialWorkflowRunner.withBexEngine( - BexEngine.builder().build(), 100_000L, metrics); - Fixture fixture = fixture(runner, invalidComputeResultStep()); - - DocumentProcessingResult result = fixture.process(); - - assertRuntimeFatal(result, "changeset must be a list"); - fixture.assertNoTransientSequenceLeak(); - assertEquals(1L, metrics.computeResultValidationFailures()); - } - - @Test - void patchPreviewFailureClosesWorkingDocument() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = SequentialWorkflowRunner.withBexEngine( - BexEngine.builder().build(), 100_000L, metrics); - Fixture fixture = fixture(runner, - updateStep("add", "/counter/child", new Node().value(1))); - - DocumentProcessingResult result = fixture.process(); - - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - fixture.assertNoTransientSequenceLeak(); - assertEquals(BigInteger.ZERO, result.document().get("/counter")); - } - - @Test - void patchApplicationFailureAfterPreviewReleasesEverySequenceScope() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - final TrackingSnapshotManager snapshotManager = new TrackingSnapshotManager(); - WorkflowStepExecutor previewThenFail = - new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, - StepExecutionContext context) { - List patches = Collections.singletonList( - JsonPatch.replace("/counter", new Node().value(7))); - WorkingDocument.Preview preview = context.advanceWorkingDocument(patches); - snapshotManager.failNextCacheSnapshot = true; - context.processorContext().applyPreviewedPatches(patches, preview); - return WorkflowStepResult.none(); - } - }; - Fixture fixture = fixture(runner(metrics, previewThenFail), - snapshotManager, - triggerStep()); - - DocumentProcessingResult result = fixture.process(); - - assertRuntimeFatal(result, "simulated final cache failure"); - fixture.assertNoTransientSequenceLeak(); - assertTrue(fixture.snapshotManager.openCalls() >= 2, - "preview preparation and transferred application both own scopes"); - } - - @Test - void transferredPreviewRemainsValidAfterWorkflowWorkingDocumentCloses() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = SequentialWorkflowRunner.withBexEngine( - BexEngine.builder().build(), 100_000L, metrics); - Fixture fixture = fixture(runner, - updateStep("replace", "/counter", new Node().value(7))); - - DocumentProcessingResult result = fixture.process(); - - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals(BigInteger.valueOf(7), result.document().get("/counter"), - "the processor must consume the transferred preview after runner closure"); - fixture.assertNoTransientSequenceLeak(); - assertEquals(fixture.snapshotManager.openCalls(), fixture.snapshotManager.releaseCalls()); - } - - @Test - void tenThousandShortWorkflowsDoNotAccumulateTransientSequenceState() { - BexProcessingMetrics metrics = new BexProcessingMetrics(); - SequentialWorkflowRunner runner = runner(metrics, noOpExecutor()); - Fixture fixture = fixture(runner, triggerStep()); - - for (int i = 0; i < 10_000; i++) { - DocumentProcessingResult result = fixture.process(); - assertEquals(ProcessorStatus.SUCCESS, result.status(), result.failureReason()); - assertEquals(0, fixture.snapshotManager.activeScopes(), - "transient scope leak after repetition " + i); - } - - assertEquals(10_000, fixture.snapshotManager.openCalls()); - assertEquals(10_000, fixture.snapshotManager.releaseCalls()); - assertEquals(10_000L, metrics.workflowDocumentViewsFromFrozen()); - assertEquals(0L, metrics.workflowDocumentViewsFromDocument()); - } - - private static WorkflowStepExecutor frozenObservingExecutor() { - return new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - assertFalse(context.workingDocument().usedMaterializedFallback()); - return WorkflowStepResult.none(); - } - }; - } - - private static WorkflowStepExecutor noOpExecutor() { - return new WorkflowStepExecutor() { - @Override - public boolean supports(SequentialWorkflowStep step) { - return step instanceof TriggerEvent; - } - - @Override - public WorkflowStepResult execute(TriggerEvent step, StepExecutionContext context) { - return WorkflowStepResult.none(); - } - }; - } - - @SafeVarargs - private static SequentialWorkflowRunner runner( - BexProcessingMetrics metrics, - WorkflowStepExecutor... executors) { - return new SequentialWorkflowRunner(Arrays.asList(executors), metrics, 32, 1_000_000L); - } - - private static Fixture fixture(SequentialWorkflowRunner runner, Node... steps) { - return fixture(runner, new TrackingSnapshotManager(), steps); - } - - private static Fixture fixture(SequentialWorkflowRunner runner, - TrackingSnapshotManager snapshotManager, - Node... steps) { - DocumentProcessor.Builder builder = DocumentProcessor.builder() - .withSnapshotManager(snapshotManager); - CoordinationProcessors.configure(builder, - CoordinationProcessorOptions.builder() - .sequentialWorkflowRunner(runner) - .build()); - DocumentProcessor processor = builder - .registerContractProcessor(new LifecycleChannelProcessor()) - .build(); - DocumentProcessingResult initialized = processor.initializeDocument(document(steps)); - assertEquals(ProcessorStatus.SUCCESS, initialized.status(), initialized.failureReason()); - snapshotManager.resetLifecycleCounters(); - return new Fixture(processor, initialized.document(), snapshotManager); - } - - private static Node document(Node... steps) { - Map contracts = new LinkedHashMap(); - contracts.put("channel", typed(CHANNEL_BLUE_ID)); - contracts.put("workflow", typed(SequentialWorkflow.blueId()) - .properties("channel", new Node().value("channel")) - .properties("steps", new Node().items(Arrays.asList(steps)))); - return new Node() - .properties("counter", new Node().value(0)) - .properties("contracts", new Node().properties(contracts)); - } - - private static Node triggerStep() { - return typed(TriggerEvent.blueId()); - } - - private static Node terminateStep(String reason) { - return typed(TerminateProcessing.blueId()) - .properties("reason", new Node().value(reason)); - } - - private static Node updateStep(String op, String path, Node value) { - return typed(UpdateDocument.blueId()) - .properties("changeset", new Node().items(new Node() - .properties("op", new Node().value(op)) - .properties("path", new Node().value(path)) - .properties("val", value))); - } - - private static Node invalidComputeResultStep() { - return typed(Compute.blueId()) - .properties("do", new Node().items(new Node() - .properties("$return", new Node() - .properties("changeset", new Node().value("not-a-list"))))); - } - - private static Node typed(String blueId) { - return new Node().type(new Node().blueId(blueId)); - } - - private static void assertRuntimeFatal(DocumentProcessingResult result, String message) { - assertEquals(ProcessorStatus.RUNTIME_FATAL, result.status(), result.failureReason()); - assertTrue(result.failureReason() != null && result.failureReason().contains(message), - result.failureReason()); - } - - private static final class Fixture { - private final DocumentProcessor processor; - private final Node initializedDocument; - private final TrackingSnapshotManager snapshotManager; - - private Fixture(DocumentProcessor processor, - Node initializedDocument, - TrackingSnapshotManager snapshotManager) { - this.processor = processor; - this.initializedDocument = initializedDocument; - this.snapshotManager = snapshotManager; - } - - private DocumentProcessingResult process() { - return processor.processDocument(initializedDocument, new Node() - .properties("id", new Node().value("run"))); - } - - private void assertOneWorkflowScopeReleased() { - assertEquals(1, snapshotManager.openCalls()); - assertEquals(1, snapshotManager.releaseCalls()); - assertNoTransientSequenceLeak(); - } - - private void assertNoTransientSequenceLeak() { - assertEquals(0, snapshotManager.activeScopes()); - assertEquals(snapshotManager.openCalls(), snapshotManager.releaseCalls()); - } - } - - @TypeBlueId(CHANNEL_BLUE_ID) - public static final class LifecycleChannel extends ChannelContract { - } - - private static final class LifecycleChannelProcessor - implements ChannelProcessor { - @Override - public Class contractType() { - return LifecycleChannel.class; - } - - @Override - public boolean matches(LifecycleChannel contract, ChannelEvaluationContext context) { - return context.event() != null; - } - - @Override - public String eventId(LifecycleChannel contract, ChannelEvaluationContext context) { - Object id = context.event().get("/id"); - return id != null ? String.valueOf(id) : "run"; - } - } - - /** Real Language snapshot transaction seam with deterministic scope accounting. */ - private static final class TrackingSnapshotManager implements ProcessingSnapshotManager { - private int openCalls; - private int releaseCalls; - private int activeScopes; - private boolean failNextCacheSnapshot; - - @Override - public ResolvedSnapshot fromDocument(Node document) { - FrozenNode canonical = FrozenNode.fromUncheckedCanonicalNode(document.clone()); - return new ResolvedSnapshot(canonical, - FrozenNode.fromResolvedNode(document.clone()), - canonical.blueId()); - } - - @Override - public ResolvedSnapshot fromDocumentTransient(Node document) { - return fromDocument(document); - } - - @Override - public ResolvedSnapshot applyPatch(ResolvedSnapshot snapshot, JsonPatch patch) { - CanonicalPatchResult patched = snapshot.applyCanonicalPatch(patch); - return new ResolvedSnapshot(patched.root(), - FrozenNode.fromResolvedNode(patched.root().toNode()), - patched.blueId()); - } - - @Override - public ResolvedSnapshot cacheSnapshot(ResolvedSnapshot snapshot) { - if (failNextCacheSnapshot) { - failNextCacheSnapshot = false; - throw new IllegalStateException("simulated final cache failure"); - } - return snapshot; - } - - @Override - public ProcessingSnapshotManager transientSequence() { - openCalls++; - activeScopes++; - return new TrackingScope(this); - } - - private int openCalls() { - return openCalls; - } - - private int releaseCalls() { - return releaseCalls; - } - - private int activeScopes() { - return activeScopes; - } - - private void resetLifecycleCounters() { - assertEquals(openCalls, releaseCalls, "initialization must release transient scopes"); - assertEquals(0, activeScopes, "initialization must leave no transient scope"); - openCalls = 0; - releaseCalls = 0; - } - } - - private static final class TrackingScope implements ProcessingSnapshotManager { - private final TrackingSnapshotManager owner; - private boolean released; - - private TrackingScope(TrackingSnapshotManager owner) { - this.owner = owner; - } - - @Override - public ResolvedSnapshot fromDocument(Node document) { - return owner.fromDocument(document); - } - - @Override - public ResolvedSnapshot fromDocumentTransient(Node document) { - return owner.fromDocument(document); - } - - @Override - public ResolvedSnapshot applyPatch(ResolvedSnapshot snapshot, JsonPatch patch) { - return owner.applyPatch(snapshot, patch); - } - - @Override - public ResolvedSnapshot cacheSnapshot(ResolvedSnapshot snapshot) { - return owner.cacheSnapshot(snapshot); - } - - @Override - public ProcessingSnapshotManager transientSequence() { - return this; - } - - @Override - public ProcessingSnapshotManager forkTransientSequence() { - return owner.transientSequence(); - } - - @Override - public void releaseTransientState() { - if (!released) { - released = true; - owner.releaseCalls++; - owner.activeScopes--; - } - } - } -} diff --git a/src/test/java/blue/coordination/processor/workflow/StaticUpdatePlanTest.java b/src/test/java/blue/coordination/processor/workflow/StaticUpdatePlanTest.java index dfbb95e..3c677f9 100644 --- a/src/test/java/blue/coordination/processor/workflow/StaticUpdatePlanTest.java +++ b/src/test/java/blue/coordination/processor/workflow/StaticUpdatePlanTest.java @@ -2,8 +2,9 @@ import blue.coordination.processor.bex.BexProcessingMetrics; import blue.language.model.Node; -import blue.language.processor.model.FrozenJsonPatch; +import blue.language.processor.FrozenJsonPatch; import blue.language.snapshot.FrozenNode; +import blue.language.identity.DirectBlueIdCalculator; import org.junit.jupiter.api.Test; import java.util.Arrays; @@ -15,37 +16,65 @@ class StaticUpdatePlanTest { @Test - void compilesOrderedFrozenTemplatesWithoutRetainingMutableValues() { + void shouldCompileOrderedFrozenTemplatesWithoutRetainingMutableValues() { + // given Node value = new Node().properties("status", new Node().value("authored")); Node changeset = new Node().items(Arrays.asList( patch("add", "/added", value), patch("replace", "/replaced", new Node().value(2)), patch("remove", "/removed", null))); + // when StaticUpdatePlan plan = StaticUpdatePlan.compile(FrozenNode.fromNode(changeset)); value.getProperties().get("status").value("mutated"); + // then assertTrue(plan.valid()); assertEquals(3, plan.patches().size()); FrozenJsonPatch first = plan.patches().get(0).bind("/scope/added"); assertEquals(blue.language.processor.model.JsonPatch.Op.ADD, first.getOp()); assertEquals("/scope/added", first.getPath()); - assertEquals("authored", first.getVal().getProperties().get("status").getValue()); - assertTrue(first.getVal().isStrictCanonical()); + assertEquals("authored", first.getValue().getProperties().get("status").getValue()); + assertTrue(first.getValue().isStrictCanonical()); assertTrue(plan.approximateWeightBytes() > 0L); } @Test - void resolvedConstructionFallbackCanonicalizesExactlyOnceAtPlanCompilation() { + void shouldEstimateRetainedExactValueWeightWithoutTraversingPayload() { + // given + Node largeValue = new Node().value("leaf"); + for (int index = 0; index < 128; index++) { + largeValue = new Node().properties("nested", largeValue); + } + + // when + StaticUpdatePlan small = compile( + patch("add", "/value", new Node().value("small"))); + StaticUpdatePlan large = compile( + patch("add", "/value", largeValue)); + + // then + assertTrue(small.valid()); + assertTrue(large.valid()); + assertEquals( + small.approximateWeightBytes(), + large.approximateWeightBytes()); + } + + @Test + void shouldCanonicalizeResolvedFallbackExactlyOnceDuringPlanCompilation() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); Node changeset = new Node().items(patch("add", "/value", new Node().properties("nested", new Node().value("authored")))); + // when StaticUpdatePlan plan = StaticUpdatePlan.compile( FrozenNode.fromResolvedNode(changeset), metrics); FrozenJsonPatch first = plan.patches().get(0).bind("/scope/value"); FrozenJsonPatch second = plan.patches().get(0).bind("/other/value"); + // then assertTrue(first.getValue().isStrictCanonical()); assertTrue(second.getValue().isStrictCanonical()); assertEquals(first.getValue().blueId(), second.getValue().blueId()); @@ -53,55 +82,179 @@ void resolvedConstructionFallbackCanonicalizesExactlyOnceAtPlanCompilation() { } @Test - void removeIgnoresResolvedOnlyValueWithoutCanonicalizingIt() { + void shouldRemoveProviderProvenanceFromResolvedPatchValue() { + // given + Node authoredValue = new Node().value(3); + String valueBlueId = + DirectBlueIdCalculator.calculateBlueId( + authoredValue); + Node resolvedValue = + authoredValue.clone() + .blueId(valueBlueId); + FrozenNode resolvedChangeset = + FrozenNode.fromResolvedNode( + new Node().items( + patch( + "replace", + "/state", + resolvedValue))); + + // when + StaticUpdatePlan plan = + StaticUpdatePlan.compile( + resolvedChangeset); + FrozenNode exactValue = + plan.patches().get(0) + .bind("/state") + .getValue(); + Node exactNode = + exactValue.toNode(); + + // then + assertTrue(plan.valid()); + assertTrue(exactValue.isStrictCanonical()); + assertEquals(valueBlueId, exactValue.blueId()); + assertFalse( + exactNode.getBlueId() != null + && !exactNode.isReferenceOnly(), + "runtime output must not combine provider provenance " + + "with expanded exact content"); + } + + @Test + void shouldCompileExactRemoveOperationWithAbsentValue() { + // given BexProcessingMetrics metrics = new BexProcessingMetrics(); - Node irrelevantResolvedValue = new Node() + + // when + StaticUpdatePlan exact = StaticUpdatePlan.compile( + FrozenNode.fromResolvedNode(new Node().items( + patch("remove", "/removed", null))), metrics); + + // then + assertTrue(exact.valid()); + assertEquals(blue.language.processor.model.JsonPatch.Op.REMOVE, + exact.patches().get(0).bind("/scope/removed").getOp()); + assertEquals(0L, metric(metrics, "staticUpdateResolvedValueCanonicalizations")); + } + + @Test + void shouldRejectRemoveOperationWithAuthoredValue() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); + Node forbiddenResolvedValue = new Node() .blueId("GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC") - .properties("expanded", new Node().value("ignored")); - Node changeset = new Node().items( - patch(" REMOVE ", "/removed", irrelevantResolvedValue)); + .properties("expanded", new Node().value("forbidden")); - StaticUpdatePlan plan = StaticUpdatePlan.compile( - FrozenNode.fromResolvedNode(changeset), metrics); - FrozenJsonPatch patch = plan.patches().get(0).bind("/scope/removed"); + // when + StaticUpdatePlan withValue = StaticUpdatePlan.compile( + FrozenNode.fromResolvedNode(new Node().items( + patch("remove", "/removed", forbiddenResolvedValue))), metrics); - assertTrue(plan.valid()); - assertEquals(blue.language.processor.model.JsonPatch.Op.REMOVE, patch.getOp()); + // then + assertEquals("Update Document patch value must be absent for remove", + withValue.validationFailure()); + assertEquals(0L, metric(metrics, "staticUpdateResolvedValueCanonicalizations")); + } + + @Test + void shouldRejectNonCanonicalRemoveOperationText() { + // given + BexProcessingMetrics metrics = new BexProcessingMetrics(); + + // when + StaticUpdatePlan nonCanonicalOp = StaticUpdatePlan.compile( + FrozenNode.fromResolvedNode(new Node().items( + patch(" REMOVE ", "/removed", null))), metrics); + + // then + assertEquals("Unsupported Update Document patch operation: REMOVE ", + nonCanonicalOp.validationFailure()); assertEquals(0L, metric(metrics, "staticUpdateResolvedValueCanonicalizations")); } @Test - void rejectsBexOperatorsAndMalformedStaticEntriesBeforeCaching() { - StaticUpdatePlan bex = compile(patch("replace", "/status", - new Node().properties("$binding", new Node().value("event")))); - StaticUpdatePlan missingValue = compile(patch("replace", "/status", null)); - StaticUpdatePlan badOperation = compile(patch("move", "/status", new Node().value("x"))); - StaticUpdatePlan scalarEntry = StaticUpdatePlan.compile(FrozenNode.fromResolvedNode( - new Node().items(new Node().value("not-a-patch")))); - - assertFalse(bex.valid()); - assertTrue(bex.validationFailure().contains("must be static")); + void shouldPreserveDollarPrefixedLiteralValues() { + // given + Node patch = patch("replace", "/status", + new Node().properties("$binding", new Node().value("event"))); + + // when + StaticUpdatePlan literal = compile(patch); + + // then + assertTrue(literal.valid()); + assertEquals("event", + literal.patches().get(0).bind("/status") + .getValue().property("$binding").getValue()); + } + + @Test + void shouldRejectReplaceOperationWithoutValue() { + // given + Node patch = patch("replace", "/status", null); + + // when + StaticUpdatePlan missingValue = compile(patch); + + // then assertEquals("Update Document patch value is required for operation: replace", missingValue.validationFailure()); + } + + @Test + void shouldRejectUnsupportedPatchOperation() { + // given + Node patch = patch("move", "/status", new Node().value("x")); + + // when + StaticUpdatePlan badOperation = compile(patch); + + // then assertEquals("Unsupported Update Document patch operation: move", badOperation.validationFailure()); + } + + @Test + void shouldRejectScalarChangesetEntry() { + // given + FrozenNode changeset = FrozenNode.fromResolvedNode( + new Node().items(new Node().value("not-a-patch"))); + + // when + StaticUpdatePlan scalarEntry = StaticUpdatePlan.compile(changeset); + + // then assertEquals("Update Document changeset entry 0 must be a static patch object", scalarEntry.validationFailure()); } @Test - void rejectsNonTextFieldsAndNonListPayloadsWithStableDiagnostics() { + void shouldRejectNonTextPatchFieldsWithStableDiagnostic() { + // given Node nonText = new Node().properties("op", new Node().value(1)) .properties("path", new Node().value("/status")) .properties("val", new Node().value("x")); + // when StaticUpdatePlan badField = StaticUpdatePlan.compile(FrozenNode.fromResolvedNode( new Node().items(nonText))); - StaticUpdatePlan notList = StaticUpdatePlan.compile(FrozenNode.fromResolvedNode( - new Node().properties("op", new Node().value("replace")))); + // then assertEquals("Update Document changeset entry 0 field 'op' must be text", badField.validationFailure()); + } + + @Test + void shouldRejectNonListChangesetWithStableDiagnostic() { + // given + FrozenNode changeset = FrozenNode.fromResolvedNode( + new Node().properties("op", new Node().value("replace"))); + + // when + StaticUpdatePlan notList = StaticUpdatePlan.compile(changeset); + + // then assertEquals("Update Document changeset must be a static patch list", notList.validationFailure()); } diff --git a/src/test/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHostTest.java b/src/test/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHostTest.java new file mode 100644 index 0000000..cfca510 --- /dev/null +++ b/src/test/java/blue/coordination/processor/workflow/WorkflowBexGasLedgerHostTest.java @@ -0,0 +1,252 @@ +package blue.coordination.processor.workflow; + +import blue.bex.gas.BexGasCounter; +import blue.bex.gas.BexGasLedgerCapability; +import blue.bex.gas.BexGasLimitExceededException; +import blue.bex.gas.BexGasMeter; +import blue.bex.gas.BexGasSchedule; +import blue.bex.gas.BexSharedGasBudget; +import blue.language.processor.GasLimitExceededException; +import blue.language.processor.GasMeter; +import blue.language.processor.GasSchedule; +import blue.language.processor.ProcessorErrorCategory; +import blue.language.processor.ProcessorFailureException; +import blue.language.processor.RuntimeWorkSession; +import blue.language.processor.RuntimeWorkSessionTestSupport; + +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +final class WorkflowBexGasLedgerHostTest { + + @Test + void shouldPropagateParentBoundExhaustionAfterEarlierCompute() { + // given + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 10L); + RuntimeWorkSession session = + RuntimeWorkSessionTestSupport.processing(parent); + WorkflowBexGasLedgerHost host = + new WorkflowBexGasLedgerHost(session); + BexGasSchedule schedule = BexGasSchedule.defaults(); + BexSharedGasBudget firstBudget = + host.openSharedBudget(100L); + BexGasLedgerCapability firstLedger = + host.open( + BexGasCounter.NAMESPACE, + schedule.counterWeights(), + firstBudget); + BexGasMeter first = + BexGasMeter.hostedWithSharedLocalLimit( + schedule, + Collections.singletonMap( + BexGasCounter.NAMESPACE, + firstLedger), + 100L, + Collections.emptyMap()); + first.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 4L); + first.submitHostLedger(host::submit); + + BexSharedGasBudget secondBudget = + host.openSharedBudget(100L); + BexGasLedgerCapability secondLedger = + host.open( + BexGasCounter.NAMESPACE, + schedule.counterWeights(), + secondBudget); + BexGasMeter second = + BexGasMeter.hostedWithSharedLocalLimit( + schedule, + Collections.singletonMap( + BexGasCounter.NAMESPACE, + secondLedger), + 100L, + Collections.emptyMap()); + second.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 4L); + BexGasLimitExceededException local = + assertThrows( + BexGasLimitExceededException.class, + () -> second.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 3L)); + // when + GasLimitExceededException propagated = + assertThrows( + GasLimitExceededException.class, + () -> second.propagateHostGasExhaustion( + local.hostGasExhaustion(), + host::failedDeterministically, + host::propagateGasExhaustion)); + host.submitToParent(); + + // then + assertNotSame(firstLedger, secondLedger); + assertEquals( + "bex.workflow.00000000.compute.00000001", + propagated.namespace()); + assertEquals( + BexGasCounter.EXPRESSION_EVALUATED + .canonicalName(), + propagated.counter()); + assertEquals(3L, propagated.quantity()); + assertEquals(4L, propagated.admittedGas()); + assertEquals(6L, propagated.effectiveBudget()); + assertEquals(8L, parent.totalGas()); + assertEquals(2, parent.trace().size()); + assertEquals(4L, parent.trace().get(0).quantity()); + assertEquals(4L, parent.trace().get(1).quantity()); + } + + @Test + void shouldPropagateSharedLocalExhaustionAfterIntrinsicGas() { + // given + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 100L); + RuntimeWorkSession session = + RuntimeWorkSessionTestSupport.processing(parent); + WorkflowBexGasLedgerHost host = + new WorkflowBexGasLedgerHost(session); + BexGasSchedule schedule = BexGasSchedule.defaults(); + BexSharedGasBudget sharedBudget = + host.openSharedBudget(10L); + BexGasLedgerCapability primary = + host.open( + BexGasCounter.NAMESPACE, + schedule.counterWeights(), + sharedBudget); + Map intrinsicWeights = + Collections.singletonMap( + "operation", + Long.valueOf(1L)); + BexGasLedgerCapability intrinsic = + host.open( + "test-intrinsic", + intrinsicWeights, + sharedBudget); + Map children = + new LinkedHashMap< + String, + BexGasLedgerCapability>(); + children.put(BexGasCounter.NAMESPACE, primary); + children.put("test-intrinsic", intrinsic); + Map registered = + Collections.singletonMap( + BexGasMeter.qualifiedCounterName( + "test-intrinsic", + "operation"), + Long.valueOf(1L)); + BexGasMeter meter = + BexGasMeter.hostedWithSharedLocalLimit( + schedule, + children, + 10L, + registered); + meter.chargeNamed( + "test-intrinsic", + "operation", + 4L); + meter.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 4L); + BexGasLimitExceededException local = + assertThrows( + BexGasLimitExceededException.class, + () -> meter.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 3L)); + // when + GasLimitExceededException propagated = + assertThrows( + GasLimitExceededException.class, + () -> meter.propagateHostGasExhaustion( + local.hostGasExhaustion(), + host::failedDeterministically, + host::propagateGasExhaustion)); + host.submitToParent(); + + // then + assertEquals( + "bex.workflow.00000000.compute.00000000", + propagated.namespace()); + assertEquals(8L, propagated.admittedGas()); + assertEquals(10L, propagated.effectiveBudget()); + assertEquals(8L, parent.totalGas()); + assertEquals(2, parent.trace().size()); + assertEquals( + "bex.workflow.00000000.compute.00000000", + parent.trace().get(0).namespace()); + assertEquals( + "bex.workflow.00000000.compute.00000000/test-intrinsic", + parent.trace().get(1).namespace()); + assertEquals(4L, parent.trace().get(0).quantity()); + assertEquals(4L, parent.trace().get(1).quantity()); + } + + @Test + void shouldKeepStrictLocalBexLimitAsDeterministicFailure() { + // given + GasMeter parent = new GasMeter( + GasSchedule.contracts10(), + 100L); + RuntimeWorkSession session = + RuntimeWorkSessionTestSupport.processing(parent); + WorkflowBexGasLedgerHost host = + new WorkflowBexGasLedgerHost(session); + BexGasSchedule schedule = BexGasSchedule.defaults(); + BexGasLedgerCapability ledger = + host.open( + BexGasCounter.NAMESPACE, + schedule.counterWeights()); + BexGasMeter meter = + new BexGasMeter( + schedule, + ledger, + 5L); + meter.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 4L); + BexGasLimitExceededException local = + assertThrows( + BexGasLimitExceededException.class, + () -> meter.charge( + BexGasCounter.EXPRESSION_EVALUATED, + 2L)); + meter.failHostLedger( + host::failedDeterministically); + + // when + RuntimeException mapped = + host.localGasLimitExceeded( + local, + local); + host.submitToParent(); + RuntimeWorkSessionTestSupport + .failDeterministically(session); + + // then + assertTrue(mapped instanceof ProcessorFailureException); + ProcessorFailureException failure = + (ProcessorFailureException) mapped; + assertEquals( + ProcessorErrorCategory.GasLimitExceeded, + failure.errorCategory()); + assertSame(local, failure.getCause()); + assertEquals(4L, parent.totalGas()); + assertEquals(1, parent.trace().size()); + } +} diff --git a/src/test/java/blue/coordination/processor/workflow/WorkflowExecutionStateTest.java b/src/test/java/blue/coordination/processor/workflow/WorkflowExecutionStateTest.java index 6f2e192..34794f6 100644 --- a/src/test/java/blue/coordination/processor/workflow/WorkflowExecutionStateTest.java +++ b/src/test/java/blue/coordination/processor/workflow/WorkflowExecutionStateTest.java @@ -14,15 +14,18 @@ class WorkflowExecutionStateTest { @Test - void snapshotViewsAreStableOrderedAndReadOnly() { + void shouldKeepSnapshotViewsStableAndOrdered() { + // given WorkflowExecutionState state = new WorkflowExecutionState(); WorkflowExecutionState.Snapshot empty = state.snapshotView(); + // when state.record("First", "a", false); WorkflowExecutionState.Snapshot afterFirst = state.snapshotView(); state.record("Second", "b", true); WorkflowExecutionState.Snapshot afterSecond = state.snapshotView(); + // then assertTrue(empty.results().isEmpty()); assertEquals(Arrays.asList("First"), new ArrayList(afterFirst.results().keySet())); assertEquals("a", afterFirst.results().get("First")); @@ -31,25 +34,44 @@ void snapshotViewsAreStableOrderedAndReadOnly() { assertEquals(Arrays.asList("First", "Second"), new ArrayList(afterSecond.results().keySet())); assertTrue(afterSecond.wasChangesetHandled("Second")); + } + @Test + void shouldExposeReadOnlySnapshotResultMaps() { + // given + WorkflowExecutionState state = new WorkflowExecutionState(); + WorkflowExecutionState.Snapshot empty = state.snapshotView(); + state.record("First", "a", false); + WorkflowExecutionState.Snapshot populated = state.snapshotView(); + + // when + Runnable clearEmpty = () -> empty.results().clear(); + Runnable addResult = () -> populated.results().put("Other", "value"); + Runnable removeResult = () -> populated.results().remove("missing"); + + // then assertThrows(UnsupportedOperationException.class, - () -> empty.results().clear()); + clearEmpty::run); assertThrows(UnsupportedOperationException.class, - () -> afterFirst.results().put("Other", "value")); + addResult::run); assertThrows(UnsupportedOperationException.class, - () -> afterSecond.results().remove("missing")); + removeResult::run); } @Test - void duplicateKeysPreserveEarlierViewsNullValuesAndFirstInsertionOrder() { + void shouldPreserveEarlierViewsNullValuesAndFirstInsertionOrderForDuplicateKeys() { + // given WorkflowExecutionState state = new WorkflowExecutionState(); state.record("Repeated", "first", false); WorkflowExecutionState.Snapshot beforeOverwrite = state.snapshotView(); + + // when state.record("Other", "other", false); state.record("Repeated", null, true); WorkflowExecutionState.Snapshot afterOverwrite = state.snapshotView(); state.record("Repeated", "third", false); + // then assertEquals("first", beforeOverwrite.results().get("Repeated")); assertFalse(beforeOverwrite.wasChangesetHandled("Repeated")); assertEquals(Arrays.asList("Repeated", "Other"), @@ -61,10 +83,13 @@ void duplicateKeysPreserveEarlierViewsNullValuesAndFirstInsertionOrder() { } @Test - void oneThousandStepViewsRetainTheirPrefixWithoutMapCopies() { + void shouldRetainSnapshotPrefixesAcrossOneThousandSteps() { + // given WorkflowExecutionState state = new WorkflowExecutionState(); List retained = new ArrayList(1001); + + // when for (int i = 0; i <= 1000; i++) { retained.add(state.snapshotView()); if (i < 1000) { @@ -72,6 +97,7 @@ void oneThousandStepViewsRetainTheirPrefixWithoutMapCopies() { } } + // then assertEquals(0, retained.get(0).size()); assertEquals(500, retained.get(500).size()); assertEquals(Integer.valueOf(499), retained.get(500).get("Step500")); diff --git a/src/test/java/blue/coordination/processor/workflow/WorkflowPatchEntryTest.java b/src/test/java/blue/coordination/processor/workflow/WorkflowPatchEntryTest.java index edcd796..77f4094 100644 --- a/src/test/java/blue/coordination/processor/workflow/WorkflowPatchEntryTest.java +++ b/src/test/java/blue/coordination/processor/workflow/WorkflowPatchEntryTest.java @@ -5,52 +5,66 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertTrue; class WorkflowPatchEntryTest { @Test - void legacyMutableValueIsDefensivelyFrozenOnceAtTheBoundary() { + void shouldDefensivelyFreezeLegacyMutableValueAtTheBoundary() { + // given Node callerOwned = new Node().properties("status", new Node().value("before")); + // when WorkflowPatchEntry entry = new WorkflowPatchEntry("add", "/payload", callerOwned); callerOwned.getProperties().get("status").value("after"); + // then assertTrue(entry.val().isStrictCanonical()); assertEquals("before", entry.val().getProperties().get("status").getValue()); } @Test - void strictFrozenValueIsRetainedWithoutMaterialization() { + void shouldRetainStrictFrozenValueWithoutMaterialization() { + // given FrozenNode authored = FrozenNode.fromNode(new Node().value("authored")); + // when WorkflowPatchEntry entry = new WorkflowPatchEntry("replace", "/payload", authored); + // then assertSame(authored, entry.val()); } @Test - void resolvedFrozenCompatibilityValueIsCanonicalizedAtConstruction() { + void shouldCanonicalizeResolvedFrozenCompatibilityValueAtConstruction() { + // given FrozenNode resolved = FrozenNode.fromResolvedNode(new Node() .properties("status", new Node().value("resolved-shape"))); + // when WorkflowPatchEntry entry = new WorkflowPatchEntry("add", "/payload", resolved); + // then assertTrue(entry.val().isStrictCanonical()); assertEquals("resolved-shape", entry.val().getProperties().get("status").getValue()); } @Test - void removeIgnoresCallerOwnedValueWithoutFreezingIt() { - Node irrelevantValue = new Node() - .blueId("GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC") - .properties("expanded", new Node().value("ignored")); + void shouldPreserveRemoveValueForExactShapeValidation() { + // given + Node forbiddenValue = new Node() + .properties("expanded", new Node().value("forbidden")); + // when WorkflowPatchEntry entry = new WorkflowPatchEntry( - " REMOVE ", "/payload", irrelevantValue); + "remove", "/payload", forbiddenValue); + forbiddenValue.getProperties().get("expanded").value("mutated"); - assertNull(entry.val()); + // then + assertEquals("remove", entry.op()); + assertTrue(entry.val().isStrictCanonical()); + assertEquals("forbidden", + entry.val().getProperties().get("expanded").getValue()); } } diff --git a/src/test/java/blue/language/processor/ChannelEvaluationContextFactory.java b/src/test/java/blue/language/processor/ChannelEvaluationContextFactory.java deleted file mode 100644 index d86b52b..0000000 --- a/src/test/java/blue/language/processor/ChannelEvaluationContextFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -package blue.language.processor; - -import blue.language.model.Node; -import blue.language.processor.model.ChannelContract; -import blue.language.processor.model.MarkerContract; -import java.util.Map; - -public final class ChannelEvaluationContextFactory { - private ChannelEvaluationContextFactory() { - } - - @SafeVarargs - public static ChannelEvaluationContext create(String bindingKey, - Node event, - Map channels, - Map markers, - ChannelProcessor... processors) { - ContractProcessorRegistry registry = new ContractProcessorRegistry(); - if (processors != null) { - for (ChannelProcessor processor : processors) { - register(registry, processor); - } - } - return new ChannelEvaluationContext("/", bindingKey, event, null, channels, markers, registry); - } - - @SuppressWarnings({"rawtypes", "unchecked"}) - private static void register(ContractProcessorRegistry registry, ChannelProcessor processor) { - registry.registerChannel(processor); - } -} diff --git a/src/test/java/blue/language/processor/HandlerMatchContextFactory.java b/src/test/java/blue/language/processor/HandlerMatchContextFactory.java deleted file mode 100644 index 94b5680..0000000 --- a/src/test/java/blue/language/processor/HandlerMatchContextFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package blue.language.processor; - -import blue.language.Blue; -import blue.language.model.Node; -import blue.language.processor.model.MarkerContract; -import java.util.Collections; -import java.util.Map; - -public final class HandlerMatchContextFactory { - private HandlerMatchContextFactory() { - } - - public static HandlerMatchContext create(Blue blue, - String handlerKey, - String channelKey, - Node event) { - Map markers = Collections.emptyMap(); - return new HandlerMatchContext("/", - handlerKey, - channelKey, - event, - markers, - new ContractMatchingService(blue)); - } -} diff --git a/src/test/java/blue/language/processor/RuntimeWorkSessionTestSupport.java b/src/test/java/blue/language/processor/RuntimeWorkSessionTestSupport.java new file mode 100644 index 0000000..ea0bd92 --- /dev/null +++ b/src/test/java/blue/language/processor/RuntimeWorkSessionTestSupport.java @@ -0,0 +1,26 @@ +package blue.language.processor; + +/** + * Test-only access to the package-owned runtime-work lifecycle. + */ +public final class RuntimeWorkSessionTestSupport { + private RuntimeWorkSessionTestSupport() { + } + + public static RuntimeWorkSession processing( + GasMeter parent) { + return new RuntimeWorkSession( + parent, + RuntimeWorkSession.Mode.PROCESSING); + } + + public static void complete( + RuntimeWorkSession session) { + session.complete(); + } + + public static void failDeterministically( + RuntimeWorkSession session) { + session.failDeterministically(); + } +} diff --git a/src/test/resources/coordination/compute/bex-counter-persistence.yaml b/src/test/resources/coordination/compute/bex-counter-persistence.yaml deleted file mode 100644 index c5cc883..0000000 --- a/src/test/resources/coordination/compute/bex-counter-persistence.yaml +++ /dev/null @@ -1,32 +0,0 @@ -name: Persistent BEX Counter -counter: 0 -contracts: - ownerChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: owner - actor: - type: Coordination/Principal Actor - increment: - type: Coordination/Sequential Workflow Operation - channel: ownerChannel - steps: - - name: BuildPatch - type: Coordination/Compute - do: - - $appendChange: - op: replace - path: /counter - val: - $add: - - $document: /counter - - $binding: - name: event - path: /message/request - - $return: - changeset: - $changeset: true - events: - $events: true diff --git a/src/test/resources/coordination/compute/dynamic-embedded-participants-bex.yaml b/src/test/resources/coordination/compute/dynamic-embedded-participants-bex.yaml deleted file mode 100644 index b0e4521..0000000 --- a/src/test/resources/coordination/compute/dynamic-embedded-participants-bex.yaml +++ /dev/null @@ -1,311 +0,0 @@ -name: Dynamic Embedded Participants -# Root counters. Alice creates embedded participant documents, embedded participants emit chat -# messages, and Bob checks whether the root document has seen enough messages. -nextEmbeddedNumber: 0 -chatMessagesSeen: 0 -embeddedTimelineEventsSeen: 0 -success: false -# Generic embedded document template. createEmbedded copies this object and specializes the display -# name, timeline id, and chat message for each newly created /embedded_N document. -embeddedTemplate: - name: Embedded - displayName: Embedded - contracts: - participantChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: embedded - actor: - type: MyOS/Principal Actor - accountId: embedded - say: - type: Coordination/Sequential Workflow Operation - channel: participantChannel - steps: - - type: Coordination/Trigger Event - event: - type: Coordination/Chat Message - message: Chat from embedded -contractTemplates: - # Template for the root-level timeline channel that points at one generated embedded document. - embeddedTimeline: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: embedded - actor: - type: MyOS/Principal Actor - accountId: embedded - # Template for the root-level embedded node channel that surfaces events from one generated child. - embeddedBridge: - type: Embedded Node Channel - childPath: /embedded - # Template for the root-level workflow that counts chat messages from one generated child. - embeddedChatCounter: - type: Coordination/Sequential Workflow - channel: embedded_bridge - event: - type: Coordination/Chat Message - steps: - - name: BuildChatCounterPatch - type: Coordination/Compute - do: - - $appendChange: - op: replace - path: /chatMessagesSeen - val: - $add: - - $document: /chatMessagesSeen - - 1 - - $return: - changeset: - $changeset: true - events: - $events: true -contracts: - # Alice is allowed to create embedded participant documents. - aliceChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: alice - actor: - type: MyOS/Principal Actor - accountId: alice - # Bob is allowed to check whether enough embedded chat messages have been observed. - bobChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: bob - actor: - type: MyOS/Principal Actor - accountId: bob - createEmbedded: - type: Coordination/Sequential Workflow Operation - channel: aliceChannel - steps: - - name: BuildEmbedded - type: Coordination/Compute - do: - # createEmbedded creates exactly one new document: - # - /embedded_N is copied from /embeddedTemplate; - # - its participant channel is changed to embedded-N; - # - its say operation emits a unique message; - # - root contracts are added so the main document can route to and observe it. - - $let: - name: index - expr: - $add: - - $document: /nextEmbeddedNumber - - 1 - - $let: - name: suffix - expr: - $text: - $var: index - - $appendChange: - op: replace - path: /nextEmbeddedNumber - val: - $var: index - - $appendChange: - op: add - path: - $concat: - - /embedded_ - - $var: suffix - val: - $document: /embeddedTemplate - - $appendChange: - op: replace - path: - $concat: - - /embedded_ - - $var: suffix - - /displayName - val: - $concat: - - Embedded - - " " - - $var: suffix - - $appendChange: - op: replace - path: - $concat: - - /embedded_ - - $var: suffix - - /contracts/participantChannel/timeline/timelineId - val: - $concat: - - embedded- - - $var: suffix - - $appendChange: - op: replace - path: - $concat: - - /embedded_ - - $var: suffix - - /contracts/participantChannel/actor/accountId - val: - $concat: - - embedded- - - $var: suffix - - $appendChange: - op: replace - path: - $concat: - - /embedded_ - - $var: suffix - - /contracts/say/steps/0/event/message - val: - $concat: - - Chat from embedded - - " " - - $var: suffix - - $appendChange: - op: add - path: /contracts/embeddedDocs/paths/- - val: - $concat: - - /embedded_ - - $var: suffix - - $appendChange: - op: add - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _timeline - val: - $document: /contractTemplates/embeddedTimeline - - $appendChange: - op: replace - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _timeline/timeline/timelineId - val: - $concat: - - embedded- - - $var: suffix - - $appendChange: - op: replace - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _timeline/actor/accountId - val: - $concat: - - embedded- - - $var: suffix - - $appendChange: - op: add - path: /contracts/allEmbeddedTimelines/channels/- - val: - $concat: - - embedded_ - - $var: suffix - - _timeline - - $appendChange: - op: add - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _bridge - val: - $document: /contractTemplates/embeddedBridge - - $appendChange: - op: replace - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _bridge/childPath - val: - $concat: - - /embedded_ - - $var: suffix - - $appendChange: - op: add - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _chatCounter - val: - $document: /contractTemplates/embeddedChatCounter - - $appendChange: - op: replace - path: - $concat: - - /contracts/embedded_ - - $var: suffix - - _chatCounter/channel - val: - $concat: - - embedded_ - - $var: suffix - - _bridge - - $return: - changeset: - $changeset: true - events: - $events: true - embeddedDocs: - type: Process Embedded - paths: [] - # Composite channel over all generated embedded timelines. It starts empty and createEmbedded appends - # one generated timeline contract key per created participant. - allEmbeddedTimelines: - type: Coordination/Composite Timeline Channel - channels: [] - embeddedTimelineObserver: - type: Coordination/Sequential Workflow - channel: allEmbeddedTimelines - steps: - - name: BuildEmbeddedTimelineEventPatch - type: Coordination/Compute - do: - # Any operation on a generated embedded timeline increments this root-level observer counter. - - $appendChange: - op: replace - path: /embeddedTimelineEventsSeen - val: - $add: - - $document: /embeddedTimelineEventsSeen - - 1 - - $return: - changeset: - $changeset: true - events: - $events: true - checkChatCount: - type: Coordination/Sequential Workflow Operation - channel: bobChannel - steps: - - name: BuildCheck - type: Coordination/Compute - do: - # Bob's check is deliberately simple: success becomes true once five embedded chat messages - # have been bridged back to the main document. - - $appendChange: - op: replace - path: /success - val: - $gte: - - $document: /chatMessagesSeen - - 5 - - $return: - changeset: - $changeset: true - events: - $events: true diff --git a/src/test/resources/coordination/compute/ed25519-hotel-access.yaml b/src/test/resources/coordination/compute/ed25519-hotel-access.yaml deleted file mode 100644 index 4695673..0000000 --- a/src/test/resources/coordination/compute/ed25519-hotel-access.yaml +++ /dev/null @@ -1,183 +0,0 @@ -name: Ed25519 Hotel Access -guestPublicKeys: - customerA: uo2WYCfAYaiRPfdHd0L3H0Um10zlss7-w1ALJo46nAQ -usedNonces: {} -contracts: - hotelChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: hotel - actor: - type: MyOS/Principal Actor - accountId: hotel - checkIn: - type: Coordination/Sequential Workflow Operation - channel: hotelChannel - steps: - - name: VerifyCheckIn - type: Coordination/Compute - entry: handleCheckIn - functions: - handleCheckIn: - do: - - $let: - order: - - req - - userId - - nonce - - publicKey - - noncesBefore - - valid - - noncesAfter - vars: - req: - $event: /message/request - userId: - $var: - name: req - path: /userId - nonce: - $var: - name: req - path: /nonce - publicKey: - $document: - path: - $pointerJoin: - - guestPublicKeys - - $var: userId - noncesBefore: - $object: - $document: - path: - $pointerJoin: - - usedNonces - - $var: userId - valid: - $and: - - $exists: - $var: publicKey - - $not: - $hasKey: - object: - $var: noncesBefore - key: - $var: nonce - - $gte: - - $var: - name: req - path: /expires - - $event: /timestamp - - $call: - function: ed25519SignatureValid - args: - publicKey: - $var: publicKey - message: - $call: - function: checkInMessage - args: - reservationId: - $var: - name: req - path: /reservationId - userId: - $var: userId - nonce: - $var: nonce - expires: - $var: - name: req - path: /expires - signature: - $var: - name: req - path: /signature - noncesAfter: - $objectSet: - object: - $var: noncesBefore - key: - $var: nonce - val: true - - $if: - cond: - $var: valid - then: - - $appendChange: - op: add - path: - $pointerJoin: - - usedNonces - - $var: userId - val: - $var: noncesAfter - - $appendEvent: - type: Coordination/Event - kind: Hotel Access Granted - userId: - $var: userId - reservationId: - $var: - name: req - path: /reservationId - else: - - $appendEvent: - type: Coordination/Event - kind: Hotel Access Rejected - userId: - $var: userId - reason: request not authorized - - $return: - changeset: - $changeset: true - events: - $events: true - checkInMessage: - args: - reservationId: - type: Text - userId: - type: Text - nonce: - type: Text - expires: - type: Integer - expr: - $join: - separator: "\n" - list: - - action=hotel.checkIn - - $concat: - - reservation= - - $var: reservationId - - $concat: - - user= - - $var: userId - - $concat: - - nonce= - - $var: nonce - - $concat: - - expires= - - $text: - $var: expires - ed25519SignatureValid: - args: - publicKey: - type: Text - message: - type: Text - signature: - type: Text - expr: - $intrinsic: - type: - blueId: Common/Crypto Ed25519 Verify - publicKey: - $var: publicKey - message: - $var: message - signature: - $var: signature diff --git a/src/test/resources/coordination/compute/ed25519-threshold-approval.yaml b/src/test/resources/coordination/compute/ed25519-threshold-approval.yaml deleted file mode 100644 index 1340673..0000000 --- a/src/test/resources/coordination/compute/ed25519-threshold-approval.yaml +++ /dev/null @@ -1,284 +0,0 @@ -name: Ed25519 Threshold Approval -threshold: 2 -approvers: - alice: - publicKey: LOgXd50ECwNhvHNfK3cK3VpwioLBUR_UTqn5pL9buuA - bob: - publicKey: qEeYRYybYAbUnAFl679BmtRDfjMGBmDSMkTl0C4VaZY - celine: - publicKey: B2nXg4XITq3MNfp3by1H0DouYSAp5p4nN0Q0zhUkwic -usedNonces: - alice: {} - bob: {} - celine: {} -approvals: - delete-file-123: {} -executed: {} -contracts: - adminChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: admin - actor: - type: MyOS/Principal Actor - accountId: admin - approveAction: - type: Coordination/Sequential Workflow Operation - channel: adminChannel - steps: - - name: VerifyApproval - type: Coordination/Compute - entry: handleApproval - functions: - handleApproval: - do: - - $let: - order: - - req - - actionId - - signer - - nonce - - publicKey - - noncesBefore - - approvalsBefore - - approvalsAfter - - approvalCount - - validSignature - - alreadyExecuted - - approved - vars: - req: - $event: /message/request - actionId: - $var: - name: req - path: /actionId - signer: - $var: - name: req - path: /signer - nonce: - $var: - name: req - path: /nonce - publicKey: - $document: - path: - $pointerJoin: - - approvers - - $var: signer - - publicKey - noncesBefore: - $object: - $document: - path: - $pointerJoin: - - usedNonces - - $var: signer - approvalsBefore: - $object: - $document: - path: - $pointerJoin: - - approvals - - $var: actionId - approvalsAfter: - $objectSet: - object: - $var: approvalsBefore - key: - $var: signer - val: true - approvalCount: - $size: - $keys: - $var: approvalsAfter - validSignature: - $and: - - $exists: - $var: publicKey - - $not: - $hasKey: - object: - $var: noncesBefore - key: - $var: nonce - - $gte: - - $var: - name: req - path: /expires - - $event: /timestamp - - $call: - function: ed25519SignatureValid - args: - publicKey: - $var: publicKey - message: - $call: - function: approvalMessage - args: - action: - $var: - name: req - path: /action - actionId: - $var: actionId - resource: - $var: - name: req - path: /resource - signer: - $var: signer - nonce: - $var: nonce - expires: - $var: - name: req - path: /expires - signature: - $var: - name: req - path: /signature - alreadyExecuted: - $hasKey: - object: - $object: - $document: /executed - key: - $var: actionId - approved: - $gte: - - $var: approvalCount - - $document: /threshold - - $if: - cond: - $var: validSignature - then: - - $appendChange: - op: add - path: - $pointerJoin: - - usedNonces - - $var: signer - - $var: nonce - val: - true - - $appendChange: - op: add - path: - $pointerJoin: - - approvals - - $var: actionId - - $var: signer - val: - true - - $if: - cond: - $and: - - $var: approved - - $not: - $var: alreadyExecuted - then: - - $appendChange: - op: add - path: - $pointerJoin: - - executed - - $var: actionId - val: true - - $appendEvent: - type: Coordination/Event - kind: Admin Action Executed - actionId: - $var: actionId - action: - $var: - name: req - path: /action - resource: - $var: - name: req - path: /resource - approvalCount: - $var: approvalCount - else: - - $appendEvent: - type: Coordination/Event - kind: Admin Approval Recorded - actionId: - $var: actionId - signer: - $var: signer - approvalCount: - $var: approvalCount - else: - - $appendEvent: - type: Coordination/Event - kind: Admin Approval Rejected - actionId: - $var: actionId - signer: - $var: signer - reason: request not authorized - - $return: - changeset: - $changeset: true - events: - $events: true - approvalMessage: - args: - action: - type: Text - actionId: - type: Text - resource: - type: Text - signer: - type: Text - nonce: - type: Text - expires: - type: Integer - expr: - $join: - separator: "\n" - list: - - $concat: - - action= - - $var: action - - $concat: - - actionId= - - $var: actionId - - $concat: - - resource= - - $var: resource - - $concat: - - signer= - - $var: signer - - $concat: - - nonce= - - $var: nonce - - $concat: - - expires= - - $text: - $var: expires - ed25519SignatureValid: - args: - publicKey: - type: Text - message: - type: Text - signature: - type: Text - expr: - $intrinsic: - type: - blueId: Common/Crypto Ed25519 Verify - publicKey: - $var: publicKey - message: - $var: message - signature: - $var: signature diff --git a/src/test/resources/coordination/compute/offer-paynote-embedded-orders-bex.yaml b/src/test/resources/coordination/compute/offer-paynote-embedded-orders-bex.yaml deleted file mode 100644 index 789d1a4..0000000 --- a/src/test/resources/coordination/compute/offer-paynote-embedded-orders-bex.yaml +++ /dev/null @@ -1,183 +0,0 @@ -name: Weekend Package Order -package: - id: weekend-badura-cud-malina - title: 20-21 June weekend - description: Deluxe Room in Hotel Badura plus 250zl Dinner for Two at Restaurant Cud Malina - hotelName: Hotel Badura - roomType: Deluxe Room - restaurantName: Restaurant Cud Malina - dinnerDescription: 250zl Dinner for Two - startDate: 2026-06-20 - endDate: 2026-06-21 - price: - amount: 499 - currency: PLN -order: - status: Awaiting PayNote - customer: Customer - travelAgency: Travel Agency - paynoteDelivered: false -contracts: - # Customer and Travel Agency are the package-order participants. - customerChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: customer - actor: - type: MyOS/Principal Actor - accountId: customer - travelAgencyChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: travel-agency - actor: - type: MyOS/Principal Actor - accountId: travel-agency - packageParticipants: - type: Coordination/Composite Timeline Channel - channels: - - customerChannel - - travelAgencyChannel - - # Deliver PayNote embeds the exact PayNote document supplied in the operation request. - # Fixed document shape belongs on the Operation request pattern. Stateful checks, such as - # "the order is still waiting for a PayNote", stay in the workflow. - # Illegal examples: - # - A request with amount 498 PLN does not match this operation. - # - A request for another package id does not match this operation. - # - A second PayNote reaches the workflow and fails because /paynote is already present. - deliverPaynote: - type: Coordination/Sequential Workflow Operation - channel: packageParticipants - request: - name: Package PayNote - packageId: weekend-badura-cud-malina - status: Pending authorization - amount: 499 - currency: PLN - startDate: 2026-06-20 - endDate: 2026-06-21 - customer: Customer - travelAgency: Travel Agency - cardProcessor: Card Processor - restaurantOrderProvided: false - hotelOrderProvided: false - restaurantConfirmed: false - hotelConfirmed: false - captureRequested: false - captured: false - contracts: - travelAgencyChannel: - timeline: - timelineId: travel-agency - actor: - accountId: travel-agency - cardProcessorChannel: - timeline: - timelineId: card-processor - actor: - accountId: card-processor - confirmAuthorization: - channel: cardProcessorChannel - provideRestaurantOrder: - channel: travelAgencyChannel - provideHotelOrder: - channel: travelAgencyChannel - restaurantOrderEvents: - childPath: /restaurantOrder - hotelOrderEvents: - childPath: /hotelOrder - restaurantOrderConfirmed: - channel: restaurantOrderEvents - hotelOrderConfirmed: - channel: hotelOrderEvents - confirmCapture: - channel: cardProcessorChannel - steps: - - name: BuildDeliverPaynotePatch - type: Coordination/Compute - do: - - $if: - cond: - $ne: - - $document: /order/status - - Awaiting PayNote - then: - - $fail: Package order is not waiting for a PayNote - - $if: - cond: - $not: - $empty: - $document: /paynote - then: - - $fail: PayNote is already delivered - - $appendChange: - op: add - path: /paynote - val: - $binding: - name: event - path: /message/request - - $appendChange: - op: add - path: /contracts/embeddedPaynotes/paths/- - val: /paynote - - $appendChange: - op: replace - path: /order/paynoteDelivered - val: true - - $appendChange: - op: replace - path: /order/status - val: Waiting for PayNote capture - - $appendEvent: - type: Coordination/Event - kind: PayNote Authorization Requested - packageId: - $document: /package/id - amount: 499 - currency: PLN - - $return: - changeset: - $changeset: true - events: - $events: true - - # The embedded PayNote and its nested component orders are processed through this embedded scope. - embeddedPaynotes: - type: Process Embedded - paths: [] - - # The package order becomes Ready to use only when the embedded PayNote writes captured=true. - paynoteCapturedUpdate: - type: Document Update Channel - path: /paynote/captured - paynoteCaptured: - type: Coordination/Sequential Workflow - channel: paynoteCapturedUpdate - event: - type: Document Update - path: /paynote/captured - after: true - steps: - - name: BuildReadyToUsePatch - type: Coordination/Compute - do: - - $appendChange: - op: replace - path: /order/status - val: Ready to use - - $appendEvent: - type: Coordination/Event - kind: Package Order Ready to Use - packageId: - $document: /package/id - - $return: - changeset: - $changeset: true - events: - $events: true diff --git a/src/test/resources/coordination/counter-bex.yaml b/src/test/resources/coordination/counter-bex.yaml deleted file mode 100644 index 2f79a40..0000000 --- a/src/test/resources/coordination/counter-bex.yaml +++ /dev/null @@ -1,54 +0,0 @@ -name: Counter -counter: 0 -contracts: - ownerChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: counter-timeline - actor: - type: MyOS/Principal Actor - accountId: counter-timeline - increment: - description: Increment the counter by the given number - type: Coordination/Sequential Workflow Operation - channel: ownerChannel - request: - description: Represents a value by which counter will be incremented - type: Integer - steps: - - name: IncrementAndEmit - type: Coordination/Compute - do: - - $let: - name: nextCounter - expr: - $add: - - $document: /counter - - $binding: - name: event - path: /message/request - - $appendChange: - op: replace - path: /counter - val: - $var: nextCounter - - $appendEvent: - $merge: - - type: Coordination/Chat Message - - message: - $concat: - - Counter was incremented by - - " " - - $binding: - name: event - path: /message/request - - " and is now " - - $text: - $var: nextCounter - - $return: - changeset: - $changeset: true - events: - $events: true diff --git a/src/test/resources/processor-delay/customer-paynote-snapshot.document.compute.latest-bex.yaml b/src/test/resources/processor-delay/customer-paynote-snapshot.document.compute.latest-bex.yaml deleted file mode 100644 index 9aecac8..0000000 --- a/src/test/resources/processor-delay/customer-paynote-snapshot.document.compute.latest-bex.yaml +++ /dev/null @@ -1,10431 +0,0 @@ -{ - "name": "Global Package Fulfillment Automation - Weekend Stay + Wine Dinner", - "description": "Investor-side setup automation that watches package offer and agreement anchors and coordinates concurrent public checkouts.", - "type": "Sample/Sample Admin Base", - "contracts": { - "sampleAdminChannel": { - "description": "Sample Admin (accountId=0) — posts operational progress/decisions via sampleAdminUpdate", - "type": "Coordination/Timeline Channel", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "event": { - "description": "Optional matcher payload used by the channel's processor to further restrict which incoming events it accepts at this scope." - }, - "timeline": { - "type": "Coordination/Timeline", - "providerId": "test-provider", - "timelineId": "admin-timeline" - }, - "actor": { - "type": "Sample/Principal Actor", - "accountId": "0", - "email": { - "description": "Email address associated with the Sample timeline", - "type": "Text" - } - } - }, - "sampleAdminUpdate": { - "description": "The standard, required operation for Sample Admin to deliver events.", - "type": "Coordination/Sequential Workflow Operation", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "sampleAdminChannel", - "request": { - "description": "The request schema for this operation (any Blue node). Invocation payloads MUST conform to this shape.\n" - }, - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events." - }, - "steps": [ - { - "name": "EmitAdminEvents", - "type": "Coordination/Compute", - "emitEvents": true, - "returnResult": true, - "do": [ - { - "$return": { - "changeset": [ - - ], - "events": { - "$event": "/message/request" - } - } - } - ] - } - ] - }, - "investorChannel": { - "type": "Coordination/Timeline Channel", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "event": { - "description": "Optional matcher payload used by the channel's processor to further restrict which incoming events it accepts at this scope." - }, - "timeline": { - "type": "Coordination/Timeline", - "timelineId": "investor-timeline" - }, - "actor": { - "type": "Sample/Principal Actor", - "accountId": "investor-uid", - "email": { - "description": "Email address associated with the Sample timeline", - "type": "Text" - } - } - }, - "initLifecycleChannel": { - "type": "Lifecycle Event Channel", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "event": { - "description": "Optional matcher payload used by the channel's processor to further restrict which incoming events it accepts at this scope.", - "type": "Document Processing Initiated", - "documentId": { - "description": "Stable document identifier (original BlueId).", - "type": "Text" - } - } - }, - "triggeredEventChannel": { - "type": "Triggered Event Channel", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "event": { - "description": "Optional matcher payload used by the channel's processor to further restrict which incoming events it accepts at this scope." - } - }, - "sessionInteraction": { - "type": "Sample/Sample Session Interaction" - }, - "automationSection": { - "type": "Coordination/Document Section", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "relatedContracts": { - "description": "Contract keys in the same scope that implement or affect the section.", - "type": "List", - "itemType": "Text" - }, - "relatedFields": [ - "/description", - "/status", - "/state", - "/orders" - ], - "summary": { - "description": "Brief functional summary of the section's purpose and behavior.", - "type": "Text" - }, - "title": "Automation status" - }, - "orderLedgerSection": { - "type": "Coordination/Document Section", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "relatedContracts": { - "description": "Contract keys in the same scope that implement or affect the section.", - "type": "List", - "itemType": "Text" - }, - "relatedFields": [ - "/orders", - "/resaleOrderRequests" - ], - "summary": { - "description": "Brief functional summary of the section's purpose and behavior.", - "type": "Text" - }, - "title": "Projected orders" - }, - "requestSetupGrantsOnInit": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "initLifecycleChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events." - }, - "steps": [ - { - "name": "BuildPackageFulfillmentSetupRequests", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "buildPackageFulfillmentSetupRequests", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageSetupInvestorPaymentAccountGrant": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Single Document Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "sdpg:package:investor-payment-account:investor-payment-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "permissions": { - "type": "Sample/Single Document Permission Set", - "allOps": { - "type": "Boolean" - }, - "read": true, - "share": { - "type": "Boolean" - }, - "singleOps": { - "type": "List", - "itemType": "Text" - } - }, - "targetSessionId": "investor-payment-session" - }, - "steps": [ - { - "name": "ProcessPackageSetupInvestorPaymentAccountGrant", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processSetupGrant", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageSetupHotelAgreementGrant": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Single Document Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "sdpg:package:hotel-agreement:hotel-agreement-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "permissions": { - "type": "Sample/Single Document Permission Set", - "allOps": { - "type": "Boolean" - }, - "read": true, - "share": { - "type": "Boolean" - }, - "singleOps": { - "type": "List", - "itemType": "Text" - } - }, - "targetSessionId": "hotel-agreement-session" - }, - "steps": [ - { - "name": "ProcessPackageSetupHotelAgreementGrant", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processSetupGrant", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageSetupRestaurantAgreementGrant": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Single Document Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "sdpg:package:restaurant-agreement:restaurant-agreement-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "permissions": { - "type": "Sample/Single Document Permission Set", - "allOps": { - "type": "Boolean" - }, - "read": true, - "share": { - "type": "Boolean" - }, - "singleOps": { - "type": "List", - "itemType": "Text" - } - }, - "targetSessionId": "restaurant-agreement-session" - }, - "steps": [ - { - "name": "ProcessPackageSetupRestaurantAgreementGrant", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processSetupGrant", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageOrderDiscovered": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Single Document Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:package-offer:orders:package-offer-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "permissions": { - "type": "Sample/Single Document Permission Set", - "allOps": { - "type": "Boolean" - }, - "read": true, - "share": { - "type": "Boolean" - }, - "singleOps": { - "type": "List", - "itemType": "Text" - } - }, - "targetSessionId": { - "type": "Text" - } - }, - "steps": [ - { - "name": "ProcessPackageOrderDiscovered", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processPackageOrderDiscovered", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageCustomerPayNoteDiscovered": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Single Document Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:package-offer:customer-paynotes:package-offer-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "permissions": { - "type": "Sample/Single Document Permission Set", - "allOps": { - "type": "Boolean" - }, - "read": true, - "share": { - "type": "Boolean" - }, - "singleOps": { - "type": "List", - "itemType": "Text" - } - }, - "targetSessionId": { - "type": "Text" - } - }, - "steps": [ - { - "name": "ProcessPackageCustomerPayNoteDiscovered", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processCustomerPayNoteDiscovered", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageOfferOrdersGrantReady": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Linked Documents Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:package-offer:orders:package-offer-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "links": { - "type": "Sample/Linked Documents Permission Set", - "keyType": "Text", - "valueType": "Sample/Single Document Permission Set" - }, - "targetSessionId": "package-offer-session" - }, - "steps": [ - { - "name": "ProcessPackageOfferOrdersGrantReady", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "markPackageOfferOrdersGrantReady", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageOfferCustomerPayNotesGrantReady": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Linked Documents Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:package-offer:customer-paynotes:package-offer-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "links": { - "type": "Sample/Linked Documents Permission Set", - "keyType": "Text", - "valueType": "Sample/Single Document Permission Set" - }, - "targetSessionId": "package-offer-session" - }, - "steps": [ - { - "name": "ProcessPackageOfferCustomerPayNotesGrantReady", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "markPackageOfferCustomerPayNotesGrantReady", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageHotelAgreementOrdersGrantReady": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Linked Documents Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:hotel-agreement:orders:hotel-agreement-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "links": { - "type": "Sample/Linked Documents Permission Set", - "keyType": "Text", - "valueType": "Sample/Single Document Permission Set" - }, - "targetSessionId": "hotel-agreement-session" - }, - "steps": [ - { - "name": "ProcessPackageHotelAgreementOrdersGrantReady", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "markHotelAgreementOrdersGrantReady", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageRestaurantAgreementOrdersGrantReady": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Linked Documents Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:restaurant-agreement:orders:restaurant-agreement-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "links": { - "type": "Sample/Linked Documents Permission Set", - "keyType": "Text", - "valueType": "Sample/Single Document Permission Set" - }, - "targetSessionId": "restaurant-agreement-session" - }, - "steps": [ - { - "name": "ProcessPackageRestaurantAgreementOrdersGrantReady", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "markRestaurantAgreementOrdersGrantReady", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackagePaymentTargetSubscriptionInitiated": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription to Session Initiated", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "at": { - "description": "ISO 8601 timestamp when the subscription became active.", - "type": "Text" - }, - "document": { - "description": "The document state at the time the subscription became active." - }, - "epoch": { - "description": "The epoch number at which the subscription became active.", - "type": "Integer" - }, - "subscriptionId": "investor-payment-targets", - "targetSessionId": "investor-payment-session" - }, - "steps": [ - { - "name": "ProcessPackagePaymentTargetSubscriptionInitiated", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "markPaymentTargetSubscriptionReady", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageHotelAgreementSubscriptionInitiated": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription to Session Initiated", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "at": { - "description": "ISO 8601 timestamp when the subscription became active.", - "type": "Text" - }, - "document": { - "description": "The document state at the time the subscription became active." - }, - "epoch": { - "description": "The epoch number at which the subscription became active.", - "type": "Integer" - }, - "subscriptionId": "hotel-resale-agreement", - "targetSessionId": "hotel-agreement-session" - }, - "steps": [ - { - "name": "ProcessPackageHotelAgreementSubscriptionInitiated", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processHotelAgreementSubscriptionInitiated", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageRestaurantAgreementSubscriptionInitiated": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription to Session Initiated", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "at": { - "description": "ISO 8601 timestamp when the subscription became active.", - "type": "Text" - }, - "document": { - "description": "The document state at the time the subscription became active." - }, - "epoch": { - "description": "The epoch number at which the subscription became active.", - "type": "Integer" - }, - "subscriptionId": "restaurant-resale-agreement", - "targetSessionId": "restaurant-agreement-session" - }, - "steps": [ - { - "name": "ProcessPackageRestaurantAgreementSubscriptionInitiated", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processRestaurantAgreementSubscriptionInitiated", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageOrderSubscriptionInitiated": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription to Session Initiated", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "at": { - "description": "ISO 8601 timestamp when the subscription became active.", - "type": "Text" - }, - "document": { - "description": "The document state at the time the subscription became active.", - "kind": "Package Order" - }, - "epoch": { - "description": "The epoch number at which the subscription became active.", - "type": "Integer" - }, - "subscriptionId": { - "description": "The subscription id that was initiated.", - "type": "Text" - }, - "targetSessionId": { - "description": "Session being observed.", - "type": "Text" - } - }, - "steps": [ - { - "name": "ProcessPackageOrderSubscriptionInitiated", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processPackageOrderSubscriptionInitiated", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageComponentHotelSubscriptionInitiated": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription to Session Initiated", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "at": { - "description": "ISO 8601 timestamp when the subscription became active.", - "type": "Text" - }, - "document": { - "description": "The document state at the time the subscription became active.", - "kind": "Order", - "context": { - "orderKind": "hotel" - } - }, - "epoch": { - "description": "The epoch number at which the subscription became active.", - "type": "Integer" - }, - "subscriptionId": { - "description": "The subscription id that was initiated.", - "type": "Text" - }, - "targetSessionId": { - "description": "Session being observed.", - "type": "Text" - } - }, - "steps": [ - { - "name": "ProcessPackageComponentHotelSubscriptionInitiated", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processHotelComponentSubscriptionInitiated", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageComponentRestaurantSubscriptionInitiated": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription to Session Initiated", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "at": { - "description": "ISO 8601 timestamp when the subscription became active.", - "type": "Text" - }, - "document": { - "description": "The document state at the time the subscription became active.", - "kind": "Order", - "context": { - "orderKind": "restaurant" - } - }, - "epoch": { - "description": "The epoch number at which the subscription became active.", - "type": "Integer" - }, - "subscriptionId": { - "description": "The subscription id that was initiated.", - "type": "Text" - }, - "targetSessionId": { - "description": "Session being observed.", - "type": "Text" - } - }, - "steps": [ - { - "name": "ProcessPackageComponentRestaurantSubscriptionInitiated", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processRestaurantComponentSubscriptionInitiated", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageCustomerPaymentTargetPrepared": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": "investor-payment-targets", - "targetSessionId": "investor-payment-session", - "update": { - "description": "The update (subscription event) from the target session.", - "type": "Sample/Payment Target Prepared", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "allowedPayer": { - "description": "Optional effective payer restriction echoed back to the caller.", - "type": "Sample/Sample User", - "accountId": { - "description": "Stable Sample user identifier.", - "type": "Text" - } - }, - "amount": { - "description": "Optional effective amount constraint echoed back to the caller.", - "type": "Integer" - }, - "context": { - "description": "Optional business-context reference.", - "documentId": { - "description": "Blue document id identifying the business document this payment is for.", - "type": "Text" - } - }, - "currency": { - "description": "Optional effective currency constraint echoed back to the caller.", - "type": "Common/Currency" - }, - "expectedPaynote": { - "description": "Optional effective PayNote matcher echoed back to the caller." - }, - "expiresAt": { - "description": "Optional expiry echoed back to the caller.", - "type": "Text" - }, - "recipient": { - "description": "Prepared recipient reference.", - "type": "Sample/Sample Balance Account", - "token": { - "description": "Opaque prepared recipient token.", - "type": "Text" - } - } - } - }, - "steps": [ - { - "name": "ProcessPackageCustomerPaymentTargetPrepared", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processCustomerPaymentTargetPrepared", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageHotelResaleOrderPlaced": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": "hotel-resale-agreement", - "targetSessionId": "hotel-agreement-session", - "update": { - "description": "The update (subscription event) from the target session.", - "type": "Coordination/Response", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "kind": "Resale Order Placed" - } - }, - "steps": [ - { - "name": "ProcessPackageHotelResaleOrderPlaced", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processHotelResaleOrderPlaced", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageRestaurantResaleOrderPlaced": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": "restaurant-resale-agreement", - "targetSessionId": "restaurant-agreement-session", - "update": { - "description": "The update (subscription event) from the target session.", - "type": "Coordination/Response", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "kind": "Resale Order Placed" - } - }, - "steps": [ - { - "name": "ProcessPackageRestaurantResaleOrderPlaced", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processRestaurantResaleOrderPlaced", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageCustomerPayNoteFundsSecured": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": { - "description": "The ID of the subscription.", - "type": "Text" - }, - "targetSessionId": { - "description": "The ID of the target session.", - "type": "Text" - }, - "update": { - "description": "The update (subscription event) from the target session.", - "type": "PayNote/Funds Secured", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "amountSecured": { - "type": "Integer" - } - } - }, - "steps": [ - { - "name": "ProcessPackageCustomerPayNoteFundsSecured", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processCustomerPayNoteFundsSecured", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageCustomerPayNoteCompleted": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": { - "description": "The ID of the subscription.", - "type": "Text" - }, - "targetSessionId": { - "description": "The ID of the target session.", - "type": "Text" - }, - "update": { - "description": "The update (subscription event) from the target session.", - "type": "PayNote/Payment Completed", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "amountCompleted": { - "type": "Integer" - } - } - }, - "steps": [ - { - "name": "ProcessPackageCustomerPayNoteCompleted", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processCustomerPayNoteCompleted", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageComponentPaymentTokenAttached": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": { - "description": "The ID of the subscription.", - "type": "Text" - }, - "targetSessionId": { - "description": "The ID of the target session.", - "type": "Text" - }, - "update": { - "description": "The update (subscription event) from the target session.", - "type": "Coordination/Event", - "kind": "Payment Token Attached" - } - }, - "steps": [ - { - "name": "ProcessPackageComponentPaymentTokenAttached", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processComponentPaymentTokenAttached", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageComponentOrderConfirmed": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Subscription Update", - "subscriptionId": { - "description": "The ID of the subscription.", - "type": "Text" - }, - "targetSessionId": { - "description": "The ID of the target session.", - "type": "Text" - }, - "update": { - "description": "The update (subscription event) from the target session.", - "type": "Coordination/Event", - "kind": "Order Confirmed" - } - }, - "steps": [ - { - "name": "ProcessPackageComponentOrderConfirmed", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processComponentOrderConfirmed", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageCustomerPayNoteSnapshotResolved": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Document Initial Snapshot Resolved", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "document": { - "description": "Initial snapshot of requested document session.", - "context": { - "paymentKind": "customer_package_purchase" - } - } - }, - "steps": [ - { - "name": "ProcessPackageCustomerPayNoteSnapshotResolved", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processCustomerPayNoteSnapshotResolved", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageHotelComponentSnapshotResolved": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Document Initial Snapshot Resolved", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "document": { - "description": "Initial snapshot of requested document session.", - "kind": "Order", - "context": { - "orderKind": "hotel" - } - } - }, - "steps": [ - { - "name": "ProcessPackageHotelComponentSnapshotResolved", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processHotelComponentSnapshotResolved", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageRestaurantComponentSnapshotResolved": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Document Initial Snapshot Resolved", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "document": { - "description": "Initial snapshot of requested document session.", - "kind": "Order", - "context": { - "orderKind": "restaurant" - } - } - }, - "steps": [ - { - "name": "ProcessPackageRestaurantComponentSnapshotResolved", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processRestaurantComponentSnapshotResolved", - "emitEvents": true, - "returnResult": true - } - ] - }, - "processPackageInitialSnapshotUnresolved": { - "type": "Coordination/Sequential Workflow", - "order": { - "description": "Deterministic sort key within a scope; missing ≡ 0.", - "type": "Integer" - }, - "channel": "triggeredEventChannel", - "event": { - "description": "Optional matcher payload used by the handler's processor to further restrict events.", - "type": "Sample/Document Initial Snapshot Unresolved", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "reason": { - "type": "Text" - } - }, - "steps": [ - { - "name": "ProcessPackageInitialSnapshotUnresolved", - "type": "Coordination/Compute", - "definition": "packageFulfillmentComputeDefinition", - "entry": "processInitialSnapshotUnresolved", - "emitEvents": true, - "returnResult": true - } - ] - }, - "initialized": { - "type": "Processing Initialized Marker", - "documentId": "Ej64x8GDWChQPMpZd4wv3NQCm8QLz9w5cttfvLnnzvRa" - }, - "checkpoint": { - "type": "Channel Event Checkpoint", - "lastEvents": { - "sampleAdminChannel": { - "type": "Coordination/Timeline Entry", - "actor": { - "description": "Actor attribution for the creator of this entry.", - "type": "Sample/Principal Actor", - "accountId": "0" - }, - "message": { - "description": "Entry payload (any Blue node), e.g., Chat Message or Status Change.", - "type": "Coordination/Operation Request", - "allowNewerVersion": { - "description": "Controls concurrent modification handling. When true, processes the operation on the latest document version even if it changed. When false, only processes if the document still has the same blueId as specified.", - "type": "Boolean" - }, - "document": { - "description": "Specifies the target document for the operation, typically containing the blueId of the document to operate on." - }, - "operation": "sampleAdminUpdate", - "request": [ - { - "type": "Sample/Single Document Permission Granted", - "inResponseTo": { - "type": { - "name": "Correlation", - "description": "A structured reference linking this response back to the original action and trigger.", - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": { - "description": "The 'requestId' from the specific Request event this is a response to.", - "type": "Text" - } - }, - "incomingEvent": { - "description": "An event which initiated the entire workflow. Normally just blueId of it." - }, - "requestId": "ldpg:package-offer:customer-paynotes:package-offer-session" - }, - "grantDocumentId": { - "description": "Optional. Stable handle of the created permission grant document. Required in request/response document-grant flows that later support self-revoke from the grantee document.", - "type": "Text" - }, - "permissions": { - "type": "Sample/Single Document Permission Set", - "allOps": { - "type": "Boolean" - }, - "read": true, - "share": { - "type": "Boolean" - }, - "singleOps": { - "type": "List", - "itemType": "Text" - } - }, - "targetSessionId": "customer-paynote-a" - } - ] - }, - "prevEntry": { - "description": "The previous entry in the timeline; omitted for the first entry." - }, - "source": { - "description": "Optional delivery mechanism describing how the request reached the timeline provider, typically using a Coordination/Source specialization." - }, - "timeline": { - "description": "The timeline this entry belongs to.", - "type": "Sample/Sample Timeline", - "timelineId": "admin-timeline", - "accountId": { - "description": "Identifier for the Sample account associated with this timeline", - "type": "Text" - } - }, - "timestamp": 1700000000000 - } - }, - "lastSignatures": { - "sampleAdminChannel": "2q7QUJFicXL8GpAg2GCbEdLiox7ybtSu15Guezrd4HKy" - } - }, - "packageFulfillmentComputeDefinition": { - "type": "Coordination/Compute Definition", - "constants": { - "expectedPackageAmount": 100000, - "hotelAmountMinor": 54000, - "restaurantAmountMinor": 18000, - "packageLinkedSubscriptionPrefix": "package-linked:", - "agreementLinkedSubscriptionPrefix": "agreement-linked:", - "customerPayNoteSnapshotPrefix": "snapshot:customer-paynote:", - "hotelComponentSnapshotPrefix": "snapshot:component:hotel:", - "restaurantComponentSnapshotPrefix": "snapshot:component:restaurant:" - }, - "functions": { - "emptyComponentOrderState": { - "do": [ - { - "$return": { - "sessionId": "", - "documentId": "", - "resaleRequestId": "", - "resaleRequested": false, - "resalePlaced": false, - "snapshotRequestId": "", - "subscriptionId": "", - "attachedToPackageOrder": false, - "attachedToPayNote": false, - "merchantPaymentInitiated": false, - "confirmed": false - } - } - ] - }, - "defaultOrderState": { - "args": { - "sessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$return": { - "packageOrder": { - "sessionId": { - "$var": "sessionId" - }, - "documentId": "", - "customerAccountId": "", - "subscriptionId": { - "$concat": [ - { - "$const": "packageLinkedSubscriptionPrefix" - }, - { - "$var": "sessionId" - } - ] - }, - "observed": false, - "confirmed": false - }, - "customerPayment": { - "tokenRequestId": { - "$concat": [ - "reseller-weekend-package-customer-token:", - { - "$var": "sessionId" - } - ] - }, - "tokenRequested": false, - "tokenAttached": false - }, - "customerPayNote": { - "sessionId": "", - "snapshotRequestId": "", - "subscriptionId": "", - "attachedToPackageOrder": false, - "secured": false, - "securedAmount": 0, - "completed": false - }, - "hotelOrder": { - "$call": { - "function": "emptyComponentOrderState", - "args": { - } - } - }, - "restaurantOrder": { - "$call": { - "function": "emptyComponentOrderState", - "args": { - } - } - } - } - } - ] - }, - "initializedDocumentId": { - "args": { - "snapshot": { - } - }, - "do": [ - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "snapshot" - } - } - } - }, - { - "$let": { - "name": "initialized", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/contracts", - "default": { - } - } - }, - "path": "/initialized", - "default": { - } - } - } - } - } - }, - { - "$return": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "initialized" - }, - "path": "/documentId", - "default": "" - } - } - }, - { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "initialized" - }, - "path": "/originalDocument", - "default": { - } - } - }, - "path": "/blueId", - "default": "" - } - } - }, - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/documentId", - "default": "" - } - } - }, - "" - ] - } - } - ] - }, - "isCustomerPackagePayNoteSnapshot": { - "args": { - "snapshot": { - } - }, - "do": [ - { - "$return": { - "$eq": [ - { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$object": { - "$var": "snapshot" - } - }, - "path": "/context", - "default": { - } - } - }, - "path": "/paymentKind", - "default": "" - } - } - }, - "customer_package_purchase" - ] - } - } - ] - }, - "appendChangeIfChanged": { - "args": { - "path": { - "type": "Text" - }, - "val": { - } - }, - "do": [ - { - "$let": { - "name": "pathText", - "expr": { - "$text": { - "$var": "path" - } - } - } - }, - { - "$let": { - "name": "current", - "expr": { - "$resultValue": { - "path": { - "$var": "pathText" - } - } - } - } - }, - { - "$if": { - "cond": { - "$ne": [ - { - "$var": "current" - }, - { - "$var": "val" - } - ] - }, - "then": [ - { - "$appendChange": { - "op": "replace", - "path": { - "$var": "pathText" - }, - "val": { - "$var": "val" - } - } - } - ] - } - } - ] - }, - "ensureOrderLedger": { - "args": { - "sessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "sessionId" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "pkg", - "expr": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder" - ] - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$object": { - "$var": "pkg" - } - } - }, - "then": [ - { - "$appendChange": { - "op": "add", - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - } - ] - }, - "val": { - "$call": { - "function": "defaultOrderState", - "args": { - "sessionId": { - "$var": "sessionId" - } - } - } - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "orderFieldRelativePath": { - "args": { - "key": { - "type": "Text" - } - }, - "do": [ - { - "$return": { - "$pointerGet": { - "object": { - "packageOrderSessionId": "/packageOrder/sessionId", - "packageOrderDocumentId": "/packageOrder/documentId", - "customerAccountId": "/packageOrder/customerAccountId", - "packageConfirmed": "/packageOrder/confirmed", - "customerPaymentTokenRequested": "/customerPayment/tokenRequested", - "customerPaymentTokenAttached": "/customerPayment/tokenAttached", - "packagePayNoteSessionId": "/customerPayNote/sessionId", - "packagePayNoteAttached": "/customerPayNote/attachedToPackageOrder", - "packagePayNoteSecured": "/customerPayNote/secured", - "packagePayNoteSecuredAmount": "/customerPayNote/securedAmount", - "packagePayNoteCompleted": "/customerPayNote/completed", - "hotelComponentRejected": "/hotelOrder/rejectionReason", - "restaurantComponentRejected": "/restaurantOrder/rejectionReason" - }, - "path": { - "$concat": [ - "/", - { - "$text": { - "$var": "key" - } - } - ] - }, - "default": "" - } - } - } - ] - }, - "orderObjectFieldRelativePath": { - "args": { - "field": { - "type": "Text" - }, - "kind": { - "type": "Text" - } - }, - "do": [ - { - "$return": { - "$pointerGet": { - "object": { - "componentOrderSessions": { - "hotel": "/hotelOrder/sessionId", - "restaurant": "/restaurantOrder/sessionId" - }, - "componentOrderDocumentIds": { - "hotel": "/hotelOrder/documentId", - "restaurant": "/restaurantOrder/documentId" - }, - "componentOrderAttached": { - "hotel": "/hotelOrder/attachedToPackageOrder", - "restaurant": "/restaurantOrder/attachedToPackageOrder" - }, - "componentOrderAttachedToPayNote": { - "hotel": "/hotelOrder/attachedToPayNote", - "restaurant": "/restaurantOrder/attachedToPayNote" - }, - "componentOrderConfirmed": { - "hotel": "/hotelOrder/confirmed", - "restaurant": "/restaurantOrder/confirmed" - }, - "merchantPaymentInitiated": { - "hotel": "/hotelOrder/merchantPaymentInitiated", - "restaurant": "/restaurantOrder/merchantPaymentInitiated" - }, - "resaleOrderPlaced": { - "hotel": "/hotelOrder/resalePlaced", - "restaurant": "/restaurantOrder/resalePlaced" - }, - "resaleOrderRequested": { - "hotel": "/hotelOrder/resaleRequested", - "restaurant": "/restaurantOrder/resaleRequested" - }, - "resaleOrderRequestIds": { - "hotel": "/hotelOrder/resaleRequestId", - "restaurant": "/restaurantOrder/resaleRequestId" - }, - "componentSnapshotRequestIds": { - "hotel": "/hotelOrder/snapshotRequestId", - "restaurant": "/restaurantOrder/snapshotRequestId" - }, - "componentSubscriptionIds": { - "hotel": "/hotelOrder/subscriptionId", - "restaurant": "/restaurantOrder/subscriptionId" - } - }, - "path": { - "$concat": [ - "/", - { - "$text": { - "$var": "field" - } - }, - "/", - { - "$text": { - "$var": "kind" - } - } - ] - }, - "default": "" - } - } - } - ] - }, - "setOrderPath": { - "args": { - "sessionId": { - "type": "Text" - }, - "relativePath": { - "type": "Text" - }, - "val": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "sessionId" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "ensureOrderLedger", - "args": { - "sessionId": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "pathText", - "expr": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - { - "$text": { - "$var": "relativePath" - } - } - ] - } - } - }, - { - "$if": { - "cond": { - "$ne": [ - { - "$resultValue": { - "path": { - "$var": "pathText" - } - } - }, - { - "$var": "val" - } - ] - }, - "then": [ - { - "$appendChange": { - "op": "add", - "path": { - "$var": "pathText" - }, - "val": { - "$var": "val" - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "setOrderField": { - "args": { - "sessionId": { - "type": "Text" - }, - "key": { - "type": "Text" - }, - "val": { - } - }, - "do": [ - { - "$let": { - "name": "relativePath", - "expr": { - "$call": { - "function": "orderFieldRelativePath", - "args": { - "key": { - "$var": "key" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "relativePath" - } - } - }, - "then": [ - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "relativePath": { - "$var": "relativePath" - }, - "val": { - "$var": "val" - } - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "mergeOrderObjectField": { - "args": { - "sessionId": { - "type": "Text" - }, - "key": { - "type": "Text" - }, - "patch": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$forEach": { - "in": { - "$entries": { - "$object": { - "$var": "patch" - } - } - }, - "item": "entry", - "do": [ - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "entry" - }, - "path": "/key", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "relativePath", - "expr": { - "$call": { - "function": "orderObjectFieldRelativePath", - "args": { - "field": { - "$var": "key" - }, - "kind": { - "$var": "kind" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "relativePath" - } - } - }, - "then": [ - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "relativePath": { - "$var": "relativePath" - }, - "val": { - "$pointerGet": { - "object": { - "$var": "entry" - }, - "path": "/val" - } - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "markMatchingSetupGrant": { - "args": { - "targetSessionId": { - "type": "Text" - }, - "expectedSessionId": { - "type": "Text" - }, - "statePath": { - "type": "Text" - } - }, - "do": [ - { - "$if": { - "cond": { - "$eq": [ - { - "$text": { - "$var": "targetSessionId" - } - }, - { - "$text": { - "$var": "expectedSessionId" - } - } - ] - }, - "then": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": { - "$var": "statePath" - }, - "val": true - } - } - } - ] - } - } - ] - }, - "setupGrantValue": { - "args": { - "path": { - "type": "Text" - } - }, - "do": [ - { - "$return": { - "$boolean": { - "$resultValue": { - "path": { - "$var": "path" - } - } - } - } - } - ] - }, - "maybeMarkGrantsReady": { - "do": [ - { - "$if": { - "cond": { - "$and": [ - { - "$boolean": { - "$resultValue": "/state/setupGrants/investorPaymentAccount" - } - }, - { - "$boolean": { - "$resultValue": "/state/setupGrants/hotelAgreement" - } - }, - { - "$boolean": { - "$resultValue": "/state/setupGrants/restaurantAgreement" - } - }, - { - "$boolean": { - "$resultValue": "/state/packageOfferLdpgReady" - } - }, - { - "$boolean": { - "$resultValue": "/state/customerPayNotesLdpgReady" - } - }, - { - "$boolean": { - "$resultValue": "/state/hotelOrdersLdpgReady" - } - }, - { - "$boolean": { - "$resultValue": "/state/restaurantOrdersLdpgReady" - } - }, - { - "$not": { - "$boolean": { - "$resultValue": "/state/grantsReady" - } - } - } - ] - }, - "then": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/grantsReady", - "val": true - } - } - }, - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/status", - "val": "active" - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "maybeSubscribeSetup": { - "do": [ - { - "$if": { - "cond": { - "$boolean": { - "$resultValue": "/state/grantsReady" - } - }, - "then": [ - { - "$if": { - "cond": { - "$not": { - "$boolean": { - "$resultValue": "/state/paymentTokenSubscriptionRequested" - } - } - }, - "then": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/paymentTokenSubscriptionRequested", - "val": true - } - } - }, - { - "$appendEvent": { - "type": "Sample/Subscribe to Session Requested", - "targetSessionId": { - "$document": "/investorPaymentAccountSessionId" - }, - "subscription": { - "id": "investor-payment-targets", - "events": [ - { - "type": "Sample/Payment Target Prepared" - }, - { - "type": "Sample/Payment Target Preparation Failed" - } - ] - } - } - } - ] - } - }, - { - "$if": { - "cond": { - "$not": { - "$boolean": { - "$resultValue": "/state/agreementSubscriptionsRequested" - } - } - }, - "then": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/agreementSubscriptionsRequested", - "val": true - } - } - }, - { - "$appendEvent": { - "type": "Sample/Subscribe to Session Requested", - "targetSessionId": { - "$document": "/hotelAgreementSessionId" - }, - "subscription": { - "id": "hotel-resale-agreement", - "events": [ - { - "type": "Coordination/Response", - "kind": "Resale Order Placed" - } - ] - } - } - }, - { - "$appendEvent": { - "type": "Sample/Subscribe to Session Requested", - "targetSessionId": { - "$document": "/restaurantAgreementSessionId" - }, - "subscription": { - "id": "restaurant-resale-agreement", - "events": [ - { - "type": "Coordination/Response", - "kind": "Resale Order Placed" - } - ] - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "processSetupGrant": { - "do": [ - { - "$let": { - "name": "targetSessionId", - "expr": { - "$text": { - "$event": "/targetSessionId" - } - } - } - }, - { - "$call": { - "function": "markMatchingSetupGrant", - "args": { - "targetSessionId": { - "$var": "targetSessionId" - }, - "expectedSessionId": { - "$document": "/investorPaymentAccountSessionId" - }, - "statePath": "/state/setupGrants/investorPaymentAccount" - } - } - }, - { - "$call": { - "function": "markMatchingSetupGrant", - "args": { - "targetSessionId": { - "$var": "targetSessionId" - }, - "expectedSessionId": { - "$document": "/hotelAgreementSessionId" - }, - "statePath": "/state/setupGrants/hotelAgreement" - } - } - }, - { - "$call": { - "function": "markMatchingSetupGrant", - "args": { - "targetSessionId": { - "$var": "targetSessionId" - }, - "expectedSessionId": { - "$document": "/restaurantAgreementSessionId" - }, - "statePath": "/state/setupGrants/restaurantAgreement" - } - } - }, - { - "$call": { - "function": "maybeMarkGrantsReady", - "args": { - } - } - }, - { - "$call": { - "function": "maybeSubscribeSetup", - "args": { - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "markPackageOfferOrdersGrantReady": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/packageOfferLdpgReady", - "val": true - } - } - }, - { - "$call": { - "function": "maybeMarkGrantsReady", - "args": { - } - } - }, - { - "$call": { - "function": "maybeSubscribeSetup", - "args": { - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "markPackageOfferCustomerPayNotesGrantReady": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/customerPayNotesLdpgReady", - "val": true - } - } - }, - { - "$call": { - "function": "maybeMarkGrantsReady", - "args": { - } - } - }, - { - "$call": { - "function": "maybeSubscribeSetup", - "args": { - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "markHotelAgreementOrdersGrantReady": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/hotelOrdersLdpgReady", - "val": true - } - } - }, - { - "$call": { - "function": "maybeMarkGrantsReady", - "args": { - } - } - }, - { - "$call": { - "function": "maybeSubscribeSetup", - "args": { - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "markRestaurantAgreementOrdersGrantReady": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/restaurantOrdersLdpgReady", - "val": true - } - } - }, - { - "$call": { - "function": "maybeMarkGrantsReady", - "args": { - } - } - }, - { - "$call": { - "function": "maybeSubscribeSetup", - "args": { - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "markPaymentTargetSubscriptionReady": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/paymentTokenSubscriptionReady", - "val": true - } - } - }, - { - "$call": { - "function": "maybeMarkGrantsReady", - "args": { - } - } - }, - { - "$call": { - "function": "maybeSubscribeSetup", - "args": { - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processPackageOrderDiscovered": { - "do": [ - { - "$let": { - "name": "targetSessionId", - "expr": { - "$text": { - "$event": "/targetSessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "targetSessionId" - } - } - }, - "then": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$concat": [ - { - "$const": "packageLinkedSubscriptionPrefix" - }, - { - "$var": "targetSessionId" - } - ] - } - } - }, - { - "$let": { - "name": "wasObserved", - "expr": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "targetSessionId" - }, - "/packageOrder/observed" - ] - } - } - } - } - } - }, - { - "$call": { - "function": "ensureOrderLedger", - "args": { - "sessionId": { - "$var": "targetSessionId" - } - } - } - }, - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "targetSessionId" - }, - "relativePath": "/packageOrder/observed", - "val": true - } - } - }, - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "targetSessionId" - }, - "relativePath": "/packageOrder/subscriptionId", - "val": { - "$var": "subscriptionId" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "wasObserved" - } - }, - "then": [ - { - "$appendEvent": { - "type": "Sample/Subscribe to Session Requested", - "targetSessionId": { - "$var": "targetSessionId" - }, - "subscription": { - "id": { - "$var": "subscriptionId" - }, - "events": [ - - ] - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processCustomerPayNoteDiscovered": { - "do": [ - { - "$let": { - "name": "targetSessionId", - "expr": { - "$text": { - "$event": "/targetSessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "targetSessionId" - } - } - }, - "then": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$concat": [ - { - "$const": "packageLinkedSubscriptionPrefix" - }, - { - "$var": "targetSessionId" - } - ] - } - } - }, - { - "$let": { - "name": "snapshotRequestId", - "expr": { - "$concat": [ - { - "$const": "customerPayNoteSnapshotPrefix" - }, - { - "$var": "targetSessionId" - } - ] - } - } - }, - { - "$let": { - "name": "existingSession", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/customerPayNoteRefsBySessionId/", - { - "$var": "targetSessionId" - }, - "/sessionId" - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "existingSession" - } - }, - "then": [ - { - "$appendChange": { - "op": "add", - "path": { - "$concat": [ - "/customerPayNoteRefsBySessionId/", - { - "$var": "targetSessionId" - } - ] - }, - "val": { - "sessionId": { - "$var": "targetSessionId" - }, - "packageOrderSessionId": "", - "packageOrderDocumentId": "", - "snapshotRequestId": { - "$var": "snapshotRequestId" - }, - "subscriptionId": { - "$var": "subscriptionId" - } - } - } - } - ] - } - }, - { - "$let": { - "name": "existingSnapshotRequestId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/customerPayNoteRefsBySessionId/", - { - "$var": "targetSessionId" - }, - "/snapshotRequestId" - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "existingSnapshotRequestId" - } - }, - "then": [ - { - "$appendEvent": { - "type": "Sample/Document Initial Snapshot Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "targetSessionId" - }, - "sourceSessionId": { - "$var": "targetSessionId" - }, - "requestId": { - "$var": "snapshotRequestId" - } - } - }, - { - "$appendEvent": { - "type": "Sample/Subscribe to Session Requested", - "targetSessionId": { - "$var": "targetSessionId" - }, - "subscription": { - "id": { - "$var": "subscriptionId" - }, - "events": [ - { - "type": "PayNote/Funds Secured" - }, - { - "type": "PayNote/Payment Completed" - } - ] - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processAgreementSnapshot": { - "args": { - "agreementKind": { - "type": "Text" - }, - "agreementSnapshot": { - } - }, - "do": [ - { - "$let": { - "name": "agreementKind", - "expr": { - "$text": { - "$var": "agreementKind" - } - } - } - }, - { - "$let": { - "name": "agreementSnapshot", - "expr": { - "$object": { - "$var": "agreementSnapshot" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "agreementKind" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$forEach": { - "in": { - "$entries": { - "$object": { - "$document": "/resaleOrderRequests" - } - } - }, - "item": "requestEntry", - "do": [ - { - "$let": { - "name": "responseRequestId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "requestEntry" - }, - "path": "/key", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "request", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "requestEntry" - }, - "path": "/val", - "default": { - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$eq": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "request" - }, - "path": "/kind", - "default": "" - } - } - }, - { - "$var": "agreementKind" - } - ] - }, - "then": [ - { - "$let": { - "name": "placed", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "agreementSnapshot" - }, - "path": "/orders", - "default": { - } - } - }, - "path": { - "$concat": [ - "/", - { - "$var": "responseRequestId" - } - ] - }, - "default": { - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$eq": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "placed" - }, - "path": "/status", - "default": "" - } - } - }, - "placed" - ] - }, - "then": [ - { - "$let": { - "name": "orderSessionId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "placed" - }, - "path": "/orderSessionId", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "orderSessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "recordPlacedResaleOrder", - "args": { - "agreementKind": { - "$var": "agreementKind" - }, - "responseRequestId": { - "$var": "responseRequestId" - }, - "orderSessionId": { - "$var": "orderSessionId" - } - } - } - } - ] - } - } - ] - } - } - ] - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "processHotelAgreementSubscriptionInitiated": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/hotelAgreementSubscriptionReady", - "val": true - } - } - }, - { - "$call": { - "function": "processAgreementSnapshot", - "args": { - "agreementKind": "hotel", - "agreementSnapshot": { - "$event": "/document" - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processRestaurantAgreementSubscriptionInitiated": { - "do": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/state/restaurantAgreementSubscriptionReady", - "val": true - } - } - }, - { - "$call": { - "function": "processAgreementSnapshot", - "args": { - "agreementKind": "restaurant", - "agreementSnapshot": { - "$event": "/document" - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processPackageOrderSubscriptionInitiated": { - "do": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$text": { - "$event": "/subscriptionId" - } - } - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "subscriptionId" - }, - { - "$const": "packageLinkedSubscriptionPrefix" - } - ] - }, - "then": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$sliceAfter": [ - { - "$var": "subscriptionId" - }, - { - "$const": "packageLinkedSubscriptionPrefix" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$event": "/targetSessionId" - } - }, - { - "$var": "packageOrderSessionId" - } - ] - } - ] - }, - "then": [ - { - "$call": { - "function": "processSnapshot", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "snapshot": { - "$event": "/document" - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processComponentSubscriptionUpdate": { - "args": { - "agreementKind": { - "type": "Text" - }, - "prefix": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$text": { - "$event": "/subscriptionId" - } - } - } - }, - { - "$let": { - "name": "prefix", - "expr": { - "$text": { - "$var": "prefix" - } - } - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "subscriptionId" - }, - { - "$var": "prefix" - } - ] - }, - "then": [ - { - "$let": { - "name": "componentSessionId", - "expr": { - "$sliceAfter": [ - { - "$var": "subscriptionId" - }, - { - "$var": "prefix" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "componentSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$event": "/targetSessionId" - } - }, - { - "$var": "componentSessionId" - } - ] - } - ] - }, - "then": [ - { - "$call": { - "function": "processSnapshot", - "args": { - "sessionId": { - "$var": "componentSessionId" - }, - "snapshot": { - "$event": "/document" - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "processHotelComponentSubscriptionInitiated": { - "do": [ - { - "$call": { - "function": "processComponentSubscriptionUpdate", - "args": { - "agreementKind": "hotel", - "prefix": { - "$concat": [ - { - "$const": "agreementLinkedSubscriptionPrefix" - }, - "hotel:" - ] - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processRestaurantComponentSubscriptionInitiated": { - "do": [ - { - "$call": { - "function": "processComponentSubscriptionUpdate", - "args": { - "agreementKind": "restaurant", - "prefix": { - "$concat": [ - { - "$const": "agreementLinkedSubscriptionPrefix" - }, - "restaurant:" - ] - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processCustomerPaymentTargetPrepared": { - "do": [ - { - "$let": { - "name": "token", - "expr": { - "$text": { - "$event": "/update/recipient/token" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "token" - } - } - }, - "then": [ - { - "$let": { - "name": "tokenRequestId", - "expr": { - "$coalesce": [ - { - "$event": "/update/inResponseTo/requestId" - }, - { - "$event": "/inResponseTo/requestId" - }, - { - "$event": "/update/requestId" - } - ] - } - } - }, - { - "$call": { - "function": "recordCustomerPaymentToken", - "args": { - "requestId": { - "$var": "tokenRequestId" - }, - "token": { - "$var": "token" - } - } - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processHotelResaleOrderPlaced": { - "do": [ - { - "$call": { - "function": "recordPlacedResaleOrder", - "args": { - "agreementKind": "hotel", - "responseRequestId": { - "$text": { - "$event": "/update/inResponseTo/requestId" - } - }, - "orderSessionId": { - "$text": { - "$event": "/update/orderSessionId" - } - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processRestaurantResaleOrderPlaced": { - "do": [ - { - "$call": { - "function": "recordPlacedResaleOrder", - "args": { - "agreementKind": "restaurant", - "responseRequestId": { - "$text": { - "$event": "/update/inResponseTo/requestId" - } - }, - "orderSessionId": { - "$text": { - "$event": "/update/orderSessionId" - } - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "parseAgreementLinkedSubscription": { - "do": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$text": { - "$event": "/subscriptionId" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$startsWith": [ - { - "$var": "subscriptionId" - }, - { - "$const": "agreementLinkedSubscriptionPrefix" - } - ] - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "tail", - "expr": { - "$sliceAfter": [ - { - "$var": "subscriptionId" - }, - { - "$const": "agreementLinkedSubscriptionPrefix" - } - ] - } - } - }, - { - "$let": { - "name": "parts", - "expr": { - "$split": { - "text": { - "$var": "tail" - }, - "separator": ":" - } - } - } - }, - { - "$let": { - "name": "orderKind", - "expr": { - "$text": { - "$listGet": { - "list": { - "$var": "parts" - }, - "index": 0, - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "componentSessionId", - "expr": { - "$text": { - "$listGet": { - "list": { - "$var": "parts" - }, - "index": 1, - "default": "" - } - } - } - } - }, - { - "$return": { - "orderKind": { - "$var": "orderKind" - }, - "componentSessionId": { - "$var": "componentSessionId" - } - } - } - ] - }, - "findPackageOrderByComponentSession": { - "args": { - "kind": { - "type": "Text" - }, - "componentSessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$var": "kind" - } - } - } - }, - { - "$let": { - "name": "componentSessionId", - "expr": { - "$text": { - "$var": "componentSessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "kind" - } - }, - { - "$not": { - "$var": "componentSessionId" - } - } - ] - }, - "then": [ - { - "$return": "" - } - ] - } - }, - { - "$let": { - "name": "ref", - "expr": { - "$object": { - "$resultValue": { - "path": { - "$concat": [ - "/componentOrderRefsBySessionId/", - { - "$var": "componentSessionId" - } - ] - } - } - } - } - } - }, - { - "$let": { - "name": "component", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "ref" - }, - "path": "/component", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "component" - } - } - }, - { - "$ne": [ - { - "$var": "component" - }, - { - "$concat": [ - { - "$var": "kind" - }, - "Order" - ] - } - ] - } - ] - }, - "then": [ - { - "$return": "" - } - ] - } - }, - { - "$return": { - "$text": { - "$pointerGet": { - "object": { - "$var": "ref" - }, - "path": "/packageOrderSessionId", - "default": "" - } - } - } - } - ] - }, - "processComponentPaymentTokenAttached": { - "do": [ - { - "$let": { - "name": "parsed", - "expr": { - "$call": { - "function": "parseAgreementLinkedSubscription", - "args": { - } - } - } - } - }, - { - "$let": { - "name": "orderKind", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "parsed" - }, - "path": "/orderKind", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "componentSessionId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "parsed" - }, - "path": "/componentSessionId", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "componentSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$event": "/targetSessionId" - } - }, - { - "$var": "componentSessionId" - } - ] - } - ] - }, - "then": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$call": { - "function": "findPackageOrderByComponentSession", - "args": { - "kind": { - "$var": "orderKind" - }, - "componentSessionId": { - "$var": "componentSessionId" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - "then": [ - { - "$let": { - "name": "token", - "expr": { - "$text": { - "$event": "/update/paymentToken" - } - } - } - }, - { - "$call": { - "function": "maybePayMerchantForToken", - "args": { - "kind": { - "$var": "orderKind" - }, - "componentSessionId": { - "$var": "componentSessionId" - }, - "token": { - "$var": "token" - }, - "orderSnapshot": { - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processComponentOrderConfirmed": { - "do": [ - { - "$let": { - "name": "parsed", - "expr": { - "$call": { - "function": "parseAgreementLinkedSubscription", - "args": { - } - } - } - } - }, - { - "$let": { - "name": "orderKind", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "parsed" - }, - "path": "/orderKind", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "componentSessionId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "parsed" - }, - "path": "/componentSessionId", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "componentSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$event": "/targetSessionId" - } - }, - { - "$var": "componentSessionId" - } - ] - } - ] - }, - "then": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$call": { - "function": "findPackageOrderByComponentSession", - "args": { - "kind": { - "$var": "orderKind" - }, - "componentSessionId": { - "$var": "componentSessionId" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderConfirmed", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "orderKind" - }, - "val": true - } - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processCustomerPayNoteFundsSecured": { - "do": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$text": { - "$event": "/subscriptionId" - } - } - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "subscriptionId" - }, - { - "$const": "packageLinkedSubscriptionPrefix" - } - ] - }, - "then": [ - { - "$let": { - "name": "targetSessionId", - "expr": { - "$sliceAfter": [ - { - "$var": "subscriptionId" - }, - { - "$const": "packageLinkedSubscriptionPrefix" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "targetSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$event": "/targetSessionId" - } - }, - { - "$var": "targetSessionId" - } - ] - } - ] - }, - "then": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/customerPayNoteRefsBySessionId/", - { - "$var": "targetSessionId" - }, - "/packageOrderSessionId" - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - "then": [ - { - "$let": { - "name": "securedAmount", - "expr": { - "$integer": { - "$coalesce": [ - { - "$event": "/update/amountSecured" - }, - { - "$event": "/update/amount" - }, - { - "$const": "expectedPackageAmount" - } - ] - } - } - } - }, - { - "$call": { - "function": "markPackagePayNoteSecured", - "args": { - "packageOrderSessionId": { - "$var": "packageOrderSessionId" - }, - "amountSecured": { - "$var": "securedAmount" - } - } - } - } - ] - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processCustomerPayNoteCompleted": { - "do": [ - { - "$let": { - "name": "subscriptionId", - "expr": { - "$text": { - "$event": "/subscriptionId" - } - } - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "subscriptionId" - }, - { - "$const": "packageLinkedSubscriptionPrefix" - } - ] - }, - "then": [ - { - "$let": { - "name": "targetSessionId", - "expr": { - "$sliceAfter": [ - { - "$var": "subscriptionId" - }, - { - "$const": "packageLinkedSubscriptionPrefix" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "targetSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$event": "/targetSessionId" - } - }, - { - "$var": "targetSessionId" - } - ] - } - ] - }, - "then": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/customerPayNoteRefsBySessionId/", - { - "$var": "targetSessionId" - }, - "/packageOrderSessionId" - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "packagePayNoteCompleted", - "val": true - } - } - } - ] - } - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processCustomerPayNoteSnapshotResolved": { - "do": [ - { - "$let": { - "name": "snapshotRequestId", - "expr": { - "$text": { - "$coalesce": [ - { - "$event": "/inResponseTo/requestId" - }, - { - "$event": "/requestId" - } - ] - } - } - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "snapshotRequestId" - }, - { - "$const": "customerPayNoteSnapshotPrefix" - } - ] - }, - "then": [ - { - "$call": { - "function": "processCustomerPayNoteInitialSnapshot", - "args": { - "payNoteSessionId": { - "$sliceAfter": [ - { - "$var": "snapshotRequestId" - }, - { - "$const": "customerPayNoteSnapshotPrefix" - } - ] - }, - "snapshot": { - "$event": "/document" - } - } - } - } - ] - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processComponentSnapshotResolved": { - "args": { - "prefix": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "snapshotRequestId", - "expr": { - "$text": { - "$coalesce": [ - { - "$event": "/inResponseTo/requestId" - }, - { - "$event": "/requestId" - } - ] - } - } - } - }, - { - "$let": { - "name": "prefix", - "expr": { - "$text": { - "$var": "prefix" - } - } - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "snapshotRequestId" - }, - { - "$var": "prefix" - } - ] - }, - "then": [ - { - "$call": { - "function": "processSnapshot", - "args": { - "sessionId": { - "$sliceAfter": [ - { - "$var": "snapshotRequestId" - }, - { - "$var": "prefix" - } - ] - }, - "snapshot": { - "$event": "/document" - } - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "processHotelComponentSnapshotResolved": { - "do": [ - { - "$call": { - "function": "processComponentSnapshotResolved", - "args": { - "prefix": { - "$const": "hotelComponentSnapshotPrefix" - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processRestaurantComponentSnapshotResolved": { - "do": [ - { - "$call": { - "function": "processComponentSnapshotResolved", - "args": { - "prefix": { - "$const": "restaurantComponentSnapshotPrefix" - } - } - } - }, - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "processInitialSnapshotUnresolved": { - "do": [ - { - "$return": { - "changeset": { - "$changeset": true - }, - "events": { - "$events": true - } - } - } - ] - }, - "buildCheckoutContext": { - "args": { - "orderSessionId": { - "type": "Text" - }, - "orderDocumentId": { - "type": "Text" - }, - "customerAccountId": { - "type": "Text" - }, - "investorAccountId": { - "type": "Text" - } - }, - "do": [ - { - "$return": { - "customerAccountId": { - "$var": "customerAccountId" - }, - "investorAccountId": { - "$var": "investorAccountId" - }, - "packageOrderDocumentId": { - "$var": "orderDocumentId" - } - } - } - ] - }, - "buildPackagePayNoteDescriptor": { - "args": { - "context": { - } - }, - "do": [ - { - "$let": { - "name": "context", - "expr": { - "$object": { - "$var": "context" - } - } - } - }, - { - "$return": { - "document": { - "name": "Customer to Boutique Travel Agency Package PayNote", - "type": "PayNote/PayNote", - "kind": "PayNote", - "description": "Customer package payment secured before provider orders.", - "payNoteInitialStateDescription": { - "summary": "Payment for the Weekend Stay + Wine Dinner package.", - "details": "This PayNote secures the customer's package payment to Boutique Travel Agency. The payment is completed only after both included merchant orders are confirmed: Hotel Aurora confirms the weekend stay order and Restaurant Lumi confirms the wine dinner order. Once both confirmations are present, the package payment is completed and the package becomes ready to use." - }, - "state": "not_started", - "currency": "USD", - "amount": { - "expectedTotal": { - "$const": "expectedPackageAmount" - } - }, - "context": { - "scenario": "reseller-weekend-package", - "paymentKind": "customer_package_purchase", - "packageOrderDocumentId": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/packageOrderDocumentId", - "default": "" - } - }, - "packagePayNoteSessionId": "", - "packagePayNoteDocumentId": "" - }, - "embeddedDocs": { - }, - "completionRequested": false, - "contracts": { - "payerChannel": { - "type": "Coordination/Timeline Channel" - }, - "payeeChannel": { - "type": "Coordination/Timeline Channel" - }, - "guarantorChannel": { - "type": "Coordination/Timeline Channel" - }, - "links": { - "type": "Sample/Document Links", - "packageOrder": { - "type": "Sample/Document Link", - "documentId": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/packageOrderDocumentId", - "default": "" - } - }, - "anchor": "payments" - }, - "packageOffer": { - "type": "Sample/Document Link", - "documentId": { - "$document": "/packageOfferDocumentId" - }, - "anchor": "customerPayNotes" - } - }, - "embeddedHotelOrderEvents": { - "type": "Embedded Node Channel", - "childPath": "/embeddedDocs/hotelOrder" - }, - "embeddedRestaurantOrderEvents": { - "type": "Embedded Node Channel", - "childPath": "/embeddedDocs/restaurantOrder" - }, - "processEmbeddedComponentOrders": { - "type": "Process Embedded", - "paths": [ - "/embeddedDocs/hotelOrder", - "/embeddedDocs/restaurantOrder" - ] - }, - "completeWhenOrdersConfirmedFromHotelEvent": { - "type": "Coordination/Sequential Workflow", - "channel": "embeddedHotelOrderEvents", - "event": { - "type": "Coordination/Event", - "kind": "Order Confirmed" - }, - "steps": [ - { - "name": "BuildCompletion", - "type": "Coordination/Compute", - "emitEvents": true, - "returnResult": true, - "do": [ - { - "$if": { - "cond": { - "$or": [ - { - "$ne": [ - { - "$text": { - "$document": "/embeddedDocs/hotelOrder/confirmation/status" - } - }, - "confirmed" - ] - }, - { - "$ne": [ - { - "$text": { - "$document": "/embeddedDocs/restaurantOrder/confirmation/status" - } - }, - "confirmed" - ] - }, - { - "$boolean": { - "$document": "/completionRequested" - } - } - ] - }, - "then": [ - { - "$return": { - "changeset": [ - - ], - "events": [ - - ] - } - } - ] - } - }, - { - "$return": { - "changeset": [ - { - "op": "replace", - "path": "/completionRequested", - "val": true - } - ], - "events": [ - { - "type": "PayNote/Complete Payment Requested", - "amount": { - "$const": "expectedPackageAmount" - } - } - ] - } - } - ] - } - ] - }, - "completeWhenOrdersConfirmedFromRestaurantEvent": { - "type": "Coordination/Sequential Workflow", - "channel": "embeddedRestaurantOrderEvents", - "event": { - "type": "Coordination/Event", - "kind": "Order Confirmed" - }, - "steps": [ - { - "name": "BuildCompletion", - "type": "Coordination/Compute", - "emitEvents": true, - "returnResult": true, - "do": [ - { - "$if": { - "cond": { - "$or": [ - { - "$ne": [ - { - "$text": { - "$document": "/embeddedDocs/hotelOrder/confirmation/status" - } - }, - "confirmed" - ] - }, - { - "$ne": [ - { - "$text": { - "$document": "/embeddedDocs/restaurantOrder/confirmation/status" - } - }, - "confirmed" - ] - }, - { - "$boolean": { - "$document": "/completionRequested" - } - } - ] - }, - "then": [ - { - "$return": { - "changeset": [ - - ], - "events": [ - - ] - } - } - ] - } - }, - { - "$return": { - "changeset": [ - { - "op": "replace", - "path": "/completionRequested", - "val": true - } - ], - "events": [ - { - "type": "PayNote/Complete Payment Requested", - "amount": { - "$const": "expectedPackageAmount" - } - } - ] - } - } - ] - } - ] - }, - "attachComponentOrder": { - "type": "Coordination/Sequential Workflow Operation", - "description": "Attaches an included merchant order snapshot so package payment can complete after both confirmations.", - "channel": "payeeChannel", - "request": { - "kind": { - "type": "Text" - }, - "initialSnapshot": { - "type": "Common/Record" - } - }, - "steps": [ - { - "name": "BuildComponentAttachment", - "type": "Coordination/Compute", - "emitEvents": true, - "returnResult": true, - "do": [ - { - "$let": { - "name": "req", - "expr": { - "$object": { - "$event": "/message/request" - } - } - } - }, - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$unwrap": { - "$pointerGet": { - "object": { - "$var": "req" - }, - "path": "/kind", - "default": "" - } - } - } - } - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "req" - }, - "path": "/initialSnapshot", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "targetPath", - "expr": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - "then": "/embeddedDocs/hotelOrder", - "else": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "restaurant" - ] - }, - "then": "/embeddedDocs/restaurantOrder", - "else": "" - } - } - } - } - } - }, - { - "$let": { - "name": "expectedKind", - "expr": { - "$choose": { - "cond": { - "$or": [ - { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - { - "$eq": [ - { - "$var": "kind" - }, - "restaurant" - ] - } - ] - }, - "then": "Order", - "else": "" - } - } - } - }, - { - "$let": { - "name": "context", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/context", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "snapshotOrderKind", - "expr": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/orderKind", - "default": "" - } - } - }, - { - "$text": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/orderKind", - "default": "" - } - } - } - ] - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "targetPath" - } - }, - { - "$ne": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/kind", - "default": "" - } - } - }, - { - "$var": "expectedKind" - } - ] - }, - { - "$ne": [ - { - "$var": "snapshotOrderKind" - }, - { - "$var": "kind" - } - ] - }, - { - "$ne": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/packageOrderDocumentId", - "default": "" - } - } - }, - { - "$text": { - "$document": "/context/packageOrderDocumentId" - } - } - ] - } - ] - }, - "then": [ - { - "$return": { - "changeset": [ - - ], - "events": [ - { - "type": "Coordination/Event", - "kind": "Component Order Attachment Rejected", - "orderKind": { - "$var": "kind" - } - } - ] - } - } - ] - } - }, - { - "$let": { - "name": "existing", - "expr": { - "$object": { - "$document": { - "path": { - "$var": "targetPath" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$gt": [ - { - "$size": { - "$keys": { - "$var": "existing" - } - } - }, - 0 - ] - }, - "then": [ - { - "$return": { - "changeset": [ - - ], - "events": [ - { - "type": "Coordination/Event", - "kind": "Component Order Attachment Rejected", - "orderKind": { - "$var": "kind" - }, - "reason": "component_order_already_attached" - } - ] - } - } - ] - } - }, - { - "$return": { - "changeset": [ - { - "op": "add", - "path": { - "$var": "targetPath" - }, - "val": { - "$var": "snapshot" - } - } - ], - "events": [ - { - "type": "Coordination/Event", - "kind": "Component Order Attached", - "orderKind": { - "$var": "kind" - } - } - ] - } - } - ] - } - ] - } - } - }, - "channelBindings": { - "payerChannel": { - "type": "Coordination/Timeline Channel", - "accountId": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/customerAccountId", - "default": "" - } - } - }, - "payeeChannel": { - "type": "Coordination/Timeline Channel", - "accountId": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/investorAccountId", - "default": "" - } - } - }, - "guarantorChannel": { - "type": "Coordination/Timeline Channel", - "accountId": "0" - } - } - } - } - ] - }, - "maybePrepareCheckoutForOrder": { - "args": { - "sessionId": { - "type": "Text" - }, - "snapshot": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "orderDocumentId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/documentId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "customerAccountId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/customerAccountId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "investorAccountId", - "expr": { - "$text": { - "$document": "/contracts/investorChannel/accountId" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$boolean": { - "$resultValue": "/state/grantsReady" - } - } - }, - { - "$not": { - "$boolean": { - "$resultValue": "/state/paymentTokenSubscriptionReady" - } - } - }, - { - "$not": { - "$var": "sessionId" - } - }, - { - "$not": { - "$var": "orderDocumentId" - } - }, - { - "$not": { - "$var": "customerAccountId" - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "checkoutContext", - "expr": { - "$call": { - "function": "buildCheckoutContext", - "args": { - "orderSessionId": { - "$var": "sessionId" - }, - "orderDocumentId": { - "$var": "orderDocumentId" - }, - "customerAccountId": { - "$var": "customerAccountId" - }, - "investorAccountId": { - "$var": "investorAccountId" - } - } - } - } - } - }, - { - "$let": { - "name": "descriptor", - "expr": { - "$call": { - "function": "buildPackagePayNoteDescriptor", - "args": { - "context": { - "$var": "checkoutContext" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/confirmed" - ] - } - } - } - } - }, - "then": [ - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "packageConfirmed", - "val": true - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "sessionId" - }, - "operation": "confirmOrder" - } - } - ] - } - }, - { - "$if": { - "cond": { - "$not": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/customerPayment/tokenRequested" - ] - } - } - } - } - }, - "then": [ - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "customerPaymentTokenRequested", - "val": true - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$document": "/investorPaymentAccountSessionId" - }, - "operation": "preparePaymentTarget", - "request": { - "requestId": { - "$coalesce": [ - { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/customerPayment/tokenRequestId" - ] - } - } - } - }, - { - "$concat": [ - "reseller-weekend-package-customer-token:", - { - "$var": "sessionId" - } - ] - } - ] - }, - "amount": { - "$const": "expectedPackageAmount" - }, - "currency": "USD", - "expectedPaynote": { - "$var": "descriptor" - } - } - } - } - ] - } - }, - { - "$call": { - "function": "maybeAttachCustomerPaymentTokenForOrder", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "orderSnapshot": { - "$coalesce": [ - { - "$var": "snapshot" - }, - { - } - ] - }, - "tokenOverride": "" - } - } - }, - { - "$return": { - } - } - ] - }, - "maybeAttachCustomerPaymentTokenForOrder": { - "args": { - "sessionId": { - "type": "Text" - }, - "orderSnapshot": { - }, - "tokenOverride": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "token", - "expr": { - "$text": { - "$var": "tokenOverride" - } - } - } - }, - { - "$let": { - "name": "orderDocumentId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/documentId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "customerAccountId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/customerAccountId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "investorAccountId", - "expr": { - "$text": { - "$document": "/contracts/investorChannel/accountId" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "sessionId" - } - }, - { - "$not": { - "$var": "token" - } - }, - { - "$not": { - "$var": "orderDocumentId" - } - }, - { - "$not": { - "$var": "customerAccountId" - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "payment", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$object": { - "$var": "orderSnapshot" - } - }, - "path": "/payment", - "default": { - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$boolean": { - "$pointerGet": { - "object": { - "$var": "payment" - }, - "path": "/tokenAttached", - "default": false - } - } - }, - { - "$eq": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "payment" - }, - "path": "/paymentToken", - "default": "" - } - } - }, - { - "$var": "token" - } - ] - } - ] - }, - "then": [ - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "customerPaymentTokenAttached", - "val": true - } - } - }, - { - "$return": { - } - } - ] - } - }, - { - "$if": { - "cond": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/customerPayment/tokenAttached" - ] - } - } - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "observedStatus", - "expr": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$object": { - "$var": "orderSnapshot" - } - }, - "path": "/status", - "default": "" - } - } - }, - { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/status" - ] - } - } - } - } - ] - } - } - }, - { - "$let": { - "name": "attachable", - "expr": { - "$or": [ - { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/confirmed" - ] - } - } - } - }, - { - "$eq": [ - { - "$var": "observedStatus" - }, - "provider_confirmed_pending_payment_token" - ] - }, - { - "$eq": [ - { - "$var": "observedStatus" - }, - "provider_confirmed" - ] - } - ] - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "attachable" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "customerPaymentTokenAttached", - "val": true - } - } - }, - { - "$let": { - "name": "descriptor", - "expr": { - "$call": { - "function": "buildPackagePayNoteDescriptor", - "args": { - "context": { - "$call": { - "function": "buildCheckoutContext", - "args": { - "orderSessionId": { - "$var": "sessionId" - }, - "orderDocumentId": { - "$var": "orderDocumentId" - }, - "customerAccountId": { - "$var": "customerAccountId" - }, - "investorAccountId": { - "$var": "investorAccountId" - } - } - } - } - } - } - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "sessionId" - }, - "operation": "attachPaymentToken", - "request": { - "paymentToken": { - "$var": "token" - }, - "expectedPayNoteDescriptor": { - "$var": "descriptor" - }, - "checkoutMetadata": { - "amountMinor": { - "$const": "expectedPackageAmount" - }, - "currency": "USD", - "packageOrderDocumentId": { - "$var": "orderDocumentId" - } - } - } - } - }, - { - "$return": { - } - } - ] - }, - "recordCustomerPaymentToken": { - "args": { - "requestId": { - }, - "token": { - } - }, - "do": [ - { - "$let": { - "name": "token", - "expr": { - "$text": { - "$var": "token" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "token" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "requestId", - "expr": { - "$text": { - "$var": "requestId" - } - } - } - }, - { - "$let": { - "name": "prefix", - "expr": "reseller-weekend-package-customer-token:" - } - }, - { - "$if": { - "cond": { - "$startsWith": [ - { - "$var": "requestId" - }, - { - "$var": "prefix" - } - ] - }, - "then": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$sliceAfter": [ - { - "$var": "requestId" - }, - { - "$var": "prefix" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "sessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "maybeAttachCustomerPaymentTokenForOrder", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "orderSnapshot": { - }, - "tokenOverride": { - "$var": "token" - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "markPackageOrderObserved": { - "args": { - "sessionId": { - "type": "Text" - }, - "snapshot": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "snapshot" - } - } - } - }, - { - "$let": { - "name": "documentId", - "expr": { - "$call": { - "function": "initializedDocumentId", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - } - } - }, - { - "$let": { - "name": "contracts", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/contracts", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "customerAccountId", - "expr": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "contracts" - }, - "path": "/customerChannel", - "default": { - } - } - }, - "path": "/accountId", - "default": "" - } - } - }, - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/customerAccountId", - "default": "" - } - } - } - ] - } - } - }, - { - "$let": { - "name": "status", - "expr": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/status", - "default": "" - } - } - }, - "order_created" - ] - } - } - }, - { - "$call": { - "function": "ensureOrderLedger", - "args": { - "sessionId": { - "$var": "sessionId" - } - } - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "packageOrderDocumentId", - "val": { - "$var": "documentId" - } - } - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "customerAccountId", - "val": { - "$var": "customerAccountId" - } - } - } - }, - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "relativePath": "/packageOrder/observed", - "val": true - } - } - }, - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "relativePath": "/packageOrder/subscriptionId", - "val": { - "$concat": [ - { - "$const": "packageLinkedSubscriptionPrefix" - }, - { - "$var": "sessionId" - } - ] - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "documentId" - } - } - }, - "then": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": { - "$concat": [ - "/packageOrderSessionByDocumentId/", - { - "$var": "documentId" - } - ] - }, - "val": { - "$var": "sessionId" - } - } - } - } - ] - } - }, - { - "$let": { - "name": "payment", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/payment", - "default": { - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$boolean": { - "$pointerGet": { - "object": { - "$var": "payment" - }, - "path": "/tokenAttached", - "default": false - } - } - }, - "then": [ - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "customerPaymentTokenAttached", - "val": true - } - } - } - ] - } - }, - { - "$if": { - "cond": { - "$eq": [ - { - "$var": "status" - }, - "ready_to_use" - ] - }, - "then": [ - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": "/status", - "val": "completed" - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "processSnapshot": { - "args": { - "sessionId": { - "type": "Text" - }, - "snapshot": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "snapshot" - } - } - } - }, - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/kind", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "Package Order" - ] - }, - "then": [ - { - "$call": { - "function": "markPackageOrderObserved", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "snapshot": { - "$var": "snapshot" - } - } - } - }, - { - "$call": { - "function": "maybePrepareCheckoutForOrder", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "snapshot": { - "$var": "snapshot" - } - } - } - }, - { - "$call": { - "function": "maybeAttachCustomerPaymentTokenForOrder", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "orderSnapshot": { - "$var": "snapshot" - }, - "tokenOverride": "" - } - } - }, - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "snapshotContext", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/context", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "orderKind", - "expr": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/orderKind", - "default": "" - } - } - }, - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshotContext" - }, - "path": "/orderKind", - "default": "" - } - } - } - ] - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$eq": [ - { - "$var": "kind" - }, - "Order" - ] - }, - { - "$or": [ - { - "$eq": [ - { - "$var": "orderKind" - }, - "hotel" - ] - }, - { - "$eq": [ - { - "$var": "orderKind" - }, - "restaurant" - ] - } - ] - } - ] - }, - "then": [ - { - "$let": { - "name": "confirmation", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/confirmation", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "componentSessionId", - "expr": { - "$coalesce": [ - { - "$var": "sessionId" - }, - { - "$text": { - "$pointerGet": { - "object": { - "$var": "snapshotContext" - }, - "path": "/orderSessionId", - "default": "" - } - } - } - ] - } - } - }, - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/componentOrderRefsBySessionId/", - { - "$var": "componentSessionId" - }, - "/packageOrderSessionId" - ] - } - } - } - } - } - }, - { - "$call": { - "function": "attachComponentSnapshotForOrder", - "args": { - "kind": { - "$var": "orderKind" - }, - "snapshot": { - "$var": "snapshot" - }, - "sourceSessionId": { - "$var": "componentSessionId" - } - } - } - }, - { - "$let": { - "name": "payment", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/payment", - "default": { - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$boolean": { - "$pointerGet": { - "object": { - "$var": "payment" - }, - "path": "/tokenAttached", - "default": false - } - } - }, - "then": [ - { - "$call": { - "function": "maybePayMerchantForToken", - "args": { - "kind": { - "$var": "orderKind" - }, - "componentSessionId": { - "$var": "componentSessionId" - }, - "token": { - "$text": { - "$pointerGet": { - "object": { - "$var": "payment" - }, - "path": "/paymentToken", - "default": "" - } - } - }, - "orderSnapshot": { - "$var": "snapshot" - } - } - } - } - ] - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - { - "$eq": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "confirmation" - }, - "path": "/status", - "default": "" - } - } - }, - "confirmed" - ] - } - ] - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderConfirmed", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "orderKind" - }, - "val": true - } - } - } - } - } - ] - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "recordPlacedResaleOrder": { - "args": { - "agreementKind": { - "type": "Text" - }, - "responseRequestId": { - "type": "Text" - }, - "orderSessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "agreementKind", - "expr": { - "$text": { - "$var": "agreementKind" - } - } - } - }, - { - "$let": { - "name": "responseRequestId", - "expr": { - "$text": { - "$var": "responseRequestId" - } - } - } - }, - { - "$let": { - "name": "orderSessionId", - "expr": { - "$text": { - "$var": "orderSessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "agreementKind" - } - }, - { - "$not": { - "$var": "responseRequestId" - } - }, - { - "$not": { - "$var": "orderSessionId" - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "existingRequest", - "expr": { - "$object": { - "$resultValue": { - "path": { - "$concat": [ - "/resaleOrderRequests/", - { - "$var": "responseRequestId" - } - ] - } - } - } - } - } - }, - { - "$let": { - "name": "nextRequest1", - "expr": { - "$merge": [ - { - "$var": "existingRequest" - }, - { - "kind": { - "$coalesce": [ - { - "$text": { - "$pointerGet": { - "object": { - "$var": "existingRequest" - }, - "path": "/kind", - "default": "" - } - } - }, - { - "$var": "agreementKind" - } - ] - }, - "orderSessionId": { - "$var": "orderSessionId" - }, - "status": "placed" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$ne": [ - { - "$var": "existingRequest" - }, - { - "$var": "nextRequest1" - } - ] - }, - "then": [ - { - "$appendChange": { - "op": "add", - "path": { - "$concat": [ - "/resaleOrderRequests/", - { - "$var": "responseRequestId" - } - ] - }, - "val": { - "$var": "nextRequest1" - } - } - } - ] - } - }, - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "nextRequest1" - }, - "path": "/packageOrderSessionId", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "packageOrderSessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "resaleOrderPlaced", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "agreementKind" - }, - "val": true - } - } - } - } - }, - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderSessions", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "agreementKind" - }, - "val": { - "$var": "orderSessionId" - } - } - } - } - } - }, - { - "$call": { - "function": "appendChangeIfChanged", - "args": { - "path": { - "$concat": [ - "/componentOrderRefsBySessionId/", - { - "$var": "orderSessionId" - } - ] - }, - "val": { - "packageOrderSessionId": { - "$var": "packageOrderSessionId" - }, - "component": { - "$concat": [ - { - "$var": "agreementKind" - }, - "Order" - ] - } - } - } - } - }, - { - "$call": { - "function": "requestComponentOrderDelivery", - "args": { - "packageOrderSessionId": { - "$var": "packageOrderSessionId" - }, - "agreementKind": { - "$var": "agreementKind" - }, - "orderSessionId": { - "$var": "orderSessionId" - } - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "requestComponentOrderDelivery": { - "args": { - "packageOrderSessionId": { - "type": "Text" - }, - "agreementKind": { - "type": "Text" - }, - "orderSessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$var": "packageOrderSessionId" - } - } - } - }, - { - "$let": { - "name": "agreementKind", - "expr": { - "$text": { - "$var": "agreementKind" - } - } - } - }, - { - "$let": { - "name": "orderSessionId", - "expr": { - "$text": { - "$var": "orderSessionId" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "packageOrderSessionId" - } - }, - { - "$not": { - "$var": "agreementKind" - } - }, - { - "$not": { - "$var": "orderSessionId" - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "snapshotRequestId", - "expr": { - "$concat": [ - "snapshot:component:", - { - "$var": "agreementKind" - }, - ":", - { - "$var": "orderSessionId" - } - ] - } - } - }, - { - "$let": { - "name": "subscriptionId", - "expr": { - "$concat": [ - { - "$const": "agreementLinkedSubscriptionPrefix" - }, - { - "$var": "agreementKind" - }, - ":", - { - "$var": "orderSessionId" - } - ] - } - } - }, - { - "$let": { - "name": "componentPathPrefix", - "expr": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "agreementKind" - }, - "hotel" - ] - }, - "then": "/hotelOrder", - "else": "/restaurantOrder" - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - { - "$var": "componentPathPrefix" - }, - "/snapshotRequestId" - ] - } - } - } - } - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentSnapshotRequestIds", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "agreementKind" - }, - "val": { - "$var": "snapshotRequestId" - } - } - } - } - } - }, - { - "$appendEvent": { - "type": "Sample/Document Initial Snapshot Requested", - "onBehalfOf": "investorChannel", - "requestId": { - "$var": "snapshotRequestId" - }, - "sourceSessionId": { - "$var": "orderSessionId" - } - } - } - ] - } - }, - { - "$if": { - "cond": { - "$not": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - { - "$var": "componentPathPrefix" - }, - "/subscriptionId" - ] - } - } - } - } - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentSubscriptionIds", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "agreementKind" - }, - "val": { - "$var": "subscriptionId" - } - } - } - } - } - }, - { - "$appendEvent": { - "type": "Sample/Subscribe to Session Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "orderSessionId" - }, - "subscription": { - "id": { - "$var": "subscriptionId" - }, - "events": [ - { - "type": "Coordination/Event", - "kind": "Payment Token Attached" - }, - { - "type": "Coordination/Event", - "kind": "Order Confirmed" - } - ] - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "placeResaleOrdersForOrder": { - "args": { - "sessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "orderDocumentId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/documentId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "customerAccountId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/customerAccountId" - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "sessionId" - } - }, - { - "$not": { - "$var": "orderDocumentId" - } - }, - { - "$not": { - "$var": "customerAccountId" - } - }, - { - "$not": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/customerPayNote/secured" - ] - } - } - } - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "placeOneResaleOrder", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "kind": "hotel", - "agreementSessionId": { - "$document": "/hotelAgreementSessionId" - }, - "ready": { - "$boolean": { - "$resultValue": "/state/hotelAgreementSubscriptionReady" - } - }, - "entitlement": { - "title": "Weekend room", - "description": "Two-night weekend stay." - } - } - } - }, - { - "$call": { - "function": "placeOneResaleOrder", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "kind": "restaurant", - "agreementSessionId": { - "$document": "/restaurantAgreementSessionId" - }, - "ready": { - "$boolean": { - "$resultValue": "/state/restaurantAgreementSubscriptionReady" - } - }, - "entitlement": { - "title": "Two-dish dinner with selected wines", - "description": "Dinner menu with selected wines." - } - } - } - }, - { - "$return": { - } - } - ] - }, - "placeOneResaleOrder": { - "args": { - "sessionId": { - "type": "Text" - }, - "kind": { - "type": "Text" - }, - "agreementSessionId": { - "type": "Text" - }, - "ready": { - "type": "Boolean" - }, - "entitlement": { - } - }, - "do": [ - { - "$let": { - "name": "sessionId", - "expr": { - "$text": { - "$var": "sessionId" - } - } - } - }, - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$var": "kind" - } - } - } - }, - { - "$let": { - "name": "agreementSessionId", - "expr": { - "$text": { - "$var": "agreementSessionId" - } - } - } - }, - { - "$let": { - "name": "ready", - "expr": { - "$boolean": { - "$var": "ready" - } - } - } - }, - { - "$let": { - "name": "requestId", - "expr": { - "$concat": [ - "resale:", - { - "$var": "sessionId" - }, - ":", - { - "$var": "kind" - } - ] - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "agreementSessionId" - } - }, - { - "$not": { - "$var": "ready" - } - }, - { - "$not": { - "$not": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/resaleOrderRequests/", - { - "$var": "requestId" - }, - "/kind" - ] - } - } - } - } - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$appendChange": { - "op": "add", - "path": { - "$concat": [ - "/resaleOrderRequests/", - { - "$var": "requestId" - } - ] - }, - "val": { - "status": "requested", - "agreementSessionId": { - "$var": "agreementSessionId" - }, - "kind": { - "$var": "kind" - }, - "packageOrderSessionId": { - "$var": "sessionId" - }, - "orderSessionId": "" - } - } - }, - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "resaleOrderRequested", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": true - } - } - } - } - }, - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "sessionId" - }, - "key": "resaleOrderRequestIds", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": { - "$var": "requestId" - } - } - } - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "agreementSessionId" - }, - "operation": "placeResaleOrder", - "request": { - "requestId": { - "$var": "requestId" - }, - "customerLabel": "Customer A", - "customerAccountId": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/customerAccountId" - ] - } - } - } - }, - "packageOrderDocumentId": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "sessionId" - }, - "/packageOrder/documentId" - ] - } - } - } - }, - "orderKind": { - "$var": "kind" - }, - "entitlement": { - "$var": "entitlement" - } - } - } - }, - { - "$return": { - } - } - ] - }, - "markPackagePayNoteSecured": { - "args": { - "packageOrderSessionId": { - "type": "Text" - }, - "amountSecured": { - } - }, - "do": [ - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$var": "packageOrderSessionId" - } - } - } - }, - { - "$let": { - "name": "normalizedAmount", - "expr": { - "$integer": { - "$coalesce": [ - { - "$var": "amountSecured" - }, - 0 - ] - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "packageOrderSessionId" - } - }, - { - "$ne": [ - { - "$var": "normalizedAmount" - }, - { - "$const": "expectedPackageAmount" - } - ] - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "packagePayNoteSecured", - "val": true - } - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "packagePayNoteSecuredAmount", - "val": { - "$var": "normalizedAmount" - } - } - } - }, - { - "$call": { - "function": "placeResaleOrdersForOrder", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - } - } - } - }, - { - "$return": { - } - } - ] - }, - "markPackagePayNoteSecuredFromSnapshot": { - "args": { - "snapshot": { - } - }, - "do": [ - { - "$if": { - "cond": { - "$not": { - "$call": { - "function": "isCustomerPackagePayNoteSnapshot", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "context", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$object": { - "$var": "snapshot" - } - }, - "path": "/context", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "packageOrderDocumentId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/packageOrderDocumentId", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/packageOrderSessionByDocumentId/", - { - "$var": "packageOrderDocumentId" - } - ] - } - } - } - } - } - }, - { - "$let": { - "name": "amount", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$object": { - "$var": "snapshot" - } - }, - "path": "/amount", - "default": { - } - } - } - } - } - }, - { - "$call": { - "function": "markPackagePayNoteSecured", - "args": { - "packageOrderSessionId": { - "$var": "packageOrderSessionId" - }, - "amountSecured": { - "$integer": { - "$pointerGet": { - "object": { - "$var": "amount" - }, - "path": "/secured", - "default": 0 - } - } - } - } - } - }, - { - "$return": { - } - } - ] - }, - "processCustomerPayNoteInitialSnapshot": { - "args": { - "payNoteSessionId": { - "type": "Text" - }, - "snapshot": { - } - }, - "do": [ - { - "$let": { - "name": "payNoteSessionId", - "expr": { - "$text": { - "$var": "payNoteSessionId" - } - } - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "snapshot" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "payNoteSessionId" - } - }, - { - "$not": { - "$call": { - "function": "isCustomerPackagePayNoteSnapshot", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "context", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/context", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "packageOrderDocumentId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/packageOrderDocumentId", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/packageOrderSessionByDocumentId/", - { - "$var": "packageOrderDocumentId" - } - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "packageOrderSessionId" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "ensureOrderLedger", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - } - } - } - }, - { - "$let": { - "name": "snapshotRequestId", - "expr": { - "$concat": [ - { - "$const": "customerPayNoteSnapshotPrefix" - }, - { - "$var": "payNoteSessionId" - } - ] - } - } - }, - { - "$let": { - "name": "subscriptionId", - "expr": { - "$concat": [ - { - "$const": "packageLinkedSubscriptionPrefix" - }, - { - "$var": "payNoteSessionId" - } - ] - } - } - }, - { - "$appendChange": { - "op": "add", - "path": { - "$concat": [ - "/customerPayNoteRefsBySessionId/", - { - "$var": "payNoteSessionId" - } - ] - }, - "val": { - "sessionId": { - "$var": "payNoteSessionId" - }, - "packageOrderSessionId": { - "$var": "packageOrderSessionId" - }, - "packageOrderDocumentId": { - "$var": "packageOrderDocumentId" - }, - "snapshotRequestId": { - "$var": "snapshotRequestId" - }, - "subscriptionId": { - "$var": "subscriptionId" - } - } - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "packagePayNoteSessionId", - "val": { - "$var": "payNoteSessionId" - } - } - } - }, - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "relativePath": "/customerPayNote/snapshotRequestId", - "val": { - "$var": "snapshotRequestId" - } - } - } - }, - { - "$call": { - "function": "setOrderPath", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "relativePath": "/customerPayNote/subscriptionId", - "val": { - "$var": "subscriptionId" - } - } - } - }, - { - "$call": { - "function": "markPackagePayNoteSecuredFromSnapshot", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - }, - { - "$if": { - "cond": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - "/customerPayNote/attachedToPackageOrder" - ] - } - } - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "packagePayNoteAttached", - "val": true - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "packageOrderSessionId" - }, - "operation": "attachPayNote", - "request": { - "payNoteSessionId": { - "$var": "payNoteSessionId" - }, - "initialSnapshot": { - "$var": "snapshot" - } - } - } - }, - { - "$return": { - } - } - ] - }, - "buildMerchantPayNoteDescriptor": { - "args": { - "kind": { - "type": "Text" - }, - "amountMinor": { - "type": "Integer" - }, - "orderSnapshot": { - }, - "orderSessionId": { - "type": "Text" - } - }, - "do": [ - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$var": "kind" - } - } - } - }, - { - "$let": { - "name": "amountMinor", - "expr": { - "$integer": { - "$var": "amountMinor" - } - } - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "orderSnapshot" - } - } - } - }, - { - "$return": { - "document": { - "name": "Boutique Travel Agency Merchant PayNote", - "type": "PayNote/PayNote", - "kind": "PayNote", - "description": "Boutique Travel Agency merchant payout secured before fulfillment.", - "payNoteInitialStateDescription": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - "then": { - "summary": "Secured payout for the Hotel Aurora stay order.", - "details": "This PayNote secures Boutique Travel Agency's payment to Hotel Aurora for the customer's weekend stay order. Funds are secured before the customer checks in. The payment completes when Hotel Aurora confirms check-in on the embedded Hotel Stay Order." - }, - "else": { - "summary": "Secured payout for the Restaurant Lumi dinner order.", - "details": "This PayNote secures Boutique Travel Agency's payment to Restaurant Lumi for the customer's wine dinner order. Funds are secured before the restaurant visit. The payment completes when Restaurant Lumi confirms the visit on the embedded Restaurant Dinner Order." - } - } - }, - "state": "not_started", - "currency": "USD", - "amount": { - "expectedTotal": { - "$var": "amountMinor" - } - }, - "context": { - "paymentPurpose": "merchant_resale_payout", - "orderDocumentId": { - "$call": { - "function": "initializedDocumentId", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - }, - "agreementDocumentId": { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/contracts", - "default": { - } - } - }, - "path": "/links", - "default": { - } - } - }, - "path": "/resaleAgreement/documentId", - "default": "" - } - } - } - }, - "embeddedDocs": { - "order": { - "$var": "snapshot" - } - }, - "completionRequested": false, - "contracts": { - "payerChannel": { - "type": "Coordination/Timeline Channel" - }, - "payeeChannel": { - "type": "Coordination/Timeline Channel" - }, - "guarantorChannel": { - "type": "Coordination/Timeline Channel" - }, - "links": { - "type": "Sample/Document Links", - "resaleAgreement": { - "type": "Sample/Document Link", - "documentId": { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/contracts", - "default": { - } - } - }, - "path": "/links", - "default": { - } - } - }, - "path": "/resaleAgreement/documentId", - "default": "" - } - } - }, - "anchor": "merchantPayNotes" - } - }, - "embedded": { - "type": "Process Embedded", - "paths": [ - "/embeddedDocs/order" - ] - }, - "embeddedOrderEvents": { - "type": "Embedded Node Channel", - "childPath": "/embeddedDocs/order" - }, - "completeOnFulfillmentEvent": { - "type": "Coordination/Sequential Workflow", - "channel": "embeddedOrderEvents", - "event": { - "type": "Coordination/Event", - "kind": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - "then": "Hotel Check-In Confirmed", - "else": "Restaurant Visit Confirmed" - } - } - }, - "steps": [ - { - "name": "BuildEventCompletion", - "type": "Coordination/Compute", - "emitEvents": true, - "returnResult": true, - "do": [ - { - "$if": { - "cond": { - "$boolean": { - "$document": "/completionRequested" - } - }, - "then": [ - { - "$return": { - "changeset": [ - - ], - "events": [ - - ] - } - } - ] - } - }, - { - "$return": { - "changeset": [ - { - "op": "replace", - "path": "/completionRequested", - "val": true - } - ], - "events": [ - { - "type": "PayNote/Complete Payment Requested", - "amount": { - "$var": "amountMinor" - } - } - ] - } - } - ] - } - ] - } - } - }, - "channelBindings": { - "payerChannel": { - "type": "Coordination/Timeline Channel", - "accountId": { - "$text": { - "$document": "/contracts/investorChannel/accountId" - } - } - }, - "payeeChannel": { - "type": "Coordination/Timeline Channel", - "accountId": { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/contracts/sellerChannel", - "default": { - } - } - }, - "path": "/accountId", - "default": "" - } - } - } - }, - "guarantorChannel": { - "type": "Coordination/Timeline Channel", - "accountId": "0" - } - } - } - } - ] - }, - "maybePayMerchantForToken": { - "args": { - "kind": { - "type": "Text" - }, - "componentSessionId": { - "type": "Text" - }, - "token": { - "type": "Text" - }, - "orderSnapshot": { - } - }, - "do": [ - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$var": "kind" - } - } - } - }, - { - "$let": { - "name": "componentSessionId", - "expr": { - "$text": { - "$var": "componentSessionId" - } - } - } - }, - { - "$let": { - "name": "token", - "expr": { - "$text": { - "$var": "token" - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "kind" - } - }, - { - "$not": { - "$var": "componentSessionId" - } - }, - { - "$not": { - "$var": "token" - } - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$call": { - "function": "findPackageOrderByComponentSession", - "args": { - "kind": { - "$var": "kind" - }, - "componentSessionId": { - "$var": "componentSessionId" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "packageOrderSessionId" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$if": { - "cond": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - "then": "/hotelOrder/merchantPaymentInitiated", - "else": "/restaurantOrder/merchantPaymentInitiated" - } - } - ] - } - } - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "orderSnapshot" - } - } - } - }, - { - "$let": { - "name": "orderDocumentId", - "expr": { - "$call": { - "function": "initializedDocumentId", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - } - } - }, - { - "$let": { - "name": "contracts", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/contracts", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "sellerAccountId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "contracts" - }, - "path": "/sellerChannel", - "default": { - } - } - }, - "path": "/accountId", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "agreementDocumentId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$pointerGet": { - "object": { - "$var": "contracts" - }, - "path": "/links", - "default": { - } - } - }, - "path": "/resaleAgreement", - "default": { - } - } - }, - "path": "/documentId", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$not": { - "$var": "orderDocumentId" - } - }, - { - "$not": { - "$var": "sellerAccountId" - } - }, - { - "$not": { - "$var": "agreementDocumentId" - } - } - ] - }, - "then": [ - { - "$appendEvent": { - "type": "Sample/Document Initial Snapshot Requested", - "onBehalfOf": "investorChannel", - "requestId": { - "$concat": [ - "snapshot:component:", - { - "$var": "kind" - }, - ":", - { - "$var": "componentSessionId" - } - ] - }, - "sourceSessionId": { - "$var": "componentSessionId" - } - } - }, - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "amountMinor", - "expr": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - "then": { - "$const": "hotelAmountMinor" - }, - "else": { - "$const": "restaurantAmountMinor" - } - } - } - } - }, - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "merchantPaymentInitiated", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": true - } - } - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$document": "/investorPaymentAccountSessionId" - }, - "operation": "pay", - "request": { - "requestId": { - "$concat": [ - "reseller-weekend-package-", - { - "$var": "kind" - }, - "-merchant-payment-", - { - "$document": "/runId" - }, - "-", - { - "$var": "packageOrderSessionId" - } - ] - }, - "recipient": { - "type": "Sample/Sample Balance Account", - "token": { - "$var": "token" - } - }, - "amount": { - "$var": "amountMinor" - }, - "currency": "USD", - "paynote": { - "$call": { - "function": "buildMerchantPayNoteDescriptor", - "args": { - "kind": { - "$var": "kind" - }, - "amountMinor": { - "$var": "amountMinor" - }, - "orderSnapshot": { - "$var": "snapshot" - }, - "orderSessionId": { - "$var": "componentSessionId" - } - } - } - } - } - } - }, - { - "$return": { - } - } - ] - }, - "attachComponentSnapshotForOrder": { - "args": { - "kind": { - "type": "Text" - }, - "snapshot": { - }, - "sourceSessionId": { - } - }, - "do": [ - { - "$let": { - "name": "kind", - "expr": { - "$text": { - "$var": "kind" - } - } - } - }, - { - "$let": { - "name": "snapshot", - "expr": { - "$object": { - "$var": "snapshot" - } - } - } - }, - { - "$let": { - "name": "context", - "expr": { - "$object": { - "$pointerGet": { - "object": { - "$var": "snapshot" - }, - "path": "/context", - "default": { - } - } - } - } - } - }, - { - "$let": { - "name": "nextSessionId", - "expr": { - "$coalesce": [ - { - "$text": { - "$var": "sourceSessionId" - } - }, - { - "$text": { - "$pointerGet": { - "object": { - "$var": "context" - }, - "path": "/orderSessionId", - "default": "" - } - } - } - ] - } - } - }, - { - "$let": { - "name": "ref", - "expr": { - "$object": { - "$resultValue": { - "path": { - "$concat": [ - "/componentOrderRefsBySessionId/", - { - "$var": "nextSessionId" - } - ] - } - } - } - } - } - }, - { - "$let": { - "name": "packageOrderSessionId", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "ref" - }, - "path": "/packageOrderSessionId", - "default": "" - } - } - } - } - }, - { - "$let": { - "name": "component", - "expr": { - "$text": { - "$pointerGet": { - "object": { - "$var": "ref" - }, - "path": "/component", - "default": "" - } - } - } - } - }, - { - "$if": { - "cond": { - "$and": [ - { - "$not": { - "$not": { - "$var": "component" - } - } - }, - { - "$ne": [ - { - "$var": "component" - }, - { - "$concat": [ - { - "$var": "kind" - }, - "Order" - ] - } - ] - } - ] - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "packageOrderSessionId" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "ensureOrderLedger", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - } - } - } - }, - { - "$let": { - "name": "prefix", - "expr": { - "$choose": { - "cond": { - "$eq": [ - { - "$var": "kind" - }, - "hotel" - ] - }, - "then": "/hotelOrder", - "else": "/restaurantOrder" - } - } - } - }, - { - "$let": { - "name": "previousSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - { - "$var": "prefix" - }, - "/sessionId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "previousDocumentId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - { - "$var": "prefix" - }, - "/documentId" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "nextDocumentId", - "expr": { - "$call": { - "function": "initializedDocumentId", - "args": { - "snapshot": { - "$var": "snapshot" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$var": "nextDocumentId" - } - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$let": { - "name": "alreadyAttached", - "expr": { - "$boolean": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - { - "$var": "prefix" - }, - "/attachedToPackageOrder" - ] - } - } - } - } - } - }, - { - "$let": { - "name": "sameRef", - "expr": { - "$and": [ - { - "$var": "alreadyAttached" - }, - { - "$eq": [ - { - "$var": "previousSessionId" - }, - { - "$var": "nextSessionId" - } - ] - }, - { - "$eq": [ - { - "$var": "previousDocumentId" - }, - { - "$var": "nextDocumentId" - } - ] - } - ] - } - } - }, - { - "$if": { - "cond": { - "$var": "sameRef" - }, - "then": [ - { - "$return": { - } - } - ] - } - }, - { - "$if": { - "cond": { - "$or": [ - { - "$and": [ - { - "$not": { - "$not": { - "$var": "previousSessionId" - } - } - }, - { - "$not": { - "$not": { - "$var": "nextSessionId" - } - } - }, - { - "$ne": [ - { - "$var": "previousSessionId" - }, - { - "$var": "nextSessionId" - } - ] - } - ] - }, - { - "$and": [ - { - "$not": { - "$not": { - "$var": "previousDocumentId" - } - } - }, - { - "$ne": [ - { - "$var": "previousDocumentId" - }, - { - "$var": "nextDocumentId" - } - ] - } - ] - } - ] - }, - "then": [ - { - "$call": { - "function": "setOrderField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": { - "$concat": [ - { - "$var": "kind" - }, - "ComponentRejected" - ] - }, - "val": "component_order_already_attached" - } - } - }, - { - "$return": { - } - } - ] - } - }, - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderAttached", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": true - } - } - } - } - }, - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderDocumentIds", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": { - "$var": "nextDocumentId" - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "nextSessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderSessions", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": { - "$var": "nextSessionId" - } - } - } - } - } - } - ] - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "packageOrderSessionId" - }, - "operation": "attachComponentOrder", - "request": { - "kind": { - "$var": "kind" - }, - "initialSnapshot": { - "$var": "snapshot" - } - } - } - }, - { - "$let": { - "name": "packagePayNoteSessionId", - "expr": { - "$text": { - "$resultValue": { - "path": { - "$concat": [ - "/orders/", - { - "$var": "packageOrderSessionId" - }, - "/customerPayNote/sessionId" - ] - } - } - } - } - } - }, - { - "$if": { - "cond": { - "$not": { - "$not": { - "$var": "packagePayNoteSessionId" - } - } - }, - "then": [ - { - "$call": { - "function": "mergeOrderObjectField", - "args": { - "sessionId": { - "$var": "packageOrderSessionId" - }, - "key": "componentOrderAttachedToPayNote", - "patch": { - "$objectSet": { - "object": { - }, - "key": { - "$var": "kind" - }, - "val": true - } - } - } - } - }, - { - "$appendEvent": { - "type": "Sample/Call Operation Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$var": "packagePayNoteSessionId" - }, - "operation": "attachComponentOrder", - "request": { - "kind": { - "$var": "kind" - }, - "initialSnapshot": { - "$var": "snapshot" - } - } - } - } - ] - } - }, - { - "$return": { - } - } - ] - }, - "buildPackageFulfillmentSetupRequests": { - "do": [ - { - "$return": { - "changeset": [ - - ], - "events": [ - { - "type": "Sample/Single Document Permission Grant Requested", - "onBehalfOf": "investorChannel", - "requestId": { - "$concat": [ - "sdpg:package:investor-payment-account:", - { - "$document": "/investorPaymentAccountSessionId" - } - ] - }, - "targetSessionId": { - "$document": "/investorPaymentAccountSessionId" - }, - "permissions": { - "read": true, - "singleOps": [ - "pay", - "preparePaymentTarget" - ] - } - }, - { - "type": "Sample/Single Document Permission Grant Requested", - "onBehalfOf": "investorChannel", - "requestId": { - "$concat": [ - "sdpg:package:hotel-agreement:", - { - "$document": "/hotelAgreementSessionId" - } - ] - }, - "targetSessionId": { - "$document": "/hotelAgreementSessionId" - }, - "permissions": { - "read": true, - "singleOps": [ - "placeResaleOrder" - ] - } - }, - { - "type": "Sample/Single Document Permission Grant Requested", - "onBehalfOf": "investorChannel", - "requestId": { - "$concat": [ - "sdpg:package:restaurant-agreement:", - { - "$document": "/restaurantAgreementSessionId" - } - ] - }, - "targetSessionId": { - "$document": "/restaurantAgreementSessionId" - }, - "permissions": { - "read": true, - "singleOps": [ - "placeResaleOrder" - ] - } - }, - { - "type": "Sample/Linked Documents Permission Grant Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$document": "/packageOfferSessionId" - }, - "requestId": { - "$concat": [ - "ldpg:package-offer:orders:", - { - "$document": "/packageOfferSessionId" - } - ] - }, - "name": "Package offer order links", - "links": { - "orders": { - "read": true, - "singleOps": [ - "confirmOrder", - "attachPaymentToken", - "attachPayNote", - "attachComponentOrder" - ] - } - } - }, - { - "type": "Sample/Linked Documents Permission Grant Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$document": "/packageOfferSessionId" - }, - "requestId": { - "$concat": [ - "ldpg:package-offer:customer-paynotes:", - { - "$document": "/packageOfferSessionId" - } - ] - }, - "name": "Package offer customer PayNote links", - "links": { - "customerPayNotes": { - "read": true, - "singleOps": [ - "attachComponentOrder" - ] - } - } - }, - { - "type": "Sample/Linked Documents Permission Grant Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$document": "/hotelAgreementSessionId" - }, - "requestId": { - "$concat": [ - "ldpg:hotel-agreement:orders:", - { - "$document": "/hotelAgreementSessionId" - } - ] - }, - "name": "Hotel agreement order links", - "links": { - "orders": { - "read": true - } - } - }, - { - "type": "Sample/Linked Documents Permission Grant Requested", - "onBehalfOf": "investorChannel", - "targetSessionId": { - "$document": "/restaurantAgreementSessionId" - }, - "requestId": { - "$concat": [ - "ldpg:restaurant-agreement:orders:", - { - "$document": "/restaurantAgreementSessionId" - } - ] - }, - "name": "Restaurant agreement order links", - "links": { - "orders": { - "read": true - } - } - } - ] - } - } - ] - } - } - } - }, - "kind": "Global Package Fulfillment Automation", - "status": "active", - "hotelAgreementSessionId": "hotel-agreement-session", - "investorPaymentAccountSessionId": "investor-payment-session", - "packageOfferDocumentId": "783DnFBHNTYAntUMGupaoArsByZ4f2Aet55aJ6UR6bHg", - "packageOfferSessionId": "package-offer-session", - "restaurantAgreementSessionId": "restaurant-agreement-session", - "runId": "harness", - "packageOrderSessionByDocumentId": { - "type": "Dictionary", - "keyType": "Text", - "valueType": "Text", - "zzimVxhnKLL5SwMkS9kmF8p5g7pyxPWBu664HxGbszB": "package-order-a", - "Dkik7zyrq8AZqGXCimyioGQAdYKz2SuGMpkVV1ZrgmXS": "package-order-b" - }, - "customerPayNoteRefsBySessionId": { - "type": "Dictionary", - "keyType": "Text", - "valueType": { - "sessionId": { - "type": "Text" - }, - "packageOrderSessionId": { - "type": "Text" - }, - "packageOrderDocumentId": { - "type": "Text" - }, - "snapshotRequestId": { - "type": "Text" - }, - "subscriptionId": { - "type": "Text" - } - }, - "customer-paynote-a": { - "sessionId": "customer-paynote-a", - "subscriptionId": "package-linked:customer-paynote-a", - "snapshotRequestId": "snapshot:customer-paynote:customer-paynote-a", - "packageOrderSessionId": "", - "packageOrderDocumentId": "" - } - }, - "componentOrderRefsBySessionId": { - "type": "Dictionary", - "keyType": "Text", - "valueType": { - "packageOrderSessionId": { - "type": "Text" - }, - "component": { - "type": "Text" - } - } - }, - "orders": { - "type": "Dictionary", - "keyType": "Text", - "valueType": { - "packageOrder": { - "sessionId": { - "type": "Text" - }, - "documentId": { - "type": "Text" - }, - "customerAccountId": { - "type": "Text" - }, - "subscriptionId": { - "type": "Text" - }, - "observed": { - "type": "Boolean" - }, - "confirmed": { - "type": "Boolean" - } - }, - "customerPayment": { - "tokenRequestId": { - "type": "Text" - }, - "tokenRequested": { - "type": "Boolean" - }, - "tokenAttached": { - "type": "Boolean" - } - }, - "customerPayNote": { - "sessionId": { - "type": "Text" - }, - "snapshotRequestId": { - "type": "Text" - }, - "subscriptionId": { - "type": "Text" - }, - "attachedToPackageOrder": { - "type": "Boolean" - }, - "secured": { - "type": "Boolean" - }, - "securedAmount": { - "type": "Integer" - }, - "completed": { - "type": "Boolean" - } - }, - "hotelOrder": { - "sessionId": { - "type": "Text" - }, - "documentId": { - "type": "Text" - }, - "resaleRequestId": { - "type": "Text" - }, - "resaleRequested": { - "type": "Boolean" - }, - "resalePlaced": { - "type": "Boolean" - }, - "snapshotRequestId": { - "type": "Text" - }, - "subscriptionId": { - "type": "Text" - }, - "attachedToPackageOrder": { - "type": "Boolean" - }, - "attachedToPayNote": { - "type": "Boolean" - }, - "merchantPaymentInitiated": { - "type": "Boolean" - }, - "confirmed": { - "type": "Boolean" - } - }, - "restaurantOrder": { - "sessionId": { - "type": "Text" - }, - "documentId": { - "type": "Text" - }, - "resaleRequestId": { - "type": "Text" - }, - "resaleRequested": { - "type": "Boolean" - }, - "resalePlaced": { - "type": "Boolean" - }, - "snapshotRequestId": { - "type": "Text" - }, - "subscriptionId": { - "type": "Text" - }, - "attachedToPackageOrder": { - "type": "Boolean" - }, - "attachedToPayNote": { - "type": "Boolean" - }, - "merchantPaymentInitiated": { - "type": "Boolean" - }, - "confirmed": { - "type": "Boolean" - } - } - }, - "package-order-a": { - "hotelOrder": { - "confirmed": false, - "sessionId": "", - "documentId": "", - "resalePlaced": false, - "subscriptionId": "", - "resaleRequestId": "", - "resaleRequested": false, - "attachedToPayNote": false, - "snapshotRequestId": "", - "attachedToPackageOrder": false, - "merchantPaymentInitiated": false - }, - "packageOrder": { - "observed": true, - "confirmed": true, - "sessionId": "package-order-a", - "documentId": "zzimVxhnKLL5SwMkS9kmF8p5g7pyxPWBu664HxGbszB", - "subscriptionId": "package-linked:package-order-a", - "customerAccountId": "customer-a-uid" - }, - "customerPayNote": { - "secured": false, - "completed": false, - "sessionId": "", - "securedAmount": 0, - "subscriptionId": "", - "snapshotRequestId": "", - "attachedToPackageOrder": false - }, - "customerPayment": { - "tokenAttached": true, - "tokenRequestId": "reseller-weekend-package-customer-token:package-order-a", - "tokenRequested": true - }, - "restaurantOrder": { - "confirmed": false, - "sessionId": "", - "documentId": "", - "resalePlaced": false, - "subscriptionId": "", - "resaleRequestId": "", - "resaleRequested": false, - "attachedToPayNote": false, - "snapshotRequestId": "", - "attachedToPackageOrder": false, - "merchantPaymentInitiated": false - } - }, - "package-order-b": { - "hotelOrder": { - "confirmed": false, - "sessionId": "", - "documentId": "", - "resalePlaced": false, - "subscriptionId": "", - "resaleRequestId": "", - "resaleRequested": false, - "attachedToPayNote": false, - "snapshotRequestId": "", - "attachedToPackageOrder": false, - "merchantPaymentInitiated": false - }, - "packageOrder": { - "observed": true, - "confirmed": true, - "sessionId": "package-order-b", - "documentId": "Dkik7zyrq8AZqGXCimyioGQAdYKz2SuGMpkVV1ZrgmXS", - "subscriptionId": "package-linked:package-order-b", - "customerAccountId": "customer-b-uid" - }, - "customerPayNote": { - "secured": false, - "completed": false, - "sessionId": "", - "securedAmount": 0, - "subscriptionId": "", - "snapshotRequestId": "", - "attachedToPackageOrder": false - }, - "customerPayment": { - "tokenAttached": true, - "tokenRequestId": "reseller-weekend-package-customer-token:package-order-b", - "tokenRequested": true - }, - "restaurantOrder": { - "confirmed": false, - "sessionId": "", - "documentId": "", - "resalePlaced": false, - "subscriptionId": "", - "resaleRequestId": "", - "resaleRequested": false, - "attachedToPayNote": false, - "snapshotRequestId": "", - "attachedToPackageOrder": false, - "merchantPaymentInitiated": false - } - } - }, - "resaleOrderRequests": { - "type": "Dictionary", - "keyType": "Text", - "valueType": { - "status": { - "type": "Text" - }, - "agreementSessionId": { - "type": "Text" - }, - "kind": { - "type": "Text" - }, - "packageOrderSessionId": { - "type": "Text" - }, - "orderSessionId": { - "type": "Text" - } - } - }, - "counters": { - "resaleOrderRequestSeq": 0 - }, - "state": { - "agreementSubscriptionsRequested": true, - "grantsReady": true, - "hotelAgreementSubscriptionReady": true, - "hotelOrdersLdpgReady": true, - "packageOfferLdpgReady": true, - "paymentTokenSubscriptionReady": true, - "paymentTokenSubscriptionRequested": true, - "restaurantAgreementSubscriptionReady": true, - "restaurantOrdersLdpgReady": true, - "customerPayNotesLdpgReady": true, - "setupGrants": { - "hotelAgreement": true, - "investorPaymentAccount": true, - "restaurantAgreement": true - } - } -} diff --git a/src/test/resources/processor-delay/customer-paynote-snapshot.event.yaml b/src/test/resources/processor-delay/customer-paynote-snapshot.event.yaml deleted file mode 100644 index b7fd2ea..0000000 --- a/src/test/resources/processor-delay/customer-paynote-snapshot.event.yaml +++ /dev/null @@ -1,265 +0,0 @@ -# Generated from src/test/resources/processor-delay/customer-paynote-snapshot.event.json -type: "Coordination/Timeline Entry" -timeline: - type: "Coordination/Timeline" - providerId: "test-provider" - timelineId: "admin-timeline" -timestamp: 1700000000000 -actor: - type: "Sample/Principal Actor" - accountId: "0" -message: - type: "Coordination/Operation Request" - operation: "sampleAdminUpdate" - channel: "sampleAdminChannel" - request: - - type: "Sample/Document Initial Snapshot Resolved" - inResponseTo: - requestId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "snapshot:customer-paynote:customer-paynote-a" - document: - name: "Customer to Boutique Travel Agency Package PayNote" - description: "Customer package payment secured before provider orders." - type: { blueId: "emSg8pWstEHBtnbUPNu7rmqMzWskDCUbyggteUdk32w" } - amount: - expectedTotal: - type: { blueId: "5WNMiV9Knz63B4dVY5JtMyh3FB4FSGqv7ceScvuapdE1" } - value: 100000 - secured: - type: { blueId: "5WNMiV9Knz63B4dVY5JtMyh3FB4FSGqv7ceScvuapdE1" } - value: 100000 - contracts: - guarantorChannel: - type: { blueId: "HCF8mXnX3dFjQ8osjxb4Wzm2Nm1DoXnTYuA5sPnV7NTs" } - timelineId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "admin-timeline" - accountId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "0" - payeeChannel: - type: { blueId: "HCF8mXnX3dFjQ8osjxb4Wzm2Nm1DoXnTYuA5sPnV7NTs" } - timelineId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "investor-timeline" - accountId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "investor-uid" - payerChannel: - type: { blueId: "HCF8mXnX3dFjQ8osjxb4Wzm2Nm1DoXnTYuA5sPnV7NTs" } - timelineId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "a-customer-timeline" - accountId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "customer-a-uid" - links: - type: { blueId: "4cmrbevB6K23ZenjqwmNxpnaw6RF4VB3wkP7XB59V7W5" } - packageOffer: - type: { blueId: "BFxgEnovNHQ693YR2YvALi4FP8vjcwSQiX63LiLwjUhk" } - anchor: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "customerPayNotes" - documentId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "783DnFBHNTYAntUMGupaoArsByZ4f2Aet55aJ6UR6bHg" - packageOrder: - type: { blueId: "BFxgEnovNHQ693YR2YvALi4FP8vjcwSQiX63LiLwjUhk" } - anchor: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "payments" - documentId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "zzimVxhnKLL5SwMkS9kmF8p5g7pyxPWBu664HxGbszB" - attachComponentOrder: - description: "Attaches an included merchant order snapshot so package payment can complete after both confirmations." - type: { blueId: "39HJEYVHX6RoRhdVx2mpLQ1GQ3RP5CSvDCSiWF6Mhdpq" } - channel: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "payeeChannel" - request: - kind: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - initialSnapshot: - type: { blueId: "J18rFf6VX3ADe5gTnqmL4wXtivLkzrRXLPPhnoghnjzB" } - steps: - items: - - name: "BuildComponentAttachment" - type: { blueId: "ExZxT61PSpWHpEAtP2WKMXXqxEYN7Z13j7Zv36Dp99kS" } - code: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "const unwrap = value => value && typeof value === 'object' && value.value \u0021== undefined ? value.value : value; const readField = (object, key) => unwrap((object || {})[key]); const req = event.message.request || {}; const kind = unwrap(req.kind) || ''; const snapshot = req.initialSnapshot || {}; const expectedKind = kind === 'hotel' || kind === 'restaurant' ? 'Order' : ''; const targetPath = kind === 'hotel' ? '/embeddedDocs/hotelOrder' : kind === 'restaurant' ? '/embeddedDocs/restaurantOrder' : ''; const context = snapshot.context || {}; const existing = targetPath ? document(targetPath) || {} : {}; const snapshotOrderKind = readField(snapshot, 'orderKind') || readField(context, 'orderKind'); if (\u0021targetPath || readField(snapshot, 'kind') \u0021== expectedKind || snapshotOrderKind \u0021== kind || readField(context, 'packageOrderDocumentId') \u0021== document('/context/packageOrderDocumentId')) return { changeset: [], events: [{ type: 'Coordination/Event', kind: 'Component Order Attachment Rejected', orderKind: kind }] }; if (existing && Object.keys(existing).length > 0) return { changeset: [], events: [{ type: 'Coordination/Event', kind: 'Component Order Attachment Rejected', orderKind: kind, reason: 'component_order_already_attached' }] }; return { changeset: [{ op: 'add', path: targetPath, val: snapshot }], events: [{ type: 'Coordination/Event', kind: 'Component Order Attached', orderKind: kind }] };" - - name: "ApplyComponentAttachment" - type: { blueId: "FtHZJzH4hqAoGxFBjsmy1svfT4BwEBB4aHpFSZycZLLa" } - changeset: - $binding: - name: "steps" - path: "/BuildComponentAttachment/changeset" - embeddedHotelOrderEvents: - type: { blueId: "Fjbu3QpnUaTruDTcTidETCX2N5STyv7KYxT42PCzGHxm" } - childPath: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "/embeddedDocs/hotelOrder" - embeddedRestaurantOrderEvents: - type: { blueId: "Fjbu3QpnUaTruDTcTidETCX2N5STyv7KYxT42PCzGHxm" } - childPath: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "/embeddedDocs/restaurantOrder" - processEmbeddedComponentOrders: - type: { blueId: "Hu4XkfvyXLSdfFNUwuXebEu3oJeWcMyhBTcRV9AQyKPC" } - paths: - items: - - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "/embeddedDocs/hotelOrder" - - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "/embeddedDocs/restaurantOrder" - completeWhenOrdersConfirmedFromHotelEvent: - type: { blueId: "7X3LkN54Yp88JgZbppPhP6hM3Jqiqv8Z2i4kS7phXtQe" } - channel: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "embeddedHotelOrderEvents" - event: - type: { blueId: "5Wz4G9qcnBJnntYRkz4dgLK5bSuoMpYJZj4j5M59z4we" } - kind: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "Order Confirmed" - steps: - items: - - name: "BuildCompletion" - type: { blueId: "ExZxT61PSpWHpEAtP2WKMXXqxEYN7Z13j7Zv36Dp99kS" } - code: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "const hotel = document('/embeddedDocs/hotelOrder/confirmation/status'); const restaurant = document('/embeddedDocs/restaurantOrder/confirmation/status'); if (hotel \u0021== 'confirmed' || restaurant \u0021== 'confirmed' || document('/completionRequested')) return { changeset: [], events: [] }; return { changeset: [{ op: 'replace', path: '/completionRequested', val: true }], events: [{ type: 'PayNote/Complete Payment Requested', amount: 100000 }] };" - - name: "ApplyCompletionFlag" - type: { blueId: "FtHZJzH4hqAoGxFBjsmy1svfT4BwEBB4aHpFSZycZLLa" } - changeset: - $binding: - name: "steps" - path: "/BuildCompletion/changeset" - completeWhenOrdersConfirmedFromRestaurantEvent: - type: { blueId: "7X3LkN54Yp88JgZbppPhP6hM3Jqiqv8Z2i4kS7phXtQe" } - channel: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "embeddedRestaurantOrderEvents" - event: - type: { blueId: "5Wz4G9qcnBJnntYRkz4dgLK5bSuoMpYJZj4j5M59z4we" } - kind: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "Order Confirmed" - steps: - items: - - name: "BuildCompletion" - type: { blueId: "ExZxT61PSpWHpEAtP2WKMXXqxEYN7Z13j7Zv36Dp99kS" } - code: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "const hotel = document('/embeddedDocs/hotelOrder/confirmation/status'); const restaurant = document('/embeddedDocs/restaurantOrder/confirmation/status'); if (hotel \u0021== 'confirmed' || restaurant \u0021== 'confirmed' || document('/completionRequested')) return { changeset: [], events: [] }; return { changeset: [{ op: 'replace', path: '/completionRequested', val: true }], events: [{ type: 'PayNote/Complete Payment Requested', amount: 100000 }] };" - - name: "ApplyCompletionFlag" - type: { blueId: "FtHZJzH4hqAoGxFBjsmy1svfT4BwEBB4aHpFSZycZLLa" } - changeset: - $binding: - name: "steps" - path: "/BuildCompletion/changeset" - initialized: - type: "Processing Initialized Marker" - documentId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "CxSx6ELb64NzbBE5pw5dYpJdQz7JMdtYnLAT25QXuuNa" - checkpoint: - type: { blueId: "B7YQeYdQzUNuzaDQ4tNTd2iJqgd4YnVQkgz4QgymDWWU" } - lastEvents: - guarantorChannel: - type: { blueId: "F3mQaGQ1B48yMedKZojFTxeKxtee4xU66QBbiyEMvGeZ" } - actor: - type: { blueId: "5GB8C22LsZGR3kkEmP5j5Zye7SR173ojzzUK99tUcoP" } - accountId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "0" - message: - type: { blueId: "HM4Ku4LFcjC5MxnhPMRwQ8w3BbHmJKKZfHTTzsd4jbJq" } - operation: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "recordTransactionInitiated" - request: - type: { blueId: "14UHCXtf9XLpi3Z3n4xbo1dmXRzfXnDEH23iVaechxzh" } - initiatedAmount: - type: { blueId: "5WNMiV9Knz63B4dVY5JtMyh3FB4FSGqv7ceScvuapdE1" } - value: 100000 - providerReference: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "harness:customer-paynote-a" - railType: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "fake-payment-rail" - timeline: - timelineId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "admin-timeline" - timestamp: - type: { blueId: "5WNMiV9Knz63B4dVY5JtMyh3FB4FSGqv7ceScvuapdE1" } - value: 1700000000000 - lastSignatures: - guarantorChannel: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "9SJyYbjfPUCxAL26f6GQdriqXKuDZnXJhpPVezN5mMjK" - currency: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "USD" - payNoteInitialStateDescription: - details: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "This PayNote secures the customer's package payment to Boutique Travel Agency. The payment is completed only after both included merchant orders are confirmed: Hotel Aurora confirms the weekend stay order and Restaurant Lumi confirms the wine dinner order. Once both confirmations are present, the package payment is completed and the package becomes ready to use." - summary: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "Payment for the Weekend Stay + Wine Dinner package." - status: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "Initiated" - transactionDetails: - description: | - Payload for the operation. Shape MUST match the target Operation’s `request` contract (scalars or structured nodes). - railType: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "fake-payment-rail" - inResponseTo: - type: - name: "Correlation" - description: "A structured reference linking this response back to the original action and trigger." - requestId: - description: "The 'requestId' from the specific Request event this is a response to." - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - incomingEvent: - description: "An event which initiated the entire workflow. Normally just blueId of it." - attachmentPoint: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - initiatedAmount: - type: { blueId: "5WNMiV9Knz63B4dVY5JtMyh3FB4FSGqv7ceScvuapdE1" } - value: 100000 - providerReference: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "harness:customer-paynote-a" - state: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "not_started" - context: - scenario: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "reseller-weekend-package" - paymentKind: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "customer_package_purchase" - packageOrderDocumentId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "zzimVxhnKLL5SwMkS9kmF8p5g7pyxPWBu664HxGbszB" - packagePayNoteSessionId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "customer-paynote-a" - packagePayNoteDocumentId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "customer-paynote-doc-a" - completionRequested: - type: { blueId: "4EzhSubEimSQD3zrYHRtobfPPWntUuhEz8YcdxHsi12u" } - value: false - targetSessionId: - type: { blueId: "GX7CFUmSDrE2MzptunLCCdZwnuwwrenRQqEnHL4x3uoC" } - value: "customer-paynote-a" diff --git a/src/test/resources/processor-delay/paynote-resale-reduced-bex.yaml b/src/test/resources/processor-delay/paynote-resale-reduced-bex.yaml deleted file mode 100644 index efbe31c..0000000 --- a/src/test/resources/processor-delay/paynote-resale-reduced-bex.yaml +++ /dev/null @@ -1,771 +0,0 @@ -name: Reduced Package Fulfillment Resale Flow -status: active -investorChannel: investorChannel -componentOrderRefsBySessionId: - hotel-order-session-a: - packageOrderSessionId: '' - component: '' - restaurant-order-session-a: - packageOrderSessionId: '' - component: '' -resaleOrderRequests: - hotel-request-a: - status: requested - agreementSessionId: hotel-agreement-session - kind: hotel - packageOrderSessionId: package-order-a - orderSessionId: '' - restaurant-request-a: - status: requested - agreementSessionId: restaurant-agreement-session - kind: restaurant - packageOrderSessionId: package-order-a - orderSessionId: '' -orders: - package-order-a: - packageOrder: - observed: true - confirmed: true - sessionId: package-order-a - documentId: package-order-doc-a - subscriptionId: package-linked:package-order-a - customerAccountId: customer-a-uid - customerPayment: - tokenRequestId: reseller-weekend-package-customer-token:package-order-a - tokenRequested: true - tokenAttached: true - customerPayNote: - sessionId: customer-paynote-a - snapshotRequestId: snapshot:customer-paynote:customer-paynote-a - subscriptionId: package-linked:customer-paynote-a - attachedToPackageOrder: true - secured: false - securedAmount: 0 - completed: false - hotelOrder: - sessionId: '' - documentId: '' - resaleRequestId: hotel-request-a - resaleRequested: true - resalePlaced: false - snapshotRequestId: '' - subscriptionId: '' - attachedToPackageOrder: false - attachedToPayNote: false - merchantPaymentInitiated: false - confirmed: false - restaurantOrder: - sessionId: '' - documentId: '' - resaleRequestId: restaurant-request-a - resaleRequested: true - resalePlaced: false - snapshotRequestId: '' - subscriptionId: '' - attachedToPackageOrder: false - attachedToPayNote: false - merchantPaymentInitiated: false - confirmed: false -state: - grantsReady: true -contracts: - hotelParticipantChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: hotel-participant - actor: - type: MyOS/Principal Actor - accountId: hotel-participant - restaurantParticipantChannel: - type: Coordination/Timeline Channel - timeline: - type: Coordination/Timeline - providerId: test-provider - timelineId: restaurant-participant - actor: - type: MyOS/Principal Actor - accountId: restaurant-participant - triggeredEventChannel: - type: Triggered Event Channel - hotelResaleOrderPlaced: - type: Coordination/Sequential Workflow Operation - channel: hotelParticipantChannel - steps: - - name: ForwardHotelResaleOrderPlaced - type: Coordination/Compute - do: - - $appendEvent: - $binding: - name: event - path: /message/request - - $return: - events: - $events: true - restaurantResaleOrderPlaced: - type: Coordination/Sequential Workflow Operation - channel: restaurantParticipantChannel - steps: - - name: ForwardRestaurantResaleOrderPlaced - type: Coordination/Compute - do: - - $appendEvent: - $binding: - name: event - path: /message/request - - $return: - events: - $events: true - processPackageHotelResaleOrderPlaced: - type: Coordination/Sequential Workflow - channel: triggeredEventChannel - event: - type: Sample/Subscription Update - subscriptionId: hotel-resale-agreement - targetSessionId: hotel-agreement-session - update: - kind: Resale Order Placed - steps: - - name: ProcessPackageHotelResaleOrderPlaced - type: Coordination/Compute - definition: packageFulfillmentComputeDefinition - entry: processHotelResaleOrderPlaced - emitEvents: true - returnResult: true - processPackageRestaurantResaleOrderPlaced: - type: Coordination/Sequential Workflow - channel: triggeredEventChannel - event: - type: Sample/Subscription Update - subscriptionId: restaurant-resale-agreement - targetSessionId: restaurant-agreement-session - update: - kind: Resale Order Placed - steps: - - name: ProcessPackageRestaurantResaleOrderPlaced - type: Coordination/Compute - definition: packageFulfillmentComputeDefinition - entry: processRestaurantResaleOrderPlaced - emitEvents: true - returnResult: true - packageFulfillmentComputeDefinition: - type: Coordination/Compute Definition - constants: - packageLinkedSubscriptionPrefix: 'package-linked:' - agreementLinkedSubscriptionPrefix: 'agreement-linked:' - functions: - emptyComponentOrderState: - do: - - $return: - sessionId: '' - documentId: '' - resaleRequestId: '' - resaleRequested: false - resalePlaced: false - snapshotRequestId: '' - subscriptionId: '' - attachedToPackageOrder: false - attachedToPayNote: false - merchantPaymentInitiated: false - confirmed: false - defaultOrderState: - args: - sessionId: - type: Text - do: - - $let: - name: sessionId - expr: - $text: - $var: sessionId - - $return: - packageOrder: - sessionId: - $var: sessionId - documentId: '' - customerAccountId: '' - subscriptionId: - $concat: - - $const: packageLinkedSubscriptionPrefix - - $var: sessionId - observed: false - confirmed: false - customerPayment: - tokenRequestId: - $concat: - - 'reseller-weekend-package-customer-token:' - - $var: sessionId - tokenRequested: false - tokenAttached: false - customerPayNote: - sessionId: '' - snapshotRequestId: '' - subscriptionId: '' - attachedToPackageOrder: false - secured: false - securedAmount: 0 - completed: false - hotelOrder: - $call: - function: emptyComponentOrderState - args: {} - restaurantOrder: - $call: - function: emptyComponentOrderState - args: {} - appendChangeIfChanged: - args: - path: - type: Text - val: - description: Value to compare and append. - do: - - $let: - name: pathText - expr: - $text: - $var: path - - $let: - name: current - expr: - $resultValue: - path: - $var: pathText - - $if: - cond: - $ne: - - $var: current - - $var: val - then: - - $appendChange: - op: replace - path: - $var: pathText - val: - $var: val - - $return: {} - ensureOrderLedger: - args: - sessionId: - type: Text - do: - - $let: - name: sessionId - expr: - $text: - $var: sessionId - - $if: - cond: - $empty: - $var: sessionId - then: - - $return: false - - $let: - name: pkg - expr: - $resultValue: - path: - $concat: - - /orders/ - - $var: sessionId - - /packageOrder - - $if: - cond: - $empty: - $object: - $var: pkg - then: - - $appendChange: - op: add - path: - $concat: - - /orders/ - - $var: sessionId - val: - $call: - function: defaultOrderState - args: - sessionId: - $var: sessionId - - $return: {} - orderObjectFieldRelativePath: - args: - field: - type: Text - kind: - type: Text - do: - - $return: - $pointerGet: - object: - componentOrderSessions: - hotel: /hotelOrder/sessionId - restaurant: /restaurantOrder/sessionId - componentOrderDocumentIds: - hotel: /hotelOrder/documentId - restaurant: /restaurantOrder/documentId - componentOrderAttached: - hotel: /hotelOrder/attachedToPackageOrder - restaurant: /restaurantOrder/attachedToPackageOrder - componentOrderAttachedToPayNote: - hotel: /hotelOrder/attachedToPayNote - restaurant: /restaurantOrder/attachedToPayNote - componentOrderConfirmed: - hotel: /hotelOrder/confirmed - restaurant: /restaurantOrder/confirmed - merchantPaymentInitiated: - hotel: /hotelOrder/merchantPaymentInitiated - restaurant: /restaurantOrder/merchantPaymentInitiated - resaleOrderPlaced: - hotel: /hotelOrder/resalePlaced - restaurant: /restaurantOrder/resalePlaced - resaleOrderRequested: - hotel: /hotelOrder/resaleRequested - restaurant: /restaurantOrder/resaleRequested - resaleOrderRequestIds: - hotel: /hotelOrder/resaleRequestId - restaurant: /restaurantOrder/resaleRequestId - componentSnapshotRequestIds: - hotel: /hotelOrder/snapshotRequestId - restaurant: /restaurantOrder/snapshotRequestId - componentSubscriptionIds: - hotel: /hotelOrder/subscriptionId - restaurant: /restaurantOrder/subscriptionId - path: - $concat: - - / - - $text: - $var: field - - / - - $text: - $var: kind - default: '' - setOrderPath: - args: - sessionId: - type: Text - relativePath: - type: Text - val: - description: Value to write. - do: - - $let: - name: sessionId - expr: - $text: - $var: sessionId - - $if: - cond: - $empty: - $var: sessionId - then: - - $return: false - - $call: - function: ensureOrderLedger - args: - sessionId: - $var: sessionId - - $let: - name: pathText - expr: - $concat: - - /orders/ - - $var: sessionId - - $text: - $var: relativePath - - $if: - cond: - $ne: - - $resultValue: - path: - $var: pathText - - $var: val - then: - - $appendChange: - op: add - path: - $var: pathText - val: - $var: val - - $return: {} - mergeOrderObjectField: - args: - sessionId: - type: Text - key: - type: Text - patch: - description: Object patch keyed by component kind. - do: - - $let: - name: sessionId - expr: - $text: - $var: sessionId - - $forEach: - in: - $entries: - $object: - $var: patch - item: entry - do: - - $let: - name: kind - expr: - $text: - $pointerGet: - object: - $var: entry - path: /key - default: '' - - $let: - name: relativePath - expr: - $call: - function: orderObjectFieldRelativePath - args: - field: - $var: key - kind: - $var: kind - - $if: - cond: - $not: - $empty: - $var: relativePath - then: - - $call: - function: setOrderPath - args: - sessionId: - $var: sessionId - relativePath: - $var: relativePath - val: - $pointerGet: - object: - $var: entry - path: /val - - $return: {} - requestComponentOrderDelivery: - args: - packageOrderSessionId: - type: Text - agreementKind: - type: Text - orderSessionId: - type: Text - do: - - $let: - name: packageOrderSessionId - expr: - $text: - $var: packageOrderSessionId - - $let: - name: agreementKind - expr: - $text: - $var: agreementKind - - $let: - name: orderSessionId - expr: - $text: - $var: orderSessionId - - $if: - cond: - $or: - - $not: - $truthy: - $var: packageOrderSessionId - - $not: - $truthy: - $var: agreementKind - - $not: - $truthy: - $var: orderSessionId - then: - - $return: false - - $let: - name: snapshotRequestId - expr: - $concat: - - 'snapshot:component:' - - $var: agreementKind - - ':' - - $var: orderSessionId - - $let: - name: subscriptionId - expr: - $concat: - - $const: agreementLinkedSubscriptionPrefix - - $var: agreementKind - - ':' - - $var: orderSessionId - - $let: - name: componentPathPrefix - expr: - $choose: - cond: - $eq: - - $var: agreementKind - - hotel - then: /hotelOrder - else: /restaurantOrder - - $if: - cond: - $empty: - $text: - $resultValue: - path: - $concat: - - /orders/ - - $var: packageOrderSessionId - - $var: componentPathPrefix - - /snapshotRequestId - then: - - $call: - function: setOrderPath - args: - sessionId: - $var: packageOrderSessionId - relativePath: - $call: - function: orderObjectFieldRelativePath - args: - field: componentSnapshotRequestIds - kind: - $var: agreementKind - val: - $var: snapshotRequestId - - $appendEvent: - $pointerSet: - object: - onBehalfOf: investorChannel - requestId: - $var: snapshotRequestId - sourceSessionId: - $var: orderSessionId - path: /type - val: Sample/Document Initial Snapshot Requested - - $if: - cond: - $empty: - $text: - $resultValue: - path: - $concat: - - /orders/ - - $var: packageOrderSessionId - - $var: componentPathPrefix - - /subscriptionId - then: - - $call: - function: setOrderPath - args: - sessionId: - $var: packageOrderSessionId - relativePath: - $call: - function: orderObjectFieldRelativePath - args: - field: componentSubscriptionIds - kind: - $var: agreementKind - val: - $var: subscriptionId - - $appendEvent: - $pointerSet: - object: - onBehalfOf: investorChannel - targetSessionId: - $var: orderSessionId - subscription: - id: - $var: subscriptionId - events: - - type: Coordination/Event - kind: Payment Token Attached - - type: Coordination/Event - kind: Order Confirmed - path: /type - val: Sample/Subscribe to Session Requested - - $return: {} - recordPlacedResaleOrder: - args: - agreementKind: - type: Text - responseRequestId: - type: Text - orderSessionId: - type: Text - do: - - $let: - name: agreementKind - expr: - $text: - $var: agreementKind - - $let: - name: responseRequestId - expr: - $text: - $var: responseRequestId - - $let: - name: orderSessionId - expr: - $text: - $var: orderSessionId - - $if: - cond: - $or: - - $not: - $truthy: - $var: agreementKind - - $not: - $truthy: - $var: responseRequestId - - $not: - $truthy: - $var: orderSessionId - then: - - $return: false - - $let: - name: existingRequest - expr: - $object: - $resultValue: - path: - $concat: - - /resaleOrderRequests/ - - $var: responseRequestId - - $let: - name: nextRequest1 - expr: - $merge: - - $var: existingRequest - - kind: - $coalesce: - - $text: - $pointerGet: - object: - $var: existingRequest - path: /kind - default: '' - - $var: agreementKind - orderSessionId: - $var: orderSessionId - status: placed - - $if: - cond: - $ne: - - $var: existingRequest - - $var: nextRequest1 - then: - - $appendChange: - op: add - path: - $concat: - - /resaleOrderRequests/ - - $var: responseRequestId - val: - $var: nextRequest1 - - $let: - name: packageOrderSessionId - expr: - $text: - $pointerGet: - object: - $var: nextRequest1 - path: /packageOrderSessionId - default: '' - - $if: - cond: - $not: - $empty: - $var: packageOrderSessionId - then: - - $call: - function: setOrderPath - args: - sessionId: - $var: packageOrderSessionId - relativePath: - $call: - function: orderObjectFieldRelativePath - args: - field: resaleOrderPlaced - kind: - $var: agreementKind - val: true - - $call: - function: setOrderPath - args: - sessionId: - $var: packageOrderSessionId - relativePath: - $call: - function: orderObjectFieldRelativePath - args: - field: componentOrderSessions - kind: - $var: agreementKind - val: - $var: orderSessionId - - $call: - function: appendChangeIfChanged - args: - path: - $concat: - - /componentOrderRefsBySessionId/ - - $var: orderSessionId - val: - packageOrderSessionId: - $var: packageOrderSessionId - component: - $concat: - - $var: agreementKind - - Order - - $call: - function: requestComponentOrderDelivery - args: - packageOrderSessionId: - $var: packageOrderSessionId - agreementKind: - $var: agreementKind - orderSessionId: - $var: orderSessionId - - $return: {} - processHotelResaleOrderPlaced: - do: - - $call: - function: recordPlacedResaleOrder - args: - agreementKind: hotel - responseRequestId: - $text: - $event: /update/inResponseTo/requestId - orderSessionId: - $text: - $event: /update/orderSessionId - - $return: - changeset: - $changeset: true - events: - $events: true - processRestaurantResaleOrderPlaced: - do: - - $call: - function: recordPlacedResaleOrder - args: - agreementKind: restaurant - responseRequestId: - $text: - $event: /update/inResponseTo/requestId - orderSessionId: - $text: - $event: /update/orderSessionId - - $return: - changeset: - $changeset: true - events: - $events: true diff --git a/src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java b/src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java new file mode 100644 index 0000000..61119dc --- /dev/null +++ b/src/testFixtures/java/blue/coordination/internal/CoordinationTestControl.java @@ -0,0 +1,245 @@ +package blue.coordination.internal; + +import blue.coordination.api.CoordinationEngine; +import blue.coordination.api.SessionStatus; +import blue.language.api.BlueCacheStats; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.LongStream; + +/** + * Failure-injection and deep diagnostic controls published only in the test + * fixtures artifact. Production consumers never receive this surface. + */ +public final class CoordinationTestControl { + private final DefaultCoordinationEngine engine; + private final List transitionTraces = new ArrayList<>(); + + private CoordinationTestControl(DefaultCoordinationEngine engine) { + this.engine = Objects.requireNonNull(engine, "engine"); + } + + /** Attaches controls to the production in-memory implementation. */ + public static CoordinationTestControl attach(CoordinationEngine engine) { + if (!(Objects.requireNonNull(engine, "engine") + instanceof DefaultCoordinationEngine implementation)) { + throw new IllegalArgumentException( + "Test controls require the in-memory implementation"); + } + return new CoordinationTestControl(implementation); + } + + /** Injects exactly one failure at the named transactional boundary. */ + public void failOnceAt(FailurePoint point) { + engine.failOnceAt(DefaultCoordinationEngine.FailurePoint.valueOf( + Objects.requireNonNull(point, "point").name())); + } + + /** Clears a pending failure injection. */ + public void clearFailureInjection() { + engine.clearFailureInjection(); + } + + /** Reconstructs transient scheduling/index state from retained stores. */ + public void restartFromStores() { + engine.restartFromStores(); + } + + /** + * Simulates a pre-Round-11 retained READY marker for restart-repair tests. + * The composite application-read proof remains authoritative. + */ + public void forceLegacyReadyMarker(String documentId) { + DocumentSession session = engine.session(Objects.requireNonNull( + documentId, "documentId")); + session.restoreCoordinationState( + SessionStatus.READY, + session.readyThrough(), + session.epoch(), + session.epoch()); + } + + /** Makes bounded historical reads defer without reporting false absence. */ + public void makeHistoricalUnavailable(String diagnostic) { + engine.makeHistoricalUnavailable(diagnostic); + } + + /** Restores the deterministic historical feeder after a test deferral. */ + public void makeHistoricalAvailable() { + engine.makeHistoricalAvailable(); + } + + /** Makes bounded historical reads fail closed on invalid evidence. */ + public void invalidateHistoricalEvidence(String diagnostic) { + engine.invalidateHistoricalEvidence(diagnostic); + } + + /** Returns whether a failure came from this deterministic fixture. */ + public boolean isInjectedFailure(Throwable failure) { + return failure instanceof DefaultCoordinationEngine + .InjectedFailureException; + } + + /** Returns immutable Language cache evidence for performance campaigns. */ + public BlueCacheStats languageCacheStats() { + return engine.languageCacheStats(); + } + + /** Raw diagnostic metrics for test deltas; never exposed by public API. */ + public MetricsSnapshot metricsSnapshot() { + EngineMetrics.MetricsSnapshot snapshot = engine.metricsSnapshot(); + return new MetricsSnapshot( + snapshot.counters(), snapshot.phaseNanos()); + } + + /** Starts a closed, in-memory trace of successful document transitions. */ + public void beginTransitionTrace() { + transitionTraces.clear(); + engine.observeTransitions(this::recordTransition); + } + + /** Returns the successful transitions observed since tracing began. */ + public List transitionTrace() { + return List.copyOf(transitionTraces); + } + + private void recordTransition( + SequentialDrainCoordinator.TransitionTrace trace) { + Map phases = new LinkedHashMap<>(); + trace.after().phaseNanos().forEach((name, value) -> phases.put( + name, + value - trace.before().phaseNanos().getOrDefault(name, 0L))); + transitionTraces.add(new TransitionTrace( + trace.documentId().value(), + trace.revision().epoch(), + trace.revision().kind().name(), + trace.revision().sourceEntry() + .map(entry -> entry.blueId()).orElse(null), + trace.revision().causalEntryBlueId().orElse(null), + phases, + trace.totalNanos())); + } + + /** Returns immutable catch-up evidence without exposing mutable plans. */ + public List catchUpEvidence() { + return engine.catchUpEvidence().stream() + .map(evidence -> new CatchUpEvidence( + evidence.parentDocumentId().value(), + evidence.childDocumentId().value(), + evidence.occurrencePath(), + evidence.appliedChildEpoch(), + evidence.status(), + evidence.activationGeneration())) + .toList(); + } + + /** + * Returns active occurrence identities and their committed embedded-input + * receipts. This derives the receipt identity from the production binding + * contract without exposing mutable graph or cursor objects. + */ + public List embeddedOccurrenceEvidence() { + return engine.catchUpEvidence().stream() + .map(evidence -> { + String bindingId = SequentialDrainCoordinator.bindingId( + evidence.parentDocumentId(), + evidence.occurrencePath(), + evidence.activationGeneration()); + List committedReceipts = evidence.appliedChildEpoch() + < 0L + ? List.of() + : LongStream.rangeClosed( + 0L, evidence.appliedChildEpoch()) + .mapToObj(epoch -> + SequentialDrainCoordinator + .embeddedTransitionReceiptId( + bindingId, epoch)) + .filter(engine.session( + evidence.parentDocumentId().value()) + ::hasTransitionReceipt) + .toList(); + return new EmbeddedOccurrenceEvidence( + evidence.parentDocumentId().value(), + evidence.childDocumentId().value(), + evidence.occurrencePath(), + bindingId, + evidence.appliedChildEpoch(), + evidence.activationGeneration(), + committedReceipts); + }) + .toList(); + } + + /** Transactional boundaries available to external acceptance tests. */ + public enum FailurePoint { + BEFORE_FROZEN_PROCESS, + AFTER_FROZEN_BEFORE_STAGE, + AFTER_STAGING_CHILD_SESSION, + AFTER_APPLYING_CHILD_REVISION, + BEFORE_COMMIT_VALIDATION, + AFTER_STATE_SWAP_BEFORE_RETURN + } + + /** One stable read-only catch-up projection. */ + public record CatchUpEvidence( + String parentDocumentId, + String childDocumentId, + String occurrencePath, + long appliedChildEpoch, + String status, + long activationGeneration) { + } + + /** Immutable binding/cursor/receipt evidence for one active occurrence. */ + public record EmbeddedOccurrenceEvidence( + String parentDocumentId, + String childDocumentId, + String occurrencePath, + String bindingId, + long appliedChildEpoch, + long activationGeneration, + List committedReceiptIds) { + public EmbeddedOccurrenceEvidence { + parentDocumentId = Objects.requireNonNull( + parentDocumentId, "parentDocumentId"); + childDocumentId = Objects.requireNonNull( + childDocumentId, "childDocumentId"); + occurrencePath = Objects.requireNonNull( + occurrencePath, "occurrencePath"); + bindingId = Objects.requireNonNull(bindingId, "bindingId"); + committedReceiptIds = List.copyOf(Objects.requireNonNull( + committedReceiptIds, "committedReceiptIds")); + } + } + + /** Immutable raw metrics used only by test-fixture consumers. */ + public record MetricsSnapshot( + Map counters, + Map phaseNanos) { + public MetricsSnapshot { + counters = Map.copyOf(Objects.requireNonNull( + counters, "counters")); + phaseNanos = Map.copyOf(Objects.requireNonNull( + phaseNanos, "phaseNanos")); + } + } + + /** Immutable test-only timing projection; production API stays closed. */ + public record TransitionTrace( + String documentId, + long epoch, + String kind, + String sourceEntryBlueId, + String causalEntryBlueId, + Map phaseNanos, + long totalNanos) { + public TransitionTrace { + phaseNanos = Map.copyOf(Objects.requireNonNull( + phaseNanos, "phaseNanos")); + } + } +}